Christopher Browne 9 years ago
commit 95a88c09e1

@ -0,0 +1,25 @@
#include "Bantam44.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave these blank
}
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave these blank
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}

@ -0,0 +1,29 @@
#ifndef BANTAM44_H
#define BANTAM44_H
#include "matrix.h"
#include "keymap_common.h"
#include "backlight.h"
#include <stddef.h>
// This a shortcut to help you visually see your layout.
// The following is an example using the Planck MIT layout
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
K30, K31, K32, K33, K34, K35, K36, K37, K38 \
) \
{ \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KC_NO, K2A }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
{ K30, K31, K32, KC_NO, K33, KC_NO, K34, KC_NO, K35, K36, K37, K38 }, \
}
void matrix_init_user(void);
void matrix_scan_user(void);
#endif

@ -0,0 +1,139 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = Bantam44
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = Bantam44.c
ifdef KEYMAP
SRC := keymaps/$(KEYMAP).c $(SRC)
else
SRC := keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=512
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,24 @@
Bantam44 keyboard firmware
======================
## Quantum MK Firmware
For the full Quantum feature list, see [the parent README.md](/README.md).
## Building
Download or clone the whole firmware and navigate to the keyboard/Bantam44 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.

@ -0,0 +1,81 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Bantam Keyboards
#define PRODUCT Bantam44
#define DESCRIPTION A custom keyboard
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 12
// Planck PCB default pin-out
// Change this to how you wired your keyboard
// COLS: Left to right, ROWS: Top to bottom
#define COLS (int []){ B0, B1, B2, B3, B7, D0, B6, F7, F6, F5, F4, F1 }
#define ROWS (int []){ F0, D6, D4, D5 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,30 @@
#include "Bantam44.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Base */
{KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC },
{KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_NO, KC_ENT },
{KC_CAPS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT },
{KC_LCTL, KC_LGUI, KC_LALT, KC_NO, MO(1), KC_NO, KC_SPC, KC_NO, MO(2), KC_SCLN, KC_QUOT, KC_SLSH }
},
[1] = { /* LOWER */
{KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELT },
{KC_TAB, KC_MPRV, KC_MPLY, KC_MNXT, KC_GRV, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_NO, KC_ENT },
{KC_CAPS, KC_LSFT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NO, KC_HOME, KC_PGUP, KC_RSFT },
{KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_TRNS, KC_NO, KC_SPC, KC_NO, KC_TRNS, KC_END, KC_PGDN, KC_EXLM }
},
[2] = { /* RAISE */
{KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DELT },
{KC_TAB, KC_MUTE, KC_VOLD, KC_VOLU, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_NO, KC_ENT },
{KC_CAPS, KC_LSFT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, KC_UP, KC_RSFT },
{KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_TRNS, KC_NO, KC_SPC, KC_NO, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT }
}
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // MACRODOWN only works in this function
{
return MACRO_NONE;
};

@ -0,0 +1,29 @@
# ErgoDox EZ naps62 Configuration
## Motivation
I wanted a layout that suited my Linux & Vim usage. I also didn't like the lack of efficient access to some of the more common special characters used in programming.
## Key features / changes
### Base Layer (L1)
* **No `MT(mod, kc)` keys (modifier when pressed, key when tapped).** Those keys work with a global timeout. When a key press is shorter than the timeout, it's considered a tap, otherwise it's a hold. I couldn't find any particular timeout that would work for me. I need to use mods extremely fast, but also want the confort of using them more slowly in other occasions. So I gave up on this feature altogether.
* **Direct access to `{}[]`.** When programming, these are used extremely often. I was still getting used to the coder layer, and I prefer the arrows on the home row, so I used the bottom-right keys for this.
* **Layer keys everywhere.** I either use my little finger or my index finger to go to L1, whichever is more confortable in any given situation. L2 is not used while coding/writing, so I don't need an extremely-optimized access to it.
* **Lang key.** This is nothing more than `Super-Space` combo, which in my systems (both Linux & Windows) is the shortcut to change the keyboard language. I'm Portuguese, so I often cycle between US layout for coding, and PT layout for writing.
* **Special chars on the right-most column.** I only use Ctrl & Shift keys on the left side, so I used the right keys to include some of the more useful special characters as well.
### Coder Layer (L2)
* The `=` and `-` signs where nowhere to be found. `-` was already on the base layer, but it's still useful to have a fully-featured NumPad on the coder layer.
### Media Layer (L3)
* **Better media keys**. Why was Play/Pause so far away? And where was Mute? I put all my media keys close to each other, including the missing ones
* **Arrow keys on home row.** I use vim, so I'm always on my home row. I use this sometimes to get around, but not as often as to need them on the base row. I'm fine with them here
* I don't use mouse keys. They're still set up, and I made some changes as an experiment, but I mostly forgot they exist by now.
## Author
[Miguel Palhas](https://github.com/naps62)

@ -0,0 +1,1474 @@
:100000000C9402070C9449070C9449070C94490777
:100010000C9449070C9449070C9449070C94490720
:100020000C9449070C9449070C9472120C944413D5
:100030000C9449070C9449070C9449070C94490700
:100040000C9449070C94082C0C9449070C9449070C
:100050000C9449070C9401220C9449070C9449070D
:100060000C9449070C9449070C9449070C944907D0
:100070000C9449070C9449070C9449070C944907C0
:100080000C9449070C9449070C9449070C944907B0
:100090000C9449070C9449070C9449070C944907A0
:1000A0000C9449070C9449070C944907B113D313D6
:1000B000C614D313C61418143B14C6149014A314F6
:1000C000F117F1172018201863189D18AA1AAA1AF8
:1000D000B618AA1AAB19AB197E1AAA1AAA1A951A37
:1000E0000000F0A12D002B002971E100C1000000EB
:1000F0001E00140004001D003500E2001F001A005D
:1001000016001B003400E000200008000700060075
:1001100050002C0021001500090019004F82E30057
:10012000220017000A00050000004A812C08015433
:100130000000007F00004D8249000254000000775B
:1001400000004B8223001C000B00110000004E81B8
:10015000240018000D0010002F024C0025000C0098
:100160000E00360030022C00260012000F0037006F
:100170002F002800270013003300380030002A0029
:100180002D00310034712D72C1000000010001000A
:1001900001000100010000003A001E0220022202BC
:1001A000010001003B001F022102230201000100A7
:1001B0003C002F0226022F00010001003D0030020A
:1001C00027023000010001003E00310235003502F7
:1001D000000001000100010000000100000001001A
:1001E0000100010000000100000001003F0052007A
:1001F00051002402000001004000240021001E00E4
:100200002E0001004100250022001F0037000100E0
:1002100042002600230020002700010043002502A1
:100220002E0231002D0001004400450001000100B4
:100230000100000000500100010001000100000069
:1002400001000100040801000100010001001A087A
:10025000160801000100F500010008080708010068
:100260000100F4000100F400F100010001000100B0
:1002700001001708F3000100000001000100010067
:100280000000010000000100010001000000010069
:100290000000010001000100F20001000000010067
:1002A0000100F400F100AA00AE0001000100F50019
:1002B000F000A900AC00B70001000100F300A800A5
:1002C000AB00B600010001000100010001000100C7
:1002D0000100010001000100010000000A002530BA
:1002E000313662003A200025303258000A722F63FE
:1002F0002030313233343536373839414243444582
:10030000460A000A002530325800626F756E636538
:10031000213A20006C6566742073696465206174FD
:100320007461636865640A006C656674207369644F
:1003300065206E6F7420726573706F6E64696E678E
:100340000A00747279696E6720746F207265736534
:1003500074206D637032333031380A000A444542EC
:1003600055473A20656E61626C65642E0A005B73C6
:100370005D004B6579626F617264207374617274A1
:100380002E0A005B575D005B535D005B525D005BB6
:10039000445D005B435D0016034500720067006F1B
:1003A0000044006F007800200045005A000000164D
:1003B000034500720067006F0044006F0078002062
:1003C0000045005A0000000403090409028D0005DD
:1003D0000100A0FA09040000010301010009211134
:1003E000010001223F000705810308000A090401FA
:1003F000000103010200092111010001224D000743
:1004000005820308000A0904020001030000000934
:1004100021110100012236000705830308000A09A3
:100420000403000203000000092111010001222041
:1004300000070584032000010705040320000109CB
:100440000404000103000000092111010001223908
:1004500000070585031000011201100100000008CB
:10046000EDFE071301000102000105010906A101CB
:10047000050719E029E71500250195087501810296
:100480000508190129059505750191029501750366
:100490009101050719002977150025019578750147
:1004A0008102C00631FF0974A1010975150025FFFD
:1004B0009520750881020976150025FF952075089D
:1004C0009102C005010980A101850216010026B72D
:1004D000001A01002AB700751095018100C0050CB3
:1004E0000901A1018503160100269C021A01002AB8
:1004F0009C02751095018100C005010902A1010946
:1005000001A10005091901290515002501950575A9
:100510000181029501750381010501093009311539
:1005200081257F95027508810609381581257F95FB
:100530000175088106050C0A38021581257F950191
:1005400075088106C0C005010906A101050719E06B
:1005500029E71500250195087501810295017508A7
:10056000810105081901290595057501910295017B
:10057000750391010507190029FF150025FF950650
:1005800075088100C00A002530325820006B65795B
:10059000626F6172645F7265706F72743A20000AF4
:1005A0000025303258006B6579626F6172645F7349
:1005B00065745F6C65643A200064656C5F6B657997
:1005C0005F6269743A2063616E27742064656C3AD7
:1005D00020253032580A006164645F6B65795F6280
:1005E00069743A2063616E2774206164643A20253F
:1005F0003032580A00646F6E652E0A00626F6F67B2
:100600006D61676963207363616E3A202E2E2E2020
:1006100000290A002575002F002575005D2800259A
:10062000640020002564002000256400200025646B
:10063000007C0025303258006D6F7573656B6579ED
:10064000205B62746E7C782079207620685D287249
:1006500065702F61636C293A205B006D6B5F776872
:1006600065656C5F74696D655F746F5F6D6178203F
:100670003D2025640A006D6B5F776865656C5F6D72
:1006800061785F7370656564203D2025640A006DA4
:100690006B5F74696D655F746F5F6D6178203D207D
:1006A00025640A006D6B5F6D61785F7370656564CA
:1006B000203D2025640A006D6B5F696E746572765B
:1006C000616C203D2025640A006D6B5F64656C6180
:1006D00079203D2025640A006D6B5F776865656C45
:1006E0005F74696D655F746F5F6D6178203D202573
:1006F000640A006D6B5F776865656C5F6D61785F3C
:100700007370656564203D2025640A006D6B5F741D
:10071000696D655F746F5F6D6178203D2025640AA7
:10072000006D6B5F6D61785F7370656564203D205F
:1007300025640A006D6B5F696E74657276616C206A
:100740003D2025640A006D6B5F64656C6179203D16
:100750002025640A000A00257500363A207768656E
:10076000656C5F74696D655F746F5F6D61783A2069
:10077000000A00257500353A20776865656C5F6D65
:1007800061785F73706565643A20000A0025750022
:10079000343A2074696D655F746F5F6D61783A20DB
:1007A000000A00257500333A206D61785F7370652B
:1007B00065643A20000A00257500323A20696E749B
:1007C000657276616C286D73293A20000A002575E0
:1007D00000313A2064656C6179282A31306D7329C3
:1007E0003A20000A092D2056616C756573202D0A88
:1007F000004D3E004D25643E20003F00736574208F
:1008000064656661756C740A00433E200077686514
:1008100072652064656C74613A20637572736F72DF
:100820003D25642C20776865656C3D25640A536519
:100830006520687474703A2F2F656E2E77696B6926
:1008400070656469612E6F72672F77696B692F4DD0
:100850006F7573655F6B6579730A000A092D204D0A
:100860006F7573656B6579202D0A4553432F713A77
:1008700009717569740A313A0964656C6179282ACD
:1008800031306D73290A323A09696E746572766186
:100890006C286D73290A333A096D61785F7370654E
:1008A00065640A343A0974696D655F746F5F6D61E0
:1008B000780A353A09776865656C5F6D61785F73B2
:1008C000706565640A363A09776865656C5F7469B6
:1008D0006D655F746F5F6D61780A0A703A097072B6
:1008E000696E742076616C7565730A643A09736584
:1008F000742064656661756C74730A75703A092BAF
:10090000310A646F776E3A092D310A706775703A53
:10091000092B31300A7067646F776E3A092D3130D8
:100920000A0A7370656564203D2064656C746120FB
:100930002A206D61785F7370656564202A202872B3
:100940006570656174202F2074696D655F746F5FD9
:100950006D6178290A003F004D3E2000433E200093
:100960004C25640A000A092D20436F6E736F6C6575
:10097000202D0A4553432F713A09717569740A6D28
:100980003A096D6F7573656B65790A000A092D2048
:100990004D61676963202D0A643A09646562756771
:1009A0000A783A096465627567206D6174726978C6
:1009B0000A6B3A096465627567206B6579626F61DD
:1009C00072640A6D3A096465627567206D6F7573AC
:1009D000650A763A0976657273696F6E0A733A0929
:1009E0007374617475730A633A09636F6E736F6C25
:1009F00065206D6F64650A302D343A096C61796544
:100A000072302D34284631302D4634290A50617514
:100A1000733A09626F6F746C6F616465720A653A4C
:100A200009656570726F6D0A6E3A094E4B524F0A36
:100A30007A3A09736C656570204C4544207465737F
:100A4000740A000A002575002E6E6B726F3A200042
:100A50000A002575002E737761705F6261636B73A6
:100A60006C6173685F6261636B73706163653A2088
:100A7000000A002575002E737761705F67726176DA
:100A8000655F6573633A20000A002575002E6E6F5E
:100A90005F6775693A20000A002575002E7377613B
:100AA000705F72616C745F726775693A20000A004A
:100AB0002575002E737761705F6C616C745F6C6775
:100AC00075693A20000A002575002E636170736C09
:100AD0006F636B5F746F5F636F6E74726F6C3A20DD
:100AE000000A002575002E737761705F636F6E7466
:100AF000726F6C5F636170736C6F636B3A20000A96
:100B00000025303258006B65796D61705F636F6EE0
:100B10006669672E7261773A20000A002575002EFB
:100B20006D6F7573653A20000A002575002E6B65A0
:100B300079626F6172643A20000A002575002E6D9B
:100B400061747269783A20000A002575002E656E7E
:100B500061626C653A20000A0025303258006465F5
:100B60006275675F636F6E6669672E7261773A20A0
:100B7000000A0025750064656661756C745F6C61C0
:100B80007965723A20003F004E4B524F3A206F6613
:100B9000660A004E4B524F3A206F6E0A0074696D20
:100BA00065725F636F756E743A202530346C580A35
:100BB000006B6579626F6172645F6E6B726F3A2071
:100BC00025580A006B6579626F6172645F69646CB5
:100BD000653A2025580A006B6579626F6172645F1F
:100BE00070726F746F636F6C3A2025580A00686FDB
:100BF00073745F6B6579626F6172645F6C65647357
:100C000028293A2025580A000A092D2053746174B6
:100C10007573202D0A004743433A20352E332E307A
:100C2000204156522D4C4942433A20312E382E3124
:100C300073766E204156525F415243483A206176A6
:100C400072350A004F5054494F4E533A204C554686
:100C50004120424F4F544D41474943204D4F55533A
:100C6000454B45592045585452414B455920434F17
:100C70004E534F4C4520434F4D4D414E44204E4B1B
:100C8000524F203531320A004255494C443A203601
:100C9000386366663764202832323A33323A303568
:100CA000204A616E2033302032303136290A005616
:100CB00049443A20307846454544284572676F4498
:100CC0006F7820455A29205049443A2030783133F2
:100CD0003037284572676F446F7820455A2920566F
:100CE00045523A203078303030310A004445534381
:100CF0003A20742E6D2E6B2E206B6579626F6172B7
:100D000064206669726D7761726520666F72204536
:100D100072676F646F780A000A092D205665727336
:100D2000696F6E202D0A000A6D6F7573653A206F2A
:100D300066660A000A6D6F7573653A206F6E0A0069
:100D40000A6B6579626F6172643A206F66660A00A9
:100D50000A6B6579626F6172643A206F6E0A000AED
:100D60006D61747269783A206F66660A000A6D6177
:100D7000747269783A206F6E0A000A64656275675A
:100D80003A206F6E0A000A64656275673A206F66E2
:100D9000660A000A0A626F6F746C6F616465722E76
:100DA0002E2E2000433E20006565636F6E666967E6
:100DB0003A0A00536C656570204C45442074657395
:100DC000740A0000000000000000000000000102A2
:100DD00004060A0F17202C3A4A5D71879DB3C7DAC3
:100DE000E9F5FCFFFCF5E9DAC7B39D87715D4A3A86
:100DF0002C20170F0A06040201000000000000006A
:100E00000000000011241FBECFEFDAE0DEBFCDBF2F
:100E100004B603FE27C08091F8019091F901A091DA
:100E2000FA01B091FB018730904BA740B04BD1F451
:100E30001092F8011092F9011092FA011092FB0140
:100E400014BE84B7877F84BF0FB6F894A8958091AD
:100E50006000886180936000109260000FBEE0E047
:100E6000FFE3099511E0A0E0B1E0EAECFBE502C088
:100E700005900D92AA33B107D9F721E0AAE3B1E0BA
:100E800001C01D92A83FB207E1F70E94AD0F0C947C
:100E9000E32D0C940000FF93EF93E0913A01F09161
:100EA0003B01309709F00995EF91FF910895FC01FE
:100EB0008591803011F0EFDFFBCF0895FF27E0E24E
:100EC00030E247FF0CC0419597FF09C0EDE2609505
:100ED000709580959095611D711D811D911D27FF55
:100EE00002C0219530E350E2AA27660F771F881FC2
:100EF000991FAA1FA41710F0A41B63955A95A9F770
:100F0000AA3008F0A95FA05DAF93F3956115710554
:100F10008105910541F7ED3211F4EF93F395F21746
:100F200018F43F93F395FBCF8F91B5DFFA95E1F776
:100F30000895E991F9918591803021F0853219F079
:100F4000AADFF9CF089520E0E89455915532C1F316
:100F5000503311F4689455915A3348F4505390F338
:100F6000220F022E220F220F200D250FF4CF0EF498
:100F7000219589919991533619F3533729F15335B6
:100F800059F1BC0188279927E8945C3621F48991AE
:100F9000999168945591543639F446EF7EF077FF75
:100FA0000DC08FEF9FEF0AC055374AE039F0583532
:100FB00040E121F0523642E009F00895FF93EF93AB
:100FC0007DDFEF91FF91B7CFFF93EF93FC0181910C
:100FD0008030B9F360DFFBCFFF93EF9368DFF1CF91
:100FE000DF93CF93CDB7DEB72596A3DFCF91DF9107
:100FF000089561110BC0FC018281882321F085EEE8
:101000000E948B1603C085EE0E94531780E090E08B
:10101000089508956091BC017091BD018091BE0159
:101020009091BF010E94022156985E9825982D98B4
:1010300026982E9827982F98813019F0823021F029
:101040000895259A2D9A0895269A2E9A08958AE051
:1010500098E0892B11F00E940A0880E090E0089542
:1010600056985E9825982D9826982E9827982F9810
:101070008FEF90E0909389008093880090938B008D
:1010800080938A0090938D0080938C00259A2D9AEE
:101090002FEF80E792E0215080409040E1F700C0C0
:1010A0000000269A2E9A2FEF80E792E02150804090
:1010B0009040E1F700C00000279A2F9A2FEF80E7B9
:1010C00092E0215080409040E1F700C00000259858
:1010D0002D982FEF80E792E0215080409040E1F77B
:1010E00000C0000026982E982FEF80E792E0215054
:1010F00080409040E1F700C0000027982F98569854
:101100005E9825982D9826982E9827982F980895C0
:1011100089EA8093800089E08093810024982C984C
:101120003F988AB18F748AB96E98479A8BB1806B59
:101130008BB9769A0E94300889E098E0892B11F0EB
:101140000E94090880E090E0089580E28093000109
:1011500080913C0181110EC00E94F40881E08093CF
:101160003C012FEF83ED90E3215080409040E1F768
:1011700000C0000080E40E94FA0880930001811101
:101180002EC00E94240980930001811128C00E9472
:10119000240980930001811122C08FE30E94240959
:1011A0008093000181111BC00E941C0980E40E94F1
:1011B000FA0880930001811112C08CE00E9424097A
:1011C0008093000181110BC00E94240980930001CB
:1011D000811105C08FE30E942409809300010E94C1
:1011E0001C098091000108951092B9008AE0809353
:1011F000B800089594EA9093BC009091BC0097FFCA
:10120000FCCF9091B900987F983021F0903111F087
:1012100081E008958093BB0084E88093BC008091B6
:10122000BC0087FFFCCF8091B900887F883111F026
:10123000803471F780E0089584E98093BC00809148
:10124000BC0084FDFCCF08958093BB0084E88093AC
:10125000BC008091BC0087FFFCCF9091B900987FC3
:1012600081E0983209F480E0089584E88093BC001E
:101270008091BC0087FFFCCF8091BB0008958091D6
:101280000001811115C080E40E94FA0880930001DA
:1012900081110CC082E10E94240980930001811118
:1012A00005C08FEF0E942409809300010E941C0951
:1012B00084B1807F84B985B1807F85B98AB1837F0D
:1012C0008AB98BB1837F8BB93E98469808950E9466
:1012D000A508809300010E943F0980B38C7080BBF9
:1012E00081B3836F81BBECE4F1E0AEE3B1E0119236
:1012F0001D9281E0EA35F807D1F788E898E0892B5C
:1013000011F00C94880808957F928F929F92AF926B
:10131000BF92CF92DF92EF92FF920F931F93CF93E2
:10132000DF93809100018823E1F080913D018F5F80
:1013300080933D01811115C082E493E00E9457071C
:101340000E94A50880930001882329F088E293E099
:101350000E94570706C084E193E00E9457070E944D
:1013600030088EE3E82E81E0F82E8701C0E0D0E05F
:101370009924939492E0892EAA24A394B12C35E069
:10138000C32E33E0D32EC730D10500F58091000184
:10139000811164C080E40E94FA08809300018111E9
:1013A00012C082E10E9424098093000181110BC0C8
:1013B000C5010C2E01C0880F0A94EAF780950E949F
:1013C0002409809300010E941C0948C0CA30A1F082
:1013D00028F4C83059F0C93061F005C0CC3089F02C
:1013E00070F0CD3089F0209A289810C0219A299861
:1013F0000DC0229A2A980AC0239A2B9807C0529AA5
:1014000001C0539A5B9802C03E9A4698E0EAEA957A
:10141000F1F78FB181708925799902C032E001C05E
:1014200030E0832B7C9902C034E001C030E0832B94
:101430007D9902C028E001C020E0822B7E9902C085
:1014400090E101C090E0892B9FB19095991F992759
:10145000991F9295990F907E892B10C08091000161
:10146000811175C080E40E94FA08809300018823EE
:1014700009F45AC0712C0E941C09872DD8019C9137
:10148000981739F18C9380910101882301F18091A3
:10149000D70180FF04C08AE093E00E945707809143
:1014A000D70180FF0CC0809101011F928F93DF92C2
:1014B000CF920E94F0070F900F900F900F908091A5
:1014C000D70180FF04C083E093E00E945707809219
:1014D00001010E943F0921960F5F1F4FCE30D105B9
:1014E00009F051CF809101018823B9F08150809398
:1014F0000101882339F0EFE9FFE03197F1F700C0EF
:1015000000000BC0ECE4F1E0D7018D917D018193E7
:10151000BCE4EB16B1E0FB06B9F787E298E0892B53
:10152000C1F00E94270815C083E10E94240980931E
:10153000000181119FCF81E40E94FA08809300018D
:10154000811198CF0E943509782E709494CF80E055
:1015500095CF81E0DF91CF911F910F91FF90EF9098
:10156000DF90CF90BF90AF909F908F907F90089525
:10157000E82FF0E0E45BFE4F80810895CF92DF9288
:10158000EF92FF920F931F93CF93DF938CEE92E035
:101590000E9457078CE4E82E81E0F82EC0E0D0E0EE
:1015A00097EEC92E92E0D92E0EED12E0DF93CF9385
:1015B000DF92CF920E94F00784EE92E00E945707DC
:1015C000F70181917F0190E00E9464219F938F93A6
:1015D0001F930F930E94F0078CED92E00E94570733
:1015E00021968DB79EB708960FB6F8949EBF0FBE92
:1015F0008DBFCE30D105D1F6DF91CF911F910F91E4
:10160000FF90EF90DF90CF9008958B3B910580F491
:10161000883A910548F5853A9105D8F484309105CA
:1016200008F0B2C0019709F06EC081E090E0089523
:10163000803E910508F467C0883E910508F4A4C077
:101640009C01205F31092031310508F05CC09065B4
:101650000895853A910509F459C0863A910509F033
:1016600058C082E890E40895883A910509F454C07E
:10167000893A910509F453C08A3A910509F452C098
:101680008B3A910509F451C08C3A910509F450C088
:101690008D3A910509F44FC0803B910509F44EC085
:1016A0008E3A910509F44DC08F3A910509F44CC06A
:1016B000813B910509F44BC0823B910509F44AC076
:1016C000833B910509F449C0843B910509F448C066
:1016D000853B910509F447C0863B910509F446C056
:1016E000873B910509F445C0883B910509F444C046
:1016F000893B910509F443C08A3B910509F442C036
:1017000080E094E4089580E090E0089581E890E41A
:10171000089583E890E4089582EE94E4089589EEB4
:1017200094E408958AEE94E4089585EB94E4089592
:1017300086EB94E4089587EB94E408958CEC94E4AC
:1017400008958DEC94E4089583E895E408958AE87B
:1017500095E4089582E995E4089584E995E408956F
:1017600081E296E4089583E296E4089584E296E4A3
:10177000089585E296E4089586E296E4089587E266
:1017800096E408958AE296E40895089524E5829FF8
:10179000C0011124FC0126E0729FE00DF11D11240F
:1017A000E60FF11DEE0FFF1FEC51FF4F8591949155
:1017B0000895880F991FFC01E05AF040859194919B
:1017C0000895880F991FFC01E052FF4F8591949175
:1017D000089524E5829FC0011124FC0146E0749F16
:1017E000E00DF11D1124E60FF11DEE0FFF1FEC516E
:1017F000FF4F859194919C013A9521154FE1340753
:1018000008F429C13F512115304120F49F700E94F6
:10181000E10B08959C0130532115304118F49927AC
:10182000906C0895811520E5920769F40E94CC1A06
:101830004FEF84E39CE0415080409040E1F700C0CE
:1018400000000C942622813020E5920751F48CE5AB
:1018500093E00E9457078091D70181608093D70160
:1018600008959C0130552115304108F05CC0292FA6
:1018700033272F70332721303105E9F4AC0164E0C0
:10188000440F551F6A95E1F744275370BC016370FC
:10189000772702C0220F331F6A95E2F73C68242B9A
:1018A000352B73E0880F991F7A95E1F78076992799
:1018B000822B932B08952230310529F4982F882705
:1018C000816F906A089523303105A1F4AC0133E0B3
:1018D000440F551F3A95E1F7407E57708370992762
:1018E00021E030E002C0220F331F8A95E2F7C901E0
:1018F0009C6816C02430310531F5AC0123E0440F5B
:10190000551F2A95E1F7407E57708370992721E093
:1019100030E002C0220F331F8A95E2F7C9019A68AE
:10192000842B952B08959C0130572115304118F4D4
:101930009F70906208959C0130582115304118F431
:101940009F70906A0895803E9105E0F4803C910577
:1019500058F58133910509F46FC048F48932910537
:1019600009F463C08A32910509F46DC072C08933ED
:101970009105E9F082389105D1F08533910509F49C
:101980004DC067C0833E910581F138F4803E9105DA
:10199000B9F0823E9105D9F05CC0863E910561F1B7
:1019A000873E9105A1F155C00E94D90B0895209161
:1019B000E90120FD02C021FF4CC080EE90E049C04B
:1019C0008091E90180FFF9CF89E390E042C08091E6
:1019D000E90182FF0EC08091E90184FF03C080E02D
:1019E00090E037C083EE90E034C08091E90182FF3F
:1019F000F2CF82EE90E02DC08091E90183FF0BC011
:101A00008091E90184FDEBCF87EE90E022C08091C8
:101A1000E90183FFF5CF86EE90E01BC08091E901DC
:101A200085FF07C089E290E014C08091E90185FF3D
:101A3000F9CF85E390E00DC08091E90186FF07C0F2
:101A40008AE290E006C08091E90186FFF9CF81E348
:101A500090E00E94050B0895089580916D0108950E
:101A60009FB7F89410925C019FBF9091EF01943062
:101A700009F057C09091E9009F703091EC00232F3E
:101A8000217030FD20E8922B24E02093E900209182
:101A9000EB0020FF43C02091EE0027FF3FC02091C4
:101AA0005A01222321F02091E80025FF37C010922F
:101AB0005A0126E03091E80035FD15C03091EF0164
:101AC000343061F53091EB0035FD28C0215021F410
:101AD00081E080935A0122C0EFE9FFE03197F1F7EE
:101AE00000C00000E7CF8093F1008091E80085FD01
:101AF0000AC08091E80080FFFCCF8091E8008E77DB
:101B00008093E80006C08FB7F89421E020935C0131
:101B10008FBF9F709093E90080E008959F7090932D
:101B2000E9008FEF0895CF93DF9300D01F92CDB7D8
:101B3000DEB79C018091EF01843019F593E0998321
:101B40003B832A839093E9008FEF9091E8008150C6
:101B500095FD06C095ED9A95F1F700008111F5CF3E
:101B60008091E80085FF0DC040E050E063E070E048
:101B7000CE0101960E9466108091E8008E778093D6
:101B8000E8000F900F900F90DF91CF910895CF93C1
:101B9000DF9300D01F92CDB7DEB72091EF01243044
:101BA00021F522E029839B838A8383E08093E900E7
:101BB0008FEF9091E800815095FD06C095ED9A95C4
:101BC000F1F700008111F5CF8091E80085FF0DC08D
:101BD00040E050E063E070E0CE0101960E946610A4
:101BE0008091E8008E778093E8000F900F900F901F
:101BF000DF91CF9108959C018091EF018430F9F439
:101C000082E08093E9009FEF8091E800915085FD8C
:101C100006C085ED8A95F1F700009111F5CF80910E
:101C2000E80085FF0CC040E050E065E070E0C901CD
:101C30000E9466108091E8008E778093E8000895F6
:101C4000CF93DF93EC018091EF01843009F047C01E
:101C500080910C018823E1F080910D018823C1F06F
:101C600085E08093E9008FEF9091E800815095FD29
:101C700006C095E19A95F1F700008111F5CF8091AA
:101C8000E80085FF2CC040E050E060E170E017C044
:101C900081E08093E9008FEF9091E800815095FDFD
:101CA00006C095ED9A95F1F700008111F5CF80916E
:101CB000E80085FF14C040E050E068E070E0CE012D
:101CC0000E9466108091E8008E778093E80080E1A2
:101CD000FE01ADE5B1E001900D928A95E1F7DF914B
:101CE000CF91089583E993E00E9457078091EE0118
:101CF000811109C00E94F7110E9454128091E200E4
:101D000084608093E20008958FE893E00E94570773
:101D10001092EE0108958BE893E00C94570787E842
:101D200093E00E9457070C94F52B83E893E00E9400
:101D300057070E94BC210E94FB2B0E94FE140C94AA
:101D40002C0D20915B012F5F822F62E30E94782D82
:101D5000992319F020935B01089510925B01809103
:101D60005C01882371F18091EF01843041F580910D
:101D7000E9008F702091EC00922F917020FD90E887
:101D8000892B94E09093E9009091EB0090FF14C0B0
:101D90009091EE0097FF10C09091E80095FF03C06E
:101DA0001092F100F9CF9091E80090FF05C090915A
:101DB000E8009E779093E8008F708093E90010927E
:101DC0005C01089542E061EC81E00E94701142E004
:101DD00061EC82E00E94701142E061EC83E00E94BD
:101DE000701142E261EC84E00E94701142E161EC0A
:101DF00085E00C9470118091F101833009F455C095
:101E000030F4813071F0823009F48EC008958A3048
:101E100009F47AC08B3009F460C0893009F09CC0A5
:101E200020C08091F001813A09F096C08091E800CD
:101E3000877F8093E8008091F4019091F501892BD0
:101E400021F460E18DE591E003C060E080E090E086
:101E500070E00E94B1108091E8008B778093E800D9
:101E600008958091F001813209F076C08091F401EB
:101E70009091F501009719F0049709F06DC08091D9
:101E8000E800877F8093E8008091E80082FD05C02C
:101E90008091EF018111F8CF5FC08091F1008093B4
:101EA0006D018091E8008B7753C08091F001813AF9
:101EB00009F052C08091F4019091F501892B09F04D
:101EC0004BC08091E800877F8093E8008091E80014
:101ED00080FFFCCF80910C0136C08091F0018132EF
:101EE000D9F58091F4019091F501892BA9F58091A4
:101EF000E800877F8093E8000E94A5118091F2019D
:101F000080930C010C94CC1A8091F001813221F560
:101F10008091E800877F8093E8000E94A51180915E
:101F2000F30180936E0108958091F001813AA1F44C
:101F30008091E800877F8093E8008091E80080FF2F
:101F4000FCCF80916E018093F1008091E8008E7744
:101F50008093E8000C94A511089584B7877F84BF0F
:101F60000FB6F894A8958091600088618093600016
:101F7000109260000FBE90E080E80FB6F894809356
:101F80006100909361000FBE0E948A150E94F711B4
:101F90000E9454128091E20084608093E20080E30A
:101FA0009DE00E94FD2078940E94DE140E948C1512
:101FB00082E091E00E94F9140E94E32B82E793E013
:101FC0000E9457078091EF01853089F48EE693E0F7
:101FD0000E9457070E947E218091ED01882391F392
:101FE0000E94A821882371F30E945010EBCF0E9419
:101FF000BA15E8CF292F332723303105C9F060F413
:102000002130310581F02230310509F041C08DE8E1
:1020100090E02BEC33E040C021323105E1F0223278
:10202000310531F135C082E190E028E534E034C07B
:1020300099278130910549F028F0029749F5E7E9A1
:10204000F3E005C0E7ECF3E002C0EFEAF3E08491CF
:1020500090E09F0121C06530D8F4E62FF0E0EE0F4C
:10206000FF1FEB5DFE4F2081318189E090E014C0BD
:10207000653070F470E0FB01EE0FFF1FE55EFE4F70
:1020800020813181FB01EA5EFE4F808190E004C037
:1020900080E090E020E030E0FA0131832083089571
:1020A00080E189BD82E189BD09B400FEFDCF809148
:1020B000D8008F7D8093D8008091E000826080936B
:1020C000E0008091E00081FDFCCF0895CF92DF9287
:1020D000EF92FF920F931F93CF93DF93EC018B014D
:1020E0006A010E94C411811133C0C114D10439F0B6
:1020F000F60180819181081B190BC80FD91FE12CB3
:10210000F12C0115110519F18091E80085FD16C02B
:102110008091E8008E778093E800C114D10449F0E3
:10212000F60180819181E80EF91EF182E08285E05E
:102130000FC00E94C411882321F30AC089918093A3
:10214000F10001501109FFEFEF1AFF0ADACF80E02A
:10215000DF91CF911F910F91FF90EF90DF90CF9083
:1021600008952091F6013091F7012617370748F0BE
:102170006115710539F42091E8002E772093E8006D
:1021800001C0B901FC0120E06115710579F1809170
:10219000EF018823F1F18530F1F18091E80083FDB2
:1021A0003CC08091E80082FD2EC08091E80080FF55
:1021B000EBCF2091F3008091F20090E0922B61151B
:1021C000710551F08830910538F421912093F10088
:1021D000615071090196F3CF21E0089709F020E0E2
:1021E0008091E8008E778093E800CECF2111CFCF89
:1021F0000AC08091EF01882361F0853061F0809101
:10220000E80083FD0AC08091E80082FFF2CF80E001
:10221000089582E0089583E0089581E00895209173
:10222000F6013091F7012617370748F0611571055F
:1022300039F42091E8002E772093E80001C0B9011D
:10224000FC0120E06115710591F18091EF01882377
:1022500009F440C0853009F43FC08091E80083FD57
:102260003DC08091E80082FD2FC08091E80080FF92
:10227000E9CF2091F3008091F20090E0922B61155C
:10228000710559F08830910540F424912093F100B4
:102290003196615071090196F2CF21E0089709F05B
:1022A00020E08091E8008E778093E800CBCF211169
:1022B000CCCF0AC08091EF01882361F0853061F0B6
:1022C0008091E80083FD0AC08091E80082FFF2CF90
:1022D00080E0089582E0089583E0089581E0089504
:1022E000982F973068F59093E900981739F070911E
:1022F000EC002091ED005091F00003C0242F762FC8
:1023000050E021FD02C09F5FECCF3091EB003E7F9B
:102310003093EB003091ED003D7F3093ED00309134
:10232000EB0031603093EB007093EC002093ED00F4
:102330005093F0002091EE0027FDE5CF80E0089556
:102340008F708093E90081E008958091F00187FF0C
:1023500011C08091E80082FD05C08091EF018111DC
:10236000F8CF11C08091E8008B770BC08091EF010E
:10237000882349F08091E80080FFF8CF8091E80041
:102380008E778093E80008952091E4003091E50075
:1023900095E64091EC00842F817040FF23C080912E
:1023A000E80080FD1DC08091EF01882399F0853001
:1023B00099F08091EB0085FD11C04091E4005091AF
:1023C000E5002417350729F3915011F09A01E1CF68
:1023D00084E0089582E0089583E0089581E00895FF
:1023E00080E008954091E80042FFDDCF08950E940B
:1023F00065120E946D12E0EEF0E0808181608083C2
:10240000E8EDF0E080818F77808319BCA7EDB0E024
:102410008C918E7F8C9380818F7E80831092EE01D1
:1024200008950F931F93CF93DF930E9465120E942C
:102430006D12C8EDD0E088818F77888388818068AD
:10244000888388818F7D888319BC1092EF01109258
:10245000EB011092ED011092EC0100EE10E0F8019A
:1024600080818B7F808388818160888342E060E007
:1024700080E00E947011E1EEF0E080818E7F808329
:10248000E2EEF0E0808181608083808188608083DB
:10249000F80180818E7F8083888180618883DF91CD
:1024A000CF911F910F910895E8EDF0E080818F7E2C
:1024B0008083E7EDF0E080818160808384E082BFEB
:1024C00081E08093EE010C941112E8EDF0E0808140
:1024D0008E7F80831092E20008951092DA001092AD
:1024E000E10008951F920F920FB60F9211242F93BF
:1024F0003F934F935F936F937F938F939F93AF938C
:10250000BF93EF93FF938091E10082FF0BC0809116
:10251000E20082FF07C08091E1008B7F8093E100A1
:102520000E94A10E8091DA0080FF1FC08091D80028
:1025300080FF1BC08091DA008E7F8093DA0080914B
:10254000D90080FF0DC080E189BD82E189BD09B459
:1025500000FEFDCF81E08093EF010E94720E05C066
:1025600019BC1092EF010E94840E8091E10080FF5F
:1025700019C08091E20080FF15C08091E2008E7F3B
:102580008093E2008091E20080618093E20080917C
:10259000D80080628093D80019BC85E08093EF0159
:1025A0000E948F0E8091E10084FF30C08091E20094
:1025B00084FF2CC080E189BD82E189BD09B400FEA1
:1025C000FDCF8091D8008F7D8093D8008091E1006D
:1025D0008F7E8093E1008091E2008F7E8093E20005
:1025E0008091E20081608093E2008091EB0188237A
:1025F00011F084E007C08091E30087FD02C081E014
:1026000001C083E08093EF010E94950E8091E1006C
:1026100083FF29C08091E20083FF25C08091E10003
:10262000877F8093E10082E08093EF011092EB01BD
:102630008091E1008E7F8093E1008091E2008E7FA7
:102640008093E2008091E20080618093E20042E0AA
:1026500060E080E00E9470118091F00088608093BB
:10266000F0000E948B0EFF91EF91BF91AF919F916F
:102670008F917F916F915F914F913F912F910F902B
:102680000FBE0F901F9018951F920F920FB60F92CA
:1026900011242F933F934F935F936F937F938F9367
:1026A0009F93AF93BF93CF93DF93EF93FF93C0912B
:1026B000E900CF708091EC00D82FD17080FDD0E878
:1026C0001092E9008091F000877F8093F000789469
:1026D0000E9488131092E9008091F0008860809336
:1026E000F000CD2BCF70C093E900FF91EF91DF9107
:1026F000CF91BF91AF919F918F917F916F915F919A
:102700004F913F912F910F900FBE0F901F901895F2
:102710001F93CF93DF93CDB7DEB7AA970FB6F89488
:10272000DEBF0FBECDBFE0EFF1E08091F1008193FD
:1027300021E0E83FF207C9F70E94FB0E8091E80014
:1027400083FF24C18091F0019091F101492F50E065
:102750004A30510508F01AC1FA01EA5AFF4F0C94A9
:10276000982D803881F0823809F010C18091F401F1
:102770008F708093E9008091EB0085FB882780F9BA
:102780001092E90006C08091EC019091ED01911149
:1027900082609091E800977F9093E8008093F10029
:1027A0001092F100C8C0282F2D7F09F0EFC08823B8
:1027B00019F0823061F0EAC08091F201813009F0B5
:1027C000E5C0933009F080E08093ED012BC080914B
:1027D000F201811127C08091F4018F7009F4D6C0F5
:1027E0008093E9002091EB0020FF1CC0933021F47E
:1027F0008091EB00806214C09091EB009061909307
:10280000EB0021E030E0A90102C0440F551F8A957A
:10281000E2F74093EA001092EA008091EB008860B2
:102820008093EB001092E9008091E800877F86C0DA
:102830008111ACC01091F2011F778091E300807884
:10284000812B8093E3008091E800877F8093E800EC
:102850000E94A5118091E80080FFFCCF8091E300E9
:1028600080688093E300111102C082E001C083E020
:102870008093EF018BC08058823008F087C0809130
:10288000F2019091F3018C3D53E0950779F583E0D7
:102890008A838AE289834FB7F894DE01139620E099
:1028A0003EE051E2E32FF0E050935700E49120FF27
:1028B00003C0E295EF703F5FEF708E2F90E0EA303B
:1028C00010F0C79601C0C0968D939D932F5F243161
:1028D00049F74FBF8091E800877F8093E8006AE264
:1028E00070E0CE0101960E94B11014C0AE014F5F9E
:1028F0005F4F6091F4010E94FA0FBC01892B09F42B
:1029000045C09091E800977F9093E80089819A8173
:102910000E940F118091E8008B778093E80036C009
:102920008038A1F58091E800877F8093E80080914E
:10293000EB018093F1008091E8008E778093E800AE
:102940000E94A51123C0811121C08091F2019091B4
:10295000F30199270297D4F48091E800877F809350
:10296000E8008091F2018093EB010E94A511809113
:10297000EB01811106C08091E30087FD02C081E078
:1029800001C084E08093EF010E94E20E8091E80094
:1029900083FF0AC08091E800877F8093E8008091E0
:1029A000EB0080628093EB00AA960FB6F894DEBF2E
:1029B0000FBECDBFDF91CF911F910895CF9380912E
:1029C000EF018823A1F0C091E900CF709091EC0055
:1029D000892F817090FD80E8C82B1092E9008091CA
:1029E000E80083FD0E948813CF70C093E900CF9167
:1029F000089590937401809373010895E091730199
:102A0000F0917401309721F00190F081E02D09944C
:102A100080E00895EF92FF921F93CF93DF93F82EFB
:102A2000192FE0917301F09174013097A9F10280A0
:102A3000F381E02D09958091D70182FF2DC080FFA1
:102A400004C08DE895E00E945707CF2DD12F10E1EB
:102A500087E8E82E85E0F82E8091D70180FF0BC033
:102A600088811F928F93FF92EF920E94F0070F9040
:102A70000F900F900F90115021961111EDCF809172
:102A8000D70180FF09C085E895E0DF91CF911F91C4
:102A9000FF90EF900C945707DF91CF911F91FF901B
:102AA000EF900895E0917301F0917401309721F057
:102AB0000480F581E02D09940895209171013091F1
:102AC00072012817390771F0909372018093710198
:102AD000E0917301F0917401309721F00680F78145
:102AE000E02D0994089520916F013091700128170D
:102AF000390771F09093700180936F01E091730139
:102B0000F0917401309721F00084F185E02D099453
:102B1000089508950C9489150E94C2210E946709A6
:102B20000C948822CF93C82F8091D70182FF1EC0BA
:102B300080FF04C086EA95E00E9457078091D70184
:102B400080FF0CC01F92CF9381EA95E09F938F93F3
:102B50000E94F0070F900F900F900F908091D70177
:102B600080FF04C08FE995E00E9457078C2FCF911A
:102B70000C942C0DCF92DF92EF92FF920F931F9344
:102B8000CF93DF93CDB7DEB72B970FB6F894DEBFA8
:102B90000FBECDBF0E94840986E7C82E81E0D82EE3
:102BA00000E010E0E02E802F0E94B80AF60141916B
:102BB0006F01F82EF426B1F40F5F1F4F0E30110590
:102BC00089F78FEF89838A831B820E94CB218160E2
:102BD000782F9D838C8349815A816B818D810E94DE
:102BE0005D1640C09091D70191FF04C08B870E9471
:102BF000BE0A8B8520E030E04F2D50E0922FBA01C5
:102C0000022E02C0759567950A94E2F760FF24C012
:102C10002E83EF8221E030E0690102C0CC0CDD1C84
:102C20009A95E2F790E08C219D21892B09F420E010
:102C300028870E94CB218160782F9A8789874E81CF
:102C40005F8168858A850E945D16F801EA58FE4F0B
:102C50008081C826C08206C02F5F3F4F26303105D5
:102C600069F6AACF0E94F9250E94FE149091750181
:102C70008917A1F00E94FE14809375012B960FB660
:102C8000F894DEBF0FBECDBFDF91CF911F910F91A2
:102C9000FF90EF90DF90CF900C9492152B960FB68B
:102CA000F894DEBF0FBECDBFDF91CF911F910F9182
:102CB000FF90EF90DF90CF900895CF93DF93CDB743
:102CC000DEB72B970FB6F894DEBF0FBECDBF4F8394
:102CD000588769877A878B87DE01119686E0FD0128
:102CE00011928A95E9F785E0FE01379601900D92E1
:102CF0008A95E1F749815A816B817C818D819E8122
:102D00000E94601D2B960FB6F894DEBF0FBECDBF9C
:102D1000DF91CF910895CF93C82F882309F4C1C0C4
:102D2000823859F40E94FE1481FDBBC089E30E94E1
:102D3000FD1F0E94D72089E30CC0833879F40E94DC
:102D4000FE1480FDAEC083E50E94FD1F0E94D720C7
:102D500083E50E944D20CF910C94D720843859F4FC
:102D60000E94FE1482FD9DC087E40E94FD1F0E9408
:102D7000D72087E4EECF8CEF8C0F813A48F48C2F6C
:102D80000E948B2A81118DC08C2F0E94FD1FE3CFE2
:102D900080E28C0F883048F4C77081E001C0880F52
:102DA000CA95EAF70E94A020D6CF8BE58C0F83301E
:102DB00078F4C53A29F0C63A31F083E890E005C0CE
:102DC00081E890E002C082E890E0CF910C945D151C
:102DD00088E58C0F833108F064C0C83A39F1C93AEC
:102DE00041F1CA3A49F1CB3A51F1CC3A59F1CD3AD5
:102DF00061F1C03B69F1CE3A71F1CF3A79F1C13B53
:102E000081F1C23B89F1C33B91F1C43B99F1C53BD0
:102E1000A1F1C63BA9F1C73BB1F1C83BB9F1C93B30
:102E2000C1F1CA3BC9F180E090E038C082EE90E089
:102E300035C089EE90E032C08AEE90E02FC085EB7D
:102E400090E02CC086EB90E029C087EB90E026C094
:102E50008CEC90E023C08DEC90E020C083E891E002
:102E60001DC08AE891E01AC082E991E017C084E9A8
:102E700091E014C081E292E011C083E292E00EC0C2
:102E800084E292E00BC085E292E008C086E292E024
:102E900005C087E292E002C08AE292E0CF910C94F2
:102EA0007315CF910895882309F44BC0823859F4E3
:102EB0000E94FE1481FF45C089E30E94FD1F0E940D
:102EC000D72089E30CC0833871F40E94FE1480FF80
:102ED00038C083E50E94FD1F0E94D72083E50E9431
:102EE0004D200C94D720843859F40E94FE1482FFA0
:102EF00028C087E40E94FD1F0E94D72087E4EFCFFF
:102F00009CEF980F913A58F390E2980F983050F454
:102F1000877091E001C0990F8A95EAF7892F0E9486
:102F2000A620DFCF9BE5980F933020F480E090E05F
:102F30000C945D15885A833120F480E090E00C9465
:102F400073150895882321F00E94A0200C94D720A7
:102F50000895882321F00E94A6200C94D72008957C
:102F6000BF92CF92DF92EF92FF920F931F93CF9376
:102F7000DF9300D000D000D0CDB7DEB77C0185E074
:102F8000F701DE01119601900D928A95E1F7F701A4
:102F900083819481892B09F4DDC2908181818F3FE7
:102FA00019F49F3F09F4D6C2F701028125812295C9
:102FB0002F7099838A8389819A812E830E94BC1FF6
:102FC000182FB92E0E94BB1F0E94821EEB2DE29586
:102FD000EF704E2F50E0FA01E05AFF4F2E810C9413
:102FE000982D8B2D807F9B2D9F70F92E882319F0B3
:102FF000F29480EFF822002349F0FF2009F457C231
:103000008F2D0E94B0200E94D72051C2812F0E9494
:103010005317FF2009F49EC28F2D0E94B6202696DA
:103020000FB6F894DEBF0FBECDBFDF91CF911F91D9
:103030000F91FF90EF90DF90CF90BF900C94D7202E
:103040003B2D307F8B2D8F70303211F08295807F39
:10305000112319F0113021F12CC00023B9F02223E3
:1030600009F490C1213009F08DC126960FB6F8946D
:10307000DEBF0FBECDBFDF91CF911F910F91FF90AB
:10308000EF90DF90CF90BF900C94C020222319F0D6
:10309000213009F45FC28E830E94C3208E8186C1D5
:1030A000002321F0223008F055C26CC1211152C218
:1030B0007DC1002321F0222309F464C1F8C1222339
:1030C00009F474C109C28B2D86958695837019F019
:1030D0008130D1F03FC2002321F0812F9B2D9370CE
:1030E00002C080E090E026960FB6F894DEBF0FBED7
:1030F000CDBFDF91CF911F910F91FF90EF90DF90A7
:10310000CF90BF900C945D15002321F0812F9B2D53
:10311000937002C080E090E026960FB6F894DEBF70
:103120000FBECDBFDF91CF911F910F91FF90EF9018
:10313000DF90CF90BF900C947315812F002319F06E
:103140000E947F2402C00E94E72426960FB6F894BE
:10315000DEBF0FBECDBFDF91CF911F910F91FF90CA
:10316000EF90DF90CF90BF900C946C258B2D8370E7
:1031700009F075C00111EEC1812F82958695877087
:10318000880F880F912F9F70C92ED12CE12CF12C24
:10319000082E04C0CC0CDD1CEE1CFF1C0A94D2F7D8
:1031A00014FF12C00FE010E020E030E004C0000F78
:1031B000111F221F331F8A95D2F7C901B8016095EC
:1031C00070958095909503C060E070E0CB014B2D29
:1031D0004695469543704230C1F060F56C297D29D3
:1031E0008E299F29413051F126960FB6F894DEBF03
:1031F0000FBECDBFDF91CF911F910F91FF90EF9048
:10320000DF90CF90BF900C94A91E6C297D298E2948
:103210009F2926960FB6F894DEBF0FBECDBFDF9173
:10322000CF911F910F91FF90EF90DF90CF90BF90C3
:103230000C94C51E0E94A91EC701B60126960FB6A2
:10324000F894DEBF0FBECDBFDF91CF911F910F91DC
:10325000FF90EF90DF90CF90BF900C948D1E0023D5
:1032600019F08B2D817001C08695882309F472C1F5
:10327000812F829586958770880F880F912F9F7078
:10328000C92ED12CE12CF12C082E04C0CC0CDD1C55
:10329000EE1CFF1C0A94D2F714FF12C00FE010E0DE
:1032A00020E030E004C0000F111F221F331F8A9559
:1032B000D2F7C901B801609570958095909503C0CB
:1032C00060E070E0CB014B2D46954695437042304F
:1032D000C1F060F56C297D298E299F29413051F17B
:1032E00026960FB6F894DEBF0FBECDBFDF91CF910B
:1032F0001F910F91FF90EF90DF90CF90BF900C94B3
:10330000831F6C297D298E299F2926960FB6F89454
:10331000DEBF0FBECDBFDF91CF911F910F91FF9008
:10332000EF90DF90CF90BF900C949F1F0E94831F5F
:10333000C701B60126960FB6F894DEBF0FBECDBF0B
:10334000DF91CF911F910F91FF90EF90DF90CF9081
:10335000BF900C94671F103FD1F118F4103E50F449
:10336000A1C0123F09F463C008F44CC0133F09F434
:1033700073C098C01F708B2D8F710023A1F00E9425
:10338000001F812F26960FB6F894DEBF0FBECDBF6B
:10339000DF91CF911F910F91FF90EF90DF90CF9031
:1033A000BF900C94A2170E94211F812F26960FB662
:1033B000F894DEBF0FBECDBFDF91CF911F910F916B
:1033C000FF90EF90DF90CF90BF900C94A91700234F
:1033D000A9F02111BFC08B2D8F7126960FB6F894DE
:1033E000DEBF0FBECDBFDF91CF911F910F91FF9038
:1033F000EF90DF90CF90BF900C94461F223008F0E2
:10340000A9C0E9CF0023A9F08B2D8F7126960FB6A6
:10341000F894DEBF0FBECDBFDF91CF911F910F910A
:10342000FF90EF90DF90CF90BF900C94001F00238F
:1034300059F38B2D8F7126960FB6F894DEBF0FBE11
:10344000CDBFDF91CF911F910F91FF90EF90DF9053
:10345000CF90BF900C94211F002399F08B2D8F717A
:1034600026960FB6F894DEBF0FBECDBFDF91CF9189
:103470001F910F91FF90EF90DF90CF90BF900C9431
:10348000EB1E26960FB6F894DEBF0FBECDBFDF91C0
:10349000CF911F910F91FF90EF90DF90CF90BF9051
:1034A0000C94E11E0023A9F0222309F4ADCF812F53
:1034B00026960FB6F894DEBF0FBECDBFDF91CF9139
:1034C0001F910F91FF90EF90DF90CF90BF900C94E1
:1034D0008B16222309F4ADCF812F26960FB6F894D0
:1034E000DEBF0FBECDBFDF91CF911F910F91FF9037
:1034F000EF90DF90CF90BF900C9453174B2D4F70EF
:10350000612FC7010E94F90726960FB6F894DEBF17
:103510000FBECDBFDF91CF911F910F91FF90EF9024
:10352000DF90CF90BF900C94051E4B2D4F70612FF4
:10353000C70126960FB6F894DEBF0FBECDBFDF9150
:10354000CF911F910F91FF90EF90DF90CF90BF90A0
:103550000C94C50B26960FB6F894DEBF0FBECDBFF8
:10356000DF91CF911F910F91FF90EF90DF90CF905F
:10357000BF9008950E94BD200E9492200E94D720F3
:103580000E949E260E946C2580E090E00E945D15BE
:1035900080E090E00C9473150E94AD200C94BA1A50
:1035A0000E94BC1F292F22952F702C3030F42A3016
:1035B00048F42250223078F405C02C3041F02F30EE
:1035C00031F009C0803E48F0803F29F406C093FBEB
:1035D000882780F9089580E0089581E00895CF93C9
:1035E000DF9300D000D01F92CDB7DEB70F900F90C1
:1035F0000F900F900F90DF91CF910895CF93DF93AD
:1036000000D000D000D0CDB7DEB726960FB6F89424
:10361000DEBF0FBECDBFDF91CF9108951F93CF9333
:10362000DF93C091840116E080918501C81799F05D
:10363000D0E01C9FF0011D9FF00D1124EA57FE4FB2
:103640004081518162817381848195810E94FE1A3B
:103650002196C770E9CFDF91CF911F9108954091D6
:10366000B6015091B7016091B8017091B901809194
:10367000BA019091BB010C94FE1A8091BB01829516
:103680008F7009F054C08091B801882309F44FC0AD
:1036900080918401A09185014091B9015091BA01B6
:1036A0006091B6017091B701B6E08A1709F43FC086
:1036B00090E041155105C1F17F3F11F46F3FA1F139
:1036C000B89FF001B99FF00D1124EA57FE4F2181F8
:1036D00027132AC02081261327C02281211124C04C
:1036E000238134812417350710F421503109241B1C
:1036F000350B283C3105C0F42091BB012F702061AF
:103700002093BB0126E0289FF001299FF00D112492
:10371000E557FE4F80818F708061808386EB91E05A
:103720000E94B0170C940E1B01968770BECF0895AF
:10373000CF92DF92EF92FF920F931F93CF93DF937D
:10374000CDB7DEB762970FB6F894DEBF0FBECDBF20
:103750008C0185E0F801DE011D9601900D928A959D
:10376000E1F7D8014C9111965C91119712966C91EA
:103770008091B9019091BA01009709F475C1309117
:10378000B6017091B7017F3F19F43F3F09F46CC156
:10379000F801C380D480E090B801EE2009F4BEC0E7
:1037A0002091BB01C816D90628F0D601A81BB90B79
:1037B000CD0104C0809590958C0D9D1DFF24F39440
:1037C000883C910578F0F12C207F09F0C4C07C2D55
:1037D000D98AC88A89890E94EF1A86EB91E00E94F3
:1037E000B017AFC0822F807F09F045C0571313C0B8
:1037F000431311C061110FC02F7020612093BB01D2
:103800000E942F1B86EB91E00E94B0178091BB01B4
:10381000F80185832EC0CD2819F15F3F11F44F3F89
:10382000F9F0F62E61111CC0809184012091850170
:1038300036E0821709F45BC090E0389FF001399FB1
:10384000F00D1124EA57FE4F7181571306C07081A5
:10385000471303C07281711103C001968770E9CFCD
:10386000F62E662309F41CC18091BB018160809310
:10387000BB01F12C15C1571309C0431307C06111D7
:1038800005C08091BB01F8018583C8C04D875E8764
:103890008D859E856A8B0E94D01A6A898823D1F112
:1038A0006623C1F12091BB01822F82958F7090E039
:1038B000029774F08091B6019091B70198878F8339
:1038C0001986DB86CA862C87CE0107960E94B01720
:1038D00086E0F801A6EBB1E001900D928A95E1F740
:1038E0000E943D1B0E942F1BFF24F394D9C04D87DB
:1038F0005E878D859E850E94BC1F292F22952F7083
:10390000223008F0C1C09F7009F0BBC0805E8830D3
:1039100008F4C6C0C8010E94B017E6CFC816D90681
:1039200008F453C0F601E81BF90BCF01883C910560
:1039300008F450C0F12C7C2DD98AC88A89890E944C
:10394000EF1AE6EBF1E086E0DF011D928A95E9F7D8
:103950000E942F1BA5C0571314C0431312C061113E
:1039600010C08091BB01F8018583C8010E94B01787
:1039700086E0E6EBF1E0DF011D928A95E9F7FE2C87
:103980008FC04D875E878D859E856A8B0E94D01A79
:103990006A89882309F4BECF662309F4BBCF20913E
:1039A000BB01822F82958F7090E002970CF490CF2C
:1039B0008091B6019091B7019A8389831B82DD8241
:1039C000CC822E83CE01019681CF809590958C0D6F
:1039D0009D1DACCFF62E662309F49CCF571333C040
:1039E000431331C02091BB0120FD24C0822F82955A
:1039F0008F70482F50E041155105E1F0D801159620
:103A00002C9315974F30510549F08F5F982F929561
:103A1000907F822F8F70892B15968C93C8010E94FE
:103A2000B01786E0F801A6EBB1E001900D928A95FF
:103A3000E1F78ECF86E0F801A6EBB1E001900D92A0
:103A40008A95E1F72DC04D875E878D859E850E9402
:103A5000D01A81113DCF8091BB0181608093BB0161
:103A6000C8010E94B0171CC0662309F453CF4D87CC
:103A70005E878D859E850E94D01A882309F44ACFDF
:103A800027CF811143CF0CC0243008F043CF9F7063
:103A900009F43CCFD80115969C91907F09F036CF60
:103AA0008F2D62960FB6F894DEBF0FBECDBFDF91AB
:103AB000CF911F910F91FF90EF90DF90CF900895DD
:103AC0001F93CF93DF93CDB7DEB72C970FB6F89443
:103AD000DEBF0FBECDBF4F83588769877A878B873C
:103AE0009C87CE0107960E94981B882371F08A85D7
:103AF0009B85892B09F441C088858F3F09F065C0FB
:103B00008F818F3F09F061C038C086E0FE01379693
:103B1000DE01119601900D928A95E1F76A857B8509
:103B20006115710551F1FF81E885EF3F11F4FF3F09
:103B300021F12091850130E0C90101968770992714
:103B40004091840150E08417950709F447C0F98338
:103B5000EA837D836C8396E0929FD001939FB00DA2
:103B60001124AA57BE4FFE01319601900D929A95ED
:103B7000E1F7809385010E940E1B16E0809184017D
:103B8000909185018917B9F1189FC00111248A57B6
:103B90009E4F0E94981B882371F1E09184011E9F23
:103BA000F0011124EA57FE4F4081518162817381F7
:103BB000848195810E94FE1A8091840190E0019693
:103BC0008770992780938401D9CF4F815885698563
:103BD0007A858B859C850E94FE1ACFCF0E94CC1AD5
:103BE0001092850110928401E6EBF1E086E0DF019E
:103BF0001D928A95E9F72C960FB6F894DEBF0FBE9A
:103C0000CDBFDF91CF911F910895EF92FF920F9357
:103C10001F93CF93DF938C01892B09F46CC0F12C97
:103C2000EE24E394E8012196F8018491843740F46E
:103C3000843008F051C0813081F0823019F15BC0CE
:103C4000853709F444C0A8F19CE7980F903708F035
:103C500052C08F770E94531741C00E5F1F4FFE0165
:103C6000849190E2980F983050F48770FE2D01C037
:103C7000FF0F8A95EAF78F2F0E94B02014C00E9490
:103C80008B162DC00E5F1F4FFE01849190E2980F9E
:103C9000983060F48770FE2D01C0FF0F8A95EAF717
:103CA0008F2F0E94B6200E94D72019C00E94531760
:103CB00016C00E5F1F4FFE01C491CC2381F08FE927
:103CC0009FE00197F1F700C00000C150F6CF0E5FF2
:103CD0001F4FFE01F49003C00E948B168E018F2DA2
:103CE000882309F49FCFEFE9FFE03197F1F700C097
:103CF00000008150F5CFDF91CF911F910F91FF9080
:103D0000EF90089508956093C0017093C10180936E
:103D1000C2019093C3010C94BA1A0F931F930091A0
:103D2000C0011091C1012091C2013091C301DC0199
:103D3000CB01802B912BA22BB32B8093C0019093AE
:103D4000C101A093C201B093C3011F910F910C94C4
:103D5000BA1A0F931F930091C0011091C1012091D5
:103D6000C2013091C301DC01CB0180239123A22346
:103D7000B3238093C0019093C101A093C201B0937B
:103D8000C3011F910F910C94BA1A0F931F930091C6
:103D9000C0011091C1012091C2013091C301DC0129
:103DA000CB0180279127A227B3278093C00190934E
:103DB000C101A093C201B093C3011F910F910C9454
:103DC000BA1A1092BC011092BD011092BE0110925D
:103DD000BF010C94BA1A41E050E060E070E004C00A
:103DE000440F551F661F771F8A95D2F74093BC0179
:103DF0005093BD016093BE017093BF010C94BA1A39
:103E000041E050E060E070E004C0440F551F661FC1
:103E1000771F8A95D2F78091BC019091BD01A09146
:103E2000BE01B091BF01482B592B6A2B7B2B4093CD
:103E3000BC015093BD016093BE017093BF010C940F
:103E4000BA1A41E050E060E070E004C0440F551F32
:103E5000661F771F8A95D2F74095509560957095AB
:103E60008091BC019091BD01A091BE01B091BF01B4
:103E7000482359236A237B234093BC015093BD01FF
:103E80006093BE017093BF010C94BA1A41E050E0F8
:103E900060E070E004C0440F551F661F771F8A95CD
:103EA000D2F78091BC019091BD01A091BE01B0916B
:103EB000BF01482759276A277B274093BC015093AD
:103EC000BD016093BE017093BF010C94BA1A0F93A9
:103ED0001F930091BC011091BD012091BE01309152
:103EE000BF01DC01CB01802B912BA22BB32B809344
:103EF000BC019093BD01A093BE01B093BF011F917F
:103F00000F910C94BA1A0F931F930091BC0110915A
:103F1000BD012091BE013091BF01DC01CB018023A6
:103F20009123A223B3238093BC019093BD01A0935E
:103F3000BE01B093BF011F910F910C94BA1A0F9359
:103F40001F930091BC011091BD012091BE013091E1
:103F5000BF01DC01CB0180279127A227B3278093E3
:103F6000BC019093BD01A093BE01B093BF011F910E
:103F70000F910C94BA1A0895CF92DF92EF92FF92AC
:103F80000F931F93CF93DF938C01C090BC01D0900F
:103F9000BD01E090BE01F090BF018091C001909101
:103FA000C101A091C201B091C301C82AD92AEA2A4D
:103FB000FB2ACFE1D0E0D701C6010C2E04C0B69594
:103FC000A795979587950A94D2F780FF07C0B80107
:103FD0008C2F0E94E90B8130910531F4219758F71D
:103FE000B80180E00E94E90BDF91CF911F910F9102
:103FF000FF90EF90DF90CF90089590910C0199235E
:1040000079F190910D01992359F1982F96959695F4
:1040100096959F30A0F4E0910E01F0910F01E90F09
:10402000F11D877021E030E0A90102C0440F551F47
:104030008A95E2F7CA019181892B81830895909135
:10404000D70190FF29C01F928F9387ED95E09F9332
:104050008F930E94F0070F900F900F900F9008958C
:1040600020910E0130910F01F90132969FEF40E04F
:104070005191851789F09F3F19F4511101C0942F78
:104080004F5F4E30A9F79F3F39F0F901E90FF11D5D
:1040900097FDFA9582830895089590910C019923D4
:1040A00081F190910D01992361F1982F9695969544
:1040B00096959F30A8F4E0910E01F0910F01E90F61
:1040C000F11D877021E030E0A90102C0440F551FA7
:1040D0008A95E2F7CA0180959181892381830895A9
:1040E0009091D70190FF1DC01F928F9389EB95E0AF
:1040F0009F938F930E94F0070F900F900F900F9057
:10410000089520910E0130910F01F9013296205F40
:104110003F4F9081891301C010823196E217F30757
:10412000C1F7089581E090E0E0910E01F0910F0158
:10413000E80FF91F1082019680319105A9F70895C3
:104140009091D601892B8093D60108958095909106
:10415000D60189238093D60108951092D60108953F
:104160009091D501892B8093D501089580959091E8
:10417000D50189238093D50108951092D501089522
:104180008093C40108951092C401089580910E0196
:1041900090910F01FC0131969C01205F3F4F80E020
:1041A000919191118F5FE217F307D1F70895E09194
:1041B0000E01F0910F018091D6018083E0910E01F4
:1041C000F0910F0190818091D501892B808380919E
:1041D000C401882361F0E0910E01F0910F019081FC
:1041E000892B80830E94C62081111092C401809186
:1041F0000E0190910F010C940A1590933B0180934E
:104200003A010895CF92DF92EF92FF926C01EE2473
:10421000FF24C114D104E104F10421F0C701B60167
:1042200020E101C020E0C72ED82EE92EFF24C114C2
:10423000D104E104F10419F0285FC701B6016B0154
:104240007C0154E0F694E794D794C7945A95D1F73B
:10425000C114D104E104F10419F02C5FC701B601C7
:104260006B017C0142E0F694E794D794C7944A9599
:10427000D1F7C114D104E104F10419F02E5FC70194
:10428000B601DC01CB01B695A79597958795892B4B
:104290008A2B8B2B09F02F5F822FFF90EF90DF90FE
:1042A000CF9008958295982F937344E0949F900146
:1042B00011248C7C86958695282B822F8575880FF6
:1042C0002A7A2695822B08951F93CF93DF931F920E
:1042D000CDB7DEB799830E945221182F9981892F7B
:1042E0000E945221212F30E0322F2227A901482B92
:1042F000CA010F90DF91CF911F9108958091EF0136
:10430000843011F120E488E190E00FB6F894A8958C
:10431000809360000FBE2093600083B7817F84602C
:1043200083BF83B7816083BF7894889583B78E7F7E
:1043300083BF0FB6F894A895809160008861809340
:104340006000109260000FBE089508950C94A5219E
:10435000CF930E94A6210E9484090E94A521C0E05B
:104360008C2F0E94B80A811104C0CF5FCE30C1F7F4
:1043700001C081E0CF9108950E94CC1A0E94FE14E2
:104380000C942C0D82E084BD93E095BD9AEF97BD0F
:1043900080936E0008952FB7F8948091D801909182
:1043A000D901A091DA01B091DB012FBF0895CF921E
:1043B000DF92EF92FF920F931F932FB7F8944091E3
:1043C000D8015091D9016091DA017091DB012FBFC2
:1043D0006A017B01EE24FF248C0120E030E0C0164E
:1043E000D106E206F30610F4415051099A01281B48
:1043F000390BC9011F910F91FF90EF90DF90CF9083
:1044000008951F920F920FB60F9211248F939F93CE
:10441000AF93BF938091D8019091D901A091DA0117
:10442000B091DB010196A11DB11D8093D80190933D
:10443000D901A093DA01B093DB01BF91AF919F91B5
:104440008F910F900FBE0F901F9018950E94F7113B
:10445000F8942FEF87EA91E6215080409040E1F7F1
:1044600000C0000087E090EBDC018093F80190939E
:10447000F901A093FA01B093FB019CE088E10FB62B
:10448000F894A895809360000FBE90936000FFCFD2
:10449000EF92FF920F931F93CF93DF93D82FC0E03B
:1044A0008C2F0E94B80A00E010E0E82EF12CC70122
:1044B000002E02C0959587950A94E2F780FD06C00C
:1044C0000F5F1F4F0630110591F709C0602F7C2F39
:1044D00080E00E94C60B8D13F3CF81E004C0CF5F54
:1044E000CE30F1F680E0DF91CF911F910F91FF90D8
:1044F000EF900895CF93C82F8CE20E944822882322
:1045000021F08C2FCF910C94482280E0CF91089518
:10451000CF930E94D723811102C00E94BD238CEF4C
:1045200095E00E945707C5E6C15049F00E948409F2
:104530008FE39CE90197F1F700C00000F5CF85EF0C
:1045400095E00E94570789E20E947A22811113C1E7
:104550008AE20E947A2281110E94BD2385E00E9496
:104560007A2281110E9426220E94E2238093D701A1
:1045700087E00E947A228823A9F18BE10E947A22A7
:10458000882351F08091D70181FB222720F991E007
:10459000922790FB81F90EC08EE00E947A22882338
:1045A00061F08091D70182FB222720F991E09227C8
:1045B00090FB82F98093D70115C080E10E947A2296
:1045C0009091D701882341F093FB222720F981E0C5
:1045D000822780FB93F904C0892F809580FB90F996
:1045E0009093D7018091D7010E94E6230E94F42383
:1045F0008093E90180EE0E947A22882341F0809125
:10460000E901982F909590FB80F98093E90189E367
:104610000E947A22882359F08091E90181FB2227A8
:1046200020F991E0922790FB81F98093E90182EED5
:104630000E947A22882359F08091E90182FB222787
:1046400020F991E0922790FB82F98093E90186EEB0
:104650000E947A22882359F08091E90183FB222766
:1046600020F991E0922790FB83F98093E90183EE92
:104670000E947A22882359F08091E90184FB222745
:1046800020F991E0922790FB84F98093E90185E37A
:104690000E947A22882359F08091E90185FB222724
:1046A00020F991E0922790FB85F98093E90181E35D
:1046B0000E947A22882359F08091E90186FB222703
:1046C00020F991E0922790FB86F98093E90181E13E
:1046D0000E947A22882359F08091E90187FB2227E2
:1046E00020F991E0922790FB87F98093E90180916E
:1046F000E9010E94F8238091E90187FB882780F96E
:1047000080930D0187E20E947A22C82F8EE10E94D9
:104710007A228111C2608FE10E947A228111C460E5
:1047200080E20E947A228111C86081E20E947A228E
:104730008111C06182E20E947A228111C06283E20B
:104740000E947A228111C06484E20E947A22882326
:1047500011F0C06802C0CC2329F08C2F0E94EF23F7
:104760006C2F03C00E94EB23682F70E080E090E084
:10477000CF910C94831ECF9108956DEE7EEF80E073
:1047800090E00E94CE2D60E082E090E00E94C02D7B
:1047900060E083E090E00E94C02D60E084E090E063
:1047A0000E94C02D60E085E090E00C94C02D80E078
:1047B00090E00E94BA2D21E08D3E9E4F09F020E04E
:1047C000822F089582E090E00C94B22D682F82E051
:1047D00090E00C94C02D83E090E00C94B22D682FF3
:1047E00083E090E00C94C02D84E090E00C94B22D16
:1047F000682F84E090E00C94C02D8091DE0180FF52
:104800000BC06091130185E0689FB001112475957C
:104810006795759567952BC081FF09C0609113015D
:1048200085E0689FB00111247595679520C082FFCF
:1048300007C06091130185E0689FB001112417C083
:104840009091DF019923D1F060911201961788F7BA
:104850002091130185E0289F90011124929FA001CF
:10486000939F500D112470E0CA010E94842D60387E
:10487000710540F46115710519F406C065E070E03A
:10488000862F08958FE7089581E008958091DE01D5
:1048900080FF08C06091110170E07595679575956E
:1048A000679521C081FF06C06091110170E0759588
:1048B000679519C082FF04C06091110170E010C0BB
:1048C0009091DF01992399F0609110019617A0F75C
:1048D00080911101899FC001112470E00E94842DF4
:1048E0006038710540F46115710519F406C061E086
:1048F00070E0862F08958FE7089581E00895803F46
:1049000021F40E94FD23819504C0813F29F40E9477
:10491000FD238093E2010895823F21F40E94FD234C
:10492000819504C0833F29F40E94FD238093E10117
:104930000895893F19F40E94462405C08A3F31F446
:104940000E94462481958093E30108958B3F21F4D2
:104950000E944624819504C08C3F29F40E9446247D
:104960008093E4010895843F21F48091E001816007
:1049700017C0853F21F48091E001826011C0863F1D
:1049800021F48091E00184600BC0873F21F4809185
:10499000E001886005C0883F31F48091E0018061CA
:1049A0008093E00108958D3F21F48091DE018160C4
:1049B0000BC08E3F21F48091DE01826005C08F3FE5
:1049C00029F48091DE0184608093DE010895803FA8
:1049D00039F48091E20187FF6CC01092E20169C056
:1049E000813F29F48091E2011816BCF362C09091D6
:1049F000E101823F29F497FF5CC01092E10159C0A8
:104A0000833F19F41916CCF354C0893F41F48091C7
:104A1000E30118160CF04DC01092E3014AC08A3F22
:104A200029F48091E30187FF44C0F6CF8B3F39F42E
:104A30008091E40187FF3DC01092E4013AC08C3FB1
:104A400029F48091E4011816BCF333C0843F21F4AB
:104A50008091E0018E7F17C0853F21F48091E001B5
:104A60008D7F11C0863F21F48091E0018B7F0BC0C8
:104A7000873F21F48091E001877F05C0883F31F4B2
:104A80008091E0018F7E8093E00113C08D3F21F47F
:104A90008091DE018E7F0BC08E3F21F48091DE017C
:104AA0008D7F05C08F3F29F48091DE018B7F80933D
:104AB000DE018091E10181110EC08091E20181113E
:104AC0000AC08091E301811106C08091E401811147
:104AD00002C01092DF0108958091D70183FF7EC04C
:104AE00088E396E00E9457078091E0011F928F9320
:104AF00083E396E09F938F930E94F00781E396E013
:104B00000E9457078091E101282F082E000C330BDB
:104B10003F938F938EE296E09F938F930E94F007CE
:104B20008CE296E00E9457078091E201282F082E20
:104B3000000C330B3F938F9389E296E09F938F9302
:104B40000E94F00787E296E00E9457078091E301F8
:104B5000282F082E000C330B3F938F9384E296E0AE
:104B60009F938F930E94F00782E296E00E9457077E
:104B70008091E401282F082E000C330B3F938F9374
:104B80008FE196E09F938F930E94F0078CE196E06F
:104B90000E9457078091DF011F928F9389E196E071
:104BA0009F938F930E94F00787E196E00E9457073A
:104BB0008091DE011F928F9384E196E09F938F9303
:104BC0000E94F00781E196E00E9457078DB79EB7DB
:104BD0004C960FB6F8949EBF0FBE8DBF80EE91E04D
:104BE0000E9452150E94CB219093DD018093DC013D
:104BF00008951F93CF93DF938091DC019091DD01A5
:104C00000E94D721AC019091DF01992321F02091DE
:104C1000140130E006C0209115018AE0289F900120
:104C200011244217530708F485C08091E101C09117
:104C3000E201D091E3011091E401811107C0C1119B
:104C400075C0D11173C0111171C074C09F3F19F0AC
:104C50009F5F9093DF01181624F40E94FD23809338
:104C6000E1018091E10187FF05C00E94FD2381954C
:104C70008093E1011C1624F40E94FD238093E2013D
:104C80008091E20187FF05C00E94FD2381958093FA
:104C9000E2016091E101662331F1C091E201CC2390
:104CA00011F1062E000C770B880B990B0E947F2CBC
:104CB00023E333E343E35FE30E94E32C0E94472CAA
:104CC0006093E1016C2FCC0F770B880B990B0E943E
:104CD0007F2C23E333E343E35FE30E94E32C0E9452
:104CE000472C6093E2011D1624F40E944624809311
:104CF000E3018091E30187FF05C00E94462481956E
:104D00008093E301111624F40E9446248093E40169
:104D10008091E40187FF05C00E944624819580931D
:104D2000E401DF91CF911F910C946C259F3F09F016
:104D30008FCFA0CFDF91CF911F910895E0EEF1E0EA
:104D400085E0DF011D928A95E9F71092DF0110924C
:104D5000DE0108958BE598E00E9457071F9281E0DD
:104D60008F931F9285E08F938DE098E09F938F93B0
:104D70000E94F0070F900F900F900F900F900F90E0
:104D800008958330E9F128F4813061F0823009F12F
:104D90000895853009F462C008F449C0863009F4EA
:104DA00074C0089580911501262F30E0280F311D21
:104DB0002F3F310524F4680F6093150103C08FEF76
:104DC00080931501809115011F928F9386E497E0DF
:104DD00072C080911401262F30E0280F311D2F3F23
:104DE000310524F4680F6093140103C08FEF8093A2
:104DF0001401809114011F928F9384E397E05BC0AC
:104E000080911301262F30E0280F311D2F3F3105EF
:104E100024F4680F6093130103C08FEF8093130194
:104E2000809113011F928F9381E297E044C080919B
:104E30001201262F30E0280F311D2F3F310524F4B9
:104E4000680F6093120103C08FEF8093120180916D
:104E500012011F928F938CE097E02DC08091110179
:104E6000262F30E0280F311D2F3F310524F4680F25
:104E70006093110103C08FEF8093110180911101A4
:104E80001F928F9383EF96E016C080911001262F1A
:104E900030E0280F311D2F3F310524F4680F609357
:104EA000100103C08FEF80931001809110011F92B9
:104EB0008F9388ED96E09F938F930E94F0070F9059
:104EC0000F900F900F900895833081F128F4813076
:104ED00059F08230D1F00895853009F449C0B8F115
:104EE000863009F456C0089580911501681720F4A2
:104EF000861B8093150102C0109215018091150147
:104F00001F928F9389EC96E054C08091140168172A
:104F100020F4861B8093140102C01092140180912A
:104F200014011F928F9387EB96E043C08091130189
:104F3000681720F4861B8093130102C0109213019E
:104F4000809113011F928F9384EA96E032C0809182
:104F50001201681720F4861B8093120102C0109280
:104F60001201809112011F928F938FE896E021C069
:104F700080911101681720F4861B8093110102C0F3
:104F800010921101809111011F928F9386E796E094
:104F900010C080911001681720F4861B80931001C7
:104FA00002C010921001809110011F928F938BE527
:104FB00096E09F938F930E94F0070F900F900F90B1
:104FC0000F900895CF93C82F1F928F9380E699E09A
:104FD0009F938F930E94F00781E090E0A0E0B0E003
:104FE000BC01CD0104C0660F771F881F991FCA95A9
:104FF000D2F70E94831E0F900F900F900F90CF91C9
:105000000C94CC1ACF938D3109F465C0B0F58E3075
:1050100009F4CCC100F5873009F49BC1A8F48630AF
:1050200009F06DC28091D701817F8E7F8093D70177
:1050300085E699E00E94570784EA9DE00E945707A1
:1050400081E08093E60180C1883009F44FC08B3045
:1050500009F47CC154C2863109F4F0C138F48031BE
:1050600009F4B8C1813109F430C249C2893109F467
:10507000CEC18B3109F486C142C2853309F437C2EF
:1050800048F4873209F433C208F433C2893209F490
:105090002EC235C2833438F48A3308F02CC28833E8
:1050A00009F454C12CC2833409F421C2883409F0B4
:1050B00026C20E94CC1A83E99DE00E9457079FEF09
:1050C00023ED80E3915020408040E1F700C00000D4
:1050D0000E94262239C183EB9DE00E9457070E945F
:1050E000012C0E94FE140E942C0D2EC188EA9DE026
:1050F0000E94570786E79BE00E9457070E94EB2318
:105100001F928F9383E79BE09F938F930E94F007FA
:1051100081E79BE00E9457070E94E223C82F8EE59B
:105120009BE00E9457071F92CF9389E59BE09F93D6
:105130008F930E94F00787E59BE00E9457078DE45C
:105140009BE00E9457078C2F81701F928F938AE4F7
:105150009BE09F938F930E94F00788E49BE00E945E
:1051600057078EE39BE00E945707C1FB882780F911
:105170001F928F938BE39BE09F938F930E94F00786
:1051800089E39BE00E9457078DE29BE00E9457074E
:10519000C2FB882780F91F928F938AE29BE09F933E
:1051A0008F930E94F00788E29BE00E9457078FE1EF
:1051B0009BE00E945707C3FBCC27C0F91F92CF93F7
:1051C0008CE19BE09F938F930E94F0078AE19BE024
:1051D0000E9457070E94F423C82F86E09BE00E949C
:1051E00057071F92CF9381E09BE09F938F930E947C
:1051F000F0078FEF9AE00E94570786EE9AE00E9430
:1052000057078C2F81701F928F9383EE9AE09F93A4
:105210008F930E94F0078DB79EB780960FB6F894D3
:105220009EBF0FBE8DBF81EE9AE00E9457078AECA9
:105230009AE00E945707C1FB882780F91F928F933D
:1052400087EC9AE09F938F930E94F00785EC9AE099
:105250000E94570783EB9AE00E945707C2FB8827FA
:1052600080F91F928F9380EB9AE09F938F930E9417
:10527000F0078EEA9AE00E9457078CE99AE00E94B4
:105280005707C3FB882780F91F928F9389E99AE01B
:105290009F938F930E94F00787E99AE00E94570737
:1052A0008DE89AE00E945707C4FB882780F91F9277
:1052B0008F938AE89AE09F938F930E94F00788E883
:1052C0009AE00E94570786E79AE00E945707C5FBBD
:1052D000882780F91F928F9383E79AE09F938F939B
:1052E0000E94F00781E79AE00E94570785E59AE05F
:1052F0000E945707C6FB882780F91F928F9382E58B
:105300009AE09F938F930E94F00780E59AE00E94B5
:10531000570788E49AE00E945707C7FBCC27C0F9DB
:105320001F92CF9385E49AE09F938F930E94F0079A
:1053300083E49AE00E9457078DB79EB74C960FB64C
:10534000F8949EBF0FBE8DBFC1E0DEC08CE899E02F
:105350005BC08091D701C82FC17080FF09C086E86B
:105360009DE00E9457078091D701817F8E7F47C0C3
:105370008AE79DE00E9457078091D7018160809362
:10538000D701E2CF9091D70191FBCC27C0F981E002
:10539000C827892FC0FB81F98093D701CC2319F04E
:1053A0008DE69DE027C08FE59DE02EC09091D7014E
:1053B00092FBCC27C0F981E0C827892FC0FB82F976
:1053C0008093D701CC2319F080E59DE013C080E4E1
:1053D0009DE01AC09091D70193FBCC27C0F981E0E2
:1053E000C827892FC0FB83F98093D701CC2351F0C4
:1053F00084E39DE00E9457078091D70181608093EC
:10540000D70182C087E29DE00E9457079DCF88E1C7
:105410009DE00E9457078CEE9CE00E9457078FEAA0
:105420009CE00E94570788E89CE00E94570784E4AC
:105430009CE00E94570786E19CE0E6CF88E09CE074
:105440000E9457070E94FE141F928F938EEE9BE0DE
:105450009F938F930E94F00780910C011F928F936E
:1054600087ED9BE09F938F930E94F00780916E01E0
:105470001F928F9384EC9BE09F938F930E94F00781
:1054800080910D011F928F9381EB9BE09F938F93EF
:105490000E94F0078091D8019091D901A091DA0182
:1054A000B091DB01BF93AF939F938F938DE99BE006
:1054B0009F938F930E94F0078DB79EB746960FB6C5
:1054C000F8949EBF0FBE8DBF3FCF0E94CC1AC091F3
:1054D0000D0181E0C827C0930D01CC2329F083E999
:1054E0009BE00E94570710C088E89BE08DCF80E0CA
:1054F00003C08D5101C089530E94E22725CF86E861
:105500009BE00E945707C0E08C2FCF91089580E068
:1055100008950C94872ACF93C82F8091E60181309B
:1055200081F020F0823009F44FC045C1E0910E01B6
:10553000F0910F018081813169F0823209F03DC123
:1055400009C0E0910E01F0910F018081813111F0CD
:10555000823261F48C2F0E94892A811104C08C2F21
:105560000E9402282FC081E090E02CC08C2F0E9466
:10557000872A811126C0C431E1F070F4CB3081F06C
:10558000C031D1F40E94AA2688E599E00E9457070D
:1055900082E08093E60115C0C93259F0C83361F446
:1055A00085E699E00E9457078CE599E00E9457072D
:1055B00008C01092E60103C186E599E00E945707F2
:1055C000FEC081E08170FDC0C43220F5CE3108F00C
:1055D000C0C0CB3099F1C8F4C73009F0D2C08AE01E
:1055E0008093150194E19093140193E0909313013B
:1055F0008093120188E08093110188E2809310016A
:105600008CEF97E00E945707BFC0C33149F1C43106
:10561000C1F0B7C0CB3409F4A9C028F4C93289F06D
:10562000C83361F0AEC0C13509F49EC0C23509F47B
:1056300099C0CE3409F0A5C06AE09EC00E94AA2697
:10564000A3C08091E501882319F01092E5019CC068
:1056500089E098E00E94570781E08093E601B1C09D
:1056600083EE97E00E94570781ED97E00E9457076D
:10567000809115011F928F938EEC97E09F938F93EB
:105680000E94F0078CEC97E00E9457078AEB97E0A6
:105690000E945707809114011F928F9387EB97E028
:1056A0009F938F930E94F00785EB97E00E94570726
:1056B00086EA97E00E945707809113011F928F930B
:1056C00083EA97E09F938F930E94F00781EA97E027
:1056D0000E94570780E997E00E94570780911201C6
:1056E0001F928F938DE897E09F938F930E94F0070E
:1056F0008BE897E00E94570786E797E00E945707DC
:10570000809111011F928F9383E797E09F938F936E
:105710000E94F00781E797E00E9457078AE597E02B
:105720000E945707809110011F928F9387E597E0A1
:105730009F938F930E94F00785E597E00E9457079B
:105740008DB79EB748960FB6F8949EBF0FBE8DBF1B
:105750001BC0CE51EC2FF0E0E15DFE4F80818093C5
:10576000E50112C061E003C061E006C06AE080911B
:10577000E5010E94C12608C08091E5010E946427CE
:1057800003C08AEF97E013C08091E501882369F098
:105790001F928F9384EF97E09F938F930E94F0075F
:1057A0000F900F900F900F9004C081EF97E00E9430
:1057B000570781E006C01092E60180E002C080E059
:1057C00001CFCF910895E1E8F0E080818860808387
:1057D0008081816080838FB7F89493E090938900F3
:1057E00090ED909388008FBF0895EFE6F0E0808100
:1057F000826080830895EFE6F0E080818D7F808372
:105800000895EFE6F0E0908182E089278083089593
:105810001F920F920FB60F9211242F933F934F9325
:105820005F936F937F938F939F93AF93BF93EF9308
:10583000FF938091E7019091E80101969093E80130
:105840008093E701811103C082E00E942C0DE0915A
:10585000E801E695E695F0E0ED53F24FE491809192
:10586000E7018E1303C080E00E942C0DFF91EF91A1
:10587000BF91AF919F918F917F916F915F914F9168
:105880003F912F910F900FBE0F901F9018950E947F
:105890004E2C6894B1110C94DD2C08950E94C22CFA
:1058A00088F09F5798F0B92F9927B751B0F0E1F0E1
:1058B000660F771F881F991F1AF0BA95C9F714C091
:1058C000B13091F00E94DC2CB1E008950C94DC2CF6
:1058D000672F782F8827B85F39F0B93FCCF38695CA
:1058E00077956795B395D9F73EF490958095709527
:1058F00061957F4F8F4F9F4F0895E89409C097FBA4
:105900003EF490958095709561957F4F8F4F9F4F96
:105910009923A9F0F92F96E9BB279395F6958795DA
:1059200077956795B795F111F8CFFAF4BB0F11F49D
:1059300060FF1BC06F5F7F4F8F4F9F4F16C0882344
:1059400011F096E911C0772321F09EE8872F762F7A
:1059500005C0662371F096E8862F70E060E02AF0BB
:105960009A95660F771F881FDAF7880F96958795A7
:1059700097F9089557FD9058440F551F59F05F3F10
:1059800071F04795880F97FB991F61F09F3F79F061
:1059900087950895121613061406551FF2CF4695E3
:1059A000F1DF08C0161617061806991FF1CF869565
:1059B0007105610508940895E894BB276627772749
:1059C000CB0197F908950E94F62C0C94672D0E9444
:1059D000592D38F00E94602D20F0952311F00C9481
:1059E000502D0C94562D11240C94DD2C0E94BA2CB1
:1059F00070F3959FC1F3950F50E0551F629FF00122
:105A0000729FBB27F00DB11D639FAA27F00DB11D3A
:105A1000AA1F649F6627B00DA11D661F829F2227C3
:105A2000B00DA11D621F739FB00DA11D621F839F4A
:105A3000A00D611D221F749F3327A00D611D231F20
:105A4000849F600D211D822F762F6A2F11249F576E
:105A500050409AF0F1F088234AF0EE0FFF1FBB1F71
:105A6000661F771F881F91505040A9F79E3F510530
:105A700080F00C94502D0C94DD2C5F3FE4F3983EA5
:105A8000D4F3869577956795B795F795E7959F5FDA
:105A9000C1F7FE2B880F911D9695879597F908956C
:105AA00097F99F6780E870E060E008959FEF80ECD1
:105AB000089500240A941616170618060906089574
:105AC00000240A9412161306140605060895092EDA
:105AD0000394000C11F4882352F0BB0F40F4BF2B49
:105AE00011F460FF04C06F5F7F4F8F4F9F4F089589
:105AF000991B79E004C0991F961708F0961B881F20
:105B00007A95C9F78095089597FB072E16F40094AF
:105B100007D077FD09D00E949E2D07FC05D03EF4EA
:105B2000909581959F4F0895709561957F4F089549
:105B3000EE0FFF1F0590F491E02D0994AA1BBB1BEB
:105B400051E107C0AA1FBB1FA617B70710F0A61B7D
:105B5000B70B881F991F5A95A9F780959095BC019E
:105B6000CD010895F999FECF92BD81BDF89A99278C
:105B700080B50895A8E1B0E042E050E00C94D52D46
:105B8000262FF999FECF1FBA92BD81BD20BD0FB659
:105B9000F894FA9AF99A0FBE019608950E94C02DC2
:105BA000272F0C94C12DDC01CB01FC01F999FECF0C
:105BB00006C0F2BDE1BDF89A319600B40D92415095
:0A5BC0005040B8F70895F894FFCFA5
:105BCA0020022D0D200EFB0DC70D930D0101C501FD
:105BDA0028080A03140A3F4D3620394605F904C33A
:105BEA0004A3046A04DD03F6030F0428044804012D
:0A5BFA000203040506070809000075
:00000001FF

@ -0,0 +1,187 @@
#include "ergodox_ez.h"
#include "debug.h"
#include "action_layer.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols
#define MDIA 2 // media keys
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | Esc | 1 ! | 2 @ | 3 # | 4 $ | 5 % | Lang | | Esc | 6 ^ | 7 & | 8 * | 9 ( | 0 ) | Bckspc |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | L2 | | L2 | Y | U | I | O | P | \ | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | Ctrl | A | S | D | F | G |------| |------| H | J | K | L | ; : | ' " |
* |--------+------+------+------+------+------| L1 | | L1 |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , < | . > | / ? | - _ |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | L1 | ` ~ | ' " | \ | | L2 | | { | } | [ { | ] } | L1 |
* `----------------------------------' `----------------------------------'
* ,--------------. ,---------------.
* | Home | End | | PgUp |Insert |
* ,------|-------|------| |-------+-------+------.
* | | | LGui | | Del | | |
* | Space| Alt |------| |-------| Enter |Space |
* | | | LGui | | Bcsp | | |
* `---------------------' `----------------------'
*/
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = KEYMAP( // layer 0 : default
// left hand
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LGUI(KC_SPC),
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MO(2),
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(1),
MO(1), KC_GRV, KC_QUOT, KC_BSLS, MO(2),
KC_HOME, KC_END,
KC_LGUI,
KC_SPC, KC_LALT, KC_LGUI,
// right hand
KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
MO(2), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
MO(1), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS,
KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, MO(1),
KC_PGUP, KC_INS,
KC_DEL,
KC_BSPC, KC_ENT, KC_SPC
),
/* Keymap 1: Symbol Layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | = | . | 0 | - | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// SYMBOLS
[SYMB] = KEYMAP(
// left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS,
KC_TRNS,
KC_TRNS,KC_TRNS,KC_TRNS,
// right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
KC_EQL,KC_DOT, KC_0, KC_MINS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap 2: Media and mouse keys
*
* ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | | | | | | | | | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | |GuiUp | Expl | | Term | | | | | | | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | |GuiLft|GuiDwn|GuiRgt| | |------| |------| Left | Down | Up |Right | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | | | |Browsr| | | | |VolDwn|VolUp | Mute | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | | Play | Prev | Next | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | |Brwser|Brwser|
* | Lclk | Rclk |------| |------|Fwd |Back |
* | | | | | | | |
* `--------------------' `--------------------'
*/
// MEDIA AND MOUSE
KEYMAP(
RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, LGUI(KC_W), LGUI(KC_E), KC_BTN1, LGUI(KC_T), KC_TRNS,
KC_TRNS, LGUI(KC_A), LGUI(KC_S), LGUI(KC_D), KC_MS_D, KC_MS_R,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_BTN1, KC_BTN2, KC_TRNS,
// right hand
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS,
KC_MPLY, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_WBAK, KC_WFWD
),
};
const uint16_t PROGMEM fn_actions[] = {
[1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void * matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void * matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
ergodox_board_led_off();
ergodox_right_led_1_off();
ergodox_right_led_2_off();
ergodox_right_led_3_off();
switch (layer) {
// TODO: Make this relevant to the ErgoDox EZ.
case 1:
ergodox_right_led_1_on();
break;
case 2:
ergodox_right_led_2_on();
break;
default:
// none
break;
}
};

@ -7,7 +7,7 @@
#define MDIA 2 // media keys #define MDIA 2 // media keys
/* /*
* Ordinary Ergodox EZ keyboard layout, v1 * Ordinary Ergodox EZ keyboard layout, v2
* modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com * modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
* Details: http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html * Details: http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html
*/ */
@ -16,13 +16,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer /* Keymap 0: Basic layer
* *
* ,--------------------------------------------------. ,--------------------------------------------------. * ,--------------------------------------------------. ,--------------------------------------------------.
* | Grv | 1 | 2 | 3 | 4 | 5 | ESC | | = | 6 | 7 | 8 | 9 | 0 | - | * | Grv | 1 | 2 | 3 | 4 | 5 | ESC | | - | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | \ | | / | Y | U | I | O | P | ~L2 | * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | MDIA \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | ~L1 | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ~L1 | * | SYMB | A | S | D | F | G |------| |------| H | J | K | L | ; | SYMB ' |
* |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------| * |--------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+--------|
* | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |'/Ctrl| RShift | * | LShift | Z | X | C | V | B | -Tab | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* |LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh |RCtrl | * |LCtrl | Meh |Hyper | LAlt | LGui | | RGui | RAlt | Hyper| Meh |RCtrl |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
@ -37,20 +37,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// If it accepts an argument (i.e, is a function), it doesn't need KC_. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_* // Otherwise, it needs KC_*
[BASE] = KEYMAP( // layer 0 : default [BASE] = KEYMAP( // layer 0 : default
// left hand // left hand
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSLS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
KC_FN1, KC_A, KC_S, KC_D, KC_F, KC_G, MO(SYMB), KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT,CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LBRC, KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, LSFT(KC_TAB),
KC_LCTL,MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI, KC_LCTL, MEH_T(KC_NO),ALL_T(KC_NO),KC_LALT,KC_LGUI,
KC_HOME, KC_END, KC_HOME, KC_END,
KC_PGUP, KC_PGUP,
KC_BSPC, KC_DEL, KC_PGDN, KC_BSPC, KC_DEL, KC_PGDN,
// right hand // right hand
KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_MINS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
KC_SLSH, KC_Y, KC_U, KC_I, KC_O, KC_P, LT(MDIA, KC_SLSH), KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, LT(MDIA, KC_BSLS),
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_FN1, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(SYMB, KC_QUOT),
KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_QUOT),KC_RSFT, KC_TAB, KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH),KC_RSFT,
KC_RGUI, KC_RALT, ALL_T(KC_NO),MEH_T(KC_NO), KC_RCTL, KC_RGUI, KC_RALT, ALL_T(KC_NO),MEH_T(KC_NO), KC_RCTL,
KC_LEFT, KC_RGHT, KC_LEFT, KC_RGHT,
KC_UP, KC_UP,
@ -59,82 +60,82 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 1: Symbol Layer /* Keymap 1: Symbol Layer
* *
* ,--------------------------------------------------. ,--------------------------------------------------. * ,--------------------------------------------------. ,--------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | * | Esc | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | * | MDIA | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | F12 |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | CAPS | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | CAPS | * | | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | |
* |--------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+--------|
* | | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | CAPS |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | . | 0 | = | | * | | | | | | | 0 | . | = | + | |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | | | | | | * | Left | Right| | Home | End |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* | | | | | | | | * | | | Up | | PgUp | | |
* | | |------| |------| | | * |Space |Enter |------| |------|BackSp| Del |
* | | | | | | | | * | | | Down | | PgDn | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
// SYMBOLS // SYMBOLS
[SYMB] = KEYMAP( [SYMB] = KEYMAP(
// left hand // left hand
KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, MO(MDIA), KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_AMPR,LSFT(KC_COMM),
KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, KC_TRNS, KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
KC_CAPS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, KC_TRNS, KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TAB,
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
KC_TRNS,KC_TRNS, KC_LEFT,KC_RGHT,
KC_TRNS, KC_UP,
KC_TRNS,KC_TRNS,KC_TRNS, KC_SPC,KC_ENT,KC_DOWN,
// right hand // right hand
KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, LSFT(KC_DOT), KC_PIPE, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_F12,
KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, KC_SLSH, KC_P4, KC_P5, KC_P6, KC_PAST, KC_TRNS,
KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_CAPS, LSFT(KC_TAB), KC_BSLS, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_CAPS,
KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, KC_P0, KC_DOT, KC_PEQL, KC_PPLS, KC_PENT,
KC_TRNS, KC_TRNS, KC_HOME, KC_END,
KC_TRNS, KC_PGUP,
KC_TRNS, KC_TRNS, KC_TRNS KC_PGDN, KC_BSPC, KC_DEL
), ),
/* Keymap 2: Media and mouse keys /* Keymap 2: Media and mouse keys
* *
* ,--------------------------------------------------. ,--------------------------------------------------. * ,--------------------------------------------------. ,--------------------------------------------------.
* | | | | | | | Sleep| | | | | |MyComp| Mail | | * | Esc |ShutDn| Sleep| Mute |Vol Dn|Vol Up| | | | |PrtSc | PgUp |MyComp| Mail | |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | | | | MsUp |ScrlUp| |ScrlUp| |ScrlUp| | | | | Mute | | * | | | | MsUp |ScrlUp| |ScrlUp| |ScrlUp| |ScrlUp| Up | | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | | * | | |MsLeft|MsDown|MsRght| |------| |------| Home | Left | Down | Right| End | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
* | | | |MsDown|ScrlDn| |ScrlDn| |ScrlDn| | | | | | | * | | | |MsDown|ScrlDn| |ScrlDn| |ScrlDn| |ScrlDn| Down | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | Lclk | Rclk | | | | | | | * | | | | Lclk | Rclk | | | PgDn | | | |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | Stop |Refrsh| | Prev | Next | * | Stop |Refrsh| | Prev | Next |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* |Brwser|Brwser| Home | |VolUp | | | * |Brwser|Brwser|Search| |VolUp | | |
* |Back | Fwd |------| |------| Stop | Play | * |Back | Fwd |------| |------| Stop | Play-|
* | | |Search| |VolDn | | | * | | | Home | |VolDn | | Pause|
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
// MEDIA AND MOUSE // MEDIA AND MOUSE
[MDIA] = KEYMAP( [MDIA] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLEP, KC_ESC, KC_PWR, KC_SLEP, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_WH_U, KC_TRNS, KC_WH_U, MO(MDIA), KC_TRNS, KC_TRNS, KC_MS_U, KC_WH_U, KC_TRNS, KC_WH_U,
KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_D, KC_TRNS, KC_TRNS, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_D, KC_TRNS, KC_TRNS, KC_WH_D,
KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_WH_D,
KC_WSTP, KC_WREF, KC_WSTP, KC_WREF,
KC_WHOM, KC_WSCH,
KC_WBAK, KC_TRNS, KC_WSCH, KC_WBAK, KC_TRNS, KC_WHOM,
// right hand // right hand
KC_WSCH, KC_TRNS, KC_TRNS, KC_TRNS, KC_MYCM, KC_MAIL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_PGUP, KC_MYCM, KC_MAIL, KC_TRNS,
KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_WH_U, KC_TRNS, KC_WH_U, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT,KC_END, KC_TRNS,
KC_WH_D, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_D, KC_TRNS, KC_WH_D, KC_DOWN, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS,KC_TRNS, KC_TRNS,
KC_MPRV, KC_MNXT, KC_MPRV, KC_MNXT,
KC_VOLU, KC_VOLU,
KC_VOLD, KC_MSTP, KC_MPLY KC_VOLD, KC_MSTP, KC_MPLY
@ -188,3 +189,4 @@ void matrix_scan_user(void) {
} }
}; };

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

@ -0,0 +1,27 @@
[{x:3.5},"#\n3",{x:10.5},"*\n8"],
[{y:-0.875,x:2.5},"@\n2",{x:1},"$\n4",{x:8.5},"&\n7",{x:1},"(\n9"],
[{y:-0.875,x:5.5},"%\n5",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc"},"_\n\n\n\n\n\n-","^\n6"],
[{y:-0.875,c:"#73ab6a",w:1.5},"~\n\n\n\n\n\n`",{c:"#cccccc"},"!\n1",{x:14.5},")\n0",{t:"#000000\n\n\n\n#0000ff",w:1.5},"+\n\n\n\n\n\n="],
[{y:-0.375,x:3.5,t:"#000000"},"E",{x:10.5},"I"],
[{y:-0.875,x:2.5},"W",{x:1},"R",{x:8.5},"U",{x:1},"O"],
[{y:-0.875,x:5.5},"T",{h:1.5},"{\n\n\n\n\n\n[",{x:4.5,h:1.5},"}\n\n\n\n\n\n]","Y"],
[{y:-0.875,c:"#73ab6a",w:1.5},"Tab",{c:"#cccccc"},"Q",{x:14.5},"P",{c:"#2277ff",fa:[0,0,0,1],w:1.5},"|\n\\\nMedia\nL2"],
[{y:-0.375,x:3.5,c:"#cccccc"},"D",{x:10.5},"K"],
[{y:-0.875,x:2.5},"S",{x:1},"F",{x:8.5},"J",{x:1},"L"],
[{y:-0.875,x:5.5},"G",{x:6.5},"H"],
[{y:-0.875,c:"#2277ff",w:1.5},"Symbols\n\n\nL1",{c:"#cccccc"},"A",{x:14.5},":\n;",{c:"#2277ff",w:1.5},"\"\n'\nSymbols\nL1"],
[{y:-0.625,x:6.5,c:"#bfbf67",h:1.5},"< Tab\n\n\nShift Tab",{x:4.5,h:1.5},"Tab >\n\n\nTab"],
[{y:-0.75,x:3.5,c:"#cccccc"},"C",{x:10.5},"<\n,"],
[{y:-0.875,x:2.5},"X",{x:1},"V",{x:8.5},"M",{x:1},">\n."],
[{y:-0.875,x:5.5},"B",{x:6.5},"N"],
[{y:-0.875,c:"#2277ff",w:1.5},"Capitals\n\n\nShift",{c:"#cccccc"},"Z\n\nCtrl",{x:14.5},"?\n/\nCtrl",{c:"#2277ff",w:1.5},"\n\nCapitals\nShift"],
[{y:-0.375,x:3.5,c:"#77aaff"},"Option\n\n\nLAlt",{x:10.5},"Option\n\n\nRAlt"],
[{y:-0.875,x:2.5},"Hyper",{x:1},"Cmd\n\n\nSuper",{x:8.5},"Cmd\n\n\nSuper",{x:1},"Hyper"],
[{y:-0.75,x:0.5},"Ctrl\n\n\nLCtrl","Meh",{x:14.5},"Meh","Ctrl\n\n\nRCtrl"],
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#bfbf67"},"Home","End"],
[{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete","Page\n\n\n\n\n\nUp"],
[{x:2},"Page\n\n\n\n\n\nDown"],
[{r:-30,rx:13,y:-1,x:-3},"Left","Right"],
[{x:-3},"Up",{h:2},"Enter",{h:2},"Space"],
[{x:-3},"Down"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

@ -0,0 +1,27 @@
[{x:3.5,c:"#9988bb"},"Vol\n\n\n\n\n\nMute",{x:10.5,c:"#ccffff"},"Page\n\n\n\n\n\nUp"],
[{y:-0.875,x:2.5,c:"#9988bb"},"Sleep",{x:1},"Vol\n\n\n\n\n\nDown",{x:8.5},"Print\n\n\n\n\n\nScreen",{x:1},"Home\n\n\n\n\n\nDir"],
[{y:-0.875,x:5.5},"Vol\n\n\n\n\n\nUp",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",""],
[{y:-0.875,c:"#ff4444",a:4,w:1.5},"Esc",{c:"#9988bb"},"Shut\n\n\n\n\n\nDown",{x:14.5},"Email",{c:"#cccccc",a:7,w:1.5},""],
[{y:-0.375,x:3.5,c:"#ccffff",a:4},"Mouse\n\n\n\n\n\nUp",{x:10.5},"Cursor\n\n\n\n\n\nUp"],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#99ffff",a:4},"Scroll\n\n\n\n\n\nUp",{x:8.5},"Scroll\n\n\n\n\n\nUp",{x:1,c:"#cccccc",a:7},""],
[{y:-0.875,x:5.5},"",{c:"#99ffff",a:4,h:1.5},"Scroll\n\n\n\n\n\nUp",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nUp",{c:"#cccccc",a:7},""],
[{y:-0.875,c:"#000000",t:"#ff0000",a:4,fa:[0,0,0,1],w:1.5},"Media\n\n\nL2",{c:"#cccccc",t:"#000000",a:7},"",{x:14.5},"",{c:"#000000",t:"#ff0000",a:4,w:1.5},"\n\nMedia\nL2"],
[{y:-0.375,x:3.5,c:"#ccffff",t:"#000000"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"],
[{y:-0.875,x:2.5},"Mouse\n\n\n\n\n\nLeft",{x:1},"Mouse\n\n\n\n\n\nRight",{x:8.5},"Cursor\n\n\n\n\n\nLeft",{x:1},"Cursor\n\n\n\n\n\nRight"],
[{y:-0.875,x:5.5,c:"#cccccc",a:7},"",{x:6.5,c:"#ccffff",a:4},"Home"],
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\nL1",{c:"#cccccc",t:"#000000",a:7},"",{x:14.5,c:"#ccffff",a:4},"End",{c:"#cccccc",a:7,w:1.5},""],
[{y:-0.625,x:6.5,c:"#99ffff",a:4,h:1.5},"Scroll\n\n\n\n\n\nDown",{x:4.5,h:1.5},"Scroll\n\n\n\n\n\nDown"],
[{y:-0.75,x:3.5,c:"#ccffff"},"Mouse\n\n\n\n\n\nDown",{x:10.5},"Cursor\n\n\n\n\n\nDown"],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#99ffff",a:4},"Scroll\n\n\n\n\n\nDown",{x:8.5},"Scroll\n\n\n\n\n\nDown",{x:1,c:"#cccccc",a:7},""],
[{y:-0.875,x:5.5},"",{x:6.5},""],
[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
[{y:-0.375,x:3.5,c:"#ccffff",a:4},"Left\n\n\n\n\n\nClick",{x:10.5},"Page\n\n\n\n\n\nDown"],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1,c:"#ccffff",a:4},"Right\n\n\n\n\n\nClick",{x:8.5,c:"#cccccc",a:7},"",{x:1},""],
[{y:-0.75,x:0.5},"","",{x:14.5},"",""],
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#bbaacc",a:4},"Stop\n\n\nBrowser","Reload\n\n\nBrowser"],
[{h:2},"< Web\n\n\nBrowser",{h:2},"Web >\n\n\nBrowser","Search\n\n\nBrowser"],
[{x:2},"Home\n\n\nBrowser"],
[{r:-30,rx:13,y:-1,x:-3},"Prev\n\n\nAudio\n\n\nTrack","Next\n\n\nAudio\n\n\nTrack"],
[{x:-3,c:"#9988bb"},"Vol\n\n\n\n\n\nUp",{c:"#bbaacc",h:2},"Stop\n\n\nAudio",{h:2},"Play\n\n\nAudio\n\n\nPause"],
[{x:-3,c:"#9988bb"},"Vol\n\n\n\n\n\nDown"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

@ -0,0 +1,27 @@
[{x:3.5,c:"#a3a3a3"},"F3",{x:10.5},"F8"],
[{y:-0.875,x:2.5},"F2",{x:1},"F4",{x:8.5},"F7",{x:1},"F9"],
[{y:-0.875,x:5.5},"F5",{c:"#ff4444"},"Esc",{x:4.5,c:"#cccccc",a:7},"",{c:"#a3a3a3",a:4},"F6"],
[{y:-0.875,c:"#ff4444",w:1.5},"Esc",{c:"#a3a3a3"},"F1",{x:14.5},"F10",{w:1.5},"F11"],
[{y:-0.375,x:3.5,c:"#bbc6ed"},"{",{x:10.5,c:"#bed4ba"},"8"],
[{y:-0.875,x:2.5,c:"#bbc6ed"},"@",{x:1},"}",{x:8.5,c:"#bed4ba"},"7",{x:1},"9"],
[{y:-0.875,x:5.5,c:"#bbc6ed"},"&",{h:1.5},"<",{x:4.5,h:1.5},">","|"],
[{y:-0.875,c:"#2277ff",fa:[0,0,0,1],w:1.5},"Media\n\n\nL2",{c:"#bbc6ed"},"!",{x:14.5,c:"#bed4ba"},"/",{c:"#a3a3a3",w:1.5},"F12"],
[{y:-0.375,x:3.5,c:"#bbc6ed"},"(",{x:10.5,c:"#bed4ba"},"5"],
[{y:-0.875,x:2.5,c:"#bbc6ed"},"$",{x:1},")",{x:8.5,c:"#bed4ba"},"4",{x:1},"6"],
[{y:-0.875,x:5.5,c:"#bbc6ed"},"`",{x:6.5},"/"],
[{y:-0.875,c:"#000000",t:"#ff0000",w:1.5},"Symbols\n\n\nL1",{c:"#bbc6ed",t:"#000000"},"#",{x:14.5,c:"#bed4ba"},"*",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSymbols\nL1"],
[{y:-0.625,x:6.5,c:"#bfbf67",t:"#000000",h:1.5},"Tab >\n\n\nTab",{x:4.5,h:1.5},"< Tab\n\n\nShift Tab"],
[{y:-0.75,x:3.5,c:"#bbc6ed"},"[",{x:10.5,c:"#bed4ba"},"2"],
[{y:-0.875,x:2.5,c:"#bbc6ed"},"^",{x:1},"]",{x:8.5,c:"#bed4ba"},"1",{x:1},"3"],
[{y:-0.875,x:5.5,c:"#bbc6ed"},"~",{x:6.5},"\\"],
[{y:-0.875,c:"#cccccc",a:7,w:1.5},"",{c:"#bbc6ed",a:4},"%",{x:14.5,c:"#bed4ba"},"-",{c:"#2277ff",w:1.5},"\n\nCaps Lock"],
[{y:-0.375,x:3.5,c:"#cccccc",a:7},"",{x:10.5,c:"#bed4ba",a:4},"."],
[{y:-0.875,x:2.5,c:"#cccccc",a:7},"",{x:1},"",{x:8.5,c:"#bed4ba",a:4},"0",{x:1},"="],
[{y:-0.75,x:0.5,c:"#cccccc",a:7},"","",{x:14.5,c:"#bed4ba",a:4},"+","Enter"],
[{r:30,rx:6.5,ry:4.25,y:-1,x:1,c:"#bfbf67"},"Left","Right"],
[{h:2},"Space",{h:2},"Enter","Up"],
[{x:2},"Down"],
[{r:-30,rx:13,y:-1,x:-3},"Home","End"],
[{x:-3},"Page\n\n\n\n\n\nUp",{h:2},"< Del\n\n\nBackspace",{h:2},"Del >\n\n\nDelete"],
[{x:-3},"Page\n\n\n\n\n\nDown"]

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

@ -1,5 +1,9 @@
# The Ordinary Layout. for users of common keyboards # The Ordinary Layout, a familiar and powerful layout
You can read more about the reasoning behind this layout over at [Nicholas's blog](http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html). The idea is to make a layout that's as familiar as possible for users of "regular" keyboards. The Ordinary Layout is intended to be unremarkably mundane and remarkably useful. This layout maintains most key positions from common QWERTY keyboards and features enhanced Symbol and Media layers compared to the default Ergodox EZ layout.
![Ordinary layout](ordinary.png) Full details about the rationale behind this layout [are available](http://nicholas.rinard.us/2016/03/ergodox-ez-layout.html).
![Ordinary base layout](ordinary-base.png)
![Ordinary symbol layout](ordinary-symbol.png)
![Ordinary media layout](ordinary-media.png)

@ -28,7 +28,11 @@ There are four layers:
- Tap `F2` to copy screenshot to the clipboard. - Tap `F2` to copy screenshot to the clipboard.
- Hold `SHIFT` and tap `F2` to save screenshot as a file. - Hold `SHIFT` and tap `F2` to save screenshot as a file.
- Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/). - Tap `F3`, `F4`, `F5`, `F6` to resize a window via [Divvy](http://mizage.com/divvy/).
- Tap `F14`, `F15` to adjust display brightness. - Tap `F14`, `F15` to adjust display brightness.
**IMPORTANT**: If you have another keyboard connected via Bluetooth, then `F14` and `F15` will not work.
Turn off that Bluetooth keyboard. Re-plug you ErgoDox. Enjoy!
## CTRL/ESC ## CTRL/ESC

@ -17,31 +17,91 @@
#define _RS 4 #define _RS 4
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QW] = { /* Qwerty */
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_QW] = {
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
{KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
[_CM] = { /* Colemak */
/* Colemak
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | R | S | T | D | H | N | E | I | O | " |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_CM] = {
{KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
{KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
[_DV] = { /* Dvorak */
/* Dvorak
* ,-----------------------------------------------------------------------------------.
* | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | O | E | U | I | D | H | T | N | S | / |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_DV] = {
{KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC},
{KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH},
{KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT },
{M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
}, },
[_RS] = { /* RAISE */
/* Raise
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_RS] = {
{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
}, },
[_LW] = { /* LOWER */
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F7 | F8 | F9 | F10 | F11 | F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Raise | Space |Lower | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LW] = {
{KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
{KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS},

@ -0,0 +1,139 @@
#----------------------------------------------------------------------------
# On command line:
#
# make all = Make software.
#
# make clean = Clean out built project files.
#
# make coff = Convert ELF to AVR COFF.
#
# make extcoff = Convert ELF to AVR Extended COFF.
#
# make program = Download the hex file to the device.
# Please customize your programmer settings(PROGRAM_CMD)
#
# make teensy = Download the hex file to the device, using teensy_loader_cli.
# (must have teensy_loader_cli installed).
#
# make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed).
#
# make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed).
#
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed).
#
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed).
#
# make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
#
# make filename.s = Just compile filename.c into the assembler code only.
#
# make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project.
#
# To rebuild project do "make clean" then "make all".
#----------------------------------------------------------------------------
# Target file name (without extension).
TARGET = retro_refit
# Directory common source filess exist
TOP_DIR = ../..
TMK_DIR = ../../tmk_core
# Directory keyboard dependent files exist
TARGET_DIR = .
# # project specific files
SRC = retro_refit.c
ifdef KEYMAP
SRC := keymaps/$(KEYMAP).c $(SRC)
else
SRC := keymaps/default.c $(SRC)
endif
CONFIG_H = config.h
# MCU name
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=512
# Build Options
# comment out to disable the options.
#
BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
# Optimize size but this may cause error "relocation truncated to fit"
#EXTRALDFLAGS = -Wl,--relax
# Search Path
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
VPATH += $(TMK_DIR)
include $(TOP_DIR)/quantum/quantum.mk

@ -0,0 +1,24 @@
retro_refit keyboard firmware
======================
## Quantum MK Firmware
For the full Quantum feature list, see [the parent README.md](/README.md).
## Building
Download or clone the whole firmware and navigate to the keyboard/retro_refit folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.

@ -0,0 +1,79 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER Nobody
#define PRODUCT retro_refit
#define DESCRIPTION Retro Refit
/* key matrix size */
#define MATRIX_ROWS 11
#define MATRIX_COLS 8
// See note in retro_refit.h for an explanation of how this matrix is wired up
#define COLS (int []){ B0, B1, B2, B3, D2, D3, C7, D5 }
#define ROWS (int []){ D4, D7, B4, B5, B6, F7, F6, F5, F4, F1, F0 }
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 0
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,33 @@
// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
// this is the style you want to emulate.
#include "retro_refit.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] =
KEYMAP( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, NLCK, SLCK, PSCR, PAUS, \
GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, BSPC, HOME, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, PGUP, \
BSLS, A, S, D, F, G, H, J, K, L, SCLN, QUOT, ENT, PGDN, \
LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, UP, END, \
LCTL, LGUI, LALT, SPC, INS, DEL, LEFT, DOWN, RGHT),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};

@ -0,0 +1,68 @@
#include "retro_refit.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave this function blank - it can be defined in a keymap file
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave this function blank - it can be defined in a keymap file
};
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
};
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
// Disable status LED on KB, enable status LED on Teensy (KB_STATUS = !TEENSY_STATUS)
DDRD |= (1<<6);
PORTD |= (1<<6);
matrix_init_user();
};
void amatrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
};
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
// output low
DDRD |= (1<<0);
PORTD &= ~(1<<0);
} else {
// Hi-Z
DDRD &= ~(1<<0);
PORTD &= ~(1<<0);
}
if (usb_led & (1<<USB_LED_NUM_LOCK)) {
// output low
DDRD |= (1<<1);
PORTD &= ~(1<<1);
} else {
// Hi-Z
DDRD &= ~(1<<1);
PORTD &= ~(1<<1);
}
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
// output low
DDRC |= (1<<6);
PORTC &= ~(1<<6);
} else {
// Hi-Z
DDRC &= ~(1<<6);
PORTC &= ~(1<<6);
}
led_set_user(usb_led);
};

@ -0,0 +1,45 @@
#ifndef RETRO_REFIT_H
#define RETRO_REFIT_H
#include "matrix.h"
#include "keymap_common.h"
#include "led.h"
#include <stddef.h>
// This macro is an example of using a non-standard row-column matrix. The
// keyboard in question had 11 rows and 8 columns, but the rows were not all
// horizontal, and the columns were not all vertical. For example, row 2
// contained "Print Screen", "N", "M", ",", ".", "/", "Right Shift", and
// "Left Alt". Column 0 contained "F6", "7", "O", "'", "Q", "D", "B",
// "Left Alt", "Up Arrow", and "Down Arrow".
//
// The macro makes programming the keys easier and in a more straight-forward
// manner because it realigns the keys into a 6x15 sensible keyboard layout
// instead of the obtuse 11x8 matrix.
#define KEYMAP( \
K77, K05, K04, K03, K02, K01, K00, KA7, KA6, KA5, KA4, KA3, KA2, K11, K94, \
K27, K76, K75, K74, K73, K72, K71, K70, K67, K66, K65, K64, K63, K62, KA1, \
K61, K60, K57, K56, K55, K54, K53, K52, K51, K50, K47, K46, K45, K97, \
K43, K42, K41, K40, K37, K36, K35, K34, K33, K32, K31, K30, K44, K87, \
K26, K24, K23, K22, K21, K20, K17, K16, K15, K14, K13, K12, KA0, K91, \
K10, K06, K25, K07, K86, K85, K95, K90, K93 \
) { \
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, }, \
{ KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, }, \
{ KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, }, \
{ KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47, }, \
{ KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57, }, \
{ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, }, \
{ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77, }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##K85, KC_##K86, KC_##K87, }, \
{ KC_##K90, KC_##K91, KC_NO, KC_##K93, KC_##K94, KC_##K95, KC_NO, KC_##K97, }, \
{ KC_##KA0, KC_##KA1, KC_##KA2, KC_##KA3, KC_##KA4, KC_##KA5, KC_##KA6, KC_##KA7, } \
}
void matrix_init_user(void);
void matrix_scan_user(void);
void led_set_user(uint8_t usb_led);
#endif

@ -19,9 +19,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdint.h" #include "stdint.h"
#include "led.h" #include "led.h"
__attribute__ ((weak))
void led_set_kb(uint8_t usb_led) {
}
void led_set(uint8_t usb_led) void led_set(uint8_t usb_led)
{ {
// Example LED Code
//
// // Using PE6 Caps Lock LED // // Using PE6 Caps Lock LED
// if (usb_led & (1<<USB_LED_CAPS_LOCK)) // if (usb_led & (1<<USB_LED_CAPS_LOCK))
// { // {
@ -35,4 +42,6 @@ void led_set(uint8_t usb_led)
// DDRE &= ~(1<<6); // DDRE &= ~(1<<6);
// PORTE &= ~(1<<6); // PORTE &= ~(1<<6);
// } // }
led_set_kb(usb_led);
} }

@ -2,22 +2,35 @@
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_init_user(void) { void matrix_init_user(void) {
// leave these blank // leave this function blank - it can be defined in a keymap file
} };
__attribute__ ((weak)) __attribute__ ((weak))
void matrix_scan_user(void) { void matrix_scan_user(void) {
// leave these blank // leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
} }
void matrix_init_kb(void) { void matrix_init_kb(void) {
// put your keyboard start-up code here // put your keyboard start-up code here
// runs once when the firmware starts up // runs once when the firmware starts up
matrix_init_user(); matrix_init_user();
} }
void matrix_scan_kb(void) { void matrix_scan_kb(void) {
// put your looping keyboard code here // put your looping keyboard code here
// runs every cycle (a lot) // runs every cycle (a lot)
matrix_scan_user(); matrix_scan_user();
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
led_set_user(usb_led);
} }

@ -21,5 +21,6 @@
void matrix_init_user(void); void matrix_init_user(void);
void matrix_scan_user(void); void matrix_scan_user(void);
void led_set_user(uint8_t usb_led);
#endif #endif

@ -1 +0,0 @@
Subproject commit 19892c196894e6676fa69c732e05a03a68d5cb07

@ -70,6 +70,10 @@ void process_action(keyrecord_t *record)
#endif #endif
dprintln(); dprintln();
if (event.pressed) {
// clear the potential weak mods left by previously pressed keys
clear_weak_mods();
}
switch (action.kind.id) { switch (action.kind.id) {
/* Key and Mods */ /* Key and Mods */
case ACT_LMODS: case ACT_LMODS:
@ -500,6 +504,7 @@ void clear_keyboard(void)
void clear_keyboard_but_mods(void) void clear_keyboard_but_mods(void)
{ {
clear_weak_mods(); clear_weak_mods();
clear_macro_mods();
clear_keys(); clear_keys();
send_keyboard_report(); send_keyboard_report();
#ifdef MOUSEKEY_ENABLE #ifdef MOUSEKEY_ENABLE

@ -41,7 +41,7 @@ void action_macro_play(const macro_t *macro_p)
MACRO_READ(); MACRO_READ();
dprintf("KEY_DOWN(%02X)\n", macro); dprintf("KEY_DOWN(%02X)\n", macro);
if (IS_MOD(macro)) { if (IS_MOD(macro)) {
add_weak_mods(MOD_BIT(macro)); add_macro_mods(MOD_BIT(macro));
send_keyboard_report(); send_keyboard_report();
} else { } else {
register_code(macro); register_code(macro);
@ -51,7 +51,7 @@ void action_macro_play(const macro_t *macro_p)
MACRO_READ(); MACRO_READ();
dprintf("KEY_UP(%02X)\n", macro); dprintf("KEY_UP(%02X)\n", macro);
if (IS_MOD(macro)) { if (IS_MOD(macro)) {
del_weak_mods(MOD_BIT(macro)); del_macro_mods(MOD_BIT(macro));
send_keyboard_report(); send_keyboard_report();
} else { } else {
unregister_code(macro); unregister_code(macro);

@ -29,6 +29,7 @@ static inline void del_key_bit(uint8_t code);
static uint8_t real_mods = 0; static uint8_t real_mods = 0;
static uint8_t weak_mods = 0; static uint8_t weak_mods = 0;
static uint8_t macro_mods = 0;
#ifdef USB_6KRO_ENABLE #ifdef USB_6KRO_ENABLE
#define RO_ADD(a, b) ((a + b) % KEYBOARD_REPORT_KEYS) #define RO_ADD(a, b) ((a + b) % KEYBOARD_REPORT_KEYS)
@ -55,6 +56,7 @@ static int16_t oneshot_time = 0;
void send_keyboard_report(void) { void send_keyboard_report(void) {
keyboard_report->mods = real_mods; keyboard_report->mods = real_mods;
keyboard_report->mods |= weak_mods; keyboard_report->mods |= weak_mods;
keyboard_report->mods |= macro_mods;
#ifndef NO_ACTION_ONESHOT #ifndef NO_ACTION_ONESHOT
if (oneshot_mods) { if (oneshot_mods) {
#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0)) #if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
@ -118,6 +120,13 @@ void del_weak_mods(uint8_t mods) { weak_mods &= ~mods; }
void set_weak_mods(uint8_t mods) { weak_mods = mods; } void set_weak_mods(uint8_t mods) { weak_mods = mods; }
void clear_weak_mods(void) { weak_mods = 0; } void clear_weak_mods(void) { weak_mods = 0; }
/* macro modifier */
uint8_t get_macro_mods(void) { return macro_mods; }
void add_macro_mods(uint8_t mods) { macro_mods |= mods; }
void del_macro_mods(uint8_t mods) { macro_mods &= ~mods; }
void set_macro_mods(uint8_t mods) { macro_mods = mods; }
void clear_macro_mods(void) { macro_mods = 0; }
/* Oneshot modifier */ /* Oneshot modifier */
#ifndef NO_ACTION_ONESHOT #ifndef NO_ACTION_ONESHOT
void set_oneshot_mods(uint8_t mods) void set_oneshot_mods(uint8_t mods)

@ -47,6 +47,13 @@ void del_weak_mods(uint8_t mods);
void set_weak_mods(uint8_t mods); void set_weak_mods(uint8_t mods);
void clear_weak_mods(void); void clear_weak_mods(void);
/* macro modifier */
uint8_t get_macro_mods(void);
void add_macro_mods(uint8_t mods);
void del_macro_mods(uint8_t mods);
void set_macro_mods(uint8_t mods);
void clear_macro_mods(void);
/* oneshot modifier */ /* oneshot modifier */
void set_oneshot_mods(uint8_t mods); void set_oneshot_mods(uint8_t mods);
void clear_oneshot_mods(void); void clear_oneshot_mods(void);

@ -34,8 +34,11 @@ extern "C" {
void led_set(uint8_t usb_led); void led_set(uint8_t usb_led);
/* keyboard-specific LED functionality */
void led_set_kb(uint8_t usb_led);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif
Loading…
Cancel
Save