summaryrefslogtreecommitdiffstats
path: root/keyboards/gh60
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/gh60')
-rw-r--r--keyboards/gh60/Makefile74
-rw-r--r--keyboards/gh60/README.md60
-rw-r--r--keyboards/gh60/config.h161
-rw-r--r--keyboards/gh60/gh60.c68
-rw-r--r--keyboards/gh60/gh60.h81
-rw-r--r--keyboards/gh60/gh60revc.jpgbin0 -> 1424987 bytes
-rw-r--r--keyboards/gh60/keymaps/default/compiled.hex1019
-rw-r--r--keyboards/gh60/keymaps/default/keymap.c69
-rw-r--r--keyboards/gh60/pinout.txt18
9 files changed, 1550 insertions, 0 deletions
diff --git a/keyboards/gh60/Makefile b/keyboards/gh60/Makefile
new file mode 100644
index 0000000000..39a9cc0ae1
--- /dev/null
+++ b/keyboards/gh60/Makefile
@@ -0,0 +1,74 @@
+
+
+# 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=4096
+
+
+# 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
+KEYBOARD_LOCK_ENABLE ?= yes # Allow locking of keyboard via magic key
+# 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
+
+
+ifndef QUANTUM_DIR
+ include ../../Makefile
+endif
+
diff --git a/keyboards/gh60/README.md b/keyboards/gh60/README.md
new file mode 100644
index 0000000000..35c13375ce
--- /dev/null
+++ b/keyboards/gh60/README.md
@@ -0,0 +1,60 @@
+## gh60 Rev C keyboard firmware
+
+![gh60 Rev C PCB](gh60revc.jpg)
+
+ /* Column pin configuration
+ * col: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
+ * pin: F0 F1 E6 C7 C6 B6 D4 B1 B7 B5 B4 D7 D6 B3 (Rev.C)
+ */
+
+ /* Row pin configuration
+ * row: 0 1 2 3 4
+ * pin: D0 D1 D2 D3 D5
+ */
+
+ GPIO pads
+ 0 F7 WASD LEDs
+ 1 F6 ESC LED
+ 2 F5 FN LED
+ 3 F4 POKER Arrow LEDs
+
+ B2 Capslock LED
+ B0 not connected
+
+Functions to controls LED clusters
+
+ gh60_caps_led_on()
+ gh60_poker_leds_on()
+ gh60_fn_led_on()
+ gh60_esc_led_on()
+ gh60_wasd_leds_on()
+
+ gh60_caps_led_off()
+ gh60_poker_leds_off()
+ gh60_fn_led_off()
+ gh60_esc_led_off()
+ gh60_wasd_leds_off()
+
+======================
+
+## 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 keyboards/gh60_rev_c 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` in the keymaps folder, 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.
diff --git a/keyboards/gh60/config.h b/keyboards/gh60/config.h
new file mode 100644
index 0000000000..4813c4e786
--- /dev/null
+++ b/keyboards/gh60/config.h
@@ -0,0 +1,161 @@
+/*
+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 geekhack
+#define PRODUCT GH60
+#define DESCRIPTION t.m.k. keyboard firmware for GH60
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+*/
+ #define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 }
+// Rev A
+// #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B0, B5, B4, D7, D6, B3 }
+// Rev B/C
+ #define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B6, D4, B1, B7, B5, B4, D7, D6, B3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* 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
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
diff --git a/keyboards/gh60/gh60.c b/keyboards/gh60/gh60.c
new file mode 100644
index 0000000000..6da4d8ee3e
--- /dev/null
+++ b/keyboards/gh60/gh60.c
@@ -0,0 +1,68 @@
+#include "gh60.h"
+#include "led.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))
+bool process_action_user(keyrecord_t *record) {
+ // leave this function blank - it can be defined in a keymap file
+ return true;
+}
+
+__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
+
+ matrix_init_user();
+}
+
+void matrix_scan_kb(void) {
+ // put your looping keyboard code here
+ // runs every cycle (a lot)
+
+ matrix_scan_user();
+}
+
+bool process_action_kb(keyrecord_t *record) {
+ // put your per-action keyboard code here
+ // runs for every action, just before processing by the firmware
+
+ return process_action_user(record);
+}
+
+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)) {
+ gh60_caps_led_on();
+ } else {
+ gh60_caps_led_off();
+ }
+
+ // if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+ // gh60_esc_led_on();
+ // } else {
+ // gh60_esc_led_off();
+ // }
+
+ // if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+ // gh60_fn_led_on();
+ // } else {
+ // gh60_fn_led_off();
+ // }
+
+ led_set_user(usb_led);
+}
diff --git a/keyboards/gh60/gh60.h b/keyboards/gh60/gh60.h
new file mode 100644
index 0000000000..a0ad51357b
--- /dev/null
+++ b/keyboards/gh60/gh60.h
@@ -0,0 +1,81 @@
+#ifndef GH60_H
+#define GH60_H
+
+#include "matrix.h"
+#include "keymap.h"
+#include "backlight.h"
+#include <stddef.h>
+
+/* GH60 LEDs
+ * GPIO pads
+ * 0 F7 WASD LEDs
+ * 1 F6 ESC LED
+ * 2 F5 FN LED
+ * 3 F4 POKER Arrow LEDs
+ * B2 Capslock LED
+ * B0 not connected
+ */
+inline void gh60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); }
+inline void gh60_poker_leds_on(void) { DDRF |= (1<<4); PORTF &= ~(1<<4); }
+inline void gh60_fn_led_on(void) { DDRF |= (1<<5); PORTF &= ~(1<<5); }
+inline void gh60_esc_led_on(void) { DDRF |= (1<<6); PORTF &= ~(1<<6); }
+inline void gh60_wasd_leds_on(void) { DDRF |= (1<<7); PORTF &= ~(1<<7); }
+
+inline void gh60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
+inline void gh60_poker_leds_off(void) { DDRF &= ~(1<<4); PORTF &= ~(1<<4); }
+inline void gh60_fn_led_off(void) { DDRF &= ~(1<<5); PORTF &= ~(1<<5); }
+inline void gh60_esc_led_off(void) { DDRF &= ~(1<<6); PORTF &= ~(1<<6); }
+inline void gh60_wasd_leds_off(void) { DDRF &= ~(1<<7); PORTF &= ~(1<<7); }
+
+/* GH60 keymap definition macro
+ * K2C, K31 and K3C are extra keys for ISO
+ */
+#define KEYMAP( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
+ K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
+) { \
+ { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D }, \
+ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D }, \
+ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D }, \
+ { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D }, \
+ { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D } \
+}
+
+/* ANSI valiant. No extra keys for ISO */
+#define KEYMAP_ANSI( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4D \
+) KEYMAP( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
+ K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, NO, K3D, \
+ K40, K41, K42, K45, NO, K4A, K4B, K4C, K4D \
+)
+
+#define KEYMAP_HHKB( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4D \
+) KEYMAP( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, NO, K2D, \
+ K30, NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
+ K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
+)
+
+void matrix_init_user(void);
+void matrix_scan_user(void);
+bool process_action_user(keyrecord_t *record);
+void led_set_user(uint8_t usb_led);
+
+#endif
diff --git a/keyboards/gh60/gh60revc.jpg b/keyboards/gh60/gh60revc.jpg
new file mode 100644
index 0000000000..6c88ad2442
--- /dev/null
+++ b/keyboards/gh60/gh60revc.jpg
Binary files differ
diff --git a/keyboards/gh60/keymaps/default/compiled.hex b/keyboards/gh60/keymaps/default/compiled.hex
new file mode 100644
index 0000000000..5c253e970a
--- /dev/null
+++ b/keyboards/gh60/keymaps/default/compiled.hex
@@ -0,0 +1,1019 @@
+:100000000C9428020C946C020C946C020C946C02FC
+:100010000C946C020C946C020C946C020C946C02A8
+:100020000C946C020C946C020C94A50B0C94770C41
+:100030000C949B190C946C020C946C020C946C0242
+:100040000C946C020C946C020C946C020C946C0278
+:100050000C946C020C94031A0C946C020C946C02B9
+:100060000C946C020C946C020C946C020C946C0258
+:100070000C946C020C946C020C946C020C946C0248
+:100080000C946C020C946C020C946C020C946C0238
+:100090000C946C020C946C020C946C020C946C0228
+:1000A0000C946C020C946C020C946C02E40C060D23
+:1000B000F40D060DF40D4B0D6E0DF40DC30DD60DA4
+:1000C000B310B310E210E21021114111711271123C
+:1000D0004C117112FC11FC116212711271126B122F
+:1000E0000912091209120912091209120912091238
+:1000F0000912091209120912091209120912091228
+:10010000191227122E1235123F12F1A1048A29006A
+:100110001E001F00200021002200230024002500D3
+:10012000260027002D002E0035002B0014001A0099
+:100130000800150017001C0018000C001200130026
+:100140002F0030002A0039000400160007000900C3
+:100150000A000B000D000E000F00330034000000F9
+:100160002800E100C1001D001B0006001900050069
+:1001700011001000360037003800C000E500E00034
+:10018000E300E200000000002C000000000000007E
+:100190003100E600E7006500E40029003A003B007A
+:1001A0003C003D003E003F00400041004200430053
+:1001B000440045000100010001005200010001005F
+:1001C0000100010001000100010001000100010027
+:1001D00001000100500051004F000100010001002A
+:1001E0000100010001000100010001000100010007
+:1001F00001000100010001000100010001000100F7
+:1002000001000100010001000100010001000100E6
+:1002100000000000010000000000000001000100DB
+:1002200001000100010001000100010001000100C6
+:1002300001000100010001000100010001000100B6
+:1002400001000100010001000100010001000100A6
+:100250000100010001000100010001000100010096
+:100260000100010001000100010001000100010086
+:100270000100010001000100010001000100010076
+:100280000100010001000100010001000100010066
+:100290000100010052000100010001000000000007
+:1002A00001000000000000000100010050005100AA
+:1002B0004F000A03470048003600300000001203D8
+:1002C0006700650065006B006800610063006B00FB
+:1002D00000000403090409026D00040100A0FA09EA
+:1002E0000400000103010100092111010001223F66
+:1002F000000705810308000A090401000103010247
+:1003000000092111010001224D00070582030800A8
+:100310000A09040200010300000009211101000183
+:100320002236000705830308000A090403000103BD
+:100330000000000921110100012239000705840392
+:100340001000011201100100000008EDFE606001C4
+:10035000000102000105010906A101050719E029B4
+:10036000E715002501950875018102050819012985
+:100370000595057501910295017503910105071910
+:1003800000297715002501957875018102C00501C6
+:100390000980A101850216010026B7001A01002A72
+:1003A000B700751095018100C0050C0901A10185F8
+:1003B00003160100269C021A01002A9C0275109562
+:1003C000018100C005010902A1010901A10005097F
+:1003D0001901290515002501950575018102950171
+:1003E000750381010501093009311581257F9502C9
+:1003F0007508810609381581257F950175088106E4
+:10040000050C0A38021581257F950175088106C003
+:10041000C005010906A101050719E029E715002516
+:10042000019508750181029501750881010508197A
+:100430000129059505750191029501750391010545
+:1004400007190029FF150025FF950675088100C0D2
+:1004500011241FBECFEFDAE0DEBFCDBF04B603FE2E
+:1004600024C08091F1019091F201A091F301B0912B
+:10047000F4018730904BA740B04BB9F41092F101D2
+:100480001092F2011092F3011092F40114BE84B79D
+:10049000877F84BF88E10FB6F89480936000109244
+:1004A00060000FBEE0E0F8E3099511E0A0E0B1E0E4
+:1004B000EEE5FFE302C005900D92AC33B107D9F72A
+:1004C00011E0ACE3B1E001C01D92A13FB107E1F73B
+:1004D0000E94EB080C94AD1F0C940000089581E07D
+:1004E000089508950C946E020C9490020C946F027F
+:1004F00081FF02C0229A01C022982A980C947102AE
+:1005000061110BC0FC018281882321F085EE0E94DD
+:10051000620F03C085EE0E941F1080E090E00895F6
+:100520008091B70181FF04C0879A8F98859A03C094
+:1005300087988F9885988D9882FF04C0849A8C98AC
+:10054000869A03C084988C9886988E98089581E046
+:1005500008950C94A70208950F931F93CF93DF93F0
+:100560008C01FC01C081D181CE010E94D517BE0152
+:100570000E945903EC01B8010E94A902882309F4E2
+:100580008DC0F8018281882309F44AC08091470117
+:1005900081111FC0C431F0E5DF0709F051C00E948E
+:1005A000AB0281E0809347010E94CD1990934601F0
+:1005B0008093450110923E011092400110923F013C
+:1005C0001092420110924101109244011092430195
+:1005D00065C080914501909146010E94D919883CDF
+:1005E000910570F480913E01E82FF0E0EE0FFF1FBF
+:1005F000E15CFE4FD183C0838F5F80933E014EC08C
+:10060000C43880E5D80721F0C538D04501F13AC09B
+:10061000F8018281882341F010923C0182E01EC0E3
+:10062000C438E0E5DE0759F580913C01811106C030
+:1006300086E20E94620F86E20E941F1082E01CC0C8
+:10064000C438F0E5DF0741F3C538D045D9F4F801E7
+:100650008281882331F010923D0180E20E946E1069
+:100660001DC080913D01811106C087E20E94620F8A
+:1006700087E20E941F1080E20E9475100FC0C538EB
+:10068000D04529F381E080933C0180933D01C8016E
+:10069000DF91CF911F910F910C94760280E0DF9152
+:1006A000CF911F910F9108950C9472020C947402D3
+:1006B00008959EE0799FF001112496E4899FE00D52
+:1006C000F11D1124E60FF11DEE0FFF1FE25FFE4F3B
+:1006D000859194910895880F991FFC01E657F04089
+:1006E000859194910895880F991FFC01E65FFE4F54
+:1006F0008591949108950F931F93CF93DF93EC010D
+:10070000811520E3920750F5C11580E2D80708F063
+:10071000C3C0CB3BD10590F4C83AD10508F06AC0FC
+:10072000C53AD10508F05BC0C430D10508F0D0C18E
+:10073000219709F0CAC101E010E00AC2CF3FD105FC
+:1007400011F008F0C5C1C03FD10508F0A2C0CE012C
+:10075000805E9109089708F4BBC1B7C1C13090E52C
+:10076000D90709F4A2C020F5C0318FE4D80770F48E
+:10077000C11590E4D90708F094C0C11521E3D20750
+:1007800008F0A3C1DD278E01106CE2C1C115D04570
+:1007900009F09BC10E94DC128FEF94E32CE08150A2
+:1007A00090402040E1F700C000000E94281AD0C10C
+:1007B000C11597E5D90758F4C03121E5D20708F0F3
+:1007C0001CC1C43180E5D80708F475C07EC1CE01D4
+:1007D00090578115904108F078C1DF7073C1C53A18
+:1007E000D10509F477C1C63AD10509F076C102E80E
+:1007F00010E4AEC1C83AD10509F472C1C93AD105B5
+:1008000009F471C1CA3AD10509F470C1CB3AD105D6
+:1008100009F46FC1CC3AD10509F46EC1CD3AD105C6
+:1008200009F46DC1C03BD10509F46CC1CE3AD105C4
+:1008300009F46BC1CF3AD10509F46AC1C13BD105B6
+:1008400009F469C1C23BD10509F468C1C33BD105B4
+:1008500009F467C1C43BD10509F466C1C53BD105A4
+:1008600009F465C1C63BD10509F464C1C73BD10594
+:1008700009F463C1C83BD10509F462C1C93BD10584
+:1008800009F461C1CA3BD10509F460C100E014E478
+:100890005FC18E0110655CC1CE019F700E94730321
+:1008A00058C1DF708E01106A53C18091D4018160FC
+:1008B0008093D4014DC10E94D51B811102C00E94BA
+:1008C000BB1B0E94F21B90E09093F1018093F0011A
+:1008D000C23080E5D80721F48091F001816086C0A4
+:1008E000C43090E5D90721F48091F00182607EC088
+:1008F000C63020E5D20721F48091F001846076C0F3
+:10090000C83080E5D80719F48091F00127C0CA30BB
+:1009100090E5D90721F48091F001806167C0CC3067
+:1009200020E5D20721F48091F00180625FC0CE30D3
+:1009300080E5D80721F48091F001806457C0C03170
+:1009400090E5D90721F48091F00180684FC0C23151
+:1009500020E5D20729F48091F0018460886046C0C8
+:10096000C33080E5D80721F48091F0018E7F3EC02E
+:10097000C53090E5D90721F48091F0018D7F36C014
+:10098000C73020E5D20721F48091F0018B7F2EC083
+:10099000C93080E5D80719F48091F00126C0CB302A
+:1009A00090E5D90721F48091F0018F7E1FC0CD30F2
+:1009B00020E5D20721F48091F0018F7D17C0CF3060
+:1009C00080E5D80721F48091F0018F7B0FC0C13101
+:1009D00090E5D90721F48091F0018F7707C0C331EA
+:1009E000D04531F48091F0018B7F877F8093F001B7
+:1009F0008091F0010E94F61BABC08D2F99278F705C
+:100A0000992781309105D9F49E012370332702C0C4
+:100A1000880F991F2A95E2F79C688E0144E0000F29
+:100A2000111F4A95E1F700271370802B912B53E09B
+:100A3000CC0FDD1F5A95E1F7C076DD272FC082303D
+:100A4000910531F4DC2FCC278E01016F106A80C034
+:100A50008330910569F4CE018370992701E010E09D
+:100A600002C0000F111F8A95E2F7C8019C680FC0F1
+:100A700084309105B9F4CE018370992701E010E02C
+:100A800002C0000F111F8A95E2F7C8019A6823E09F
+:100A9000CC0FDD1F2A95E1F7C07ED7708C010C2B9F
+:100AA0001D2B56C08530910531F4DC2FCC278E01EB
+:100AB000046F106A4DC0069709F04AC0CF71DD2758
+:100AC000DC2FCC278E01106243C000E010E040C054
+:100AD0008E013EC001E810E43BC003E810E438C0DA
+:100AE00002EE14E435C009EE14E432C00AEE14E458
+:100AF0002FC005EB14E42CC006EB14E429C007EB6F
+:100B000014E426C00CEC14E423C00DEC14E420C063
+:100B100003E815E41DC00AE815E41AC002E915E46B
+:100B200017C004E915E414C001E216E411C003E2A1
+:100B300016E40EC004E216E40BC005E216E408C099
+:100B400006E216E405C007E216E402C00AE216E473
+:100B5000C801DF91CF911F910F9108959EE0799F79
+:100B6000F001112496E4899FE00DF11D1124E60F98
+:100B7000F11DEE0FFF1FE25FFE4F85919491803EC5
+:100B80009105E0F4803C910558F58133910509F415
+:100B90006FC048F48932910509F463C08A32910527
+:100BA00009F46DC072C089339105E9F0823891056E
+:100BB000D1F08533910509F44DC067C0833E91059E
+:100BC00081F138F4803E9105B9F0823E9105D9F06B
+:100BD0005CC0863E910561F1873E9105A1F155C04B
+:100BE0000E946B0308952091F00120FD02C021FFB7
+:100BF0004CC080EE90E049C08091F00180FFF9CFB9
+:100C000089E390E042C08091F00182FF0EC08091A4
+:100C1000F00184FF03C080E090E037C083EE90E0F5
+:100C200034C08091F00182FFF2CF82EE90E02DC0BF
+:100C30008091F00183FF0BC08091F00184FDEBCF28
+:100C400087EE90E022C08091F00183FFF5CF86EE21
+:100C500090E01BC08091F00185FF07C089E290E021
+:100C600014C08091F00185FFF9CF85E390E00DC0BD
+:100C70008091F00186FF07C08AE290E006C0809173
+:100C8000F00186FFF9CF81E390E00E947B03089595
+:100C90000C947802E82FF0E0ED5DFE4F8081E82FA4
+:100CA000EF70F0E082958F7021E030E0A90102C082
+:100CB000440F551F8A95E2F740A308950F931F93A1
+:100CC000CF93DF9385B7806885BF85B7806885BF80
+:100CD000C4E0D0E001E010E0FE01ED5DFE4F808158
+:100CE000E82FEF70F0E021A182958F70A80102C07B
+:100CF000440F551F8A95E2F7CA01822B81A38C2FDE
+:100D00000E944A06219740F78DE090E061E070E094
+:100D1000FC01EB5EFE4F2081E22FEF70F0E042A17C
+:100D200022952F70DB0102C0AA0FBB1F2A95E2F7A4
+:100D30009D01242B22A3019758F7DF91CF911F919A
+:100D40000F910C945403EF92FF920F931F93CF9344
+:100D5000DF9302E511E0C4E0EE24E394F12CD5E04A
+:100D60008C2F0E944A068DE090E040E050E0FC01AC
+:100D7000EB5EFE4F6081E62FEF70F0E020A130E0E7
+:100D800062956F7002C0359527956A95E2F720FD50
+:100D900009C09701082E02C0220F331F0A94E2F700
+:100DA000422B532B019718F7F801929182918F01F2
+:100DB0008417950721F051834083D09300018C2F35
+:100DC0000E944A06C15060F68091000187FD1FC055
+:100DD0008150809300018F3F39F08FE99FE00197A8
+:100DE000F1F700C0000013C080E090E0FC01EE5A73
+:100DF000FE4FDC01A85BBE4F18962D913C911997D0
+:100E0000318720870297863FEFEF9E0779F70E9490
+:100E1000560381E0DF91CF911F910F91FF90EF90EA
+:100E20000895E82FF0E0EE0FFF1FEE5AFE4F80818D
+:100E30009181089508950F931F93CF930CE511E0CE
+:100E4000C0E0F801929182918F010E945019C80F61
+:100E5000F1E002351F07A9F78C2FCF911F910F9159
+:100E6000089580916C010895CF93DF9300D01F9275
+:100E7000CDB7DEB79C018091E701843019F593E08E
+:100E800099833B832A839093E9008FEF9091E80048
+:100E9000815095FD06C095ED9A95F1F700008111FE
+:100EA000F5CF8091E80085FF0DC040E050E063E0A1
+:100EB00070E0CE0101960E9495098091E8008E773E
+:100EC0008093E8000F900F900F90DF91CF910895DD
+:100ED000CF93DF9300D01F92CDB7DEB72091E7010B
+:100EE000243021F522E029839B838A8383E0809349
+:100EF000E9008FEF9091E800815095FD06C095EDD7
+:100F00009A95F1F700008111F5CF8091E80085FFF7
+:100F10000DC040E050E063E070E0CE0101960E9419
+:100F200095098091E8008E778093E8000F900F90EC
+:100F30000F90DF91CF9108952091E7012430F1F4D3
+:100F400022E02093E9002FEF3091E800215035FD99
+:100F500006C035ED3A95F1F700002111F5CF20914B
+:100F6000E80025FF0BC040E050E065E070E00E9423
+:100F700095098091E8008E778093E8000895CF93DB
+:100F8000DF93EC019091E701943009F046C0809125
+:100F90000B018823D9F080910C018823B9F090933C
+:100FA000E9008FEF9091E800815095FD06C095E132
+:100FB0009A95F1F700008111F5CF8091E80085FF47
+:100FC0002CC040E050E060E170E017C081E0809309
+:100FD000E9008FEF9091E800815095FD06C095EDF6
+:100FE0009A95F1F700008111F5CF8091E80085FF17
+:100FF00014C040E050E068E070E0CE010E94950926
+:101000008091E8008E778093E80080E1FE01ACE5F6
+:10101000B1E001900D928A95E1F7DF91CF910895AB
+:101020008091E601811109C00E942A0B0E94870B62
+:101030008091E20084608093E20008951092E601BE
+:101040000895089508950C94951942E061EC81E0AB
+:101050000E94A40A42E061EC82E00E94A40A42E0FD
+:1010600061EC83E00E94A40A42E161EC84E00C940C
+:10107000A40A8091E901833009F455C030F481302D
+:1010800071F0823009F48EC008958A3009F47AC074
+:101090008B3009F460C0893009F09CC020C0809179
+:1010A000E801813A09F096C08091E800877F80933B
+:1010B000E8008091EC019091ED01892B21F460E131
+:1010C0008CE591E003C060E080E090E070E00E9479
+:1010D000E0098091E8008B778093E8000895809183
+:1010E000E801813209F076C08091EC019091ED0128
+:1010F000009719F0039709F06DC08091E800877F91
+:101100008093E8008091E80082FD05C08091E701AE
+:101110008111F8CF5FC08091F10080936C018091C4
+:10112000E8008B7753C08091E801813A09F052C002
+:101130008091EC019091ED01892B09F04BC08091D9
+:10114000E800877F8093E8008091E80080FFFCCF73
+:1011500080910B0136C08091E8018132D9F58091F0
+:10116000EC019091ED01892BA9F58091E800877F32
+:101170008093E8000E94D90A8091EA0180930B01D4
+:101180000C94DC128091E801813221F58091E80015
+:10119000877F8093E8000E94D90A8091EB018093B9
+:1011A0006D0108958091E801813AA1F48091E800F1
+:1011B000877F8093E8008091E80080FFFCCF8091DA
+:1011C0006D018093F1008091E8008E778093E800B4
+:1011D0000C94D90A089584B7877F84BF88E10FB63D
+:1011E000F89480936000109260000FBE90E080E859
+:1011F0000FB6F89480936100909361000FBE0E9437
+:101200007C0E0E942A0B0E94870B8091E200846072
+:101210008093E20078940E940D0E0E947E0E81E081
+:1012200091E00E94280E8091E701853069F40E94C8
+:101230005C198091E5018823B1F30E948719882306
+:1012400091F30E947F09EFCF0E94840EECCF292FEB
+:10125000332723303105C9F064F42130310581F0A2
+:101260002230310509F043C08DE690E026ED32E0F2
+:1012700042C021323105F1F02232310541F137C04F
+:1012800082E190E023E433E036C099278130910574
+:1012900041F08230910541F0892B49F5E2EDF2E011
+:1012A00005C0EEEBF2E002C0E2EBF2E0849190E0E8
+:1012B0009F0121C06430D8F4E62FF0E0EE0FFF1F4D
+:1012C000EC5CFE4F2081318189E090E014C06430F5
+:1012D00070F470E0FB01EE0FFF1FE45DFE4F208114
+:1012E0003181FB01E85DFE4F808190E004C080E029
+:1012F00090E020E030E0FA0131832083089580E11E
+:1013000089BD82E189BD09B400FEFDCF8091D8007E
+:101310008F7D8093D8008091E00082608093E00010
+:101320008091E00081FDFCCF0895CF92DF92EF9293
+:10133000FF920F931F93CF93DF93EC018B016A0110
+:101340000E94F80A811133C0C114D10439F0F601AA
+:1013500080819181081B190BC80FD91FE12CF12C3A
+:101360000115110519F18091E80085FD16C08091E5
+:10137000E8008E778093E800C114D10449F0F601AB
+:1013800080819181E80EF91EF182E08285E00FC034
+:101390000E94F80A882321F30AC089918093F10002
+:1013A00001501109FFEFEF1AFF0ADACF80E0DF9159
+:1013B000CF911F910F91FF90EF90DF90CF90089504
+:1013C0002091EE013091EF012617370748F06115A3
+:1013D000710539F42091E8002E772093E80001C0D0
+:1013E000B90140E061157105A9F12091E7012223BF
+:1013F00009F443C0253009F442C02091E80023FDE0
+:1014000040C02091E80022FD32C02091E80020FF7A
+:10141000E9CF4091F3002091F20030E0342BFC0141
+:10142000CF016115710559F02830310540F48191E3
+:101430008093F100615071092F5F3F4FF1CF41E080
+:101440002830310509F040E02091E8002E77209304
+:10145000E800C8CF4111C9CF0AC08091E7018823B5
+:1014600061F0853061F08091E80083FD0AC08091D1
+:10147000E80082FFF2CF80E0089582E0089583E0E3
+:10148000089581E008952091EE013091EF01261733
+:10149000370748F06115710539F42091E8002E777F
+:1014A0002093E80001C0B901FC0120E0611571053D
+:1014B00091F18091E701882309F440C0853009F457
+:1014C0003FC08091E80083FD3DC08091E80082FD2F
+:1014D0002FC08091E80080FFE9CF2091F300809138
+:1014E000F20090E0922B6115710559F0883091055A
+:1014F00040F424912093F1003196615071090196D6
+:10150000F2CF21E0089709F020E08091E8008E7783
+:101510008093E800CBCF2111CCCF0AC08091E701A6
+:10152000882361F0853061F08091E80083FD0AC076
+:101530008091E80082FFF2CF80E0089582E0089574
+:1015400083E0089581E00895982F973058F590939F
+:10155000E900981739F07091EC002091ED0050915E
+:10156000F00003C0242F762F50E021FF19C03091E6
+:10157000EB003E7F3093EB003091ED003D7F3093E8
+:10158000ED003091EB0031603093EB007093EC0094
+:101590002093ED005093F0002091EE0027FF07C04C
+:1015A0009F5FD3CF8F708093E90081E0089580E042
+:1015B00008958091E80187FF11C08091E80082FDC5
+:1015C00005C08091E7018111F8CF11C08091E8003A
+:1015D0008B770BC08091E701882349F08091E80068
+:1015E00080FFF8CF8091E8008E778093E80008951F
+:1015F0002091E4003091E50095E64091EC00842FC5
+:10160000817040FF22C08091E80080FD1CC0809165
+:10161000E701882391F0853091F08091EB0085FD02
+:1016200010C04091E4005091E5004217530729F3A0
+:101630009A01915011F784E0089582E0089583E0C3
+:10164000089581E0089580E008954091E80042FF08
+:10165000DECF08950E94980B0E94A00BE0EEF0E010
+:10166000808181608083E8EDF0E080818F778083E6
+:1016700019BCA7EDB0E08C918E7F8C9380818F7E1A
+:1016800080831092E60108950F931F93CF93DF9309
+:101690000E94980B0E94A00BC8EDD0E088818F7744
+:1016A000888388818068888388818F7D888319BC3E
+:1016B0001092E7011092E3011092E5011092E4010B
+:1016C00000EE10E0F80180818B7F8083888181604B
+:1016D000888342E060E080E00E94A40AE1EEF0E04E
+:1016E00080818E7F8083E2EEF0E080818160808364
+:1016F000808188608083F80180818E7F80838881EB
+:1017000080618883DF91CF911F910F910895E8ED5B
+:10171000F0E080818F7E8083E7EDF0E08081816062
+:10172000808384E082BF81E08093E6010C94440BC7
+:10173000E8EDF0E080818E7F80831092E2000895D2
+:101740001092DA001092E10008951F920F920FB6E6
+:101750000F9211242F933F934F935F936F937F9337
+:101760008F939F93AF93BF93EF93FF938091E1008B
+:1017700082FF0BC08091E20082FF07C08091E100F0
+:101780008B7F8093E1000E940C0E8091DA0080FF35
+:101790001FC08091D80080FF1BC08091DA008E7F2F
+:1017A0008093DA008091D90080FF0DC080E189BD6F
+:1017B00082E189BD09B400FEFDCF81E08093E7019D
+:1017C0000E94100805C019BC1092E7010E941E0873
+:1017D0008091E10080FF19C08091E20080FF15C078
+:1017E0008091E2008E7F8093E2008091E200806130
+:1017F0008093E2008091D80080628093D80019BC69
+:1018000085E08093E7010E9422088091E10084FF37
+:1018100030C08091E20084FF2CC080E189BD82E16C
+:1018200089BD09B400FEFDCF8091D8008F7D8093E3
+:10183000D8008091E1008F7E8093E1008091E200EA
+:101840008F7E8093E2008091E20081608093E200CD
+:101850008091E301882311F084E007C08091E300C8
+:1018600087FD02C081E001C083E08093E7010E9410
+:1018700023088091E10083FF29C08091E20083FF6B
+:1018800025C08091E100877F8093E10082E0809312
+:10189000E7011092E3018091E1008E7F8093E100E7
+:1018A0008091E2008E7F8093E2008091E20080616F
+:1018B0008093E20042E060E080E00E94A40A809110
+:1018C000F00088608093F0000E942108FF91EF9162
+:1018D000BF91AF919F918F917F916F915F914F9148
+:1018E0003F912F910F900FBE0F901F9018951F9250
+:1018F0000F920FB60F9211242F933F934F935F9344
+:101900006F937F938F939F93AF93BF93CF93DF9307
+:10191000EF93FF93C091E900CF708091EC00D82F36
+:10192000D17080FDD0E81092E9008091F000877FAF
+:101930008093F00078940E94BB0C1092E900809193
+:10194000F00088608093F000CD2BCF70C093E90049
+:10195000FF91EF91DF91CF91BF91AF919F918F91C7
+:101960007F916F915F914F913F912F910F900FBE9B
+:101970000F901F9018951F93CF93DF93CDB7DEB7CD
+:10198000AA970FB6F894DEBF0FBECDBFE8EEF1E028
+:1019900088E08E0F9091F10091938E13FBCF0E94FF
+:1019A00039088091E80083FF1FC18091E801909180
+:1019B000E901492F50E04A30510508F015C1FA01FC
+:1019C000EA5AFF4F0C945D1F803881F0823809F08D
+:1019D0000BC18091EC018F708093E9008091EB0046
+:1019E00085FB882780F91092E90006C08091E40108
+:1019F0009091E501911182609091E800977F90931A
+:101A0000E8008093F1001092F100C8C0282F2D7FCC
+:101A100009F0EAC0882319F0823061F0E5C08091B6
+:101A2000EA01813009F0E0C0933009F080E0809352
+:101A3000E5012BC08091EA01811127C08091EC0162
+:101A40008F7009F4D1C08093E9002091EB0020FF52
+:101A50001CC0933021F48091EB00806214C09091FF
+:101A6000EB0090619093EB0021E030E0A90102C00F
+:101A7000440F551F8A95E2F74093EA001092EA005E
+:101A80008091EB0088608093EB001092E9008091D8
+:101A