summaryrefslogtreecommitdiffstats
path: root/keyboard/preonic
diff options
context:
space:
mode:
Diffstat (limited to 'keyboard/preonic')
-rw-r--r--keyboard/preonic/Makefile4
-rwxr-xr-xkeyboard/preonic/flash-pcb.sh3
-rw-r--r--keyboard/preonic/keymaps/default/README.md34
-rw-r--r--keyboard/preonic/keymaps/default/keymap.c92
-rw-r--r--keyboard/preonic/keymaps/lock/README.md3
-rw-r--r--keyboard/preonic/keymaps/lock/keymap.c105
-rw-r--r--keyboard/preonic/keymaps/nerdgasm/README.md34
-rw-r--r--keyboard/preonic/keymaps/nerdgasm/keymap.c117
-rw-r--r--keyboard/preonic/preonic.c41
-rw-r--r--keyboard/preonic/preonic.h51
-rw-r--r--keyboard/preonic/preonic_music.hex1713
11 files changed, 2195 insertions, 2 deletions
diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile
index 89c48e50a9..664aff7321 100644
--- a/keyboard/preonic/Makefile
+++ b/keyboard/preonic/Makefile
@@ -139,8 +139,8 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-# MIDI_ENABLE = YES # MIDI controls
-# AUDIO_ENABLE = YES # Audio output on port C6
+MIDI_ENABLE = YES # MIDI controls
+AUDIO_ENABLE = YES # Audio output on port C6
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time.
diff --git a/keyboard/preonic/flash-pcb.sh b/keyboard/preonic/flash-pcb.sh
new file mode 100755
index 0000000000..8b59b83f5e
--- /dev/null
+++ b/keyboard/preonic/flash-pcb.sh
@@ -0,0 +1,3 @@
+dfu-programmer atmega32u4 erase --force
+dfu-programmer atmega32u4 flash preonic_pcb.hex
+dfu-programmer atmega32u4 reset \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/default/README.md b/keyboard/preonic/keymaps/default/README.md
new file mode 100644
index 0000000000..d2f43bbdb8
--- /dev/null
+++ b/keyboard/preonic/keymaps/default/README.md
@@ -0,0 +1,34 @@
+# The Default Planck Layout
+
+ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QW] = { /* Qwerty */
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_CM] = { /* Colemak */
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_DV] = { /* Dvorak */
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ },
+ [_LW] = { /* LOWER */
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ }
+ }; \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/default/keymap.c b/keyboard/preonic/keymaps/default/keymap.c
new file mode 100644
index 0000000000..7846707848
--- /dev/null
+++ b/keyboard/preonic/keymaps/default/keymap.c
@@ -0,0 +1,92 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "preonic.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_CM] = { /* Colemak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_DV] = { /* Dvorak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_LW] = { /* LOWER */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+float start_up[][2] = {
+ {440.0*pow(2.0,(67)/12.0), 600},
+ {440.0*pow(2.0,(64)/12.0), 400},
+ {440.0*pow(2.0,(55)/12.0), 400},
+ {440.0*pow(2.0,(60)/12.0), 400},
+ {440.0*pow(2.0,(64)/12.0), 1000},
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+#ifdef AUDIO_ENABLE
+ init_notes();
+ play_notes(&start_up, 5, false);
+#endif
+}
diff --git a/keyboard/preonic/keymaps/lock/README.md b/keyboard/preonic/keymaps/lock/README.md
new file mode 100644
index 0000000000..d21cb990b0
--- /dev/null
+++ b/keyboard/preonic/keymaps/lock/README.md
@@ -0,0 +1,3 @@
+# Lock layout
+
+This layout is designed for having a lock switch in the lower-left-hand corner, and for experimenting with MIDI/audio features. It's constantly in development, so don't expect anything to work/be documented correctly! \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/lock/keymap.c b/keyboard/preonic/keymaps/lock/keymap.c
new file mode 100644
index 0000000000..cfb7f08035
--- /dev/null
+++ b/keyboard/preonic/keymaps/lock/keymap.c
@@ -0,0 +1,105 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "preonic.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+#include "action_layer.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+#define _MI 5
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_CM] = { /* Colemak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_DV] = { /* Dvorak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_LW] = { /* LOWER */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_MI] = { /* MIDI */
+ {MIDI12},
+ {MIDI12},
+ {MIDI12},
+ {MIDI12},
+ {M(0), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MIDI, MIDI, MIDI, MIDI}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+float start_up[][2] = {
+ {440.0*pow(2.0,(67)/12.0), 600},
+ {0, 50},
+ {440.0*pow(2.0,(64)/12.0), 400},
+ {0, 50},
+ {440.0*pow(2.0,(55)/12.0), 400},
+ {0, 50},
+ {440.0*pow(2.0,(60)/12.0), 400},
+ {0, 50},
+ {440.0*pow(2.0,(64)/12.0), 1000},
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ default_layer_state = 1<<5;
+ } else {
+ unregister_code(KC_RSFT);
+ default_layer_state = 1<<0;
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+ init_notes();
+ play_notes(&start_up, 9, false);
+}
diff --git a/keyboard/preonic/keymaps/nerdgasm/README.md b/keyboard/preonic/keymaps/nerdgasm/README.md
new file mode 100644
index 0000000000..d2f43bbdb8
--- /dev/null
+++ b/keyboard/preonic/keymaps/nerdgasm/README.md
@@ -0,0 +1,34 @@
+# The Default Planck Layout
+
+ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QW] = { /* Qwerty */
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_CM] = { /* Colemak */
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_DV] = { /* Dvorak */
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+ },
+ [_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ },
+ [_LW] = { /* LOWER */
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+ }
+ }; \ No newline at end of file
diff --git a/keyboard/preonic/keymaps/nerdgasm/keymap.c b/keyboard/preonic/keymaps/nerdgasm/keymap.c
new file mode 100644
index 0000000000..818102fbdc
--- /dev/null
+++ b/keyboard/preonic/keymaps/nerdgasm/keymap.c
@@ -0,0 +1,117 @@
+// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
+// this is the style you want to emulate.
+
+#include "preonic.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QW 0
+#define _CM 1
+#define _DV 2
+#define _LW 3
+#define _RS 4
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_QW] = { /* Qwerty */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
+ {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_CM] = { /* Colemak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
+ {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
+ {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_DV] = { /* Dvorak */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
+ {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
+ {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
+ {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
+},
+[_RS] = { /* RAISE */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+[_LW] = { /* LOWER */
+ {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
+ {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+ {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+ {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
+ {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+// Guitar Notes
+#define N_E 13180.5
+#define N_B 9870.8
+#define N_G 15680.0
+#define N_D 11740.7
+#define N_E 13180.5
+
+float start_up[][2] = {
+ { N_E, 500 },
+ { 0, 50 },
+ { N_E, 500 },
+ { 0, 50 },
+ { N_E, 500 },
+ { 0, 50 },
+ { N_B, 500 },
+ { 0, 50 },
+ { N_E, 1000 },
+ { 0, 50 },
+ { N_G, 1500 },
+ { 0, 50 },
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+ case 0:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+void matrix_init_user(void) {
+#ifdef AUDIO_ENABLE
+ init_notes();
+ play_notes(&start_up, 12, false);
+#endif
+}
+
+void process_action_user(keyrecord_t *record) {
+#ifdef AUDIO_ENABLE
+ if (record->event.pressed) {
+ float keypress[][2] = {
+ {440.0*pow(2.0,(record->event.key.col*7)/12.0), 600}
+ };
+ play_notes(&keypress, 1, false);
+ }
+#endif
+}
diff --git a/keyboard/preonic/preonic.c b/keyboard/preonic/preonic.c
new file mode 100644
index 0000000000..f639f247a5
--- /dev/null
+++ b/keyboard/preonic/preonic.c
@@ -0,0 +1,41 @@
+#include "preonic.h"
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+
+};
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+
+};
+
+__attribute__ ((weak))
+void process_action_user(keyrecord_t *record) {
+
+};
+
+void matrix_init_kb(void) {
+ #ifdef BACKLIGHT_ENABLE
+ backlight_init_ports();
+ #endif
+
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_init();
+ #endif
+
+
+ // Turn status LED on
+ DDRE |= (1<<6);
+ PORTE |= (1<<6);
+
+ matrix_init_user();
+};
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+};
+
+void process_action_kb(keyrecord_t *record) {
+ process_action_user(record);
+} \ No newline at end of file
diff --git a/keyboard/preonic/preonic.h b/keyboard/preonic/preonic.h
new file mode 100644
index 0000000000..51ed9ba393
--- /dev/null
+++ b/keyboard/preonic/preonic.h
@@ -0,0 +1,51 @@
+#ifndef PREONIC_H
+#define PREONIC_H
+
+#include "matrix.h"
+#include "keymap_common.h"
+#ifdef BACKLIGHT_ENABLE
+ #include "backlight.h"
+#endif
+#ifdef RGBLIGHT_ENABLE
+ #include "rgblight.h"
+#endif
+#include <stddef.h>
+#ifdef MIDI_ENABLE
+ #include <keymap_midi.h>
+#endif
+
+#define PREONIC_MIT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k45, k47, k48, k49, k4a, k4b } \
+}
+
+#define PREONIC_GRID( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b } \
+}
+
+void matrix_init_user(void);
+void matrix_scan_user(void);
+void process_action_kb(keyrecord_t *record);
+
+#endif
diff --git a/keyboard/preonic/preonic_music.hex b/keyboard/preonic/preonic_music.hex
new file mode 100644
index 0000000000..603693bffb
--- /dev/null
+++ b/keyboard/preonic/preonic_music.hex
@@ -0,0 +1,1713 @@
+:100000000C9410030C9454030C9454030C94540358
+:100010000C9454030C9454030C9454030C94540304
+:100020000C9454030C9454030C9410170C94E21782
+:100030000C94BD290C9454030C9454030C94540355
+:100040000C9454030C9454030C9454030C945403D4
+:100050000C9454030C942A2A0C9454030C945403C7
+:100060000C9454030C9454030C9454030C945403B4
+:100070000C9454030C9454030C9454030C945403A4
+:100080000C94440E0C9454030C9454030C94540399
+:100090000C9454030C9454030C9454030C94540384
+:1000A0000C9454030C9454030C9454030763423689
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
+:1000D0000000803F08000000BE922449123EABAAF7
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
+:1000F000AA3E00000000BF000000803F000000009A
+:1001000000084178D3BB4387D1133D190E3CC3BDD2
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
+:1001200080EFFFBE01C4FF7F3F00000000003500EC
+:100130001E001F00200021002200230024002500B3
+:10014000260027002A002B0014001A0008001500C2
+:1001500017001C0018000C00120013002A002900D0
+:1001600004001600070009000A000B000D000E0035
+:100170000F0033003400E1001D001B0006001900D1
+:10018000050011001000360037003800280000304C
+:10019000E000E200E30003522C002C000452500067
+:1001A000510052004F0035001E001F0020002100AA
+:1001B0002200230024002500260027002A002B000F
+:1001C00014001A00090013000A000D000F001800A7
+:1001D0001C0033002A002900040015001600170037
+:1001E00007000B00110008000C0012003400E100B1
+:1001F0001D001B000600190005000E00100036004F
+:100200003700380028000030E000E200E30003522D
+:100210002C002C0004525000510052004F003500B9
+:100220001E001F00200021002200230024002500C2
+:10023000260027002A002B00340036003700130068
+:100240001C0009000A00060015000F002A00290002
+:1002500004001200080018000C0007000B00170033
+:10026000110016003800E100330014000D000E00EC
+:100270001B00050010001A0019001D0028000030A6
+:10028000E000E200E30003522C002C000452500076
+:10029000510052004F0035001E001F0020002100B9
+:1002A0002200230024002500260027002A00350212
+:1002B0001E021F0220022102220223022402250222
+:1002C000260227022A0001003A003B003C003D00C4
+:1002D0003E003F002D022E022F02300231020100AB
+:1002E00040004100420043004400450000530153D8
+:1002F0000253005001000100010001000100010053
+:10030000010001000100AB00AA00A900AE00350009
+:100310001E001F00200021002200230024002500D1
+:10032000260027002A0035001E001F0020002100A3
+:100330002200230024002500260027002A000100B7
+:100340003A003B003C003D003E003F002D002E00E7
+:100350002F00300031000100400041004200430006
+:1003600044004500005301530253005001000100B6
+:100370000100010001000100010001000100AB00CB
+:10038000AA00A900AE00006000600060006000608C
+:10039000006000600060006000600060006000605D
+:1003A000006000600060006000600060006000604D
+:1003B000006000600060006000600060006000603D
+:1003C000006000600060006000600060006000602D
+:1003D000006000600060006000600060006000601D
+:1003E00000600060006000300100010001000100B9
+:1003F00001000100010000600060006000602A034D
+:1004000054006800650020005000720065006F0015
+:100410006E006900630020004B00650079006200F7
+:100420006F0061007200640000002C034F00720036
+:10043000740068006F006C0069006E006500610068
+:10044000720020004B006500790062006F006100BF
+:100450007200640073000000040309040902D00064
+:10046000060100A0FA0904000001030101000921AE
+:1004700011010001223F000705810308000A090459
+:1004800001000103010200092111010001224D00B8
+:100490000705820308000A090402000103000000A6
+:1004A0000921110100012236000705830308000A13
+:1004B00009040300020300000009211101000122C8
+:1004C0002000070584032000010705040320000124
+:1004D00009040400000101000009240100010900D1
+:1004E00001050904050002010300000724010001C1
+:1004F0004100062402010100062402020200092430
+:1005000003010301020100092403020401010100A7
+:100510000905060240000500000525010101090545
+:1005200085024000050000052501010312011001AC
+:1005300000000008EDFE61600100010200010631CB
+:10054000FF0974A1010975150025FF952075088123
+:10055000020976150025FF952075089102C0050156
+:100560000980A101850216010026B7001A01002AA0
+:10057000B700751095018100C0050C0901A1018526
+:1005800003160100269C021A01002A9C0275109590
+:10059000018100C005010902A1010901A1000509AD
+:1005A000190129051500250195057501810295019F
+:1005B000750381010501093009311581257F9502F7
+:1005C0007508810609381581257F95017508810612
+:1005D000050C0A38021581257F950175088106C032
+:1005E000C005010906A101050719E029E715002545
+:1005F00001950875018102950175088101050819A9
+:100600000129059505750191029501750391010573
+:1006100007190029FF150025FF950675088100C000
+:1006200011241FBECFEFDAE0DEBFCDBF04B603FE5C
+:1006300024C08091050490910604A0910704B09114
+:1006400008048730904BA740B04BB9F410920504D2
+:1006500010920604109207041092080414BE84B786
+:10066000877F84BF88E10FB6F89480936000109272
+:1006700060000FBEE0E0F8E3099512E0A0E0B1E011
+:10068000E6ECF9E602C005900D92A832B107D9F761
+:1006900014E0A8E2B2E001C01D92A530B107E1F775
+:1006A0000E94C8130C94E1340C94000061111DC029
+:1006B000FC018281882351F085EE0E94901E0E94E9
+:1006C000BC3080E290E0A0E0B0E007C085EE0E9480
+:1006D000581F81E090E0A0E0B0E08093E1029093A9
+:1006E000E202A093E302B093E40280E090E0089578
+:1006F0000E94370E40E050E069E070E080E091E059
+:100700000C94880F08950E948B036E9A769A0C942D
+:1007100078030C948203279A2F988FEF9FEF909382
+:100720008700809386008AE08093800089E180932F
+:1007300081000C94653081110BC080918000877F0F
+:100740008093800010928D0010928C002F98089555
+:100750002F98833041F480918000886080938000DE
+:100760008FEF9FEF12C0909180009860909380006F
+:1007700023E030E0281B3109220F331F8FEF9FEF5A
+:1007800002C0969587952A95E2F790938D00809305
+:100790008C0008958B3B910568F4883A910530F5FB
+:1007A000853A9105C0F48430910598F4019709F0D9
+:1007B0006FC071C0803E910508F46AC0883E910503
+:1007C00040F09C01205F31092031310508F060C004
+:1007D0005CC09C01A1C0853A910509F45FC0863ACE
+:1007E000910509F45EC023E830E496C0883A91058B
+:1007F00009F45AC0893A910509F459C08A3A910519
+:1008000009F458C08B3A910509F457C08C3A910508
+:1008100009F456C08D3A910509F455C0803B910505
+:1008200009F454C08E3A910509F453C08F3A9105EA
+:1008300009F452C0813B910509F451C0823B9105F6
+:1008400009F450C0833B910509F44FC0843B9105E6
+:1008500009F44EC0853B910509F44DC0863B9105D6
+:1008600009F44CC0873B910509F44BC0883B9105C6
+:1008700009F44AC0893B910509F449C08A3B9105B6
+:1008800009F048C02AE236E447C09C01306544C004
+:1008900020E030E041C021E030E03EC021E830E41B
+:1008A0003BC022E830E438C022EE34E435C029EE03
+:1008B00034E432C02AEE34E42FC025EB34E42CC0FB
+:1008C00026EB34E429C027EB34E426C02CEC34E4D6
+:1008D00023C02DEC34E420C023E835E41DC02AE811
+:1008E00035E41AC022E935E417C024E935E414C020
+:1008F00021E236E411C023E236E40EC024E236E4FD
+:100900000BC025E236E408C026E236E405C027E243
+:1009100036E402C020E034E4C90108959CE0799FE8
+:10092000F00111249CE3899FE00DF11D1124E60FD5
+:10093000F11DEE0FFF1FE25DFE4F25913491C901BD
+:100940000895880F991F82559040FC01259134919C
+:10095000C9010895880F991F825D9E4FFC01259162
+:100960003491C90108950E948E049C019A958115C5
+:100970009F4110F4C9010895C90190528115904119
+:1009800028F4C9019F700E94AA040895C9019053D8
+:100990008115904120F4C9019927906C0895C901EF
+:1009A0009054409728F4C9018F709927946D089549
+:1009B000203180E4380719F480E091ED0895213169
+:1009C00090E4390719F480E090ED0895223140E475
+:1009D000340719F480E092ED0895233180E438075C
+:1009E00019F480E093ED0895211590E53907A1F4FD
+:1009F0000E948B2340E065E088E491E00E94880F2C
+:100A00002FEF44E38CE0215040408040E1F700C0EC
+:100A100000000E944F2A1EC1213090E5390731F4B1
+:100A20008091F10281608093F10214C1C901905557
+:100A30008115904108F062C0432F55274F7055270C
+:100A400041305105F9F4C90174E0880F991F7A9576
+:100A5000E1F788279370B901E3E0660F771FEA9505
+:100A6000E1F760767727862B972B9C6823703327D6
+:100A700002C0440F551F2A95E2F74F715527842B6A
+:100A8000952B08954230510529F4922F8827816FC4
+:100A9000906A089543305105B9F4C90153E0880FB5
+:100AA000991F5A95E1F7807E97702370332741E0B4
+:100AB00050E002C0440F551F2A95E2F74F715527A9
+:100AC000842B952B9C6808954430510589F5C90104
+:100AD00043E0880F991F4A95E1F7807E9770237055
+:100AE000332741E050E002C0440F551F2A95E2F73A
+:100AF0004F715527842B952B9A680895C9019056FC
+:100B00008115904118F4C901906F0895C90190575B
+:100B10008115904120F4C9019F7090620895C90128
+:100B200090588115904120F4C9019F70906A0895F2
+:100B3000203E3105E0F4203C310568F521333105D4
+:100B400009F475C048F42932310509F46BC02A3222
+:100B5000310509F07BC075C02933310501F1223818
+:100B60003105E9F02533310509F070C051C0233E4D
+:100B70003105B1F140F4203E3105D1F0223E31057E
+:100B800009F064C01CC0263E310579F1273E3105CD
+:100B900009F05CC038C0C9010E94A1040895809189
+:100BA000020380FD02C081FF51C080EE90E04FC083
+:100BB0008091020380FFF9CF89E390E048C08091E3
+:100BC000020382FF0AC08091020384FF03C080E019
+:100BD00090E03DC083EE90E03AC082EE90E037C0F6
+:100BE0008091020382FFEFCFF8CF8091020383FF51
+:100BF00007C08091020384FDEACF87EE90E027C012
+:100C000086EE90E024C08091020383FFF2CFF8CFFC
+:100C10008091020385FF03C089E290E018C085E35C
+:100C200090E015C08091020385FDF9CFF5CF80914A
+:100C3000020386FF03C08AE290E009C081E390E0EE
+:100C400006C08091020386FDF9CFF5CFC9010E944D
+:100C5000CA030895089508950C942B065F926F922D
+:100C60007F928F929F92AF92BF92CF92DF92EF923C
+:100C7000FF920F931F93CF93DF93CDB7DEB72A97E1
+:100C80000FB6F894DEBF0FBECDBF9E012F5F3F4F62
+:100C90004E018BE0880E911C60E070E000E010E0F7
+:100CA000E12CF12CC12CD12CA12CB12C8AE0782E76
+:100CB000622E532E41E050E0E3E9F1E0A62DB52D80
+:100CC000872D01900D928A95E1F7F901819191911B
+:100CD0009F01FC01E07FFF27E032F10559F48F709E
+:100CE0009927FA0102C0EE0FFF1F8A95E2F7AE2A9C
+:100CF000BF2A37C0E033F10559F48F709927FA0104
+:100D000002C0EE0FFF1F8A95E2F7CE2ADF2A29C024
+:100D1000E034F10559F48F709927FA0102C0EE0F03
+:100D2000FF1F8A95E2F7EE2AFF2A1BC0E035F10586
+:100D300059F48F709927FA0102C0EE0FFF1F8A95B0
+:100D4000E2F70E2B1F2B0DC0E036F10551F48F702A
+:100D50009927FA0102C0EE0FFF1F8A95E2F76E2B6A
+:100D60007F2B2815390509F0A7CF94B18A2D8095DE
+:100D7000892384B985B18A2985B997B18C2D80954D
+:100D8000892387B988B18C2988B99AB18E2D80952D
+:100D900089238AB98BB18E298BB99DB1802F80951B
+:100DA00089238DB98EB1802B8EB990B3862F809513
+:100DB000892380BB81B3862B81BB2A960FB6F8941A
+:100DC000DEBF0FBECDBFDF91CF911F910F91FF907E
+:100DD000EF90DF90CF90BF90AF909F908F907F90DB
+:100DE0006F905F9008955F926F927F928F929F9223
+:100DF000AF92BF92CF92DF92EF92FF920F931F9329
+:100E0000CF93DF93CDB7DEB768970FB6F894DEBF08
+:100E10000FBECDBF85B7806885BF85B7806885BFA9
+:100E20000E942E069E012F5F3F4F4E0189E1880EE2
+:100E3000911C60E070E000E010E0E12CF12CC12C8E
+:100E4000D12CA12CB12C98E1792E622E532E41E0A9
+:100E500050E0EDE9F1E0A62DB52D872D01900D9222
+:100E60008A95E1F7F901819191919F01FC01E07F61
+:100E7000FF27E032F10559F48F709927FA0102C07B
+:100E8000EE0FFF1F8A95E2F7AE2ABF2A37C0E03384
+:100E9000F10559F48F709927FA0102C0EE0FFF1F78
+:100EA0008A95E2F7CE2ADF2A29C0E034F10559F409
+:100EB0008F709927FA0102C0EE0FFF1F8A95E2F7A3
+:100EC000EE2AFF2A1BC0E035F10559F48F709927EF
+:100ED000FA0102C0EE0FFF1F8A95E2F70E2B1F2BBF
+:100EE0000DC0E036F10551F48F709927FA0102C068
+:100EF000EE0FFF1F8A95E2F76E2B7F2B2815390521
+:100F000009F0A7CF94B18A2D8095892384B985B142
+:100F10008A2985B997B18C2D8095892387B988B1A5
+:100F20008C2988B99AB18E2D809589238AB98BB185
+:100F30008E298BB99DB1802F809589238DB98EB173
+:100F4000802B8EB990B3862F8095892380BB81B387
+:100F5000862B81BB10922902109228021092330234
+:100F60001092320210922B0210922A021092350235
+:100F70001092340210922D0210922C02109237021D
+:100F80001092360210922F0210922E021092390205
+:100F900010923802109231021092300210923B02ED
+:100FA00010923A0268960FB6F894DEBF0FBECDBF1E
+:100FB000DF91CF911F910F91FF90EF90DF90CF9035
+:100FC000BF90AF909F908F907F906F905F900C94A8
+:100FD00083035F926F927F928F929F92AF92BF92A4
+:100FE000CF92DF92EF92FF920F931F93CF93DF93F5
+:100FF000CDB7DEB7A2970FB6F894DEBF0FBECDBF58
+:101000007E0149E1E40EF11C22E3C22E22E0D22E41
+:101010005E0153E2A50EB11C3AE0532E470101E0F8
+:1010200010E048E1642E55E0752EE3E9F1E0D401CB
+:10103000852D01900D928A95E1F7F70181919191AB
+:101040007F019C01207F33272032310589F424B1B0
+:101050008F709927A80102C0440F551F8A95E2F7A7
+:10106000CA01242B24B995B18095892385B94FC035
+:101070002033310589F427B18F709927F80102C018
+:10108000EE0FFF1F8A95E2F7CF012E2B27B998B1FB
+:101090008095892388B93BC02034310589F42AB171
+:1010A0008F709927A80102C0440F551F8A