Created
May 14, 2016 16:13
-
-
Save anonymous/9523efecaa7d2542a405d129d4e3d15f to your computer and use it in GitHub Desktop.
Arduino YM2149 MIDI Synth
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Arduino YM2149 MIDI Synth | |
// by yukimizake | |
// video: https://youtu.be/hUPs2pv5d_g | |
// schematics: http://electronicfields.wordpress.com/?attachment_id=128 (Vcc/GND not shown) | |
// This program is free software: you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published by | |
// the Free Software Foundation, either version 3 of the License, or | |
// (at your option) any later version. | |
// This program is distributed in the hope that it will be useful, | |
// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
// GNU General Public License for more details. | |
// You should have received a copy of the GNU General Public License | |
// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
#include <avr/io.h> | |
#include <avr/interrupt.h> | |
//Port settings | |
const int ad0 = 8; | |
const int ad1 = 9; | |
const int ad2 = 2; | |
const int ad3 = 3; | |
const int ad4 = 4; | |
const int ad5 = 5; | |
const int ad6 = 6; | |
const int ad7 = 7; | |
const int pinBC1 = 10; | |
const int pinBDIR = 11; | |
//BC2 to +5V | |
const int pinYMReset = 12; | |
//voicing | |
byte noteA = 0; | |
byte noteB = 0; | |
byte noteC = 0; | |
int periodA = 0; | |
int periodB = 0; | |
int periodC = 0; | |
//envelope | |
byte AmaxVolume = 0; | |
byte BmaxVolume = 0; | |
byte CmaxVolume = 0; | |
//unison detune | |
int detuneValue = 1; | |
//arpeggio settings | |
byte arpeggio[] = {0,7,12}; | |
byte arpeggioLength = 3; | |
byte arpeggioCounter = 0; | |
boolean arpeggioFlipMe = false; | |
byte defaultLevel = 10; | |
//Fast pin switching macros | |
#define CLR(x,y) (x&=(~(1<<y))) | |
#define SET(x,y) (x|=(1<<y)) | |
#define __BCPORT__ PORTB | |
#define __BC1__ 2 | |
#define __BDIR__ 3 | |
#define __LEDPORT__ PORTB | |
#define __LED__ 5 | |
#define __RGBLEDPORT__ PORTC | |
#define __RGBLEDDDR__ DDRC | |
#define __RLED__ 0 | |
#define __GLED__ 1 | |
#define __BLED__ 2 | |
const int ledPin = 13; | |
const int tp[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4050, | |
3822, 3608, 3405, 3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 4050, 3822, | |
3608, 3405, 3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 2025, 1911, 1804, 1703, | |
1607, 1517, 1432, 1351, 1276, 1204, 1136, 1073, 1012, 956, 902, 851, 804, 758, | |
716, 676, 638, 602, 568, 536, 506, 478, 451, 426, 402, 379, 358, 338, 319, 301, | |
284, 268, 253, 239, 225, 213, 201, 190, 179, 169, 159, 150, 142, 134, 127, 119, | |
113, 106, 100, 95, 89, 84, 80, 75, 71, 67, 63, 60, 56, 53, 50, 47, 45, 42, 40, | |
38, 36, 34, 32, 30, 28, 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, | |
12, 11, 11, 10, 19, 18, 17, 16, 15, 14, 13, 13, | |
12, 11, 11, 10 }; | |
const int envTp[] = {3822, 3608, 3405, 3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 2025, 1911, 1804, 1703, 1607, 1517, 1432, 1351, 1276, 1204, 1136, 1073, 1012, 956, 902, 851, 804, 758, 716, 676, 638, 602, 568, 536, 506, 478, 451, 426, 402, 379, 358, 338, 319, 301, 284, 268, 253, 239, 225, 213, 201, 190, 179, 169, 159, 150, 142, 134, 127, 119, 113, 106, 100, 95, 89, 84, 80, 75, 71, 67, 63, 60, 56, 53, 50, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 27, 25, 24, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2}; | |
PROGMEM prog_char s0[] = {13, 14, 14, 13, 14, 15, 12, 14, 10, 14, 12, 14, 14, 13, 14, 12, 14, 13, 14, 12, 13, 12, 13, 11, 13, 12, 13, 12, 14, 13, 14, 14, 14, 15, 14, 15, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 12, 12, 11, 9, 7, 0, 0, 0, 0, 0, 5, 9, 11, 12, 12, 12, 13, 13, 14, 14, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 13, 13, 12, 12, 11, 12, 10, 12, 11, 10, 12, 10, 12, 9, 11, 9, 8, 6, 8, 0, 5, 5, 6, 0, 4, 4, 10, 10, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 12, 12, 11, 11, 10, 9, 9, 8, 7, 7, 8, 7, 8, 7, 11, 0, 11, 8, 10, 10, 10, 11, 9, 12, 9, 12, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 13, 12, 13, 12, 12, 13, 12, 12, 12, 13, 12, 12, 12, 12, 12, 12, 13, 12, 13, 12, 12, 12, 13, 12, 12, 13, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 11, 11, 11, 11, 9, 9, 9, 8, 8, 5, 7, 5, 4, 4, 3, 6, 1, 4, 0, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 12, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 14, 14, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 11, 10}; | |
const int s0Length = 931; | |
PROGMEM prog_char s1[] = {13, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 13, 14, 14, 14, 14, 14, 13, 14, 14, 13, 13, 14, 14, 15, 14, 15, 15, 15, 15, 15, 14, 14, 13, 12, 11, 9, 0, 0, 0, 0, 0, 0, 0, 5, 0, 13, 12, 14, 0, 15, 14, 9, 15, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 12, 10, 9, 7, 0, 0, 0, 0, 0, 0, 4, 6, 8, 0, 0, 0, 0, 0, 0, 2, 9, 11, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 11, 11, 6, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 10, 12, 11, 13, 13, 13, 13, 12, 10, 11, 10, 12, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 15, 14, 15, 13, 12, 14, 13, 13, 14, 14, 13, 13, 12, 9, 12, 12, 11, 11, 8, 8, 7, 0, 0, 4, 9, 10, 11, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 14, 13, 13, 14, 13, 13, 12, 12, 11, 9, 8, 6, 0, 0, 0, 0, 0, 0, 4, 9, 11, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 12, 11, 11, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 9, 11, 11, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 12, 13, 13, 12, 13, 12, 12, 12, 12, 11, 9, 9, 12, 11, 12, 8, 6, 11, 4, 10, 11, 10, 11, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, 14, 14, 14, 13, 12, 12, 12, 12, 12, 11, 11, 10, 11, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 14, 15, 14, 14, 14, 14, 14, 14, 13, 14, 14, 13, 14, 13, 12, 13, 12, 12, 13, 13, 13, 10, 11, 10, 12, 10, 10, 12, 12, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, 15, 14, 14, 14, 14, 13, 13, 13, 14, 13, 13, 14, 13, 13, 12, 13, 13, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 14, 14, 14, 13, 13, 12, 12, 12, 13, 12, 12, 13, 13, 13, 13, 14, 13, 13, 13, 13, 12, 12, 12, 13, 13, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 12, 13, 12, 12, 11, 12, 11, 12, 12, 11, 12, 11, 12, 12, 12, 12, 13, 12, 13, 13, 13, 13, 14, 14, 15, 15, 15, 14, 14, 15, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 12, 13, 12, 12, 12, 13, 13, 12, 12, 13, 12, 12, 12, 12, 11, 11, 10, 11, 11, 11, 12, 13, 13, 14, 14, 14, 14, 15, 14, 15, 15, 14, 14, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 13, 12, 11, 12, 12, 12, 12, 11, 12, 11, 12, 13, 12, 13, 14, 13, 13, 14, 14, 14, 14, 14, 15, 14, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 12, 12, 12, 9, 11, 11, 10, 12, 12, 12, 12, 12, 12, 13, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 14, 15, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 15, 14, 14, 14, 13, 14, 14, 14, 14, 14, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 14, 13, 14, 14, 14, 14, 14, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 13, 13, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 12, 12, 13, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 15, 15, 15, 14, 14, 14, 14, 13, 14, 14, 13, 13, 13, 13, 12, 13, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 13, 13, 13, 12, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 13, 14, 14, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 13, 13, 14, 13}; | |
const int s1Length = 1780; | |
PROGMEM prog_char s2[] = {15, 13, 12, 13, 13, 14, 13, 15, 14, 13, 14, 13, 13, 14, 13, 14, 14, 13, 14, 12, 14, 14, 13, 13, 14, 13, 13, 13, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 13, 13, 15, 13, 14, 13, 14, 13, 14, 12, 14, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 15, 12, 15, 13, 14, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 14, 13, 14, 13, 14, 13, 13, 13, 15, 14, 13, 14, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 14, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 14, 14, 13, 14, 13, 14, 13, 14, 14, 14, 13, 14, 13, 14, 13, 14, 13, 14, 13, 13, 14, 13, 14, 13, 13, 13, 14, 13, 14, 13, 14, 13, 14, 13, 13, 13, 13, 13, 14, 14, 13, 14, 13, 13, 14, 13, 13, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 13, 14, 13, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 13, 13, 14, 13, 14, 13, 14, 13, 14, 14, 14, 13, 13, 13, 14, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 14, 13, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 14, 13, 13, 14, 13, 14, 13, 13, 14, 13, 14, 14, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 13, 14, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 13, 14, 13, 14, 13, 14, 14, 13, 14, 13, 14, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 13, 14, 13, 13, 14, 13, 14, 14, 13, 14, 13, 13, 13, 13, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13}; | |
const int s2Length = 463; | |
PROGMEM prog_char s3[] = {13, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 13, 13, 13, 13, 13, 14, 13, 14, 14, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 13, 14, 14, 14, 14, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 15, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 14, 12, 14, 14, 13, 14, 13, 13, 14, 13, 14, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 13, 13, 14, 13, 14, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 13, 14, 14, 13, 15, 14, 13, 14, 11, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 14, 13, 15, 13, 13, 13, 13, 15, 11, 14, 15, 9, 14, 13, 11, 13, 13, 12, 13, 13, 13, 12, 14, 14, 14, 13, 15, 13, 13, 13, 14, 14, 12, 15, 12, 13, 14, 12, 13, 13, 13, 13, 13, 13, 12, 13, 14, 14, 14, 12, 15, 13, 12, 14, 14, 12, 14, 13, 13, 13, 13, 13, 11, 14, 13, 13, 14, 12, 14, 14, 12, 15, 14, 12, 15, 13, 14, 14, 13, 15, 12, 14, 13, 12, 13, 13, 12, 12, 14, 13, 12, 14, 13, 13, 14, 14, 14, 13, 15, 15, 11, 15, 14, 12, 14, 13, 12, 12, 12, 13, 13, 14, 13, 14, 14, 13, 14, 14, 14, 15, 14, 14, 15, 12, 15, 13, 13, 14, 12, 13, 13, 13, 13, 14, 14, 13, 14, 15, 13, 14, 14, 13, 14, 15, 14, 14, 13, 15, 13, 12, 14, 12, 12, 14, 13, 13, 14, 14, 13, 14, 14, 14, 13, 13, 13, 13, 15, 15, 14, 14, 15, 12, 13, 14, 13, 10, 13, 14, 12, 13, 15, 14, 14, 15, 14, 14, 14, 13, 13, 14, 15, 14, 13, 15, 13, 13, 15, 11, 13, 14, 12, 14, 14, 13, 14, 14, 14, 13, 14, 14, 12, 13, 13, 15, 15, 13, 15, 15, 13, 13, 13, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 14, 13, 12, 13, 15, 15, 14, 15, 14, 14, 14, 13, 11, 12, 13, 13, 13, 15, 15, 13, 15, 15, 13, 14, 14, 13, 11, 14, 15, 14, 15, 15, 12, 14, 14, 12, 11, 12, 13, 12, 13, 15, 14, 14, 15, 14, 13, 13, 13, 13, 12, 14, 14, 13, 15, 15, 12, 14, 14, 10, 12, 12, 13, 13, 14, 15, 14, 14, 15, 14, 13, 13, 13, 12, 13, 15, 13, 14, 15, 15, 14, 13, 14, 11, 11, 13, 12, 13, 14, 14, 15, 15, 13, 14, 14, 12, 12, 13, 14, 14, 13, 15, 15, 14, 15, 13, 12, 13, 11, 12, 12, 13, 14, 14, 14, 15, 14, 12, 13, 12, 11, 12, 14, 15, 13, 14, 15, 13, 14, 15, 10, 13, 14, 12, 13, 13, 14, 14, 13, 14, 14, 12, 12, 12, 12, 12, 14, 15, 14, 14, 15, 12, 13, 15, 12, 11, 14, 13, 13, 13, 14, 14, 13, 13, 14, 13, 12, 13, 13, 13, 13, 15, 15, 12, 14, 13, 5, 15, 14, 0, 14, 14, 13, 12, 14, 14, 13, 10, 14, 14, 12, 13, 14, 13, 13, 15, 15, 12, 15, 13, 2, 13, 15, 12, 12, 15, 14, 12, 12, 14, 13, 11, 13, 15, 14, 12, 14, 14, 12, 15, 15, 12, 15, 13, 6, 13, 15, 14, 11, 15, 15, 12, 12, 13, 13, 12, 13, 14, 15, 13, 13, 14, 12, 14, 15, 10, 14, 14, 10, 11, 14, 15, 14, 12, 15, 13, 8, 13, 13, 13, 14, 14, 14, 14, 12, 13, 12, 13, 14, 11, 14, 14, 11, 12, 13, 14, 15, 12, 14, 14, 10, 12, 13, 13, 14, 14, 14, 14, 14, 13, 12, 13, 15, 12, 13, 14, 13, 11, 12, 14, 15, 13, 13, 15, 12, 11, 12, 12, 14, 14, 14, 14, 14, 13, 11, 12, 15, 12, 12, 15, 13, 11, 12, 13, 14, 15, 12, 14, 14, 11, 12, 11, 13, 14, 14, 14, 15, 13, 11, 13, 14, 13, 12, 14, 14, 12, 12, 13, 14, 15, 14, 13, 14, 12, 11, 12, 12, 14, 14, 13, 14, 14, 12, 12, 14, 14, 11, 13, 14, 12, 11, 13, 13, 15, 15, 13, 13, 13, 11, 12, 11, 14, 14, 14, 14, 15, 13, 11, 14, 14, 11, 13, 14, 13, 12, 13, 13, 14, 15, 14, 12, 13, 12, 12, 12, 13, 15, 14, 13, 15, 14, 10, 13, 14, 12, 11, 14, 14, 12, 13, 14, 13, 15, 14, 12, 13, 13, 11, 12, 13, 14, 14, 13, 14, 14, 9, 12, 14, 13, 12, 14, 14, 13, 12, 13, 13, 14, 15, 13, 13, 13, 11, 12, 12, 14, 14, 13, 14, 14, 11, 12, 14, 14, 12, 14, 14, 13, 12, 13, 14, 14, 14, 13, 13, 13, 12, 12, 11, 14, 14, 13, 13, 15, 13, 8, 14, 15, 11, 13, 15, 14, 12, 12, 14, 14, 15, 13, 13, 13, 12, 12, 12, 14, 14, 14, 14, 14, 13, 11, 13, 15, 13, 13, 14, 14, 12, 12, 13, 14, 14, 12, 13, 13, 11, 12, 12, 13, 14, 13, 14, 14, 13, 10, 13, 15, 13, 12, 15, 14, 12, 11, 14, 15, 14, 13, 14, 13, 12, 12, 12, 14, 14, 13, 14, 14, 13, 10, 13, 15, 13, 12, 15, 14, 11, 12, 14, 15, 14, 12, 15, 13, 10, 12, 13, 14, 14, 14, 14, 13, 13, 12, 13, 15, 13, 12, 15, 13, 11, 12, 14, 15, 13, 13, 15, 13, 10, 13, 13, 14, 13, 14, 15, 13, 12, 13, 13, 15, 13, 13, 15, 12, 11, 13, 15, 14, 11, 14, 14, 12, 11, 13, 14, 14, 13, 14, 15, 12, 11, 13, 14, 15, 13, 14, 15, 11, 10, 15, 15, 12, 13, 15, 14, 11, 11, 14, 14, 13, 14, 15, 14, 12, 12, 13, 14, 15, 13, 14, 14, 11, 12, 15, 14, 11, 14, 14, 14, 11, 13, 15, 13, 13, 14, 14, 13, 13, 13, 14, 15, 15, 13, 13, 13, 12, 14, 14, 13, 14, 14, 14, 13, 12, 15, 14, 12, 15, 14, 13, 13, 13, 13, 13, 15, 15, 12, 13, 13, 14, 13, 12, 14, 14, 13, 14, 13, 14, 14, 13, 14, 14, 13, 13, 13, 14, 14, 14, 15, 13, 12, 14, 15, 13, 11, 15, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 14, 15, 13, 11, 14, 14, 12, 11, 14, 14, 13, 13, 15, 14, 11, 13, 14, 12, 13, 14, 14, 14, 13, 13, 15, 14, 10, 15, 15, 11, 10, 14, 14, 13, 13, 15, 15, 12, 13, 14, 12, 13, 13, 14, 14, 13, 14, 14, 14, 12, 15, 14, 10, 13, 13, 14, 13, 14, 15, 14, 12, 14, 13, 11, 14, 14, 14, 14, 14, 14, 13, 15, 14, 13, 13, 12, 12, 13, 14, 13, 15, 15, 14, 13, 13, 13, 12, 13, 14, 14, 14, 14, 13, 12, 15, 15, 12, 13, 14, 12, 11, 14, 14, 15, 14, 14, 14, 11, 12, 13, 13, 14, 14, 15, 14, 11, 13, 15, 14, 10, 14, 13, 12, 12, 14, 15, 14, 14, 14, 13, 11, 12, 13, 14, 14, 15, 15, 13, 12, 15, 15, 9, 13, 14, 12, 11, 13, 15, 14, 13, 15, 14, 11, 12, 13, 13, 14, 14, 15, 14, 13, 14, 15, 14, 10, 14, 13, 12, 11, 15, 15, 13, 14, 14, 13, 10, 12, 14, 13, 14, 14, 14, 13, 14, 15, 14, 14, 11, 14, 12, 11, 14, 15, 14, 14, 14, 13, 12, 12, 14, 14, 13, 15, 14, 14, 14, 14, 12, 15, 13, 11, 14, 12, 14, 14, 14, 14, 14, 13, 13, 12, 13, 14, 13, 14, 14, 14, 15, 14, 11, 14, 15, 12, 13, 14, 14, 13, 13, 15, 14, 13, 14, 13, 12, 13, 14, 13, 14, 14, 15, 14, 10, 13, 15, 12, 10, 14, 15, 13, 12, 15, 13, 11, 14, 14, 13, 12, 14, 14, 13, 14, 15, 14, 13, 13, 14, 14, 8, 14, 15, 14, 12, 14, 14, 12, 12, 14, 14, 13, 13, 14, 12, 14, 15, 13, 13, 13, 13, 15, 11, 14, 15, 12, 13, 14, 14, 13, 12, 14, 14, 12, 14, 14, 12, 15, 15, 13, 13, 13, 13, 15, 13, 13, 15, 13, 12, 12, 14, 13, 13, 15, 15, 13, 13, 13, 13, 15, 14, 12, 14, 12, 11, 14, 14, 13, 14, 13, 13, 10, 13, 14, 13, 15, 14, 14, 12, 12, 14, 14, 13, 13, 14, 12, 12, 14, 15, 13, 14, 14, 13, 11, 13, 14, 13, 14, 14, 14, 11, 12, 15, 14, 12, 14, 13, 12, 12, 13, 15, 13, 12, 15, 13, 10, 12, 14, 14, 13, 14, 14, 11, 13, 15, 13, 11, 14, 13, 12, 12, 14, 15, 13, 12, 15, 12, 7, 13, 15, 14, 13, 14, 14, 11, 13, 15, 12, 13, 14, 13, 13, 12, 14, 15, 13, 13, 14, 12, 11, 12, 15, 14, 13, 14, 13, 11, 14, 14, 11, 13, 14, 13, 12, 12, 15, 15, 13, 12, 14, 11, 7, 13, 15, 14, 14, 14, 13, 13, 14, 12, 11, 13, 14, 13, 12, 14, 15, 14, 13, 13, 13, 11, 11, 13, 15, 14, 14, 14, 13, 14, 13, 11, 13, 13, 14, 13, 13, 15, 14, 15, 13, 11, 13, 12, 12, 13, 14, 14, 14, 13, 14, 14, 11, 12, 13, 12, 14, 13, 14, 14, 14, 15, 11, 12, 13, 10, 12, 14, 15, 13, 13, 14, 15, 13, 10, 14, 13, 13, 13, 13, 14, 14, 14, 15, 11, 13, 13, 11, 13, 14, 14, 14, 13, 14, 15, 10, 12, 13, 12, 13, 13, 14, 14, 12, 14, 15, 9, 12, 14, 13, 12, 13, 15, 13, 12, 15, 14, 8, 13, 14, 12, 13, 14, 15, 13, 13, 14, 14, 4, 13, 14, 13, 13, 14, 15, 12, 14, 15, 12, 10, 13, 13, 12, 14, 15, 14, 12, 13, 14, 14, 9, 13, 14, 13, 13, 14, 14, 13, 15, 14, 11, 10, 12, 13, 13, 14, 15, 14, 11, 13, 14, 13, 6, 14, 14, 12, 12, 14, 14, 14, 14, 13, 13, 10, 12, 13, 13, 15, 15, 14, 13, 12, 14, 13, 10, 15, 14, 12, 13, 14, 13, 15, 14, 12, 12, 10, 13, 13, 14, 15, 14, 13, 13, 12, 14, 12, 11, 15, 13, 12, 13, 14, 14, 14, 13, 14, 12, 0, 13, 13, 14, 15, 14, 13, 11, 12, 14, 11, 13, 15, 13, 12, 12, 14, 15, 13, 13, 14, 11, 11, 12, 14, 15, 14, 14, 13, 12, 12, 14, 11, 14, 14, 13, 12, 13, 15, 15, 12, 13, 14, 10, 12, 13, 14, 14, 14, 14, 13, 11, 14, 14, 10, 14, 14, 13, 12, 14, 15, 13, 12, 14, 12, 9, 13, 13, 14, 14, 14, 13, 12, 12, 15, 13, 13, 14, 13, 12, 12, 15, 15, 12, 13, 14, 12, 9, 13, 14, 15, 14, 13, 13, 12, 12, 15, 13, 13, 14, 13, 11, 14, 15, 13, 12, 14, 13, 11, 12, 13, 14, 14, 14, 13, 12, 12, 14, 14, 12, 14, 14, 12, 12, 15, 15, 12, 13, 14, 13, 11, 13, 14, 14, 14, 14, 13, 11, 12, 15, 14, 12, 14, 13, 11, 12, 15, 14, 11, 13, 14, 13, 10, 13, 15, 14, 14, 13, 12, 12, 12, 15, 14, 13, 14, 13, 12, 13, 15, 13, 12, 14, 14, 12, 11, 14, 14, 13, 14, 15, 12, 10, 14, 15, 13, 14, 15, 13, 11, 15, 15, 11, 13, 14, 14, 10, 13, 15, 13, 14, 14, 14, 12, 11, 14, 15, 13, 14, 14, 13, 13, 15, 14, 11, 13, 14, 14, 11, 13, 15, 13, 13, 14, 13, 13, 11, 14, 15, 12, 13, 14, 13, 13, 15, 13, 12, 13, 14, 13, 11, 15, 14, 13, 14, 14, 13, 12, 12, 15, 15, 13, 14, 14, 11, 14, 15, 13, 13, 14, 14, 12, 11, 15, 14, 13, 14, 14, 13, 11, 12, 15, 15, 13, 15, 14, 11, 14, 14, 12, 13, 14, 14, 13, 12, 14, 14, 13, 14, 14, 13, 12, 12, 14, 15, 13, 13, 15, 14, 14, 14, 13, 13, 13, 14, 13, 12, 14, 14, 13, 14, 14, 13, 12, 13, 14, 15, 14, 12, 14, 14, 15, 13, 13, 14, 13, 12, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 15, 13, 13, 14, 15, 13, 12, 14, 14, 13, 12, 14, 14, 14, 13, 14, 14, 13, 13, 13, 14, 14, 15, 14, 12, 14, 15, 13, 12, 14, 14, 13, 12, 14, 14, 13, 14, 14, 14, 13, 13, 13, 14, 13, 14, 15, 13, 13, 15, 14, 11, 13, 14, 13, 13, 14, 15, 14, 13, 14, 13, 13, 13, 13, 14, 13, 13, 14, 14, 13, 15, 14, 12, 12, 14, 13, 13, 14, 15, 14, 13, 14, 13, 12, 13, 14, 14, 14, 13, 13, 14, 15, 14, 15, 13, 12, 12, 13, 13, 14, 15, 15, 14, 13, 13, 13, 11, 13, 15, 14, 14, 13, 13, 14, 15, 15, 13, 12, 13, 12, 13, 13, 15, 15, 15, 14, 13, 12, 12, 12, 14, 14, 14, 14, 14, 12, 14, 15, 14, 12, 14, 13, 12, 12, 14, 15, 15, 15, 14, 13, 12, 12, 12, 14, 14, 14, 14, 13, 12, 14, 15, 13, 13, 14, 13, 11, 13, 15, 15, 14, 15, 15, 12, 12, 13, 13, 14, 15, 15, 14, 12, 13, 15, 15, 13, 13, 14, 12, 8, 13, 15, 15, 14, 14, 14, 13, 11, 12, 14, 14, 14, 14, 14, 13, 13, 15, 15, 14, 12, 13, 13, 11, 12, 15, 15, 14, 14, 15, 13, 9, 12, 14, 14, 14, 14, 14, 13, 13, 15, 15, 14, 13, 12, 13, 12, 12, 14, 14, 15, 14, 14, 14, 11, 12, 14, 13, 14, 15, 14, 13, 14, 15, 14, 13, 14, 12, 12, 13, 13, 14, 14, 14, 14, 13, 13, 13, 11, 12, 14, 14, 14, 14, 14, 13, 13, 14, 14, 14, 13, 13, 13, 12, 13, 14, 14, 14, 14, 14, 13, 10, 12, 13, 13, 14, 15, 14, 12, 13, 14, 12, 14, 14, 12, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 13, 13, 14, 13, 11, 12, 13, 14, 14, 14, 14, 13, 12, 13, 13, 12, 14, 14, 13, 13, 14, 14, 15, 13, 11, 13, 15, 12, 12, 13, 13, 12, 13, 14, 14, 13, 13, 13, 13, 13, 12, 13, 13, 13, 14, 14, 14, 13, 11, 13, 14, 13, 13, 13, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 12, 13, 14, 14, 12, 13, 14, 13, 11, 13, 13, 13, 13, 14, 14, 13, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 10, 12, 14, 12, 12, 14, 14, 13, 12, 14, 13, 13, 14, 14, 13, 12, 13, 13, 13, 12, 14, 14, 14, 13, 12, 13, 14, 12, 12, 14, 14, 13, 13, 13, 14, 13, 12, 14, 12, 12, 13, 14, 14, 13, 13, 14, 14, 13, 12, 13, 14, 11, 10, 13, 13, 12, 13, 14, 14, 13, 13, 13, 12, 12, 14, 14, 13, 13, 14, 14, 14, 13, 11, 14, 14, 10, 11, 13, 14, 13, 13, 14, 14, 12, 13, 14, 13, 12, 13, 13, 12, 13, 14, 14, 14, 13, 12, 14, 13, 9, 13, 14, 14, 14, 14, 13, 13, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 15, 14, 13, 12, 13, 14, 11, 13, 14, 14, 13, 14, 14, 13, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 12, 11, 13, 14, 13, 12, 13, 14, 13, 12, 13, 14, 13, 13, 14, 14, 12, 12, 13, 14, 13, 14, 14, 14, 12, 11, 14, 15, 12, 12, 13, 13, 13, 13, 14, 13, 12, 13, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 12, 14, 15, 12, 10, 10, 13, 14, 14, 14, 14, 13, 13, 13, 13, 12, 13, 13, 14, 13, 14, 14, 14, 13, 11, 13, 15, 13, 8, 12, 14, 14, 13, 14, 14, 13, 11, 13, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 11, 13, 14, 12, 11, 13, 14, 14, 14, 14, 13, 13, 12, 13, 14, 14, 14, 13, 12, 13, 14, 14, 14, 14, 12, 12, 14, 14, 12, 13, 14, 13, 12, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 15, 13, 10, 14, 15, 13, 11, 12, 14, 13, 13, 15, 14, 13, 13, 13, 13, 12, 13, 14, 13, 13, 14, 14, 14, 14, 11, 13, 14, 12, 13, 12, 13, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 10, 13, 15, 12, 12, 14, 14, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 15, 14, 11, 13, 15, 13, 12, 13, 14, 14, 13, 14, 14, 14, 12, 14, 14, 13, 13, 13, 13, 13, 14, 15, 14, 14, 13, 13, 15, 13, 12, 13, 14, 13, 12, 13, 14, 14, 13, 14, 14, 12, 12, 13, 14, 14, 14, 15, 15, 14, 12, 13, 14, 13, 12, 13, 14, 14, 13, 14, 14, 14, 13, 12, 13, 13, 12, 14, 14, 14, 14, 15, 14, 14, 13, 13, 14, 13, 13, 13, 14, 15, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 15, 14, 14, 14, 14, 14, 14, 11, 14, 14, 13, 13, 14, 14, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 14, 14, 13, 15, 14, 14, 14, 11, 13, 14, 14, 13, 13, 15, 14, 12, 14, 14, 14, 13, 14, 14, 13, 14, 13, 14, 13, 14, 15, 14, 14, 12, 13, 14, 13, 12, 14, 14, 14, 13, 14, 14, 13, 13, 14, 14, 13, 14, 14, 13, 14, 15, 14, 14, 14, 12, 11, 14, 15, 13, 13, 15, 15, 12, 12, 13, 14, 14, 13, 14, 13, 13, 14, 14, 14, 14, 14, 15, 14, 11, 12, 14, 14, 13, 14, 15, 14, 12, 12, 14, 14, 13, 14, 14, 14, 13, 13, 14, 13, 13, 14, 14, 15, 13, 12, 14, 15, 13, 12, 14, 14, 12, 12, 14, 14, 14, 13, 14, 13, 13, 13, 13, 13, 14, 14, 15, 15, 13, 12, 13, 14, 14, 12, 15, 15, 13, 12, 14, 13, 14, 13, 14, 14, 12, 13, 13, 13, 13, 14, 15, 15, 13, 11, 13, 13, 14, 12, 14, 15, 14, 12, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 14, 13, 14, 15, 14, 11, 13, 14, 14, 13, 13, 14, 14, 12, 13, 13, 14, 14, 13, 14, 13, 13, 14, 14, 13, 14, 14, 15, 14, 12, 13, 13, 14, 13, 13, 15, 14, 12, 12, 13, 14, 14, 13, 14, 14, 13, 13, 13, 13, 14, 14, 15, 15, 12, 11, 14, 14, 13, 12, 14, 14, 13, 12, 14, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 15, 13, 11, 14, 14, 13, 12, 14, 15, 13, 12, 13, 13, 13, 14, 14, 14, 13, 13, 14, 13, 13, 14, 15, 15, 14, 12, 13, 13, 14, 13, 14, 14, 14, 12, 11, 13, 14, 13, 14, 14, 14, 13, 13, 14, 13, 13, 15, 15, 14, 12, 13, 13, 14, 13, 13, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 15, 13, 11, 13, 14, 14, 11, 13, 14, 13, 13, 13, 14, 14, 13, 14, 13, 13, 14, 13, 12, 14, 14, 15, 15, 14, 11, 12, 14, 14, 12, 12, 14, 13, 12, 14, 14, 13, 12, 13, 14, 13, 13, 14, 13, 13, 14, 14, 14, 14, 13, 12, 13, 14, 13, 10, 13, 14, 14, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 14, 14, 13, 10, 14, 15, 13, 12, 13, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 11, 12, 15, 14, 11, 12, 13, 13, 13, 14, 14, 13, 13, 13, 12, 12, 13, 14, 13, 13, 14, 13, 13, 14, 13, 12, 14, 14, 12, 11, 12, 13, 13, 14, 14, 14, 13, 13, 13, 12, 13, 13, 13, 14, 14, 13, 14, 13, 14, 13, 13, 15, 12, 12, 11, 11, 14, 14, 13, 14, 14, 13, 13, 11, 12, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 15, 13, 10, 12, 10, 13, 14, 14, 14, 14, 13, 13, 11, 10, 14, 14, 14, 14, 14, 13, 12, 13, 14, 14, 15, 14, 10, 12, 11, 12, 13, 14, 14, 14, 13, 12, 13, 11, 12, 13, 14, 14, 14, 14, 12, 12, 14, 15, 14, 14, 13, 12, 12, 10, 12, 14, 14, 15, 13, 12, 14, 10, 5, 14, 14, 14, 13, 14, 14, 12, 11, 15, 15, 14, 12, 12, 12, 10, 12, 14, 14, 15, 15, 13, 11, 11, 7, 11, 14, 15, 15, 14, 12, 13, 11, 12, 15, 15, 14, 12, 13, 11, 0, 13, 15, 14, 14, 14, 13, 10, 0, 13, 15, 15, 14, 14, 13, 10, 10, 13, 15, 15, 14, 11, 10, 13, 11, 8, 14, 15, 15, 13, 12, 13, 12, 11, 13, 15, 14, 13, 14, 13, 9, 13, 15, 15, 14, 13, 11, 9, 8, 10, 14, 15, 15, 15, 13, 12, 9, 9, 9, 14, 15, 15, 14, 13, 11, 11, 13, 15, 15, 13, 10, 13, 12, 8, 13, 15, 15, 15, 13, 13, 8, 0, 11, 15, 15, 14, 15, 14, 12, 0, 12, 14, 15, 14, 12, 13, 13, 12, 12, 12, 15, 15, 13, 12, 13, 13, 10, 13, 15, 15, 14, 12, 12, 5, 9, 14, 15, 15, 12, 14, 13, 0, 0, 14, 15, 15, 14, 14, 12, 9, 11, 13, 14, 15, 15, 14, 13, 11, 11, 14, 15, 15, 14, 10, 11, 8, 8, 11, 15, 15, 14, 14, 14, 12, 5, 10, 13, 14, 15, 15, 14, 13, 10, 13, 15, 14, 14, 13, 12, 10, 10, 13, 13, 15, 15, 14, 13, 12, 8, 9, 13, 15, 15, 15, 14, 14, 11, 0, 14, 15, 15, 13, 13, 13, 8, 13, 13, 14, 15, 14, 14, 12, 11, 13, 13, 13, 14, 15, 15, 12, 12, 12, 12, 15, 15, 14, 14, 13, 9, 10, 11, 14, 15, 14, 15, 14, 12, 10, 11, 14, 14, 14, 15, 14, 10, 10, 13, 15, 15, 15, 14, 12, 0, 8, 13, 14, 15, 15, 15, 13, 11, 12, 10, 13, 15, 14, 14, 13, 13, 12, 13, 14, 15, 13, 13, 13, 12, 12, 13, 15, 14, 12, 14, 15, 12, 11, 13, 13, 13, 13, 15, 15, 13, 13, 13, 13, 13, 13, 14, 15, 14, 13, 12, 13, 13, 13, 14, 15, 14, 13, 10, 12, 14, 14, 13, 14, 14, 12, 12, 14, 14, 14, 14, 15, 14, 10, 12, 13, 13, 14, 14, 15, 14, 14, 14, 11, 13, 14, 13, 13, 14, 13, 14, 15, 14, 13, 12, 14, 15, 12, 11, 13, 14, 13, 12, 15, 15, 13, 12, 12, 12, 13, 13, 15, 15, 13, 13, 13, 14, 13, 13, 14, 15, 14, 10, 12, 14, 15, 13, 14, 15, 14, 12, 12, 13, 14, 14, 14, 13, 13, 13, 14, 15, 14, 13, 13, 13, 14, 13, 14, 14, 14, 13, 12, 13, 14, 14, 14, 14, 14, 13, 12, 13, 14, 14, 14, 15, 15, 11, 10, 14, 14, 14, 14, 14, 13, 12, 13, 13, 14, 15, 14, 13, 13, 13, 14, 14, 13, 13, 13, 14, 15, 15, 9, 12, 14, 14, 13, 12, 14, 14, 13, 13, 14, 13, 13, 14, 15, 14, 13, 14, 12, 11, 14, 15, 15, 14, 13, 12, 12, 13, 14, 14, 14, 14, 13, 12, 11, 14, 15, 13, 14, 14, 13, 13, 14, 13, 12, 14, 15, 15, 12, 11, 13, 13, 14, 14, 14, 14, 12, 13, 14, 11, 13, 14, 14, 15, 14, 13, 12, 12, 12, 14, 15, 15, 15, 11, 11, 12, 13, 13, 14, 15, 15, 11, 13, 12, 7, 14, 15, 15, 14, 13, 13, 11, 8, 14, 15, 15, 15, 13, 11, 4, 12, 15, 15, 14, 15, 13, 9, 13, 12, 12, 14, 15, 15, 13, 12, 13, 13, 11, 14, 15, 15, 12, 11, 12, 13, 13, 15, 15, 14, 14, 12, 12, 11, 9, 14, 15, 15, 15, 13, 12, 11, 12, 13, 14, 15, 15, 13, 12, 8, 12, 14, 15, 15, 14, 12, 12, 11, 0, 12, 15, 15, 15, 14, 13, 11, 9, 12, 14, 15, 15, 13, 12, 10, 12, 13, 14, 15, 15, 13, 10, 12, 12, 11, 14, 15, 15, 14, 13, 11, 11, 12, 14, 15, 15, 15, 13, 12, 10, 12, 14, 15, 14, 14, 13, 10, 12, 11, 13, 15, 15, 15, 14, 10, 11, 12, 12, 14, 15, 15, 13, 12, 12, 10, 12, 15, 15, 14, 13, 13, 12, 10, 11, 14, 15, 15, 15, 14, 11, 9, 13, 14, 14, 15, 15, 13, 10, 11, 13, 14, 15, 15, 14, 13, 12, 11, 12, 12, 15, 15, 15, 14, 12, 11, 10, 11, 14, 15, 15, 14, 13, 12, 10, 12, 15, 15, 14, 13, 14, 10, 10, 11, 13, 15, 15, 15, 13, 8, 8, 8, 13, 15, 15, 15, 14, 12, 8, 10, 13, 15, 15, 14, 14, 12, 8, 12, 13, 15, 15, 15, 15, 10, 0, 10, 13, 15, 15, 15, 14, 10, 0, 9, 12, 15, 15, 15, 13, 13, 0, 12, 13, 13, 15, 15, 14, 12, 9, 11, 13, 14, 15, 15, 13, 12, 8, 9, 12, 14, 15, 15, 14, 13, 12, 11, 12, 11, 15, 15, 14, 14, 13, 11, 11, 13, 15, 15, 14, 13, 11, 12, 12, 14, 14, 15, 15, 14, 13, 7, 9, 13, 13, 14, 15, 15, 14, 11, 9, 12, 13, 14, 14, 14, 13, 12, 12, 12, 13, 15, 15, 15, 12, 4, 7, 11, 11, 14, 15, 15, 15, 13, 6, 10, 10, 15, 15, 14, 13, 13, 12, 10, 12, 15, 15, 15, 13, 9, 0, 8, 12, 14, 15, 15, 15, 13, 2, 8, 9, 13, 15, 15, 14, 12, 12, 12, 11, 14, 15, 15, 14, 10, 9, 0, 12, 14, 15, 15, 15, 15, 11, 0, 0, 12, 15, 15, 14, 14, 12, 13, 11, 11, 15, 15, 14, 12, 5, 0, 12, 13, 14, 15, 15, 14, 12, 2, 0, 11, 14, 15, 14, 13, 13, 13, 7, 12, 14, 15, 15, 12, 11, 5, 10, 13, 13, 14, 15, 15, 14, 8, 8, 10, 13, 15, 14, 14, 14, 12, 11, 12, 13, 14, 15, 14, 13, 9, 7, 13, 13, 14, 15, 15, 14, 12, 0, 0, 11, 15, 15, 14, 14, 13, 8, 11, 12, 13, 15, 15, 13, 9, 0, 12, 13, 14, 15, 15, 14, 12, 8, 2, 10, 15, 15, 14, 14, 12, 11, 13, 12, 11, 14, 15, 14, 12, 10, 11, 13, 13, 14, 14, 14, 14, 11, 8, 11, 13, 15, 15, 14, 11, 12, 14, 8, 8, 14, 15, 15, 13, 11, 9, 11, 13, 14, 15, 14, 14, 12, 4, 9, 13, 15, 15, 14, 13, 10, 12, 11, 11, 14, 15, 15, 13, 11, 10, 11, 13, 14, 15, 14, 14, 14, 11, 8, 12, 15, 15, 14, 13, 12, 12, 12, 11, 13, 14, 15, 15, 12, 11, 11, 12, 14, 14, 14, 14, 14, 13, 11, 12, 14, 15, 14, 13, 13, 12, 11, 12, 13, 14, 15, 15, 14, 10, 6, 12, 14, 14, 14, 14, 14, 13, 12, 13, 14, 15, 15, 14, 13, 11, 11, 13, 13, 14, 15, 15, 15, 10, 0, 11, 13, 14, 14, 15, 14, 14, 12, 12, 14, 14, 14, 14, 14, 11, 12, 13, 13, 13, 15, 15, 15, 11, 9, 11, 12, 14, 14, 15, 14, 14, 14, 12, 12, 12, 14, 14, 14, 13, 12, 13, 13, 13, 14, 15, 15, 13, 9, 11, 13, 14, 14, 14, 14, 14, 13, 12, 12, 12, 14, 15, 15, 13, 9, 13, 14, 13, 14, 15, 15, 14, 10, 12, 12, 12, 14, 14, 15, 15, 13, 12, 12, 13, 13, 14, 15, 15, 11, 11, 12, 12, 14, 15, 15, 15, 14, 12, 13, 10, 14, 14, 14, 15, 13, 13, 14, 12, 11, 14, 15, 15, 12, 5, 13, 13, 14, 14, 15, 15, 14, 8, 11, 13, 13, 14, 13, 15, 14, 12, 14, 13, 12, 14, 15, 15, 13, 0, 12, 13, 13, 14, 15, 15, 14, 13, 11, 12, 12, 14, 14, 14, 15, 13, 14, 13, 11, 13, 15, 15, 14, 11, 11, 13, 13, 14, 14, 15, 15, 14, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 13, 12, 14, 15, 14, 12, 8, 13, 13, 14, 14, 15, 15, 14, 13, 11, 12, 11, 14, 15, 14, 14, 13, 14, 13, 12, 13, 15, 15, 13, 10, 11, 13, 14, 14, 14, 15, 14, 13, 12, 11, 12, 13, 15, 14, 14, 14, 14, 13, 13, 12, 15, 15, 14, 11, 12, 13, 14, 14, 14, 15, 15, 14, 14, 12, 12, 12, 13, 14, 14, 14, 13, 14, 14, 12, 14, 15, 14, 12, 10, 13, 14, 14, 14, 15, 14, 13, 14, 13, 12, 11, 13, 15, 14, 14, 14, 14, 14, 13, 14, 15, 14, 11, 11, 13, 14, 13, 14, 15, 14, 13, 14, 13, 10, 11, 13, 14, 14, 14, 14, 14, 14, 13, 13, 15, 14, 11, 12, 13, 13, 13, 14, 15, 14, 13, 13, 14, 13, 12, 14, 14, 14, 14, 14, 13, 13, 14, 14, 15, 14, 12, 12, 13, 14, 14, 14, 14, 14, 13, 13, 13, 14, 13, 13, 14, 13, 14, 14, 13, 13, 14, 14, 15, 15, 10, 11, 12, 13, 14, 14, 14, 14, 13, 12, 13, 13, 14, 14, 14, 13, 13, 15, 13, 12, 13, 14, 15, 15, 12, 10, 12, 13, 13, 13, 15, 14, 14, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 12, 14, 14, 15, 15, 14, 11, 11, 11, 13, 13, 14, 14, 14, 13, 13, 12, 13, 15, 14, 13, 13, 14, 14, 12, 13, 13, 14, 15, 15, 12, 6, 10, 14, 13, 14, 14, 15, 14, 12, 12, 13, 14, 15, 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 13, 9, 11, 13, 13, 14, 15, 15, 13, 12, 12, 12, 14, 15, 15, 13, 12, 11, 13, 14, 13, 12, 15, 15, 14, 8, 9, 12, 13, 13, 14, 15, 14, 13, 12, 11, 13, 15, 14, 14, 12, 12, 14, 14, 11, 12, 14, 15, 15, 11, 12, 12, 12, 13, 14, 14, 15, 13, 12, 12, 12, 14, 15, 14, 13, 12, 13, 13, 12, 12, 13, 14, 15, 13, 13, 11, 9, 12, 14, 14, 15, 14, 13, 13, 10, 12, 15, 15, 14, 13, 13, 13, 13, 10, 13, 15, 15, 14, 12, 12, 10, 11, 13, 14, 15, 15, 14, 13, 9, 11, 14, 15, 14, 13, 14, 13, 12, 11, 12, 13, 15, 15, 13, 13, 11, 9, 12, 14, 15, 15, 14, 13, 10, 10, 14, 15, 14, 14, 13, 13, 14, 11, 12, 13, 15, 15, 14, 12, 11, 9, 13, 14, 15, 15, 14, 13, 11, 11, 12, 14, 15, 14, 13, 13, 14, 12, 0, 13, 15, 15, 14, 13, 12, 7, 11, 13, 14, 15, 15, 14, 12, 0, 11, 14, 14, 14, 14, 14, 13, 12, 8, 11, 13, 15, 15, 13, 13, 11, 11, 12, 14, 15, 14, 14, 13, 9, 11, 14, 15, 15, 14, 14, 13, 12, 10, 11, 14, 15, 15, 13, 12, 8, 8, 13, 15, 15, 14, 14, 12, 8, 10, 14, 15, 15, 14, 13, 11, 12, 11, 10, 13, 15, 15, 13, 11, 8, 12, 12, 12, 15, 15, 14, 12, 11, 11, 13, 14, 15, 14, 13, 12, 13, 12, 10, 12, 15, 15, 14, 13, 14, 13, 13, 14, 14, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 14, 14, 13, 13, 13, 14, 13, 12, 13, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 14, 14, 14, 13, 12, 14, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 13, 14, 13, 13, 14, 13, 13, 13, 13, 14, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 14, 13, 14, 13, 12, 13, 12, 13, 14, 14, 14, 14, 13, 13, 12, 12, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 12, 13, 12, 13, 13, 14, 14, 14, 13, 13, 13, 12, 13, 13, 14, 14, 14, 14, 13, 13, 14, 14, 13, 14, 13, 13, 13, 12, 13, 14, 14, 14, 13, 13, 14, 12, 12, 14, 14, 14, 13, 14, 14, 13, 13, 14, 14, 14, 13, 13, 13, 12, 13, 14, 14, 14, 14, 13, 12, 12, 12, 13, 14, 14, 15, 14, 13, 13, 12, 13, 14, 14, 14, 13, 13, 12, 11, 13, 14, 14, 14, 14, 13, 12, 11, 13, 14, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 12, 12, 13, 13, 12, 14, 15, 14, 13, 13, 13, 13, 12, 13, 14, 14, 13, 14, 13, 12, 13, 14, 14, 14, 13, 13, 12, 12, 12, 14, 14, 15, 14, 13, 13, 12, 12, 12, 14, 14, 14, 14, 13, 13, 12, 13, 14, 14, 13, 12, 13, 13, 12, 13, 14, 15, 14, 13, 13, 12, 11, 12, 14, 14, 14, 14, 14, 13, 11, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 12, 13, 14, 14, 14, 13, 13, 12, 12, 14, 15, 14, 13, 14, 13, 11, 11, 14, 14, 14, 14, 13, 13, 12, 13, 13, 14, 14, 14, 13, 13, 12, 12, 14, 15, 15, 14, 12, 13, 12, 12, 13, 14, 15, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 14, 13, 12, 13, 14, 14, 14, 13, 13, 12, 12, 13, 13, 15, 14, 13, 13, 13, 12, 12, 13, 14, 14, 14, 14, 13, 13, 11, 14, 15, 14, 13, 13, 13, 12, 13, 13, 14, 14, 14, 14, 13, 12, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 12, 14, 14, 14, 14, 14, 12, 12, 13, 14, 14, 14, 14, 13, 11, 12, 13, 14, 14, 14, 14, 13, 12, 13, 12, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 12, 13, 14, 14, 13, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 14, 13, 13, 14, 13, 14, 14, 14, 13, 13, 14, 14, 13, 12, 13, 14, 13, 13, 15, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 14, 13, 13, 14, 14, 14, 12, 13, 14, 14, 13, 14, 14, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 14, 13, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 13, 12, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 14, 13, 13, 13, 13, 14, 14, 14, 12, 13, 14, 14, 13, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 13, 14, 13, 12, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 14, 14, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 13, 12, 13, 13, 14, 14, 14, 14, 13, 13, 14, 12, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 15, 14, 13, 13, 13, 13, 13, 14, 15, 14, 13, 13, 13, 12, 14, 14, 14, 14, 13, 13, 12, 12, 14, 14, 15, 14, 13, 12, 12, 13, 14, 15, 14, 14, 13, 12, 13, 13, 13, 13, 14, 15, 13, 13, 13, 13, 13, 14, 15, 15, 13, 12, 13, 13, 13, 14, 15, 14, 14, 13, 13, 12, 12, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 15, 14, 13, 13, 12, 13, 14, 15, 14, 14, 13, 13, 12, 11, 13, 15, 15, 14, 14, 13, 12, 12, 13, 14, 15, 15, 13, 13, 12, 13, 13, 14, 15, 14, 13, 12, 13, 13, 13, 14, 15, 15, 14, 13, 13, 12, 13, 14, 14, 14, 14, 13, 13, 12, 13, 14, 14, 14, 14, 13, 12, 13, 13, 13, 14, 15, 14, 14, 12, 12, 13, 13, 14, 15, 14, 13, 13, 13, 12, 13, 14, 15, 14, 13, 13, 13, 12, 12, 14, 15, 14, 14, 14, 12, 12, 13, 14, 14, 14, 14, 13, 12, 13, 13, 14, 14, 15, 14, 13, 13, 12, 13, 13, 14, 15, 14, 14, 13, 13, 12, 13, 14, 14, 14, 14, 13, 13, 12, 13, 14, 15, 14, 13, 14, 12, 12, 13, 13, 15, 15, 14, 13, 12, 12, 12, 13, 14, 14, 14, 14, 13, 12, 12, 13, 14, 15, 14, 14, 13, 12, 13, 13, 15, 14, 14, 14, 12, 11, 12, 13, 14, 15, 14, 14, 12, 11, 12, 13, 14, 15, 14, 13, 13, 12, 13, 13, 13, 14, 15, 14, 13, 12, 13, 13, 14, 15, 15, 13, 13, 12, 12, 13, 14, 15, 15, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 12, 12, 13, 13, 14, 14, 14, 14, 12, 12, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 15, 14, 13, 12, 12, 13, 13, 13, 15, 14, 14, 13, 12, 12, 12, 14, 15, 14, 13, 13, 13, 12, 13, 14, 15, 14, 13, 12, 10, 12, 13, 14, 15, 15, 14, 13, 12, 12, 12, 13, 14, 14, 14, 13, 13, 13, 12, 14, 14, 15, 14, 12, 12, 11, 13, 14, 14, 14, 14, 14, 13, 11, 11, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 15, 14, 13, 12, 11, 13, 13, 13, 14, 14, 14, 13, 12, 11, 13, 14, 15, 14, 13, 13, 13, 12, 13, 14, 14, 14, 13, 12, 12, 12, 13, 13, 14, 14, 14, 14, 12, 12, 12, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 12, 12, 13, 13, 14, 14, 14, 14, 13, 11, 11, 13, 14, 14, 14, 14, 13, 12, 13, 13, 13, 14, 14, 13, 12, 12, 13, 13, 14, 14, 14, 14, 13, 12, 12, 12, 14, 15, 14, 14, 13, 12, 13, 13, 13, 14, 14, 14, 13, 12, 13, 13, 13, 14, 14, 14, 14, 12, 12, 12, 13, 15, 14, 14, 12, 13, 14, 12, 12, 14, 15, 14, 13, 12, 12, 13, 13, 14, 14, 14, 14, 13, 12, 12, 13, 15, 15, 14, 13, 12, 13, 12, 13, 14, 15, 15, 13, 12, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 13, 14, 15, 14, 13, 13, 13, 13, 12, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 14, 15, 14, 13, 13, 13, 13, 13, 13, 14, 15, 14, 14, 12, 12, 13, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 13, 12, 12, 13, 13, 14, 15, 15, 14, 12, 11, 12, 13, 14, 14, 14, 14, 14, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 15, 14, 13, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 12, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 12, 13, 13, 13, 13, 14, 15, 14, 12, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 12, 14, 14, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 13, 12, 13, 13, 14, 14, 14, 14, 14, 12, 12, 13, 13, 14, 13, 14, 14, 13, 14, 13, 13, 14, 14, 14, 13, 11, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 13, 13, 13, 14, 15, 14, 12, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 13, 13, 14, 14, 14, 13, 12, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 13, 14, 13, 13, 13, 14, 14, 13, 12, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 14, 14, 13, 14, 14, 14, 13, 12, 13, 14, 14, 14, 14, 14, 13, 14, 13, 13, 13, 13, 14, 13, 14, 14, 14, 14, 13, 14, 14, 13, 13, 12, 13, 14, 13, 14, 14, 14, 13, 14, 13, 12, 13, 13, 14, 14, 14, 14, 13, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 14, 13, 13, 13, 14, 14, 14, 14, 13, 13, 14, 14, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 14, 13, 13, 14, 13, 14, 14, 13, 13, 14, 14, 14, 14, 12, 12, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 13, 14, 13, 13, 13, 14, 14, 15, 13, 12, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 13, 12, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 13, 13, 14, 14, 13, 13, 13, 14, 14, 14, 13, 12, 12, 14, 13, 14, 14, 14, 14, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 15, 13, 12, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 13, 12, 13, 14, 13, 13, 14, 15, 14, 12, 12, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 13, 14, 14, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 12, 12, 13, 14, 14, 14, 14, 13, 13, 12, 13, 14, 14, 14, 13, 13, 13, 13, 12, 13, 14, 15, 14, 13, 13, 12, 13, 13, 14, 14, 14, 14, 13, 12, 12, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 15, 13, 13, 12, 12, 13, 14, 14, 14, 14, 13, 12, 12, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 15, 14, 13, 12, 12, 13, 14, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 13, 13, 14, 13, 11, 13, 14, 15, 14, 13, 13, 12, 12, 13, 14, 14, 14, 14, 13, 11, 12, 14, 14, 14, 14, 14, 13, 13, 12, 12, 13, 15, 14, 13, 13, 12, 13, 13, 14, 14, 14, 14, 13, 12, 12, 14, 14, 14, 14, 14, 13, 13, 12, 13, 14, 15, 15, 13, 13, 12, 12, 13, 14, 14, 14, 13, 13, 12, 12, 14, 14, 14, 14, 13, 13, 13, 12, 12, 13, 14, 15, 13, 12, 12, 13, 13, 13, 14, 15, 14, 13, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 14, 14, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13, 13, 14, 14, 14, 14, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 14, 13, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 10}; | |
const int s3Length = 8011; | |
PROGMEM prog_char s4[] = {13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 14, 14, 14, 13, 11, 13, 15, 15, 14, 0, 13, 15, 15, 14, 9, 13, 14, 12, 12, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 15, 15, 15, 12, 8, 14, 15, 15, 13, 13, 14, 14, 14, 15, 14, 12, 13, 15, 15, 14, 1, 11, 15, 15, 15, 14, 14, 15, 11, 0, 12, 15, 15, 7, 13, 15, 15, 13, 7, 13, 9, 11, 14, 15, 15, 10, 10, 14, 15, 14, 13, 13, 13, 14, 14, 14, 14, 13, 14, 14, 14, 15, 14, 14, 14, 14, 15, 14, 9, 13, 15, 15, 14, 12, 13, 15, 15, 15, 12, 11, 13, 15, 15, 14, 12, 11, 14, 15, 14, 12, 10, 14, 15, 14, 11, 4, 13, 14, 14, 14, 12, 13, 14, 14, 15, 13, 13, 14, 14, 14, 13, 14, 14, 14, 14, 14, 14, 14, 12, 13, 13, 13, 14, 14, 13, 13, 13, 14, 15, 14, 13, 14, 15, 15, 15, 14, 14, 15, 15, 14, 14, 14, 15, 15, 14, 13, 14, 14, 14, 13, 14, 12, 11, 15, 15, 15, 13, 8, 0, 10, 14, 15, 14, 7, 0, 12, 15, 15, 14, 0, 12, 15, 15, 15, 13, 8, 12, 14, 15, 15, 14, 13, 9, 8, 14, 15, 14, 12, 8, 12, 15, 15, 15, 14, 15, 15, 15, 15, 15, 14, 13, 14, 14, 14, 13, 10, 4, 5, 10, 11, 7, 4, 7, 10, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 14, 13, 13, 14, 14, 13, 10, 5, 7, 3, 13, 15, 14, 9, 6, 14, 15, 15, 15, 14, 14, 15, 15, 14, 14, 15, 13, 1, 6, 5, 11, 10, 4, 4, 10, 14, 15, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 15, 13, 7, 5, 3, 4, 4, 4, 4, 5, 11, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 13, 12, 12, 7, 4, 4, 4, 4, 5, 12, 15, 14, 11, 11, 15, 15, 15, 12, 13, 15, 15, 15, 15, 15, 15, 15, 15, 11, 4, 8, 0, 12, 12, 1, 6, 1, 8, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 14, 14, 14, 14, 14, 7, 6, 2, 7, 7, 5, 7, 13, 14, 15, 15, 15, 15, 15, 14, 14, 14, 15, 14, 14, 12, 8, 9, 7, 4, 8, 12, 13, 12, 7, 8, 14, 15, 15, 15, 15, 11, 0, 13, 15, 15, 15, 15, 11, 12, 14, 0, 14, 13, 13, 15, 10, 6, 7, 14, 14, 14, 12, 0, 11, 14, 15, 15, 15, 15, 15, 12, 13, 15, 15, 15, 15, 14, 6, 6, 7, 13, 15, 15, 13, 7, 4, 7, 14, 15, 15, 15, 15, 14, 13, 12, 13, 15, 15, 14, 9, 6, 2, 12, 14, 13, 8, 4, 5, 13, 15, 15, 15, 15, 15, 15, 11, 0, 7, 0, 14, 15, 15, 14, 12, 15, 11, 10, 15, 15, 15, 13, 5, 7, 8, 14, 14, 14, 14, 14, 14, 13, 14, 15, 15, 15, 15, 11, 0, 12, 14, 15, 15, 15, 14, 9, 6, 7, 14, 15, 15, 15, 14, 10, 6, 2, 12, 15, 15, 15, 11, 0, 9, 14, 15, 15, 14, 14, 14, 12, 5, 10, 10, 13, 14, 12, 14, 14, 15, 15, 15, 9, 5, 11, 12, 0, 13, 15, 15, 15, 14, 2, 12, 15, 15, 15, 12, 4, 8, 7, 3, 8, 14, 15, 15, 14, 0, 13, 15, 15, 15, 15, 8, 9, 9, 4, 8, 14, 15, 15, 14, 0, 13, 15, 15, 15, 15, 15, 14, 8, 7, 0, 11, 14, 14, 14, 15, 15, 15, 14, 14, 15, 15, 13, 10, 12, 10, 6, 4, 0, 12, 15, 15, 15, 15, 14, 8, 13, 12, 6, 0, 13, 15, 15, 15, 15, 12, 0, 13, 15, 15, 15, 11, 3, 6, 1, 13, 14, 15, 15, 15, 14, 0, 14, 15, 14, 12, 10, 4, 12, 9, 0, 13, 15, 15, 15, 15, 14, 15, 15, 11, 12, 14, 12, 2, 6, 0, 12, 14, 14, 15, 15, 15, 15, 15, 14, 15, 15, 11, 1, 6, 0, 10, 8, 10, 11, 14, 15, 15, 15, 14, 9, 3, 9, 0, 10, 15, 15, 15, 15, 12, 4, 6, 13, 15, 15, 15, 11, 3, 4, 5, 4, 12, 15, 15, 15, 13, 5, 4, 5, 6, 14, 15, 15, 14, 0, 12, 15, 15, 15, 15, 15, 15, 15, 13, 0, 7, 11, 9, 7, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 13, 2, 6, 9, 12, 5, 9, 6, 14, 15, 15, 15, 15, 14, 9, 0, 7, 0, 12, 15, 15, 15, 15, 13, 4, 6, 10, 15, 15, 15, 13, 11, 2, 6, 4, 13, 15, 15, 15, 14, 11, 9, 1, 4, 11, 15, 15, 15, 12, 13, 13, 14, 15, 15, 15, 15, 15, 13, 4, 6, 3, 6, 13, 14, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15, 15, 12, 0, 6, 0, 8, 9, 14, 14, 15, 15, 15, 15, 15, 14, 5, 5, 6, 4, 14, 15, 15, 15, 14, 9, 7, 0, 13, 15, 15, 15, 14, 11, 0, 7, 2, 13, 15, 15, 15, 13, 13, 7, 6, 0, 10, 15, 15, 13, 14, 15, 14, 14, 15, 15, 15, 15, 13, 0, 8, 8, 0, 11, 15, 15, 15, 15, 14, 14, 14, 13, 14, 15, 15, 15, 14, 8, 6, 0, 6, 0, 13, 15, 15, 15, 15, 15, 15, 11, 2, 6, 1, 8, 14, 15, 15, 15, 15, 11, 6, 1, 12, 15, 15, 15, 15, 14, 0, 8, 0, 12, 15, 15, 15, 15, 15, 11, 0, 7, 0, 13, 15, 14, 15, 15, 14, 4, 13, 15, 15, 15, 13, 4, 6, 0, 5, 6, 14, 15, 15, 15, 12, 14, 15, 13, 11, 14, 15, 15, 14, 10, 0, 8, 8, 0, 10, 15, 15, 15, 15, 15, 15, 14, 10, 4, 7, 9, 0, 10, 14, 15, 15, 15, 14, 6, 5, 10, 14, 15, 14, 14, 15, 10, 4, 5, 0, 11, 15, 15, 15, 15, 15, 9, 7, 0, 10, 15, 15, 14, 15, 15, 14, 6, 8, 14, 15, 15, 13, 0, 13, 14, 7, 8, 12, 15, 15, 15, 14, 14, 15, 14, 7, 7, 14, 15, 15, 11, 0, 10, 10, 0, 12, 15, 15, 15, 15, 15, 15, 14, 14, 13, 0, 8, 4, 8, 0, 13, 15, 15, 15, 15, 10, 13, 11, 8, 15, 14, 14, 14, 9, 5, 9, 10, 1, 13, 15, 15, 15, 15, 11, 4, 5, 13, 15, 15, 15, 15, 15, 11, 0, 11, 14, 14, 14, 14, 15, 15, 13, 1, 9, 14, 15, 15, 15, 15, 15, 15, 12, 0, 11, 13, 12, 11, 12, 14, 15, 14, 0, 12, 15, 15, 15, 15, 15, 15, 15, 13, 10, 10, 4, 5, 7, 13, 15, 15, 14, 12, 15, 15, 14, 9, 11, 11, 14, 15, 14, 14, 12, 0, 12, 15, 14, 8, 12, 15, 15, 15, 15, 11, 3, 6, 5, 14, 15, 15, 15, 15, 12, 0, 8, 14, 15, 15, 15, 15, 15, 13, 7, 5, 9, 14, 15, 15, 15, 15, 14, 9, 7, 5, 14, 15, 15, 15, 15, 15, 11, 0, 12, 15, 15, 15, 15, 14, 12, 0, 7, 0, 13, 15, 15, 11, 8, 14, 12, 10, 12, 13, 15, 15, 15, 15, 14, 11, 0, 8, 10, 14, 15, 15, 11, 5, 5, 7, 14, 15, 15, 15, 15, 15, 11, 2, 6, 0, 13, 15, 15, 15, 15, 13, 3, 4, 12, 14, 14, 15, 15, 15, 13, 6, 6, 7, 14, 15, 15, 15, 15, 14, 4, 8, 3, 14, 15, 15, 15, 15, 13, 6, 4, 11, 15, 15, 15, 15, 15, 13, 0, 8, 0, 13, 15, 15, 15, 15, 12, 0, 7, 0, 7, 14, 15, 15, 15, 15, 15, 11, 5, 4, 6, 12, 15, 15, 15, 14, 8, 5, 9, 13, 15, 15, 15, 15, 15, 13, 3, 7, 0, 7, 12, 15, 15, 15, 15, 11, 0, 12, 13, 12, 15, 15, 15, 15, 12, 0, 7, 0, 10, 14, 15, 15, 15, 14, 5, 8, 11, 10, 12, 15, 15, 15, 14, 6, 6, 12, 14, 15, 15, 15, 15, 15, 13, 4, 6, 2, 6, 13, 15, 15, 15, 15, 11, 1, 6, 0, 7, 14, 15, 15, 15, 14, 13, 14, 9, 6, 0, 13, 15, 15, 15, 14, 6, 6, 0, 10, 15, 15, 15, 15, 15, 13, 5, 6, 4, 2, 13, 15, 15, 15, 14, 10, 0, 9, 6, 10, 15, 15, 15, 15, 13, 6, 7, 0, 8, 14, 15, 15, 15, 15, 11, 0, 10, 11, 3, 13, 15, 15, 15, 14, 5, 6, 13, 14, 14, 15, 15, 15, 14, 4, 7, 0, 9, 13, 14, 15, 15, 15, 15, 14, 9, 6, 7, 10, 0, 12, 15, 15, 15, 15, 15, 11, 4, 6, 2, 13, 15, 15, 15, 14, 9, 5, 4, 8, 14, 15, 15, 15, 15, 14, 10, 4, 5, 2, 12, 15, 15, 15, 15, 14, 0, 7, 0, 10, 13, 15, 15, 15, 14, 8, 5, 4, 5, 13, 15, 15, 15, 15, 14, 3, 6, 7, 12, 14, 15, 15, 15, 14, 6, 6, 3, 7, 14, 15, 15, 15, 15, 14, 10, 1, 5, 0, 10, 15, 15, 15, 14, 14, 14, 13, 14, 14, 8, 7, 12, 11, 0, 12, 15, 15, 15, 15, 14, 14, 13, 8, 6, 6, 14, 15, 15, 14, 9, 0, 12, 14, 14, 15, 15, 15, 15, 14, 5, 7, 4, 2, 10, 15, 15, 15, 15, 15, 12, 7, 13, 14, 7, 13, 15, 15, 12, 4, 5, 4, 4, 11, 14, 15, 15, 15, 14, 14, 12, 2, 5, 10, 15, 15, 15, 12, 5, 6, 2, 9, 14, 15, 15, 15, 15, 15, 14, 12, 4, 7, 0, 10, 15, 15, 15, 15, 15, 14, 12, 13, 14, 14, 15, 15, 11, 5, 6, 6, 1, 12, 15, 15, 15, 15, 15, 15, 15, 11, 7, 4, 13, 15, 15, 15, 14, 8, 11, 10, 1, 11, 15, 15, 15, 15, 15, 13, 9, 6, 7, 3, 12, 15, 15, 15, 15, 15, 13, 8, 6, 9, 14, 15, 15, 15, 14, 12, 8, 7, 8, 14, 15, 15, 15, 15, 15, 14, 11, 7, 8, 12, 14, 15, 15, 15, 14, 10, 7, 8, 13, 15, 15, 15, 15, 15, 14, 9, 8, 7, 9, 13, 15, 15, 15, 15, 15, 12, 8, 7, 11, 14, 15, 15, 15, 15, 11, 8, 8, 8, 7, 14, 15, 15, 15, 15, 14, 13, 8, 8, 8, 10, 14, 15, 15, 15, 11, 8, 8, 8, 9, 14, 15, 15, 15, 15, 12, 7, 9, 8, 10, 14, 15, 15, 15, 15, 12, 7, 9, 7, 11, 14, 15, 15, 15, 15, 13, 8, 10, 7, 12, 15, 15, 15, 15, 14, 11, 8, 9, 8, 13, 15, 15, 15, 15, 15, 12, 8, 9, 9, 13, 15, 14, 15, 15, 15, 13, 10, 9, 10, 11, 13, 14, 15, 15, 15, 14, 12, 12, 9, 9, 9, 12, 14, 15, 15, 14, 14, 15, 14, 11, 9, 10, 13, 14, 15, 15, 15, 15, 14, 14, 11, 13, 14, 10, 10, 14, 15, 14, 13, 9, 9, 12, 15, 15, 15, 15, 15, 15, 14, 10, 10, 10, 10, 9, 13, 15, 14, 11, 11, 13, 13, 13, 11, 14, 15, 15, 15, 14, 13, 13, 10, 10, 9, 12, 14, 14, 14, 14, 15, 14, 14, 14, 14, 15, 15, 13, 13, 14, 13, 11, 10, 12, 14, 15, 15, 15, 15, 14, 13, 12, 12, 14, 15, 15, 14, 13, 13, 12, 10, 10, 13, 14, 14, 14, 14, 14, 14, 13, 10, 11, 14, 15, 14, 15, 14, 14, 13, 11, 10, 11, 10, 12, 14, 14, 15, 14, 15, 14, 14, 13, 12, 12, 11, 11, 14, 15, 14, 12, 11, 11, 12, 14, 14, 14, 14, 14, 14, 14, 14, 12, 11, 11, 11, 11, 13, 14, 13, 14, 14, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 12, 11, 11, 11, 11, 12, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 13, 14, 13, 12, 13, 14, 14, 14, 12, 12, 14, 14, 14, 14, 14, 14, 14, 12, 11, 11, 12, 13, 14, 14, 14, 14, 13, 12, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 11, 11, 13, 14, 14, 14, 14, 14, 13, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 13, 12, 11, 12, 11, 13, 14, 14, 14, 14, 13, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 13, 12, 12, 12, 14, 14, 14, 14, 14, 14, 13, 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 12, 12, 14, 14, 14, 14, 14, 14, 13, 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 12, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 12, 12, 13, 13, 12, 13, 14, 14, 14, 14, 14, 14, 13, 12, 12, 13, 14, 14, 14, 14, 14, 13, 12, 12, 12, 13, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 12, 12, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 12, 13, 13, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 14, 14, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 14, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 13, 14, 14, 13, 14, 13, 13, 13, 14, 13, 13, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 14, 13, 13, 13, 14, 13, 13, 13, 14, 14, 13, 14, 13, 13, 14, 14, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10}; | |
const int s4Length = 2869; | |
//prog_char* samplePointers[] = {s0, s1, s2, s3, s4}; | |
//int sampleLength[] = {931,1780,463,8011,2869}; | |
//Timer | |
prog_char* sampleOffset; | |
int sampleCounter = 0; | |
int sampleLength = 0; | |
int timerTicks = 0; | |
ISR(TIMER1_COMPA_vect) | |
{ | |
if (sampleCounter < sampleLength) //send current sample | |
{ | |
send_data(0x0A, pgm_read_byte_near(sampleOffset + sampleCounter++)); | |
if ((sampleLength - sampleCounter) == 1) CLR(__RGBLEDPORT__,__BLED__); | |
} | |
timerTicks++; | |
if (timerTicks == 220 && false) //arpeggio on chan B | |
{ | |
timerTicks = 0; | |
if (noteB > 0) | |
{ | |
periodB = tp[noteB + arpeggio[arpeggioCounter]]; | |
byte LSB = ( periodB & 0x00FF); | |
byte MSB = ((periodB >> 8) & 0x000F); | |
send_data(0x02, LSB); | |
send_data(0x03, MSB); | |
arpeggioCounter++; | |
if (arpeggioCounter == arpeggioLength) arpeggioCounter = 0; | |
} | |
} | |
} | |
void setup(){ | |
//init pins | |
pinMode(ad0, OUTPUT); | |
pinMode(ad1, OUTPUT); | |
pinMode(ad2, OUTPUT); | |
pinMode(ad3, OUTPUT); | |
pinMode(ad4, OUTPUT); | |
pinMode(ad5, OUTPUT); | |
pinMode(ad6, OUTPUT); | |
pinMode(ad7, OUTPUT); | |
pinMode(pinBC1, OUTPUT); | |
pinMode(pinBDIR, OUTPUT); | |
pinMode(pinYMReset, OUTPUT); | |
pinMode(ledPin, OUTPUT); | |
__RGBLEDDDR__ |= ( 1 << __RLED__ | 1 << __GLED__ | 1 << __BLED__); //led pins as output | |
resetYM(); | |
AmaxVolume = defaultLevel; | |
BmaxVolume = defaultLevel; | |
CmaxVolume = defaultLevel; | |
//serial init | |
Serial.begin(31250); | |
//timer1 : sample player | |
cli(); | |
TCCR1A = 0; //timer reset | |
TCCR1B = 0; //timer reset | |
OCR1A = 1450; //period for 11025 kHz at 16Mhz | |
TCCR1B |= (1 << WGM12); //CTC mode | |
TCCR1B |= (1 << CS10); // timer ticks = clock ticks | |
TIMSK1 |= (1 << OCIE1A); // enable compare | |
sei(); | |
//say hello | |
playNote(60, 127, 4); | |
delay(40); | |
playNote(64, 127, 4); | |
delay(40); | |
playNote(67, 127, 4); | |
delay(40); | |
playNote(72, 127, 4); | |
delay(40); | |
stopNote(72, 4); | |
} | |
void loop() { | |
byte command = getSerialByte(); | |
byte commandMSB = command & 0xF0; | |
byte midiChannel = command & 0x0F; | |
if (commandMSB == 0x80) //Note off | |
{ | |
byte note = getSerialByte(); | |
getSerialByte(); //discard 3rd byte | |
stopNote(note, midiChannel); | |
} | |
else if (commandMSB == 0x90) //Note on | |
{ | |
byte note = getSerialByte(); | |
byte velo = getSerialByte(); | |
if (velo != 0 && midiChannel == 0x09) | |
playDigidrum(note, velo); | |
else if (velo != 0) | |
playNote(note, velo, midiChannel); | |
else if (velo == 0) | |
stopNote(note, midiChannel); | |
} | |
else if (commandMSB == 0xA0) // Key pressure | |
{ | |
getSerialByte(); | |
getSerialByte(); | |
} | |
else if (commandMSB == 0xB0) // Control change | |
{ | |
byte controller = getSerialByte(); | |
byte value = getSerialByte(); | |
if (controller == 0x01) setDetune(value); | |
if (controller == 0x07) setChannelVolume(value, midiChannel); | |
} | |
else if (commandMSB == 0xC0) // Program change | |
{ | |
byte program = getSerialByte(); | |
} | |
else if (commandMSB == 0xD0) // Channel pressure | |
{ | |
byte pressure = getSerialByte(); | |
} | |
else if (commandMSB == 0xE0) // Pitch bend | |
{ | |
byte pitchBendLSB = getSerialByte(); | |
byte pitchBendMSB = getSerialByte(); | |
} | |
} | |
void setDetune(byte value) | |
{ | |
detuneValue = (value >> 3) & 0x0F; //downscaling to 4 bits | |
} | |
void setChannelVolume(byte value, byte chan) | |
{ | |
value = (value >> 3) & 0x0F; //downscaling to 4 bits | |
if (chan == 0) | |
{ | |
AmaxVolume = value; | |
send_data(0x08, value); | |
} | |
else if (chan == 1) | |
{ | |
BmaxVolume = value; | |
send_data(0x09, value); | |
} | |
else if (chan == 2) | |
{ | |
CmaxVolume = value; | |
send_data(0x0A, value); | |
} | |
} | |
void playNote(byte note, byte velo, byte chan) | |
{ | |
if (note < 24) return; | |
if (chan == 0) | |
{ | |
SET(__RGBLEDPORT__,__RLED__); | |
noteA = note; | |
periodA = tp[note]; | |
byte LSB = ( periodA & 0x00FF); | |
byte MSB = ((periodA & 0x0F00) >> 8); | |
cli(); | |
send_data(0x00, LSB); | |
send_data(0x01, MSB); | |
send_data(0x08, AmaxVolume); //can be set to 0 by envelope mode note off | |
sei(); | |
} | |
else if (chan == 1) | |
{ | |
SET(__RGBLEDPORT__,__GLED__); | |
noteB = note; | |
periodB = tp[note]; | |
byte LSB = ( periodB & 0x00FF); | |
byte MSB = ((periodB >> 8) & 0x000F); | |
cli(); | |
arpeggioCounter = 0; //arpeggio reset | |
send_data(0x02, LSB); | |
send_data(0x03, MSB); | |
sei(); | |
} | |
else if (chan == 2) | |
{ | |
SET(__RGBLEDPORT__,__BLED__); | |
noteC = note; | |
periodC = tp[note]; | |
byte LSB = ( periodC & 0x00FF); | |
byte MSB = ((periodC >> 8) & 0x000F); | |
cli(); | |
send_data(0x04, LSB); | |
send_data(0x05, MSB); | |
sei(); | |
} | |
else if (chan == 3) | |
{ | |
SET(__RGBLEDPORT__,__RLED__); | |
SET(__RGBLEDPORT__,__GLED__); | |
noteA = note; | |
noteB = note; | |
periodA = tp[note]; | |
periodB = tp[note] + detuneValue; | |
byte ALSB = ( periodA & 0x00FF); | |
byte AMSB = ((periodA >> 8) & 0x000F); | |
byte BLSB = ( periodB & 0x00FF); | |
byte BMSB = ((periodB >> 8) & 0x000F); | |
cli(); | |
send_data(0x00, ALSB); | |
send_data(0x01, AMSB); | |
send_data(0x02, BLSB); | |
send_data(0x03, BMSB); | |
sei(); | |
} | |
else if (chan == 4) | |
{ | |
SET(__RGBLEDPORT__,__RLED__); | |
SET(__RGBLEDPORT__,__GLED__); | |
SET(__RGBLEDPORT__,__BLED__); | |
noteA = note; | |
noteB = note; | |
noteC = note; | |
periodA = tp[note - 12]; | |
periodB = tp[note] + detuneValue; | |
periodC = tp[note] - detuneValue; | |
byte ALSB = ( periodA & 0x00FF); | |
byte AMSB = ((periodA >> 8) & 0x000F); | |
byte BLSB = ( periodB & 0x00FF); | |
byte BMSB = ((periodB >> 8) & 0x000F); | |
byte CLSB = ( periodC & 0x00FF); | |
byte CMSB = ((periodC >> 8) & 0x000F); | |
cli(); | |
send_data(0x00, ALSB); | |
send_data(0x01, AMSB); | |
send_data(0x02, BLSB); | |
send_data(0x03, BMSB); | |
send_data(0x04, CLSB); | |
send_data(0x05, CMSB); | |
sei(); | |
} | |
else if (chan == 5) | |
{ | |
SET(__RGBLEDPORT__,__RLED__); | |
noteA = note; | |
periodA = envTp[note]; | |
byte LSB = ( periodA & 0x00FF); | |
byte MSB = ((periodA >> 8) & 0x000F); | |
cli(); | |
send_data(0x08, 0x10); | |
send_data(0x0B, LSB); | |
send_data(0x0C, MSB); | |
send_data(0x0D, 0b00001110); | |
sei(); | |
} | |
else if (chan == 6) | |
{ | |
SET(__RGBLEDPORT__,__RLED__); | |
noteA = note; | |
periodA = envTp[note]; | |
byte LSB = ( periodA & 0x00FF); | |
byte MSB = ((periodA >> 8) & 0x000F); | |
cli(); | |
send_data(0x0B, LSB); | |
send_data(0x0C, MSB); | |
send_data(0x0D, 0b00001000); | |
sei(); | |
} | |
else if (chan == 7) | |
{ | |
SET(__RGBLEDPORT__,__RLED__); | |
SET(__RGBLEDPORT__,__GLED__); | |
noteA = note; | |
noteB = note; | |
periodA = envTp[note]; | |
periodB = (tp[note - 12] + detuneValue) << 1; | |
byte LSB = ( periodA & 0x00FF); | |
byte MSB = ((periodA >> 8) & 0x000F); | |
byte BLSB = ( periodB & 0x00FF); | |
byte BMSB = ((periodB >> 8) & 0x000F); | |
cli(); | |
send_data(0x02, BLSB); | |
send_data(0x03, BMSB); | |
send_data(0x08, 0x10); //envelope mode on | |
send_data(0x0B, LSB); | |
send_data(0x0C, MSB); | |
send_data(0x0D, 0b00001000); | |
sei(); | |
} | |
} | |
void stopNote(byte note, byte chan) | |
{ | |
if (chan == 0 && note == noteA) | |
{ | |
CLR(__RGBLEDPORT__,__RLED__); | |
noteA = periodA = 0; | |
cli(); | |
send_data(0x00, 0); | |
send_data(0x01, 0); | |
sei(); | |
} | |
else if (chan == 1 && note == noteB) | |
{ | |
CLR(__RGBLEDPORT__,__GLED__); | |
noteB = periodB = 0; | |
cli(); | |
send_data(0x02, 0); | |
send_data(0x03, 0); | |
sei(); | |
} | |
else if (chan == 2 && note == noteC) | |
{ | |
CLR(__RGBLEDPORT__,__BLED__); | |
noteC = periodC = 0; | |
cli(); | |
send_data(0x04, 0); | |
send_data(0x05, 0); | |
sei(); | |
} | |
else if (chan == 3 && note == noteA) | |
{ | |
CLR(__RGBLEDPORT__,__RLED__); | |
CLR(__RGBLEDPORT__,__GLED__); | |
noteA = periodA = 0; | |
noteA = periodB = 0; | |
cli(); | |
send_data(0x00, 0); | |
send_data(0x01, 0); | |
send_data(0x02, 0); | |
send_data(0x03, 0); | |
sei(); | |
} | |
else if (chan == 4 && note == noteA) | |
{ | |
CLR(__RGBLEDPORT__,__RLED__); | |
CLR(__RGBLEDPORT__,__GLED__); | |
CLR(__RGBLEDPORT__,__BLED__); | |
noteA = periodA = 0; | |
noteB = periodB = 0; | |
noteC = periodC = 0; | |
cli(); | |
send_data(0x00, 0); | |
send_data(0x01, 0); | |
send_data(0x02, 0); | |
send_data(0x03, 0); | |
send_data(0x04, 0); | |
send_data(0x05, 0); | |
sei(); | |
} | |
else if (chan == 5 && note == noteA) | |
{ | |
CLR(__RGBLEDPORT__,__RLED__); | |
noteA = periodA = 0; | |
cli(); | |
send_data(0x0D, 0); | |
send_data(0x08, AmaxVolume); | |
sei(); | |
} | |
else if (chan == 6 && note == noteA) | |
{ | |
CLR(__RGBLEDPORT__,__RLED__); | |
noteA = periodA = 0; | |
cli(); | |
send_data(0x0D, 0); | |
send_data(0x08, AmaxVolume); | |
sei(); | |
} | |
else if (chan == 7 && note == noteA) | |
{ | |
CLR(__RGBLEDPORT__,__RLED__); | |
CLR(__RGBLEDPORT__,__GLED__); | |
noteA = periodA = 0; | |
noteB = periodB = 0; | |
cli(); | |
send_data(0x02, 0); | |
send_data(0x03, 0); | |
send_data(0x0D, 0); | |
send_data(0x08, AmaxVolume); | |
sei(); | |
} | |
} | |
void playDigidrum(byte index, byte velo) | |
{ | |
if (index == 48) | |
{ | |
cli(); | |
SET(__RGBLEDPORT__,__BLED__); | |
sampleOffset = s0; | |
sampleLength = s0Length; | |
sampleCounter = 0; | |
sei(); | |
} | |
else if (index == 49) | |
{ | |
cli(); | |
SET(__RGBLEDPORT__,__BLED__); | |
sampleOffset = s1; | |
sampleLength = s1Length; | |
sampleCounter = 0; | |
sei(); | |
} | |
else if (index == 50) | |
{ | |
cli(); | |
SET(__RGBLEDPORT__,__BLED__); | |
sampleOffset = s2; | |
sampleLength = s2Length; | |
sampleCounter = 0; | |
sei(); | |
} | |
else if (index == 51) | |
{ | |
cli(); | |
SET(__RGBLEDPORT__,__BLED__); | |
sampleOffset = s3; | |
sampleLength = s3Length; | |
sampleCounter = 0; | |
sei(); | |
} | |
else if (index == 52) | |
{ | |
cli(); | |
SET(__RGBLEDPORT__,__BLED__); | |
sampleOffset = s4; | |
sampleLength = s4Length; | |
sampleCounter = 0; | |
sei(); | |
} | |
} | |
void resetYM() | |
{ | |
digitalWrite(pinYMReset, LOW); | |
digitalWrite(pinYMReset, HIGH); | |
delay(1); | |
send_data(0x07, 0b00111000); | |
for (byte i=0; i <= defaultLevel; i++) | |
{ | |
send_data(0x08, i); | |
send_data(0x09, i); | |
send_data(0x0A, i); | |
delay(1); | |
} | |
} | |
void send_data(unsigned char address, unsigned char data) | |
{ | |
SET(__LEDPORT__,__LED__); | |
boolean value[8]; | |
//put address in a 8-bit array | |
for (int i; i < 8; i++) | |
{ | |
value[i] = ((0x01 & address) == 1); | |
address = address >> 1; | |
} | |
//write address to pins | |
outputToYM(value); | |
//validate addess | |
__BCPORT__ |= (1 << __BDIR__) | (1 << __BC1__); | |
delayMicroseconds(1); | |
__BCPORT__ &= ~((1 << __BDIR__) | (1 << __BC1__)); | |
//put data in a 8-bit array | |
for (int i; i < 8; i++) | |
{ | |
value[i] = ((0x01 & data) == 1); | |
data = data >> 1; | |
} | |
//write data to pins | |
outputToYM(value); | |
//validate data | |
SET(__BCPORT__,__BDIR__); | |
delayMicroseconds(1); | |
CLR(__BCPORT__,__BDIR__); | |
CLR(__LEDPORT__,__LED__); | |
} | |
void outputToYM(boolean value[]) | |
{ | |
value[0] ? SET(PORTB, 0) : CLR(PORTB, 0); | |
value[1] ? SET(PORTB, 1) : CLR(PORTB, 1); | |
value[2] ? SET(PORTD, 2) : CLR(PORTD, 2); | |
value[3] ? SET(PORTD, 3) : CLR(PORTD, 3); | |
value[4] ? SET(PORTD, 4) : CLR(PORTD, 4); | |
value[5] ? SET(PORTD, 5) : CLR(PORTD, 5); | |
value[6] ? SET(PORTD, 6) : CLR(PORTD, 6); | |
value[7] ? SET(PORTD, 7) : CLR(PORTD, 7); | |
} | |
byte getSerialByte() | |
{ | |
while(Serial.available() < 1) __asm__("nop\n\t"); | |
return Serial.read(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment