Browse Source

Updated gourdo1 GMMK Pro keymaps (#17873)

* Fixed Left Shift tapdance in general and for gaming mode. (#12)

* update ISO readme
* left shift fixed in general, including for gaming mode

* fixed toggle menu rendering on ISO layouts

* updated readme's and cosmetics

* update readme's

* update readme's again

* readme cosmetics

* consolidate readme's

* more readme cosmetics

* clarification for bootloader mode on ISO

* Autocorrect added with 400 word English dictionary (#13)

* autocorrect added with 400 word dictionary

* update readme's for autocorrect

* Add FN-B as shortcut to bootloader

* Update .gitignore

Co-authored-by: Joel Challis <git@zvecr.com>

* RGB changes to system numlock and ISO extended alphas

- hide system numlock off indicator (primarily for Mac users) by moving it to numpad and FN layers instead
- give users with extended alpha ISO languages a config option to add RGB highlights for extras alphas on capslock

* readme updates

* Fixed [FN]B and [FN]N shortcuts not working on numpad layer

Co-authored-by: Joel Challis <git@zvecr.com>
gourdo1 2 years ago
parent
commit
4c6ce12d2a

+ 37 - 8
keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/keymap.c

@@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c
+// Note: Many advanced functions referenced in this file are defined in /users/gourdo1/gourdo1.c
 
 #include QMK_KEYBOARD_H
 
@@ -52,7 +52,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          BELOWENC,
         KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,          KC_PGUP,
         CAPSNUM, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,           KC_PGDN,
-        LSFTCAPSWIN,      KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,
+        KC_LSFT,          KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,
         KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
     ),
 
@@ -76,10 +76,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     #ifdef GAME_ENABLE
     [_FN1] = LAYOUT(
         EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP,
-        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,
+        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,
         _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R,  QK_BOOT,           KC_HOME,
         KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______,          _______,           KC_END,
-        _______,          RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
+        _______,          RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
         _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
     ),
 
@@ -95,11 +95,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     #else
     [_FN1] = LAYOUT(
         EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP,
-        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,
+        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,
         _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, KC_PAUS, SWAP_L,  SWAP_R,  QK_BOOT,           KC_HOME,
         KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______,          _______,           KC_END,
-        _______,          RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
-        _______, KC_WINLCK, _______,                          _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
+        _______,          RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
+        _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
     ),
     #endif  //GAME_ENABLE
 
@@ -125,7 +125,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         _______, KC_P1,   KC_P2,   KC_P3,   KC_P4,   KC_P5,   KC_P6,   KC_P7,   KC_P8,   KC_P9,   KC_P0,   KC_PMNS, KC_PPLS, _______,          _______,
         _______, KC_PGUP, KC_UP,   KC_PGDN, KC_NO,   KC_NO,   KC_NO,   KC_P4,   KC_P5,   KC_P6,   KC_PPLS, _______, _______, _______,          KC_WH_U,
         _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,   KC_NO,   KC_P1,   KC_P2,   KC_P3,   KC_PAST, _______,          KC_PENT,          KC_WH_D,
-        _______,          KC_NO,   _______, _______, _______, KC_NO,   KC_NO,   KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2,
+        _______,          KC_NO,   _______, _______, _______, _______, _______, KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2,
         _______, _______, _______,                            KC_PENT,                            _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
     ),
 
@@ -253,6 +253,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         rgb_matrix_set_color(LED_F12, RGB_RED);
     }
 
+/*
     // System NumLock warning indicator RGB setup
     #ifdef INVERT_NUMLOCK_INDICATOR
     if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
@@ -271,6 +272,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         rgb_matrix_set_color(LED_FN, RGB_ORANGE2);
     }
     #endif // INVERT_NUMLOCK_INDICATOR
+*/
 
     // CapsLock RGB setup
     if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
@@ -348,12 +350,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         rgb_matrix_set_color(LED_R8, RGB_RED);
         rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);
         rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE);
+
+        // Indicator for paddle game enabled in build
         #ifdef GAME_ENABLE
         rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);
         #else
         rgb_matrix_set_color(LED_P, RGB_RED);
         #endif // GAME_ENABLE
 
+        // System NumLock warning indicator RGB setup
+        #ifdef INVERT_NUMLOCK_INDICATOR 
+        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #else
+        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #endif // INVERT_NUMLOCK_INDICATOR
+
         //Add RGB statuses for user.config toggles
         if (user_config.rgb_hilite_caps) {
         rgb_matrix_set_color(LED_1, RGB_GREEN);
@@ -395,6 +410,11 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         } else {
         rgb_matrix_set_color(LED_8, RGB_PURPLE);
         }
+        if (user_config.autocorrect) {
+        rgb_matrix_set_color(LED_9, RGB_GREEN);
+        } else {
+        rgb_matrix_set_color(LED_9, RGB_PURPLE);
+        }
 
         // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code
         uint16_t timeout_threshold = get_timeout_threshold();
@@ -411,6 +431,15 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
 
         // Numpad & Mouse Keys overlay RGB
     case _NUMPADMOUSE:
+        #ifdef INVERT_NUMLOCK_INDICATOR 
+        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #else
+        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #endif // INVERT_NUMLOCK_INDICATOR
         if (user_config.rgb_hilite_numpad) {
             for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {
                 rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE);

+ 48 - 61
keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/readme.md

@@ -1,69 +1,76 @@
-# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ANSI layout
+# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro Keyboard Layouts
 
-This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) GMMK Pro layout with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB effects and controls.
+These Windows-centric layouts are based on Jonavin's GMMK Pro [layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, Pascal Getreuer's [autocorrect](https://getreuer.info/posts/keyboards/autocorrection/), Tomas Guinan's [paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls and effects.
 
 ![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
 
-## Features:
+* Up-to-date [Changelog](https://github.com/gourdo1/gmmkpro-media/blob/main/changelog.md)
+* Latest [ANSI firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
+* Latest [ISO firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_iso_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
+* Printable Keyboard [Cheatsheet](https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf)
+
+## Features
 
 ### Core Functionality
 
-* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde key) to view toggle-able features. (added Jun 29, 2022)
-* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022)
+* Support for both [ANSI](https://keebnews.com/ansi-vs-iso/) and [ISO](https://keebnews.com/ansi-vs-iso/) keyboard layouts.
+* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde on ANSI; the key left of '1' on ISO layouts) to view toggle-able settings.
+* [VIA](https://www.caniusevia.com/) support enabled.
+* AutoCorrection:  Pascal Getreuer's AutoCorrect code incorporated with 400 word dictionary on words > 4 characters.
 * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled
 * [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R
-* 1000Hz polling rate with 5ms debounce time for quick response in games
-* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse
-* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry
-* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys
-* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time. (added Feb 25, 2022)
-* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor (added Apr 11, 2022)
-* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted)
-* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit (added May 5, 2022)
-* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/ (added May 14, 2022)
-* Single-handed shortcut for WinKey-L (lock Windows): [FN]L (added May 17, 2022)
-* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com. (added Apr 7, 2022)
-* FN-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md)
-* Home key on F13, Del key right of Backspace
-* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer)
+* 1000Hz polling rate with 5ms debounce time for quick response in games.
+* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse.
+* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry.
+* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys.
+* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time.
+* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor.
+* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted).
+* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit.
+* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/
+* Single-handed shortcut for WinKey-L (lock Windows): [FN]L
+* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com.
+* [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) accessible via [FN]Backslash for ANSI and FN(key next to Left Shift) for ISO
 * PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13
 * [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
-* Double tap ESC any time to revert to base layer (added Feb 26, 2022)
-* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022)
-* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022)
+* Double tap ESC any time to revert to base layer.
+* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes.
+* RGB backlight now remembers last color & effect settings after power down.
 
 ### Quick & Easy Customization
 * Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence.
-* Print current settings by opening a text editor and pressing [FN]~ (CAUTION: verbose!)
+* Print current settings by opening a text editor and pressing [FN]~ (the key left of '1' on ISO layout keyboards)
 * Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF)
 
 #### Toggle-able Settings:
-    1. CapsLock RGB - highlight under alpha keys
-    2. Numpad RGB - highlight under numpad layer keys
+    1. CapsLock RGB - Highlight under alpha keys
+    2. Numpad RGB - Highlight under numpad layer keys
     3. ESC key - Double tap ESC key to go to base layer
     4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC
     5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock
-    6. Encoder button - default mutes volume; alternate plays/pauses media
+    6. Encoder button - Default mutes volume; alternate plays/pauses media
     7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL
     8. Modded-Space override - Use standard Space in place of modded-Space functions
+    9. AutoCorrect - Internal (English) AutoCorrect; default is enabled
+    0. (ISO layouts only) CapsLock highlights extended alpha keys
 
 ### Numpad + Mouse Keys (Capslock key)
 
 * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting
-* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022)
+* Numpad uses Space-bar as Enter for rapid number entry.
 * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)
 * FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)
 * Double zero on comma key.
-* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022)
+* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard.
 * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel
 * Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green
 
 ### Encoder Functionality
 
 * Default knob turn changes volume; button press toggles mute
-* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022)
+* Exponential encoder: quick repeated volume up doubles increase; quick repeated volume down triples decrease.
 * FN + knob turn changes RGB idle timeout
-* FN + knob push puts PC to Sleep (Added May 14, 2022)
+* FN + knob push puts PC to Sleep
 * holding Left Shift changes layers
 * holding Right Shift navigates page up/down
 * holding Left Ctrl navigates prev/next word
@@ -86,44 +93,24 @@ This Windows-centric ANSI layout is based on [Jonavin's](https://github.com/qmk/
 * RGB backlight effect speed: [FN]left/right
 * RGB backlight hue cycle: [FN]A/D
 * RGB backlight brightness: [FN]W/S
-* RGB backlight saturation: [FN]Q/E (added Feb 4, 2022)
+* RGB backlight saturation: [FN]Q/E
 * RGB backlight night mode toggle: [FN]Z (indicators still work)
-* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes) (updated June 28, 2022)
+* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes)
     *  F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes
 * [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle
-* Left side RGB indicators in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green).
+* Left side RGB indicators in order from top: Scroll Lock (red), Numpad (blue), Capslock (green).
 
 ### Advanced Controls
 
-* [FN]\ to get to bootloader mode
-* [FN][ESC] to clear EEPROM (added Apr 11, 2022)
-* [FN]R to toggle N-key Rollover (added Apr 11, 2022)
-* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022)
-* [FN]L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022)
-* [FN][Encoder press] to sleep Windows PC (added May 14, 2022)
-
-Link to latest firmware binary: https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin
-
-Link to cheatsheet: https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf
-
-
-## rules.mk Options
-
-STARTUP_NUMLOCK_ON = yes             - Turns on NUMLOCK by default
-
-ENCODER_DEFAULTACTIONS_ENABLE = yes  - Enabled default encoder functions
-
-TD_LSFT_CAPSLOCK_ENABLE = yes        - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS
-
-IDLE_TIMEOUT_ENABLE = yes            - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically
-
-INVERT_NUMLOCK_INDICATOR             - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should  be off when numpad layer is active unless you have an external numpad.
-
-COLEMAK_LAYER_ENABLE = yes           - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
-
-GAME_ENABLE ?= yes                   - Enables Paddle Game
+* [FN]\ or [FN]B to get to bootloader mode (use key next to Left Shift on ISO)
+* [FN][ESC] to clear EEPROM
+* [FN]R to toggle N-key Rollover
+* [FN]N to toggle system numlock
+* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete
+* [FN]L is single-handed shortcut to Win-L (lock Windows)
+* [FN][Encoder press] to sleep Windows PC
 
-## Layer Diagrams
+## Layer Diagrams (ANSI)
 ### Base layer
 ![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/base.png)
 

+ 1 - 1
keyboards/gmmk/pro/rev1/ansi/keymaps/gourdo1/rules.mk

@@ -5,7 +5,7 @@ BOOTMAGIC_ENABLE = yes         # Enable Bootmagic Lite
 VIA_ENABLE = yes
 
 MOUSEKEY_ENABLE = yes
-TAP_DANCE_ENABLE = yes
+TAP_DANCE_ENABLE = no
 CAPS_WORD_ENABLE = yes         # Enable built-in Caps Word functionality
 IDLE_TIMEOUT_ENABLE = yes
 STARTUP_NUMLOCK_ON = yes

+ 52 - 11
keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/keymap.c

@@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-// Note: Several advanced functions referenced in this file (like Tap Dance functions) are defined in /users/gourdo1/gourdo1.c
+// Note: Many advanced functions referenced in this file are defined in /users/gourdo1/gourdo1.c
 
 #include QMK_KEYBOARD_H
 
@@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          BELOWENC,
         KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,                   KC_PGUP,
         CAPSNUM, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,           KC_PGDN,
-        LSFTCAPSWIN,KC_NUBS, KC_Z, KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,
+        KC_LSFT, KC_NUBS, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          KC_RSFT, KC_UP,   KC_END,
         KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, MO(_FN1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
     ),
 
@@ -68,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
      * |---------+------+------+------+------+------+------+------+------+------+------+------+------+       ++------|
      * |  Capslock  |RGBHUD|RGBVAD|RGBHUI| ____|GMAIL |HTMAIL| ____ | ____ | ____ | ____ | ____ | ___ | ____ || End  |
      * |------------+------+------+------+-----+------+------+------+------+------+------+------|----+========+------|
-     * |  ____ |RESET |RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD  | ______ ||RGBMOD|| ____ |
+     * | ____ |QK_BOOT|RGBNIT| ____ | ____ | ____ | ____ |NumLk | ____ | ____ |DOTCOM| CAD  | ______ ||RGBMOD|| ____ |
      * |--------------+------+------+------+------+------+------+------+------+------+------+--+=====++------++======|
      * |  ____  | WinKyLk |  ____  |               _____                  | ____ | ____ | ____ ||RGBSPD|RGBRMD|RGBSPI|
      * `------------------------------------------------------------------------------------------------------------'
@@ -77,10 +77,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     #ifdef GAME_ENABLE
     [_FN1] = LAYOUT(
         EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP,
-        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,
+        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR,TG_ENGCAP,RGB_TOD,RGB_TOI, _______,           RGB_TOG,
         _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, TG(_GAME),SWAP_L, SWAP_R,                     KC_HOME,
         KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______, _______, _______,           KC_END,
-        _______, RESET,   RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
+        _______, QK_BOOT, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
         _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
     ),
 
@@ -96,11 +96,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     #else
     [_FN1] = LAYOUT(
         EE_CLR,  KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MNXT, KC_MPLY, KC_MSTP, KC_VOLD, KC_VOLU, KC_PSCR, KC_SLCK, KC_PAUS,           KC_SLEP,
-        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD, _______, _______, RGB_TOD, RGB_TOI, _______,           RGB_TOG,
+        PRNCONF, TG_CAPS, TG_PAD,  TG_ESC,  TG_DEL,  TG_TDCAP,TG_ENC,  TG_INS,TG_SPCMOD,TG_AUTOCR,TG_ENGCAP,RGB_TOD,RGB_TOI, _______,           RGB_TOG,
         _______, RGB_SAD, RGB_VAI, RGB_SAI, NK_TOGG, _______, YAHOO,   _______, _______, OUTLOOK, KC_PAUS, SWAP_L,  SWAP_R,                     KC_HOME,
         KC_CAPS, RGB_HUD, RGB_VAD, RGB_HUI, _______, GMAIL,   HOTMAIL, _______, _______, LOCKPC,  _______, _______, _______, _______,           KC_END,
-        _______, RESET,   RGB_NITE,_______, _______, _______, _______, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
-        _______, KC_WINLCK, _______,                          _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
+        _______, QK_BOOT, RGB_NITE,_______, _______, _______, QK_BOOT, KC_NLCK, _______, _______, DOTCOM,  KC_CAD,           _______, RGB_MOD,  _______,
+        _______, WINLOCK, _______,                            _______,                            _______, _______, _______, RGB_SPD, RGB_RMOD, RGB_SPI
     ),
     #endif  //GAME_ENABLE
 
@@ -126,7 +126,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
         _______, KC_P1,   KC_P2,   KC_P3,   KC_P4,   KC_P5,   KC_P6,   KC_P7,   KC_P8,   KC_P9,   KC_P0,   KC_PMNS, KC_PPLS, _______,          _______,
         _______, KC_PGUP, KC_UP,   KC_PGDN, KC_NO,   KC_NO,   KC_NO,   KC_P4,   KC_P5,   KC_P6,   KC_PPLS, _______, _______,                   KC_WH_U,
         _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,   KC_NO,   KC_NO,   KC_P1,   KC_P2,   KC_P3,   KC_PAST, _______, _______, KC_PENT,          KC_WH_D,
-        _______, _______, KC_NO,   _______, _______, _______, KC_NO,   KC_NO,   KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2,
+        _______, _______, KC_NO,   _______, _______, _______, _______, _______, KC_P0,   KC_00,   KC_PDOT, KC_PSLS,          KC_BTN1, KC_MS_U, KC_BTN2,
         _______, _______, _______,                            KC_PENT,                            _______, _______, KC_BTN3, KC_MS_L, KC_MS_D, KC_MS_R
     ),
 
@@ -254,6 +254,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         rgb_matrix_set_color(LED_F12, RGB_RED);
     }
 
+/*
     // System NumLock warning indicator RGB setup
     #ifdef INVERT_NUMLOCK_INDICATOR
     if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
@@ -272,12 +273,20 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         rgb_matrix_set_color(LED_FN, RGB_ORANGE2);
     }
     #endif // INVERT_NUMLOCK_INDICATOR
+*/
 
     // CapsLock RGB setup
     if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
         if (user_config.rgb_hilite_caps) {
-            for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) {
-                rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE);
+            if (user_config.rgb_english_caps) {
+                for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS); i++) {
+                    rgb_matrix_set_color(LED_LIST_LETTERS[i], RGB_CHARTREUSE);
+                }
+            }
+            else {
+                for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_LETTERS_DE); i++) {
+                    rgb_matrix_set_color(LED_LIST_LETTERS_DE[i], RGB_CHARTREUSE);
+                }
             }
             rgb_matrix_set_color(LED_L7, RGB_CHARTREUSE);
             rgb_matrix_set_color(LED_L8, RGB_CHARTREUSE);
@@ -349,12 +358,25 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         rgb_matrix_set_color(LED_R8, RGB_RED);
         rgb_matrix_set_color(LED_MINS, RGB_OFFBLUE);
         rgb_matrix_set_color(LED_EQL, RGB_OFFBLUE);
+
+        // Indicator for paddle game enabled in build
         #ifdef GAME_ENABLE
         rgb_matrix_set_color(LED_P, RGB_CHARTREUSE);
         #else
         rgb_matrix_set_color(LED_P, RGB_RED);
         #endif // GAME_ENABLE
 
+        // System NumLock warning indicator RGB setup
+        #ifdef INVERT_NUMLOCK_INDICATOR 
+        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #else
+        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #endif // INVERT_NUMLOCK_INDICATOR
+
         //Add RGB statuses for user.config toggles
         if (user_config.rgb_hilite_caps) {
         rgb_matrix_set_color(LED_1, RGB_GREEN);
@@ -396,6 +418,16 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
         } else {
         rgb_matrix_set_color(LED_8, RGB_PURPLE);
         }
+        if (user_config.autocorrect) {
+        rgb_matrix_set_color(LED_9, RGB_GREEN);
+        } else {
+        rgb_matrix_set_color(LED_9, RGB_PURPLE);
+        }
+        if (user_config.rgb_english_caps) {
+        rgb_matrix_set_color(LED_0, RGB_GREEN);
+        } else {
+        rgb_matrix_set_color(LED_0, RGB_PURPLE);
+        }
 
         // Add RGB Timeout Indicator -- shows 0 to 139 using F row and num row; larger numbers using 16bit code
         uint16_t timeout_threshold = get_timeout_threshold();
@@ -412,6 +444,15 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
 
         // Numpad & Mouse Keys overlay RGB
     case _NUMPADMOUSE:
+        #ifdef INVERT_NUMLOCK_INDICATOR 
+        if (!IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // on if NUM lock is OFF to bring attention to overlay numpad not functional when enabled
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #else
+        if (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) { // Normal, on if NUM lock is ON
+            rgb_matrix_set_color(LED_N, RGB_ORANGE2);
+        }
+        #endif // INVERT_NUMLOCK_INDICATOR
         if (user_config.rgb_hilite_numpad) {
             for (uint8_t i = 0; i < ARRAYSIZE(LED_LIST_NUMPAD); i++) {
                 rgb_matrix_set_color(LED_LIST_NUMPAD[i], RGB_OFFBLUE);

+ 77 - 75
keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/readme.md

@@ -1,54 +1,76 @@
-# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro ISO layout
+# [gourdo1's](mailto:gourdo1@outlook.com) GMMK Pro Keyboard Layouts
 
-This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/iso/keymaps/jonavin) GMMK Pro layout with several additions, fixes, a tweaked keymap, updated layers, [Tomas Guinan's paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls.
+These Windows-centric layouts are based on Jonavin's GMMK Pro [layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/jonavin) with many additions, fixes, a revamped keymap, persistent user customizations, updated layers, Pascal Getreuer's [autocorrect](https://getreuer.info/posts/keyboards/autocorrection/), Tomas Guinan's [paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame) and expanded RGB controls and effects.
 
 ![image](https://raw.githubusercontent.com/gourdo1/media/main/susuwatari.jpg)
 
-## Features:
+* Up-to-date [Changelog](https://github.com/gourdo1/gmmkpro-media/blob/main/changelog.md)
+* Latest [ANSI firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
+* Latest [ISO firmware](https://github.com/gourdo1/gmmkpro-media/raw/main/gmmk_pro_rev1_iso_gourdo1.bin) download. (Flash with [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases))
+* Printable Keyboard [Cheatsheet](https://github.com/gourdo1/gmmkpro-media/raw/main/GMMK_Pro_Cheatsheet.pdf)
+
+## Features
 
 ### Core Functionality
 
-* ISO layout (added July xx, 2022)
-* [VIA](https://www.caniusevia.com/) support enabled (added Mar 16, 2022)
+* Support for both [ANSI](https://keebnews.com/ansi-vs-iso/) and [ISO](https://keebnews.com/ansi-vs-iso/) keyboard layouts.
+* Quick & Easy Customization: Open a text editor and hit [FN]` (tilde on ANSI; the key left of '1' on ISO layouts) to view toggle-able settings.
+* [VIA](https://www.caniusevia.com/) support enabled.
+* AutoCorrection:  Pascal Getreuer's AutoCorrect code incorporated with 400 word dictionary on words > 4 characters.
 * Most [default Glorious shortcuts](https://cdn.shopify.com/s/files/1/0549/2681/files/GMMK_Pro_User_Guide.pdf) enabled
-* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with Fn+R
-* 1000Hz polling rate with 5ms debounce time for quick response in games
-* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you on the road? Use cursor keys to move the mouse.
-* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry
-* Gaming mode (Fn+Win-key) locks out Win-key as well as double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming related keys
-* [Caps Word](https://getreuer.info/posts/keyboards/caps-word/index.html) enabled: To capitalize the next word only, press and release both left and right shift keys at the same time. (added Feb 25, 2022)
-* Multi-monitor app moving shortcuts: Fn+[,] (square brackets) to move current app window to next monitor (added Apr 11, 2022)
-* Capslock toggled by double tap of Left Shift key or Fn + Capslock (RGB green highlighted)
-* Paddle game accessible via Fn+P; Hit Fn+P again or double tap ESC to exit (added May 5, 2022)
-* Single-handed shortcut for Ctrl-Alt-Delete: Fn+/ (added May 14, 2022)
-* Single-handed shortcut for Win-L (lock Windows): Fn+L (added May 17, 2022)
-* Domain shortcuts: Fn+.=".com", Fn+O="outlook.com", Fn+Y="yahoo.com", Fn+H="hotmail.com", Fn+G="gmail.com". (added Apr 7, 2022)
-* Fn-Backslash for [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md)
-* Home key on F13, Del key right of Backspace
-* Insert accessible via Shift-Backspace (so shift delete still works in Windows Explorer)
-* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: Fn+F11, Fn+F12, Fn+F13
-* [Colemak](https://colemak.com/) key layout support (Layer accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
-* Double tap ESC any time to revert to base layer (added Feb 26, 2022)
-* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes (updated May 24, 2022)
-* RGB backlight now remembers last color & effect settings after power down (updated May 24, 2022)
+* [N-key Rollover](https://en.wikipedia.org/wiki/Rollover_\(keyboard\)#n-key_rollover) (NKRO) -- toggled with [FN]R
+* 1000Hz polling rate with 5ms debounce time for quick response in games.
+* Mouse Keys! Don't want to move your hands off the keyboard or you didn't bring it with you? Use cursor keys to move the mouse.
+* Overlay numpad on 789-UIOP-JKL;-M,. & Space-bar mapped to Enter key for rapid number entry.
+* Gaming mode ([FN]Win-key) locks out Win-key and double-tap Shift Capslock; Also RGB highlights WSAD and nearby gaming keys.
+* Caps Word enabled: To capitalize the next word only, press and release left and right shift at the same time.
+* Multi-monitor app moving shortcuts: [FN] ],[ (square brackets) to move current app window to next monitor.
+* Capslock toggled by double tap of Left Shift key or FN + Capslock (RGB green highlighted).
+* Paddle game accessible via [FN]P. Hit [FN]P again or double tap [ESC] to exit.
+* Single-handed shortcut for Ctrl-Alt-Delete: [FN]/
+* Single-handed shortcut for WinKey-L (lock Windows): [FN]L
+* Domain shortcuts: [FN]. for .com, [FN]O for outlook.com, [FN]Y for yahoo.com, [FN]H for hotmail.com, [FN]G for gmail.com.
+* [Bootloader mode](https://github.com/qmk/qmk_firmware/blob/master/docs/newbs_flashing.md) accessible via [FN]Backslash for ANSI and FN(key next to Left Shift) for ISO
+* PrtScrn, Scroll Lock, Pause/Break are top right on the keyboard: [FN]F11, [FN]F12, [FN]F13
+* [Colemak](https://colemak.com/) key layout support (Accessible via Left Shift + turn Encoder clockwise until side LEDs light up purple)
+* Double tap ESC any time to revert to base layer.
+* RGB backlight effects expanded to include framebuffer effects and reactive keypress modes.
+* RGB backlight now remembers last color & effect settings after power down.
+
+### Quick & Easy Customization
+* Below features can be toggled by holding [FN] and pressing the number corresponding to that feature. Changes are saved to EEPROM for persistence.
+* Print current settings by opening a text editor and pressing [FN]~ (the key left of '1' on ISO layout keyboards)
+* Quick view current settings by holding [FN] and viewing RGB under number keys (green means ON, violet means OFF)
+
+#### Toggle-able Settings:
+    1. CapsLock RGB - Highlight under alpha keys
+    2. Numpad RGB - Highlight under numpad layer keys
+    3. ESC key - Double tap ESC key to go to base layer
+    4. Swap DEL and HOME - Default is DEL to the right of BKSPC & HOME is above BKSPC
+    5. Capslock function - Toggle between double tap LShift for CapsLock with Numpad on CapsLock key (default) and standard CapsLock
+    6. Encoder button - Default mutes volume; alternate plays/pauses media
+    7. Insert function - Toggle between SHIFT-BKSPC and SHIFT-DEL
+    8. Modded-Space override - Use standard Space in place of modded-Space functions
+    9. AutoCorrect - Internal (English) AutoCorrect; default is enabled
+    0. (ISO layouts only) CapsLock highlights extended alpha keys
 
 ### Numpad + Mouse Keys (Capslock key)
 
 * Overlay numpad + [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) are accessed through Capslock key hold (temp) or double press (locked) with RGB highlighting
-* Numpad uses Space-bar as Enter for rapid number entry (added May 17, 2022)
+* Numpad uses Space-bar as Enter for rapid number entry.
 * This layer disables much of the keyboard, except X/C/V for cut/copy/paste, WASD for cursor, Q/E for PgUp/PgDn, cursor keys become mouse keys, surrounding keys become mouse buttons and all number keys become numpad versions (so Alt char codes work regardless of which set you use)
-* Fn and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output (Fn+N to toggle)
+* FN and N keys light up orange if system numlock is off (inverted status), indicating numpad keys will not deliver expected output ([FN]N to toggle)
 * Double zero on comma key.
-* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard. (added Mar 15, 2022)
+* [Mouse Keys](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_mouse_keys.md) allow you to use the mouse without taking your hand off the keyboard.
 * Mouse controls are: Cursor keys = move mouse; RShift = button1, End = button2, RCtrl = button3, PgUp/PgDn = Scroll wheel
 * Mouse Keys can also be accessed as a standalone layer by Left Shift-turning the Encoder until the cursor keys light up green
 
 ### Encoder Functionality
 
 * Default knob turn changes volume; button press toggles mute
-* Exponential encoder - quick repeated volume up doubles increase; quick repeated volume down triples decrease (added Feb 17, 2022)
-* Fn + knob turn changes RGB idle timeout
-* Fn + knob push puts PC to Sleep (Added May 14, 2022)
+* Exponential encoder: quick repeated volume up doubles increase; quick repeated volume down triples decrease.
+* FN + knob turn changes RGB idle timeout
+* FN + knob push puts PC to Sleep
 * holding Left Shift changes layers
 * holding Right Shift navigates page up/down
 * holding Left Ctrl navigates prev/next word
@@ -58,65 +80,45 @@ This Windows-centric ISO layout is based on [Jonavin's](https://github.com/qmk/q
 ### Paddle Game
 
 * Based on [Tomas Guinan's excellent GMMK Pro paddle game](https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/rev1/ansi/keymaps/paddlegame)
-* Paddle Game playable by pressing Fn+P (P lights up green in Fn layer if game is enabled in firmware, otherwise it lights up red)
+* Paddle Game playable by pressing [FN]P (P lights up green in FN layer if game is enabled in firmware, otherwise it lights up red)
 * Use rotary encoder to control paddle
 * Contains 12 levels, indicated by blue LED on F-key row
 * Player has 4 lives, indicated by nav cluster
 * Deflect white balls while avoiding red ones
-* Use Fn+P, double tap ESC or otherwise change layer to quit game
+* Use [FN]P, double tap ESC or otherwise change layer to quit game
 
 ### Global RGB Controls
 
-* RGB backlight lighting effect: Fn+up/down
-* RGB backlight effect speed: Fn+left/right
-* RGB backlight hue cycle: Fn+A/D
-* RGB backlight brightness: Fn+W/S
-* RGB backlight saturation: Fn+Q/E (added Feb 4, 2022)
-* RGB backlight night mode toggle: Fn+Z (indicators still work)
-* RGB backlight timeout: Fn+Encoder or "-" and "=" (default 15 minutes) (updated Apr 7, 2022)
-    * indicators in Fn layer using RGB in F-key and number rows to show the current timeout in minutes
-* Fn+Z to turn off RGB backlighting (indicator lights still work); press again to toggle
-* RGB indicators on left side LEDs in order from top: System NumLock off (orange), Scroll Lock (red), Numpad (blue), Capslock (green).
+* RGB backlight lighting effect: [FN]up/down
+* RGB backlight effect speed: [FN]left/right
+* RGB backlight hue cycle: [FN]A/D
+* RGB backlight brightness: [FN]W/S
+* RGB backlight saturation: [FN]Q/E
+* RGB backlight night mode toggle: [FN]Z (indicators still work)
+* RGB backlight timeout: [FN]Encoder or "-" and "=" (default 15 minutes)
+    *  F-key row indicator lights (cyan and blue) in FN layer display the current backlight timeout in minutes
+* [FN]Z to turn off RGB backlighting (indicator lights still work); press again to toggle
+* Left side RGB indicators in order from top: Scroll Lock (red), Numpad (blue), Capslock (green).
 
 ### Advanced Controls
 
-* Fn+\ to get to bootloader mode
-* Fn+[ESC] to clear EEPROM (then unplug and re-plug) (added Apr 11, 2022)
-* Fn+R to toggle N-key Rollover (added Apr 11, 2022)
-* Fn+/ is single-handed shortcut to Ctrl-Alt-Delete (added May 14, 2022)
-* Fn+L is single-handed shortcut to Win-L (lock Windows) (added May 17, 2022)
-* Fn+[Encoder press] to sleep Windows PC (added May 14, 2022)
-
-Link to latest firmware binary: https://github.com/gourdo1/media/raw/main/gmmk_pro_rev1_ansi_gourdo1.bin
-
-Link to cheatsheet: https://github.com/gourdo1/media/raw/main/GMMK_Pro_Cheatsheet.pdf
-
-
-## rules.mk Options
-
-STARTUP_NUMLOCK_ON = yes             - Turns on NUMLOCK by default
-
-ENCODER_DEFAULTACTIONS_ENABLE = yes  - Enabled default encoder functions
-
-TD_LSFT_CAPSLOCK_ENABLE = yes        - This will enable double tap on Left Shift to toggle CAPSLOCK when using KC_LSFTCAPS
-
-IDLE_TIMEOUT_ENABLE = yes            - Enables Timer functionality; for RGB idle timeouts that can be changed dynamically
-
-INVERT_NUMLOCK_INDICATOR             - Inverts the Numlock indicator, LED is on when numlock is off -- numlock interferes with overlay numpad, so should  be off when numpad layer is active unless you have an external numpad.
-
-COLEMAK_LAYER_ENABLE = yes           - Enables optional 5th layer for COLEMAK layout. Use Shift + encoder to enter 5th layer.
-
-GAME_ENABLE ?= yes                   - Enables Paddle Game
+* [FN]\ or [FN]B to get to bootloader mode (use key next to Left Shift on ISO)
+* [FN][ESC] to clear EEPROM
+* [FN]R to toggle N-key Rollover
+* [FN]N to toggle system numlock
+* [FN]/ is single-handed shortcut to Ctrl-Alt-Delete
+* [FN]L is single-handed shortcut to Win-L (lock Windows)
+* [FN][Encoder press] to sleep Windows PC
 
-## Layer Diagrams
+## Layer Diagrams (ANSI)
 ### Base layer
-![image](https://raw.githubusercontent.com/gourdo1/media/main/base.png)
+![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/base.png)
 
-### Fn Layer
-![image](https://raw.githubusercontent.com/gourdo1/media/main/fn1.png)
+### FN Layer
+![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/fn1.png)
 
 ### Layer 2 (Numpad)
-![image](https://raw.githubusercontent.com/gourdo1/media/main/numpad.png)
+![image](https://raw.githubusercontent.com/gourdo1/gmmkpro-media/main/numpad.png)
 
 ### COLEMAK layer
 ![image](https://user-images.githubusercontent.com/71780717/131235050-980d2f54-2d23-4ae8-a83f-9fcdbe60d6cb.png)

+ 32 - 10
keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rgb_matrix_map.h

@@ -200,16 +200,6 @@ const uint8_t LED_LIST_NUMROW[] = {
 };
 
 const uint8_t LED_LIST_LETTERS[] = {
-/*    LED_1,
-    LED_2,
-    LED_3,
-    LED_4,
-    LED_5,
-    LED_6,
-    LED_7,
-    LED_8,
-    LED_9,
-    LED_0, */
     LED_Q,
     LED_W,
     LED_E,
@@ -238,6 +228,38 @@ const uint8_t LED_LIST_LETTERS[] = {
     LED_M
 };
 
+const uint8_t LED_LIST_LETTERS_DE[] = {
+    LED_Q,
+    LED_W,
+    LED_E,
+    LED_R,
+    LED_T,
+    LED_Y,
+    LED_U,
+    LED_I,
+    LED_O,
+    LED_P,
+    LED_A,
+    LED_S,
+    LED_D,
+    LED_F,
+    LED_G,
+    LED_H,
+    LED_J,
+    LED_K,
+    LED_L,
+    LED_Z,
+    LED_X,
+    LED_C,
+    LED_V,
+    LED_B,
+    LED_N,
+    LED_M,
+    LED_SCLN,
+    LED_LBRC,
+    LED_QUOT
+};
+
 const uint8_t LED_LIST_NUMPAD[] = {
     LED_1,
     LED_2,

+ 1 - 1
keyboards/gmmk/pro/rev1/iso/keymaps/gourdo1/rules.mk

@@ -4,7 +4,7 @@ COMMAND_ENABLE = no
 MOUSEKEY_ENABLE = yes
 
 VIA_ENABLE = yes
-TAP_DANCE_ENABLE = yes
+TAP_DANCE_ENABLE = no
 BOOTMAGIC_ENABLE = yes         # Enable Bootmagic Lite
 CAPS_WORD_ENABLE = yes         # Enable built-in Caps Word functionality
 

+ 182 - 0
users/gourdo1/autocorrect/autocorrection.c

@@ -0,0 +1,182 @@
+// Copyright 2021-2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// For full documentation, see
+// https://getreuer.info/posts/keyboards/autocorrection
+
+#include "autocorrection.h"
+
+#include <string.h>
+#include "autocorrection_data.h"
+
+#if AUTOCORRECTION_MIN_LENGTH < 4
+// Odd output or hard locks on the board have been observed when the min typo
+// length is 3 or lower (https://github.com/getreuer/qmk-keymap/issues/2).
+// Additionally, autocorrection entries for short typos are more likely to false
+// trigger, so it is suggested that typos be at least 5 characters.
+#error "Min typo length is less than 4. Autocorrection may behave poorly."
+#endif
+
+bool process_autocorrection(uint16_t keycode, keyrecord_t* record) {
+    if (user_config.autocorrect) {
+      static uint8_t typo_buffer[AUTOCORRECTION_MAX_LENGTH] = {0};
+      static uint8_t typo_buffer_size = 0;
+
+      // Ignore key release; we only process key presses.
+      if (!record->event.pressed) { return true; }
+
+    #ifndef NO_ACTION_ONESHOT
+      const uint8_t mods = get_mods() | get_oneshot_mods();
+    #else
+      const uint8_t mods = get_mods();
+    #endif  // NO_ACTION_ONESHOT
+      // Disable autocorrection while a mod other than shift is active.
+      if ((mods & ~MOD_MASK_SHIFT) != 0) {
+        typo_buffer_size = 0;
+        return true;
+      }
+
+      // The following switch cases address various kinds of keycodes. This logic is
+      // split over two switches rather than merged into one. The first switch may
+      // extract a basic keycode which is then further handled by the second switch,
+      // e.g. a layer-tap key with Caps Lock `LT(layer, KC_CAPS)`.
+      switch (keycode) {
+    #ifndef NO_ACTION_TAPPING
+        case QK_MOD_TAP ... QK_MOD_TAP_MAX:  // Tap-hold keys.
+    #ifndef NO_ACTION_LAYER
+        case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
+    #endif  // NO_ACTION_LAYER
+          // Ignore when tap-hold keys are held.
+          if (record->tap.count == 0) { return true; }
+          // Otherwise when tapped, get the basic keycode.
+          // Fallthrough intended.
+    #endif  // NO_ACTION_TAPPING
+
+        // Handle shifted keys, e.g. symbols like KC_EXLM = S(KC_1).
+        case QK_LSFT ... QK_LSFT + 255:
+        case QK_RSFT ... QK_RSFT + 255:
+          keycode &= 0xff;  // Get the basic keycode.
+          break;
+
+        // NOTE: Space Cadet keys expose no info to check whether they are being
+        // tapped vs. held. This makes autocorrection ambiguous, e.g. KC_LCPO might
+        // be '(', which we would treat as a word break, or it might be shift, which
+        // we would treat as having no effect. To behave cautiously, we allow Space
+        // Cadet keycodes to fall to the logic below and clear autocorrection state.
+      }
+
+      switch (keycode) {
+        // Ignore shifts, Caps Lock, one-shot mods, and layer switch keys.
+        case KC_NO:
+        case KC_LSFT:
+        case KC_RSFT:
+        case KC_CAPS:
+        case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:
+        case QK_TO ... QK_TO_MAX:
+        case QK_MOMENTARY ... QK_MOMENTARY_MAX:
+        case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:
+        case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:
+        case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:
+        case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
+        case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:
+          return true;  // Ignore these keys.
+      }
+
+      if (keycode == KC_QUOT) {
+        // Treat " (shifted ') as a word boundary.
+        if ((mods & MOD_MASK_SHIFT) != 0) { keycode = KC_SPC; }
+      } else if (!(KC_A <= keycode && keycode <= KC_Z)) {
+        if (keycode == KC_BSPC) {
+          // Remove last character from the buffer.
+          if (typo_buffer_size > 0) { --typo_buffer_size; }
+          return true;
+        } else if (KC_1 <= keycode && keycode <= KC_SLSH && keycode != KC_ESC) {
+          // Set a word boundary if space, period, digit, etc. is pressed.
+          // Behave more conservatively for the enter key. Reset, so that enter
+          // can't be used on a word ending.
+          if (keycode == KC_ENT) { typo_buffer_size = 0; }
+          keycode = KC_SPC;
+        } else {
+          // Clear state if some other non-alpha key is pressed.
+          typo_buffer_size = 0;
+          return true;
+        }
+      }
+
+      // If the buffer is full, rotate it to discard the oldest character.
+      if (typo_buffer_size >= AUTOCORRECTION_MAX_LENGTH) {
+        memmove(typo_buffer, typo_buffer + 1, AUTOCORRECTION_MAX_LENGTH - 1);
+        typo_buffer_size = AUTOCORRECTION_MAX_LENGTH - 1;
+      }
+
+      // Append `keycode` to the buffer.
+      // NOTE: `keycode` must be a basic keycode (0-255) by this point.
+      typo_buffer[typo_buffer_size++] = (uint8_t) keycode;
+      // Early return if not many characters have been buffered so far.
+      if (typo_buffer_size < AUTOCORRECTION_MIN_LENGTH) { return true; }
+
+      // Check whether the buffer ends in a typo. This is done using a trie
+      // stored in `autocorrection_data`.
+      uint16_t state = 0;
+      uint8_t code = pgm_read_byte(autocorrection_data + state);
+      for (int i = typo_buffer_size - 1; i >= 0; --i) {
+        const uint8_t key_i = typo_buffer[i];
+
+        if (code & 64) { // Check for match in node with multiple children.
+          code &= 63;
+          for (; code != key_i;
+              code = pgm_read_byte(autocorrection_data + (state += 3))) {
+            if (!code) { return true; }
+          }
+
+          // Follow link to child node.
+          state = (uint16_t)(
+              (uint_fast16_t)pgm_read_byte(autocorrection_data + state + 1)
+              | (uint_fast16_t)pgm_read_byte(autocorrection_data + state + 2) << 8);
+        // Otherwise check for match in node with a single child.
+        } else if (code != key_i) {
+          return true;
+        } else if (!(code = pgm_read_byte(autocorrection_data + (++state)))) {
+          ++state;
+        }
+
+        // Stop if `state` becomes an invalid index. This should not normally
+        // happen, it is a safeguard in case of a bug, data corruption, etc.
+        if (state >= sizeof(autocorrection_data)) {
+          return true;
+        }
+
+        // Read first byte of the next node.
+        code = pgm_read_byte(autocorrection_data + state);
+
+        if (code & 128) { // A typo was found! Apply autocorrection.
+          const int backspaces = code & 63;
+          for (int i = 0; i < backspaces; ++i) { tap_code(KC_BSPC); }
+            send_string_P((char const*)(autocorrection_data + state + 1));
+
+          if (keycode == KC_SPC) {
+            typo_buffer[0] = KC_SPC;
+            typo_buffer_size = 1;
+            return true;
+          } else {
+            typo_buffer_size = 0;
+            return false;
+          }
+        }
+      }
+      return true;
+    }
+    return true;
+}

+ 40 - 0
users/gourdo1/autocorrect/autocorrection.h

@@ -0,0 +1,40 @@
+// Copyright 2021-2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// Autocorrection on your keyboard.
+//
+// This library implements rudimentary autocorrection, automatically detecting
+// and fixing some misspellings. Beware that the autocorrection logic is
+// unaware of hotkey or mouse-based cursor movement.
+//
+// For full documentation, see
+// https://getreuer.info/posts/keyboards/autocorrection
+
+#pragma once
+
+#include "quantum.h"
+
+#include "gourdo1.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bool process_autocorrection(uint16_t keycode, keyrecord_t* record);
+
+#ifdef __cplusplus
+}
+#endif
+

+ 722 - 0
users/gourdo1/autocorrect/autocorrection_data.h

@@ -0,0 +1,722 @@
+// Generated code.
+
+// Autocorrection dictionary (400 entries):
+//   :acheiv    -> achiev
+//   :agian     -> again
+//   :agred     -> agreed
+//   :ajust     -> adjust
+//   :alot:     -> a lot
+//   :andteh    -> and the
+//   :andthe    -> and the
+//   :anual     -> annual
+//   :asign     -> assign
+//   :aslo:     -> also
+//   :asthe     -> as the
+//   :atthe     -> at the
+//   :casue     -> cause
+//   :choses    -> chooses
+//   :eveyr     -> every
+//   :foudn     -> found
+//   :gaurd     -> guard
+//   :goign     -> going
+//   :gonig     -> going
+//   :graet     -> great
+//   :grammer   -> grammar
+//   :guage     -> gauge
+//   :haev      -> have
+//   :hapen     -> happen
+//   :htere     -> there
+//   :htikn     -> think
+//   :htink     -> think
+//   :hwihc     -> which
+//   :hwile     -> while
+//   :idaes     -> ideas
+//   :jstu:     -> just
+//   :jsut:     -> just
+//   :knwo      -> know
+//   :konw      -> know
+//   :kwno      -> know
+//   :moeny     -> money
+//   :ocuntry   -> country
+//   :ocur      -> occur
+//   :olther    -> other
+//   :otehr     -> other
+//   :owudl     -> would
+//   :rference  -> reference
+//   :sicne     -> since
+//   :socre     -> score
+//   :szie      -> size
+//   :the:the:  -> the
+//   :theri     -> their
+//   :thier     -> their
+//   :thsoe     -> those
+//   :tothe     -> to the
+//   :ture      -> true
+//   :turth     -> truth
+//   :uesd:     -> used
+//   :usally    -> usually
+//   :yaers     -> years
+//   :yeasr     -> years
+//   abbout     -> about
+//   aberation  -> aberration
+//   abilties   -> abilities
+//   abilty     -> ability
+//   abotu      -> about
+//   abouta     -> about a
+//   aboutit    -> about it
+//   aboutthe   -> about the
+//   abvove     -> above
+//   accesories -> accessories
+//   accomodate -> accommodate
+//   accross    -> across
+//   acommodate -> accommodate
+//   acomplish  -> accomplish
+//   actualy    -> actually
+//   acurate    -> accurate
+//   acutally   -> actually
+//   addtion    -> addition
+//   adviced    -> advised
+//   againnst   -> against
+//   aganist    -> against
+//   aggreed    -> agreed
+//   agianst    -> against
+//   ahppn      -> happen
+//   aledge     -> allege
+//   alledge    -> allege
+//   allign     -> align
+//   almsot     -> almost
+//   alomst     -> almost
+//   alwasy     -> always
+//   alwyas     -> always
+//   amature    -> amateur
+//   anohter    -> another
+//   anomolous  -> anomalous
+//   anomoly    -> anomaly
+//   anytying   -> anything
+//   aparent    -> apparent
+//   aparrent   -> apparent
+//   apparant   -> apparent
+//   apparrent  -> apparent
+//   aquire     -> acquire
+//   aroud      -> around
+//   arround    -> around
+//   arund      -> around
+//   asthetic   -> aesthetic
+//   auxilary   -> auxiliary
+//   auxillary  -> auxiliary
+//   auxilliary -> auxiliary
+//   availabe   -> available
+//   availaible -> available
+//   availalbe  -> available
+//   availble   -> available
+//   availiable -> available
+//   avalable   -> available
+//   avaliable  -> available
+//   avilable   -> available
+//   baceause   -> because
+//   bandwith   -> bandwidth
+//   bankrupcy  -> bankruptcy
+//   baout      -> about
+//   beacuse    -> because
+//   becasue    -> because
+//   beccause   -> because
+//   becouse    -> because
+//   becuase    -> because
+//   bedore     -> before
+//   beeing     -> being
+//   befoer     -> before
+//   begginer   -> beginner
+//   beleif     -> belief
+//   beleive    -> believe
+//   belive     -> believe
+//   beteen     -> between
+//   beween     -> between
+//   bewteen    -> between
+//   breif      -> brief
+//   burried    -> buried
+//   busness    -> business
+//   bussiness  -> business
+//   cacheing   -> caching
+//   calander   -> calendar
+//   caluclate  -> calculate
+//   caluculate -> calculate
+//   calulate   -> calculate
+//   catagory   -> category
+//   cauhgt     -> caught
+//   ceratin    -> certain
+//   certian    -> certain
+//   cheif      -> chief
+//   chekc      -> check
+//   childen    -> children
+//   chnage     -> change
+//   choosen    -> chosen
+//   cieling    -> ceiling
+//   circut     -> circuit
+//   claer      -> clear
+//   clasic     -> classic
+//   cmoputer   -> computer
+//   coform     -> conform
+//   cognizent  -> cognizant
+//   collegue   -> colleague
+//   comapny    -> company
+//   comittee   -> committee
+//   comming:   -> coming
+//   commitee   -> committee
+//   competance -> competence
+//   competant  -> competent
+//   complier   -> compiler
+//   concensus  -> consensus
+//   considerd  -> considered
+//   contian    -> contain
+//   copywrite: -> copyright
+//   cosnt      -> const
+//   coudl      -> could
+//   dervied    -> derived
+//   desicion   -> decision
+//   didnot     -> did not
+//   diferent   -> different
+//   diferrent  -> different
+//   differnt   -> different
+//   diffrent   -> different
+//   divison    -> division
+//   doulbe     -> double
+//   dyanmic    -> dynamic
+//   effecient  -> efficient
+//   elasped    -> elapsed
+//   eligable   -> eligible
+//   elpased    -> elapsed
+//   embarass   -> embarrass
+//   embeded    -> embedded
+//   encypt     -> encrypt
+//   excecut    -> execut
+//   excercise  -> exercise
+//   failse     -> false
+//   fales      -> false
+//   fasle      -> false
+//   feild      -> field
+//   finaly     -> finally
+//   firend     -> friend
+//   firts      -> first
+//   fitler     -> filter
+//   flase      -> false
+//   follwo     -> follow
+//   foriegn    -> foreign
+//   foward     -> forward
+//   fraciton   -> fraction
+//   freind     -> friend
+//   frequecy   -> frequency
+//   fromthe    -> from the
+//   fucntion   -> function
+//   fufill     -> fulfill
+//   fullfill   -> fulfill
+//   futher     -> further
+//   ganerate   -> generate
+//   garantee   -> guarantee
+//   gaurantee  -> guarantee
+//   generaly   -> generally
+//   govement   -> government
+//   govenment  -> government
+//   goverment  -> government
+//   governmnet -> government
+//   govorment  -> government
+//   govornment -> government
+//   greatful   -> grateful
+//   guaratee   -> guarantee
+//   heigher    -> higher
+//   heigth     -> height
+//   heirarchy  -> hierarchy
+//   higest     -> highest
+//   howver     -> however
+//   hydogen    -> hydrogen
+//   hygeine    -> hygiene
+//   hypocracy  -> hypocrisy
+//   hypocrasy  -> hypocrisy
+//   hypocricy  -> hypocrisy
+//   hypocrit:  -> hypocrite
+//   iamge      -> image
+//   importamt  -> important
+//   inclued    -> include
+//   indeces    -> indices
+//   indecies   -> indices
+//   indicies   -> indices
+//   inital     -> initial
+//   insted     -> instead
+//   interator  -> iterator
+//   intput     -> input
+//   intrest    -> interest
+//   invliad    -> invalid
+//   laguage    -> language
+//   largst     -> largest
+//   learnign   -> learning
+//   lenght     -> length
+//   levle      -> level
+//   liasion    -> liaison
+//   libary     -> library
+//   likly      -> likely
+//   lisense    -> license
+//   listner    -> listener
+//   littel     -> little
+//   looses:    -> loses
+//   looup      -> lookup
+//   macthing   -> matching
+//   maintence  -> maintenance
+//   manefist   -> manifest
+//   mesage     -> message
+//   morgage    -> mortgage
+//   mysefl     -> myself
+//   namesapce  -> namespace
+//   namespcae  -> namespace
+//   naturual   -> natural
+//   neccesary  -> necessary
+//   necesary   -> necessary
+//   nulltpr    -> nullptr
+//   occassion  -> occasion
+//   occured    -> occurred
+//   operaotr   -> operator
+//   ouptut     -> output
+//   ouput      -> output
+//   overide    -> override
+//   ovveride   -> override
+//   pallete    -> palette
+//   paralel    -> parallel
+//   parralel   -> parallel
+//   parrallel  -> parallel
+//   particualr -> particular
+//   paticular  -> particular
+//   peaple     -> people
+//   peice      -> piece
+//   peolpe     -> people
+//   peopel     -> people
+//   perhasp    -> perhaps
+//   perheaps   -> perhaps
+//   perhpas    -> perhaps
+//   perphas    -> perhaps
+//   persue     -> pursue
+//   poeople    -> people
+//   poeple     -> people
+//   poitner    -> pointer
+//   posess     -> possess
+//   postion    -> position
+//   preiod     -> period
+//   primarly   -> primarily
+//   priviledge -> privilege
+//   privte     -> private
+//   probablly  -> probably
+//   probaly    -> probably
+//   probelm    -> problem
+//   proccess   -> process
+//   proeprty   -> property
+//   prominant  -> prominent
+//   proove     -> prove
+//   propery    -> property
+//   propogate  -> propagate
+//   psuedo     -> pseudo
+//   raelly     -> really
+//   realtion   -> relation
+//   realy      -> really
+//   reasearch  -> research
+//   receiev    -> receiv
+//   recepient  -> recipient
+//   reciept    -> receipt
+//   reciev     -> receiv
+//   recipiant  -> recipient
+//   recrod     -> record
+//   recuring   -> recurring
+//   referece   -> reference
+//   refered    -> referred
+//   regluar    -> regular
+//   relaly     -> really
+//   releated   -> related
+//   relevent   -> relevant
+//   repitition -> repetition
+//   reponse    -> response
+//   reprot     -> report
+//   resutl     -> result
+//   retrun     -> return
+//   retun      -> return
+//   reuslt     -> result
+//   reutrn     -> return
+//   reveiw     -> review
+//   saftey     -> safety
+//   safty      -> safety
+//   satisifed  -> satisfied
+//   scheduel   -> schedule
+//   seperat    -> separat
+//   sequnce    -> sequence
+//   shoudl     -> should
+//   similiar   -> similar
+//   simmilar   -> similar
+//   singed     -> signed
+//   singel     -> single
+//   slighly    -> slightly
+//   somehwat   -> somewhat
+//   spectogram -> spectrogram
+//   statment   -> statement
+//   stirng     -> string
+//   stregth    -> strength
+//   strengh    -> strength
+//   strign     -> string
+//   succsess   -> success
+//   sucess     -> success
+//   sugest     -> suggest
+//   sumary     -> summary
+//   supress    -> suppress
+//   surpress   -> suppress
+//   swithc     -> switch
+//   swtich     -> switch
+//   symetric   -> symmetric
+//   teamplate  -> template
+//   tempalte   -> template
+//   theese     -> these
+//   therfore   -> therefore
+//   thign      -> thing
+//   thigsn     -> things
+//   thikn      -> think
+//   thiunk     -> think
+//   thnigs     -> things
+//   thresold   -> threshold
+//   throught   -> thought
+//   tihkn      -> think
+//   tkaes      -> takes
+//   todya      -> today
+//   toghether  -> together
+//   tolerence  -> tolerance
+//   tongiht    -> tonight
+//   tranpose   -> transpose
+//   typcial    -> typical
+//   udpate     -> update
+//   unkown     -> unknown
+//   unqiue     -> unique
+//   ususally   -> usually
+//   verticies  -> vertices
+//   virutal    -> virtual
+//   vitual     -> virtual
+//   whcih      -> which
+//   whereever  -> wherever
+//   wherre     -> where
+//   whihc      -> which
+//   whlch      -> which
+//   widht      -> width
+//   wierd      -> weird
+//   wihch      -> which
+//   woudl      -> would
+//   yeild      -> yield
+
+#define AUTOCORRECTION_MIN_LENGTH 5  // "abotu"
+#define AUTOCORRECTION_MAX_LENGTH 10  // "auxilliary"
+
+static const uint8_t autocorrection_data[5967] PROGMEM = {108, 67, 0, 4, 212, 0,
+  6, 236, 0, 7, 100, 1, 8, 15, 3, 9, 169, 8, 10, 204, 8, 11, 68, 9, 12, 246, 9,
+  14, 0, 10, 15, 28, 10, 16, 79, 11, 17, 129, 11, 18, 175, 13, 19, 227, 13, 21,
+  253, 13, 22, 194, 15, 23, 121, 17, 24, 201, 20, 25, 210, 20, 26, 8, 21, 28,
+  34, 21, 0, 71, 89, 0, 8, 99, 0, 10, 130, 0, 18, 142, 0, 22, 152, 0, 23, 163,
+  0, 24, 202, 0, 0, 22, 8, 24, 44, 0, 131, 115, 101, 100, 0, 75, 106, 0, 23,
+  115, 0, 0, 23, 44, 8, 11, 23, 44, 0, 132, 0, 12, 21, 26, 28, 19, 18, 6, 0,
+  133, 114, 105, 103, 104, 116, 0, 17, 12, 16, 16, 18, 6, 0, 132, 105, 110, 103,
+  0, 15, 22, 4, 44, 0, 131, 108, 115, 111, 0, 8, 22, 18, 18, 15, 0, 132, 115,
+  101, 115, 0, 76, 173, 0, 18, 183, 0, 24, 193, 0, 0, 21, 6, 18, 19, 28, 11, 0,
+  128, 101, 0, 15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117,
+  115, 116, 0, 23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 219, 0, 28, 228, 0,
+  0, 24, 18, 5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 246, 0,
+  12, 28, 1, 14, 92, 1, 0, 76, 253, 0, 23, 20, 1, 0, 75, 4, 1, 26, 10, 1, 0, 26,
+  0, 129, 99, 104, 0, 11, 44, 0, 132, 119, 104, 105, 99, 104, 0, 12, 26, 22, 0,
+  129, 99, 104, 0, 80, 41, 1, 21, 53, 1, 22, 67, 1, 23, 76, 1, 0, 17, 4, 28, 7,
+  0, 132, 110, 97, 109, 105, 99, 0, 23, 8, 16, 28, 22, 0, 132, 109, 101, 116,
+  114, 105, 99, 0, 4, 15, 6, 0, 129, 115, 105, 99, 0, 8, 11, 23, 22, 4, 0, 134,
+  101, 115, 116, 104, 101, 116, 105, 99, 0, 8, 11, 6, 0, 129, 99, 107, 0, 68,
+  122, 1, 8, 134, 1, 15, 84, 2, 17, 124, 2, 18, 180, 2, 21, 207, 2, 24, 7, 3, 0,
+  12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 70, 168, 1, 7, 178, 1, 8,
+  188, 1, 9, 199, 1, 10, 212, 1, 12, 222, 1, 19, 248, 1, 21, 3, 2, 22, 38, 2,
+  23, 50, 2, 24, 75, 2, 0, 12, 25, 7, 4, 0, 130, 115, 101, 100, 0, 8, 5, 16, 8,
+  0, 129, 100, 101, 100, 0, 21, 10, 10, 4, 0, 132, 114, 101, 101, 100, 0, 12,
+  22, 12, 23, 4, 22, 0, 131, 102, 105, 101, 100, 0, 17, 12, 22, 0, 131, 103,
+  110, 101, 100, 0, 85, 229, 1, 25, 238, 1, 0, 21, 24, 5, 0, 131, 105, 101, 100,
+  0, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 22, 4, 15, 8, 0, 131, 112, 115,
+  101, 100, 0, 72, 13, 2, 10, 22, 2, 24, 29, 2, 0, 9, 8, 21, 0, 129, 114, 101,
+  100, 0, 4, 44, 0, 128, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 4, 19,
+  15, 8, 0, 132, 97, 112, 115, 101, 100, 0, 68, 57, 2, 22, 68, 2, 0, 8, 15, 8,
+  21, 0, 132, 97, 116, 101, 100, 0, 17, 12, 0, 128, 97, 100, 0, 15, 6, 17, 12,
+  0, 129, 100, 101, 0, 76, 91, 2, 18, 112, 2, 0, 8, 0, 73, 100, 2, 28, 106, 2,
+  0, 131, 105, 101, 108, 100, 0, 131, 105, 101, 108, 100, 0, 22, 8, 21, 11, 23,
+  0, 130, 104, 111, 108, 100, 0, 72, 134, 2, 12, 145, 2, 24, 155, 2, 0, 21, 12,
+  9, 0, 132, 114, 105, 101, 110, 100, 0, 8, 21, 9, 0, 131, 105, 101, 110, 100,
+  0, 82, 162, 2, 21, 172, 2, 0, 21, 21, 4, 0, 132, 111, 117, 110, 100, 0, 4, 0,
+  130, 111, 117, 110, 100, 0, 76, 187, 2, 21, 198, 2, 0, 8, 21, 19, 0, 132, 101,
+  114, 105, 111, 100, 0, 6, 8, 21, 0, 130, 111, 114, 100, 0, 68, 217, 2, 8, 228,
+  2, 24, 253, 2, 0, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 71, 235, 2,
+  12, 245, 2, 0, 12, 22, 17, 18, 6, 0, 128, 101, 100, 0, 26, 0, 131, 101, 105,
+  114, 100, 0, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4, 0, 128, 110,
+  100, 0, 68, 67, 3, 5, 80, 3, 6, 123, 3, 7, 251, 3, 8, 23, 4, 10, 107, 4, 11,
+  227, 4, 12, 52, 5, 15, 61, 5, 17, 0, 6, 18, 27, 6, 19, 37, 6, 21, 47, 6, 22,
+  156, 6, 23, 82, 7, 24, 45, 8, 25, 115, 8, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130,
+  97, 99, 101, 0, 68, 87, 3, 15, 97, 3, 0, 15, 12, 4, 25, 4, 0, 128, 108, 101,
+  0, 68, 104, 3, 24, 115, 3, 0, 15, 12, 4, 25, 4, 0, 130, 98, 108, 101, 0, 18,
+  7, 0, 130, 98, 108, 101, 0, 72, 136, 3, 12, 147, 3, 17, 156, 3, 19, 238, 3, 0,
+  21, 8, 9, 8, 21, 0, 129, 110, 99, 101, 0, 8, 19, 0, 131, 105, 101, 99, 101, 0,
+  68, 166, 3, 8, 179, 3, 24, 228, 3, 0, 23, 8, 19, 16, 18, 6, 0, 131, 101, 110,
+  99, 101, 0, 85, 186, 3, 23, 217, 3, 0, 8, 0, 73, 195, 3, 15, 208, 3, 0, 21,
+  44, 0, 134, 101, 102, 101, 114, 101, 110, 99, 101, 0, 18, 23, 0, 131, 97, 110,
+  99, 101, 0, 17, 12, 4, 16, 0, 129, 97, 110, 99, 101, 0, 20, 8, 22, 0, 130,
+  101, 110, 99, 101, 0, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12,
+  21, 8, 25, 0, 82, 7, 4, 25, 13, 4, 0, 130, 114, 105, 100, 101, 0, 18, 0, 133,
+  101, 114, 114, 105, 100, 101, 0, 23, 0, 68, 38, 4, 12, 49, 4, 17, 59, 4, 23,
+  94, 4, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 16, 16, 18, 6, 0, 129,
+  116, 101, 101, 0, 4, 21, 0, 68, 69, 4, 24, 81, 4, 0, 10, 0, 134, 117, 97, 114,
+  97, 110, 116, 101, 101, 0, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101,
+  101, 0, 12, 16, 18, 6, 0, 132, 109, 105, 116, 116, 101, 101, 0, 68, 117, 4, 7,
+  184, 4, 16, 218, 4, 0, 74, 130, 4, 17, 141, 4, 22, 150, 4, 24, 159, 4, 0, 21,
+  18, 16, 0, 131, 116, 103, 97, 103, 101, 0, 11, 6, 0, 131, 97, 110, 103, 101,
+  0, 8, 16, 0, 130, 115, 97, 103, 101, 0, 10, 0, 108, 168, 4, 4, 174, 4, 0, 131,
+  97, 117, 103, 101, 0, 15, 0, 132, 110, 103, 117, 97, 103, 101, 0, 8, 15, 0,
+  68, 197, 4, 12, 203, 4, 15, 212, 4, 0, 131, 108, 101, 103, 101, 0, 25, 12, 21,
+  19, 0, 130, 103, 101, 0, 4, 0, 130, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103,
+  101, 0, 23, 0, 71, 245, 4, 16, 255, 4, 18, 9, 5, 22, 18, 5, 23, 27, 5, 0, 17,
+  4, 44, 0, 130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0,
+  23, 44, 0, 130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68,
+  34, 5, 24, 42, 5, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32,
+  116, 104, 101, 0, 29, 22, 44, 0, 130, 105, 122, 101, 0, 69, 77, 5, 12, 190, 5,
+  19, 201, 5, 22, 241, 5, 25, 249, 5, 0, 68, 87, 5, 12, 167, 5, 15, 179, 5, 0,
+  74, 97, 5, 12, 107, 5, 15, 137, 5, 0, 12, 15, 8, 0, 131, 105, 98, 108, 101, 0,
+  15, 0, 68, 116, 5, 12, 127, 5, 0, 25, 4, 0, 133, 105, 108, 97, 98, 108, 101,
+  0, 4, 25, 4, 0, 132, 97, 98, 108, 101, 0, 68, 144, 5, 12, 155, 5, 0, 25, 4, 0,
+  132, 105, 108, 97, 98, 108, 101, 0, 25, 4, 0, 133, 97, 105, 108, 97, 98, 108,
+  101, 0, 4, 15, 12, 4, 25, 4, 0, 131, 98, 108, 101, 0, 12, 4, 25, 4, 0, 130,
+  97, 98, 108, 101, 0, 26, 11, 44, 0, 132, 119, 104, 105, 108, 101, 0, 68, 211,
+  5, 8, 220, 5, 18, 230, 5, 0, 8, 19, 0, 131, 111, 112, 108, 101, 0, 18, 19, 0,
+  132, 101, 111, 112, 108, 101, 0, 8, 18, 19, 0, 133, 101, 111, 112, 108, 101,
+  0, 4, 9, 0, 130, 108, 115, 101, 0, 8, 15, 0, 129, 101, 108, 0, 70, 7, 6, 12,
+  16, 6, 0, 12, 22, 44, 0, 130, 110, 99, 101, 0, 8, 10, 28, 11, 0, 131, 105,
+  101, 110, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8, 19, 0,
+  130, 112, 108, 101, 0, 70, 66, 6, 8, 76, 6, 12, 87, 6, 18, 99, 6, 21, 127, 6,
+  24, 134, 6, 0, 18, 22, 44, 0, 131, 99, 111, 114, 101, 0, 23, 11, 44, 0, 132,
+  116, 104, 101, 114, 101, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0,
+  71, 106, 6, 9, 115, 6, 0, 8, 5, 0, 131, 102, 111, 114, 101, 0, 21, 8, 11, 23,
+  0, 131, 101, 102, 111, 114, 101, 0, 8, 11, 26, 0, 129, 101, 0, 23, 0, 108,
+  143, 6, 4, 148, 6, 0, 130, 114, 117, 101, 0, 16, 4, 0, 130, 101, 117, 114, 0,
+  68, 178, 6, 8, 203, 6, 12, 211, 6, 15, 226, 6, 17, 235, 6, 18, 9, 7, 24, 22,
+  7, 0, 79, 185, 6, 24, 193, 6, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0,
+  131, 97, 117, 115, 101, 0, 8, 11, 23, 0, 130, 115, 101, 0, 6, 21, 8, 6, 27, 8,
+  0, 134, 101, 114, 99, 105, 115, 101, 0, 12, 4, 9, 0, 131, 108, 115, 101, 0,
+  72, 242, 6, 18, 253, 6, 0, 22, 12, 15, 0, 132, 99, 101, 110, 115, 101, 0, 19,
+  8, 21, 0, 132, 115, 112, 111, 110, 115, 101, 0, 19, 17, 4, 21, 23, 0, 131,
+  115, 112, 111, 115, 101, 0, 68, 32, 7, 6, 61, 7, 18, 72, 7, 0, 70, 39, 7, 8,
+  49, 7, 0, 6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97,
+  117, 115, 101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131,
+  97, 117, 115, 101, 0, 68, 95, 7, 8, 13, 8, 15, 24, 8, 25, 36, 8, 0, 71, 111,
+  7, 10, 148, 7, 15, 161, 7, 19, 228, 7, 21, 238, 7, 0, 18, 16, 0, 80, 121, 7,
+  18, 136, 7, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0,
+  6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 18, 19, 18, 21, 19, 0, 132,
+  97, 103, 97, 116, 101, 0, 70, 171, 7, 19, 184, 7, 24, 197, 7, 0, 24, 15, 4, 6,
+  0, 133, 99, 117, 108, 97, 116, 101, 0, 16, 4, 8, 23, 0, 134, 109, 112, 108,
+  97, 116, 101, 0, 70, 204, 7, 15, 217, 7, 0, 24, 15, 4, 6, 0, 134, 99, 117,
+  108, 97, 116, 101, 0, 4, 6, 0, 132, 99, 117, 108, 97, 116, 101, 0, 7, 24, 0,
+  132, 112, 100, 97, 116, 101, 0, 72, 245, 7, 24, 2, 8, 0, 17, 4, 10, 0, 134,
+  101, 110, 101, 114, 97, 116, 101, 0, 6, 4, 0, 132, 99, 117, 114, 97, 116, 101,
+  0, 15, 15, 4, 19, 0, 131, 101, 116, 116, 101, 0, 4, 19, 16, 8, 23, 0, 131,
+  108, 97, 116, 101, 0, 12, 21, 19, 0, 129, 97, 116, 101, 0, 74, 55, 8, 12, 67,
+  8, 22, 77, 8, 0, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 20, 17, 24,
+  0, 131, 105, 113, 117, 101, 0, 68, 84, 8, 21, 105, 8, 0, 6, 0, 108, 93, 8, 8,
+  98, 8, 0, 130, 117, 115, 101, 0, 5, 0, 130, 117, 115, 101, 0, 8, 19, 0, 132,
+  117, 114, 115, 117, 101, 0, 76, 122, 8, 18, 147, 8, 0, 72, 129, 8, 15, 139, 8,
+  0, 15, 8, 5, 0, 131, 105, 101, 118, 101, 0, 8, 5, 0, 129, 101, 118, 101, 0,
+  82, 154, 8, 25, 161, 8, 0, 21, 19, 0, 130, 118, 101, 0, 5, 4, 0, 131, 111,
+  118, 101, 0, 12, 8, 0, 75, 182, 8, 15, 189, 8, 21, 197, 8, 0, 6, 0, 130, 105,
+  101, 102, 0, 8, 5, 0, 130, 105, 101, 102, 0, 5, 0, 130, 105, 101, 102, 0, 76,
+  211, 8, 17, 221, 8, 0, 17, 18, 10, 44, 0, 130, 105, 110, 103, 0, 76, 228, 8,
+  21, 58, 9, 0, 72, 244, 8, 11, 11, 9, 15, 24, 9, 21, 36, 9, 28, 47, 9, 0, 72,
+  251, 8, 11, 2, 9, 0, 5, 0, 131, 105, 110, 103, 0, 6, 4, 6, 0, 131, 105, 110,
+  103, 0, 23, 6, 4, 16, 0, 133, 116, 99, 104, 105, 110, 103, 0, 8, 12, 6, 0,
+  133, 101, 105, 108, 105, 110, 103, 0, 24, 6, 8, 21, 0, 130, 114, 105, 110,
+  103, 0, 23, 28, 17, 4, 0, 131, 104, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114,
+  105, 110, 103, 0, 70, 87, 9, 8, 142, 9, 10, 154, 9, 12, 164, 9, 22, 173, 9,
+  23, 191, 9, 0, 75, 100, 9, 12, 109, 9, 15, 119, 9, 21, 127, 9, 0, 12, 26, 0,
+  131, 104, 105, 99, 104, 0, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, 11, 26,
+  0, 130, 105, 99, 104, 0, 4, 8, 22, 4, 8, 21, 0, 134, 115, 101, 97, 114, 99,
+  104, 0, 23, 7, 17, 4, 44, 0, 130, 32, 116, 104, 101, 0, 17, 8, 21, 23, 22, 0,
+  128, 116, 104, 0, 6, 11, 26, 0, 130, 105, 99, 104, 0, 12, 15, 19, 16, 18, 6,
+  4, 0, 134, 99, 111, 109, 112, 108, 105, 115, 104, 0, 74, 201, 9, 12, 225, 9,
+  21, 236, 9, 0, 72, 208, 9, 12, 218, 9, 0, 21, 23, 22, 0, 130, 110, 103, 116,
+  104, 0, 8, 11, 0, 129, 104, 116, 0, 26, 7, 17, 4, 5, 0, 129, 100, 116, 104, 0,
+  24, 23, 44, 0, 131, 114, 117, 116, 104, 0, 21, 8, 11, 23, 44, 0, 129, 105,
+  114, 0, 17, 0, 76, 9, 10, 24, 20, 10, 0, 23, 11, 44, 0, 132, 116, 104, 105,
+  110, 107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 50, 10, 7, 134, 10, 8, 177,
+  10, 9, 17, 11, 15, 26, 11, 23, 55, 11, 24, 64, 11, 0, 76, 60, 10, 23, 71, 10,
+  24, 96, 10, 0, 6, 19, 28, 23, 0, 131, 105, 99, 97, 108, 0, 76, 78, 10, 24, 86,
+  10, 0, 17, 12, 0, 129, 105, 97, 108, 0, 21, 12, 25, 0, 131, 116, 117, 97, 108,
+  0, 81, 106, 10, 21, 115, 10, 23, 124, 10, 0, 4, 44, 0, 130, 110, 117, 97, 108,
+  0, 24, 23, 4, 17, 0, 130, 97, 108, 0, 12, 25, 0, 131, 114, 116, 117, 97, 108,
+  0, 24, 0, 82, 143, 10, 26, 167, 10, 0, 70, 153, 10, 11, 157, 10, 26, 163, 10,
+  0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0, 129, 108, 100, 0, 18, 44, 0,
+  132, 119, 111, 117, 108, 100, 0, 74, 193, 10, 15, 201, 10, 19, 247, 10, 23,
+  255, 10, 24, 7, 11, 0, 17, 12, 22, 0, 129, 108, 101, 0, 68, 208, 10, 15, 234,
+  10, 0, 21, 0, 68, 217, 10, 21, 224, 10, 0, 19, 0, 129, 108, 101, 108, 0, 4,
+  19, 0, 132, 97, 108, 108, 101, 108, 0, 4, 21, 21, 4, 19, 0, 133, 97, 108, 108,
+  101, 108, 0, 18, 8, 19, 0, 129, 108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0,
+  7, 8, 11, 6, 22, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102, 0, 12,
+  9, 0, 79, 36, 11, 24, 46, 11, 0, 15, 24, 9, 0, 132, 102, 105, 108, 108, 0, 9,
+  0, 131, 108, 102, 105, 108, 108, 0, 24, 22, 8, 21, 0, 129, 108, 116, 0, 9, 23,
+  4, 8, 21, 10, 0, 133, 97, 116, 101, 102, 117, 108, 0, 68, 89, 11, 15, 106, 11,
+  21, 117, 11, 0, 21, 10, 18, 23, 6, 8, 19, 22, 0, 132, 114, 111, 103, 114, 97,
+  109, 0, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 18, 9, 18, 6, 0, 131, 110,
+  102, 111, 114, 109, 0, 68, 166, 11, 7, 206, 11, 8, 215, 11, 10, 58, 12, 12,
+  141, 12, 14, 153, 12, 18, 192, 12, 19, 108, 13, 21, 120, 13, 22, 131, 13, 24,
+  141, 13, 26, 164, 13, 0, 12, 0, 74, 175, 11, 23, 183, 11, 0, 4, 44, 0, 130,
+  97, 105, 110, 0, 81, 190, 11, 21, 198, 11, 0, 18, 6, 0, 130, 97, 105, 110, 0,
+  8, 6, 0, 130, 97, 105, 110, 0, 24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 231,
+  11, 8, 241, 11, 10, 27, 12, 19, 39, 12, 22, 48, 12, 0, 15, 12, 11, 6, 0, 129,
+  114, 101, 110, 0, 87, 248, 11, 26, 17, 12, 0, 72, 255, 11, 26, 7, 12, 0, 5, 0,
+  130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8, 5, 0,
+  131, 116, 119, 101, 101, 110, 0, 18, 7, 28, 11, 0, 131, 114, 111, 103, 101,
+  110, 0, 4, 11, 44, 0, 129, 112, 101, 110, 0, 18, 18, 11, 6, 0, 131, 115, 101,
+  110, 0, 72, 65, 12, 12, 76, 12, 0, 12, 21, 18, 9, 0, 131, 101, 105, 103, 110,
+  0, 75, 95, 12, 15, 101, 12, 17, 109, 12, 18, 118, 12, 21, 125, 12, 22, 132,
+  12, 0, 23, 0, 129, 110, 103, 0, 15, 4, 0, 131, 105, 103, 110, 0, 21, 4, 8, 15,
+  0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 23, 22, 0, 129, 110, 103, 0,
+  4, 44, 0, 130, 115, 105, 103, 110, 0, 23, 4, 21, 8, 6, 0, 131, 116, 97, 105,
+  110, 0, 75, 160, 12, 12, 169, 12, 0, 12, 23, 0, 131, 104, 105, 110, 107, 0,
+  75, 176, 12, 23, 182, 12, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0, 132, 116,
+  104, 105, 110, 107, 0, 76, 202, 12, 22, 86, 13, 23, 96, 13, 0, 70, 212, 12,
+  22, 225, 12, 23, 251, 12, 0, 12, 22, 8, 7, 0, 133, 99, 105, 115, 105, 111,
+  110, 0, 68, 232, 12, 22, 241, 12, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4,
+  6, 6, 18, 0, 131, 105, 111, 110, 0, 68, 14, 13, 7, 27, 13, 12, 37, 13, 15, 52,
+  13, 17, 64, 13, 22, 76, 13, 0, 21, 8, 5, 4, 0, 132, 114, 97, 116, 105, 111,
+  110, 0, 7, 4, 0, 131, 105, 116, 105, 111, 110, 0, 23, 12, 19, 8, 21, 0, 134,
+  101, 116, 105, 116, 105, 111, 110, 0, 4, 8, 21, 0, 133, 108, 97, 116, 105,
+  111, 110, 0, 6, 24, 9, 0, 133, 110, 99, 116, 105, 111, 110, 0, 18, 19, 0, 131,
+  105, 116, 105, 111, 110, 0, 12, 25, 12, 7, 0, 129, 105, 111, 110, 0, 12, 6, 4,
+  21, 9, 0, 131, 116, 105, 111, 110, 0, 19, 11, 4, 0, 132, 104, 97, 112, 112,
+  101, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 10, 12, 11, 23, 0,
+  130, 110, 103, 115, 0, 85, 148, 13, 23, 157, 13, 0, 23, 8, 21, 0, 130, 117,
+  114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 18, 14, 17, 24, 0, 130, 110, 111,
+  119, 110, 0, 71, 185, 13, 17, 196, 13, 26, 205, 13, 0, 8, 24, 22, 19, 0, 131,
+  101, 117, 100, 111, 0, 26, 14, 44, 0, 130, 110, 111, 119, 0, 79, 212, 13, 17,
+  220, 13, 0, 15, 18, 9, 0, 129, 111, 119, 0, 14, 44, 0, 129, 111, 119, 0, 86,
+  234, 13, 24, 244, 13, 0, 4, 11, 21, 8, 19, 0, 129, 112, 115, 0, 18, 18, 15, 0,
+  129, 107, 117, 112, 0, 68, 28, 14, 8, 93, 14, 11, 103, 15, 15, 113, 15, 18,
+  127, 15, 19, 144, 15, 22, 155, 15, 23, 164, 15, 24, 176, 15, 28, 185, 15, 0,
+  76, 38, 14, 15, 48, 14, 24, 82, 14, 0, 15, 12, 16, 12, 22, 0, 130, 97, 114, 0,
+  76, 55, 14, 24, 66, 14, 0, 16, 16, 12, 22, 0, 132, 105, 108, 97, 114, 0, 6,
+  12, 23, 4, 19, 0, 134, 114, 116, 105, 99, 117, 108, 97, 114, 0, 15, 10, 8, 21,
+  0, 131, 117, 108, 97, 114, 0, 68, 124, 14, 7, 132, 14, 11, 145, 14, 12, 203,
+  14, 15, 229, 14, 16, 239, 14, 17, 249, 14, 18, 37, 15, 23, 45, 15, 25, 76, 15,
+  0, 15, 6, 0, 130, 101, 97, 114, 0, 17, 4, 15, 4, 6, 0, 132, 101, 110, 100, 97,
+  114, 0, 74, 152, 14, 23, 163, 14, 0, 12, 8, 11, 0, 133, 105, 103, 104, 101,
+  114, 0, 72, 173, 14, 15, 185, 14, 24, 194, 14, 0, 11, 10, 18, 23, 0, 133, 101,
+  116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0, 9, 0, 131, 114,
+  116, 104, 101, 114, 0, 75, 210, 14, 15, 218, 14, 0, 23, 44, 0, 130, 101, 105,
+  114, 0, 19, 16, 18, 6, 0, 131, 105, 108, 101, 114, 0, 23, 12, 9, 0, 131, 108,
+  116, 101, 114, 0, 16, 4, 21, 10, 44, 0, 129, 97, 114, 0, 76, 0, 15, 23, 12,
+  15, 0, 10, 10, 8, 5, 0, 132, 105, 110, 110, 101, 114, 0, 76, 19, 15, 22, 28,
+  15, 0, 18, 19, 0, 131, 110, 116, 101, 114, 0, 12, 15, 0, 130, 101, 110, 101,
+  114, 0, 9, 8, 5, 0, 129, 114, 101, 0, 75, 52, 15, 24, 62, 15, 0, 18, 17, 4, 0,
+  131, 116, 104, 101, 114, 0, 19, 18, 16, 6, 0, 134, 111, 109, 112, 117, 116,
+  101, 114, 0, 72, 83, 15, 26, 94, 15, 0, 8, 21, 8, 11, 26, 0, 131, 118, 101,
+  114, 0, 18, 11, 0, 130, 101, 118, 101, 114, 0, 8, 23, 18, 44, 0, 130, 104,
+  101, 114, 0, 4, 24, 6, 12, 23, 21, 4, 19, 0, 130, 108, 97, 114, 0, 23, 4, 21,
+  8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 23, 15, 15, 24,
+  17, 0, 130, 112, 116, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 18, 4, 21, 8,
+  19, 18, 0, 130, 116, 111, 114, 0, 6, 18, 44, 0, 129, 99, 117, 114, 0, 8, 25,
+  8, 44, 0, 129, 114, 121, 0, 68, 219, 15, 8, 3, 16, 10, 147, 16, 19, 158, 16,
+  21, 170, 16, 22, 181, 16, 23, 77, 17, 24, 85, 17, 0, 75, 229, 15, 19, 240, 15,
+  28, 250, 15, 0, 19, 21, 8, 19, 0, 131, 104, 97, 112, 115, 0, 11, 21, 8, 19, 0,
+  130, 97, 112, 115, 0, 26, 15, 4, 0, 130, 97, 121, 115, 0, 68, 19, 16, 6, 42,
+  16, 12, 53, 16, 15, 129, 16, 22, 136, 16, 0, 71, 26, 16, 14, 34, 16, 0, 12,
+  44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0, 8, 7, 17, 12,
+  0, 131, 105, 99, 101, 115, 0, 70, 63, 16, 21, 102, 16, 23, 117, 16, 0, 72, 70,
+  16, 12, 80, 16, 0, 7, 17, 12, 0, 132, 105, 99, 101, 115, 0, 71, 87, 16, 23,
+  94, 16, 0, 17, 12, 0, 130, 101, 115, 0, 21, 8, 25, 0, 130, 101, 115, 0, 18,
+  22, 8, 6, 6, 4, 0, 132, 115, 111, 114, 105, 101, 115, 0, 15, 12, 5, 4, 0, 131,
+  105, 116, 105, 101, 115, 0, 4, 9, 0, 129, 115, 101, 0, 18, 11, 6, 44, 0, 130,
+  111, 115, 101, 115, 0, 12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 4, 8,
+  11, 21, 8, 19, 0, 131, 97, 112, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97, 114,
+  115, 0, 68, 191, 16, 8, 203, 16, 18, 66, 17, 0, 21, 4, 5, 16, 8, 0, 130, 114,
+  97, 115, 115, 0, 70, 216, 16, 17, 240, 16, 21, 13, 17, 22, 42, 17, 0, 70, 223,
+  16, 24, 232, 16, 0, 18, 21, 19, 0, 131, 101, 115, 115, 0, 22, 0, 130, 99, 101,
+  115, 115, 0, 76, 247, 16, 22, 3, 17, 0, 22, 22, 24, 5, 0, 133, 105, 110, 101,
+  115, 115, 0, 24, 5, 0, 131, 105, 110, 101, 115, 115, 0, 19, 0, 85, 22, 17, 24,
+  33, 17, 0, 24, 22, 0, 133, 112, 112, 114, 101, 115, 115, 0, 22, 0, 131, 112,
+  114, 101, 115, 115, 0, 70, 49, 17, 18, 58, 17, 0, 6, 24, 22, 0, 131, 101, 115,
+  115, 0, 19, 0, 130, 115, 101, 115, 115, 0, 21, 6, 6, 4, 0, 132, 114, 111, 115,
+  115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 82, 92, 17, 22, 106, 17, 0, 15, 18,
+  16, 18, 17, 4, 0, 132, 97, 108, 111, 117, 115, 0, 17, 8, 6, 17, 18, 6, 0, 133,
+  115, 101, 110, 115, 117, 115, 0, 68, 158, 17, 8, 188, 17, 10, 217, 17, 11,
+  227, 17, 12, 25, 18, 15, 36, 18, 16, 47, 18, 17, 59, 18, 18, 151, 19, 19, 189,
+  19, 22, 217, 19, 24, 107, 20, 0, 85, 165, 17, 26, 176, 17, 0, 8, 19, 8, 22, 0,
+  131, 97, 114, 97, 116, 0, 11, 8, 16, 18, 22, 0, 131, 119, 104, 97, 116, 0, 68,
+  195, 17, 17, 204, 17, 0, 21, 10, 44, 0, 130, 101, 97, 116, 0, 16, 17, 21, 8,
+  25, 18, 10, 0, 130, 101, 110, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0,
+  71, 237, 17, 10, 244, 17, 12, 14, 18, 0, 12, 26, 0, 129, 116, 104, 0, 81, 251,
+  17, 24, 2, 18, 0, 8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111,
+  117, 103, 104, 116, 0, 10, 17, 18, 23, 0, 131, 105, 103, 104, 116, 0, 23, 24,
+  18, 5, 4, 0, 129, 32, 105, 116, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116,
+  0, 4, 23, 21, 18, 19, 16, 12, 0, 129, 110, 116, 0, 68, 72, 18, 8, 128, 18, 21,
+  132, 19, 22, 143, 19, 0, 76, 85, 18, 17, 96, 18, 21, 107, 18, 23, 117, 18, 0,
+  19, 12, 6, 8, 21, 0, 130, 101, 110, 116, 0, 12, 16, 18, 21, 19, 0, 130, 101,
+  110, 116, 0, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 8, 19, 16, 18, 6, 0, 130,
+  101, 110, 116, 0, 76, 144, 18, 16, 177, 18, 21, 21, 19, 25, 111, 19, 29, 121,
+  19, 0, 70, 151, 18, 19, 164, 18, 0, 8, 9, 9, 8, 0, 133, 105, 99, 105, 101,
+  110, 116, 0, 8, 6, 8, 21, 0, 133, 105, 112, 105, 101, 110, 116, 0, 72, 190,
+  18, 17, 202, 18, 21, 235, 18, 23, 10, 19, 0, 25, 18, 10, 0, 131, 114, 110,
+  109, 101, 110, 116, 0, 72, 209, 18, 21, 221, 18, 0, 25, 18, 10, 0, 132, 114,
+  110, 109, 101, 110, 116, 0, 18, 25, 18, 10, 0, 134, 101, 114, 110, 109, 101,
+  110, 116, 0, 72, 242, 18, 18, 253, 18, 0, 25, 18, 10, 0, 131, 110, 109, 101,
+  110, 116, 0, 25, 18, 10, 0, 133, 101, 114, 110, 109, 101, 110, 116, 0, 4, 23,
+  22, 0, 131, 101, 109, 101, 110, 116, 0, 68, 34, 19, 8, 45, 19, 9, 57, 19, 21,
+  68, 19, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 9, 12, 7, 0, 132,
+  102, 101, 114, 101, 110, 116, 0, 9, 12, 7, 0, 131, 101, 114, 101, 110, 116, 0,
+  68, 75, 19, 8, 99, 19, 0, 19, 0, 68, 84, 19, 19, 92, 19, 0, 133, 112, 97, 114,
+  101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 9, 12, 7, 0, 133, 102, 101,
+  114, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 12, 17, 10, 18,
+  6, 0, 130, 97, 110, 116, 0, 8, 9, 9, 12, 7, 0, 129, 101, 110, 116, 0, 18, 6,
+  0, 130, 110, 115, 116, 0, 81, 161, 19, 21, 171, 19, 22, 180, 19, 0, 7, 12, 7,
+  0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116, 0, 16, 15, 4,
+  0, 130, 111, 115, 116, 0, 72, 196, 19, 28, 207, 19, 0, 12, 6, 8, 21, 0, 131,
+  101, 105, 112, 116, 0, 6, 17, 8, 0, 130, 114, 121, 112, 116, 0, 72, 236, 19,
+  10, 21, 20, 12, 30, 20, 16, 59, 20, 17, 69, 20, 24, 96, 20, 0, 74, 243, 19,
+  21, 10, 20, 0, 76, 250, 19, 24, 2, 20, 0, 11, 0, 130, 104, 101, 115, 116, 0,
+  22, 0, 130, 103, 101, 115, 116, 0, 23, 17, 12, 0, 131, 101, 114, 101, 115,
+  116, 0, 21, 4, 15, 0, 129, 101, 115, 116, 0, 73, 37, 20, 17, 49, 20, 0, 8, 17,
+  4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 4, 10, 4, 0, 131, 105, 110, 115,
+  116, 0, 18, 15, 4, 0, 131, 109, 111, 115, 116, 0, 68, 76, 20, 17, 87, 20, 0,
+  12, 10, 4, 0, 132, 97, 105, 110, 115, 116, 0, 12, 4, 10, 4, 0, 130, 115, 116,
+  0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0, 70, 120, 20, 18, 144, 20,
+  19, 168, 20, 23, 191, 20, 0, 72, 127, 20, 21, 137, 20, 0, 6, 27, 8, 0, 132,
+  101, 99, 117, 116, 0, 12, 6, 0, 128, 105, 116, 0, 68, 151, 20, 5, 160, 20, 0,
+  5, 0, 132, 97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 175,
+  20, 24, 183, 20, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112,
+  117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129,
+  117, 116, 0, 72, 217, 20, 12, 253, 20, 0, 68, 224, 20, 12, 231, 20, 0, 11, 44,
+  0, 129, 118, 101, 0, 70, 238, 20, 8, 246, 20, 0, 8, 21, 0, 130, 101, 105, 118,
+  0, 6, 8, 21, 0, 129, 118, 0, 8, 11, 6, 4, 44, 0, 130, 105, 101, 118, 0, 76,
+  15, 21, 17, 25, 21, 0, 8, 25, 8, 21, 0, 130, 105, 101, 119, 0, 18, 14, 44, 0,
+  130, 110, 111, 119, 0, 70, 59, 21, 8, 118, 21, 11, 128, 21, 15, 146, 21, 17,
+  87, 22, 21, 114, 22, 22, 12, 23, 23, 39, 23, 0, 68, 72, 21, 8, 84, 21, 12, 95,
+  21, 19, 106, 21, 0, 21, 6, 18, 19, 28, 11, 0, 130, 105, 115, 121, 0, 24, 20,
+  8, 21, 9, 0, 129, 110, 99, 121, 0, 21, 6, 18, 19, 28, 11, 0, 129, 115, 121, 0,
+  24, 21, 14, 17, 4, 5, 0, 129, 116, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116,
+  121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121,
+  0, 68, 165, 21, 11, 232, 21, 14, 242, 21, 15, 250, 21, 18, 66, 22, 21, 76, 22,
+  0, 69, 184, 21, 8, 193, 21, 15, 199, 21, 17, 208, 21, 21, 215, 21, 24, 224,
+  21, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0,
+  131, 97, 108, 108, 121, 0, 12, 9, 0, 128, 108, 121, 0, 8, 17, 8, 10, 0, 128,
+  108, 121, 0, 23, 6, 4, 0, 128, 108, 121, 0, 10, 12, 15, 22, 0, 129, 116, 108,
+  121, 0, 12, 15, 0, 129, 101, 108, 121, 0, 68, 4, 22, 5, 47, 22, 8, 56, 22, 0,
+  86, 11, 22, 23, 35, 22, 0, 24, 0, 108, 20, 22, 22, 27, 22, 0, 131, 117, 97,
+  108, 108, 121, 0, 24, 0, 132, 97, 108, 108, 121, 0, 24, 6, 4, 0, 133, 116,
+  117, 97, 108, 108, 121, 0, 4, 5, 18, 21, 19, 0, 129, 121, 0, 4, 21, 0, 132,
+  101, 97, 108, 108, 121, 0, 16, 18, 17, 4, 0, 130, 97, 108, 121, 0, 4, 16, 12,
+  21, 19, 0, 129, 105, 108, 121, 0, 72, 94, 22, 19, 103, 22, 0, 18, 16, 44, 0,
+  130, 110, 101, 121, 0, 4, 16, 18, 6, 0, 131, 112, 97, 110, 121, 0, 68, 127,
+  22, 8, 231, 22, 18, 240, 22, 23, 253, 22, 0, 69, 143, 22, 12, 152, 22, 15,
+  165, 22, 16, 193, 22, 22, 202, 22, 0, 12, 15, 0, 130, 114, 97, 114, 121, 0,
+  15, 15, 12, 27, 24, 4, 0, 132, 105, 97, 114, 121, 0, 76, 172, 22, 15, 182, 22,
+  0, 27, 24, 4, 0, 130, 105, 97, 114, 121, 0, 12, 27, 24, 4, 0, 131, 105, 97,
+  114, 121, 0, 24, 22, 0, 130, 109, 97, 114, 121, 0, 8, 6, 0, 70, 212, 22, 8,
+  223, 22, 0, 8, 17, 0, 133, 101, 115, 115, 97, 114, 121, 0, 17, 0, 130, 115,
+  97, 114, 121, 0, 19, 18, 21, 19, 0, 128, 116, 121, 0, 10, 4, 23, 4, 6, 0, 132,
+  101, 103, 111, 114, 121, 0, 17, 24, 6, 18, 44, 0, 134, 99, 111, 117, 110, 116,
+  114, 121, 0, 4, 0, 85, 21, 23, 26, 32, 23, 0, 6, 18, 19, 28, 11, 0, 130, 105,
+  115, 121, 0, 15, 4, 0, 129, 121, 115, 0, 73, 49, 23, 15, 57, 23, 21, 66, 23,
+  0, 4, 22, 0, 129, 101, 116, 121, 0, 12, 5, 4, 0, 129, 105, 116, 121, 0, 19, 8,
+  18, 21, 19, 0, 132, 112, 101, 114, 116, 121, 0};
+

+ 722 - 0
users/gourdo1/autocorrect/autocorrection_data.h (large)

@@ -0,0 +1,722 @@
+// Generated code.
+
+// Autocorrection dictionary (400 entries):
+//   :acheiv    -> achiev
+//   :agian     -> again
+//   :agred     -> agreed
+//   :ajust     -> adjust
+//   :alot:     -> a lot
+//   :andteh    -> and the
+//   :andthe    -> and the
+//   :anual     -> annual
+//   :asign     -> assign
+//   :aslo:     -> also
+//   :asthe     -> as the
+//   :atthe     -> at the
+//   :casue     -> cause
+//   :choses    -> chooses
+//   :eveyr     -> every
+//   :foudn     -> found
+//   :gaurd     -> guard
+//   :goign     -> going
+//   :gonig     -> going
+//   :graet     -> great
+//   :grammer   -> grammar
+//   :guage     -> gauge
+//   :haev      -> have
+//   :hapen     -> happen
+//   :htere     -> there
+//   :htikn     -> think
+//   :htink     -> think
+//   :hwihc     -> which
+//   :hwile     -> while
+//   :idaes     -> ideas
+//   :jstu:     -> just
+//   :jsut:     -> just
+//   :knwo      -> know
+//   :konw      -> know
+//   :kwno      -> know
+//   :moeny     -> money
+//   :ocuntry   -> country
+//   :ocur      -> occur
+//   :olther    -> other
+//   :otehr     -> other
+//   :owudl     -> would
+//   :rference  -> reference
+//   :sicne     -> since
+//   :socre     -> score
+//   :szie      -> size
+//   :the:the:  -> the
+//   :theri     -> their
+//   :thier     -> their
+//   :thsoe     -> those
+//   :tothe     -> to the
+//   :ture      -> true
+//   :turth     -> truth
+//   :uesd:     -> used
+//   :usally    -> usually
+//   :yaers     -> years
+//   :yeasr     -> years
+//   abbout     -> about
+//   aberation  -> aberration
+//   abilties   -> abilities
+//   abilty     -> ability
+//   abotu      -> about
+//   abouta     -> about a
+//   aboutit    -> about it
+//   aboutthe   -> about the
+//   abvove     -> above
+//   accesories -> accessories
+//   accomodate -> accommodate
+//   accross    -> across
+//   acommodate -> accommodate
+//   acomplish  -> accomplish
+//   actualy    -> actually
+//   acurate    -> accurate
+//   acutally   -> actually
+//   addtion    -> addition
+//   adviced    -> advised
+//   againnst   -> against
+//   aganist    -> against
+//   aggreed    -> agreed
+//   agianst    -> against
+//   ahppn      -> happen
+//   aledge     -> allege
+//   alledge    -> allege
+//   allign     -> align
+//   almsot     -> almost
+//   alomst     -> almost
+//   alwasy     -> always
+//   alwyas     -> always
+//   amature    -> amateur
+//   anohter    -> another
+//   anomolous  -> anomalous
+//   anomoly    -> anomaly
+//   anytying   -> anything
+//   aparent    -> apparent
+//   aparrent   -> apparent
+//   apparant   -> apparent
+//   apparrent  -> apparent
+//   aquire     -> acquire
+//   aroud      -> around
+//   arround    -> around
+//   arund      -> around
+//   asthetic   -> aesthetic
+//   auxilary   -> auxiliary
+//   auxillary  -> auxiliary
+//   auxilliary -> auxiliary
+//   availabe   -> available
+//   availaible -> available
+//   availalbe  -> available
+//   availble   -> available
+//   availiable -> available
+//   avalable   -> available
+//   avaliable  -> available
+//   avilable   -> available
+//   baceause   -> because
+//   bandwith   -> bandwidth
+//   bankrupcy  -> bankruptcy
+//   baout      -> about
+//   beacuse    -> because
+//   becasue    -> because
+//   beccause   -> because
+//   becouse    -> because
+//   becuase    -> because
+//   bedore     -> before
+//   beeing     -> being
+//   befoer     -> before
+//   begginer   -> beginner
+//   beleif     -> belief
+//   beleive    -> believe
+//   belive     -> believe
+//   beteen     -> between
+//   beween     -> between
+//   bewteen    -> between
+//   breif      -> brief
+//   burried    -> buried
+//   busness    -> business
+//   bussiness  -> business
+//   cacheing   -> caching
+//   calander   -> calendar
+//   caluclate  -> calculate
+//   caluculate -> calculate
+//   calulate   -> calculate
+//   catagory   -> category
+//   cauhgt     -> caught
+//   ceratin    -> certain
+//   certian    -> certain
+//   cheif      -> chief
+//   chekc      -> check
+//   childen    -> children
+//   chnage     -> change
+//   choosen    -> chosen
+//   cieling    -> ceiling
+//   circut     -> circuit
+//   claer      -> clear
+//   clasic     -> classic
+//   cmoputer   -> computer
+//   coform     -> conform
+//   cognizent  -> cognizant
+//   collegue   -> colleague
+//   comapny    -> company
+//   comittee   -> committee
+//   comming:   -> coming
+//   commitee   -> committee
+//   competance -> competence
+//   competant  -> competent
+//   complier   -> compiler
+//   concensus  -> consensus
+//   considerd  -> considered
+//   contian    -> contain
+//   copywrite: -> copyright
+//   cosnt      -> const
+//   coudl      -> could
+//   dervied    -> derived
+//   desicion   -> decision
+//   didnot     -> did not
+//   diferent   -> different
+//   diferrent  -> different
+//   differnt   -> different
+//   diffrent   -> different
+//   divison    -> division
+//   doulbe     -> double
+//   dyanmic    -> dynamic
+//   effecient  -> efficient
+//   elasped    -> elapsed
+//   eligable   -> eligible
+//   elpased    -> elapsed
+//   embarass   -> embarrass
+//   embeded    -> embedded
+//   encypt     -> encrypt
+//   excecut    -> execut
+//   excercise  -> exercise
+//   failse     -> false
+//   fales      -> false
+//   fasle      -> false
+//   feild      -> field
+//   finaly     -> finally
+//   firend     -> friend
+//   firts      -> first
+//   fitler     -> filter
+//   flase      -> false
+//   follwo     -> follow
+//   foriegn    -> foreign
+//   foward     -> forward
+//   fraciton   -> fraction
+//   freind     -> friend
+//   frequecy   -> frequency
+//   fromthe    -> from the
+//   fucntion   -> function
+//   fufill     -> fulfill
+//   fullfill   -> fulfill
+//   futher     -> further
+//   ganerate   -> generate
+//   garantee   -> guarantee
+//   gaurantee  -> guarantee
+//   generaly   -> generally
+//   govement   -> government
+//   govenment  -> government
+//   goverment  -> government
+//   governmnet -> government
+//   govorment  -> government
+//   govornment -> government
+//   greatful   -> grateful
+//   guaratee   -> guarantee
+//   heigher    -> higher
+//   heigth     -> height
+//   heirarchy  -> hierarchy
+//   higest     -> highest
+//   howver     -> however
+//   hydogen    -> hydrogen
+//   hygeine    -> hygiene
+//   hypocracy  -> hypocrisy
+//   hypocrasy  -> hypocrisy
+//   hypocricy  -> hypocrisy
+//   hypocrit:  -> hypocrite
+//   iamge      -> image
+//   importamt  -> important
+//   inclued    -> include
+//   indeces    -> indices
+//   indecies   -> indices
+//   indicies   -> indices
+//   inital     -> initial
+//   insted     -> instead
+//   interator  -> iterator
+//   intput     -> input
+//   intrest    -> interest
+//   invliad    -> invalid
+//   laguage    -> language
+//   largst     -> largest
+//   learnign   -> learning
+//   lenght     -> length
+//   levle      -> level
+//   liasion    -> liaison
+//   libary     -> library
+//   likly      -> likely
+//   lisense    -> license
+//   listner    -> listener
+//   littel     -> little
+//   looses:    -> loses
+//   looup      -> lookup
+//   macthing   -> matching
+//   maintence  -> maintenance
+//   manefist   -> manifest
+//   mesage     -> message
+//   morgage    -> mortgage
+//   mysefl     -> myself
+//   namesapce  -> namespace
+//   namespcae  -> namespace
+//   naturual   -> natural
+//   neccesary  -> necessary
+//   necesary   -> necessary
+//   nulltpr    -> nullptr
+//   occassion  -> occasion
+//   occured    -> occurred
+//   operaotr   -> operator
+//   ouptut     -> output
+//   ouput      -> output
+//   overide    -> override
+//   ovveride   -> override
+//   pallete    -> palette
+//   paralel    -> parallel
+//   parralel   -> parallel
+//   parrallel  -> parallel
+//   particualr -> particular
+//   paticular  -> particular
+//   peaple     -> people
+//   peice      -> piece
+//   peolpe     -> people
+//   peopel     -> people
+//   perhasp    -> perhaps
+//   perheaps   -> perhaps
+//   perhpas    -> perhaps
+//   perphas    -> perhaps
+//   persue     -> pursue
+//   poeople    -> people
+//   poeple     -> people
+//   poitner    -> pointer
+//   posess     -> possess
+//   postion    -> position
+//   preiod     -> period
+//   primarly   -> primarily
+//   priviledge -> privilege
+//   privte     -> private
+//   probablly  -> probably
+//   probaly    -> probably
+//   probelm    -> problem
+//   proccess   -> process
+//   proeprty   -> property
+//   prominant  -> prominent
+//   proove     -> prove
+//   propery    -> property
+//   propogate  -> propagate
+//   psuedo     -> pseudo
+//   raelly     -> really
+//   realtion   -> relation
+//   realy      -> really
+//   reasearch  -> research
+//   receiev    -> receiv
+//   recepient  -> recipient
+//   reciept    -> receipt
+//   reciev     -> receiv
+//   recipiant  -> recipient
+//   recrod     -> record
+//   recuring   -> recurring
+//   referece   -> reference
+//   refered    -> referred
+//   regluar    -> regular
+//   relaly     -> really
+//   releated   -> related
+//   relevent   -> relevant
+//   repitition -> repetition
+//   reponse    -> response
+//   reprot     -> report
+//   resutl     -> result
+//   retrun     -> return
+//   retun      -> return
+//   reuslt     -> result
+//   reutrn     -> return
+//   reveiw     -> review
+//   saftey     -> safety
+//   safty      -> safety
+//   satisifed  -> satisfied
+//   scheduel   -> schedule
+//   seperat    -> separat
+//   sequnce    -> sequence
+//   shoudl     -> should
+//   similiar   -> similar
+//   simmilar   -> similar
+//   singed     -> signed
+//   singel     -> single
+//   slighly    -> slightly
+//   somehwat   -> somewhat
+//   spectogram -> spectrogram
+//   statment   -> statement
+//   stirng     -> string
+//   stregth    -> strength
+//   strengh    -> strength
+//   strign     -> string
+//   succsess   -> success
+//   sucess     -> success
+//   sugest     -> suggest
+//   sumary     -> summary
+//   supress    -> suppress
+//   surpress   -> suppress
+//   swithc     -> switch
+//   swtich     -> switch
+//   symetric   -> symmetric
+//   teamplate  -> template
+//   tempalte   -> template
+//   theese     -> these
+//   therfore   -> therefore
+//   thign      -> thing
+//   thigsn     -> things
+//   thikn      -> think
+//   thiunk     -> think
+//   thnigs     -> things
+//   thresold   -> threshold
+//   throught   -> thought
+//   tihkn      -> think
+//   tkaes      -> takes
+//   todya      -> today
+//   toghether  -> together
+//   tolerence  -> tolerance
+//   tongiht    -> tonight
+//   tranpose   -> transpose
+//   typcial    -> typical
+//   udpate     -> update
+//   unkown     -> unknown
+//   unqiue     -> unique
+//   ususally   -> usually
+//   verticies  -> vertices
+//   virutal    -> virtual
+//   vitual     -> virtual
+//   whcih      -> which
+//   whereever  -> wherever
+//   wherre     -> where
+//   whihc      -> which
+//   whlch      -> which
+//   widht      -> width
+//   wierd      -> weird
+//   wihch      -> which
+//   woudl      -> would
+//   yeild      -> yield
+
+#define AUTOCORRECTION_MIN_LENGTH 5  // "abotu"
+#define AUTOCORRECTION_MAX_LENGTH 10  // "auxilliary"
+
+static const uint8_t autocorrection_data[5967] PROGMEM = {108, 67, 0, 4, 212, 0,
+  6, 236, 0, 7, 100, 1, 8, 15, 3, 9, 169, 8, 10, 204, 8, 11, 68, 9, 12, 246, 9,
+  14, 0, 10, 15, 28, 10, 16, 79, 11, 17, 129, 11, 18, 175, 13, 19, 227, 13, 21,
+  253, 13, 22, 194, 15, 23, 121, 17, 24, 201, 20, 25, 210, 20, 26, 8, 21, 28,
+  34, 21, 0, 71, 89, 0, 8, 99, 0, 10, 130, 0, 18, 142, 0, 22, 152, 0, 23, 163,
+  0, 24, 202, 0, 0, 22, 8, 24, 44, 0, 131, 115, 101, 100, 0, 75, 106, 0, 23,
+  115, 0, 0, 23, 44, 8, 11, 23, 44, 0, 132, 0, 12, 21, 26, 28, 19, 18, 6, 0,
+  133, 114, 105, 103, 104, 116, 0, 17, 12, 16, 16, 18, 6, 0, 132, 105, 110, 103,
+  0, 15, 22, 4, 44, 0, 131, 108, 115, 111, 0, 8, 22, 18, 18, 15, 0, 132, 115,
+  101, 115, 0, 76, 173, 0, 18, 183, 0, 24, 193, 0, 0, 21, 6, 18, 19, 28, 11, 0,
+  128, 101, 0, 15, 4, 44, 0, 131, 32, 108, 111, 116, 0, 22, 13, 44, 0, 131, 117,
+  115, 116, 0, 23, 22, 13, 44, 0, 131, 117, 115, 116, 0, 87, 219, 0, 28, 228, 0,
+  0, 24, 18, 5, 4, 0, 128, 32, 97, 0, 7, 18, 23, 0, 129, 97, 121, 0, 75, 246, 0,
+  12, 28, 1, 14, 92, 1, 0, 76, 253, 0, 23, 20, 1, 0, 75, 4, 1, 26, 10, 1, 0, 26,
+  0, 129, 99, 104, 0, 11, 44, 0, 132, 119, 104, 105, 99, 104, 0, 12, 26, 22, 0,
+  129, 99, 104, 0, 80, 41, 1, 21, 53, 1, 22, 67, 1, 23, 76, 1, 0, 17, 4, 28, 7,
+  0, 132, 110, 97, 109, 105, 99, 0, 23, 8, 16, 28, 22, 0, 132, 109, 101, 116,
+  114, 105, 99, 0, 4, 15, 6, 0, 129, 115, 105, 99, 0, 8, 11, 23, 22, 4, 0, 134,
+  101, 115, 116, 104, 101, 116, 105, 99, 0, 8, 11, 6, 0, 129, 99, 107, 0, 68,
+  122, 1, 8, 134, 1, 15, 84, 2, 17, 124, 2, 18, 180, 2, 21, 207, 2, 24, 7, 3, 0,
+  12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 70, 168, 1, 7, 178, 1, 8,
+  188, 1, 9, 199, 1, 10, 212, 1, 12, 222, 1, 19, 248, 1, 21, 3, 2, 22, 38, 2,
+  23, 50, 2, 24, 75, 2, 0, 12, 25, 7, 4, 0, 130, 115, 101, 100, 0, 8, 5, 16, 8,
+  0, 129, 100, 101, 100, 0, 21, 10, 10, 4, 0, 132, 114, 101, 101, 100, 0, 12,
+  22, 12, 23, 4, 22, 0, 131, 102, 105, 101, 100, 0, 17, 12, 22, 0, 131, 103,
+  110, 101, 100, 0, 85, 229, 1, 25, 238, 1, 0, 21, 24, 5, 0, 131, 105, 101, 100,
+  0, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 22, 4, 15, 8, 0, 131, 112, 115,
+  101, 100, 0, 72, 13, 2, 10, 22, 2, 24, 29, 2, 0, 9, 8, 21, 0, 129, 114, 101,
+  100, 0, 4, 44, 0, 128, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0, 4, 19,
+  15, 8, 0, 132, 97, 112, 115, 101, 100, 0, 68, 57, 2, 22, 68, 2, 0, 8, 15, 8,
+  21, 0, 132, 97, 116, 101, 100, 0, 17, 12, 0, 128, 97, 100, 0, 15, 6, 17, 12,
+  0, 129, 100, 101, 0, 76, 91, 2, 18, 112, 2, 0, 8, 0, 73, 100, 2, 28, 106, 2,
+  0, 131, 105, 101, 108, 100, 0, 131, 105, 101, 108, 100, 0, 22, 8, 21, 11, 23,
+  0, 130, 104, 111, 108, 100, 0, 72, 134, 2, 12, 145, 2, 24, 155, 2, 0, 21, 12,
+  9, 0, 132, 114, 105, 101, 110, 100, 0, 8, 21, 9, 0, 131, 105, 101, 110, 100,
+  0, 82, 162, 2, 21, 172, 2, 0, 21, 21, 4, 0, 132, 111, 117, 110, 100, 0, 4, 0,
+  130, 111, 117, 110, 100, 0, 76, 187, 2, 21, 198, 2, 0, 8, 21, 19, 0, 132, 101,
+  114, 105, 111, 100, 0, 6, 8, 21, 0, 130, 111, 114, 100, 0, 68, 217, 2, 8, 228,
+  2, 24, 253, 2, 0, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 71, 235, 2,
+  12, 245, 2, 0, 12, 22, 17, 18, 6, 0, 128, 101, 100, 0, 26, 0, 131, 101, 105,
+  114, 100, 0, 4, 10, 44, 0, 131, 117, 97, 114, 100, 0, 18, 21, 4, 0, 128, 110,
+  100, 0, 68, 67, 3, 5, 80, 3, 6, 123, 3, 7, 251, 3, 8, 23, 4, 10, 107, 4, 11,
+  227, 4, 12, 52, 5, 15, 61, 5, 17, 0, 6, 18, 27, 6, 19, 37, 6, 21, 47, 6, 22,
+  156, 6, 23, 82, 7, 24, 45, 8, 25, 115, 8, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130,
+  97, 99, 101, 0, 68, 87, 3, 15, 97, 3, 0, 15, 12, 4, 25, 4, 0, 128, 108, 101,
+  0, 68, 104, 3, 24, 115, 3, 0, 15, 12, 4, 25, 4, 0, 130, 98, 108, 101, 0, 18,
+  7, 0, 130, 98, 108, 101, 0, 72, 136, 3, 12, 147, 3, 17, 156, 3, 19, 238, 3, 0,
+  21, 8, 9, 8, 21, 0, 129, 110, 99, 101, 0, 8, 19, 0, 131, 105, 101, 99, 101, 0,
+  68, 166, 3, 8, 179, 3, 24, 228, 3, 0, 23, 8, 19, 16, 18, 6, 0, 131, 101, 110,
+  99, 101, 0, 85, 186, 3, 23, 217, 3, 0, 8, 0, 73, 195, 3, 15, 208, 3, 0, 21,
+  44, 0, 134, 101, 102, 101, 114, 101, 110, 99, 101, 0, 18, 23, 0, 131, 97, 110,
+  99, 101, 0, 17, 12, 4, 16, 0, 129, 97, 110, 99, 101, 0, 20, 8, 22, 0, 130,
+  101, 110, 99, 101, 0, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12,
+  21, 8, 25, 0, 82, 7, 4, 25, 13, 4, 0, 130, 114, 105, 100, 101, 0, 18, 0, 133,
+  101, 114, 114, 105, 100, 101, 0, 23, 0, 68, 38, 4, 12, 49, 4, 17, 59, 4, 23,
+  94, 4, 0, 21, 4, 24, 10, 0, 130, 110, 116, 101, 101, 0, 16, 16, 18, 6, 0, 129,
+  116, 101, 101, 0, 4, 21, 0, 68, 69, 4, 24, 81, 4, 0, 10, 0, 134, 117, 97, 114,
+  97, 110, 116, 101, 101, 0, 4, 10, 0, 135, 117, 97, 114, 97, 110, 116, 101,
+  101, 0, 12, 16, 18, 6, 0, 132, 109, 105, 116, 116, 101, 101, 0, 68, 117, 4, 7,
+  184, 4, 16, 218, 4, 0, 74, 130, 4, 17, 141, 4, 22, 150, 4, 24, 159, 4, 0, 21,
+  18, 16, 0, 131, 116, 103, 97, 103, 101, 0, 11, 6, 0, 131, 97, 110, 103, 101,
+  0, 8, 16, 0, 130, 115, 97, 103, 101, 0, 10, 0, 108, 168, 4, 4, 174, 4, 0, 131,
+  97, 117, 103, 101, 0, 15, 0, 132, 110, 103, 117, 97, 103, 101, 0, 8, 15, 0,
+  68, 197, 4, 12, 203, 4, 15, 212, 4, 0, 131, 108, 101, 103, 101, 0, 25, 12, 21,
+  19, 0, 130, 103, 101, 0, 4, 0, 130, 103, 101, 0, 4, 12, 0, 131, 109, 97, 103,
+  101, 0, 23, 0, 71, 245, 4, 16, 255, 4, 18, 9, 5, 22, 18, 5, 23, 27, 5, 0, 17,
+  4, 44, 0, 130, 32, 116, 104, 101, 0, 18, 21, 9, 0, 130, 32, 116, 104, 101, 0,
+  23, 44, 0, 130, 32, 116, 104, 101, 0, 4, 44, 0, 130, 32, 116, 104, 101, 0, 68,
+  34, 5, 24, 42, 5, 0, 44, 0, 130, 32, 116, 104, 101, 0, 18, 5, 4, 0, 130, 32,
+  116, 104, 101, 0, 29, 22, 44, 0, 130, 105, 122, 101, 0, 69, 77, 5, 12, 190, 5,
+  19, 201, 5, 22, 241, 5, 25, 249, 5, 0, 68, 87, 5, 12, 167, 5, 15, 179, 5, 0,
+  74, 97, 5, 12, 107, 5, 15, 137, 5, 0, 12, 15, 8, 0, 131, 105, 98, 108, 101, 0,
+  15, 0, 68, 116, 5, 12, 127, 5, 0, 25, 4, 0, 133, 105, 108, 97, 98, 108, 101,
+  0, 4, 25, 4, 0, 132, 97, 98, 108, 101, 0, 68, 144, 5, 12, 155, 5, 0, 25, 4, 0,
+  132, 105, 108, 97, 98, 108, 101, 0, 25, 4, 0, 133, 97, 105, 108, 97, 98, 108,
+  101, 0, 4, 15, 12, 4, 25, 4, 0, 131, 98, 108, 101, 0, 12, 4, 25, 4, 0, 130,
+  97, 98, 108, 101, 0, 26, 11, 44, 0, 132, 119, 104, 105, 108, 101, 0, 68, 211,
+  5, 8, 220, 5, 18, 230, 5, 0, 8, 19, 0, 131, 111, 112, 108, 101, 0, 18, 19, 0,
+  132, 101, 111, 112, 108, 101, 0, 8, 18, 19, 0, 133, 101, 111, 112, 108, 101,
+  0, 4, 9, 0, 130, 108, 115, 101, 0, 8, 15, 0, 129, 101, 108, 0, 70, 7, 6, 12,
+  16, 6, 0, 12, 22, 44, 0, 130, 110, 99, 101, 0, 8, 10, 28, 11, 0, 131, 105,
+  101, 110, 101, 0, 22, 11, 23, 44, 0, 130, 111, 115, 101, 0, 15, 18, 8, 19, 0,
+  130, 112, 108, 101, 0, 70, 66, 6, 8, 76, 6, 12, 87, 6, 18, 99, 6, 21, 127, 6,
+  24, 134, 6, 0, 18, 22, 44, 0, 131, 99, 111, 114, 101, 0, 23, 11, 44, 0, 132,
+  116, 104, 101, 114, 101, 0, 24, 20, 4, 0, 132, 99, 113, 117, 105, 114, 101, 0,
+  71, 106, 6, 9, 115, 6, 0, 8, 5, 0, 131, 102, 111, 114, 101, 0, 21, 8, 11, 23,
+  0, 131, 101, 102, 111, 114, 101, 0, 8, 11, 26, 0, 129, 101, 0, 23, 0, 108,
+  143, 6, 4, 148, 6, 0, 130, 114, 117, 101, 0, 16, 4, 0, 130, 101, 117, 114, 0,
+  68, 178, 6, 8, 203, 6, 12, 211, 6, 15, 226, 6, 17, 235, 6, 18, 9, 7, 24, 22,
+  7, 0, 79, 185, 6, 24, 193, 6, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0,
+  131, 97, 117, 115, 101, 0, 8, 11, 23, 0, 130, 115, 101, 0, 6, 21, 8, 6, 27, 8,
+  0, 134, 101, 114, 99, 105, 115, 101, 0, 12, 4, 9, 0, 131, 108, 115, 101, 0,
+  72, 242, 6, 18, 253, 6, 0, 22, 12, 15, 0, 132, 99, 101, 110, 115, 101, 0, 19,
+  8, 21, 0, 132, 115, 112, 111, 110, 115, 101, 0, 19, 17, 4, 21, 23, 0, 131,
+  115, 112, 111, 115, 101, 0, 68, 32, 7, 6, 61, 7, 18, 72, 7, 0, 70, 39, 7, 8,
+  49, 7, 0, 6, 8, 5, 0, 132, 97, 117, 115, 101, 0, 6, 4, 5, 0, 134, 101, 99, 97,
+  117, 115, 101, 0, 4, 8, 5, 0, 132, 99, 97, 117, 115, 101, 0, 6, 8, 5, 0, 131,
+  97, 117, 115, 101, 0, 68, 95, 7, 8, 13, 8, 15, 24, 8, 25, 36, 8, 0, 71, 111,
+  7, 10, 148, 7, 15, 161, 7, 19, 228, 7, 21, 238, 7, 0, 18, 16, 0, 80, 121, 7,
+  18, 136, 7, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0,
+  6, 6, 4, 0, 132, 109, 111, 100, 97, 116, 101, 0, 18, 19, 18, 21, 19, 0, 132,
+  97, 103, 97, 116, 101, 0, 70, 171, 7, 19, 184, 7, 24, 197, 7, 0, 24, 15, 4, 6,
+  0, 133, 99, 117, 108, 97, 116, 101, 0, 16, 4, 8, 23, 0, 134, 109, 112, 108,
+  97, 116, 101, 0, 70, 204, 7, 15, 217, 7, 0, 24, 15, 4, 6, 0, 134, 99, 117,
+  108, 97, 116, 101, 0, 4, 6, 0, 132, 99, 117, 108, 97, 116, 101, 0, 7, 24, 0,
+  132, 112, 100, 97, 116, 101, 0, 72, 245, 7, 24, 2, 8, 0, 17, 4, 10, 0, 134,
+  101, 110, 101, 114, 97, 116, 101, 0, 6, 4, 0, 132, 99, 117, 114, 97, 116, 101,
+  0, 15, 15, 4, 19, 0, 131, 101, 116, 116, 101, 0, 4, 19, 16, 8, 23, 0, 131,
+  108, 97, 116, 101, 0, 12, 21, 19, 0, 129, 97, 116, 101, 0, 74, 55, 8, 12, 67,
+  8, 22, 77, 8, 0, 8, 15, 15, 18, 6, 0, 130, 97, 103, 117, 101, 0, 20, 17, 24,
+  0, 131, 105, 113, 117, 101, 0, 68, 84, 8, 21, 105, 8, 0, 6, 0, 108, 93, 8, 8,
+  98, 8, 0, 130, 117, 115, 101, 0, 5, 0, 130, 117, 115, 101, 0, 8, 19, 0, 132,
+  117, 114, 115, 117, 101, 0, 76, 122, 8, 18, 147, 8, 0, 72, 129, 8, 15, 139, 8,
+  0, 15, 8, 5, 0, 131, 105, 101, 118, 101, 0, 8, 5, 0, 129, 101, 118, 101, 0,
+  82, 154, 8, 25, 161, 8, 0, 21, 19, 0, 130, 118, 101, 0, 5, 4, 0, 131, 111,
+  118, 101, 0, 12, 8, 0, 75, 182, 8, 15, 189, 8, 21, 197, 8, 0, 6, 0, 130, 105,
+  101, 102, 0, 8, 5, 0, 130, 105, 101, 102, 0, 5, 0, 130, 105, 101, 102, 0, 76,
+  211, 8, 17, 221, 8, 0, 17, 18, 10, 44, 0, 130, 105, 110, 103, 0, 76, 228, 8,
+  21, 58, 9, 0, 72, 244, 8, 11, 11, 9, 15, 24, 9, 21, 36, 9, 28, 47, 9, 0, 72,
+  251, 8, 11, 2, 9, 0, 5, 0, 131, 105, 110, 103, 0, 6, 4, 6, 0, 131, 105, 110,
+  103, 0, 23, 6, 4, 16, 0, 133, 116, 99, 104, 105, 110, 103, 0, 8, 12, 6, 0,
+  133, 101, 105, 108, 105, 110, 103, 0, 24, 6, 8, 21, 0, 130, 114, 105, 110,
+  103, 0, 23, 28, 17, 4, 0, 131, 104, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114,
+  105, 110, 103, 0, 70, 87, 9, 8, 142, 9, 10, 154, 9, 12, 164, 9, 22, 173, 9,
+  23, 191, 9, 0, 75, 100, 9, 12, 109, 9, 15, 119, 9, 21, 127, 9, 0, 12, 26, 0,
+  131, 104, 105, 99, 104, 0, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0, 11, 26,
+  0, 130, 105, 99, 104, 0, 4, 8, 22, 4, 8, 21, 0, 134, 115, 101, 97, 114, 99,
+  104, 0, 23, 7, 17, 4, 44, 0, 130, 32, 116, 104, 101, 0, 17, 8, 21, 23, 22, 0,
+  128, 116, 104, 0, 6, 11, 26, 0, 130, 105, 99, 104, 0, 12, 15, 19, 16, 18, 6,
+  4, 0, 134, 99, 111, 109, 112, 108, 105, 115, 104, 0, 74, 201, 9, 12, 225, 9,
+  21, 236, 9, 0, 72, 208, 9, 12, 218, 9, 0, 21, 23, 22, 0, 130, 110, 103, 116,
+  104, 0, 8, 11, 0, 129, 104, 116, 0, 26, 7, 17, 4, 5, 0, 129, 100, 116, 104, 0,
+  24, 23, 44, 0, 131, 114, 117, 116, 104, 0, 21, 8, 11, 23, 44, 0, 129, 105,
+  114, 0, 17, 0, 76, 9, 10, 24, 20, 10, 0, 23, 11, 44, 0, 132, 116, 104, 105,
+  110, 107, 0, 12, 11, 23, 0, 130, 110, 107, 0, 68, 50, 10, 7, 134, 10, 8, 177,
+  10, 9, 17, 11, 15, 26, 11, 23, 55, 11, 24, 64, 11, 0, 76, 60, 10, 23, 71, 10,
+  24, 96, 10, 0, 6, 19, 28, 23, 0, 131, 105, 99, 97, 108, 0, 76, 78, 10, 24, 86,
+  10, 0, 17, 12, 0, 129, 105, 97, 108, 0, 21, 12, 25, 0, 131, 116, 117, 97, 108,
+  0, 81, 106, 10, 21, 115, 10, 23, 124, 10, 0, 4, 44, 0, 130, 110, 117, 97, 108,
+  0, 24, 23, 4, 17, 0, 130, 97, 108, 0, 12, 25, 0, 131, 114, 116, 117, 97, 108,
+  0, 24, 0, 82, 143, 10, 26, 167, 10, 0, 70, 153, 10, 11, 157, 10, 26, 163, 10,
+  0, 129, 108, 100, 0, 22, 0, 129, 108, 100, 0, 129, 108, 100, 0, 18, 44, 0,
+  132, 119, 111, 117, 108, 100, 0, 74, 193, 10, 15, 201, 10, 19, 247, 10, 23,
+  255, 10, 24, 7, 11, 0, 17, 12, 22, 0, 129, 108, 101, 0, 68, 208, 10, 15, 234,
+  10, 0, 21, 0, 68, 217, 10, 21, 224, 10, 0, 19, 0, 129, 108, 101, 108, 0, 4,
+  19, 0, 132, 97, 108, 108, 101, 108, 0, 4, 21, 21, 4, 19, 0, 133, 97, 108, 108,
+  101, 108, 0, 18, 8, 19, 0, 129, 108, 101, 0, 23, 12, 15, 0, 129, 108, 101, 0,
+  7, 8, 11, 6, 22, 0, 129, 108, 101, 0, 8, 22, 28, 16, 0, 129, 108, 102, 0, 12,
+  9, 0, 79, 36, 11, 24, 46, 11, 0, 15, 24, 9, 0, 132, 102, 105, 108, 108, 0, 9,
+  0, 131, 108, 102, 105, 108, 108, 0, 24, 22, 8, 21, 0, 129, 108, 116, 0, 9, 23,
+  4, 8, 21, 10, 0, 133, 97, 116, 101, 102, 117, 108, 0, 68, 89, 11, 15, 106, 11,
+  21, 117, 11, 0, 21, 10, 18, 23, 6, 8, 19, 22, 0, 132, 114, 111, 103, 114, 97,
+  109, 0, 8, 5, 18, 21, 19, 0, 130, 108, 101, 109, 0, 18, 9, 18, 6, 0, 131, 110,
+  102, 111, 114, 109, 0, 68, 166, 11, 7, 206, 11, 8, 215, 11, 10, 58, 12, 12,
+  141, 12, 14, 153, 12, 18, 192, 12, 19, 108, 13, 21, 120, 13, 22, 131, 13, 24,
+  141, 13, 26, 164, 13, 0, 12, 0, 74, 175, 11, 23, 183, 11, 0, 4, 44, 0, 130,
+  97, 105, 110, 0, 81, 190, 11, 21, 198, 11, 0, 18, 6, 0, 130, 97, 105, 110, 0,
+  8, 6, 0, 130, 97, 105, 110, 0, 24, 18, 9, 44, 0, 129, 110, 100, 0, 71, 231,
+  11, 8, 241, 11, 10, 27, 12, 19, 39, 12, 22, 48, 12, 0, 15, 12, 11, 6, 0, 129,
+  114, 101, 110, 0, 87, 248, 11, 26, 17, 12, 0, 72, 255, 11, 26, 7, 12, 0, 5, 0,
+  130, 119, 101, 101, 110, 0, 8, 5, 0, 132, 116, 119, 101, 101, 110, 0, 8, 5, 0,
+  131, 116, 119, 101, 101, 110, 0, 18, 7, 28, 11, 0, 131, 114, 111, 103, 101,
+  110, 0, 4, 11, 44, 0, 129, 112, 101, 110, 0, 18, 18, 11, 6, 0, 131, 115, 101,
+  110, 0, 72, 65, 12, 12, 76, 12, 0, 12, 21, 18, 9, 0, 131, 101, 105, 103, 110,
+  0, 75, 95, 12, 15, 101, 12, 17, 109, 12, 18, 118, 12, 21, 125, 12, 22, 132,
+  12, 0, 23, 0, 129, 110, 103, 0, 15, 4, 0, 131, 105, 103, 110, 0, 21, 4, 8, 15,
+  0, 129, 110, 103, 0, 10, 44, 0, 129, 110, 103, 0, 23, 22, 0, 129, 110, 103, 0,
+  4, 44, 0, 130, 115, 105, 103, 110, 0, 23, 4, 21, 8, 6, 0, 131, 116, 97, 105,
+  110, 0, 75, 160, 12, 12, 169, 12, 0, 12, 23, 0, 131, 104, 105, 110, 107, 0,
+  75, 176, 12, 23, 182, 12, 0, 23, 0, 129, 110, 107, 0, 11, 44, 0, 132, 116,
+  104, 105, 110, 107, 0, 76, 202, 12, 22, 86, 13, 23, 96, 13, 0, 70, 212, 12,
+  22, 225, 12, 23, 251, 12, 0, 12, 22, 8, 7, 0, 133, 99, 105, 115, 105, 111,
+  110, 0, 68, 232, 12, 22, 241, 12, 0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4,
+  6, 6, 18, 0, 131, 105, 111, 110, 0, 68, 14, 13, 7, 27, 13, 12, 37, 13, 15, 52,
+  13, 17, 64, 13, 22, 76, 13, 0, 21, 8, 5, 4, 0, 132, 114, 97, 116, 105, 111,
+  110, 0, 7, 4, 0, 131, 105, 116, 105, 111, 110, 0, 23, 12, 19, 8, 21, 0, 134,
+  101, 116, 105, 116, 105, 111, 110, 0, 4, 8, 21, 0, 133, 108, 97, 116, 105,
+  111, 110, 0, 6, 24, 9, 0, 133, 110, 99, 116, 105, 111, 110, 0, 18, 19, 0, 131,
+  105, 116, 105, 111, 110, 0, 12, 25, 12, 7, 0, 129, 105, 111, 110, 0, 12, 6, 4,
+  21, 9, 0, 131, 116, 105, 111, 110, 0, 19, 11, 4, 0, 132, 104, 97, 112, 112,
+  101, 110, 0, 23, 24, 8, 21, 0, 131, 116, 117, 114, 110, 0, 10, 12, 11, 23, 0,
+  130, 110, 103, 115, 0, 85, 148, 13, 23, 157, 13, 0, 23, 8, 21, 0, 130, 117,
+  114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 18, 14, 17, 24, 0, 130, 110, 111,
+  119, 110, 0, 71, 185, 13, 17, 196, 13, 26, 205, 13, 0, 8, 24, 22, 19, 0, 131,
+  101, 117, 100, 111, 0, 26, 14, 44, 0, 130, 110, 111, 119, 0, 79, 212, 13, 17,
+  220, 13, 0, 15, 18, 9, 0, 129, 111, 119, 0, 14, 44, 0, 129, 111, 119, 0, 86,
+  234, 13, 24, 244, 13, 0, 4, 11, 21, 8, 19, 0, 129, 112, 115, 0, 18, 18, 15, 0,
+  129, 107, 117, 112, 0, 68, 28, 14, 8, 93, 14, 11, 103, 15, 15, 113, 15, 18,
+  127, 15, 19, 144, 15, 22, 155, 15, 23, 164, 15, 24, 176, 15, 28, 185, 15, 0,
+  76, 38, 14, 15, 48, 14, 24, 82, 14, 0, 15, 12, 16, 12, 22, 0, 130, 97, 114, 0,
+  76, 55, 14, 24, 66, 14, 0, 16, 16, 12, 22, 0, 132, 105, 108, 97, 114, 0, 6,
+  12, 23, 4, 19, 0, 134, 114, 116, 105, 99, 117, 108, 97, 114, 0, 15, 10, 8, 21,
+  0, 131, 117, 108, 97, 114, 0, 68, 124, 14, 7, 132, 14, 11, 145, 14, 12, 203,
+  14, 15, 229, 14, 16, 239, 14, 17, 249, 14, 18, 37, 15, 23, 45, 15, 25, 76, 15,
+  0, 15, 6, 0, 130, 101, 97, 114, 0, 17, 4, 15, 4, 6, 0, 132, 101, 110, 100, 97,
+  114, 0, 74, 152, 14, 23, 163, 14, 0, 12, 8, 11, 0, 133, 105, 103, 104, 101,
+  114, 0, 72, 173, 14, 15, 185, 14, 24, 194, 14, 0, 11, 10, 18, 23, 0, 133, 101,
+  116, 104, 101, 114, 0, 18, 44, 0, 132, 116, 104, 101, 114, 0, 9, 0, 131, 114,
+  116, 104, 101, 114, 0, 75, 210, 14, 15, 218, 14, 0, 23, 44, 0, 130, 101, 105,
+  114, 0, 19, 16, 18, 6, 0, 131, 105, 108, 101, 114, 0, 23, 12, 9, 0, 131, 108,
+  116, 101, 114, 0, 16, 4, 21, 10, 44, 0, 129, 97, 114, 0, 76, 0, 15, 23, 12,
+  15, 0, 10, 10, 8, 5, 0, 132, 105, 110, 110, 101, 114, 0, 76, 19, 15, 22, 28,
+  15, 0, 18, 19, 0, 131, 110, 116, 101, 114, 0, 12, 15, 0, 130, 101, 110, 101,
+  114, 0, 9, 8, 5, 0, 129, 114, 101, 0, 75, 52, 15, 24, 62, 15, 0, 18, 17, 4, 0,
+  131, 116, 104, 101, 114, 0, 19, 18, 16, 6, 0, 134, 111, 109, 112, 117, 116,
+  101, 114, 0, 72, 83, 15, 26, 94, 15, 0, 8, 21, 8, 11, 26, 0, 131, 118, 101,
+  114, 0, 18, 11, 0, 130, 101, 118, 101, 114, 0, 8, 23, 18, 44, 0, 130, 104,
+  101, 114, 0, 4, 24, 6, 12, 23, 21, 4, 19, 0, 130, 108, 97, 114, 0, 23, 4, 21,
+  8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116, 111, 114, 0, 23, 15, 15, 24,
+  17, 0, 130, 112, 116, 114, 0, 4, 8, 28, 44, 0, 129, 114, 115, 0, 18, 4, 21, 8,
+  19, 18, 0, 130, 116, 111, 114, 0, 6, 18, 44, 0, 129, 99, 117, 114, 0, 8, 25,
+  8, 44, 0, 129, 114, 121, 0, 68, 219, 15, 8, 3, 16, 10, 147, 16, 19, 158, 16,
+  21, 170, 16, 22, 181, 16, 23, 77, 17, 24, 85, 17, 0, 75, 229, 15, 19, 240, 15,
+  28, 250, 15, 0, 19, 21, 8, 19, 0, 131, 104, 97, 112, 115, 0, 11, 21, 8, 19, 0,
+  130, 97, 112, 115, 0, 26, 15, 4, 0, 130, 97, 121, 115, 0, 68, 19, 16, 6, 42,
+  16, 12, 53, 16, 15, 129, 16, 22, 136, 16, 0, 71, 26, 16, 14, 34, 16, 0, 12,
+  44, 0, 130, 101, 97, 115, 0, 23, 0, 131, 97, 107, 101, 115, 0, 8, 7, 17, 12,
+  0, 131, 105, 99, 101, 115, 0, 70, 63, 16, 21, 102, 16, 23, 117, 16, 0, 72, 70,
+  16, 12, 80, 16, 0, 7, 17, 12, 0, 132, 105, 99, 101, 115, 0, 71, 87, 16, 23,
+  94, 16, 0, 17, 12, 0, 130, 101, 115, 0, 21, 8, 25, 0, 130, 101, 115, 0, 18,
+  22, 8, 6, 6, 4, 0, 132, 115, 111, 114, 105, 101, 115, 0, 15, 12, 5, 4, 0, 131,
+  105, 116, 105, 101, 115, 0, 4, 9, 0, 129, 115, 101, 0, 18, 11, 6, 44, 0, 130,
+  111, 115, 101, 115, 0, 12, 17, 11, 23, 0, 131, 105, 110, 103, 115, 0, 4, 8,
+  11, 21, 8, 19, 0, 131, 97, 112, 115, 0, 8, 4, 28, 44, 0, 131, 101, 97, 114,
+  115, 0, 68, 191, 16, 8, 203, 16, 18, 66, 17, 0, 21, 4, 5, 16, 8, 0, 130, 114,
+  97, 115, 115, 0, 70, 216, 16, 17, 240, 16, 21, 13, 17, 22, 42, 17, 0, 70, 223,
+  16, 24, 232, 16, 0, 18, 21, 19, 0, 131, 101, 115, 115, 0, 22, 0, 130, 99, 101,
+  115, 115, 0, 76, 247, 16, 22, 3, 17, 0, 22, 22, 24, 5, 0, 133, 105, 110, 101,
+  115, 115, 0, 24, 5, 0, 131, 105, 110, 101, 115, 115, 0, 19, 0, 85, 22, 17, 24,
+  33, 17, 0, 24, 22, 0, 133, 112, 112, 114, 101, 115, 115, 0, 22, 0, 131, 112,
+  114, 101, 115, 115, 0, 70, 49, 17, 18, 58, 17, 0, 6, 24, 22, 0, 131, 101, 115,
+  115, 0, 19, 0, 130, 115, 101, 115, 115, 0, 21, 6, 6, 4, 0, 132, 114, 111, 115,
+  115, 0, 21, 12, 9, 0, 129, 115, 116, 0, 82, 92, 17, 22, 106, 17, 0, 15, 18,
+  16, 18, 17, 4, 0, 132, 97, 108, 111, 117, 115, 0, 17, 8, 6, 17, 18, 6, 0, 133,
+  115, 101, 110, 115, 117, 115, 0, 68, 158, 17, 8, 188, 17, 10, 217, 17, 11,
+  227, 17, 12, 25, 18, 15, 36, 18, 16, 47, 18, 17, 59, 18, 18, 151, 19, 19, 189,
+  19, 22, 217, 19, 24, 107, 20, 0, 85, 165, 17, 26, 176, 17, 0, 8, 19, 8, 22, 0,
+  131, 97, 114, 97, 116, 0, 11, 8, 16, 18, 22, 0, 131, 119, 104, 97, 116, 0, 68,
+  195, 17, 17, 204, 17, 0, 21, 10, 44, 0, 130, 101, 97, 116, 0, 16, 17, 21, 8,
+  25, 18, 10, 0, 130, 101, 110, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0,
+  71, 237, 17, 10, 244, 17, 12, 14, 18, 0, 12, 26, 0, 129, 116, 104, 0, 81, 251,
+  17, 24, 2, 18, 0, 8, 15, 0, 129, 116, 104, 0, 18, 21, 11, 23, 0, 133, 111,
+  117, 103, 104, 116, 0, 10, 17, 18, 23, 0, 131, 105, 103, 104, 116, 0, 23, 24,
+  18, 5, 4, 0, 129, 32, 105, 116, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116,
+  0, 4, 23, 21, 18, 19, 16, 12, 0, 129, 110, 116, 0, 68, 72, 18, 8, 128, 18, 21,
+  132, 19, 22, 143, 19, 0, 76, 85, 18, 17, 96, 18, 21, 107, 18, 23, 117, 18, 0,
+  19, 12, 6, 8, 21, 0, 130, 101, 110, 116, 0, 12, 16, 18, 21, 19, 0, 130, 101,
+  110, 116, 0, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 8, 19, 16, 18, 6, 0, 130,
+  101, 110, 116, 0, 76, 144, 18, 16, 177, 18, 21, 21, 19, 25, 111, 19, 29, 121,
+  19, 0, 70, 151, 18, 19, 164, 18, 0, 8, 9, 9, 8, 0, 133, 105, 99, 105, 101,
+  110, 116, 0, 8, 6, 8, 21, 0, 133, 105, 112, 105, 101, 110, 116, 0, 72, 190,
+  18, 17, 202, 18, 21, 235, 18, 23, 10, 19, 0, 25, 18, 10, 0, 131, 114, 110,
+  109, 101, 110, 116, 0, 72, 209, 18, 21, 221, 18, 0, 25, 18, 10, 0, 132, 114,
+  110, 109, 101, 110, 116, 0, 18, 25, 18, 10, 0, 134, 101, 114, 110, 109, 101,
+  110, 116, 0, 72, 242, 18, 18, 253, 18, 0, 25, 18, 10, 0, 131, 110, 109, 101,
+  110, 116, 0, 25, 18, 10, 0, 133, 101, 114, 110, 109, 101, 110, 116, 0, 4, 23,
+  22, 0, 131, 101, 109, 101, 110, 116, 0, 68, 34, 19, 8, 45, 19, 9, 57, 19, 21,
+  68, 19, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110, 116, 0, 9, 12, 7, 0, 132,
+  102, 101, 114, 101, 110, 116, 0, 9, 12, 7, 0, 131, 101, 114, 101, 110, 116, 0,
+  68, 75, 19, 8, 99, 19, 0, 19, 0, 68, 84, 19, 19, 92, 19, 0, 133, 112, 97, 114,
+  101, 110, 116, 0, 4, 0, 131, 101, 110, 116, 0, 9, 12, 7, 0, 133, 102, 101,
+  114, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 12, 17, 10, 18,
+  6, 0, 130, 97, 110, 116, 0, 8, 9, 9, 12, 7, 0, 129, 101, 110, 116, 0, 18, 6,
+  0, 130, 110, 115, 116, 0, 81, 161, 19, 21, 171, 19, 22, 180, 19, 0, 7, 12, 7,
+  0, 130, 32, 110, 111, 116, 0, 19, 8, 21, 0, 130, 111, 114, 116, 0, 16, 15, 4,
+  0, 130, 111, 115, 116, 0, 72, 196, 19, 28, 207, 19, 0, 12, 6, 8, 21, 0, 131,
+  101, 105, 112, 116, 0, 6, 17, 8, 0, 130, 114, 121, 112, 116, 0, 72, 236, 19,
+  10, 21, 20, 12, 30, 20, 16, 59, 20, 17, 69, 20, 24, 96, 20, 0, 74, 243, 19,
+  21, 10, 20, 0, 76, 250, 19, 24, 2, 20, 0, 11, 0, 130, 104, 101, 115, 116, 0,
+  22, 0, 130, 103, 101, 115, 116, 0, 23, 17, 12, 0, 131, 101, 114, 101, 115,
+  116, 0, 21, 4, 15, 0, 129, 101, 115, 116, 0, 73, 37, 20, 17, 49, 20, 0, 8, 17,
+  4, 16, 0, 132, 105, 102, 101, 115, 116, 0, 4, 10, 4, 0, 131, 105, 110, 115,
+  116, 0, 18, 15, 4, 0, 131, 109, 111, 115, 116, 0, 68, 76, 20, 17, 87, 20, 0,
+  12, 10, 4, 0, 132, 97, 105, 110, 115, 116, 0, 12, 4, 10, 4, 0, 130, 115, 116,
+  0, 13, 4, 44, 0, 131, 100, 106, 117, 115, 116, 0, 70, 120, 20, 18, 144, 20,
+  19, 168, 20, 23, 191, 20, 0, 72, 127, 20, 21, 137, 20, 0, 6, 27, 8, 0, 132,
+  101, 99, 117, 116, 0, 12, 6, 0, 128, 105, 116, 0, 68, 151, 20, 5, 160, 20, 0,
+  5, 0, 132, 97, 98, 111, 117, 116, 0, 5, 4, 0, 131, 111, 117, 116, 0, 87, 175,
+  20, 24, 183, 20, 0, 17, 12, 0, 131, 112, 117, 116, 0, 18, 0, 130, 116, 112,
+  117, 116, 0, 19, 24, 18, 0, 131, 116, 112, 117, 116, 0, 23, 18, 5, 4, 0, 129,
+  117, 116, 0, 72, 217, 20, 12, 253, 20, 0, 68, 224, 20, 12, 231, 20, 0, 11, 44,
+  0, 129, 118, 101, 0, 70, 238, 20, 8, 246, 20, 0, 8, 21, 0, 130, 101, 105, 118,
+  0, 6, 8, 21, 0, 129, 118, 0, 8, 11, 6, 4, 44, 0, 130, 105, 101, 118, 0, 76,
+  15, 21, 17, 25, 21, 0, 8, 25, 8, 21, 0, 130, 105, 101, 119, 0, 18, 14, 44, 0,
+  130, 110, 111, 119, 0, 70, 59, 21, 8, 118, 21, 11, 128, 21, 15, 146, 21, 17,
+  87, 22, 21, 114, 22, 22, 12, 23, 23, 39, 23, 0, 68, 72, 21, 8, 84, 21, 12, 95,
+  21, 19, 106, 21, 0, 21, 6, 18, 19, 28, 11, 0, 130, 105, 115, 121, 0, 24, 20,
+  8, 21, 9, 0, 129, 110, 99, 121, 0, 21, 6, 18, 19, 28, 11, 0, 129, 115, 121, 0,
+  24, 21, 14, 17, 4, 5, 0, 129, 116, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116,
+  121, 0, 6, 21, 4, 21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121,
+  0, 68, 165, 21, 11, 232, 21, 14, 242, 21, 15, 250, 21, 18, 66, 22, 21, 76, 22,
+  0, 69, 184, 21, 8, 193, 21, 15, 199, 21, 17, 208, 21, 21, 215, 21, 24, 224,
+  21, 0, 18, 21, 19, 0, 129, 98, 108, 121, 0, 21, 0, 128, 108, 121, 0, 8, 21, 0,
+  131, 97, 108, 108, 121, 0, 12, 9, 0, 128, 108, 121, 0, 8, 17, 8, 10, 0, 128,
+  108, 121, 0, 23, 6, 4, 0, 128, 108, 121, 0, 10, 12, 15, 22, 0, 129, 116, 108,
+  121, 0, 12, 15, 0, 129, 101, 108, 121, 0, 68, 4, 22, 5, 47, 22, 8, 56, 22, 0,
+  86, 11, 22, 23, 35, 22, 0, 24, 0, 108, 20, 22, 22, 27, 22, 0, 131, 117, 97,
+  108, 108, 121, 0, 24, 0, 132, 97, 108, 108, 121, 0, 24, 6, 4, 0, 133, 116,
+  117, 97, 108, 108, 121, 0, 4, 5, 18, 21, 19, 0, 129, 121, 0, 4, 21, 0, 132,
+  101, 97, 108, 108, 121, 0, 16, 18, 17, 4, 0, 130, 97, 108, 121, 0, 4, 16, 12,
+  21, 19, 0, 129, 105, 108, 121, 0, 72, 94, 22, 19, 103, 22, 0, 18, 16, 44, 0,
+  130, 110, 101, 121, 0, 4, 16, 18, 6, 0, 131, 112, 97, 110, 121, 0, 68, 127,
+  22, 8, 231, 22, 18, 240, 22, 23, 253, 22, 0, 69, 143, 22, 12, 152, 22, 15,
+  165, 22, 16, 193, 22, 22, 202, 22, 0, 12, 15, 0, 130, 114, 97, 114, 121, 0,
+  15, 15, 12, 27, 24, 4, 0, 132, 105, 97, 114, 121, 0, 76, 172, 22, 15, 182, 22,
+  0, 27, 24, 4, 0, 130, 105, 97, 114, 121, 0, 12, 27, 24, 4, 0, 131, 105, 97,
+  114, 121, 0, 24, 22, 0, 130, 109, 97, 114, 121, 0, 8, 6, 0, 70, 212, 22, 8,
+  223, 22, 0, 8, 17, 0, 133, 101, 115, 115, 97, 114, 121, 0, 17, 0, 130, 115,
+  97, 114, 121, 0, 19, 18, 21, 19, 0, 128, 116, 121, 0, 10, 4, 23, 4, 6, 0, 132,
+  101, 103, 111, 114, 121, 0, 17, 24, 6, 18, 44, 0, 134, 99, 111, 117, 110, 116,
+  114, 121, 0, 4, 0, 85, 21, 23, 26, 32, 23, 0, 6, 18, 19, 28, 11, 0, 130, 105,
+  115, 121, 0, 15, 4, 0, 129, 121, 115, 0, 73, 49, 23, 15, 57, 23, 21, 66, 23,
+  0, 4, 22, 0, 129, 101, 116, 121, 0, 12, 5, 4, 0, 129, 105, 116, 121, 0, 19, 8,
+  18, 21, 19, 0, 132, 112, 101, 114, 116, 121, 0};
+

+ 152 - 0
users/gourdo1/autocorrect/autocorrection_data.h (small)

@@ -0,0 +1,152 @@
+// Copyright 2021-2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Generated code.
+
+// Autocorrection dictionary (71 entries):
+//   :guage     -> gauge
+//   :the:the:  -> the
+//   :thier     -> their
+//   :ture      -> true
+//   accomodate -> accommodate
+//   acommodate -> accommodate
+//   aparent    -> apparent
+//   aparrent   -> apparent
+//   apparant   -> apparent
+//   apparrent  -> apparent
+//   aquire     -> acquire
+//   becuase    -> because
+//   cauhgt     -> caught
+//   cheif      -> chief
+//   choosen    -> chosen
+//   cieling    -> ceiling
+//   collegue   -> colleague
+//   concensus  -> consensus
+//   contians   -> contains
+//   cosnt      -> const
+//   dervied    -> derived
+//   dosen't    -> doesn't
+//   fales      -> false
+//   fasle      -> false
+//   fitler     -> filter
+//   flase      -> false
+//   foward     -> forward
+//   frequecy   -> frequency
+//   gaurantee  -> guarantee
+//   guaratee   -> guarantee
+//   heigth     -> height
+//   heirarchy  -> hierarchy
+//   inclued    -> include
+//   interator  -> iterator
+//   intput     -> input
+//   invliad    -> invalid
+//   lenght     -> length
+//   liasion    -> liaison
+//   libary     -> library
+//   listner    -> listener
+//   looses:    -> loses
+//   looup      -> lookup
+//   manefist   -> manifest
+//   namesapce  -> namespace
+//   namespcae  -> namespace
+//   occassion  -> occasion
+//   occured    -> occurred
+//   ouptut     -> output
+//   ouput      -> output
+//   overide    -> override
+//   postion    -> position
+//   priviledge -> privilege
+//   psuedo     -> pseudo
+//   recieve    -> receive
+//   refered    -> referred
+//   relevent   -> relevant
+//   repitition -> repetition
+//   retrun     -> return
+//   retun      -> return
+//   reuslt     -> result
+//   reutrn     -> return
+//   saftey     -> safety
+//   seperate   -> separate
+//   singed     -> signed
+//   stirng     -> string
+//   strign     -> string
+//   swithc     -> switch
+//   swtich     -> switch
+//   thresold   -> threshold
+//   udpate     -> update
+//   widht      -> width
+
+#define AUTOCORRECTION_MIN_LENGTH 5  // ":ture"
+#define AUTOCORRECTION_MAX_LENGTH 10  // "accomodate"
+
+static const uint8_t autocorrection_data[1120] PROGMEM = {108, 43, 0, 6, 71, 0,
+  7, 81, 0, 8, 199, 0, 9, 240, 1, 10, 250, 1, 11, 26, 2, 17, 53, 2, 18, 190, 2,
+  19, 202, 2, 21, 212, 2, 22, 20, 3, 23, 67, 3, 28, 32, 4, 0, 72, 50, 0, 22, 60,
+  0, 0, 11, 23, 44, 8, 11, 23, 44, 0, 132, 0, 8, 22, 18, 18, 15, 0, 132, 115,
+  101, 115, 0, 11, 23, 12, 26, 22, 0, 129, 99, 104, 0, 68, 94, 0, 8, 106, 0, 15,
+  174, 0, 21, 187, 0, 0, 12, 15, 25, 17, 12, 0, 131, 97, 108, 105, 100, 0, 74,
+  119, 0, 12, 129, 0, 21, 140, 0, 24, 165, 0, 0, 17, 12, 22, 0, 131, 103, 110,
+  101, 100, 0, 25, 21, 8, 7, 0, 131, 105, 118, 101, 100, 0, 72, 147, 0, 24, 156,
+  0, 0, 9, 8, 21, 0, 129, 114, 101, 100, 0, 6, 6, 18, 0, 129, 114, 101, 100, 0,
+  15, 6, 17, 12, 0, 129, 100, 101, 0, 18, 22, 8, 21, 11, 23, 0, 130, 104, 111,
+  108, 100, 0, 4, 26, 18, 9, 0, 131, 114, 119, 97, 114, 100, 0, 68, 233, 0, 6,
+  246, 0, 7, 4, 1, 8, 16, 1, 10, 52, 1, 15, 81, 1, 21, 90, 1, 22, 117, 1, 23,
+  144, 1, 24, 215, 1, 25, 228, 1, 0, 6, 19, 22, 8, 16, 4, 17, 0, 130, 97, 99,
+  101, 0, 19, 4, 22, 8, 16, 4, 17, 0, 131, 112, 97, 99, 101, 0, 12, 21, 8, 25,
+  18, 0, 130, 114, 105, 100, 101, 0, 23, 0, 68, 25, 1, 17, 36, 1, 0, 21, 4, 24,
+  10, 0, 130, 110, 116, 101, 101, 0, 4, 21, 24, 4, 10, 0, 135, 117, 97, 114, 97,
+  110, 116, 101, 101, 0, 68, 59, 1, 7, 69, 1, 0, 24, 10, 44, 0, 131, 97, 117,
+  103, 101, 0, 8, 15, 12, 25, 12, 21, 19, 0, 130, 103, 101, 0, 22, 4, 9, 0, 130,
+  108, 115, 101, 0, 76, 97, 1, 24, 109, 1, 0, 24, 20, 4, 0, 132, 99, 113, 117,
+  105, 114, 101, 0, 23, 44, 0, 130, 114, 117, 101, 0, 4, 0, 79, 126, 1, 24, 134,
+  1, 0, 9, 0, 131, 97, 108, 115, 101, 0, 6, 8, 5, 0, 131, 97, 117, 115, 101, 0,
+  4, 0, 71, 156, 1, 19, 193, 1, 21, 203, 1, 0, 18, 16, 0, 80, 166, 1, 18, 181,
+  1, 0, 18, 6, 4, 0, 135, 99, 111, 109, 109, 111, 100, 97, 116, 101, 0, 6, 6, 4,
+  0, 132, 109, 111, 100, 97, 116, 101, 0, 7, 24, 0, 132, 112, 100, 97, 116, 101,
+  0, 8, 19, 8, 22, 0, 132, 97, 114, 97, 116, 101, 0, 10, 8, 15, 15, 18, 6, 0,
+  130, 97, 103, 117, 101, 0, 8, 12, 6, 8, 21, 0, 131, 101, 105, 118, 101, 0, 12,
+  8, 11, 6, 0, 130, 105, 101, 102, 0, 17, 0, 76, 3, 2, 21, 16, 2, 0, 15, 8, 12,
+  6, 0, 133, 101, 105, 108, 105, 110, 103, 0, 12, 23, 22, 0, 131, 114, 105, 110,
+  103, 0, 70, 33, 2, 23, 44, 2, 0, 12, 23, 26, 22, 0, 131, 105, 116, 99, 104, 0,
+  10, 12, 8, 11, 0, 129, 104, 116, 0, 72, 69, 2, 10, 80, 2, 18, 89, 2, 21, 156,
+  2, 24, 167, 2, 0, 22, 18, 18, 11, 6, 0, 131, 115, 101, 110, 0, 12, 21, 23, 22,
+  0, 129, 110, 103, 0, 12, 0, 86, 98, 2, 23, 124, 2, 0, 68, 105, 2, 22, 114, 2,
+  0, 12, 15, 0, 131, 105, 115, 111, 110, 0, 4, 6, 6, 18, 0, 131, 105, 111, 110,
+  0, 76, 131, 2, 22, 146, 2, 0, 23, 12, 19, 8, 21, 0, 134, 101, 116, 105, 116,
+  105, 111, 110, 0, 18, 19, 0, 131, 105, 116, 105, 111, 110, 0, 23, 24, 8, 21,
+  0, 131, 116, 117, 114, 110, 0, 85, 174, 2, 23, 183, 2, 0, 23, 8, 21, 0, 130,
+  117, 114, 110, 0, 8, 21, 0, 128, 114, 110, 0, 7, 8, 24, 22, 19, 0, 131, 101,
+  117, 100, 111, 0, 24, 18, 18, 15, 0, 129, 107, 117, 112, 0, 72, 219, 2, 18, 3,
+  3, 0, 76, 229, 2, 15, 238, 2, 17, 248, 2, 0, 11, 23, 44, 0, 130, 101, 105,
+  114, 0, 23, 12, 9, 0, 131, 108, 116, 101, 114, 0, 23, 22, 12, 15, 0, 130, 101,
+  110, 101, 114, 0, 23, 4, 21, 8, 23, 17, 12, 0, 135, 116, 101, 114, 97, 116,
+  111, 114, 0, 72, 30, 3, 17, 38, 3, 24, 51, 3, 0, 15, 4, 9, 0, 129, 115, 101,
+  0, 4, 12, 23, 17, 18, 6, 0, 131, 97, 105, 110, 115, 0, 22, 17, 8, 6, 17, 18,
+  6, 0, 133, 115, 101, 110, 115, 117, 115, 0, 116, 89, 3, 10, 102, 3, 11, 112,
+  3, 15, 134, 3, 17, 145, 3, 22, 234, 3, 24, 248, 3, 0, 17, 8, 22, 18, 7, 0,
+  132, 101, 115, 110, 39, 116, 0, 11, 24, 4, 6, 0, 130, 103, 104, 116, 0, 71,
+  119, 3, 10, 126, 3, 0, 12, 26, 0, 129, 116, 104, 0, 17, 8, 15, 0, 129, 116,
+  104, 0, 22, 24, 8, 21, 0, 131, 115, 117, 108, 116, 0, 68, 155, 3, 8, 166, 3,
+  22, 226, 3, 0, 21, 4, 19, 19, 4, 0, 130, 101, 110, 116, 0, 85, 173, 3, 25,
+  216, 3, 0, 68, 180, 3, 21, 191, 3, 0, 19, 4, 0, 132, 112, 97, 114, 101, 110,
+  116, 0, 4, 19, 0, 68, 201, 3, 19, 209, 3, 0, 133, 112, 97, 114, 101, 110, 116,
+  0, 4, 0, 131, 101, 110, 116, 0, 8, 15, 8, 21, 0, 130, 97, 110, 116, 0, 18, 6,
+  0, 130, 110, 115, 116, 0, 12, 9, 8, 17, 4, 16, 0, 132, 105, 102, 101, 115,
+  116, 0, 83, 255, 3, 23, 22, 4, 0, 87, 6, 4, 24, 14, 4, 0, 17, 12, 0, 131, 112,
+  117, 116, 0, 18, 0, 130, 116, 112, 117, 116, 0, 19, 24, 18, 0, 131, 116, 112,
+  117, 116, 0, 70, 45, 4, 8, 57, 4, 11, 67, 4, 21, 85, 4, 0, 8, 24, 20, 8, 21,
+  9, 0, 129, 110, 99, 121, 0, 23, 9, 4, 22, 0, 130, 101, 116, 121, 0, 6, 21, 4,
+  21, 12, 8, 11, 0, 135, 105, 101, 114, 97, 114, 99, 104, 121, 0, 4, 5, 12, 15,
+  0, 130, 114, 97, 114, 121, 0};
+

+ 473 - 0
users/gourdo1/autocorrect/autocorrection_dict.txt

@@ -0,0 +1,473 @@
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+# This is a larger example typo dictionary containing 400 entries. It builds to
+# a table of about 6000 bytes, so you'll need a keyboard with a generous
+# amount of free firmware space to use the full dictionary. Alternatively, pick
+# out a subset of entries to a separate file, then build a table from that.
+#
+# Dictionary syntax:
+# Each line of this file defines one typo correction entry with the syntax
+# "typo -> correction". Typos and corrections are case insensitive, and any
+# whitespace before or after the typo and correction is ignored. The typo must be
+# only the letters a-z, or the special character : representing a word break.
+#
+# For documentation about how to use this dictionary, see
+# https://getreuer.info/posts/keyboards/autocorrection
+#
+# Further resources:
+#  * Wikipedia has a large list of common typos at
+#    https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
+#
+#  * EmacsWiki has another list of typos at
+#    https://www.emacswiki.org/emacs/autocorrection_abbrev_defs
+#
+#  * You can find data on English word frequencies at
+#    https://www.wordfrequency.info/samples.asp
+
+
+## 10 most common words.
+# The words "there", "about", "their", "would", "people", "which", "could",
+# "think", "other", and "because" are among the most common words in English
+# that are 5 letters or longer. (We don't include entries for words shorter than
+# that to avoid false triggering.)
+:htere        -> there
+abbout        -> about
+abotu         -> about
+baout         -> about
+:theri        -> their
+:thier        -> their
+:owudl        -> would
+woudl         -> would
+peaple        -> people
+peolpe        -> people
+peopel        -> people
+poeple        -> people
+poeople       -> people
+:hwihc        -> which
+whcih         -> which
+whihc         -> which
+whlch         -> which
+wihch         -> which
+coudl         -> could
+:htikn        -> think
+:htink        -> think
+thikn         -> think
+thiunk        -> think
+tihkn         -> think
+:olther       -> other
+:otehr        -> other
+baceause      -> because
+beacuse       -> because
+becasue       -> because
+beccause      -> because
+becouse       -> because
+becuase       -> because
+
+## Common words, 11-20.
+theese        -> these
+:goign        -> going
+:gonig        -> going
+:yaers        -> years
+:yeasr        -> years
+:thsoe        -> those
+shoudl        -> should
+raelly        -> really
+realy         -> really
+relaly        -> really
+bedore        -> before
+befoer        -> before
+littel        -> little
+beeing        -> being
+:hwile        -> while
+
+## Common words, 21-30.
+aroud         -> around
+arround       -> around
+arund         -> around
+thign         -> thing
+thigsn        -> things
+thnigs        -> things
+anohter       -> another
+beteen        -> between
+beween        -> between
+bewteen       -> between
+:eveyr        -> every
+:graet        -> great
+:agian        -> again
+:sicne        -> since
+alwasy        -> always
+alwyas        -> always
+throught      -> thought
+
+
+## Words especially susceptible to skipping or transposing a letter.
+# These entries are for words that are easy enough to spell, but not necessarily
+# easy to press the keys in the right order.
+# Catch misspellings of "achieves", "achieving", etc.
+:acheiv       -> achiev
+almsot        -> almost
+alomst        -> almost
+chnage        -> change
+chekc         -> check
+childen       -> children
+claer         -> clear
+comapny       -> company
+contian       -> contain
+elasped       -> elapsed
+feild         -> field
+fitler        -> filter
+firts         -> first
+follwo        -> follow
+:foudn        -> 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
+
+
+## Words with tricky spelling.
+# If you are a good speller, you could drop this section.
+aberation     -> aberration
+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
+cognizent     -> cognizant
+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
+# Catch misspellings of "receives", "receiving", etc.
+receiev       -> receiv
+reciev        -> receiv
+recepient     -> recipient
+recipiant     -> recipient
+relevent      -> relevant
+repitition    -> repetition
+safty         -> safety
+saftey        -> safety
+# Catch misspellings of "separate", "separating", etc.
+seperat       -> separat
+spectogram    -> spectrogram
+symetric      -> symmetric
+tolerence     -> tolerance
+
+
+## Words particularly for coding.
+# Entries for common code keywords ("const") and terminology ("lookup").
+cacheing      -> caching
+complier      -> compiler
+doulbe        -> double
+dyanmic       -> dynamic
+# As in "execute", "executable", "executing", ...
+excecut       -> execut
+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
+
+
+## Catch skipped spaces between common words.
+: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
+
+
+## Various additional entries.
+: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
+perheaps      -> 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
+

+ 303 - 0
users/gourdo1/autocorrect/make_autocorrection_data.py

@@ -0,0 +1,303 @@
+# Copyright 2021-2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python program to make autocorrection_data.h.
+
+This program reads "autocorrection_dict.txt" and generates a C source file
+"autocorrection_data.h" with a serialized trie embedded as an array. Run this
+program without arguments like
+
+$ python3 make_autocorrection_data.py
+
+Or to read from a different typo dict file, pass it as the first argument like
+
+$ python3 make_autocorrection_data.py dict.txt
+
+Each line of the dict file defines one typo and its correction with the syntax
+"typo -> correction". Blank lines or lines starting with '#' are ignored.
+Example:
+
+  :thier        -> their
+  dosen't       -> doesn't
+  fitler        -> filter
+  lenght        -> length
+  ouput         -> output
+  widht         -> width
+
+See autocorrection_dict_extra.txt for a larger example.
+
+For full documentation, see
+https://getreuer.info/posts/keyboards/autocorrection
+"""
+
+import sys
+import textwrap
+from typing import Any, Dict, Iterator, List, Tuple
+
+try:
+  from english_words import english_words_lower_alpha_set as CORRECT_WORDS
+except ImportError:
+  print('Autocorrection will falsely trigger when a typo is a substring of a '
+        'correctly spelled word. To check for this, install the english_words '
+        'package and rerun this script:\n\n  pip install english_words\n')
+  # Use a minimal word list as a fallback.
+  CORRECT_WORDS = ('apparent', 'association', 'available', 'classification',
+                   'effect', 'entertainment', 'fantastic', 'information',
+                   'integrate', 'international', 'language', 'loosest',
+                   'manual', 'nothing', 'provides', 'reference', 'statehood',
+                   'technology', 'virtually', 'wealthier', 'wonderful')
+
+KC_A = 4
+KC_SPC = 0x2c
+KC_QUOT = 0x34
+
+TYPO_CHARS = dict(
+  [
+    ("'", KC_QUOT),
+    (':', KC_SPC),  # "Word break" character.
+  ] +
+  # Characters a-z.
+  [(chr(c), c + KC_A - ord('a')) for c in range(ord('a'), ord('z') + 1)]
+)
+
+
+def parse_file(file_name: str) -> List[Tuple[str, str]]:
+  """Parses autocorrections dictionary file.
+
+  Each line of the file defines one typo and its correction with the syntax
+  "typo -> correction". Blank lines or lines starting with '#' are ignored. The
+  function validates that typos only have characters in TYPO_CHARS, that
+  typos are not substrings of other typos, and checking that typos don't trigger
+  on CORRECT_WORDS.
+
+  Args:
+    file_name: String, path of the autocorrections dictionary.
+  Returns:
+    List of (typo, correction) tuples.
+  """
+
+  autocorrections = []
+  typos = set()
+  for line_number, typo, correction in parse_file_lines(file_name):
+    if typo in typos:
+      print(f'Warning:{line_number}: Ignoring duplicate typo: "{typo}"')
+      continue
+
+    # Check that `typo` is valid.
+    if not(all([c in TYPO_CHARS for c in typo])):
+      print(f'Error:{line_number}: Typo "{typo}" has '
+            'characters other than ' + ''.join(TYPO_CHARS.keys()))
+      sys.exit(1)
+    for other_typo in typos:
+      if typo in other_typo or other_typo in typo:
+        print(f'Error:{line_number}: Typos may not be substrings of one '
+              f'another, otherwise the longer typo would never trigger: '
+              f'"{typo}" vs. "{other_typo}".')
+        sys.exit(1)
+    if len(typo) < 5:
+      print(f'Warning:{line_number}: It is suggested that typos are at '
+            f'least 5 characters long to avoid false triggers: "{typo}"')
+
+    check_typo_against_dictionary(line_number, typo)
+
+    autocorrections.append((typo, correction))
+    typos.add(typo)
+
+  return autocorrections
+
+
+def make_trie(autocorrections: List[Tuple[str, str]]) -> Dict[str, Any]:
+  """Makes a trie from the the typos, writing in reverse.
+
+  Args:
+    autocorrections: List of (typo, correction) tuples.
+  Returns:
+    Dict of dict, representing the trie.
+  """
+  trie = {}
+  for typo, correction in autocorrections:
+    node = trie
+    for letter in typo[::-1]:
+      node = node.setdefault(letter, {})
+    node['LEAF'] = (typo, correction)
+
+  return trie
+
+
+def parse_file_lines(file_name: str) -> Iterator[Tuple[int, str, str]]:
+  """Parses lines read from `file_name` into typo-correction pairs."""
+
+  line_number = 0
+  for line in open(file_name, 'rt'):
+    line_number += 1
+    line = line.strip()
+    if line and line[0] != '#':
+      # Parse syntax "typo -> correction", using strip to ignore indenting.
+      tokens = [token.strip() for token in line.split('->', 1)]
+      if len(tokens) != 2 or not tokens[0]:
+        print(f'Error:{line_number}: Invalid syntax: "{line}"')
+        sys.exit(1)
+
+      typo, correction = tokens
+      typo = typo.lower()  # Force typos to lowercase.
+      typo = typo.replace(' ', ':')
+
+      yield line_number, typo, correction
+
+
+def check_typo_against_dictionary(line_number: int, typo: str) -> None:
+  """Checks `typo` against English dictionary words."""
+
+  if typo.startswith(':') and typo.endswith(':'):
+    if typo[1:-1] in CORRECT_WORDS:
+      print(f'Warning:{line_number}: Typo "{typo}" is a correctly spelled '
+            'dictionary word.')
+  elif typo.startswith(':') and not typo.endswith(':'):
+    for word in CORRECT_WORDS:
+      if word.startswith(typo[1:]):
+        print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
+              f'on correctly spelled word "{word}".')
+  elif not typo.startswith(':') and typo.endswith(':'):
+    for word in CORRECT_WORDS:
+      if word.endswith(typo[:-1]):
+        print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
+              f'on correctly spelled word "{word}".')
+  elif not typo.startswith(':') and not typo.endswith(':'):
+    for word in CORRECT_WORDS:
+      if typo in word:
+        print(f'Warning:{line_number}: Typo "{typo}" would falsely trigger '
+              f'on correctly spelled word "{word}".')
+
+
+def serialize_trie(autocorrections: List[Tuple[str, str]],
+                   trie: Dict[str, Any]) -> List[int]:
+  """Serializes trie and correction data in a form readable by the C code.
+
+  Args:
+    autocorrections: List of (typo, correction) tuples.
+    trie: Dict of dicts.
+  Returns:
+    List of ints in the range 0-255.
+  """
+  table = []
+
+  # Traverse trie in depth first order.
+  def traverse(trie_node: Dict[str, Any]) -> Dict[str, Any]:
+    if 'LEAF' in trie_node:  # Handle a leaf trie node.
+      typo, correction = trie_node['LEAF']
+      word_boundary_ending = typo[-1] == ':'
+      typo = typo.strip(':')
+      i = 0  # Make the autocorrection data for this entry and serialize it.
+      while i < min(len(typo), len(correction)) and typo[i] == correction[i]:
+        i += 1
+      backspaces = len(typo) - i - 1 + word_boundary_ending
+      assert 0 <= backspaces <= 63
+      correction = correction[i:]
+      data = [backspaces + 128] + list(bytes(correction, 'ascii')) + [0]
+
+      entry = {'data': data, 'links': [], 'byte_offset': 0}
+      table.append(entry)
+    elif len(trie_node) == 1:  # Handle trie node with a single child.
+      c, trie_node = next(iter(trie_node.items()))
+      entry = {'chars': c, 'byte_offset': 0}
+
+      # It's common for a trie to have long chains of single-child nodes. We
+      # find the whole chain so that we can serialize it more efficiently.
+      while len(trie_node) == 1 and 'LEAF' not in trie_node:
+        c, trie_node = next(iter(trie_node.items()))
+        entry['chars'] += c
+
+      table.append(entry)
+      entry['links'] = [traverse(trie_node)]
+    else:  # Handle trie node with multiple children.
+      entry = {'chars': ''.join(sorted(trie_node.keys())), 'byte_offset': 0}
+      table.append(entry)
+      entry['links'] = [traverse(trie_node[c]) for c in entry['chars']]
+    return entry
+
+  traverse(trie)
+
+  def serialize(e: Dict[str, Any]) -> List[int]:
+    if not e['links']:  # Handle a leaf table entry.
+      return e['data']
+    elif len(e['links']) == 1:  # Handle a chain table entry.
+      return [TYPO_CHARS[c] for c in e['chars']] + [0]
+    else:  # Handle a branch table entry.
+      data = []
+      for c, link in zip(e['chars'], e['links']):
+        data += [TYPO_CHARS[c] | (0 if data else 64)] + encode_link(link)
+      return data + [0]
+
+  byte_offset = 0
+  for e in table:  # To encode links, first compute byte offset of each entry.
+    e['byte_offset'] = byte_offset
+    byte_offset += len(serialize(e))
+
+  return [b for e in table for b in serialize(e)]  # Serialize final table.
+
+
+def encode_link(link: Dict[str, Any]) -> List[int]:
+  """Encodes a node link as two bytes."""
+  byte_offset = link['byte_offset']
+  if not (0 <= byte_offset <= 0xffff):
+    print('Error: The autocorrection table is too large, a node link exceeds '
+          '64KB limit. Try reducing the autocorrection dict to fewer entries.')
+    sys.exit(1)
+  return [byte_offset & 255, byte_offset >> 8]
+
+
+def write_generated_code(autocorrections: List[Tuple[str, str]],
+                         data: List[int],
+                         file_name: str) -> None:
+  """Writes autocorrection data as generated C code to `file_name`.
+
+  Args:
+    autocorrections: List of (typo, correction) tuples.
+    data: List of ints in 0-255, the serialized trie.
+    file_name: String, path of the output C file.
+  """
+  assert all(0 <= b <= 255 for b in data)
+
+  def typo_len(e: Tuple[str, str]) -> int:
+    return len(e[0])
+
+  min_typo = min(autocorrections, key=typo_len)[0]
+  max_typo = max(autocorrections, key=typo_len)[0]
+  generated_code = ''.join([
+    '// Generated code.\n\n',
+    f'// Autocorrection dictionary ({len(autocorrections)} entries):\n',
+    ''.join(sorted(f'//   {typo:<{len(max_typo)}} -> {correction}\n'
+                   for typo, correction in autocorrections)),
+    f'\n#define AUTOCORRECTION_MIN_LENGTH {len(min_typo)}  // "{min_typo}"\n',
+    f'#define AUTOCORRECTION_MAX_LENGTH {len(max_typo)}  // "{max_typo}"\n\n',
+    textwrap.fill('static const uint8_t autocorrection_data[%d] PROGMEM = {%s};' % (
+      len(data), ', '.join(map(str, data))), width=80, subsequent_indent='  '),
+    '\n\n'])
+
+  with open(file_name, 'wt') as f:
+    f.write(generated_code)
+
+
+def main(argv):
+  dict_file = argv[1] if len(argv) > 1 else 'autocorrection_dict.txt'
+  autocorrections = parse_file(dict_file)
+  trie = make_trie(autocorrections)
+  data = serialize_trie(autocorrections, trie)
+  print(f'Processed %d autocorrection entries to table with %d bytes.'
+        % (len(autocorrections), len(data)))
+  write_generated_code(autocorrections, data, 'autocorrection_data.h')
+
+
+if __name__ == '__main__':
+  main(sys.argv)

+ 28 - 0
users/gourdo1/custom_double_taps.h

@@ -71,3 +71,31 @@ static bool process_esc_to_base(uint16_t keycode, keyrecord_t * record) {
     }
     return true;
 }
+
+static bool process_lsft_for_caps(uint16_t keycode, keyrecord_t * record) {
+    static bool tapped = false;
+    static uint16_t tap_timer = 0;
+
+    if (keycode == KC_LSFT) {
+        if (user_config.double_tap_shift_for_capslock) {
+          if (!keymap_config.no_gui) {
+            if (record->event.pressed) {
+                if (tapped && !timer_expired(record->event.time, tap_timer)) {
+                  // The key was double tapped.
+                  //clear_mods();  // If needed, clear the mods.
+                  // Do something interesting...
+                  register_code(KC_CAPS);
+                }
+                tapped = true;
+                tap_timer = record->event.time + TAPPING_TERM;
+            } else {
+                unregister_code(KC_CAPS);
+            }
+          }
+        }
+    } else {
+            // On an event with any other key, reset the double tap state.
+            tapped = false;
+    }
+    return true;
+}

+ 61 - 60
users/gourdo1/gourdo1.c

@@ -21,33 +21,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include "custom_double_taps.h"
 
-// Tap once for shift, twice for Caps Lock but only if Win Key is not disabled (also disabled by user.config variable)
-void dance_LSFT_each_tap(qk_tap_dance_state_t * state, void * user_data) {
-    if (user_config.double_tap_shift_for_capslock) {
-        if (state -> count == 1 || keymap_config.no_gui) {
-            register_code(KC_LSFT);
-        } else {
-            register_code(KC_CAPS);
-        }
-    } else {
-        register_code(KC_LSFT);
-    }
-}
-
-void dance_LSFT_reset(qk_tap_dance_state_t * state, void * user_data) {
-    if (state -> count == 1 || keymap_config.no_gui) {
-        unregister_code(KC_LSFT);
-    } else {
-        unregister_code(KC_CAPS);
-        unregister_code(KC_LSFT);
-    }
-}
-
-// Tap Dance definitions
-qk_tap_dance_action_t tap_dance_actions[] = {
-    // Tap once for shift, twice for Caps Lock
-    [TD_LSFT_CAPS_WIN] = ACTION_TAP_DANCE_FN_ADVANCED(dance_LSFT_each_tap, NULL, dance_LSFT_reset)
-};
+#include "autocorrect/autocorrection.h"
 
 // RGB NIGHT MODE
 #ifdef RGB_MATRIX_ENABLE
@@ -129,6 +103,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
     if (!process_record_keymap(keycode, record)) { return false; }
     if (!process_capsnum(keycode, record)) { return false; }
     if (!process_esc_to_base(keycode, record)) { return false; }
+    if (!process_lsft_for_caps(keycode, record)) { return false; }
+    if (!process_autocorrection(keycode, record)) { return false; }
 
     // Key macros ...
     switch (keycode) {
@@ -136,66 +112,77 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
         // User configuration toggles
     case PRNCONF:  // Print verbose status of all user_config toggles (open a text editor before engaging!!)
         if (record->event.pressed) {
-            //send_string("Left bracket with alt numcodes "SS_LALT(SS_TAP(X_KP_0) SS_TAP(X_KP_0) SS_TAP(X_KP_9) SS_TAP(X_KP_1))"\n");
-            send_string("\n\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C\x3C");
-            send_string(" gourdo1\x27s GMMK Pro User Settings ");
-            send_string("\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x3E\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\x2D\n");
-            send_string("Hold \x5B \bFn\x5D and the number corresponding to a setting below to toggle.\n");
-            send_string("Re-print this screen with \x5B \bFn\x5D \x5B`\x5D to see your changes reflected.\n");
-            send_string("Config also visible as RGB under number keys by holding \x5B \bFn\x5D.\n");
-            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
-            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
-            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
-            send_string("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\n");
+            send_string("\n"SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"#########");
+            send_string(" gourdo1" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_9))"s GMMK Pro User Settings ");
+            send_string("#########"SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"\n");
+            send_string("Hold "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))" and the number corresponding to a setting below to toggle.\n");
+            send_string("Re"SS_TAP(X_KP_MINUS)"print this screen with "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3)) SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"`" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))" to see your changes reflected.\n");
+            send_string("Config also visible as RGB under number keys by holding "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"Fn" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))".\n");
+            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS));
+            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS));
+            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS));
+            send_string(SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)SS_TAP(X_KP_MINUS)"\n");
             send_string("1. CapsLock RGB highlight alpha keys................ ");
             if (user_config.rgb_hilite_caps) {
-                send_string("\x5BON\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BOFF\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
             send_string("2. Numpad RGB highlight layer keys.................. ");
             if (user_config.rgb_hilite_numpad) {
-                send_string("\x5BON\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BOFF\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
             send_string("3. Double tap ESC to revert to BASE layer........... ");
             if (user_config.esc_double_tap_to_baselyr) {
-                send_string("\x5BON\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BOFF\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
-            send_string("4. DEL \x26 HOME key locations......................... ");
+            send_string("4. DEL "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_8))" HOME key locations......................... ");
             if (user_config.del_right_home_top) {
-                send_string("\x5BHOME on F13\x3B DEL right of BKSPC\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"HOME on F13"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" DEL right of BKSPC" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5B \bDEL on F13\x3B HOME right of BKSPC\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"DEL on F13"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" HOME right of BKSPC" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
-            send_string("5. Numpad on CapsLock\x3B double tap LSHIFT for Caps... ");
+            send_string("5. Numpad on CapsLock"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_9))" double tap LSHIFT for Caps... ");
             if (user_config.double_tap_shift_for_capslock) {
-                send_string("\x5BON\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BOFF\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
             send_string("6. Encoder button function.......................... ");
             if (user_config.encoder_press_mute_or_media) {
-                send_string("\x5BMUTE\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"MUTE" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BMEDIA PLAY\x2FPAUSE\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"MEDIA PLAY"SS_TAP(X_KP_SLASH) "PAUSE" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
             send_string("7. Insert function accessed with.................... ");
             if (user_config.ins_on_shft_bkspc_or_del) {
-                send_string("\x5BSHIFT\x2D \bBKSPC\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"SHIFT"SS_TAP(X_KP_MINUS)"BKSPC"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BSHIFT\x2D \bDEL\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"SHIFT"SS_TAP(X_KP_MINUS)"DEL"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
-            send_string("8. Force SHIFT \x26 CTRL\x2DSPACE to function like SPACE.. ");
+            send_string("8. Force SHIFT "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_3)SS_TAP(X_KP_8))" CTRL"SS_TAP(X_KP_MINUS)"SPACE to function like SPACE.. ");
             if (user_config.disable_space_mods) {
-                send_string("\x5BON\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
+            } else {
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
+            }
+            send_string("9. AutoCorrect...................................... ");
+            if (user_config.autocorrect) {
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             } else {
-                send_string("\x5BOFF\x5D\n");
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
             }
-            send_string("\nThe latest firmware updates are always here\x3a https\x3a\x2F\x2Fgithub.com\x2Fgourdo1\x2Fgmmkpro\x2Dmedia\n");
+            send_string("0. CapsLock highlights extended alphas "SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_4)SS_TAP(X_KP_0))"ISO"SS_TAP(X_KP_MINUS)"only"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_4)SS_TAP(X_KP_1))"... ");
+            if (user_config.rgb_english_caps) {
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"OFF"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
+            } else {
+                send_string(SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_1))"ON"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_9)SS_TAP(X_KP_3))"\n");
+            }
+            send_string("\nThe latest firmware updates are always here"SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_8))" https" SS_LALT(SS_TAP(X_KP_0)SS_TAP(X_KP_0)SS_TAP(X_KP_5)SS_TAP(X_KP_8))SS_TAP(X_KP_SLASH)SS_TAP(X_KP_SLASH) "github.com"SS_TAP(X_KP_SLASH) "gourdo1"SS_TAP(X_KP_SLASH)"gmmkpro"SS_TAP(X_KP_MINUS)"media\n");
         }
         break;
 
@@ -247,6 +234,18 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
             eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
         }
         break;
+    case TG_AUTOCR:  // Toggle AutoCorrect
+        if (record->event.pressed) {
+            user_config.autocorrect ^= 1; // Toggles the status
+            eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
+        }
+        break;
+    case TG_ENGCAP:  // Toggle highlighting Non-English letters during CAPSLOCK
+        if (record->event.pressed) {
+            user_config.rgb_english_caps ^= 1; // Toggles the status
+            eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM
+        }
+        break;
         //return false;
 
         // Key to the left of encoder function (default HOME)
@@ -417,7 +416,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t * record) {
     case KC_00:
         if (record -> event.pressed) {
             // when keycode KC_00 is pressed
-            send_string("00");
+            send_string(SS_TAP(X_KP_0)SS_TAP(X_KP_0));
         } else unregister_code16(keycode);
         break;
 
@@ -572,7 +571,7 @@ bool caps_word_press_user(uint16_t keycode) {
         case KC_DQT:
         case KC_COLN:
         case KC_RSFT:
-        case LSFTCAPSWIN:
+        case KC_LSFT:
             add_weak_mods(MOD_BIT(KC_LSFT));  // Apply shift to next key.
             return true;
 
@@ -625,6 +624,8 @@ void eeconfig_init_user(void) {
     user_config.esc_double_tap_to_baselyr     = true;
     user_config.ins_on_shft_bkspc_or_del      = true;
     user_config.disable_space_mods            = true;
+    user_config.autocorrect                   = true;
+    user_config.rgb_english_caps              = true;
 
     eeconfig_update_user(user_config.raw);
 }

+ 8 - 10
users/gourdo1/gourdo1.h

@@ -57,12 +57,14 @@ enum custom_user_keycodes {
 
         TG_CAPS,       // Toggles RGB highlighting of alphas during capslock
         TG_PAD,        // Toggles RGB highlighting of keys on numpad+mousekeys layer
-        TG_TDCAP,      // Toggles double tap shift (tapdance) for CapsLock
+        TG_TDCAP,      // Toggles double tap shift for CapsLock
         TG_DEL,        // Swaps DEL and HOME key locations
-        TG_ENC,        // Toggle Encoder functionality
-        TG_ESC,        // Toggle ESC tapdance for _BASE layer
+        TG_ENC,        // Toggle Encoder button functionality
+        TG_ESC,        // Toggle ESC double tap for _BASE layer
         TG_INS,        // Toggle location of INS
         TG_SPCMOD,     // Toggle disabling of modded-SPACE functions
+        TG_AUTOCR,     // Toggle AutoCorrect
+        TG_ENGCAP,     // Toggle highlighting Non-English letters during CAPSLOCK on ISO boards
 
         YAHOO,         // yahoo.com
         OUTLOOK,       // outlook.com
@@ -82,12 +84,6 @@ enum custom_user_keycodes {
         NEW_SAFE_RANGE // New safe range for keymap level custom keycodes
 };
 
-
-// Tap Dance Definitions
-enum custom_tapdance {
-    TD_LSFT_CAPS_WIN,
-};
-
 // Set up boolean variables to track user customizable configuration options
 typedef union {
   uint32_t raw;
@@ -100,12 +96,14 @@ typedef union {
     bool     encoder_press_mute_or_media :1;
     bool     ins_on_shft_bkspc_or_del :1;
     bool     disable_space_mods :1;
+    bool     autocorrect :1;
+    bool     rgb_english_caps :1;
   };
 } user_config_t;
 
 user_config_t user_config;
 
-#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN)
+//#define LSFTCAPSWIN TD(TD_LSFT_CAPS_WIN)
 
 // ENCODER ACTIONS
 #ifdef ENCODER_ENABLE

+ 2 - 0
users/gourdo1/rules.mk

@@ -1,4 +1,6 @@
 SRC += gourdo1.c
+SRC += autocorrect/autocorrection.c
+
 ifdef ENCODER_ENABLE
 	# include encoder related code when enabled
 	ifeq ($(strip $(ENCODER_DEFAULTACTIONS_ENABLE)), yes)