diff options
Diffstat (limited to 'jack')
-rw-r--r-- | jack/autocorrect_data.h | 497 | ||||
-rw-r--r-- | jack/autocorrect_dict.txt | 398 | ||||
-rw-r--r-- | jack/color.c | 132 | ||||
-rw-r--r-- | jack/combos.def | 16 | ||||
-rw-r--r-- | jack/combos.h | 20 | ||||
-rw-r--r-- | jack/config.h | 51 | ||||
-rw-r--r-- | jack/dict.h | 207 | ||||
-rw-r--r-- | jack/jack.c | 117 | ||||
-rw-r--r-- | jack/jack.h | 113 | ||||
-rw-r--r-- | jack/oled.c | 237 | ||||
-rw-r--r-- | jack/oled.h | 596 | ||||
-rw-r--r-- | jack/oledfont.h | 118 | ||||
-rw-r--r-- | jack/raw.py | 49 | ||||
-rw-r--r-- | jack/rules.mk | 50 | ||||
-rw-r--r-- | jack/tapping.c | 200 | ||||
-rw-r--r-- | jack/unicode.c | 280 |
16 files changed, 3081 insertions, 0 deletions
diff --git a/jack/autocorrect_data.h b/jack/autocorrect_data.h new file mode 100644 index 0000000..f9d6352 --- /dev/null +++ b/jack/autocorrect_data.h @@ -0,0 +1,497 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#define AUTOCORRECT_MIN_LENGTH 5 +#define AUTOCORRECT_MAX_LENGTH 10 +#define DICTIONARY_SIZE 5867 + +static const uint8_t autocorrect_data[DICTIONARY_SIZE] PROGMEM = { + 0x6C, 0x40, 0x00, 0x04, 0x0A, 0x01, 0x06, 0x22, 0x01, 0x07, 0x7D, 0x01, + 0x08, 0x47, 0x03, 0x09, 0x8E, 0x08, 0x0A, 0xBF, 0x08, 0x0B, 0x43, 0x09, + 0x0C, 0xD2, 0x09, 0x0E, 0xDC, 0x09, 0x0F, 0xE8, 0x09, 0x10, 0x09, 0x0B, + 0x11, 0x3B, 0x0B, 0x12, 0x58, 0x0D, 0x13, 0x8C, 0x0D, 0x15, 0xA6, 0x0D, + 0x16, 0x6D, 0x0F, 0x17, 0x21, 0x11, 0x19, 0x59, 0x14, 0x1A, 0x90, 0x14, + 0x1C, 0xB6, 0x14, 0x00, 0x46, 0x5F, 0x00, 0x07, 0x67, 0x00, 0x08, 0x71, + 0x00, 0x0A, 0x9C, 0x00, 0x0F, 0xA8, 0x00, 0x11, 0xB0, 0x00, 0x12, 0xB8, + 0x00, 0x16, 0xC2, 0x00, 0x17, 0xCD, 0x00, 0x18, 0x00, 0x01, 0x00, 0x0C, + 0x0B, 0x1A, 0x2C, 0x00, 0x80, 0x68, 0x00, 0x16, 0x08, 0x18, 0x2C, 0x00, + 0x83, 0x73, 0x65, 0x64, 0x00, 0x4B, 0x78, 0x00, 0x17, 0x8D, 0x00, 0x00, + 0x17, 0x00, 0x6C, 0x81, 0x00, 0x12, 0x88, 0x00, 0x00, 0x08, 0x0B, 0x17, + 0x2C, 0x00, 0x84, 0x00, 0x2C, 0x00, 0x80, 0x72, 0x00, 0x0C, 0x15, 0x1A, + 0x1C, 0x13, 0x12, 0x06, 0x00, 0x85, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00, + 0x11, 0x0C, 0x10, 0x10, 0x12, 0x06, 0x00, 0x84, 0x69, 0x6E, 0x67, 0x00, + 0x18, 0x12, 0x1A, 0x2C, 0x00, 0x80, 0x64, 0x00, 0x0C, 0x12, 0x0A, 0x2C, + 0x00, 0x80, 0x67, 0x00, 0x0F, 0x16, 0x04, 0x2C, 0x00, 0x83, 0x6C, 0x73, + 0x6F, 0x00, 0x08, 0x16, 0x12, 0x12, 0x0F, 0x00, 0x84, 0x73, 0x65, 0x73, + 0x00, 0x44, 0xDA, 0x00, 0x0C, 0xE3, 0x00, 0x12, 0xED, 0x00, 0x18, 0xF7, + 0x00, 0x00, 0x15, 0x0A, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x74, 0x00, 0x15, + 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x80, 0x65, 0x00, 0x0F, 0x04, 0x2C, + 0x00, 0x83, 0x20, 0x6C, 0x6F, 0x74, 0x00, 0x16, 0x0D, 0x2C, 0x00, 0x83, + 0x75, 0x73, 0x74, 0x00, 0x17, 0x16, 0x0D, 0x2C, 0x00, 0x83, 0x75, 0x73, + 0x74, 0x00, 0x57, 0x11, 0x01, 0x1C, 0x1A, 0x01, 0x00, 0x18, 0x12, 0x05, + 0x04, 0x00, 0x80, 0x20, 0x61, 0x00, 0x07, 0x12, 0x17, 0x00, 0x81, 0x61, + 0x79, 0x00, 0x4B, 0x2C, 0x01, 0x0C, 0x35, 0x01, 0x0E, 0x75, 0x01, 0x00, + 0x17, 0x0C, 0x1A, 0x16, 0x00, 0x81, 0x63, 0x68, 0x00, 0x50, 0x42, 0x01, + 0x15, 0x4E, 0x01, 0x16, 0x5C, 0x01, 0x17, 0x65, 0x01, 0x00, 0x11, 0x04, + 0x1C, 0x07, 0x00, 0x84, 0x6E, 0x61, 0x6D, 0x69, 0x63, 0x00, 0x17, 0x08, + 0x10, 0x1C, 0x16, 0x00, 0x84, 0x6D, 0x65, 0x74, 0x72, 0x69, 0x63, 0x00, + 0x04, 0x0F, 0x06, 0x00, 0x81, 0x73, 0x69, 0x63, 0x00, 0x08, 0x0B, 0x17, + 0x16, 0x04, 0x00, 0x86, 0x65, 0x73, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, + 0x00, 0x08, 0x0B, 0x06, 0x00, 0x81, 0x63, 0x6B, 0x00, 0x44, 0x93, 0x01, + 0x08, 0x9F, 0x01, 0x0F, 0x7F, 0x02, 0x11, 0xA7, 0x02, 0x12, 0xDF, 0x02, + 0x15, 0xFA, 0x02, 0x18, 0x32, 0x03, 0x00, 0x0C, 0x0F, 0x19, 0x11, 0x0C, + 0x00, 0x83, 0x61, 0x6C, 0x69, 0x64, 0x00, 0x46, 0xC1, 0x01, 0x07, 0xCB, + 0x01, 0x08, 0xD5, 0x01, 0x09, 0xE0, 0x01, 0x0A, 0xED, 0x01, 0x0C, 0xF7, + 0x01, 0x13, 0x11, 0x02, 0x15, 0x2E, 0x02, 0x16, 0x51, 0x02, 0x17, 0x5D, + 0x02, 0x18, 0x76, 0x02, 0x00, 0x0C, 0x19, 0x07, 0x04, 0x00, 0x82, 0x73, + 0x65, 0x64, 0x00, 0x08, 0x05, 0x10, 0x08, 0x00, 0x81, 0x64, 0x65, 0x64, + 0x00, 0x15, 0x0A, 0x0A, 0x04, 0x00, 0x84, 0x72, 0x65, 0x65, 0x64, 0x00, + 0x0C, 0x16, 0x0C, 0x17, 0x04, 0x16, 0x00, 0x83, 0x66, 0x69, 0x65, 0x64, + 0x00, 0x11, 0x0C, 0x16, 0x00, 0x83, 0x67, 0x6E, 0x65, 0x64, 0x00, 0x55, + 0xFE, 0x01, 0x19, 0x07, 0x02, 0x00, 0x15, 0x18, 0x05, 0x00, 0x83, 0x69, + 0x65, 0x64, 0x00, 0x15, 0x08, 0x07, 0x00, 0x83, 0x69, 0x76, 0x65, 0x64, + 0x00, 0x44, 0x18, 0x02, 0x16, 0x24, 0x02, 0x00, 0x0F, 0x16, 0x08, 0x00, + 0x85, 0x6C, 0x61, 0x70, 0x73, 0x65, 0x64, 0x00, 0x04, 0x0F, 0x08, 0x00, + 0x83, 0x70, 0x73, 0x65, 0x64, 0x00, 0x48, 0x38, 0x02, 0x0A, 0x41, 0x02, + 0x18, 0x48, 0x02, 0x00, 0x09, 0x08, 0x15, 0x00, 0x81, 0x72, 0x65, 0x64, + 0x00, 0x04, 0x2C, 0x00, 0x80, 0x65, 0x64, 0x00, 0x06, 0x06, 0x12, 0x00, + 0x81, 0x72, 0x65, 0x64, 0x00, 0x04, 0x13, 0x0F, 0x08, 0x00, 0x84, 0x61, + 0x70, 0x73, 0x65, 0x64, 0x00, 0x44, 0x64, 0x02, 0x16, 0x6F, 0x02, 0x00, + 0x08, 0x0F, 0x08, 0x15, 0x00, 0x84, 0x61, 0x74, 0x65, 0x64, 0x00, 0x11, + 0x0C, 0x00, 0x80, 0x61, 0x64, 0x00, 0x0F, 0x06, 0x11, 0x0C, 0x00, 0x81, + 0x64, 0x65, 0x00, 0x4C, 0x86, 0x02, 0x12, 0x9B, 0x02, 0x00, 0x08, 0x00, + 0x49, 0x8F, 0x02, 0x1C, 0x95, 0x02, 0x00, 0x83, 0x69, 0x65, 0x6C, 0x64, + 0x00, 0x83, 0x69, 0x65, 0x6C, 0x64, 0x00, 0x16, 0x08, 0x15, 0x0B, 0x17, + 0x00, 0x82, 0x68, 0x6F, 0x6C, 0x64, 0x00, 0x48, 0xB1, 0x02, 0x0C, 0xBC, + 0x02, 0x18, 0xC6, 0x02, 0x00, 0x15, 0x0C, 0x09, 0x00, 0x84, 0x72, 0x69, + 0x65, 0x6E, 0x64, 0x00, 0x08, 0x15, 0x09, 0x00, 0x83, 0x69, 0x65, 0x6E, + 0x64, 0x00, 0x52, 0xCD, 0x02, 0x15, 0xD7, 0x02, 0x00, 0x04, 0x2C, 0x00, + 0x83, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x00, 0x04, 0x00, 0x82, 0x6F, 0x75, + 0x6E, 0x64, 0x00, 0x4C, 0xE6, 0x02, 0x15, 0xF1, 0x02, 0x00, 0x08, 0x15, + 0x13, 0x00, 0x84, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x00, 0x06, 0x08, 0x15, + 0x00, 0x82, 0x6F, 0x72, 0x64, 0x00, 0x44, 0x04, 0x03, 0x08, 0x0F, 0x03, + 0x18, 0x28, 0x03, 0x00, 0x1A, 0x12, 0x09, 0x00, 0x83, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x00, 0x47, 0x16, 0x03, 0x0C, 0x20, 0x03, 0x00, 0x0C, 0x16, + 0x11, 0x12, 0x06, 0x00, 0x80, 0x65, 0x64, 0x00, 0x1A, 0x00, 0x83, 0x65, + 0x69, 0x72, 0x64, 0x00, 0x04, 0x0A, 0x2C, 0x00, 0x83, 0x75, 0x61, 0x72, + 0x64, 0x00, 0x12, 0x00, 0x4B, 0x3B, 0x03, 0x15, 0x41, 0x03, 0x00, 0x16, + 0x00, 0x80, 0x6C, 0x64, 0x00, 0x04, 0x00, 0x80, 0x6E, 0x64, 0x00, 0x44, + 0x75, 0x03, 0x05, 0x82, 0x03, 0x06, 0xAD, 0x03, 0x07, 0x2D, 0x04, 0x08, + 0x49, 0x04, 0x0A, 0x9D, 0x04, 0x0B, 0x15, 0x05, 0x0C, 0x66, 0x05, 0x0F, + 0x6F, 0x05, 0x11, 0x31, 0x06, 0x15, 0x3D, 0x06, 0x16, 0xA7, 0x06, 0x17, + 0x38, 0x07, 0x18, 0x13, 0x08, 0x19, 0x4C, 0x08, 0x00, 0x06, 0x13, 0x16, + 0x08, 0x10, 0x04, 0x11, 0x00, 0x82, 0x61, 0x63, 0x65, 0x00, 0x44, 0x89, + 0x03, 0x0F, 0x93, 0x03, 0x00, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x80, + 0x6C, 0x65, 0x00, 0x44, 0x9A, 0x03, 0x18, 0xA5, 0x03, 0x00, 0x0F, 0x0C, + 0x04, 0x19, 0x04, 0x00, 0x82, 0x62, 0x6C, 0x65, 0x00, 0x12, 0x07, 0x00, + 0x82, 0x62, 0x6C, 0x65, 0x00, 0x48, 0xBA, 0x03, 0x0C, 0xC5, 0x03, 0x11, + 0xCE, 0x03, 0x13, 0x20, 0x04, 0x00, 0x15, 0x08, 0x09, 0x08, 0x15, 0x00, + 0x81, 0x6E, 0x63, 0x65, 0x00, 0x08, 0x13, 0x00, 0x83, 0x69, 0x65, 0x63, + 0x65, 0x00, 0x44, 0xD8, 0x03, 0x08, 0xE5, 0x03, 0x18, 0x16, 0x04, 0x00, + 0x17, 0x08, 0x13, 0x10, 0x12, 0x06, 0x00, 0x83, 0x65, 0x6E, 0x63, 0x65, + 0x00, 0x55, 0xEC, 0x03, 0x17, 0x0B, 0x04, 0x00, 0x08, 0x00, 0x49, 0xF5, + 0x03, 0x0F, 0x02, 0x04, 0x00, 0x15, 0x2C, 0x00, 0x86, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x12, 0x17, 0x00, 0x83, 0x61, 0x6E, + 0x63, 0x65, 0x00, 0x11, 0x0C, 0x04, 0x10, 0x00, 0x81, 0x61, 0x6E, 0x63, + 0x65, 0x00, 0x14, 0x08, 0x16, 0x00, 0x82, 0x65, 0x6E, 0x63, 0x65, 0x00, + 0x04, 0x16, 0x08, 0x10, 0x04, 0x11, 0x00, 0x83, 0x70, 0x61, 0x63, 0x65, + 0x00, 0x0C, 0x15, 0x08, 0x19, 0x00, 0x52, 0x39, 0x04, 0x19, 0x3F, 0x04, + 0x00, 0x82, 0x72, 0x69, 0x64, 0x65, 0x00, 0x12, 0x00, 0x85, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x00, 0x17, 0x00, 0x44, 0x58, 0x04, 0x0C, 0x63, + 0x04, 0x11, 0x6D, 0x04, 0x17, 0x90, 0x04, 0x00, 0x15, 0x04, 0x18, 0x0A, + 0x00, 0x82, 0x6E, 0x74, 0x65, 0x65, 0x00, 0x10, 0x10, 0x12, 0x06, 0x00, + 0x81, 0x74, 0x65, 0x65, 0x00, 0x04, 0x15, 0x00, 0x44, 0x77, 0x04, 0x18, + 0x83, 0x04, 0x00, 0x0A, 0x00, 0x86, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, + 0x65, 0x65, 0x00, 0x04, 0x0A, 0x00, 0x87, 0x75, 0x61, 0x72, 0x61, 0x6E, + 0x74, 0x65, 0x65, 0x00, 0x0C, 0x10, 0x12, 0x06, 0x00, 0x84, 0x6D, 0x69, + 0x74, 0x74, 0x65, 0x65, 0x00, 0x44, 0xA7, 0x04, 0x07, 0xEA, 0x04, 0x10, + 0x0C, 0x05, 0x00, 0x4A, 0xB4, 0x04, 0x11, 0xBF, 0x04, 0x16, 0xC8, 0x04, + 0x18, 0xD1, 0x04, 0x00, 0x15, 0x12, 0x10, 0x00, 0x83, 0x74, 0x67, 0x61, + 0x67, 0x65, 0x00, 0x0B, 0x06, 0x00, 0x83, 0x61, 0x6E, 0x67, 0x65, 0x00, + 0x08, 0x10, 0x00, 0x82, 0x73, 0x61, 0x67, 0x65, 0x00, 0x0A, 0x00, 0x6C, + 0xDA, 0x04, 0x04, 0xE0, 0x04, 0x00, 0x83, 0x61, 0x75, 0x67, 0x65, 0x00, + 0x0F, 0x00, 0x84, 0x6E, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, 0x08, 0x0F, + 0x00, 0x44, 0xF7, 0x04, 0x0C, 0xFD, 0x04, 0x0F, 0x06, 0x05, 0x00, 0x83, + 0x6C, 0x65, 0x67, 0x65, 0x00, 0x19, 0x0C, 0x15, 0x13, 0x00, 0x82, 0x67, + 0x65, 0x00, 0x04, 0x00, 0x82, 0x67, 0x65, 0x00, 0x04, 0x0C, 0x00, 0x83, + 0x6D, 0x61, 0x67, 0x65, 0x00, 0x17, 0x00, 0x47, 0x27, 0x05, 0x10, 0x31, + 0x05, 0x12, 0x3B, 0x05, 0x16, 0x44, 0x05, 0x17, 0x4D, 0x05, 0x00, 0x11, + 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x12, 0x15, 0x09, + 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x20, + 0x74, 0x68, 0x65, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, + 0x00, 0x44, 0x54, 0x05, 0x18, 0x5C, 0x05, 0x00, 0x2C, 0x00, 0x82, 0x20, + 0x74, 0x68, 0x65, 0x00, 0x12, 0x05, 0x04, 0x00, 0x82, 0x20, 0x74, 0x68, + 0x65, 0x00, 0x1D, 0x16, 0x2C, 0x00, 0x82, 0x69, 0x7A, 0x65, 0x00, 0x45, + 0x82, 0x05, 0x0C, 0xF3, 0x05, 0x13, 0xFE, 0x05, 0x16, 0x1A, 0x06, 0x17, + 0x22, 0x06, 0x19, 0x2A, 0x06, 0x00, 0x44, 0x8C, 0x05, 0x0C, 0xDC, 0x05, + 0x0F, 0xE8, 0x05, 0x00, 0x4A, 0x96, 0x05, 0x0C, 0xA0, 0x05, 0x0F, 0xBE, + 0x05, 0x00, 0x0C, 0x0F, 0x08, 0x00, 0x83, 0x69, 0x62, 0x6C, 0x65, 0x00, + 0x0F, 0x00, 0x44, 0xA9, 0x05, 0x0C, 0xB4, 0x05, 0x00, 0x19, 0x04, 0x00, + 0x85, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x04, 0x19, 0x04, 0x00, + 0x84, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x44, 0xC5, 0x05, 0x0C, 0xD0, 0x05, + 0x00, 0x19, 0x04, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, + 0x19, 0x04, 0x00, 0x85, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, + 0x04, 0x0F, 0x0C, 0x04, 0x19, 0x04, 0x00, 0x83, 0x62, 0x6C, 0x65, 0x00, + 0x0C, 0x04, 0x19, 0x04, 0x00, 0x82, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x1A, + 0x0B, 0x2C, 0x00, 0x84, 0x77, 0x68, 0x69, 0x6C, 0x65, 0x00, 0x48, 0x05, + 0x06, 0x12, 0x0F, 0x06, 0x00, 0x12, 0x13, 0x00, 0x84, 0x65, 0x6F, 0x70, + 0x6C, 0x65, 0x00, 0x08, 0x12, 0x13, 0x00, 0x85, 0x65, 0x6F, 0x70, 0x6C, + 0x65, 0x00, 0x04, 0x09, 0x00, 0x82, 0x6C, 0x73, 0x65, 0x00, 0x0C, 0x0F, + 0x00, 0x81, 0x74, 0x6C, 0x65, 0x00, 0x08, 0x0F, 0x00, 0x81, 0x65, 0x6C, + 0x00, 0x0C, 0x08, 0x0A, 0x1C, 0x0B, 0x00, 0x83, 0x69, 0x65, 0x6E, 0x65, + 0x00, 0x46, 0x4D, 0x06, 0x0C, 0x57, 0x06, 0x12, 0x63, 0x06, 0x15, 0x8A, + 0x06, 0x18, 0x91, 0x06, 0x00, 0x12, 0x16, 0x2C, 0x00, 0x83, 0x63, 0x6F, + 0x72, 0x65, 0x00, 0x18, 0x14, 0x04, 0x00, 0x84, 0x63, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x00, 0x47, 0x6D, 0x06, 0x08, 0x76, 0x06, 0x09, 0x7E, 0x06, + 0x00, 0x08, 0x05, 0x00, 0x83, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x05, 0x00, + 0x82, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x00, 0x83, + 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x08, 0x0B, 0x1A, 0x00, 0x81, 0x65, + 0x00, 0x17, 0x00, 0x6C, 0x9A, 0x06, 0x04, 0x9F, 0x06, 0x00, 0x82, 0x72, + 0x75, 0x65, 0x00, 0x10, 0x04, 0x00, 0x82, 0x65, 0x75, 0x72, 0x00, 0x44, + 0xBD, 0x06, 0x08, 0xE1, 0x06, 0x0C, 0xE9, 0x06, 0x0F, 0xF8, 0x06, 0x11, + 0x01, 0x07, 0x12, 0x1F, 0x07, 0x18, 0x2C, 0x07, 0x00, 0x46, 0xC7, 0x06, + 0x08, 0xCF, 0x06, 0x0F, 0xD9, 0x06, 0x00, 0x08, 0x05, 0x00, 0x81, 0x75, + 0x73, 0x65, 0x00, 0x05, 0x2C, 0x00, 0x82, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x00, 0x09, 0x00, 0x83, 0x61, 0x6C, 0x73, 0x65, 0x00, 0x08, 0x0B, 0x17, + 0x00, 0x82, 0x73, 0x65, 0x00, 0x06, 0x15, 0x08, 0x06, 0x1B, 0x08, 0x00, + 0x86, 0x65, 0x72, 0x63, 0x69, 0x73, 0x65, 0x00, 0x0C, 0x04, 0x09, 0x00, + 0x83, 0x6C, 0x73, 0x65, 0x00, 0x48, 0x08, 0x07, 0x12, 0x13, 0x07, 0x00, + 0x16, 0x0C, 0x0F, 0x00, 0x84, 0x63, 0x65, 0x6E, 0x73, 0x65, 0x00, 0x13, + 0x08, 0x15, 0x00, 0x84, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x00, 0x13, + 0x11, 0x04, 0x15, 0x17, 0x00, 0x83, 0x73, 0x70, 0x6F, 0x73, 0x65, 0x00, + 0x06, 0x04, 0x08, 0x05, 0x00, 0x84, 0x63, 0x61, 0x75, 0x73, 0x65, 0x00, + 0x44, 0x45, 0x07, 0x08, 0xF3, 0x07, 0x0F, 0xFE, 0x07, 0x19, 0x0A, 0x08, + 0x00, 0x47, 0x55, 0x07, 0x0A, 0x7A, 0x07, 0x0F, 0x87, 0x07, 0x13, 0xCA, + 0x07, 0x15, 0xD4, 0x07, 0x00, 0x12, 0x10, 0x00, 0x50, 0x5F, 0x07, 0x12, + 0x6E, 0x07, 0x00, 0x12, 0x06, 0x04, 0x00, 0x87, 0x63, 0x6F, 0x6D, 0x6D, + 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x06, 0x06, 0x04, 0x00, 0x84, 0x6D, + 0x6F, 0x64, 0x61, 0x74, 0x65, 0x00, 0x12, 0x13, 0x12, 0x15, 0x13, 0x00, + 0x84, 0x61, 0x67, 0x61, 0x74, 0x65, 0x00, 0x46, 0x91, 0x07, 0x13, 0x9E, + 0x07, 0x18, 0xAB, 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00, 0x85, 0x63, + 0x75, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x10, 0x04, 0x08, 0x17, 0x00, 0x86, + 0x6D, 0x70, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x46, 0xB2, 0x07, 0x0F, 0xBF, + 0x07, 0x00, 0x18, 0x0F, 0x04, 0x06, 0x00, 0x86, 0x63, 0x75, 0x6C, 0x61, + 0x74, 0x65, 0x00, 0x04, 0x06, 0x00, 0x84, 0x63, 0x75, 0x6C, 0x61, 0x74, + 0x65, 0x00, 0x07, 0x18, 0x00, 0x84, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, + 0x48, 0xDB, 0x07, 0x18, 0xE8, 0x07, 0x00, 0x11, 0x04, 0x0A, 0x00, 0x86, + 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x06, 0x04, 0x00, 0x84, + 0x63, 0x75, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0F, 0x0F, 0x04, 0x13, 0x00, + 0x83, 0x65, 0x74, 0x74, 0x65, 0x00, 0x04, 0x13, 0x10, 0x08, 0x17, 0x00, + 0x83, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x0C, 0x15, 0x13, 0x00, 0x81, 0x61, + 0x74, 0x65, 0x00, 0x4A, 0x1D, 0x08, 0x0C, 0x29, 0x08, 0x16, 0x33, 0x08, + 0x00, 0x08, 0x0F, 0x0F, 0x12, 0x06, 0x00, 0x82, 0x61, 0x67, 0x75, 0x65, + 0x00, 0x14, 0x11, 0x18, 0x00, 0x83, 0x69, 0x71, 0x75, 0x65, 0x00, 0x44, + 0x3A, 0x08, 0x15, 0x42, 0x08, 0x00, 0x06, 0x2C, 0x00, 0x82, 0x75, 0x73, + 0x65, 0x00, 0x08, 0x13, 0x00, 0x84, 0x75, 0x72, 0x73, 0x75, 0x65, 0x00, + 0x4C, 0x53, 0x08, 0x12, 0x78, 0x08, 0x00, 0x48, 0x5D, 0x08, 0x0B, 0x67, + 0x08, 0x0F, 0x70, 0x08, 0x00, 0x0F, 0x08, 0x05, 0x00, 0x83, 0x69, 0x65, + 0x76, 0x65, 0x00, 0x06, 0x04, 0x2C, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, + 0x08, 0x05, 0x00, 0x81, 0x65, 0x76, 0x65, 0x00, 0x52, 0x7F, 0x08, 0x19, + 0x86, 0x08, 0x00, 0x15, 0x13, 0x00, 0x82, 0x76, 0x65, 0x00, 0x05, 0x04, + 0x00, 0x83, 0x6F, 0x76, 0x65, 0x00, 0x4C, 0x95, 0x08, 0x11, 0xB7, 0x08, + 0x00, 0x08, 0x00, 0x4B, 0xA1, 0x08, 0x0F, 0xA8, 0x08, 0x15, 0xB0, 0x08, + 0x00, 0x06, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x08, 0x05, 0x00, 0x82, + 0x69, 0x65, 0x66, 0x00, 0x05, 0x00, 0x82, 0x69, 0x65, 0x66, 0x00, 0x18, + 0x12, 0x09, 0x2C, 0x00, 0x80, 0x64, 0x00, 0x4C, 0xC6, 0x08, 0x11, 0xD0, + 0x08, 0x00, 0x11, 0x12, 0x0A, 0x2C, 0x00, 0x82, 0x69, 0x6E, 0x67, 0x00, + 0x48, 0xDA, 0x08, 0x0C, 0xE3, 0x08, 0x15, 0x39, 0x09, 0x00, 0x0C, 0x05, + 0x00, 0x83, 0x65, 0x69, 0x6E, 0x67, 0x00, 0x48, 0xF6, 0x08, 0x0B, 0x00, + 0x09, 0x0F, 0x0D, 0x09, 0x15, 0x19, 0x09, 0x17, 0x24, 0x09, 0x1C, 0x2E, + 0x09, 0x00, 0x0B, 0x06, 0x04, 0x06, 0x00, 0x83, 0x69, 0x6E, 0x67, 0x00, + 0x17, 0x06, 0x04, 0x10, 0x00, 0x85, 0x74, 0x63, 0x68, 0x69, 0x6E, 0x67, + 0x00, 0x08, 0x0C, 0x06, 0x00, 0x85, 0x65, 0x69, 0x6C, 0x69, 0x6E, 0x67, + 0x00, 0x18, 0x06, 0x08, 0x15, 0x00, 0x82, 0x72, 0x69, 0x6E, 0x67, 0x00, + 0x0B, 0x2C, 0x00, 0x84, 0x74, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x17, 0x1C, + 0x11, 0x04, 0x00, 0x83, 0x68, 0x69, 0x6E, 0x67, 0x00, 0x0C, 0x17, 0x16, + 0x00, 0x83, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x46, 0x53, 0x09, 0x08, 0x73, + 0x09, 0x0A, 0x7F, 0x09, 0x16, 0x89, 0x09, 0x17, 0x9B, 0x09, 0x00, 0x4C, + 0x5A, 0x09, 0x15, 0x64, 0x09, 0x00, 0x17, 0x1A, 0x16, 0x00, 0x83, 0x69, + 0x74, 0x63, 0x68, 0x00, 0x04, 0x08, 0x16, 0x04, 0x08, 0x15, 0x00, 0x86, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x00, 0x17, 0x07, 0x11, 0x04, 0x2C, + 0x00, 0x82, 0x20, 0x74, 0x68, 0x65, 0x00, 0x11, 0x08, 0x15, 0x17, 0x16, + 0x00, 0x80, 0x74, 0x68, 0x00, 0x0C, 0x0F, 0x13, 0x10, 0x12, 0x06, 0x04, + 0x00, 0x86, 0x63, 0x6F, 0x6D, 0x70, 0x6C, 0x69, 0x73, 0x68, 0x00, 0x4A, + 0xA5, 0x09, 0x0C, 0xBD, 0x09, 0x15, 0xC8, 0x09, 0x00, 0x48, 0xAC, 0x09, + 0x0C, 0xB6, 0x09, 0x00, 0x15, 0x17, 0x16, 0x00, 0x82, 0x6E, 0x67, 0x74, + 0x68, 0x00, 0x08, 0x0B, 0x00, 0x81, 0x68, 0x74, 0x00, 0x1A, 0x07, 0x11, + 0x04, 0x05, 0x00, 0x81, 0x64, 0x74, 0x68, 0x00, 0x18, 0x17, 0x2C, 0x00, + 0x83, 0x72, 0x75, 0x74, 0x68, 0x00, 0x15, 0x08, 0x0B, 0x17, 0x2C, 0x00, + 0x81, 0x69, 0x72, 0x00, 0x11, 0x0C, 0x17, 0x0B, 0x00, 0x84, 0x74, 0x68, + 0x69, 0x6E, 0x6B, 0x00, 0x44, 0xFE, 0x09, 0x07, 0x52, 0x0A, 0x08, 0x76, + 0x0A, 0x09, 0xCB, 0x0A, 0x0F, 0xD4, 0x0A, 0x17, 0xF1, 0x0A, 0x18, 0xFA, + 0x0A, 0x00, 0x4C, 0x08, 0x0A, 0x17, 0x13, 0x0A, 0x18, 0x2C, 0x0A, 0x00, + 0x06, 0x13, 0x1C, 0x17, 0x00, 0x83, 0x69, 0x63, 0x61, 0x6C, 0x00, 0x4C, + 0x1A, 0x0A, 0x18, 0x22, 0x0A, 0x00, 0x11, 0x0C, 0x00, 0x81, 0x69, 0x61, + 0x6C, 0x00, 0x15, 0x0C, 0x19, 0x00, 0x83, 0x74, 0x75, 0x61, 0x6C, 0x00, + 0x51, 0x36, 0x0A, 0x15, 0x3F, 0x0A, 0x17, 0x48, 0x0A, 0x00, 0x04, 0x2C, + 0x00, 0x82, 0x6E, 0x75, 0x61, 0x6C, 0x00, 0x18, 0x17, 0x04, 0x11, 0x00, + 0x82, 0x61, 0x6C, 0x00, 0x0C, 0x19, 0x00, 0x83, 0x72, 0x74, 0x75, 0x61, + 0x6C, 0x00, 0x48, 0x59, 0x0A, 0x18, 0x60, 0x0A, 0x00, 0x0C, 0x09, 0x00, + 0x81, 0x6C, 0x64, 0x00, 0x52, 0x67, 0x0A, 0x1A, 0x6D, 0x0A, 0x00, 0x06, + 0x00, 0x81, 0x6C, 0x64, 0x00, 0x12, 0x00, 0x84, 0x77, 0x6F, 0x75, 0x6C, + 0x64, 0x00, 0x4A, 0x83, 0x0A, 0x0F, 0x8B, 0x0A, 0x17, 0xB9, 0x0A, 0x18, + 0xC1, 0x0A, 0x00, 0x11, 0x0C, 0x16, 0x00, 0x81, 0x6C, 0x65, 0x00, 0x44, + 0x92, 0x0A, 0x0F, 0xAC, 0x0A, 0x00, 0x15, 0x00, 0x44, 0x9B, 0x0A, 0x15, + 0xA2, 0x0A, 0x00, 0x13, 0x00, 0x81, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x13, + 0x00, 0x84, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x04, 0x15, 0x15, 0x04, + 0x13, 0x00, 0x85, 0x61, 0x6C, 0x6C, 0x65, 0x6C, 0x00, 0x17, 0x0C, 0x0F, + 0x00, 0x81, 0x6C, 0x65, 0x00, 0x07, 0x08, 0x0B, 0x06, 0x16, 0x00, 0x81, + 0x6C, 0x65, 0x00, 0x08, 0x16, 0x1C, 0x10, 0x00, 0x81, 0x6C, 0x66, 0x00, + 0x0C, 0x09, 0x00, 0x4F, 0xDE, 0x0A, 0x18, 0xE8, 0x0A, 0x00, 0x0F, 0x18, + 0x09, 0x00, 0x84, 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x09, 0x00, 0x83, 0x6C, + 0x66, 0x69, 0x6C, 0x6C, 0x00, 0x18, 0x16, 0x08, 0x15, 0x00, 0x81, 0x6C, + 0x74, 0x00, 0x09, 0x17, 0x04, 0x08, 0x15, 0x0A, 0x00, 0x85, 0x61, 0x74, + 0x65, 0x66, 0x75, 0x6C, 0x00, 0x44, 0x13, 0x0B, 0x0F, 0x24, 0x0B, 0x15, + 0x2F, 0x0B, 0x00, 0x15, 0x0A, 0x12, 0x17, 0x06, 0x08, 0x13, 0x16, 0x00, + 0x84, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x00, 0x08, 0x05, 0x12, 0x15, + 0x13, 0x00, 0x82, 0x6C, 0x65, 0x6D, 0x00, 0x12, 0x09, 0x12, 0x06, 0x00, + 0x83, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x44, 0x5D, 0x0B, 0x07, 0x85, + 0x0B, 0x08, 0x8E, 0x0B, 0x0A, 0x0C, 0x0C, 0x0C, 0x5F, 0x0C, 0x12, 0x79, + 0x0C, 0x13, 0x15, 0x0D, 0x15, 0x21, 0x0D, 0x16, 0x2C, 0x0D, 0x18, 0x36, + 0x0D, 0x1A, 0x4D, 0x0D, 0x00, 0x0C, 0x00, 0x4A, 0x66, 0x0B, 0x17, 0x6E, + 0x0B, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x51, 0x75, + 0x0B, 0x15, 0x7D, 0x0B, 0x00, 0x12, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, + 0x00, 0x08, 0x06, 0x00, 0x82, 0x61, 0x69, 0x6E, 0x00, 0x18, 0x12, 0x09, + 0x2C, 0x00, 0x81, 0x6E, 0x64, 0x00, 0x47, 0xA4, 0x0B, 0x08, 0xAE, 0x0B, + 0x0A, 0xD8, 0x0B, 0x13, 0xE4, 0x0B, 0x15, 0xED, 0x0B, 0x16, 0xFA, 0x0B, + 0x1A, 0x04, 0x0C, 0x00, 0x0F, 0x0C, 0x0B, 0x06, 0x00, 0x81, 0x72, 0x65, + 0x6E, 0x00, 0x57, 0xB5, 0x0B, 0x1A, 0xCE, 0x0B, 0x00, 0x48, 0xBC, 0x0B, + 0x1A, 0xC4, 0x0B, 0x00, 0x05, 0x00, 0x82, 0x77, 0x65, 0x65, 0x6E, 0x00, + 0x08, 0x05, 0x00, 0x84, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x08, 0x05, + 0x00, 0x83, 0x74, 0x77, 0x65, 0x65, 0x6E, 0x00, 0x12, 0x07, 0x1C, 0x0B, + 0x00, 0x83, 0x72, 0x6F, 0x67, 0x65, 0x6E, 0x00, 0x04, 0x0B, 0x2C, 0x00, + 0x81, 0x70, 0x65, 0x6E, 0x00, 0x07, 0x0F, 0x0B, 0x06, 0x00, 0x84, 0x69, + 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x00, 0x12, 0x12, 0x0B, 0x06, 0x00, 0x83, + 0x73, 0x65, 0x6E, 0x00, 0x17, 0x08, 0x05, 0x00, 0x80, 0x65, 0x6E, 0x00, + 0x48, 0x13, 0x0C, 0x0C, 0x1E, 0x0C, 0x00, 0x0C, 0x15, 0x12, 0x09, 0x00, + 0x83, 0x65, 0x69, 0x67, 0x6E, 0x00, 0x4B, 0x31, 0x0C, 0x0F, 0x37, 0x0C, + 0x11, 0x3F, 0x0C, 0x12, 0x48, 0x0C, 0x15, 0x4F, 0x0C, 0x16, 0x56, 0x0C, + 0x00, 0x17, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x0F, 0x04, 0x00, 0x83, 0x69, + 0x67, 0x6E, 0x00, 0x15, 0x04, 0x08, 0x0F, 0x00, 0x81, 0x6E, 0x67, 0x00, + 0x0A, 0x2C, 0x00, 0x81, 0x6E, 0x67, 0x00, 0x17, 0x16, 0x00, 0x81, 0x6E, + 0x67, 0x00, 0x04, 0x2C, 0x00, 0x82, 0x73, 0x69, 0x67, 0x6E, 0x00, 0x4A, + 0x66, 0x0C, 0x17, 0x6E, 0x0C, 0x00, 0x04, 0x2C, 0x00, 0x81, 0x61, 0x69, + 0x6E, 0x00, 0x04, 0x15, 0x08, 0x06, 0x00, 0x83, 0x74, 0x61, 0x69, 0x6E, + 0x00, 0x4C, 0x83, 0x0C, 0x16, 0xFF, 0x0C, 0x17, 0x09, 0x0D, 0x00, 0x46, + 0x8D, 0x0C, 0x16, 0x9A, 0x0C, 0x17, 0xB4, 0x0C, 0x00, 0x0C, 0x16, 0x08, + 0x07, 0x00, 0x85, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x44, 0xA1, + 0x0C, 0x16, 0xAA, 0x0C, 0x00, 0x0C, 0x0F, 0x00, 0x83, 0x69, 0x73, 0x6F, + 0x6E, 0x00, 0x04, 0x06, 0x06, 0x12, 0x00, 0x83, 0x69, 0x6F, 0x6E, 0x00, + 0x47, 0xC4, 0x0C, 0x0C, 0xCE, 0x0C, 0x0F, 0xDD, 0x0C, 0x11, 0xE9, 0x0C, + 0x16, 0xF5, 0x0C, 0x00, 0x07, 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x6F, + 0x6E, 0x00, 0x17, 0x0C, 0x13, 0x08, 0x15, 0x00, 0x86, 0x65, 0x74, 0x69, + 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x04, 0x08, 0x15, 0x00, 0x85, 0x6C, 0x61, + 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x06, 0x18, 0x09, 0x00, 0x85, 0x6E, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x12, 0x13, 0x00, 0x83, 0x69, 0x74, 0x69, + 0x6F, 0x6E, 0x00, 0x0C, 0x19, 0x0C, 0x07, 0x00, 0x81, 0x69, 0x6F, 0x6E, + 0x00, 0x0C, 0x06, 0x04, 0x15, 0x09, 0x00, 0x83, 0x74, 0x69, 0x6F, 0x6E, + 0x00, 0x13, 0x0B, 0x04, 0x00, 0x84, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6E, + 0x00, 0x17, 0x18, 0x08, 0x15, 0x00, 0x83, 0x74, 0x75, 0x72, 0x6E, 0x00, + 0x0A, 0x0C, 0x0B, 0x17, 0x00, 0x82, 0x6E, 0x67, 0x73, 0x00, 0x55, 0x3D, + 0x0D, 0x17, 0x46, 0x0D, 0x00, 0x17, 0x08, 0x15, 0x00, 0x82, 0x75, 0x72, + 0x6E, 0x00, 0x08, 0x15, 0x00, 0x80, 0x72, 0x6E, 0x00, 0x12, 0x0E, 0x11, + 0x18, 0x00, 0x82, 0x6E, 0x6F, 0x77, 0x6E, 0x00, 0x47, 0x62, 0x0D, 0x11, + 0x6D, 0x0D, 0x1A, 0x76, 0x0D, 0x00, 0x08, 0x18, 0x16, 0x13, 0x00, 0x83, + 0x65, 0x75, 0x64, 0x6F, 0x00, 0x1A, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, + 0x77, 0x00, 0x4F, 0x7D, 0x0D, 0x11, 0x85, 0x0D, 0x00, 0x0F, 0x12, 0x09, + 0x00, 0x81, 0x6F, 0x77, 0x00, 0x0E, 0x2C, 0x00, 0x81, 0x6F, 0x77, 0x00, + 0x56, 0x93, 0x0D, 0x18, 0x9D, 0x0D, 0x00, 0x04, 0x0B, 0x15, 0x08, 0x13, + 0x00, 0x81, 0x70, 0x73, 0x00, 0x12, 0x12, 0x0F, 0x00, 0x81, 0x6B, 0x75, + 0x70, 0x00, 0x44, 0xC5, 0x0D, 0x08, 0x06, 0x0E, 0x0B, 0x13, 0x0F, 0x0F, + 0x1C, 0x0F, 0x12, 0x2A, 0x0F, 0x13, 0x3B, 0x0F, 0x16, 0x46, 0x0F, 0x17, + 0x4F, 0x0F, 0x18, 0x5B, 0x0F, 0x1C, 0x64, 0x0F, 0x00, 0x4C, 0xCF, 0x0D, + 0x0F, 0xD9, 0x0D, 0x18, 0xFB, 0x0D, 0x00, 0x0F, 0x0C, 0x10, 0x0C, 0x16, + 0x00, 0x82, 0x61, 0x72, 0x00, 0x4C, 0xE0, 0x0D, 0x18, 0xEB, 0x0D, 0x00, + 0x10, 0x10, 0x0C, 0x16, 0x00, 0x84, 0x69, 0x6C, 0x61, 0x72, 0x00, 0x06, + 0x0C, 0x17, 0x04, 0x13, 0x00, 0x86, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6C, + 0x61, 0x72, 0x00, 0x0F, 0x0A, 0x08, 0x15, 0x00, 0x83, 0x75, 0x6C, 0x61, + 0x72, 0x00, 0x44, 0x25, 0x0E, 0x07, 0x2D, 0x0E, 0x0B, 0x3A, 0x0E, 0x0C, + 0x77, 0x0E, 0x0F, 0x91, 0x0E, 0x10, 0x9B, 0x0E, 0x11, 0xA5, 0x0E, 0x12, + 0xD1, 0x0E, 0x17, 0xD9, 0x0E, 0x19, 0xF8, 0x0E, 0x00, 0x0F, 0x06, 0x00, + 0x82, 0x65, 0x61, 0x72, 0x00, 0x11, 0x04, 0x0F, 0x04, 0x06, 0x00, 0x84, + 0x65, 0x6E, 0x64, 0x61, 0x72, 0x00, 0x4A, 0x41, 0x0E, 0x17, 0x4C, 0x0E, + 0x00, 0x0C, 0x08, 0x0B, 0x00, 0x85, 0x69, 0x67, 0x68, 0x65, 0x72, 0x00, + 0x48, 0x56, 0x0E, 0x12, 0x62, 0x0E, 0x18, 0x6E, 0x0E, 0x00, 0x0B, 0x0A, + 0x12, 0x17, 0x00, 0x85, 0x65, 0x74, 0x68, 0x65, 0x72, 0x00, 0x04, 0x11, + 0x00, 0x86, 0x61, 0x6E, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x09, 0x00, + 0x83, 0x72, 0x74, 0x68, 0x65, 0x72, 0x00, 0x4B, 0x7E, 0x0E, 0x0F, 0x86, + 0x0E, 0x00, 0x17, 0x2C, 0x00, 0x82, 0x65, 0x69, 0x72, 0x00, 0x13, 0x10, + 0x12, 0x06, 0x00, 0x83, 0x69, 0x6C, 0x65, 0x72, 0x00, 0x17, 0x0C, 0x09, + 0x00, 0x83, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x10, 0x04, 0x15, 0x0A, 0x2C, + 0x00, 0x81, 0x61, 0x72, 0x00, 0x4C, 0xAC, 0x0E, 0x17, 0xB8, 0x0E, 0x00, + 0x0A, 0x0A, 0x08, 0x05, 0x00, 0x84, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x00, + 0x4C, 0xBF, 0x0E, 0x16, 0xC8, 0x0E, 0x00, 0x12, 0x13, 0x00, 0x83, 0x6E, + 0x74, 0x65, 0x72, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x65, 0x6E, 0x65, 0x72, + 0x00, 0x09, 0x08, 0x05, 0x00, 0x81, 0x72, 0x65, 0x00, 0x4B, 0xE0, 0x0E, + 0x18, 0xEA, 0x0E, 0x00, 0x12, 0x11, 0x04, 0x00, 0x83, 0x74, 0x68, 0x65, + 0x72, 0x00, 0x13, 0x12, 0x10, 0x06, 0x00, 0x86, 0x6F, 0x6D, 0x70, 0x75, + 0x74, 0x65, 0x72, 0x00, 0x48, 0xFF, 0x0E, 0x1A, 0x0A, 0x0F, 0x00, 0x08, + 0x15, 0x08, 0x0B, 0x1A, 0x00, 0x83, 0x76, 0x65, 0x72, 0x00, 0x12, 0x0B, + 0x00, 0x82, 0x65, 0x76, 0x65, 0x72, 0x00, 0x08, 0x17, 0x12, 0x00, 0x82, + 0x68, 0x65, 0x72, 0x00, 0x04, 0x18, 0x06, 0x0C, 0x17, 0x15, 0x04, 0x13, + 0x00, 0x82, 0x6C, 0x61, 0x72, 0x00, 0x17, 0x04, 0x15, 0x08, 0x17, 0x11, + 0x0C, 0x00, 0x87, 0x74, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x00, 0x17, + 0x0F, 0x0F, 0x18, 0x11, 0x00, 0x82, 0x70, 0x74, 0x72, 0x00, 0x04, 0x08, + 0x1C, 0x2C, 0x00, 0x81, 0x72, 0x73, 0x00, 0x12, 0x04, 0x15, 0x08, 0x13, + 0x12, 0x00, 0x82, 0x74, 0x6F, 0x72, 0x00, 0x06, 0x12, 0x2C, 0x00, 0x81, + 0x63, 0x75, 0x72, 0x00, 0x08, 0x19, 0x08, 0x2C, 0x00, 0x81, 0x72, 0x79, + 0x00, 0x44, 0x83, 0x0F, 0x08, 0xB7, 0x0F, 0x0A, 0x47, 0x10, 0x15, 0x52, + 0x10, 0x16, 0x5D, 0x10, 0x17, 0xF5, 0x10, 0x18, 0xFD, 0x10, 0x00, 0x4B, + 0x90, 0x0F, 0x13, 0x9B, 0x0F, 0x15, 0xA5, 0x0F, 0x1C, 0xAE, 0x0F, 0x00, + 0x13, 0x15, 0x08, 0x13, 0x00, 0x83, 0x68, 0x61, 0x70, 0x73, 0x00, 0x0B, + 0x15, 0x08, 0x13, 0x00, 0x82, 0x61, 0x70, 0x73, 0x00, 0x08, 0x1C, 0x2C, + 0x00, 0x82, 0x61, 0x72, 0x73, 0x00, 0x1A, 0x0F, 0x04, 0x00, 0x82, 0x61, + 0x79, 0x73, 0x00, 0x44, 0xC7, 0x0F, 0x06, 0xDE, 0x0F, 0x0C, 0xE9, 0x0F, + 0x0F, 0x35, 0x10, 0x16, 0x3C, 0x10, 0x00, 0x47, 0xCE, 0x0F, 0x0E, 0xD6, + 0x0F, 0x00, 0x0C, 0x2C, 0x00, 0x82, 0x65, 0x61, 0x73, 0x00, 0x17, 0x00, + 0x83, 0x61, 0x6B, 0x65, 0x73, 0x00, 0x08, 0x07, 0x11, 0x0C, 0x00, 0x83, + 0x69, 0x63, 0x65, 0x73, 0x00, 0x46, 0xF3, 0x0F, 0x15, 0x1A, 0x10, 0x17, + 0x29, 0x10, 0x00, 0x48, 0xFA, 0x0F, 0x0C, 0x04, 0x10, 0x00, 0x07, 0x11, + 0x0C, 0x00, 0x84, 0x69, 0x63, 0x65, 0x73, 0x00, 0x47, 0x0B, 0x10, 0x17, + 0x12, 0x10, 0x00, 0x11, 0x0C, 0x00, 0x82, 0x65, 0x73, 0x00, 0x15, 0x08, + 0x19, 0x00, 0x82, 0x65, 0x73, 0x00, 0x12, 0x16, 0x08, 0x06, 0x06, 0x04, + 0x00, 0x84, 0x73, 0x6F, 0x72, 0x69, 0x65, 0x73, 0x00, 0x0F, 0x0C, 0x05, + 0x04, 0x00, 0x83, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x04, 0x09, 0x00, + 0x81, 0x73, 0x65, 0x00, 0x12, 0x0B, 0x06, 0x2C, 0x00, 0x82, 0x6F, 0x73, + 0x65, 0x73, 0x00, 0x0C, 0x11, 0x0B, 0x17, 0x00, 0x83, 0x69, 0x6E, 0x67, + 0x73, 0x00, 0x08, 0x04, 0x1C, 0x2C, 0x00, 0x83, 0x65, 0x61, 0x72, 0x73, + 0x00, 0x44, 0x67, 0x10, 0x08, 0x73, 0x10, 0x12, 0xEA, 0x10, 0x00, 0x15, + 0x04, 0x05, 0x10, 0x08, 0x00, 0x82, 0x72, 0x61, 0x73, 0x73, 0x00, 0x46, + 0x80, 0x10, 0x11, 0x98, 0x10, 0x15, 0xB5, 0x10, 0x16, 0xD2, 0x10, 0x00, + 0x46, 0x87, 0x10, 0x18, 0x90, 0x10, 0x00, 0x12, 0x15, 0x13, 0x00, 0x83, + 0x65, 0x73, 0x73, 0x00, 0x16, 0x00, 0x82, 0x63, 0x65, 0x73, 0x73, 0x00, + 0x4C, 0x9F, 0x10, 0x16, 0xAB, 0x10, 0x00, 0x16, 0x16, 0x18, 0x05, 0x00, + 0x85, 0x69, 0x6E, 0x65, 0x73, 0x73, 0x00, 0x18, 0x05, 0x00, 0x83, 0x69, + 0x6E, 0x65, 0x73, 0x73, 0x00, 0x13, 0x00, 0x55, 0xBE, 0x10, 0x18, 0xC9, + 0x10, 0x00, 0x18, 0x16, 0x00, 0x85, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x00, 0x16, 0x00, 0x83, 0x70, 0x72, 0x65, 0x73, 0x73, 0x00, 0x46, 0xD9, + 0x10, 0x12, 0xE2, 0x10, 0x00, 0x06, 0x18, 0x16, 0x00, 0x83, 0x65, 0x73, + 0x73, 0x00, 0x13, 0x00, 0x82, 0x73, 0x65, 0x73, 0x73, 0x00, 0x15, 0x06, + 0x06, 0x04, 0x00, 0x84, 0x72, 0x6F, 0x73, 0x73, 0x00, 0x15, 0x0C, 0x09, + 0x00, 0x81, 0x73, 0x74, 0x00, 0x52, 0x04, 0x11, 0x16, 0x12, 0x11, 0x00, + 0x0F, 0x12, 0x10, 0x12, 0x11, 0x04, 0x00, 0x84, 0x61, 0x6C, 0x6F, 0x75, + 0x73, 0x00, 0x11, 0x08, 0x06, 0x11, 0x12, 0x06, 0x00, 0x85, 0x73, 0x65, + 0x6E, 0x73, 0x75, 0x73, 0x00, 0x44, 0x46, 0x11, 0x08, 0x64, 0x11, 0x0A, + 0x81, 0x11, 0x0B, 0x8B, 0x11, 0x0C, 0xAF, 0x11, 0x0F, 0xBA, 0x11, 0x10, + 0xC5, 0x11, 0x11, 0xD1, 0x11, 0x12, 0x1F, 0x13, 0x13, 0x59, 0x13, 0x16, + 0x75, 0x13, 0x18, 0x15, 0x14, 0x00, 0x55, 0x4D, 0x11, 0x1A, 0x58, 0x11, + 0x00, 0x08, 0x13, 0x08, 0x16, 0x00, 0x83, 0x61, 0x72, 0x61, 0x74, 0x00, + 0x0B, 0x08, 0x10, 0x12, 0x16, 0x00, 0x83, 0x77, 0x68, 0x61, 0x74, 0x00, + 0x44, 0x6B, 0x11, 0x11, 0x74, 0x11, 0x00, 0x15, 0x0A, 0x2C, 0x00, 0x82, + 0x65, 0x61, 0x74, 0x00, 0x10, 0x11, 0x15, 0x08, 0x19, 0x12, 0x0A, 0x00, + 0x82, 0x65, 0x6E, 0x74, 0x00, 0x0B, 0x18, 0x04, 0x06, 0x00, 0x82, 0x67, + 0x68, 0x74, 0x00, 0x47, 0x95, 0x11, 0x0A, 0x9C, 0x11, 0x0C, 0xA4, 0x11, + 0x00, 0x0C, 0x1A, 0x00, 0x81, 0x74, 0x68, 0x00, 0x11, 0x08, 0x0F, 0x00, + 0x81, 0x74, 0x68, 0x00, 0x0A, 0x11, 0x12, 0x17, 0x00, 0x83, 0x69, 0x67, + 0x68, 0x74, 0x00, 0x17, 0x18, 0x12, 0x05, 0x04, 0x00, 0x81, 0x20, 0x69, + 0x74, 0x00, 0x16, 0x18, 0x08, 0x15, 0x00, 0x83, 0x73, 0x75, 0x6C, 0x74, + 0x00, 0x04, 0x17, 0x15, 0x12, 0x13, 0x10, 0x0C, 0x00, 0x81, 0x6E, 0x74, + 0x00, 0x44, 0xDE, 0x11, 0x08, 0x16, 0x12, 0x15, 0x0C, 0x13, 0x16, 0x17, + 0x13, 0x00, 0x4C, 0xEB, 0x11, 0x11, 0xF6, 0x11, 0x15, 0x01, 0x12, 0x17, + 0x0B, 0x12, 0x00, 0x13, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x82, 0x65, 0x6E, + 0x74, 0x00, 0x0C, 0x10, 0x12, 0x15, 0x13, 0x00, 0x82, 0x65, 0x6E, 0x74, + 0x00, 0x04, 0x13, 0x13, 0x04, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x08, + 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x65, 0x6E, 0x74, 0x00, 0x4C, 0x23, + 0x12, 0x10, 0x44, 0x12, 0x15, 0xA8, 0x12, 0x19, 0x02, 0x13, 0x00, 0x46, + 0x2A, 0x12, 0x13, 0x37, 0x12, 0x00, 0x08, 0x09, 0x09, 0x08, 0x00, 0x85, + 0x69, 0x63, 0x69, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x06, 0x08, 0x15, 0x00, + 0x85, 0x69, 0x70, 0x69, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x51, 0x12, 0x11, + 0x5D, 0x12, 0x15, 0x7E, 0x12, 0x17, 0x9D, 0x12, 0x00, 0x19, 0x12, 0x0A, + 0x00, 0x83, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x64, 0x12, + 0x15, 0x70, 0x12, 0x00, 0x19, 0x12, 0x0A, 0x00, 0x84, 0x72, 0x6E, 0x6D, + 0x65, 0x6E, 0x74, 0x00, 0x12, 0x19, 0x12, 0x0A, 0x00, 0x86, 0x65, 0x72, + 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x48, 0x85, 0x12, 0x12, 0x90, 0x12, + 0x00, 0x19, 0x12, 0x0A, 0x00, 0x83, 0x6E, 0x6D, 0x65, 0x6E, 0x74, 0x00, + 0x19, 0x12, 0x0A, 0x00, 0x85, 0x65, 0x72, 0x6E, 0x6D, 0x65, 0x6E, 0x74, + 0x00, 0x04, 0x17, 0x16, 0x00, 0x83, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x00, + 0x44, 0xB5, 0x12, 0x08, 0xC0, 0x12, 0x09, 0xCC, 0x12, 0x15, 0xD7, 0x12, + 0x00, 0x13, 0x04, 0x00, 0x84, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, + 0x09, 0x0C, 0x07, 0x00, 0x84, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, + 0x09, 0x0C, 0x07, 0x00, 0x83, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x44, + 0xDE, 0x12, 0x08, 0xF6, 0x12, 0x00, 0x13, 0x00, 0x44, 0xE7, 0x12, 0x13, + 0xEF, 0x12, 0x00, 0x85, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x04, + 0x00, 0x83, 0x65, 0x6E, 0x74, 0x00, 0x09, 0x0C, 0x07, 0x00, 0x85, 0x66, + 0x65, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x08, 0x0F, 0x08, 0x15, 0x00, 0x82, + 0x61, 0x6E, 0x74, 0x00, 0x08, 0x09, 0x09, 0x0C, 0x07, 0x00, 0x81, 0x65, + 0x6E, 0x74, 0x00, 0x12, 0x06, 0x00, 0x82, 0x6E, 0x73, 0x74, 0x00, 0x45, + 0x2F, 0x13, 0x10, 0x36, 0x13, 0x11, 0x3D, 0x13, 0x15, 0x47, 0x13, 0x16, + 0x50, 0x13, 0x00, 0x04, 0x2C, 0x00, 0x80, 0x75, 0x74, 0x00, 0x0F, 0x04, + 0x00, 0x80, 0x73, 0x74, 0x00, 0x07, 0x0C, 0x07, 0x00, 0x82, 0x20, 0x6E, + 0x6F, 0x74, 0x00, 0x13, 0x08, 0x15, 0x00, 0x82, 0x6F, 0x72, 0x74, 0x00, + 0x10, 0x0F, 0x04, 0x00, 0x82, 0x6F, 0x73, 0x74, 0x00, 0x48, 0x60, 0x13, + 0x1C, 0x6B, 0x13, 0x00, 0x0C, 0x06, 0x08, 0x15, 0x00, 0x83, 0x65, 0x69, + 0x70, 0x74, 0x00, 0x06, 0x11, 0x08, 0x00, 0x82, 0x72, 0x79, 0x70, 0x74, + 0x00, 0x48, 0x8B, 0x13, 0x0A, 0xB4, 0x13, 0x0C, 0xBD, 0x13, 0x10, 0xDA, + 0x13, 0x11, 0xE4, 0x13, 0x12, 0xFF, 0x13, 0x18, 0x0A, 0x14, 0x00, 0x4A, + 0x92, 0x13, 0x15, 0xA9, 0x13, 0x00, 0x4C, 0x99, 0x13, 0x18, 0xA1, 0x13, + 0x00, 0x0B, 0x00, 0x82, 0x68, 0x65, 0x73, 0x74, 0x00, 0x16, 0x00, 0x82, + 0x67, 0x65, 0x73, 0x74, 0x00, 0x17, 0x11, 0x0C, 0x00, 0x83, 0x65, 0x72, + 0x65, 0x73, 0x74, 0x00, 0x15, 0x04, 0x0F, 0x00, 0x81, 0x65, 0x73, 0x74, + 0x00, 0x49, 0xC4, 0x13, 0x11, 0xD0, 0x13, 0x00, 0x08, 0x11, 0x04, 0x10, + 0x00, 0x84, 0x69, 0x66, 0x65, 0x73, 0x74, 0x00, 0x04, 0x0A, 0x04, 0x00, + 0x83, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x12, 0x0F, 0x04, 0x00, 0x83, 0x6D, + 0x6F, 0x73, 0x74, 0x00, 0x44, 0xEB, 0x13, 0x11, 0xF6, 0x13, 0x00, 0x0C, + 0x0A, 0x04, 0x00, 0x84, 0x61, 0x69, 0x6E, 0x73, 0x74, 0x00, 0x0C, 0x04, + 0x0A, 0x04, 0x00, 0x82, 0x73, 0x74, 0x00, 0x0F, 0x10, 0x04, 0x00, 0x84, + 0x6C, 0x6D, 0x6F, 0x73, 0x74, 0x00, 0x0D, 0x04, 0x2C, 0x00, 0x83, 0x64, + 0x6A, 0x75, 0x73, 0x74, 0x00, 0x46, 0x1F, 0x14, 0x13, 0x38, 0x14, 0x17, + 0x4F, 0x14, 0x00, 0x48, 0x26, 0x14, 0x15, 0x31, 0x14, 0x00, 0x06, 0x1B, + 0x08, 0x00, 0x84, 0x65, 0x63, 0x75, 0x74, 0x65, 0x00, 0x0C, 0x06, 0x00, + 0x80, 0x69, 0x74, 0x00, 0x57, 0x3F, 0x14, 0x18, 0x47, 0x14, 0x00, 0x11, + 0x0C, 0x00, 0x83, 0x70, 0x75, 0x74, 0x00, 0x12, 0x00, 0x82, 0x74, 0x70, + 0x75, 0x74, 0x00, 0x13, 0x18, 0x12, 0x00, 0x83, 0x74, 0x70, 0x75, 0x74, + 0x00, 0x48, 0x60, 0x14, 0x0C, 0x84, 0x14, 0x00, 0x44, 0x67, 0x14, 0x0C, + 0x6E, 0x14, 0x00, 0x0B, 0x2C, 0x00, 0x81, 0x76, 0x65, 0x00, 0x46, 0x75, + 0x14, 0x08, 0x7D, 0x14, 0x00, 0x08, 0x15, 0x00, 0x82, 0x65, 0x69, 0x76, + 0x00, 0x06, 0x08, 0x15, 0x00, 0x81, 0x76, 0x00, 0x08, 0x0B, 0x06, 0x04, + 0x2C, 0x00, 0x82, 0x69, 0x65, 0x76, 0x65, 0x00, 0x4C, 0x9A, 0x14, 0x11, + 0xA4, 0x14, 0x12, 0xAD, 0x14, 0x00, 0x08, 0x19, 0x08, 0x15, 0x00, 0x82, + 0x69, 0x65, 0x77, 0x00, 0x12, 0x0E, 0x2C, 0x00, 0x82, 0x6E, 0x6F, 0x77, + 0x00, 0x0F, 0x12, 0x09, 0x00, 0x81, 0x6C, 0x6F, 0x77, 0x00, 0x44, 0xD2, + 0x14, 0x06, 0xDD, 0x14, 0x08, 0x18, 0x15, 0x0B, 0x22, 0x15, 0x0F, 0x34, + 0x15, 0x11, 0xF9, 0x15, 0x15, 0x03, 0x16, 0x16, 0xA8, 0x16, 0x17, 0xC3, + 0x16, 0x00, 0x11, 0x13, 0x10, 0x12, 0x06, 0x00, 0x82, 0x61, 0x6E, 0x79, + 0x00, 0x44, 0xEA, 0x14, 0x08, 0xF6, 0x14, 0x0C, 0x01, 0x15, 0x13, 0x0C, + 0x15, 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, + 0x79, 0x00, 0x18, 0x14, 0x08, 0x15, 0x09, 0x00, 0x81, 0x6E, 0x63, 0x79, + 0x00, 0x15, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x81, 0x73, 0x79, 0x00, + 0x18, 0x15, 0x0E, 0x11, 0x04, 0x05, 0x00, 0x81, 0x74, 0x63, 0x79, 0x00, + 0x17, 0x09, 0x04, 0x16, 0x00, 0x82, 0x65, 0x74, 0x79, 0x00, 0x06, 0x15, + 0x04, 0x15, 0x0C, 0x08, 0x0B, 0x00, 0x87, 0x69, 0x65, 0x72, 0x61, 0x72, + 0x63, 0x68, 0x79, 0x00, 0x44, 0x47, 0x15, 0x0B, 0x8A, 0x15, 0x0E, 0x94, + 0x15, 0x0F, 0x9C, 0x15, 0x12, 0xE4, 0x15, 0x15, 0xEE, 0x15, 0x00, 0x45, + 0x5A, 0x15, 0x08, 0x63, 0x15, 0x0F, 0x69, 0x15, 0x11, 0x72, 0x15, 0x15, + 0x79, 0x15, 0x18, 0x82, 0x15, 0x00, 0x12, 0x15, 0x13, 0x00, 0x81, 0x62, + 0x6C, 0x79, 0x00, 0x15, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x08, 0x15, 0x00, + 0x83, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x0C, 0x09, 0x00, 0x80, 0x6C, 0x79, + 0x00, 0x08, 0x11, 0x08, 0x0A, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x17, 0x06, + 0x04, 0x00, 0x80, 0x6C, 0x79, 0x00, 0x0A, 0x0C, 0x0F, 0x16, 0x00, 0x81, + 0x74, 0x6C, 0x79, 0x00, 0x0C, 0x0F, 0x00, 0x81, 0x65, 0x6C, 0x79, 0x00, + 0x44, 0xA6, 0x15, 0x05, 0xD1, 0x15, 0x08, 0xDA, 0x15, 0x00, 0x56, 0xAD, + 0x15, 0x17, 0xC5, 0x15, 0x00, 0x18, 0x00, 0x6C, 0xB6, 0x15, 0x16, 0xBD, + 0x15, 0x00, 0x83, 0x75, 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x00, 0x84, + 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x18, 0x06, 0x04, 0x00, 0x85, 0x74, 0x75, + 0x61, 0x6C, 0x6C, 0x79, 0x00, 0x04, 0x05, 0x12, 0x15, 0x13, 0x00, 0x81, + 0x79, 0x00, 0x04, 0x15, 0x00, 0x84, 0x65, 0x61, 0x6C, 0x6C, 0x79, 0x00, + 0x10, 0x12, 0x11, 0x04, 0x00, 0x82, 0x61, 0x6C, 0x79, 0x00, 0x04, 0x10, + 0x0C, 0x15, 0x13, 0x00, 0x81, 0x69, 0x6C, 0x79, 0x00, 0x08, 0x12, 0x10, + 0x2C, 0x00, 0x82, 0x6E, 0x65, 0x79, 0x00, 0x44, 0x13, 0x16, 0x08, 0x7B, + 0x16, 0x12, 0x84, 0x16, 0x17, 0x91, 0x16, 0x19, 0xA0, 0x16, 0x00, 0x45, + 0x23, 0x16, 0x0C, 0x2C, 0x16, 0x0F, 0x39, 0x16, 0x10, 0x55, 0x16, 0x16, + 0x5E, 0x16, 0x00, 0x0C, 0x0F, 0x00, 0x82, 0x72, 0x61, 0x72, 0x79, 0x00, + 0x0F, 0x0F, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x84, 0x69, 0x61, 0x72, 0x79, + 0x00, 0x4C, 0x40, 0x16, 0x0F, 0x4A, 0x16, 0x00, 0x1B, 0x18, 0x04, 0x00, + 0x82, 0x69, 0x61, 0x72, 0x79, 0x00, 0x0C, 0x1B, 0x18, 0x04, 0x00, 0x83, + 0x69, 0x61, 0x72, 0x79, 0x00, 0x18, 0x16, 0x00, 0x82, 0x6D, 0x61, 0x72, + 0x79, 0x00, 0x08, 0x06, 0x00, 0x46, 0x68, 0x16, 0x08, 0x73, 0x16, 0x00, + 0x08, 0x11, 0x00, 0x85, 0x65, 0x73, 0x73, 0x61, 0x72, 0x79, 0x00, 0x11, + 0x00, 0x82, 0x73, 0x61, 0x72, 0x79, 0x00, 0x13, 0x12, 0x15, 0x13, 0x00, + 0x80, 0x74, 0x79, 0x00, 0x0A, 0x04, 0x17, 0x04, 0x06, 0x00, 0x84, 0x65, + 0x67, 0x6F, 0x72, 0x79, 0x00, 0x11, 0x18, 0x06, 0x12, 0x2C, 0x00, 0x86, + 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x72, 0x79, 0x00, 0x08, 0x2C, 0x00, 0x81, + 0x65, 0x72, 0x79, 0x00, 0x04, 0x00, 0x55, 0xB1, 0x16, 0x1A, 0xBC, 0x16, + 0x00, 0x06, 0x12, 0x13, 0x1C, 0x0B, 0x00, 0x82, 0x69, 0x73, 0x79, 0x00, + 0x0F, 0x04, 0x00, 0x81, 0x79, 0x73, 0x00, 0x49, 0xCD, 0x16, 0x0F, 0xD5, + 0x16, 0x15, 0xDE, 0x16, 0x00, 0x04, 0x16, 0x00, 0x81, 0x65, 0x74, 0x79, + 0x00, 0x0C, 0x05, 0x04, 0x00, 0x81, 0x69, 0x74, 0x79, 0x00, 0x13, 0x08, + 0x12, 0x15, 0x13, 0x00, 0x84, 0x70, 0x65, 0x72, 0x74, 0x79, 0x00}; diff --git a/jack/autocorrect_dict.txt b/jack/autocorrect_dict.txt new file mode 100644 index 0000000..135bb64 --- /dev/null +++ b/jack/autocorrect_dict.txt @@ -0,0 +1,398 @@ +# Copyright 2024 [email protected] +# SPDX-License-Identifier: GPL-2.0-or-later + +:theri -> their +:thier -> their +:abot -> about +owudl -> would +:woul: -> would +poeple -> people +poeople -> people +:whic: -> which +coudl -> could +htink -> think +otehr -> other +:othe: -> other +becase -> because +:bease -> because +beacuse -> because +theese -> these +:goign -> going +:gonig -> going +:goin: -> going +:yaers -> years +:yeasr -> years +:yeras -> years +shoud -> should +raelly -> really +realy -> really +relaly -> really +bedore -> before +beore -> before +befoer -> before +littel -> little +litle -> little +bieng -> being +:hwile -> while +:aound -> around +aroud -> around +arund -> around +:hting -> thing +thign -> thing +thigsn -> things +thnigs -> things +anohter -> another +naother -> another +betwen -> between +beteen -> between +beween -> between +bewteen -> between +:eveyr -> every +:evry -> every +:graet -> great +:grat: -> great +:agian -> again +:agin -> again +alwasy -> always +alwyas -> always +:acheiv -> achieve +:achive -> achieve +amlost -> almost +almot -> almost +almsot -> almost +alomst -> almost +chnage -> change +chekc -> check +childen -> children +chldren -> children +claer -> clear +compnay -> company +contian -> contain +elasped -> elapsed +eslaped -> elapsed +feild -> field +fiedl -> field +fitler -> filter +firts -> first +follwo -> follow +folow -> follow +:foudn -> found +:founf -> found +frequecy -> frequency +firend -> friend +freind -> friend +heigth -> height +iamge -> image +inital -> initial +intput -> input +laguage -> language +lenght -> length +levle -> level +libary -> library +:moeny -> money +mysefl -> myself +ouptut -> output +ouput -> output +probaly -> probably +probelm -> problem +recrod -> record +reponse -> response +reprot -> report +singel -> single +stregth -> strength +strengh -> strength +tkaes -> takes +therfore -> therefore +todya -> today +toghether -> together +unkown -> unknown +unqiue -> unique +widht -> width +accross -> across +adviced -> advised +aledge -> allege +alledge -> allege +amature -> amateur +anomolous -> anomalous +anomoly -> anomaly +aparent -> apparent +aparrent -> apparent +apparant -> apparent +apparrent -> apparent +asthetic -> aesthetic +auxilary -> auxiliary +auxillary -> auxiliary +auxilliary -> auxiliary +bankrupcy -> bankruptcy +busness -> business +bussiness -> business +calander -> calendar +commitee -> committee +comittee -> committee +competance -> competence +competant -> competent +concensus -> consensus +copywrite: -> copyright +choosen -> chosen +collegue -> colleague +excercise -> exercise +:grammer -> grammar +:guage -> gauge +govement -> government +govenment -> government +goverment -> government +governmnet -> government +govorment -> government +govornment -> government +guaratee -> guarantee +garantee -> guarantee +gaurantee -> guarantee +heirarchy -> hierarchy +hygeine -> hygiene +hypocracy -> hypocrisy +hypocrasy -> hypocrisy +hypocricy -> hypocrisy +hypocrit: -> hypocrite +looses: -> loses +maintence -> maintenance +morgage -> mortgage +neccesary -> necessary +necesary -> necessary +pallete -> palette +paralel -> parallel +parralel -> parallel +parrallel -> parallel +priviledge -> privilege +probablly -> probably +prominant -> prominent +propogate -> propagate +proove -> prove +psuedo -> pseudo +reciept -> receipt +receiev -> receiv +reciev -> receiv +recepient -> recipient +recipiant -> recipient +relevent -> relevant +repitition -> repetition +safty -> safety +saftey -> safety +seperat -> separat +spectogram -> spectrogram +symetric -> symmetric +tolerence -> tolerance +cacheing -> caching +complier -> compiler +doulbe -> double +dyanmic -> dynamic +excecut -> execute +failse -> false +fales -> false +fasle -> false +flase -> false +indeces -> indices +indecies -> indices +indicies -> indices +interator -> iterator +looup -> lookup +namesapce -> namespace +namespcae -> namespace +nulltpr -> nullptr +operaotr -> operator +overide -> override +ovveride -> override +poitner -> pointer +:rference -> reference +referece -> reference +singed -> signed +stirng -> string +strign -> string +swithc -> switch +swtich -> switch +teamplate -> template +tempalte -> template +:ture -> true +retrun -> return +retun -> return +reutrn -> return +cosnt -> const +virutal -> virtual +vitual -> virtual +yeild -> yield +:alot: -> a lot +:andteh -> and the +:andthe -> and the +:asthe -> as the +:atthe -> at the +abouta -> about a +aboutit -> about it +aboutthe -> about the +:tothe -> to the +didnot -> did not +fromthe -> from the +:agred -> agreed +:ajust -> adjust +:anual -> annual +:asign -> assign +:aslo: -> also +:casue -> cause +:choses -> chooses +:gaurd -> guard +:haev -> have +:hapen -> happen +:idaes -> ideas +:jsut: -> just +:jstu: -> just +:knwo -> know +:konw -> know +:kwno -> know +:ocuntry -> country +:ocur -> occur +:socre -> score +:szie -> size +:the:the: -> the +:turth -> truth +:uesd: -> used +:usally -> usually +abilties -> abilities +abilty -> ability +abvove -> above +accesories -> accessories +accomodate -> accommodate +acommodate -> accommodate +acomplish -> accomplish +actualy -> actually +acurate -> accurate +acutally -> actually +addtion -> addition +againnst -> against +aganist -> against +aggreed -> agreed +agianst -> against +ahppn -> happen +allign -> align +anytying -> anything +aquire -> acquire +availabe -> available +availaible -> available +availalbe -> available +availble -> available +availiable -> available +avalable -> available +avaliable -> available +avilable -> available +bandwith -> bandwidth +begginer -> beginner +beleif -> belief +beleive -> believe +belive -> believe +breif -> brief +burried -> buried +caluclate -> calculate +caluculate -> calculate +calulate -> calculate +catagory -> category +cauhgt -> caught +ceratin -> certain +certian -> certain +cheif -> chief +cieling -> ceiling +circut -> circuit +clasic -> classic +cmoputer -> computer +coform -> conform +comming: -> coming +considerd -> considered +dervied -> derived +desicion -> decision +diferent -> different +diferrent -> different +differnt -> different +diffrent -> different +divison -> division +effecient -> efficient +eligable -> eligible +elpased -> elapsed +embarass -> embarrass +embeded -> embedded +encypt -> encrypt +finaly -> finally +foriegn -> foreign +foward -> forward +fraciton -> fraction +fucntion -> function +fufill -> fulfill +fullfill -> fulfill +futher -> further +ganerate -> generate +generaly -> generally +greatful -> grateful +heigher -> higher +higest -> highest +howver -> however +hydogen -> hydrogen +importamt -> important +inclued -> include +insted -> instead +intrest -> interest +invliad -> invalid +largst -> largest +learnign -> learning +liasion -> liaison +likly -> likely +lisense -> license +listner -> listener +macthing -> matching +manefist -> manifest +mesage -> message +naturual -> natural +occassion -> occasion +occured -> occurred +particualr -> particular +paticular -> particular +peice -> piece +perhasp -> perhaps +perhpas -> perhaps +perphas -> perhaps +persue -> pursue +posess -> possess +postion -> position +preiod -> period +primarly -> primarily +privte -> private +proccess -> process +proeprty -> property +propery -> property +realtion -> relation +reasearch -> research +recuring -> recurring +refered -> referred +regluar -> regular +releated -> related +resutl -> result +reuslt -> result +reveiw -> review +satisifed -> satisfied +scheduel -> schedule +sequnce -> sequence +similiar -> similar +simmilar -> similar +slighly -> slightly +somehwat -> somewhat +statment -> statement +sucess -> success +succsess -> success +sugest -> suggest +sumary -> summary +supress -> suppress +surpress -> suppress +thresold -> threshold +tongiht -> tonight +tranpose -> transpose +typcial -> typical +udpate -> update +ususally -> usually +verticies -> vertices +whereever -> wherever +wherre -> where +wierd -> weird diff --git a/jack/color.c b/jack/color.c new file mode 100644 index 0000000..4d833f3 --- /dev/null +++ b/jack/color.c @@ -0,0 +1,132 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "color.h" +#include <lib/lib8tion/lib8tion.h> +#define FORCE_REFERENCE(var) __asm__ volatile("" : : "r"(var)) +#define FASTLED_SCALE8_FIXED 1 + +RGB rgb_matrix_hsv_to_rgb(const HSV hsv) { + const uint8_t Y1 = 1, Y2 = 0, G_2 = 1, Gscale = 0, hue = hsv.h, sat = hsv.s; + uint8_t val = hsv.v, offset = hue & 0x1F, offset8 = offset; + { +#ifdef __AVR__ + offset8 <<= 1; + __asm__ volatile(""); + offset8 <<= 1; + __asm__ volatile(""); + offset8 <<= 1; +#else + offset8 <<= 3; +#endif + } + uint8_t third = scale8(offset8, (256 / 3)), r, g, b; + if (!(hue & 0x80)) { + if (!(hue & 0x40)) { + if (!(hue & 0x20)) { + r = 255 - third; + g = third; + b = 0; + FORCE_REFERENCE(b); + } else { + if (Y1) { + r = 171; + g = 85 + third; + b = 0; + FORCE_REFERENCE(b); + } + if (Y2) { + r = 170 + third; + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); + g = 85 + twothirds; + b = 0; + FORCE_REFERENCE(b); + } + } + } else { + if (!(hue & 0x20)) { + if (Y1) { + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); + r = 171 - twothirds; + g = 170 + third; + b = 0; + FORCE_REFERENCE(b); + } + if (Y2) { + r = 255 - offset8; + g = 255; + b = 0; + FORCE_REFERENCE(b); + } + } else { + r = 0; + FORCE_REFERENCE(r); + g = 255 - third; + b = third; + } + } + } else { + if (!(hue & 0x40)) { + if (!(hue & 0x20)) { + r = 0; + FORCE_REFERENCE(r); + uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); + g = 171 - twothirds; + b = 85 + twothirds; + } else { + r = third; + g = 0; + FORCE_REFERENCE(g); + b = 255 - third; + } + } else { + if (!(hue & 0x20)) { + r = 85 + third; + g = 0; + FORCE_REFERENCE(g); + b = 171 - third; + } else { + r = 170 + third; + g = 0; + FORCE_REFERENCE(g); + b = 85 - third; + } + } + } + if (G_2) + g = g >> 1; + if (Gscale) + g = scale8_video_LEAVING_R1_DIRTY(g, Gscale); + if (sat != 255) { + if (sat == 0) { + r = 255; + b = 255; + g = 255; + } else { + uint8_t desat = 255 - sat; + desat = scale8_video(desat, desat); + uint8_t satscale = 255 - desat; + r = scale8_LEAVING_R1_DIRTY(r, satscale); + g = scale8_LEAVING_R1_DIRTY(g, satscale); + b = scale8_LEAVING_R1_DIRTY(b, satscale); + cleanup_R1(); + uint8_t brightness_floor = desat; + r += brightness_floor; + g += brightness_floor; + b += brightness_floor; + } + } + if (val != 255) { + val = scale8_video_LEAVING_R1_DIRTY(val, val); + if (val == 0) { + r = 0; + g = 0; + b = 0; + } else { + r = scale8_LEAVING_R1_DIRTY(r, val); + g = scale8_LEAVING_R1_DIRTY(g, val); + b = scale8_LEAVING_R1_DIRTY(b, val); + cleanup_R1(); + } + } + return (RGB){.r = r, .g = g, .b = b}; +} diff --git a/jack/combos.def b/jack/combos.def new file mode 100644 index 0000000..53934f1 --- /dev/null +++ b/jack/combos.def @@ -0,0 +1,16 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later + +// name output keys +CMB(fg_eqal, KC_EQL, KC_W, KC_E) +CMB(er_cbkt, TD(CBRACKET), KC_E, KC_R) +CMB(rt_bsls, KC_BSLS, KC_R, KC_T) +CMB(yu_quot, KC_QUOT, KC_Y, KC_U) +CMB(ui_brkt, TD(SBRACKET), KC_U, KC_I) +CMB(io_mins, TD(EM_DASH_MINS), KC_I, KC_O) +CMB(sd_plus, KC_PLUS, LGUI_T(KC_S), LCTL_T(KC_D)) +CMB(df_coln, KC_COLN, LCTL_T(KC_D), LSFT_T(KC_F)) +CMB(fg_pipe, KC_PIPE, LSFT_T(KC_F), KC_G) +CMB(hj_dquo, KC_DQUO, KC_H, RSFT_T(KC_J)) +CMB(jk_entr, KC_ENT, RSFT_T(KC_J), RCTL_T(KC_K)) +CMB(kl_unds, KC_UNDS, RCTL_T(KC_K), RGUI_T(KC_L)) diff --git a/jack/combos.h b/jack/combos.h new file mode 100644 index 0000000..27e7a7c --- /dev/null +++ b/jack/combos.h @@ -0,0 +1,20 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define CMB(name, action, ...) name, +enum combos { +#include "combos.def" +}; +#undef CMB + +#define CMB(name, action, ...) \ + uint16_t const name##_combo[] PROGMEM = {__VA_ARGS__, COMBO_END}; +#include "combos.def" +#undef CMB + +#define CMB(name, action, ...) [name] = COMBO(name##_combo, action), +combo_t key_combos[] = { +#include "combos.def" +}; +#undef CMB diff --git a/jack/config.h b/jack/config.h new file mode 100644 index 0000000..2b47028 --- /dev/null +++ b/jack/config.h @@ -0,0 +1,51 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define TAPPING_TERM_PER_KEY +#define TAPPING_TERM 140 +#define FORCE_NKRO +#define BOTH_SHIFTS_TURNS_ON_CAPS_WORD +#define COMBO_TERM 40 +#define NO_ACTION_ONESHOT +#define UNICODE_SELECTED_MODES UNICODE_MODE_LINUX +#define ENABLE_COMPILE_KEYCODE +#undef MANUFACTURER +#define MANUFACTURER "jacks" + +#ifdef OLED_ENABLE +#define OLED_FONT_H "users/jack/oledfont.h" +#define OLED_UPDATE_INTERVAL 50 +#define OLED_DISABLE_TIMEOUT +#endif + +#ifdef SPLIT_KEYBOARD +#define MASTER_RIGHT +#define SPLIT_MODS_ENABLE +#define SPLIT_WPM_ENABLE +#define SPLIT_LAYER_STATE_ENABLE +#define SPLIT_OLED_ENABLE +#define SPLIT_LED_STATE_ENABLE +#define SPLIT_ACTIVITY_ENABLE +#define SPLIT_TRANSACTION_IDS_USER RPC_ID_USER_KEYLOG_STR +#endif + +#ifdef RGB_MATRIX_ENABLE +#define RGB_MATRIX_SLEEP +#define RGB_MATRIX_TIMEOUT 300000 +#undef RGB_MATRIX_DEFAULT_MODE +#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_ALPHAS_MODS +#define ENABLE_RGB_MATRIX_ALPHAS_MODS +#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT +#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL +#define ENABLE_RGB_MATRIX_RAINDROPS +#define ENABLE_RGB_MATRIX_FRAMEBUFFER_EFFECTS +#define ENABLE_RGB_MATRIX_TYPING_HEATMAP +#define ENABLE_RGB_MATRIX_KEYPRESSES +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define ENABLE_RGB_MATRIX_SOLID_MULTISPLASH +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS +#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS +#define RGB_MATRIX_KEYPRESSES +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#endif diff --git a/jack/dict.h b/jack/dict.h new file mode 100644 index 0000000..c7a27f4 --- /dev/null +++ b/jack/dict.h @@ -0,0 +1,207 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#define NUM_WORDS 1000 + +const char *dict[NUM_WORDS] = { + "the", "of", "to", "and", "a", + "in", "is", "it", "you", "that", + "he", "was", "for", "on", "are", + "with", "as", "I", "his", "they", + "be", "at", "one", "have", "this", + "from", "or", "had", "by", "not", + "word", "but", "what", "some", "we", + "can", "out", "other", "were", "all", + "there", "when", "up", "use", "your", + "how", "said", "an", "each", "she", + "which", "do", "their", "time", "if", + "will", "way", "about", "many", "then", + "them", "write", "would", "like", "so", + "these", "her", "long", "make", "thing", + "see", "him", "two", "has", "look", + "more", "day", "could", "go", "come", + "did", "number", "sound", "no", "most", + "people", "my", "over", "know", "water", + "than", "call", "first", "who", "may", + "down", "side", "been", "now", "find", + "any", "new", "work", "part", "take", + "get", "place", "made", "live", "where", + "after", "back", "little", "only", "round", + "man", "year", "came", "show", "every", + "good", "me", "give", "our", "under", + "name", "very", "through", "just", "form", + "sentence", "great", "think", "say", "help", + "low", "line", "differ", "turn", "cause", + "much", "mean", "before", "move", "right", + "boy", "old", "too", "same", "tell", + "does", "set", "three", "want", "air", + "well", "also", "play", "small", "end", + "put", "home", "read", "hand", "port", + "large", "spell", "add", "even", "land", + "here", "must", "big", "high", "such", + "follow", "act", "why", "ask", "men", + "change", "went", "light", "kind", "off", + "need", "house", "picture", "try", "us", + "again", "animal", "point", "mother", "world", + "near", "build", "self", "earth", "father", + "head", "stand", "own", "page", "should", + "country", "found", "answer", "school", "grow", + "study", "still", "learn", "plant", "cover", + "food", "sun", "four", "between", "state", + "keep", "eye", "never", "last", "let", + "thought", "city", "tree", "cross", "farm", + "hard", "start", "might", "story", "saw", + "far", "sea", "draw", "left", "late", + "run", "don't", "while", "press", "close", + "night", "real", "life", "few", "north", + "open", "seem", "together", "next", "white", + "children", "begin", "got", "walk", "example", + "ease", "paper", "group", "always", "music", + "those", "both", "mark", "often", "letter", + "until", "mile", "river", "car", "feet", + "care", "second", "book", "carry", "took", + "science", "eat", "room", "friend", "began", + "idea", "fish", "mountain", "stop", "once", + "base", "hear", "horse", "cut", "sure", + "watch", "color", "face", "wood", "main", + "enough", "plain", "girl", "usual", "young", + "ready", "above", "ever", "red", "list", + "though", "feel", "talk", "bird", "soon", + "body", "dog", "family", "direct", "pose", + "leave", "song", "measure", "door", "product", + "black", "short", "numeral", "class", "wind", + "question", "happen", "complete", "ship", "area", + "half", "rock", "order", "fire", "south", + "problem", "piece", "told", "knew", "pass", + "since", "top", "whole", "king", "space", + "heard", "best", "hour", "better", "true", + "during", "hundred", "five", "remember", "step", + "early", "hold", "west", "ground", "interest", + "reach", "fast", "verb", "sing", "listen", + "six", "table", "travel", "less", "morning", + "ten", "simple", "several", "vowel", "toward", + "war", "lay", "against", "pattern", "slow", + "center", "love", "person", "money", "serve", + "appear", "road", "map", "rain", "rule", + "govern", "pull", "cold", "notice", "voice", + "unit", "power", "town", "fine", "certain", + "fly", "fall", "lead", "cry", "dark", + "machine", "note", "wait", "plan", "figure", + "star", "box", "noun", "field", "rest", + "correct", "able", "pound", "done", "beauty", + "drive", "stood", "contain", "front", "teach", + "week", "final", "gave", "green", "oh", + "quick", "develop", "ocean", "warm", "free", + "minute", "strong", "special", "mind", "behind", + "clear", "tail", "produce", "fact", "street", + "inch", "multiply", "nothing", "course", "stay", + "wheel", "full", "force", "blue", "object", + "decide", "surface", "deep", "moon", "island", + "foot", "system", "busy", "test", "record", + "boat", "common", "gold", "possible", "plane", + "stead", "dry", "wonder", "laugh", "thousand", + "ago", "ran", "check", "game", "shape", + "equate", "hot", "miss", "brought", "heat", + "snow", "tire", "bring", "yes", "distant", + "fill", "east", "paint", "language", "among", + "grand", "ball", "yet", "wave", "drop", + "heart", "am", "present", "heavy", "dance", + "engine", "position", "arm", "wide", "sail", + "material", "size", "vary", "settle", "speak", + "weight", "general", "ice", "matter", "circle", + "pair", "include", "divide", "syllable", "felt", + "perhaps", "pick", "sudden", "count", "square", + "reason", "length", "represent", "art", "subject", + "region", "energy", "hunt", "probable", "bed", + "brother", "egg", "ride", "cell", "believe", + "fraction", "forest", "sit", "race", "window", + "store", "summer", "train", "sleep", "prove", + "lone", "leg", "exercise", "wall", "catch", + "mount", "wish", "sky", "board", "joy", + "winter", "sat", "written", "wild", "instrument", + "kept", "glass", "grass", "cow", "job", + "edge", "sign", "visit", "past", "soft", + "fun", "bright", "gas", "weather", "month", + "million", "bear", "finish", "happy", "hope", + "flower", "clothe", "strange", "gone", "jump", + "baby", "eight", "village", "meet", "root", + "buy", "raise", "solve", "metal", "whether", + "push", "seven", "paragraph", "third", "shall", + "held", "hair", "describe", "cook", "floor", + "either", "result", "burn", "hill", "safe", + "cat", "century", "consider", "type", "law", + "bit", "coast", "copy", "phrase", "silent", + "tall", "sand", "soil", "roll", "temperature", + "finger", "industry", "value", "fight", "lie", + "beat", "excite", "natural", "view", "sense", + "ear", "else", "quite", "broke", "case", + "middle", "kill", "son", "lake", "moment", + "scale", "loud", "spring", "observe", "child", + "straight", "consonant", "nation", "dictionary", "milk", + "speed", "method", "organ", "pay", "age", + "section", "dress", "cloud", "surprise", "quiet", + "stone", "tiny", "climb", "cool", "design", + "poor", "lot", "experiment", "bottom", "key", + "iron", "single", "stick", "flat", "twenty", + "skin", "smile", "crease", "hole", "trade", + "melody", "trip", "office", "receive", "row", + "mouth", "exact", "symbol", "die", "least", + "trouble", "shout", "except", "wrote", "seed", + "tone", "join", "suggest", "clean", "break", + "lady", "yard", "rise", "bad", "blow", + "oil", "blood", "touch", "grew", "cent", + "mix", "team", "wire", "cost", "lost", + "brown", "wear", "garden", "equal", "sent", + "choose", "fell", "fit", "flow", "fair", + "bank", "collect", "save", "control", "decimal", + "gentle", "woman", "captain", "practice", "separate", + "difficult", "doctor", "please", "protect", "noon", + "whose", "locate", "ring", "character", "insect", + "caught", "period", "indicate", "radio", "spoke", + "atom", "human", "history", "effect", "electric", + "expect", "crop", "modern", "element", "hit", + "student", "corner", "party", "supply", "bone", + "rail", "imagine", "provide", "agree", "thus", + "capital", "won't", "chair", "danger", "fruit", + "rich", "thick", "soldier", "process", "operate", + "guess", "necessary", "sharp", "wing", "create", + "neighbor", "wash", "bat", "rather", "crowd", + "corn", "compare", "poem", "string", "bell", + "depend", "meat", "rub", "tube", "famous", + "dollar", "stream", "fear", "sight", "thin", + "triangle", "planet", "hurry", "chief", "colony", + "clock", "mine", "tie", "enter", "major", + "fresh", "search", "send", "yellow", "gun", + "allow", "print", "dead", "spot", "desert", + "suit", "current", "lift", "rose", "continue", + "block", "chart", "hat", "sell", "success", + "company", "subtract", "event", "particular", "deal", + "swim", "term", "opposite", "wife", "shoe", + "shoulder", "spread", "arrange", "camp", "invent", + "cotton", "born", "determine", "quart", "nine", + "truck", "noise", "level", "chance", "gather", + "shop", "stretch", "throw", "shine", "property", + "column", "molecule", "select", "wrong", "gray", + "repeat", "require", "broad", "prepare", "salt", + "nose", "plural", "anger", "claim", "continent", + "oxygen", "sugar", "death", "pretty", "skill", + "women", "season", "solution", "magnet", "silver", + "thank", "branch", "match", "suffix", "especially", + "fig", "afraid", "huge", "sister", "steel", + "discuss", "forward", "similar", "guide", "experience", + "score", "apple", "bought", "led", "pitch", + "coat", "mass", "card", "band", "rope", + "slip", "win", "dream", "evening", "condition", + "feed", "tool", "total", "basic", "smell", + "valley", "nor", "double", "seat", "arrive", + "master", "track", "parent", "shore", "division", + "sheet", "substance", "favor", "connect", "post", + "spend", "chord", "fat", "glad", "original", + "share", "station", "dad", "bread", "charge", + "proper", "bar", "offer", "segment", "slave", + "duck", "instant", "market", "degree", "populate", + "chick", "dear", "enemy", "reply", "drink", + "occur", "support", "speech", "nature", "range", + "steam", "motion", "path", "liquid", "log", + "meant", "quotient", "teeth", "shell", "neck"}; diff --git a/jack/jack.c b/jack/jack.c new file mode 100644 index 0000000..b876fb1 --- /dev/null +++ b/jack/jack.c @@ -0,0 +1,117 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" +#include "combos.h" + +tap_dance_action_t tap_dance_actions[] = { + [EM_DASH_MINS] = ACTION_TAP_DANCE_FN(em_dash_mins), + [PLY_NXT_PRV] = ACTION_TAP_DANCE_FN(ply_nxt_prv), + [PASTE_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, raise_paste, td_reset), + [CBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LCBR, KC_RCBR), + [SBRACKET] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, KC_RBRC), +}; + +#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) +#include "transactions.h" +extern char keylog_str[KEYLOG_LEN + 1]; +void keylogger_sync(uint8_t initiator2target_buffer_size, + const void *initiator2target_buffer, + uint8_t target2initiator_buffer_size, + void *target2initiator_buffer) { + if (initiator2target_buffer_size == 5) + memcpy(&keylog_str, initiator2target_buffer, initiator2target_buffer_size); +} + +void housekeeping_task_user(void) { + if (is_keyboard_master()) { + static uint32_t last_sync; + bool needs_sync = false; + static char tmp_keylog[5] = {0}; + if (memcmp(&keylog_str, &tmp_keylog, 5)) { + needs_sync = true; + memcpy(&tmp_keylog, &keylog_str, 5); + } + if (timer_elapsed32(last_sync) > 250) + needs_sync = true; + if (needs_sync) { + if (transaction_rpc_send(RPC_ID_USER_KEYLOG_STR, 5, &keylog_str)) + last_sync = timer_read32(); + } + } +} +#endif + +void keyboard_post_init_user(void) { +#if defined(SPLIT_KEYBOARD) && defined(OLED_ENABLE) + transaction_register_rpc(RPC_ID_USER_KEYLOG_STR, keylogger_sync); +#endif +#ifdef RGBLIGHT_ENABLE + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(HSV_CYAN); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); +#elif RGB_MATRIX_ENABLE + rgb_matrix_enable_noeeprom(); + rgb_matrix_sethsv_noeeprom(HSV_CYAN); + rgb_matrix_mode_noeeprom(RGB_MATRIX_SOLID_COLOR); +#endif +#ifdef CONSOLE_ENABLE + debug_keyboard = true; + debug_enable = true; + debug_matrix = true; + debug_mouse = true; +#endif +#ifdef AUTOCORRECT_ENABLE + if (!autocorrect_is_enabled()) + autocorrect_enable(); +#endif +} + +bool shutdown_user(bool jump_to_bootloader) { +#ifdef OLED_ENABLE + oled_render_boot(jump_to_bootloader); +#endif + return true; +} + +#ifdef ENCODER_MAP_ENABLE +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_BASE] = {{KC_VOLU, KC_VOLD}, {KC_MNXT, KC_MPRV}}, + [_LOWER] = {{RGB_SAI, RGB_SAD}, {RGB_HUI, RGB_HUD}}, + [_RAISE] = {{C(KC_LEFT), C(KC_RGHT)}, {C(S(KC_TAB)), C(KC_TAB)}}}; +#endif + +#ifdef POINTING_DEVICE_ENABLE +static bool scrolling = false; +layer_state_t layer_state_set_user(layer_state_t state) { + switch (get_highest_layer(state)) { + case _LOWER: + scrolling = true; +#ifdef POINTING_DEVICE_DRIVER_pimoroni_trackball + pimoroni_trackball_set_cpi(0.1); +#else + pointing_device_set_cpi(64); +#endif + break; + default: + if (scrolling) { + scrolling = false; +#ifdef POINTING_DEVICE_DRIVER_pimoroni_trackball + pimoroni_trackball_set_cpi(1); +#else + pointing_device_set_cpi(1024); +#endif + } + } + return state; +} + +report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { + if (scrolling) { + mouse_report.h = mouse_report.x; + mouse_report.v = -mouse_report.y; + mouse_report.x = 0; + mouse_report.y = 0; + } + return mouse_report; +} +#endif diff --git a/jack/jack.h b/jack/jack.h new file mode 100644 index 0000000..742b6d1 --- /dev/null +++ b/jack/jack.h @@ -0,0 +1,113 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include QMK_KEYBOARD_H +#ifdef OLED_ENABLE +#include "oled.h" +#endif + +enum layers { _BASE, _LOWER, _RAISE }; + +enum tapdances { EM_DASH_MINS, PLY_NXT_PRV, PASTE_RAISE, CBRACKET, SBRACKET }; + +enum sw_state { NONE, SELECTED, WORD, FIRST_LINE, LINE }; + +enum custom_keycodes { + UPDIR = QK_USER, + NUKE, + SELWORD, + M_JIGGLE, + TABLE1, + TABLE2, + KC_NOMODE, + KC_WIDE, + KC_SCRIPT, + KC_BLOCKS, + KC_REGIONAL, + KC_AUSSIE, + KC_ZALGO, + KC_SUPER, + RWORD +}; + +#ifdef UNICODE_COMMON_ENABLE +bool process_record_unicode(uint16_t keycode, keyrecord_t *record); + +enum unicode_mode { + NOMODE, + WIDE, + SCRIPT, + BLOCKS, + REGIONAL, + AUSSIE, + ZALGO, + SUPER +}; +#endif + +void td_reset(tap_dance_state_t *state, void *user_data); +void em_dash_mins(tap_dance_state_t *state, void *user_data); +void ply_nxt_prv(tap_dance_state_t *state, void *user_data); +void raise_paste(tap_dance_state_t *state, void *user_data); + +#define PNP TD(PLY_NXT_PRV) +#define PSTRSE TD(PASTE_RAISE) +#define ESCLWR LT(_LOWER, KC_ESC) +#define LWRSPC LT(_LOWER, KC_SPC) +#define RSEBSP LT(_RAISE, KC_BSPC) +#define HRML(k1, k2, k3, k4) LALT_T(k1), LGUI_T(k2), LCTL_T(k3), LSFT_T(k4) +#define HRMR(k1, k2, k3, k4) RSFT_T(k1), RCTL_T(k2), RGUI_T(k3), RALT_T(k4) + +#ifdef RGB_MATRIX_ENABLE +#define XRGB_TOG RM_TOGG +#define XRGB_NXT RM_NEXT +#define XRGB_PRV RM_PREV +#define XRGB_HUI RM_HUEU +#define XRGB_HUD RM_HUED +#define XRGB_SAI RM_SATU +#define XRGB_SAD RM_SATD +#define XRGB_VAI RM_VALU +#define XRGB_VAD RM_VALD +#elif RGBLIGHT_ENABLE +#define XRGB_TOG UG_TOGG +#define XRGB_NXT UG_NEXT +#define XRGB_PRV UG_PREV +#define XRGB_HUI UG_HUEU +#define XRGB_HUD UG_HUED +#define XRGB_SAI UG_SATU +#define XRGB_SAD UG_SATD +#define XRGB_VAI UG_VALU +#define XRGB_VAD UG_VALD +#else +#define XRGB_TOG _______ +#define XRGB_NXT _______ +#define XRGB_PRV _______ +#define XRGB_HUI _______ +#define XRGB_HUD _______ +#define XRGB_SAI _______ +#define XRGB_SAD _______ +#define XRGB_VAI _______ +#define XRGB_VAD _______ +#endif + +// clang-format off +#define ___BASE1___ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P +#define ___BASE2___ HRML(KC_A, KC_S, KC_D, KC_F), KC_G, KC_H, HRMR(KC_J, KC_K, KC_L, KC_SCLN) +#define ___BASE3___ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH +#define ___BASE4___ UPDIR, ESCLWR, KC_SPC, KC_BSPC, PSTRSE, PNP + +#define ___LOWER1___ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 +#define ___LOWER2___ HRML(KC_EXLM, KC_AT, KC_HASH, KC_DLR), KC_PERC, KC_CIRC, HRMR(KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN) +#define ___LOWER3___ KC_VOLD, KC_TAB, KC_CAPS, SELWORD, KC_GRV, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLU +#define ___LOWER4___ _______, _______, _______, _______, NUKE, _______ + +#define ___RAISE1___ XRGB_TOG, XRGB_NXT, XRGB_HUI, XRGB_SAI, XRGB_VAI, KC_NOMODE, KC_SCRIPT, KC_BLOCKS, KC_REGIONAL, QK_MAKE +#define ___RAISE2___ M_JIGGLE, XRGB_PRV, XRGB_HUD, XRGB_SAD, XRGB_VAD, KC_WIDE, KC_AUSSIE, KC_ZALGO, KC_SUPER, QK_BOOT +#define ___RAISE3___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 +#define ___RAISE4___ _______, RWORD, _______, _______, _______, _______ +// clang-format on + +#define LAYOUT_jack_60_ts(...) LAYOUT_60_ansi_tsangan(__VA_ARGS__) +#define LAYOUT_jack_3x6(...) LAYOUT_split_3x6_3(__VA_ARGS__) +#define LAYOUT_jack_all(...) LAYOUT_all(__VA_ARGS__) +#define LAYOUT_jack(...) LAYOUT(__VA_ARGS__) diff --git a/jack/oled.c b/jack/oled.c new file mode 100644 index 0000000..7b975e0 --- /dev/null +++ b/jack/oled.c @@ -0,0 +1,237 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "oled.h" +#include "jack.h" + +uint32_t oled_timer = 0; +char keylog_str[KEYLOG_LEN + 1] = {0}; + +void oled_timer_reset(void) { oled_timer = timer_read32(); } + +__attribute__((weak)) bool oled_task_keymap(void) { return true; } + +bool oled_task_user(void) { + if (is_keyboard_master()) { + if (timer_elapsed32(oled_timer) > 300000) { + oled_off(); + return false; + } else + oled_on(); + } + oled_task_keymap(); + return false; +} + +void anim_frame(uint16_t size, char const action[][size]) { + static uint8_t current_frame = 0; + current_frame = (current_frame + 1) & 1; + oled_write_raw(action[current_frame], size); +} + +#ifdef OLED_DISPLAY_128X64 +void wpm_graph(void) { + static uint8_t height = OLED_DISPLAY_HEIGHT - 1, vert_count = 0, + max_wpm = 160; + static uint16_t graph_timer = 0; + if (timer_elapsed(graph_timer) > 100) { + height = 63 - ((get_current_wpm() / (float)max_wpm) * 63); + for (uint8_t i = 0; i <= 1; i++) + oled_write_pixel(3, height + i, true); + if (vert_count == 3) { + vert_count = 0; + while (height <= 63) { + oled_write_pixel(3, height, true); + height++; + } + } else { + for (uint8_t i = 63; i > height; i--) + if (!(i % 3)) + oled_write_pixel(3, i, true); + vert_count++; + } + for (uint16_t y = 0; y < 8; y++) { + for (uint16_t x = 124; x > 0; x--) { + uint16_t i = y * OLED_DISPLAY_WIDTH + x; + oled_buffer[i] = oled_buffer[i - 1]; + oled_dirty |= ((OLED_BLOCK_TYPE)1 << (i / OLED_BLOCK_SIZE)); + } + } + graph_timer = timer_read(); + } +} +#endif + +void felix_dog(void) { + static uint16_t felix_anim_timer = 0; + bool shifted = + get_mods() & MOD_MASK_SHIFT || host_keyboard_led_state().caps_lock; + if (timer_elapsed(felix_anim_timer) > 200) { + felix_anim_timer = timer_read(); + if (shifted || is_caps_word_on()) + anim_frame(96, felix_bark); + else if (get_mods() & MOD_MASK_CAG) + anim_frame(96, felix_sneak); + else if (get_current_wpm() > 60) + anim_frame(96, felix_run); + else if (get_current_wpm() && get_current_wpm() <= 60) + anim_frame(96, felix_walk); + else + anim_frame(96, felix_sit); + } +} + +void layer_anim(void) { + static uint16_t layer_anim_timer = 0; + if (timer_elapsed(layer_anim_timer) > 200) { + layer_anim_timer = timer_read(); + switch (get_highest_layer(layer_state)) { + case _BASE: + anim_frame(520, tap_num); + break; + case _LOWER: + anim_frame(650, tap_sym); + break; + case _RAISE: + anim_frame(520, tap_sys); + break; + } + } +} + +void layer_status(void) { + static const char PROGMEM base[] = {0x20, 0x94, 0x95, 0x96, 0x20, + 0x20, 0xb4, 0xb5, 0xb6, 0x20, + 0x20, 0xd4, 0xd5, 0xd6, 0x20}; + static const char PROGMEM lower[] = {0x20, 0x9a, 0x9b, 0x9c, 0x20, + 0x20, 0xba, 0xbb, 0xbc, 0x20, + 0x20, 0xda, 0xdb, 0xdc, 0x20}; + static const char PROGMEM raise[] = {0x20, 0x97, 0x98, 0x99, 0x20, + 0x20, 0xb7, 0xb8, 0xb9, 0x20, + 0x20, 0xd7, 0xd8, 0xd9, 0x20}; + switch (get_highest_layer(layer_state)) { + case _LOWER: + oled_write(lower, false); + break; + case _RAISE: + oled_write(raise, false); + break; + default: + oled_write(base, false); + } +} + +void render_mod_status(void) { + const uint8_t mods = get_mods(); + static const char PROGMEM + gui_off_1[] = {0x85, 0x86}, + gui_off_2[] = {0xa5, 0xa6}, gui_on_1[] = {0x8d, 0x8e}, + gui_on_2[] = {0xad, 0xae}, alt_off_1[] = {0x87, 0x88}, + alt_off_2[] = {0xa7, 0xa8}, alt_on_1[] = {0x8f, 0x90}, + alt_on_2[] = {0xaf, 0xb0}, ctrl_off_1[] = {0x89, 0x8a}, + ctrl_off_2[] = {0xa9, 0xaa}, ctrl_on_1[] = {0x91, 0x92}, + ctrl_on_2[] = {0xb1, 0xb2}, shift_off_1[] = {0x8b, 0x8c}, + shift_off_2[] = {0xab, 0xac}, shift_on_1[] = {0xcd, 0xce}, + shift_on_2[] = {0xcf, 0xd0}, off_off_1[] = {0xc5}, off_off_2[] = {0xc6}, + on_off_1[] = {0xc7}, on_off_2[] = {0xc8}, off_on_1[] = {0xc9}, + off_on_2[] = {0xca}, on_on_1[] = {0xcb}, on_on_2[] = {0xcc}; + + oled_write(mods & MOD_MASK_GUI ? gui_on_1 : gui_off_1, false); + if ((mods & MOD_MASK_GUI) && (mods & MOD_MASK_ALT)) + oled_write(on_on_1, false); + else if (mods & MOD_MASK_GUI) + oled_write(on_off_1, false); + else if (mods & MOD_MASK_ALT) + oled_write(off_on_1, false); + else + oled_write(off_off_1, false); + oled_write(mods & MOD_MASK_ALT ? alt_on_1 : alt_off_1, false); + oled_write(mods & MOD_MASK_GUI ? gui_on_2 : gui_off_2, false); + if ((mods & MOD_MASK_GUI) && (mods & MOD_MASK_ALT)) + oled_write(on_on_2, false); + else if (mods & MOD_MASK_GUI) + oled_write(on_off_2, false); + else if (mods & MOD_MASK_ALT) + oled_write(off_on_2, false); + else + oled_write(off_off_2, false); + oled_write(mods & MOD_MASK_ALT ? alt_on_2 : alt_off_2, false); + oled_write(mods & MOD_MASK_CTRL ? ctrl_on_1 : ctrl_off_1, false); + if ((mods & MOD_MASK_CTRL) && (mods & MOD_MASK_SHIFT)) + oled_write(on_on_1, false); + else if (mods & MOD_MASK_CTRL) + oled_write(on_off_1, false); + else if (mods & MOD_MASK_SHIFT) + oled_write(off_on_1, false); + else + oled_write(off_off_1, false); + oled_write(mods & MOD_MASK_SHIFT ? shift_on_1 : shift_off_1, false); + oled_write(mods & MOD_MASK_CTRL ? ctrl_on_2 : ctrl_off_2, false); + if ((mods & MOD_MASK_CTRL) && (mods & MOD_MASK_SHIFT)) + oled_write(on_on_2, false); + else if (mods & MOD_MASK_CTRL) + oled_write(on_off_2, false); + else if (mods & MOD_MASK_SHIFT) + oled_write(off_on_2, false); + else + oled_write(off_off_2, false); + oled_write(mods & MOD_MASK_SHIFT ? shift_on_2 : shift_off_2, false); +} + +void add_keylog(uint16_t keycode, keyrecord_t *record) { + if (IS_QK_MOD_TAP(keycode)) + keycode = + record->tap.count + ? keycode_config(QK_MOD_TAP_GET_TAP_KEYCODE(keycode)) + : keycode_config(0xE0 + biton(QK_MOD_TAP_GET_MODS(keycode) & 0xF) + + biton(QK_MOD_TAP_GET_MODS(keycode) & 0x10)); + else if (IS_QK_LAYER_TAP(keycode) && (record->tap.count)) + keycode = keycode_config(QK_LAYER_TAP_GET_TAP_KEYCODE(keycode)); + else if (IS_QK_MODS(keycode)) + keycode = keycode_config(QK_MODS_GET_BASIC_KEYCODE(keycode)); + else if (IS_QK_BASIC(keycode)) + keycode = keycode_config(keycode); + if ((keycode == KC_BSPC) && mod_config(get_mods()) & MOD_MASK_CTRL) { + memset(keylog_str, ' ', KEYLOG_LEN); + keylog_str[KEYLOG_LEN] = '\0'; + return; + } + char code = 0; + if (keycode < ARRAY_SIZE(code_to_name)) + code = pgm_read_byte(&code_to_name[keycode]); + if (code) { + memmove(keylog_str, keylog_str + 1, KEYLOG_LEN - 1); + keylog_str[KEYLOG_LEN - 1] = code; + } +} + +void render_keylog(void) { + oled_write(PSTR("KLG: "), false); + oled_write_ln(keylog_str, false); +} + +void render_wpm(void) { + oled_write(PSTR("WPM: "), false); + oled_write_ln(get_u8_str(get_current_wpm(), ' '), false); +} + +#ifdef DEBUG_MATRIX_SCAN_RATE +void render_scan_rate(void) { + oled_write(PSTR("MSR: "), false); + oled_write_ln(get_u16_str(get_matrix_scan_rate(), ' '), false); +} +#endif + +void oled_render_boot(bool jump_to_bootloader) { + oled_clear(); + static const char PROGMEM qmk_logo[16] = {0x80, 0x81, 0x82, 0x83, 0x84, + 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, + 0xC0, 0xC1, 0xC2, 0xC3, 0xC4}; + oled_write(qmk_logo, false); + oled_set_cursor(0, 4); + oled_write(qmk_logo, false); + oled_set_cursor(0, 8); + oled_write(qmk_logo, false); + oled_set_cursor(0, 12); + oled_write(qmk_logo, false); + oled_render_dirty(true); +} diff --git a/jack/oled.h b/jack/oled.h new file mode 100644 index 0000000..6e33143 --- /dev/null +++ b/jack/oled.h @@ -0,0 +1,596 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once +#include "quantum.h" + +#define KEYLOG_LEN 5 +extern uint8_t oled_buffer[OLED_MATRIX_SIZE]; +extern OLED_BLOCK_TYPE oled_dirty; + +void oled_timer_reset(void); +bool oled_task_keymap(void); +void anim_frame(uint16_t size, char const action[][size]); +void wpm_graph(void); +void felix_dog(void); +void layer_anim(void); +void layer_status(void); +void render_mod_status(void); +void add_keylog(uint16_t keycode, keyrecord_t *record); +void render_keylog(void); +void render_wpm(void); +void render_scan_rate(void); +void oled_render_boot(bool jump_to_bootloader); + +static const char PROGMEM code_to_name[256] = { + ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', + ']', '\\', '#', ';', '\'', '`', ',', '.', '/', 128, 0xD5, 0xD6, + 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0XDF, 0xFB, 'P', 'S', + 19, ' ', 17, 30, 16, 16, 31, 26, 27, 25, 24, 'N', + '/', '*', '-', '+', 23, '1', '2', '3', '4', '5', '6', '7', + '8', '9', '0', '.', '\\', 'A', 0, '=', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0, ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', 0x9E, 0x9E, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, 0x82, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 'C', 'S', 'A', 'G', + 'C', 'S', 'A', 'G', ' ', ' ', ' ', ' ', ' ', 24, 26, 24, + 25, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 24, 25, 27, + 26, ' ', ' ', ' '}; + +static const char PROGMEM felix_sit[][96] = { + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xfc, 0xfe, 0xfd, 0xfe, 0xdc, 0xfc, 0xfc, 0xfe, 0x5d, + 0xfe, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xf0, 0xf8, 0x1c, 0xf0, 0xf8, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf9, 0xfd, 0x7f, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, + 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x37, 0x21, 0x13, 0x3f, 0x3f, + 0x3f, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xfe, 0xfd, 0xfe, 0xfc, 0xdc, 0xfc, 0xfe, 0xfd, 0x5e, + 0xfc, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0xf0, 0xf8, 0xfc, 0x80, 0xf0, 0xf8, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf1, 0xfd, 0x7f, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, + 0x07, 0x0f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x37, 0x21, 0x13, 0x3f, 0x3f, + 0x3f, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }}; + +static const char PROGMEM felix_walk[][96] = { + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf0, 0x70, 0x30, + 0x20, 0x00, 0x80, 0xc0, 0xc0, 0xf0, 0xf8, 0xf4, 0xf8, 0x70, 0xf0, 0xf0, + 0xf8, 0x74, 0xf8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x0f, 0xff, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe7, 0xf5, 0x1f, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x1f, 0x3f, 0x3f, 0x3f, 0x0f, 0x11, 0x1f, 0x1f, 0x03, 0x07, 0x1f, 0x3f, + 0x3f, 0x0f, 0x13, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xe0, 0xe0, 0xc0, + 0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xe8, 0xf0, 0xe0, 0xe0, 0xe0, + 0xf0, 0xe8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1f, 0x3f, 0xfb, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xcf, 0xea, 0x3f, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, + 0x3f, 0x3f, 0x0f, 0x03, 0x07, 0x0f, 0x1f, 0x03, 0x1f, 0x1f, 0x17, 0x0f, + 0x1f, 0x3f, 0x3f, 0x33, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }}; + +static const char PROGMEM felix_run[][96] = { + { + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf8, 0xf8, 0xf8, 0xb0, 0xa0, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xfc, 0xf4, 0xe4, 0xf8, 0x70, + 0xf8, 0xe4, 0xf8, 0x70, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x63, 0xe7, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x67, 0x37, 0x35, + 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f, 0x07, + 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x07, 0x0f, + 0x1f, 0x3f, 0x3b, 0x33, 0x07, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xf8, 0xe8, 0xc8, 0xf0, 0xe0, 0xf0, + 0xc8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x0f, 0x1f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xcf, 0x6f, 0x6a, + 0x3f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x37, 0x03, 0x1f, 0x3f, 0x3f, + 0x1f, 0x0f, 0x1f, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }}; + +static const char PROGMEM felix_bark[][96] = { + { + 0x00, 0xc0, 0xe0, 0xf0, 0xf0, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x80, 0xc0, 0xfc, 0xf4, 0xe4, 0xf8, 0x70, 0xf8, 0xe4, 0xf8, + 0x70, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, + 0x1f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0x37, 0x35, 0x1f, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x37, 0x03, 0x03, 0x07, 0x0f, 0x1f, 0x3f, + 0x3b, 0x33, 0x07, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0xe0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xec, 0xf4, 0xe4, 0xf8, 0x70, 0xf8, 0xe4, + 0xf8, 0x70, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0f, + 0x1f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x37, 0x35, 0x1f, 0x0f, + 0x20, 0x4a, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x37, 0x03, 0x03, 0x07, 0x0f, 0x1f, 0x3f, + 0x3b, 0x33, 0x07, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }}; + +static const char PROGMEM felix_sneak[][96] = { + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, + 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1e, 0x3f, 0xff, 0xfb, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, + 0xfc, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xff, 0x7e, 0x7f, 0x57, 0xfc, + 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1f, + 0x3f, 0x3f, 0x3f, 0x0f, 0x1f, 0x1f, 0x03, 0x07, 0x1f, 0x3f, 0x3f, 0x3f, + 0x0f, 0x1f, 0x1f, 0x07, 0x07, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, + }, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xc0, 0xc0, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x20, 0xc0, 0x80, 0xc0, + 0x20, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x7f, 0xf7, 0xfb, 0xfd, 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, + 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xbf, 0xab, 0xfe, + 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, + 0x3f, 0x0f, 0x03, 0x07, 0x0f, 0x1f, 0x1f, 0x07, 0x1f, 0x1f, 0x0f, 0x1f, + 0x3f, 0x3f, 0x37, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + }}; + +static const char PROGMEM tap_num[][520] = { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, + 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0, 0, 0x80, 0x80, 0xc0, 0x30, 0x0c, + 0x02, 0x11, 0x21, 0x40, 0x80, 0x04, 0x06, 0x09, 0x24, 0x24, 0x18, 0x80, + 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, 0, 0x01, 0x01, 0x01, + 0, 0, 0, 0x80, 0x40, 0x20, 0x20, 0x10, 0x10, 0x8f, 0x48, 0xc4, + 0x84, 0x88, 0x08, 0x10, 0x20, 0x20, 0x40, 0x80, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0x80, + 0x80, 0x40, 0xc0, 0x30, 0x08, 0x44, 0x84, 0x02, 0x02, 0x01, 0x01, 0x78, + 0x28, 0x11, 0x21, 0x42, 0x06, 0x05, 0x08, 0x90, 0x60, 0x80, 0, 0, + 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, 0, 0x80, 0x40, 0x40, + 0x20, 0x20, 0x1f, 0x92, 0x8c, 0x08, 0x18, 0x14, 0x24, 0x7a, 0x46, 0x81, + 0, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x41, 0x44, 0x24, 0x23, 0x10, + 0x10, 0x08, 0x88, 0x84, 0x43, 0x5c, 0x20, 0x20, 0x10, 0x10, 0x20, 0x20, + 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0x18, 0x27, 0x40, 0x80, + 0, 0, 0, 0x01, 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, + 0xc2, 0x21, 0x11, 0x10, 0x08, 0x0b, 0x05, 0x66, 0x42, 0x82, 0x04, 0x04, + 0x08, 0x18, 0x14, 0x2c, 0x43, 0x80, 0x04, 0x08, 0x10, 0x20, 0x41, 0x80, + 0x80, 0x8f, 0x44, 0x44, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, 0xb8, 0x40, + 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0xe0, 0x18, 0x06, 0x01, 0x08, 0x10, + 0x20, 0x40, 0x80, 0, 0, 0, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, + 0x12, 0x0c, 0x70, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x40, 0x20, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, + 0x02, 0x81, 0x8e, 0x70, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0xc8, 0x24, + 0x24, 0x42, 0x82, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, + 0, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, 0, 0x01, + 0x01, 0x01, 0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, + 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x80, 0x70, 0x0c, 0x03, 0, 0x04, 0x08, 0x10, 0x20, + 0x41, 0x80, 0x80, 0x81, 0x46, 0x40, 0x20, 0x20, 0x10, 0x10, 0x09, 0x86, + 0xb8, 0x50, 0x60, 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x40, 0xc0, 0x30, + 0x08, 0x44, 0x84, 0x02, 0x02, 0x11, 0x19, 0x24, 0x90, 0x91, 0x61, 0x03, + 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0, 0, 0, 0x01, 0x01, 0x01, + 0, 0, 0x80, 0x60, 0x10, 0x88, 0x08, 0x04, 0x04, 0x23, 0x12, 0x71, + 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0, 0, 0, + 0, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0, 0, 0x1e, + 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, + 0x02, 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x02, 0xc2, 0x21, 0x11, 0x10, + 0x08, 0x0b, 0x45, 0x26, 0x22, 0xc2, 0x04, 0x04, 0x0c, 0x1e, 0x11, 0x20, + 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x11, 0x09, 0x08, 0x04, + 0x04, 0x02, 0x82, 0x81, 0x40, 0x47, 0x38, 0x20, 0x10, 0x10, 0x20, 0x20, + 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x02, 0x06, 0x09, 0x10, 0x20, + 0x40, 0x80, 0, 0, 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, + 0xc0, 0x20, 0x10, 0x10, 0x08, 0x08, 0x07, 0x64, 0x42, 0x82, 0x04, 0x04, + 0x08, 0x10, 0x1c, 0x23, 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x20, 0x23, 0x11, 0x11, 0x08, 0x08, 0x04, 0x04, 0x02, 0x01, 0x0e, 0xf0, + 0x20, 0xc0, 0x80, 0x80, 0x40, 0x40, 0xe0, 0x18, 0x06, 0x01, 0x08, 0x10, + 0x20, 0x40, 0x80, 0, 0, 0, 0x88, 0x80, 0x40, 0x40, 0x20, 0x21, + 0x12, 0x0c, 0x70, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x10, 0x08, 0x68, 0x9c, 0x03, 0, 0, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, + 0x02, 0x01, 0x0e, 0xf0, 0x20, 0xc0, 0x80, 0x40, 0x40, 0xa0, 0xa0, 0xd0, + 0x90, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0, 0, 0x01, + 0x01, 0x03, 0x04, 0x04, 0x08, 0x90, 0x60, 0x80, 0, 0, 0, 0x01, + 0x01, 0x01, 0, 0, 0, 0, 0x80, 0x80, 0x40, 0x40, 0x20, 0x27, + 0x18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x60, 0x9c, 0x03, 0, 0, 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x20, 0x20, 0x11, 0x10, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, + 0x8e, 0x70, 0x40, 0x20, 0x20, 0x40, 0x40, 0x80, 0, 0xc0, 0x30, 0x0c, + 0x02, 0x11, 0x21, 0x40, 0x80, 0x04, 0x06, 0x09, 0x24, 0x24, 0x18, 0x80, + 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, 0x02, 0x04, 0x04, 0x04, + 0x02, 0x02, 0x81, 0x61, 0x10, 0x88, 0x08, 0x04, 0x05, 0x22, 0x12, 0x71, + 0x21, 0x22, 0xc2, 0x04, 0x08, 0x08, 0x10, 0x20, 0xc0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0, 0, 0x80, + 0x80, 0xc0, 0x30, 0x0c, 0x02, 0x11, 0x21, 0x40, 0x80, 0, 0, 0x1e, + 0x0a, 0x04, 0x08, 0x90, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0, + 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, 0xc0, 0x20, 0x10, 0x10, + 0x08, 0x08, 0x47, 0x24, 0x22, 0xc2, 0x04, 0x04, 0x08, 0x1e, 0x11, 0x20, + 0x40, 0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x10, 0x11, 0x09, 0x08, 0x04, + 0x04, 0x02, 0x02, 0x01, 0, 0x07, 0xf8, 0x80, 0x40, 0x40, 0x80, 0x80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0x06, 0x09, 0x10, 0x20, + 0x40, 0x80, 0, 0, 0, 0x01, 0x02, 0x02, 0x02, 0x01, 0x01, 0, + 0, 0x80, 0x40, 0x40, 0x20, 0x20, 0x1f, 0x92, 0x0c, 0x08, 0x10, 0x10, + 0x28, 0x68, 0x5c, 0x83, 0, 0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x20, 0x23, 0x11, 0x11, 0x08, 0x08, 0x04, 0x04, 0x02, 0x81, 0x8e, 0x70, + 0x60, 0x20, 0x20, 0x40, 0x40, 0xc0, 0xa0, 0x60, 0x18, 0x04, 0x22, 0x42, + 0x81, 0x01, 0, 0, 0, 0, 0x20, 0, 0x01, 0x02, 0x82, 0x84, + 0x48, 0x30, 0xc0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x02, + 0x04, 0x08, 0x10, 0x10, 0x08, 0x88, 0x74, 0x0c, 0x03, 0, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x81, 0x81, 0x82, 0x44, 0x40, 0x20, 0x20, 0x10, 0x10, + 0x09, 0x86, 0xb8, 0x50, 0x60, 0x20, 0x20, 0x10, 0x10, 0x08, 0xc8, 0x24, + 0x24, 0x42, 0x82, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, + 0, 0x80, 0x81, 0x41, 0x42, 0x24, 0x18, 0xe0, 0, 0x01, 0x02, 0x04, + 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0, 0, 0, 0, 0x81, 0x9e, + 0x60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }}; + +static const char PROGMEM tap_sym[][650] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x40, + 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08, + 0x08, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x04, 0x04, 0x04, 0x04, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x50, 0x40, 0x80, + 0, 0, 0, 0, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0xd0, + 0x10, 0x11, 0x21, 0x20, 0x40, 0x80, 0x80, 0, 0, 0, 0, 0, + 0x20, 0x20, 0x21, 0x12, 0x1c, 0xf0, 0x10, 0x18, 0x08, 0x08, 0, 0, + 0x01, 0x01, 0x02, 0x04, 0x08, 0x30, 0xc0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0x80, 0xc0, 0xc0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x81, 0x01, 0, 0, 0x40, 0x80, 0, 0x80, 0, + 0, 0, 0, 0x18, 0x24, 0x24, 0x24, 0x18, 0, 0xc0, 0x30, 0x0e, + 0x80, 0x40, 0x40, 0x80, 0, 0, 0, 0, 0xc0, 0x20, 0x20, 0x20, + 0x40, 0x40, 0x40, 0x20, 0x18, 0, 0, 0, 0x01, 0x82, 0x44, 0x78, + 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x07, 0x04, 0x04, 0x02, 0x02, + 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x81, 0x81, 0x81, 0x82, 0x02, 0x02, 0x02, 0x04, + 0x04, 0x08, 0x0b, 0x10, 0x10, 0x20, 0x60, 0x20, 0x30, 0x18, 0x0c, 0x04, + 0x03, 0x01, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0xfe, 0x01, 0, 0, 0, 0x08, 0x88, 0x85, + 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0xc4, 0, 0, 0, + 0, 0, 0, 0x18, 0x07, 0, 0, 0, 0x03, 0x04, 0x04, 0x04, + 0x03, 0, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0xc0, + 0x20, 0x10, 0x0c, 0x02, 0x01, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x60, 0x30, 0x10, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x10, 0x30, 0x40, 0x80, 0, 0x0e, 0x03, 0x01, + 0x01, 0, 0xe0, 0x30, 0x19, 0x07, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x3f, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x03, 0x04, 0x08, 0x10, 0x20, 0x20, 0xc0, 0, 0, 0, 0x01, + 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x10, + 0x10, 0x10, 0x10, 0x08, 0x08, 0x34, 0xcf, 0, 0, 0, 0, 0, + 0x3e, 0x63, 0xc1, 0xc1, 0xbe, 0x80, 0, 0, 0, 0, 0, 0, + 0x80, 0, 0, 0x1f, 0x20, 0x40, 0xc0, 0x8e, 0x11, 0x19, 0x0e, 0x03, + 0x86, 0x84, 0xc6, 0x63, 0, 0, 0, 0, 0, 0, 0x01, 0x06, + 0, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0xc0, 0x20, 0x18, 0x07, 0x01, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x03, 0, 0x02, 0x02, 0x01, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0x03, 0, + 0, 0, 0x01, 0x03, 0, 0, 0, 0, 0x03, 0, 0, 0, + 0, 0, 0, 0, 0x01, 0x01, 0x01, 0x01, 0x01, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0}, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x80, + 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x18, + 0x14, 0x14, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, 0x60, 0x80, 0x80, 0x80, 0, 0, + 0, 0x1c, 0x22, 0x21, 0x21, 0x22, 0x2c, 0x30, 0x50, 0x90, 0x11, 0x11, + 0x20, 0x20, 0x40, 0xc0, 0, 0, 0, 0, 0, 0x10, 0x10, 0x10, + 0x09, 0x0e, 0x78, 0x88, 0x04, 0x04, 0x04, 0, 0, 0, 0, 0, + 0x01, 0x02, 0x0c, 0xf0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xc0, 0x20, 0x10, + 0x08, 0x08, 0x04, 0x82, 0x01, 0x01, 0, 0x40, 0x80, 0, 0x80, 0x80, + 0, 0, 0, 0x30, 0x48, 0x48, 0x48, 0x30, 0, 0x80, 0x60, 0x18, + 0x04, 0x80, 0x80, 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, + 0x80, 0, 0, 0x80, 0xe0, 0x01, 0x01, 0x02, 0x06, 0x08, 0x10, 0xe0, + 0x10, 0x20, 0x20, 0x20, 0x20, 0x21, 0x16, 0x18, 0x30, 0x50, 0x08, 0x08, + 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, + 0, 0, 0, 0, 0, 0, 0x80, 0x40, 0x30, 0x0c, 0x02, 0x01, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0x08, 0x8c, 0xc5, + 0x4e, 0x74, 0xe2, 0x21, 0x21, 0x17, 0x18, 0x68, 0x84, 0x04, 0, 0, + 0, 0, 0, 0x30, 0x0e, 0x01, 0, 0, 0x07, 0x09, 0x08, 0x09, + 0x06, 0, 0, 0, 0x07, 0, 0, 0, 0x01, 0x01, 0x01, 0x01, + 0, 0, 0, 0, 0, 0x80, 0x70, 0x0f, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xf8, 0x04, 0x02, + 0x02, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0x03, 0x04, 0x08, 0x10, 0x20, 0xe0, 0, 0, 0, 0, 0x81, + 0xc0, 0x40, 0x40, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x04, 0x0a, 0x06, + 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x06, 0x18, 0x60, 0x80, 0, 0, + 0, 0, 0x80, 0x78, 0x07, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x03, 0, 0x02, 0x02, 0x01, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0, 0, 0x03, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }, + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x80, 0x40, 0x40, 0x20, 0x10, + 0x10, 0x08, 0x04, 0, 0x02, 0x01, 0x01, 0x01, 0, 0, 0, 0, + 0, 0x80, 0x80, 0xe0, 0x80, 0xe0, 0, 0, 0, 0, 0, 0, + 0x3c, 0x22, 0x21, 0x21, 0x23, 0x2c, 0x30, 0x70, 0x51, 0x91, 0x10, 0x10, + 0x10, 0x20, 0x60, 0x80, 0, 0, 0, 0, 0x08, 0x08, 0x08, 0x04, + 0x07, 0x3c, 0xc4, 0x04, 0x04, 0x02, 0x02, 0, 0, 0, 0, 0, + 0x01, 0x07, 0xfc, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0xf0, 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x06, 0x18, 0x20, 0xc0, 0, 0, 0, 0x05, 0x06, 0x03, + 0x01, 0x07, 0x01, 0x01, 0x01, 0, 0, 0, 0, 0, 0, 0, + 0x30, 0x20, 0x20, 0x20, 0x20, 0x21, 0x16, 0x1c, 0x38, 0x68, 0x04, 0x07, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0x80, 0xc0, 0x20, 0x30, 0x0c, 0x07, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0f, 0x30, 0x40, + 0x40, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x01, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0x80, 0x80, 0x80, 0x80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0x80, 0x7e, 0x02, 0x01, + 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x04, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01, + 0x01, 0x01, 0, 0, 0, 0x01, 0x03, 0x04, 0x18, 0x30, 0x40, 0x80, + 0, 0, 0, 0xc0, 0x3f, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x01, 0x03, 0, 0x02, 0x01, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, + }}; + +static const char PROGMEM tap_sys[][520] = { + {0x01, 0x80, 0x60, 0x10, 0x48, 0x08, 0x24, 0x04, 0x14, 0x84, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0, 0x04, 0, 0x80, 0x60, 0x10, + 0x08, 0x08, 0x04, 0x44, 0x84, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x60, + 0x82, 0, 0, 0, 0, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, + 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0xc1, 0x81, 0x81, 0x81, + 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0, 0, 0, + 0x10, 0, 0, 0, 0, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x40, 0x84, 0, 0, 0, 0, 0x04, 0, 0x1f, 0x60, 0x85, + 0x10, 0x40, 0, 0x80, 0x06, 0x07, 0, 0, 0, 0, 0x82, 0x60, + 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x93, 0x5c, 0x10, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, + 0, 0, 0, 0, 0xff, 0xc1, 0x02, 0x0c, 0x70, 0x80, 0, 0, + 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, 0x38, 0x06, 0x01, 0x80, + 0x70, 0x0c, 0x02, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc1, 0x02, 0x0c, + 0x70, 0x80, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, + 0x38, 0x06, 0x01, 0x80, 0xff, 0, 0, 0, 0, 0, 0, 0xf0, + 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0xc0, 0x30, 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0x03, + 0x0c, 0xf0, 0x04, 0, 0x80, 0x80, 0x88, 0x80, 0x81, 0x81, 0x02, 0x02, + 0x12, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0, 0x08, 0, 0, + 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, + 0x01, 0x01, 0, 0, 0x80, 0x80, 0, 0x01, 0, 0, 0, 0, + 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, 0xa0, 0x18, 0x07, 0x80, + 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, 0, 0, 0, 0, + 0, 0, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x83, 0x9c, 0x60, + 0xa0, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0x80, 0x60, 0x1c, 0x03, + 0xff, 0, 0, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x52, 0x92, 0x13, 0x12, 0x12, 0xf2, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, + 0x1f, 0x12, 0x99, 0x14, 0x12, 0x1f, 0, 0x04, 0, 0, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x1f, 0, 0, 0x40, 0, 0x1f, 0x10, 0x10, 0x10, + 0x10, 0x1f, 0, 0, 0, 0x40, 0x0d, 0x0d, 0, 0x0c, 0x0c, 0, + 0x01, 0x01, 0, 0, 0, 0x40, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, 0x42, 0x42, 0x42, 0x41, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, + 0x42, 0x42, 0x42, 0x41, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0, 0x08, + 0, 0, 0, 0, 0, 0, 0x40, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x44, + 0x02, 0x01, 0, 0, 0, 0, 0x20, 0}, + { + 0x04, 0x80, 0x60, 0x10, 0x48, 0x08, 0xa4, 0x04, 0x14, 0x04, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0x04, 0, 0, 0x80, 0x60, 0x10, + 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0xc4, 0x04, 0x08, 0x08, 0x10, 0x60, + 0x80, 0x02, 0, 0, 0x04, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, + 0x21, 0x21, 0x21, 0xa1, 0x61, 0x41, 0xc1, 0x41, 0x41, 0x81, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0xa2, 0xfc, 0, 0, 0x40, + 0, 0, 0x02, 0, 0, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x08, 0x04, 0x84, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x42, 0x80, 0, 0, 0x10, 0, 0, 0, 0x1f, 0x60, 0x85, + 0x10, 0x40, 0, 0x81, 0x06, 0x06, 0, 0, 0, 0, 0x82, 0x60, + 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x50, 0x9e, 0x11, 0x20, 0x20, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, + 0, 0, 0, 0, 0xff, 0xc0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, 0x38, 0x06, 0x01, 0, + 0, 0, 0, 0x03, 0x1c, 0xe0, 0x01, 0x06, 0x38, 0xc0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0xc0, + 0x38, 0x06, 0x01, 0, 0xff, 0, 0, 0, 0, 0, 0, 0xf0, + 0x0c, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, 0x1e, + 0xe0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, + 0x0c, 0xf0, 0, 0, 0x80, 0x80, 0x90, 0x80, 0x81, 0x81, 0x02, 0x02, + 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x88, 0, 0, 0, 0, + 0x80, 0x80, 0x80, 0x88, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x82, 0x82, + 0x01, 0x81, 0x80, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, + 0xff, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0x80, + 0x40, 0x30, 0x0e, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x07, 0x18, 0x20, 0x41, 0x8e, 0xb0, 0xc0, 0x80, 0x80, 0x40, + 0x20, 0x18, 0x07, 0x80, 0x40, 0x30, 0x0e, 0x01, 0, 0, 0, 0, + 0xff, 0, 0x02, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x12, 0x92, 0x53, 0x92, 0x12, 0xf2, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0, 0x80, 0, 0, 0x1f, 0x10, + 0x10, 0x10, 0x10, 0x1f, 0, 0, 0, 0, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0, 0, 0, 0x40, 0x01, 0x01, 0x80, 0x0d, 0x0d, 0, + 0x0c, 0x0c, 0, 0, 0, 0, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x41, 0x41, 0x41, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0, 0, + 0, 0, 0x08, 0, 0, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x04, + 0x02, 0x01, 0, 0, 0x04, 0, 0, 0, + }, + { + 0, 0x80, 0x60, 0x14, 0x48, 0x08, 0x24, 0x04, 0x14, 0x04, 0x14, 0x04, + 0x28, 0x88, 0x10, 0x60, 0x80, 0, 0, 0x08, 0, 0x80, 0x60, 0x10, + 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x88, 0x10, 0x60, + 0x80, 0, 0, 0x04, 0, 0, 0, 0, 0xfc, 0x02, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x81, 0x41, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x41, 0x81, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x81, 0x41, 0x21, 0x21, 0x21, 0x22, 0xfc, 0, 0, 0x10, + 0, 0, 0, 0, 0x02, 0, 0x80, 0x40, 0x20, 0x10, 0x10, 0x08, + 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x40, 0x80, 0, 0x04, 0, 0, 0, 0, 0x1f, 0x60, 0x85, + 0x10, 0x44, 0x04, 0x84, 0x06, 0x06, 0, 0, 0, 0, 0x82, 0x60, + 0x1f, 0, 0, 0, 0, 0x1f, 0x60, 0x80, 0x40, 0x20, 0x20, 0x10, + 0x10, 0x18, 0x14, 0x22, 0x21, 0x40, 0x80, 0x60, 0x1f, 0, 0, 0, + 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0x03, 0x1c, 0xe0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0xe0, 0x1c, 0x03, 0, 0, + 0, 0, 0, 0, 0xff, 0, 0, 0, 0x08, 0, 0, 0xf0, + 0x0c, 0x03, 0, 0, 0, 0, 0x01, 0x06, 0x08, 0x30, 0x40, 0x80, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, + 0x0c, 0xf0, 0, 0, 0x80, 0x80, 0x80, 0x90, 0x81, 0x81, 0x02, 0x12, + 0x02, 0x02, 0x82, 0x82, 0x81, 0x81, 0x80, 0x80, 0, 0, 0x08, 0, + 0x80, 0x80, 0x80, 0x80, 0x81, 0x81, 0x02, 0x02, 0x02, 0x02, 0x02, 0x0a, + 0x01, 0x81, 0x80, 0, 0x80, 0x80, 0x08, 0, 0, 0, 0x01, 0, + 0xff, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x20, 0x18, 0x07, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0x07, 0x18, 0x20, 0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, + 0x20, 0x18, 0x07, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0xff, 0, 0, 0, 0, 0, 0, 0x07, 0x18, 0x60, 0x90, 0x08, + 0x08, 0x04, 0x64, 0x04, 0x02, 0xf2, 0x12, 0x13, 0x12, 0x92, 0x52, 0xf2, + 0x02, 0x04, 0x64, 0x04, 0x08, 0x08, 0x90, 0x70, 0x18, 0x07, 0, 0, + 0x1f, 0x10, 0x10, 0x10, 0x10, 0x1f, 0, 0, 0x80, 0, 0x1f, 0x10, + 0x16, 0x16, 0x10, 0x1f, 0, 0, 0, 0, 0x1f, 0x10, 0x10, 0x10, + 0x50, 0x1f, 0, 0, 0, 0, 0x0c, 0x0c, 0, 0x01, 0x01, 0, + 0x0d, 0x0d, 0, 0, 0x40, 0, 0, 0, 0x1f, 0x20, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1f, 0, 0x80, 0, + 0, 0, 0, 0, 0x08, 0, 0, 0x01, 0x02, 0x04, 0x04, 0x08, + 0x08, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x08, 0x08, 0x04, 0x04, + 0x02, 0x01, 0x10, 0, 0, 0, 0, 0, + }}; diff --git a/jack/oledfont.h b/jack/oledfont.h new file mode 100644 index 0000000..209f143 --- /dev/null +++ b/jack/oledfont.h @@ -0,0 +1,118 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "progmem.h" + +static const unsigned char PROGMEM font[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x00, 0x18, 0x24, 0x18, 0x00, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, + 0x26, 0x29, 0x79, 0x29, 0x26, 0x00, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, + 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, + 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, + 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, + 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, + 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, + 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, + 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, + 0x36, 0x49, 0x56, 0x20, 0x50, 0x00, 0x00, 0x08, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, + 0x00, 0x80, 0x70, 0x30, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, + 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, 0x00, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, + 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, + 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, 0x41, 0x21, 0x11, 0x09, 0x07, 0x00, + 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, + 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x40, 0x34, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, + 0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x02, 0x01, 0x59, 0x09, 0x06, 0x00, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, + 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, + 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, + 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, + 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, + 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, + 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, + 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, + 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, + 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, + 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, + 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, + 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, + 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, + 0x00, 0x03, 0x07, 0x08, 0x00, 0x00, 0x20, 0x54, 0x54, 0x78, 0x40, 0x00, + 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, 0x38, 0x44, 0x44, 0x44, 0x28, 0x00, + 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, + 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x18, 0x24, 0x24, 0x1C, 0x78, 0x00, + 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, + 0x7C, 0x18, 0x24, 0x24, 0x18, 0x00, 0x18, 0x24, 0x24, 0x18, 0x7C, 0x00, + 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, + 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, + 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, + 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, + 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00, 0x08, 0x36, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x20, 0xF8, 0x0C, 0x04, 0xE7, 0xE4, 0xE4, 0x07, + 0x04, 0xE4, 0xE7, 0xE4, 0x04, 0x07, 0xE4, 0xE4, 0xE7, 0x04, 0x0C, 0xF8, + 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x04, 0x22, 0x52, 0xE2, + 0x42, 0x42, 0x42, 0xE2, 0x52, 0x22, 0x22, 0x22, 0x42, 0x82, 0x02, 0x02, + 0x22, 0x22, 0x02, 0x04, 0xF8, 0x00, 0x00, 0xF8, 0x04, 0x02, 0x02, 0x82, + 0x42, 0x22, 0x42, 0x82, 0x02, 0x02, 0x02, 0x82, 0x42, 0x22, 0x12, 0x22, + 0x42, 0x82, 0x02, 0x04, 0xF8, 0x00, 0x00, 0xF8, 0xFC, 0xDE, 0xAE, 0x1E, + 0xBE, 0xBE, 0xBE, 0x1E, 0xAE, 0xDE, 0xDE, 0xDE, 0xBE, 0x7E, 0xFE, 0xFE, + 0xDE, 0xDE, 0xFE, 0xFC, 0xF8, 0x00, 0x00, 0xF8, 0xFC, 0xFE, 0xFE, 0x7E, + 0xBE, 0xDE, 0xBE, 0x7E, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0, + 0xF0, 0xF0, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, + 0x80, 0x80, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, 0x08, 0x08, 0x10, 0x10, + 0x20, 0x20, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x40, 0xC0, 0x60, 0xA0, + 0x50, 0xB0, 0x58, 0xA8, 0x50, 0xB0, 0x60, 0xA0, 0x40, 0xC0, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x49, 0x49, 0xFF, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x38, + 0x30, 0xFF, 0xFF, 0xFF, 0x30, 0x38, 0x3F, 0x1F, 0x0F, 0x00, 0x00, 0xFF, + 0x49, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x44, 0x4A, 0x47, + 0x42, 0x42, 0x42, 0x47, 0x4A, 0x44, 0x40, 0x40, 0x40, 0x40, 0x41, 0x42, + 0x44, 0x44, 0x40, 0x20, 0x1F, 0x00, 0x00, 0x1F, 0x20, 0x40, 0x41, 0x40, + 0x40, 0x40, 0x40, 0x40, 0x41, 0x40, 0x41, 0x41, 0x4F, 0x48, 0x48, 0x48, + 0x4F, 0x41, 0x41, 0x20, 0x1F, 0x00, 0x00, 0x1F, 0x3F, 0x7B, 0x75, 0x78, + 0x7D, 0x7D, 0x7D, 0x78, 0x75, 0x7B, 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7D, + 0x7B, 0x7B, 0x7F, 0x3F, 0x1F, 0x00, 0x00, 0x1F, 0x3F, 0x7F, 0x7E, 0x7F, + 0x7F, 0x7F, 0x7F, 0x7F, 0x7E, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x88, 0x88, 0x5D, 0x5D, 0x3E, 0x3E, 0x7C, 0x7C, 0xF8, 0xF8, 0x7C, 0x7C, + 0x3E, 0x3E, 0x5D, 0x5D, 0x88, 0x88, 0x88, 0x88, 0x55, 0x55, 0x23, 0x23, + 0x47, 0x47, 0x8F, 0x8F, 0x47, 0x47, 0x23, 0x23, 0x55, 0x55, 0x88, 0x88, + 0x88, 0x88, 0xD5, 0xD5, 0xE2, 0xE2, 0xC4, 0xC4, 0x88, 0x88, 0xC4, 0xC4, + 0xE2, 0xE2, 0xD5, 0xD5, 0x88, 0x88, 0x88, 0x88, 0x5D, 0xD5, 0x6B, 0xB6, + 0x6D, 0xD6, 0xAD, 0xDA, 0x6D, 0xD6, 0x6B, 0xB6, 0x5D, 0xD5, 0x88, 0x88, + 0x00, 0x00, 0x00, 0x02, 0x02, 0x0F, 0x18, 0x10, 0x70, 0x10, 0x10, 0x70, + 0x10, 0x13, 0x73, 0x13, 0x10, 0x70, 0x10, 0x10, 0x70, 0x10, 0x18, 0x0F, + 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF8, 0x00, 0x00, 0xF8, 0x04, + 0x20, 0x1F, 0x00, 0x00, 0x1F, 0x20, 0xFC, 0xF8, 0x00, 0x00, 0xF8, 0x04, + 0x3F, 0x1F, 0x00, 0x00, 0x1F, 0x20, 0x04, 0xF8, 0x00, 0x00, 0xF8, 0xFC, + 0x20, 0x1F, 0x00, 0x00, 0x1F, 0x3F, 0xFC, 0xF8, 0x00, 0x00, 0xF8, 0xFC, + 0x3F, 0x1F, 0x00, 0x00, 0x1F, 0x3F, 0xFE, 0x7E, 0xBE, 0xDE, 0xEE, 0xDE, + 0xBE, 0x7E, 0xFE, 0xFC, 0xF8, 0x00, 0x7E, 0x7E, 0x70, 0x77, 0x77, 0x77, + 0x70, 0x7E, 0x7E, 0x3F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x04, 0x04, + 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, + 0x04, 0x04, 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x0F, 0x07, 0x07, + 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x02, + 0x05, 0x06, 0x0D, 0x0A, 0x05, 0x06, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, +}; diff --git a/jack/raw.py b/jack/raw.py new file mode 100644 index 0000000..994a92c --- /dev/null +++ b/jack/raw.py @@ -0,0 +1,49 @@ +# Copyright 2024 [email protected] +# SPDX-License-Identifier: GPL-2.0-or-later +import hid +import sys +import psutil +import math +import time +import datetime + +vendor_id = 0x6A73 +product_id = 0x6B62 +usage_page = 0xFF60 +usage = 0x61 + + +def get_raw_hid_interface(): + device_interfaces = hid.enumerate(vendor_id, product_id) + raw_hid_interfaces = [ + i + for i in device_interfaces + if i["usage_page"] == usage_page and i["usage"] == usage + ] + if len(raw_hid_interfaces) == 0: + return None + interface = hid.Device(path=raw_hid_interfaces[0]["path"]) + return interface + + +def send_packet(data): + interface = get_raw_hid_interface() + if interface is None: + print("no device found") + sys.exit(1) + request_data = [0x00] * 32 + request_data[1 : len(data) + 1] = data + request_packet = bytes(request_data) + try: + interface.write(request_packet) + finally: + interface.close() + + +if __name__ == "__main__": + while True: + time.sleep(30) + cpu_temp = psutil.sensors_temperatures()["gigabyte_wmi"][2] + cur_hour = datetime.datetime.now().strftime("%H") + cur_minute = datetime.datetime.now().strftime("%M") + send_packet([math.trunc(cpu_temp.current), int(cur_hour), int(cur_minute)]) diff --git a/jack/rules.mk b/jack/rules.mk new file mode 100644 index 0000000..f75ba4d --- /dev/null +++ b/jack/rules.mk @@ -0,0 +1,50 @@ +LTO_ENABLE = yes +TOP_SYMBOLS = yes +NRKO_ENABLE = yes +COMBO_ENABLE = yes +MAGIC_ENABLE = no +UNICODE_COMMON = yes +EXTRAKEY_ENABLE = yes +BOOTMAGIC_ENABLE = yes +CAPS_WORD_ENABLE = yes +TAP_DANCE_ENABLE = yes +AUTOCORRECT_ENABLE = yes +MOUSE_JIGGLE_ENABLE = yes +DEBOUNCE_TYPE = asym_eager_defer_pk +AVR_CFLAGS += -mrelax +INTROSPECTION_KEYMAP_C = jack.c + +SRC += tapping.c + +ifeq ($(strip $(OLED_ENABLE)), yes) + SRC += oled.c + WPM_ENABLE = yes +endif + +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += color.c +endif + +ifeq ($(strip $(UNICODE_COMMON)), yes) + UNICODE_ENABLE = no + SRC += unicode.c +endif + +ifeq ($(PLATFORM), CHIBIOS) + RANDWORD = yes + EXTRAFLAGS += -Os +endif + +ifneq ($(findstring Gentoo, $(shell arm-none-eabi-gcc --version)),) + EXTRAFLAGS += -U_FORTIFY_SOURCE +endif + +ifeq ($(strip $(RANDWORD)), yes) + OPT_DEFS += -DRANDWORD +endif + +ifeq ($(strip $(MOUSE_JIGGLE_ENABLE)), yes) + OPT_DEFS += -DMOUSE_JIGGLE_ENABLE + MOUSEKEY_ENABLE = yes + DEFERRED_EXEC_ENABLE = yes +endif diff --git a/jack/tapping.c b/jack/tapping.c new file mode 100644 index 0000000..91690d5 --- /dev/null +++ b/jack/tapping.c @@ -0,0 +1,200 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" +#ifdef RANDWORD +#include "dict.h" +uint16_t word = 0; +#endif + +#define INTERCEPT_MOD_TAP(mod, keycode) \ + case mod(keycode): \ + if (record->tap.count && record->event.pressed) { \ + tap_code16(keycode); \ + return false; \ + } \ + break; + +static uint8_t select_word_state = NONE; + +bool process_select_word(uint16_t keycode, keyrecord_t *record) { + if (keycode == KC_LSFT || keycode == KC_RSFT) + return true; + if (keycode == SELWORD && record->event.pressed) { + const bool shifted = get_mods() & MOD_MASK_SHIFT; + if (!shifted) { + set_mods(MOD_BIT(KC_LCTL)); + if (select_word_state == NONE) { + send_keyboard_report(); + tap_code(KC_RGHT); + tap_code(KC_LEFT); + } + register_mods(MOD_BIT(KC_LSFT)); + register_code(KC_RGHT); + select_word_state = WORD; + } else { + if (select_word_state == NONE) { + clear_mods(); + send_keyboard_report(); + tap_code(KC_HOME); + register_mods(MOD_BIT(KC_LSFT)); + tap_code(KC_END); + set_mods(get_mods()); + select_word_state = FIRST_LINE; + } else { + register_code(KC_DOWN); + select_word_state = LINE; + } + } + return false; + } + switch (select_word_state) { + case WORD: + unregister_code(KC_RGHT); + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + select_word_state = SELECTED; + break; + case FIRST_LINE: + select_word_state = SELECTED; + break; + case LINE: + unregister_code(KC_DOWN); + select_word_state = SELECTED; + break; + case SELECTED: + if (keycode == KC_ESC) { + tap_code(KC_RGHT); + select_word_state = NONE; + return false; + } + default: + select_word_state = NONE; + } + return true; +} + +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LWRSPC: + case ESCLWR: + case RSEBSP: + return TAPPING_TERM - 40; + case TD(EM_DASH_MINS): + case TD(PLY_NXT_PRV): + case TD(CBRACKET): + case TD(SBRACKET): + return TAPPING_TERM + 60; + default: + return TAPPING_TERM; + } +} + +void td_reset(tap_dance_state_t *state, void *user_data) { + clear_keyboard(); + layer_clear(); +} + +void em_dash_mins(tap_dance_state_t *state, void *user_data) { + switch (state->count) { + case 3: +#ifdef UNICODE_COMMON_ENABLE + register_unicode(0x2014); // — +#endif + break; + case 2: + tap_code(KC_MINS), tap_code(KC_MINS); + break; + default: + tap_code(KC_MINS); + } +} + +void ply_nxt_prv(tap_dance_state_t *state, void *user_data) { + switch (state->count) { + case 1: + tap_code(KC_MPLY); + break; + case 2: + tap_code(KC_MNXT); + break; + case 3: + tap_code(KC_MPRV); + break; + } +} + +void raise_paste(tap_dance_state_t *state, void *user_data) { + if (state->pressed && !state->interrupted) + layer_on(_RAISE); + else if (state->count == 1) + tap_code16(C(S(KC_V))); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +#ifdef UNICODE_COMMON_ENABLE + if (!process_record_unicode(keycode, record)) + return false; +#endif + if (!process_select_word(keycode, record)) + return false; +#ifdef OLED_ENABLE + if (record->event.pressed) { + oled_timer_reset(); + add_keylog(keycode, record); + } +#endif +#ifdef MOUSE_JIGGLE_ENABLE + if (record->event.pressed) { + static deferred_token token = INVALID_DEFERRED_TOKEN; + static report_mouse_t report = {0}; + if (token) { + cancel_deferred_exec(token); + token = INVALID_DEFERRED_TOKEN; + report = (report_mouse_t){}; + host_mouse_send(&report); + } else if (keycode == M_JIGGLE) { + uint32_t jiggle_callback(uint32_t trigger_time, void *cb_arg) { + static const int8_t deltas[32] = { + 0, -1, -2, -2, -3, -3, -4, -4, -4, -4, -3, -3, -2, -2, -1, 0, + 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 3, 3, 2, 2, 1, 0}; + static uint8_t phase = 0; + report.x = deltas[phase]; + report.y = deltas[(phase + 8) & 31]; + phase = (phase + 1) & 31; + host_mouse_send(&report); + return 16; + } + token = defer_exec(1, jiggle_callback, NULL); + } + } +#endif + switch (keycode) { + case UPDIR: + if (record->event.pressed) + SEND_STRING("../"); + break; + case NUKE: + if (record->event.pressed) { + tap_code16(C(KC_A)); + SEND_STRING("\b```suggestion\n```"); + } + break; + INTERCEPT_MOD_TAP(LALT_T, KC_EXLM) + INTERCEPT_MOD_TAP(LGUI_T, KC_AT) + INTERCEPT_MOD_TAP(LCTL_T, KC_HASH) + INTERCEPT_MOD_TAP(LSFT_T, KC_DLR) + INTERCEPT_MOD_TAP(RSFT_T, KC_AMPR) + INTERCEPT_MOD_TAP(RCTL_T, KC_ASTR) + INTERCEPT_MOD_TAP(RGUI_T, KC_LPRN) + INTERCEPT_MOD_TAP(RALT_T, KC_RPRN) + case RWORD: +#ifdef RANDWORD + word = rand() % NUM_WORDS; + if (record->event.pressed) { + send_string(dict[word]); + tap_code(KC_SPC); + } +#endif + break; + } + return true; +} diff --git a/jack/unicode.c b/jack/unicode.c new file mode 100644 index 0000000..74c0ccc --- /dev/null +++ b/jack/unicode.c @@ -0,0 +1,280 @@ +// Copyright 2024 [email protected] +// SPDX-License-Identifier: GPL-2.0-or-later +#include "jack.h" + +uint8_t typing_mode = NOMODE; +typedef uint32_t (*translator_function_t)(bool is_shifted, uint32_t keycode); + +void tap_unicode_glyph_nomods(uint32_t glyph) { + uint8_t temp_mod = get_mods(); + clear_mods(); + register_unicode(glyph); + set_mods(temp_mod); +} + +void tap_code16_nomods(uint16_t kc) { + uint8_t temp_mod = get_mods(); + clear_mods(); + tap_code16(kc); + set_mods(temp_mod); +} + +#define DEFINE_UNICODE_RANGE_TRANSLATOR(translator_name, lower_alpha, \ + upper_alpha, zero_glyph, number_one, \ + space_glyph) \ + static inline uint32_t translator_name(bool is_shifted, uint32_t keycode) { \ + switch (keycode) { \ + case KC_A ... KC_Z: \ + return (is_shifted ? upper_alpha : lower_alpha) + keycode - KC_A; \ + case KC_0: \ + return zero_glyph; \ + case KC_1 ... KC_9: \ + return (number_one + keycode - KC_1); \ + case KC_SPACE: \ + return space_glyph; \ + } \ + return keycode; \ + } + +#define DEFINE_UNICODE_LUT_TRANSLATOR(translator_name, ...) \ + static inline uint32_t translator_name(bool is_shifted, uint32_t keycode) { \ + static const uint32_t translation[] = {__VA_ARGS__}; \ + uint32_t ret = keycode; \ + if ((keycode - KC_A) < ARRAY_SIZE(translation)) \ + ret = translation[keycode - KC_A]; \ + return ret; \ + } + +bool process_record_glyph_replacement(uint16_t keycode, keyrecord_t *record, + translator_function_t translator) { + uint8_t temp_mod = get_mods(); + bool is_shifted = (temp_mod)&MOD_MASK_SHIFT; + if (((temp_mod) & (MOD_MASK_CTRL | MOD_MASK_ALT | MOD_MASK_GUI)) == 0) { + if (KC_A <= keycode && keycode <= KC_Z) { + if (record->event.pressed) + tap_unicode_glyph_nomods(translator(is_shifted, keycode)); + return false; + } else if (KC_1 <= keycode && keycode <= KC_0) { + if (is_shifted) + return true; + if (record->event.pressed) + register_unicode(translator(is_shifted, keycode)); + return false; + } else if (keycode == KC_SPACE) { + if (record->event.pressed) + register_unicode(translator(is_shifted, keycode)); + return false; + } + } + return true; +} + +DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_wide, 0xFF41, 0xFF21, + 0xFF10, 0xFF11, 0x2003); +DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_script, 0x1D4EA, + 0x1D4D0, 0x1D7CE, 0x1D7C1, 0x2002); +DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_boxes, 0x1F170, + 0x1F170, '0', '1', 0x2002); +DEFINE_UNICODE_RANGE_TRANSLATOR(unicode_range_translator_regional, 0x1F1E6, + 0x1F1E6, '0', '1', 0x2003); + +DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_aussie, + 0x0250, // a + 'q', // b + 0x0254, // c + 'p', // d + 0x01DD, // e + 0x025F, // f + 0x0183, // g + 0x0265, // h + 0x1D09, // i + 0x027E, // j + 0x029E, // k + 'l', // l + 0x026F, // m + 'u', // n + 'o', // o + 'd', // p + 'b', // q + 0x0279, // r + 's', // s + 0x0287, // t + 'n', // u + 0x028C, // v + 0x028D, // w + 0x2717, // x + 0x028E, // y + 'z', // z + 0x0269, // 1 + 0x3139, // 2 + 0x0190, // 3 + 0x3123, // 4 + 0x03DB, // 5 + '9', // 6 + 0x3125, // 7 + '8', // 8 + '6', // 9 + '0' // 0 +); + +DEFINE_UNICODE_LUT_TRANSLATOR(unicode_lut_translator_super, + 0x1D43, // a + 0x1D47, // b + 0x1D9C, // c + 0x1D48, // d + 0x1D49, // e + 0x1DA0, // f + 0x1D4D, // g + 0x02B0, // h + 0x2071, // i + 0x02B2, // j + 0x1D4F, // k + 0x02E1, // l + 0x1D50, // m + 0x207F, // n + 0x1D52, // o + 0x1D56, // p + 0x06F9, // q + 0x02B3, // r + 0x02E2, // s + 0x1D57, // t + 0x1D58, // u + 0x1D5B, // v + 0x02B7, // w + 0x02E3, // x + 0x02B8, // y + 0x1DBB, // z + 0x00B9, // 1 + 0x00B2, // 2 + 0x00B3, // 3 + 0x2074, // 4 + 0x2075, // 5 + 0x2076, // 6 + 0x2077, // 7 + 0x2078, // 8 + 0x2079, // 9 + 0x2070 // 0 +); + +bool process_record_aussie(uint16_t keycode, keyrecord_t *record) { + bool is_shifted = (get_mods()) & MOD_MASK_SHIFT; + if ((KC_A <= keycode) && (keycode <= KC_0)) { + if (record->event.pressed) + if (!process_record_glyph_replacement(keycode, record, + unicode_lut_translator_aussie)) { + tap_code16_nomods(KC_LEFT); + return false; + } + } else if (record->event.pressed && keycode == KC_SPACE) { + tap_code16_nomods(KC_SPACE); + tap_code16_nomods(KC_LEFT); + return false; + } else if (record->event.pressed && keycode == KC_ENTER) { + tap_code16_nomods(KC_END); + tap_code16_nomods(KC_ENTER); + return false; + } else if (record->event.pressed && keycode == KC_HOME) { + tap_code16_nomods(KC_END); + return false; + } else if (record->event.pressed && keycode == KC_END) { + tap_code16_nomods(KC_HOME); + return false; + } else if (record->event.pressed && keycode == KC_BSPC) { + tap_code16_nomods(KC_DEL); + return false; + } else if (record->event.pressed && keycode == KC_DEL) { + tap_code16_nomods(KC_BSPC); + return false; + } else if (record->event.pressed && keycode == KC_QUOT) { + tap_unicode_glyph_nomods(is_shifted ? 0x201E : 0x201A); + tap_code16_nomods(KC_LEFT); + return false; + } else if (record->event.pressed && keycode == KC_COMMA) { + tap_unicode_glyph_nomods(is_shifted ? '<' : 0x2018); + tap_code16_nomods(KC_LEFT); + return false; + } else if (record->event.pressed && keycode == KC_DOT) { + tap_unicode_glyph_nomods(is_shifted ? '>' : 0x02D9); + tap_code16_nomods(KC_LEFT); + return false; + } else if (record->event.pressed && keycode == KC_SLASH) { + tap_unicode_glyph_nomods(is_shifted ? 0x00BF : '/'); + tap_code16_nomods(KC_LEFT); + return false; + } + return true; +} + +bool process_record_zalgo(uint16_t keycode, keyrecord_t *record) { + if ((KC_A <= keycode) && (keycode <= KC_0)) { + if (record->event.pressed) { + tap_code16_nomods(keycode); + int num = (rand() % (8 + 1 - 2)) + 2; + for (int i = 0; i < num; i++) { + uint16_t hex = (rand() % (0x036F + 1 - 0x0300)) + 0x0300; + register_unicode(hex); + } + return false; + } + } + return true; +} + +bool process_record_unicode(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case TABLE1: + if (record->event.pressed) { + send_unicode_string("┬──┬ ノ( ゜-゜ノ)"); + } + break; + case TABLE2: + if (record->event.pressed) { + send_unicode_string("(╯°□°)╯︵┻━┻"); + } + break; + case KC_NOMODE ... KC_SUPER: + if (record->event.pressed) { + if (typing_mode != keycode - KC_NOMODE) + typing_mode = keycode - KC_NOMODE; + else + typing_mode = NOMODE; + } + break; + } + if (((get_mods()) & ~MOD_MASK_SHIFT) != 0) + return true; + if (((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || + (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) && + record->tap.count) + keycode &= 0xFF; + if (typing_mode == WIDE) { + if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) + return process_record_glyph_replacement(keycode, record, + unicode_range_translator_wide); + } else if (typing_mode == SCRIPT) { + if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) + return process_record_glyph_replacement(keycode, record, + unicode_range_translator_script); + } else if (typing_mode == BLOCKS) { + if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) + return process_record_glyph_replacement(keycode, record, + unicode_range_translator_boxes); + } else if (typing_mode == REGIONAL) { + if (((KC_A <= keycode) && (keycode <= KC_0)) || keycode == KC_SPACE) { + if (!process_record_glyph_replacement( + keycode, record, unicode_range_translator_regional)) { + wait_us(500); + tap_unicode_glyph_nomods(0x200C); + return false; + } + } + } else if (typing_mode == SUPER) { + if (((KC_A <= keycode) && (keycode <= KC_0))) + return process_record_glyph_replacement(keycode, record, + unicode_lut_translator_super); + } else if (typing_mode == AUSSIE) + return process_record_aussie(keycode, record); + else if (typing_mode == ZALGO) + return process_record_zalgo(keycode, record); + return true; +} |