From 649b33d7783cf3021928534b7ae127e0a89e8807 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Tue, 21 Jun 2016 22:39:54 -0400 Subject: Renames keyboard folder to keyboards, adds couple of tmk's fixes (#432) * fixes from tmk's repo * rename keyboard to keyboards --- keyboards/hhkb/Makefile | 86 ++ keyboards/hhkb/README.md | 180 ++++ keyboards/hhkb/config.h | 71 ++ keyboards/hhkb/hhkb.c | 29 + keyboards/hhkb/hhkb.h | 30 + keyboards/hhkb/hhkb_avr.h | 167 ++++ keyboards/hhkb/keymaps/default/compiled.hex | 1381 ++++++++++++++++++++++++++ keyboards/hhkb/keymaps/default/keymap.c | 78 ++ keyboards/hhkb/keymaps/lxol/compiled.hex | 1421 +++++++++++++++++++++++++++ keyboards/hhkb/keymaps/lxol/keymap.c | 208 ++++ keyboards/hhkb/matrix.c | 204 ++++ 11 files changed, 3855 insertions(+) create mode 100644 keyboards/hhkb/Makefile create mode 100644 keyboards/hhkb/README.md create mode 100644 keyboards/hhkb/config.h create mode 100644 keyboards/hhkb/hhkb.c create mode 100644 keyboards/hhkb/hhkb.h create mode 100644 keyboards/hhkb/hhkb_avr.h create mode 100644 keyboards/hhkb/keymaps/default/compiled.hex create mode 100644 keyboards/hhkb/keymaps/default/keymap.c create mode 100644 keyboards/hhkb/keymaps/lxol/compiled.hex create mode 100644 keyboards/hhkb/keymaps/lxol/keymap.c create mode 100644 keyboards/hhkb/matrix.c (limited to 'keyboards/hhkb') diff --git a/keyboards/hhkb/Makefile b/keyboards/hhkb/Makefile new file mode 100644 index 0000000000..53eece3969 --- /dev/null +++ b/keyboards/hhkb/Makefile @@ -0,0 +1,86 @@ + + +# project specific files +SRC = matrix.c + +# 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 + +# as per original hasu settings +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 +CUSTOM_MATRIX ?= yes # Custom matrix file for the HHKB +# 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 + +debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION +debug-on: all + +debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT +debug-off: OPT_DEFS := $(filter-out -DCONSOLE_ENABLE,$(OPT_DEFS)) +debug-off: all diff --git a/keyboards/hhkb/README.md b/keyboards/hhkb/README.md new file mode 100644 index 0000000000..2bfec7aa54 --- /dev/null +++ b/keyboards/hhkb/README.md @@ -0,0 +1,180 @@ +hhkb_qmk keyboard firmware +====================== + +## Quantum MK Firmware + +You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you. + + BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality + MIDI_ENABLE = yes # MIDI controls + # UNICODE_ENABLE = yes # Unicode support - this is commented out, just as an example. You have to use #, not // + BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID + +## Quick aliases to common actions + +Your keymap can include shortcuts to common operations (called "function actions" in tmk). + +### Switching and toggling layers + +`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack. + +`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer). + +`TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack. + +### Fun with modifier keys + +* `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias +* `RSFT(kc)` - applies right Shift to *kc* +* `LCTL(kc)` - applies left Control to *kc* +* `RCTL(kc)` - applies right Control to *kc* +* `LALT(kc)` - applies left Alt to *kc* +* `RALT(kc)` - applies right Alt to *kc* +* `LGUI(kc)` - applies left GUI (command/win) to *kc* +* `RGUI(kc)` - applies right GUI (command/win) to *kc* + +You can also chain these, like this: + + LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress. + +The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names are also available and documented in `/quantum/keymap_common.h`. + + KC_TILD ~ + KC_EXLM ! + KC_AT @ + KC_HASH # + KC_DLR $ + KC_PERC % + KC_CIRC ^ + KC_AMPR & + KC_ASTR * + KC_LPRN ( + KC_RPRN ) + KC_UNDS _ + KC_PLUS + + KC_LCBR { + KC_RCBR } + KC_PIPE | + KC_COLN : + +`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down. + +These are the values you can use for the `mod` in `MT()` (right-hand modifiers are not available): + + * MOD_LCTL + * MOD_LSFT + * MOD_LALT + * MOD_LGUI + +These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped. + +We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact: + + * `CTL_T(kc)` - is LCTL when held and *kc* when tapped + * `SFT_T(kc)` - is LSFT when held and *kc* when tapped + * `ALT_T(kc)` - is LALT when held and *kc* when tapped + * `GUI_T(kc)` - is LGUI when held and *kc* when tapped + * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) + +### Temporarily setting the default layer + +`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does. + +### Remember: These are just aliases + +These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). + +Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them. + +## Macro shortcuts: Send a whole string when pressing just one key + +Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymap_default.c). + +```c +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. +{ + switch(id) { + case 0: // this would trigger when you hit a key mapped as M(0) + if (record->event.pressed) { + return MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ); // this sends the string 'hello' when the macro executes + } + break; + } + return MACRO_NONE; +}; +``` +A macro can include the following commands: + +* I() change interval of stroke in milliseconds. +* D() press key. +* U() release key. +* T() type key(press and release). +* W() wait (milliseconds). +* END end mark. + +So above you can see the stroke interval changed to 255ms between each keystroke, then a bunch of keys being typed, waits a while, then the macro ends. + +Note: Using macros to have your keyboard send passwords for you is a bad idea. + +### Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc) + +Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap: + + #include "keymap_.h" + +Where is "colemak" or "dvorak". After including this line, you will get access to: + + * `CM_*` for all of the Colemak-equivalent characters + * `DV_*` for all of the Dvorak-equivalent characters + +These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features. + +To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F` - `KC_F` under these same circumstances would result in `T`. + +## Additional language support + +In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `รน` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support). + +## Unicode support + +You can currently send 4 hex digits with your OS-specific modifier key (RALT for OSX with the "Unicode Hex Input" layout) - this is currently limited to supporting one OS at a time, and requires a recompile for switching. 8 digit hex codes are being worked on. The keycode function is `UC(n)`, where *n* is a 4 digit hexidecimal. Enable from the Makefile. + +## Other firmware shortcut keycodes + +* `RESET` - puts the MCU in DFU mode for flashing new firmware (with `make dfu`) +* `DEBUG` - the firmware into debug mode - you'll need hid_listen to see things +* `BL_ON` - turns the backlight on +* `BL_OFF` - turns the backlight off +* `BL_` - sets the backlight to level *n* +* `BL_INC` - increments the backlight level by one +* `BL_DEC` - decrements the backlight level by one +* `BL_TOGG` - toggles the backlight +* `BL_STEP` - steps through the backlight levels + +Enable the backlight from the Makefile. + +## MIDI functionalty + +This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile. + +## Bluetooth functionality + +This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will. + +## Building + +Download or clone the whole firmware and navigate to the keyboards/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. + +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 a file in the keymaps folder named `.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|] +``` +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/hhkb/config.h b/keyboards/hhkb/config.h new file mode 100644 index 0000000000..ee66e44571 --- /dev/null +++ b/keyboards/hhkb/config.h @@ -0,0 +1,71 @@ +/* +Copyright 2012 Jun Wako + +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 . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xCAFE +#define DEVICE_VER 0x0104 +#define MANUFACTURER q.m.k +#define PRODUCT HHKB mod +#define DESCRIPTION q.m.k keyboard firmware for HHKB + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +#define TAPPING_TERM 200 + +/* 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 diff --git a/keyboards/hhkb/hhkb.c b/keyboards/hhkb/hhkb.c new file mode 100644 index 0000000000..6897026c6c --- /dev/null +++ b/keyboards/hhkb/hhkb.c @@ -0,0 +1,29 @@ +#include "hhkb.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 + + if (matrix_init_user) { + (*matrix_init_user)(); + } +}; + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + if (matrix_scan_user) { + (*matrix_scan_user)(); + } +}; diff --git a/keyboards/hhkb/hhkb.h b/keyboards/hhkb/hhkb.h new file mode 100644 index 0000000000..093d7aeabc --- /dev/null +++ b/keyboards/hhkb/hhkb.h @@ -0,0 +1,30 @@ +#ifndef HHKB_H +#define HHKB_H + +#include "matrix.h" +#include "keymap.h" +//#include "backlight.h" +#include + +#define KEYMAP( \ + K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \ + K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \ + K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \ + K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \ + K35, K36, K37, K57, K56) \ + \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, K22, K23, K24, K25, K26, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, KC_NO }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, KC_NO }, \ + { K70, K71, K72, K73, K74, K75, K76, KC_NO } \ +} + +void matrix_init_user(void); +void matrix_scan_user(void); + +#endif diff --git a/keyboards/hhkb/hhkb_avr.h b/keyboards/hhkb/hhkb_avr.h new file mode 100644 index 0000000000..7ea6322c73 --- /dev/null +++ b/keyboards/hhkb/hhkb_avr.h @@ -0,0 +1,167 @@ +#ifndef HHKB_AVR_H +#define HHKB_AVR_H + +#include +#include +#include +#include +#include + + +// Timer resolution check +#if (1000000/TIMER_RAW_FREQ > 20) +# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB." +#endif + + +/* + * HHKB Matrix I/O + * + * row: HC4051[A,B,C] selects scan row0-7 + * row-ext: [En0,En1] row extention for JP + * col: LS145[A,B,C,D] selects scan col0-7 and enable(D) + * key: on: 0/off: 1 + * prev: hysteresis control: assert(1) when previous key state is on + */ + + +#if defined(__AVR_ATmega32U4__) +/* + * For TMK HHKB alt controller(ATMega32U4) + * + * row: PB0-2 + * col: PB3-5,6 + * key: PD7(pull-uped) + * prev: PB7 + * power: PD4(L:off/H:on) + * row-ext: PC6,7 for HHKB JP(active low) + */ +static inline void KEY_ENABLE(void) { (PORTB &= ~(1<<6)); } +static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); } +static inline bool KEY_STATE(void) { return (PIND & (1<<7)); } +static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); } +static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); } +#ifdef HHKB_POWER_SAVING +static inline void KEY_POWER_ON(void) { + DDRB = 0xFF; PORTB = 0x40; // change pins output + DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on + /* Without this wait you will miss or get false key events. */ + _delay_ms(5); // wait for powering up +} +static inline void KEY_POWER_OFF(void) { + /* input with pull-up consumes less than without it when pin is open. */ + DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up + DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off +} +static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); } +#else +static inline void KEY_POWER_ON(void) {} +static inline void KEY_POWER_OFF(void) {} +static inline bool KEY_POWER_STATE(void) { return true; } +#endif +static inline void KEY_INIT(void) +{ + /* row,col,prev: output */ + DDRB = 0xFF; + PORTB = 0x40; // unable + /* key: input with pull-up */ + DDRD &= ~0x80; + PORTD |= 0x80; +#ifdef HHKB_JP + /* row extention for HHKB JP */ + DDRC |= (1<<6|1<<7); + PORTC |= (1<<6|1<<7); +#endif + KEY_UNABLE(); + KEY_PREV_OFF(); + + KEY_POWER_OFF(); +} +static inline void KEY_SELECT(uint8_t ROW, uint8_t COL) +{ + PORTB = (PORTB & 0xC0) | (((COL) & 0x07)<<3) | ((ROW) & 0x07); +#ifdef HHKB_JP + if ((ROW) & 0x08) PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<6); + else PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<7); +#endif +} + + +#elif defined(__AVR_AT90USB1286__) +/* + * For Teensy++(AT90USB1286) + * + * HHKB pro HHKB pro2 + * row: PB0-2 (6-8) (5-7) + * col: PB3-5,6 (9-12) (8-11) + * key: PE6(pull-uped) (4) (3) + * prev: PE7 (5) (4) + * + * TODO: convert into 'staitc inline' function + */ +#define KEY_INIT() do { \ + DDRB |= 0x7F; \ + DDRE |= (1<<7); \ + DDRE &= ~(1<<6); \ + PORTE |= (1<<6); \ +} while (0) +#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \ + (((COL) & 0x07)<<3) | \ + ((ROW) & 0x07)) +#define KEY_ENABLE() (PORTB &= ~(1<<6)) +#define KEY_UNABLE() (PORTB |= (1<<6)) +#define KEY_STATE() (PINE & (1<<6)) +#define KEY_PREV_ON() (PORTE |= (1<<7)) +#define KEY_PREV_OFF() (PORTE &= ~(1<<7)) +#define KEY_POWER_ON() +#define KEY_POWER_OFF() +#define KEY_POWER_STATE() true + + +#else +# error "define code for matrix scan" +#endif + + +#if 0 +// For ATMega328P with V-USB +// +// #elif defined(__AVR_ATmega328P__) +// Ports for V-USB +// key: PB0(pull-uped) +// prev: PB1 +// row: PB2-4 +// col: PC0-2,3 +// power: PB5(Low:on/Hi-z:off) +#define KEY_INIT() do { \ + DDRB |= 0x3E; \ + DDRB &= ~(1<<0); \ + PORTB |= 1<<0; \ + DDRC |= 0x0F; \ + KEY_UNABLE(); \ + KEY_PREV_OFF(); \ +} while (0) +#define KEY_SELECT(ROW, COL) do { \ + PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \ + PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \ +} while (0) +#define KEY_ENABLE() (PORTC &= ~(1<<3)) +#define KEY_UNABLE() (PORTC |= (1<<3)) +#define KEY_STATE() (PINB & (1<<0)) +#define KEY_PREV_ON() (PORTB |= (1<<1)) +#define KEY_PREV_OFF() (PORTB &= ~(1<<1)) +// Power supply switching +#define KEY_POWER_ON() do { \ + KEY_INIT(); \ + PORTB &= ~(1<<5); \ + _delay_ms(1); \ +} while (0) +#define KEY_POWER_OFF() do { \ + DDRB &= ~0x3F; \ + PORTB &= ~0x3F; \ + DDRC &= ~0x0F; \ + PORTC &= ~0x0F; \ +} while (0) +#endif + +#endif diff --git a/keyboards/hhkb/keymaps/default/compiled.hex b/keyboards/hhkb/keymaps/default/compiled.hex new file mode 100644 index 0000000000..b3af695270 --- /dev/null +++ b/keyboards/hhkb/keymaps/default/compiled.hex @@ -0,0 +1,1381 @@ +:100000000C9452060C9496060C9496060C94960644 +:100010000C9496060C9496060C9496060C949606F0 +:100020000C9496060C9496060C945A110C942C126F +:100030000C941C1F0C9496060C9496060C94960631 +:100040000C9496060C9496060C9496060C949606C0 +:100050000C9496060C94BC1F0C9496060C94960671 +:100060000C9496060C9496060C9496060C949606A0 +:100070000C9496060C9496060C9496060C94960690 +:100080000C9496060C9496060C9496060C94960680 +:100090000C9496060C9496060C9496060C94960670 +:1000A0000C9496060C9496060C9496069912BB1224 +:1000B000A913BB12A91300132313A91378138B13CD +:1000C0006516651694169416D316F316231823187E +:1000D000FE162318AE17AE171418231823181D1870 +:1000E000BB17BB17BB17BB17BB17BB17BB17BB1780 +:1000F000BB17BB17BB17BB17BB17BB17BB17BB1770 +:10010000CB17D917E017E717F117253032583A20E7 +:10011000253038620A000A722F63203031323334BE +:100120003536370A001F0014001A00160004001D9F +:10013000001B000600200021001500080007000930 +:100140000019000500220023001C0017000A000B04 +:1001500000110000001E0029002B00E000E100E279 +:1001600000E3002C002400250018000C000E000DF8 +:100170000010000000310035002A0028000152E57F +:1001800000E600E700260027001200130033000FEE +:1001900000360000002D002E0030002F0034003803 +:1001A00000370000003B0001000100A900AA000187 +:1001B00000010001003C003D0001000100A8000119 +:1001C00000010001003E003F000100010001005558 +:1001D00000570000003A00A50039000100010001AD +:1001E000000100010040004100010046004A0054A7 +:1001F000005600000049004C002A00580001000190 +:100200000001000100420043004700480050004B3D +:10021000004D00000044004500010052004F005115 +:10022000004E0000000A44454255473A20656E6181 +:10023000626C65642E0A005B735D004B6579626FCA +:100240006172642073746172742E0A005B575D00E2 +:100250005B535D005B525D005B445D005B435D0092 +:100260001203480048004B00420020006D006F0060 +:10027000640000000C0371002E006D002E006B0066 +:1002800000000403090409027400040100A0FA0933 +:100290000400000103010100092111010001223FB6 +:1002A000000705810308000A090401000103010297 +:1002B00000092111010001224D00070582030800F9 +:1002C0000A090402000103000000092111010001D4 +:1002D0002236000705830308000A0904030002030D +:1002E00000000009211101000122200007058403FC +:1002F0002000010705040320000112011001000085 +:100300000008EDFEFECA0401010200010631FF09EA +:1003100074A1010975150025FF9520750881020952 +:1003200076150025FF952075089102C0050109800A +:10033000A101850216010026B7001A01002AB700A4 +:10034000751095018100C0050C0901A101850316F6 +:100350000100269C021A01002A9C02751095018159 +:1003600000C005010902A1010901A1000509190147 +:100370002905150025019505750181029501750373 +:1003800081010501093009311581257F9502750824 +:10039000810609381581257F950175088106050CB0 +:1003A0000A38021581257F950175088106C0C005B0 +:1003B000010906A101050719E029E71500250195A6 +:1003C0000875018102950175088101050819012947 +:1003D00005950575019102950175039101050719B0 +:1003E0000029FF150025FF950675088100C00A0049 +:1003F0002530325820006B6579626F6172645F72DC +:1004000065706F72743A20004B6579626F61726437 +:10041000204C4544732073746174653A2025780A32 +:1004200000646F6E652E0A00626F6F676D616769A9 +:1004300063207363616E3A202E2E2E2000290A005D +:100440002575002F002575005D280025640020001B +:10045000256400200025640020002564007C002520 +:10046000303258006D6F7573656B6579205B62740F +:100470006E7C782079207620685D287265702F6107 +:10048000636C293A205B006D6B5F776865656C5F14 +:1004900074696D655F746F5F6D6178203D202564C0 +:1004A0000A006D6B5F776865656C5F6D61785F737F +:1004B00070656564203D2025640A006D6B5F74697A +:1004C0006D655F746F5F6D6178203D2025640A0063 +:1004D0006D6B5F6D61785F7370656564203D20258D +:1004E000640A006D6B5F696E74657276616C203DA5 +:1004F0002025640A006D6B5F64656C6179203D2086 +:1005000025640A006D6B5F776865656C5F74696D63 +:10051000655F746F5F6D6178203D2025640A006D12 +:100520006B5F776865656C5F6D61785F737065653B +:1005300064203D2025640A006D6B5F74696D655F02 +:10054000746F5F6D6178203D2025640A006D6B5FDC +:100550006D61785F7370656564203D2025640A00D5 +:100560006D6B5F696E74657276616C203D202564E9 +:100570000A006D6B5F64656C6179203D2025640A1B +:10058000000A00257500363A20776865656C5F744F +:10059000696D655F746F5F6D61783A20000A0025B0 +:1005A0007500353A20776865656C5F6D61785F73BB +:1005B000706565643A20000A00257500343A20749D +:1005C000696D655F746F5F6D61783A20000A002580 +:1005D0007500333A206D61785F73706565643A2009 +:1005E000000A00257500323A20696E7465727661E2 +:1005F0006C286D73293A20000A00257500313A20D5 +:1006000064656C6179282A31306D73293A20000ABB +:10061000092D2056616C756573202D0A004D3E0032 +:100620004D25643E20003F0073657420646566615B +:10063000756C740A00433E2000776865726520641B +:10064000656C74613A20637572736F723D25642C1A +:1006500020776865656C3D25640A5365652068747C +:1006600074703A2F2F656E2E77696B6970656469B7 +:10067000612E6F72672F77696B692F4D6F75736588 +:100680005F6B6579730A000A092D204D6F757365DC +:100690006B6579202D0A4553432F713A09717569AD +:1006A000740A313A0964656C6179282A31306D73B6 +:1006B000290A323A09696E74657276616C286D7325 +:1006C000290A333A096D61785F73706565640A348D +:1006D0003A0974696D655F746F5F6D61780A353AC8 +:1006E00009776865656C5F6D61785F7370656564D7 +:1006F0000A363A09776865656C5F74696D655F7481 +:100700006F5F6D61780A0A703A097072696E7420C1 +:1007100076616C7565730A643A0973657420646563 +:100720006661756C74730A75703A092B310A646FCF +:10073000776E3A092D310A706775703A092B31309E +:100740000A7067646F776E3A092D31300A0A737048 +:10075000656564203D2064656C7461202A206D61AC +:10076000785F7370656564202A2028726570656102 +:1007700074202F2074696D655F746F5F6D617829D7 +:100780000A003F004D3E2000433E20004C25640AF5 +:100790000074696D65725F636F756E743A20253001 +:1007A000346C580A006B6579626F6172645F6964CA +:1007B0006C653A2025580A006B6579626F61726436 +:1007C0005F70726F746F636F6C3A2025580A00680F +:1007D0006F73745F6B6579626F6172645F6C65647F +:1007E0007328293A2025580A000A092D20537461DC +:1007F000747573202D0A004743433A20342E392E56 +:1008000032204156522D4C4942433A20312E382E47 +:1008100031204156525F415243483A206176723549 +:100820000A004F5054494F4E533A204C55464120F0 +:10083000424F4F544D41474943204D4F5553454B2F +:1008400045592045585452414B455920434F4E532A +:100850004F4C4520434F4D4D414E44203531320AD7 +:10086000004255494C443A20313637313865662DBF +:100870006469727479202832333A33393A32382035 +:100880004A756E2020392032303136290A00564907 +:10089000443A2030784645454428712E6D2E6B2908 +:1008A000205049443A203078434146452848484B37 +:1008B00042206D6F6429205645523A2030783031FD +:1008C00030340A00444553433A20712E6D2E6B207C +:1008D0006B6579626F617264206669726D776172AF +:1008E0006520666F722048484B420A000A092D2095 +:1008F00056657273696F6E202D0A000A092D204318 +:100900006F6E736F6C65202D0A4553432F713A0942 +:10091000717569740A6D3A096D6F7573656B6579E8 +:100920000A000A092D204D61676963202D0A443AA7 +:10093000094465627567204D65737361676520546E +:100940006F67676C650A583A094D6174726978205F +:100950004465627567204D6F646520546F67676CEE +:1009600065202D2053686F77206B657970726573F1 +:1009700073657320696E206D617472697820677287 +:1009800069640A4B3A094B6579626F61726420446D +:100990006562756720546F67676C65202D2053680A +:1009A0006F77206B65797072657373207265706FF5 +:1009B00072740A4D3A094465627567204D6F75730C +:1009C0006520546F67676C650A563A0956657273FD +:1009D000696F6E0A533A095374617475730A433A26 +:1009E00009416374697661746520436F6E736F6C3F +:1009F00065204D6F64650A46312D4631303A095302 +:100A0000776974636820746F204C61796572203057 +:100A10002D392028463130203D204C30290A302DF8 +:100A2000393A0953776974636820746F204C61798F +:100A3000657220302D390A4553433A09537769745A +:100A4000636820746F204C617965722030202861C2 +:100A50006C7465726E617465206B65792031290A4A +:100A600047524156453A0953776974636820746F59 +:100A7000204C6179657220302028616C7465726E3B +:100A8000617465206B65792032290A5041555345C0 +:100A90003A094A756D7020746F20426F6F746C6FE5 +:100AA0006164657220285265736574290A453A09A4 +:100AB0005072696E7420454550524F4D20536574F5 +:100AC00074696E67730A000A002575002E6E6B72DA +:100AD0006F3A20000A002575002E737761705F62FF +:100AE00061636B736C6173685F6261636B73706188 +:100AF00063653A20000A002575002E737761705FE8 +:100B000067726176655F6573633A20000A00257538 +:100B1000002E6E6F5F6775693A20000A0025750028 +:100B20002E737761705F72616C745F726775693A7A +:100B300020000A002575002E737761705F6C616C70 +:100B4000745F6C6775693A20000A002575002E6392 +:100B50006170736C6F636B5F746F5F636F6E7472E1 +:100B60006F6C3A20000A002575002E737761705F64 +:100B7000636F6E74726F6C5F636170736C6F636BC5 +:100B80003A20000A0025303258006B65796D61709B +:100B90005F636F6E6669672E7261773A20000A00A4 +:100BA0002575002E6D6F7573653A20000A00257556 +:100BB000002E6B6579626F6172643A20000A00252D +:100BC00075002E6D61747269783A20000A002575EF +:100BD000002E656E61626C653A20000A0025303295 +:100BE000580064656275675F636F6E6669672E7231 +:100BF00061773A20000A0025750064656661756CAE +:100C0000745F6C617965723A20003F000A6D6F7500 +:100C100073653A206F66660A000A6D6F7573653AF0 +:100C2000206F6E0A000A6B6579626F6172643A2008 +:100C30006F66660A000A6B6579626F6172643A20BA +:100C40006F6E0A000A6D61747269783A206F666689 +:100C50000A000A6D61747269783A206F6E0A000AA0 +:100C600064656275673A206F66660A000A646562A9 +:100C700075673A206F6E0A000A0A4A756D70696ED0 +:100C80006720746F20626F6F746C6F616465722E81 +:100C90002E2E2000433E20006565636F6E666967F7 +:100CA0003A0A000011241FBECFEFDAE0DEBFCDBF4D +:100CB00004B603FE24C08091E0019091E101A0916F +:100CC000E201B091E3018730904BA740B04BB9F4FB +:100CD0001092E0011092E1011092E2011092E30102 +:100CE00014BE84B7877F84BF88E10FB6F8948093E1 +:100CF0006000109260000FBEE0E0FFE3099511E094 +:100D0000A0E0B1E0ECEFF5E502C005900D92A23352 +:100D1000B107D9F711E0A2E3B1E001C01D92A03EF6 +:100D2000B107E1F70E94940E0C94FC2A0C94000089 +:100D3000FF93EF93E0913201F0913301309709F086 +:100D40000995EF91FF910895FC018591803011F094 +:100D5000EFDFFBCF0895FF27E0E230E247FF0CC052 +:100D6000419597FF09C0EDE260957095809590954B +:100D7000611D711D811D911D27FF02C0219530E36A +:100D800050E2AA27660F771F881F991FAA1FA41772 +:100D900010F0A41B63955A95A9F7AA3008F0A95F33 +:100DA000A05DAF93F395611571058105910541F73C +:100DB000ED3211F4EF93F395F21718F43F93F39596 +:100DC000FBCF8F91B5DFFA95E1F70895E991F9919D +:100DD0008591803021F0853219F0AADFF9CF08958E +:100DE00020E0E89455915532C1F3503311F46894E2 +:100DF00055915A3348F4505390F3220F022E220F8C +:100E0000220F200D250FF4CF0EF421958991999191 +:100E1000533619F3533729F1533559F1BC0188275B +:100E20009927E8945C3621F48991999168945591B9 +:100E3000543639F446EF7EF077FF0DC08FEF9FEF09 +:100E40000AC055374AE039F0583540E121F05236B2 +:100E500042E009F00895FF93EF937DDFEF91FF915A +:100E6000B7CFFF93EF93FC0181918030B9F360DF3E +:100E7000FBCFFF93EF9368DFF1CFDF93CF93CDB735 +:100E8000DEB72596A3DFCF91DF9108958FEF84B968 +:100E900080E485B957985F9A2E9A2F98ECE3F1E099 +:100EA00088E08E0F11928E13FDCFE4E3F1E088E02D +:100EB0008E0F11928E13FDCF8CE391E0909347013A +:100EC0008093460184E391E090934501809344012F +:100ED0000895EF92FF920F931F93CF93DF9380912A +:100EE0004401909145012091460130914701309392 +:100EF0004501209344019093470180934601C0E04F +:100F0000D0E0EE24E394F12C0FEF10E020E030E08D +:100F100085B1807C8C2BA90193E0440F551F9A95D5 +:100F2000E1F7842B85B98AE18A95F1F700C0E09159 +:100F30004401F0914501EC0FFD1F808190E0022EED +:100F400002C0959587950A94E2F780FD2F9A95E364 +:100F50009A95F1F70000E6B52E988AE18A95F1F7A7 +:100F600000C04091460150914701DA01AC0FBD1F0E +:100F70004F9B0AC0C701022E01C0880F0A94EAF7EE +:100F800080959C91892308C06C91C701022E01C0F5 +:100F9000880F0A94EAF7862B8C9386B56E2F70E043 +:100FA0008E1728F086B590E0861B970B06C0E6B535 +:100FB000C801861B970B8E0F911D069758F0E09184 +:100FC0004401F0914501EC0FFD1F8081FA01EC0F07 +:100FD000FD1F80839AE19A95F1F700C02F982E9A11 +:100FE0008BE291E00197F1F700C000002F5F3F4FC7 +:100FF0002830310509F08CCFA0914601B09147010E +:10100000AC0FBD1FE0914401F0914501EC0FFD1FB5 +:101010009C918081981751F00E945A1F609348015B +:101020007093490180934A0190934B012196C830F7 +:10103000D10509F06BCF8091D601853021F08091E8 +:10104000D601811111C060914801709149018091D0 +:101050004A0190914B010E94901F613177428105B6 +:10106000910510F00E94DF1E81E0DF91CF911F916A +:101070000F91FF90EF900895209146013091470124 +:10108000F901E80FF11D808108950F931F93CF930D +:10109000DF9386E191E00E94A406C0E0D0E00AE080 +:1010A00011E0E0914601F0914701EC0FFD1F8081B6 +:1010B0000E94C91E1F928F93DF93CF931F930F93AC +:1010C0000E943D0721960F900F900F900F900F9068 +:1010D0000F90C830D10529F7DF91CF911F910F9163 +:1010E00008951F93CF93DF93C7E0D0E010E0E09125 +:1010F0004601F0914701EC0FFD1F808190E00E94B6 +:10110000BD1E180F219798F7812FDF91CF911F9166 +:1011100008950895089561110BC0FC018281882310 +:1011200021F085EE0E94591503C085EE0E94F81546 +:1011300080E090E0089581E0089581E008950C94A6 +:101140009D0808950F931F93CF93DF938C01FC01AB +:10115000C081D181CE010E94871DBE010E944B0932 +:10116000EC01B8010E949F08882309F48DC0F801A2 +:101170008281882309F44AC08091570181111FC0E0 +:10118000C431F0E5DF0709F051C00E94A10881E0F9 +:10119000809357010E944E1F9093560180935501F2 +:1011A00010924E011092500110924F011092520174 +:1011B00010925101109254011092530165C0809118 +:1011C0005501909156010E94661F883C910570F46C +:1011D00080914E01E82FF0E0EE0FFF1FE15BFE4F24 +:1011E000D183C0838F5F80934E014EC0C43880E5A9 +:1011F000D80721F0C538D04501F13AC0F801828105 +:10120000882341F010924C0182E01EC0C438E0E512 +:10121000DE0759F580914C01811106C086E20E94DB +:10122000591586E20E94F81582E01CC0C438F0E52A +:10123000DF0741F3C538D045D9F4F801828188230E +:1012400031F010924D0180E20E9420161DC0809165 +:101250004D01811106C087E20E94591587E20E9464 +:10126000F81580E20E9427160FC0C538D04529F333 +:1012700081E080934C0180934D01C801DF91CF91B3 +:101280001F910F910C949B0880E0DF91CF911F91EB +:101290000F9108950895E72FF0E098E0899FE00D01 +:1012A000F11D112483E0EE0FFF1F8A95E1F7E60F91 +:1012B000F11DEE0FFF1FEB5DFE4F85919491089598 +:1012C000880F991FFC01EB55F0408591949108958A +:1012D000880F991FFC01EB5DFE4F85919491089555 +:1012E0000F931F93CF93DF93EC01811520E39207B7 +:1012F00050F5C11580E2D80708F0C3C0CB3BD1053B +:1013000090F4C83AD10508F06AC0C53AD10508F092 +:101310005BC0C430D10508F0D4C1219709F0CEC11B +:1013200001E010E00EC2CF3FD10511F008F0C9C1B5 +:10133000C03FD10508F0A2C0CE01805E9109089798 +:1013400008F4BFC1BBC1C13090E5D90709F4A2C000 +:1013500020F5C0318FE4D80770F4C11590E4D907A7 +:1013600008F094C0C11521E3D20708F0A7C1DD271A +:101370008E01106CE6C1C115D04509F09FC10E94D5 +:101380008E188FEF94E32CE0815090402040E1F7DD +:1013900000C000000E94E11FD4C1C11597E5D90724 +:1013A00058F4C03121E5D20708F020C1C43180E5EE +:1013B000D80708F479C082C1CE01905781159041B9 +:1013C00008F07CC1DF7077C1C53AD10509F47BC153 +:1013D000C63AD10509F07AC102E810E4B2C1C83AB0 +:1013E000D10509F476C1C93AD10509F475C1CA3AE3 +:1013F000D10509F474C1CB3AD10509F473C1CC3AD3 +:10140000D10509F472C1CD3AD10509F471C1C03BCF +:10141000D10509F470C1CE3AD10509F46FC1CF3AB4 +:10142000D10509F46EC1C13BD10509F46DC1C23BC0 +:10143000D10509F46CC1C33BD10509F46BC1C43BB0 +:10144000D10509F46AC1C53BD10509F469C1C63BA0 +:10145000D10509F468C1C73BD10509F467C1C83B90 +:10146000D10509F466C1C93BD10509F465C1CA3B80 +:10147000D10509F464C100E014E463C18E01106574 +:1014800060C1CE019F700E9468095CC1DF708E014F +:10149000106A57C185E292E00E94A4068091C101C2 +:1014A00081608093C1014DC10E948721811102C0DA +:1014B0000E946D210E94A42190E09093E00180930E +:1014C000DF01C23080E5D80721F48091DF0181601F +:1014D00086C0C43090E5D90721F48091DF01826095 +:1014E0007EC0C63020E5D20721F48091DF01846000 +:1014F00076C0C83080E5D80719F48091DF0127C095 +:10150000CA3090E5D90721F48091DF01806167C07E +:10151000CC3020E5D20721F48091DF0180625FC0EA +:10152000CE3080E5D80721F48091DF01806457C078 +:10153000C03190E5D90721F48091DF0180684FC068 +:10154000C23120E5D20729F48091DF0184608860F0 +:1015500046C0C33080E5D80721F48091DF018E7F3B +:101560003EC0C53090E5D90721F48091DF018D7F21 +:1015700036C0C73020E5D20721F48091DF018B7F90 +:101580002EC0C93080E5D80719F48091DF0126C04C +:10159000CB3090E5D90721F48091DF018F7E1FC009 +:1015A000CD3020E5D20721F48091DF018F7D17C077 +:1015B000CF3080E5D80721F48091DF018F7B0FC009 +:1015C000C13190E5D90721F48091DF018F7707C001 +:1015D000C331D04531F48091DF018B7F877F8093C9 +:1015E000DF018091DF010E94A821ABC08D2F9927D8 +:1015F0008F70992781309105D9F49E01237033278C +:1016000002C0880F991F2A95E2F79C688E0144E07A +:10161000000F111F4A95E1F700271370802B912BC3 +:1016200053E0CC0FDD1F5A95E1F7C076DD272FC0C0 +:101630008230910531F4DC2FCC278E01016F106AC6 +:1016400080C08330910569F4CE018370992701E051 +:1016500010E002C0000F111F8A95E2F7C8019C68D4 +:101660000FC084309105B9F4CE018370992701E051 +:1016700010E002C0000F111F8A95E2F7C8019A68B6 +:1016800023E0CC0FDD1F2A95E1F7C07ED7708C01D7 +:101690000C2B1D2B56C08530910531F4DC2FCC2747 +:1016A0008E01046F106A4DC0069709F04AC0CF71D1 +:1016B000DD27DC2FCC278E01106243C000E010E054 +:1016C00040C08E013EC001E810E43BC003E810E4D6 +:1016D00038C002EE14E435C009EE14E432C00AEE5C +:1016E00014E42FC005EB14E42CC006EB14E429C06D +:1016F00007EB14E426C00CEC14E423C00DEC14E456 +:1017000020C003E815E41DC00AE815E41AC002E988 +:1017100015E417C004E915E414C001E216E411C091 +:1017200003E216E40EC004E216E40BC005E216E480 +:1017300008C006E216E405C007E216E402C00AE2A9 +:1017400016E4C801DF91CF911F910F910895E72F03 +:10175000F0E098E0899FE00DF11D112483E0EE0F89 +:10176000FF1F8A95E1F7E60FF11DEE0FFF1FEB5DFE +:10177000FE4F85919491803E9105E0F4803C910567 +:1017800058F58133910509F46FC048F48932910509 +:1017900009F463C08A32910509F46DC072C08933BF +:1017A0009105E9F082389105D1F08533910509F46E +:1017B0004DC067C0833E910581F138F4803E9105AC +:1017C000B9F0823E9105D9F05CC0863E910561F189 +:1017D000873E9105A1F155C00E94600908952091AE +:1017E000DF0120FD02C021FF4CC080EE90E049C027 +:1017F0008091DF0180FFF9CF89E390E042C08091C2 +:10180000DF0182FF0EC08091DF0184FF03C080E012 +:1018100090E037C083EE90E034C08091DF0182FF1A +:10182000F2CF82EE90E02DC08091DF0183FF0BC0EC +:101830008091DF0184FDEBCF87EE90E022C08091A4 +:10184000DF0183FFF5CF86EE90E01BC08091DF01C2 +:1018500085FF07C089E290E014C08091DF0185FF19 +:10186000F9CF85E390E00DC08091DF0186FF07C0CE +:101870008AE290E006C08091DF0186FFF9CF81E324 +:1018800090E00E947009089508950C94440C809192 +:10189000630108959FB7F89410925A019FBF9091E9 +:1018A000D601943009F057C09091E9009F703091B3 +:1018B000EC00232F217030FD20E8922B24E02093B0 +:1018C000E9002091EB0020FF43C02091EE0027FFAC +:1018D0003FC020915801222321F02091E80025FFEC +:1018E00037C01092580126E03091E80035FD15C050 +:1018F0003091D601343061F53091EB0035FD28C0D0 +:10190000215021F481E08093580122C0EFE9FFE0EB +:101910003197F1F700C00000E7CF8093F10080918C +:10192000E80085FD0AC08091E80080FFFCCF80912F +:10193000E8008E778093E80006C08FB7F89421E026 +:1019400020935A018FBF9F709093E90080E0089523 +:101950009F709093E9008FEF0895CF93DF9300D0AD +:101960001F92CDB7DEB79C018091D601843019F566 +:1019700093E099833B832A839093E9008FEF9091C2 +:10198000E800815095FD06C095ED9A95F1F70000AD +:101990008111F5CF8091E80085FF0DC040E050E057 +:1019A00063E070E0CE0101960E944A0F8091E8004A +:1019B0008E778093E8000F900F900F90DF91CF917A +:1019C0000895CF93DF9300D01F92CDB7DEB720915B +:1019D000D601243021F522E029839B838A8383E08A +:1019E0008093E9008FEF9091E800815095FD06C04B +:1019F00095ED9A95F1F700008111F5CF8091E800FF +:101A000085FF0DC040E050E063E070E0CE0101963C +:101A10000E944A0F8091E8008E778093E8000F9033 +:101A20000F900F90DF91CF9108952091D60124302F +:101A3000F1F422E02093E9002FEF3091E8002150EB +:101A400035FD06C035ED3A95F1F700002111F5CFCF +:101A50002091E80025FF0BC040E050E065E070E019 +:101A60000E944A0F8091E8008E778093E8000895E5 +:101A7000CF93DF932091D601243039F521E02093D4 +:101A8000E9002FEF3091E800215035FD06C035ED1B +:101A90003A95F1F700002111F5CF2091E80025FFDC +:101AA00014C0EC0140E050E068E070E00E944A0F92 +:101AB0008091E8008E778093E80088E0FE01ABE536 +:101AC000B1E001900D928A95E1F7DF91CF910895F1 +:101AD0008CE592E00E94A4068091D501811109C095 +:101AE0000E94DF100E943C118091E200846080938C +:101AF000E200089588E592E00E94A4061092D501C4 +:101B0000089584E592E00C94A40680E592E00C949C +:101B1000A4068CE492E00E94A4060C94161F209167 +:101B200059012F5F822F62E30E948C2A992319F0BA +:101B30002093590108951092590180915A018823E8 +:101B400071F18091D601843041F58091E9008F7068 +:101B50002091EC00922F917020FD90E8892B94E069 +:101B60009093E9009091EB0090FF14C09091EE00EB +:101B700097FF10C09091E80095FF03C01092F1000C +:101B8000F9CF9091E80090FF05C09091E8009E7712 +:101B90009093E8008F708093E90010925A010895A5 +:101BA00042E061EC81E00E94591042E061EC82E089 +:101BB0000E94591042E061EC83E00E94591042E219 +:101BC00061EC84E00C9459108091D801833009F4C1 +:101BD00053C030F4813071F0823009F48CC0089524 +:101BE0008A3009F478C08B3009F45EC0893009F07E +:101BF0009AC020C08091D701813A09F094C08091A9 +:101C0000E800877F8093E8008091DB019091DC0100 +:101C1000892B21F468E08BE591E003C060E080E06F +:101C200090E070E00E94950F8091E8008B778093A0 +:101C3000E80008958091D701813209F074C0809145 +:101C4000DB019091DC01892B09F06DC08091E800E7 +:101C5000877F8093E8008091E80082FD05C0809135 +:101C6000D6018111F8CF5FC08091F10080936301AC +:101C70008091E8008B7753C08091D701813A09F0B9 +:101C800052C08091DB019091DC01892B09F04BC09F +:101C90008091E800877F8093E8008091E80080FFD2 +:101CA000FCCF80910A0136C08091D7018132D9F5ED +:101CB0008091DB019091DC01892BA9F58091E800EE +:101CC000877F8093E8000E948E108091D9018093D5 +:101CD0000A010C948E188091D701813221F58091F0 +:101CE000E800877F8093E8000E948E108091DA01DF +:101CF0008093640108958091D701813AA1F4809185 +:101D0000E800877F8093E8008091E80080FFFCCFA7 +:101D1000809164018093F1008091E8008E77809338 +:101D2000E8000C948E10089584B7877F84BF88E103 +:101D30000FB6F89480936000109260000FBE90E0A0 +:101D400080E80FB6F89480936100909361000FBE15 +:101D50000E946E140E94DF100E943C118091E200EC +:101D600084608093E2008AE49CE00E94B81E78942C +:101D70000E94C1130E94701480E091E00E94DC1365 +:101D80008BE392E00E94A4068091D601853089F40D +:101D900087E392E00E94A4060E94DF1E8091D40196 +:101DA000882391F30E94081F882371F30E94340F47 +:101DB000EBCF0E949414E8CF292F3327233031052D +:101DC000C9F064F42130310581F02230310509F089 +:101DD00043C084E790E026E832E042C0213231057A +:101DE000F1F02232310541F137C082E190E02AEF73 +:101DF00032E036C099278130910541F0823091055B +:101E000041F0892B49F5E2E8F2E005C0E4E7F2E0B1 +:101E100002C0E0E6F2E0849190E09F0121C06430CE +:101E2000D8F4E62FF0E0EE0FFF1FE15EFE4F2081B9 +:101E3000318189E090E014C0643070F470E0FB01FF +:101E4000EE0FFF1FE95EFE4F20813181FB01ED5E49 +:101E5000FE4F808190E004C080E090E020E030E020 +:101E6000FA0131832083089580E189BD82E189BD33 +:101E700009B400FEFDCF8091D8008F7D8093D800FB +:101E80008091E00082608093E0008091E00081FD1D +:101E9000FCCF0895CF92DF92EF92FF920F931F93A2 +:101EA000CF93DF93EC018B016A010E94AD10811189 +:101EB00033C0C114D10439F0F60180819181081B2F +:101EC000190BC80FD91FE12CF12C0115110519F1BF +:101ED0008091E80085FD16C08091E8008E778093A0 +:101EE000E800C114D10449F0F60180819181E80E27 +:101EF000F91EF182E08285E00FC00E94AD108823B8 +:101F000021F30AC089918093F10001501109FFEF7C +:101F1000EF1AFF0ADACF80E0DF91CF911F910F9186 +:101F2000FF90EF90DF90CF9008952091DD013091E8 +:101F3000DE012617370748F06115710539F4209145 +:101F4000E8002E772093E80001C0B90140E0611558 +:101F50007105A9F12091D601222309F443C025304F +:101F600009F442C02091E80023FD40C02091E80020 +:101F700022FD32C02091E80020FFE9CF4091F3001C +:101F80002091F20030E0342BFC01CF016115710586 +:101F900059F02830310540F481918093F10061506F +:101FA00071092F5F3F4FF1CF41E02830310509F033 +:101FB00040E02091E8002E772093E800C8CF41113F +:101FC000C9CF0AC08091D601882361F0853061F0C5 +:101FD0008091E80083FD0AC08091E80082FFF2CF83 +:101FE00080E0089582E0089583E0089581E00895F7 +:101FF0002091DD013091DE012617370748F0611589 +:10200000710539F42091E8002E772093E80001C093 +:10201000B901FC0120E06115710591F18091D601B3 +:10202000882309F440C0853009F43FC08091E8005E +:1020300083FD3DC08091E80082FD2FC08091E800C3 +:1020400080FFE9CF2091F3008091F20090E0922B85 +:102050006115710559F08830910540F42491209361 +:10206000F1003196615071090196F2CF21E0089795 +:1020700009F020E08091E8008E778093E800CBCFD4 +:102080002111CCCF0AC08091D601882361F0853020 +:1020900061F08091E80083FD0AC08091E80082FF32 +:1020A000F2CF80E0089582E0089583E0089581E012 +:1020B0000895982F973058F59093E900981739F0C4 +:1020C0007091EC002091ED005091F00003C0242F9E +:1020D000762F50E021FF19C03091EB003E7F309306 +:1020E000EB003091ED003D7F3093ED003091EB003F +:1020F00031603093EB007093EC002093ED0050932F +:10210000F0002091EE0027FF07C09F5FD3CF8F70B4 +:102110008093E90081E0089580E008958091D701DF +:1021200087FF11C08091E80082FD05C08091D60133 +:102130008111F8CF11C08091E8008B770BC080919E +:10214000D601882349F08091E80080FFF8CF809184 +:10215000E8008E778093E80008952091E4003091A4 +:10216000E50095E64091EC00842F817040FF22C08D +:102170008091E80080FD1CC08091D601882391F0F9 +:10218000853091F08091EB0085FD10C04091E40016 +:102190005091E5004217530729F39A01915011F726 +:1021A00084E0089582E0089583E0089581E0089531 +:1021B00080E008954091E80042FFDECF08950E943C +:1021C0004D110E945511E0EEF0E080818160808326 +:1021D000E8EDF0E080818F77808319BCA7EDB0E057 +:1021E0008C918E7F8C9380818F7E80831092D5011D +:1021F00008950F931F93CF93DF930E944D110E9478 +:102200005511C8EDD0E088818F77888388818068F8 +:10221000888388818F7D888319BC1092D6011092A3 +:10222000D2011092D4011092D30100EE10E0F80117 +:1022300080818B7F808388818160888342E060E039 +:1022400080E00E945910E1EEF0E080818E7F808373 +:10225000E2EEF0E08081816080838081886080830D +:10226000F80180818E7F8083888180618883DF91FF +:10227000CF911F910F910895E8EDF0E080818F7E5E +:102280008083E7EDF0E080818160808384E082BF1D +:1022900081E08093D5010C94F910E8EDF0E08081A5 +:1022A0008E7F80831092E20008951092DA001092DF +:1022B000E10008951F920F920FB60F9211242F93F1 +:1022C0003F934F935F936F937F938F939F93AF93BE +:1022D000BF93EF93FF938091E10082FF0BC0809149 +:1022E000E20082FF07C08091E1008B7F8093E100D4 +:1022F0000E948F0D8091DA0080FF1FC08091D8006E +:1023000080FF1BC08091DA008E7F8093DA0080917D +:10231000D90080FF0DC080E189BD82E189BD09B48B +:1023200000FEFDCF81E08093D6010E94680D05C0BC +:1023300019BC1092D6010E947A0D8091E10080FFB5 +:1023400019C08091E20080FF15C08091E2008E7F6D +:102350008093E2008091E20080618093E2008091AE +:10236000D80080628093D80019BC85E08093D601A4 +:102370000E94850D8091E10084FF30C08091E200D1 +:1023800084FF2CC080E189BD82E189BD09B400FED3 +:10239000FDCF8091D8008F7D8093D8008091E1009F +:1023A0008F7E8093E1008091E2008F7E8093E20037 +:1023B0008091E20081608093E2008091D2018823C5 +:1023C00011F084E007C08091E30087FD02C081E046 +:1023D00001C083E08093D6010E94890D8091E100C5 +:1023E00083FF29C08091E20083FF25C08091E10036 +:1023F000877F8093E10082E08093D6011092D20122 +:102400008091E1008E7F8093E1008091E2008E7FD9 +:102410008093E2008091E20080618093E20042E0DC +:1024200060E080E00E9459108091F0008860809305 +:10243000F0000E94810DFF91EF91BF91AF919F91AC +:102440008F917F916F915F914F913F912F910F905D +:102450000FBE0F901F9018951F920F920FB60F92FC +:1024600011242F933F934F935F936F937F938F9399 +:102470009F93AF93BF93CF93DF93EF93FF93C0915D +:10248000E900CF708091EC00D82FD17080FDD0E8AA +:102490001092E9008091F000877F8093F00078949B +:1024A0000E9470121092E9008091F0008860809381 +:1024B000F000CD2BCF70C093E900FF91EF91DF9139 +:1024C000CF91BF91AF919F918F917F916F915F91CC +:1024D0004F913F912F910F900FBE0F901F90189525 +:1024E0001F93CF93DF93CDB7DEB7AA970FB6F894BB +:1024F000DEBF0FBECDBFE7EDF1E088E08E0F90911B +:10250000F10091938E13FBCF0E94E40D8091E800BF +:1025100083FF1FC18091D7019091D801492F50E0CE +:102520004A30510508F015C1FA01EA5AFF4F0C94E0 +:10253000AC2A803881F0823809F00BC18091DB0130 +:102540008F708093E9008091EB0085FB882780F9EC +:102550001092E90006C08091D3019091D4019111AD +:1025600082609091E800977F9093E8008093F1005B +:102570001092F100C8C0282F2D7F09F0EAC08823EF +:1025800019F0823061F0E5C08091D901813009F005 +:10259000E0C0933009F080E08093D4012BC080919B +:1025A000D901811127C08091DB018F7009F4D1C05E +:1025B0008093E9002091EB0020FF1CC0933021F4B0 +:1025C0008091EB00806214C09091EB009061909339 +:1025D000EB0021E030E0A90102C0440F551F8A95AD +:1025E000E2F74093EA001092EA008091EB008860E5 +:1025F0008093EB001092E9008091E800877F86C00D +:102600008111A7C01091D9011F778091E3008078D4 +:10261000812B8093E3008091E800877F8093E8001E +:102620000E948E108091E80080FFFCCF8091E30033 +:1026300080688093E300111102C082E001C083E052 +:102640008093D60186C08058823008F082C0809185 +:10265000D9019091DA018C3D53E0950779F583E03B +:102660008A838AE289834FB7F894DE01139620E0CB +:102670003EE051E2E32FF0E050935700E49120FF59 +:1026800003C0E295EF703F5FEF708E2F90E0EA306D +:1026900010F0C79601C0C0968D939D932F5F243193 +:1026A00049F74FBF8091E800877F8093E8006AE296 +:1026B00070E0CE0101960E94950F14C0AE014F5FED +:1026C0005F4F6091DB010E94DC0EBC01009709F4B2 +:1026D00040C09091E800977F9093E80089819A81AB +:1026E0000E94F80F8091E8008B778093E80031C05A +:1026F000803879F58091E800877F8093E8008091A9 +:10270000D2018093F1008091E8008E778093E800F9 +:102710000E948E101EC081111CC09091D901923070 +:10272000C0F48091E800877F8093E8009093D20105 +:102730000E948E108091D201811106C08091E30029 +:1027400087FD02C081E001C084E08093D6010E9431 +:10275000D00D8091E80083FF0AC08091E800877F58 +:102760008093E8008091EB0080628093EB00AA9652 +:102770000FB6F894DEBF0FBECDBFDF91CF911F9192 +:102780000895CF938091D6018823A1F0C091E900EC +:10279000CF709091EC00892F817090FD80E8C82B5C +:1027A0001092E9008091E80083FD0E947012CF70C2 +:1027B000C093E900CF91089590936A0180936901D5 +:1027C0000895E0916901F0916A01309721F001903C +:1027D000F081E02D099480E00895EF92FF920F932D +:1027E0001F93CF93DF93E0916901F0916A013097D5 +:1027F000B1F18C010280F381E02D09958091C10136 +:1028000082FF2DC080FF04C086EF93E00E94A406E3 +:10281000E80118E080EFE82E83E0F82E8091C101F6 +:1028200080FF0BC088811F928F93FF92EF920E94CE +:102830003D070F900F900F900F901150219611119E +:10284000EDCF8091C10180FF0AC08EEE93E0DF9151 +:10285000CF911F910F91FF90EF900C94A406DF9100 +:10286000CF911F910F91FF90EF900895E091690132 +:10287000F0916A01309721F00480F581E02D0994F0 +:10288000089520916701309168018217930771F0D4 +:102890009093680180936701E0916901F0916A016A +:1028A000309721F00680F781E02D0994089520915A +:1028B0006501309166018217930771F0909366016C +:1028C00080936501E0916901F0916A01309721F0F0 +:1028D0000084F185E02D0994089508950C946D14F9 +:1028E0000E94451F0E9446070C943F20CF93DF9320 +:1028F0001F92CDB7DEB79091C10192FF10C090FF3B +:102900000EC01F928F9328E034E03F932F9389836A +:102910000E943D070F900F900F900F9089810F90AC +:10292000DF91CF910C94450C9F92AF92BF92CF92C2 +:10293000DF92EF92FF920F931F93CF93DF9300D01C +:1029400000D000D0CDB7DEB70E94690707E010E0E5 +:10295000AA24A394B12C902E802F0E943C089801A9 +:1029600024593E4F6901F901F080F826A1F4015085 +:10297000110988F78FEF89838A831B820E944E1F7B +:102980008160782F9D838C8349815A816B818D81F1 +:102990000E942B152FC09091C10191FF04C08E831E +:1029A0000E9445088E8127E030E0A501022E01C07B +:1029B000440F0A94EAF7E42E4F21C1F029839A824A +:1029C0008E2191E009F490E09B830E944E1F81606C +:1029D000782F9D838C8349815A816B818D810E94E0 +:1029E0002B15F6018081E826E08204C021503109D0 +:1029F000E0F6BDCF0E94A92310916B010E94E11364 +:102A00001817B9F00E94E11380936B0126960FB658 +:102A1000F894DEBF0FBECDBFDF91CF911F910F9114 +:102A2000FF90EF90DF90CF90BF90AF909F900C946D +:102A3000761426960FB6F894DEBF0FBECDBFDF9199 +:102A4000CF911F910F91FF90EF90DF90CF90BF90AB +:102A5000AF909F900895CF93DF93CDB7DEB72B97BC +:102A60000FB6F894DEBF0FBECDBF4F83588769877E +:102A70007A878B87DE01119686E0FD0111928A9597 +:102A8000E9F785E0FE01379601900D928A95E1F70E +:102A900049815A816B817C818D819E810E942C1B92 +:102AA0002B960FB6F894DEBF0FBECDBFDF91CF914E +:102AB0000895CF93882309F499C0C82F8CEF8C0F09 +:102AC000813A48F48C2F0E94152881118FC08C2FD9 +:102AD0000E94061E0CC080E28C0F883058F4C7702C +:102AE00081E001C0880FCA95EAF70E94421ECF918B +:102AF0000C94891E8BE58C0F833078F4C53A29F04D +:102B0000C63A31F083E890E005C081E890E002C069 +:102B100082E890E0CF910C94411488E58C0F8331CA +:102B200008F064C0C83A39F1C93A41F1CA3A49F1EA +:102B3000CB3A51F1CC3A59F1CD3A61F1C03B69F150 +:102B4000CE3A71F1CF3A79F1C13B81F1C23B89F1C3 +:102B5000C33B91F1C43B99F1C53BA1F1C63BA9F13F +:102B6000C73BB1F1C83BB9F1C93BC1F1CA3BC9F19F +:102B700080E090E038C082EE90E035C089EE90E0D1 +:102B800032C08AEE90E02FC085EB90E02CC086EB3F +:102B900090E029C087EB90E026C08CEC90E023C049 +:102BA0008DEC90E020C083E891E01DC08AE891E0C0 +:102BB0001AC082E991E017C084E991E014C081E273 +:102BC00092E011C083E292E00EC084E292E00BC07A +:102BD00085E292E008C086E292E005C087E292E0DA +:102BE00002C08AE292E0CF910C945714CF910895DD +:102BF000882329F19CEF980F913A18F40E94231E24 +:102C00000DC090E2980F983058F4877091E001C0A1 +:102C1000990F8A95EAF7892F0E94481E0C94891E05 +:102C20009BE5980F933020F480E090E00C944114E1 +:102C3000885A833120F480E090E00C945714089572 +:102C4000882321F00E94421E0C94891E0895882337 +:102C500021F00E94481E0C94891E08957F928F9245 +:102C60009F92AF92BF92CF92DF92EF92FF920F931B +:102C70001F93CF93DF931F92CDB7DEB77C01C62E93 +:102C8000772EFC01058102950F70128111110E94AF +:102C90005F1E0E94FF1D882379F0112369F080E2F6 +:102CA0008C0D883048F082E00E94E81D0E94FF1DD4 +:102CB00091E0D82ED92601C0D12CE72DE295EF70F6 +:102CC000F0E0E05AFF4F0C94AC2A872D807F072D4F +:102CD0000F70882311F00295007F112389F00023E3 +:102CE00009F498C180E28C0D883020F4802F0E9476 +:102CF000421E03C0802F0E94521E0E94891E8AC15C +:102D00008C2D0E94F815002309F49DC180E28C0DE2 +:102D1000883020F4802F0E94481E03C0802F0E941C +:102D2000581E0E94891E8FC1872D807F972D9F700E +:102D3000803211F4892F03C0892F8295807FCC20A7 +:102D400021F0F1E0CF16A1F01DC0112339F00023CE +:102D500019F1013009F50E94721E75C1002319F0A6 +:102D6000013009F470C189830E94751E898110C1E8 +:102D7000112321F0063008F066C10EC0053008F0BE +:102D800062C106C1112359F0002331F0F70195818A +:102D900090FF40C19F7095830E94201654C100236C +:102DA00009F4F6C03DC1872D86958695837090E025 +:102DB000009719F0019761F046C1112321F08C2D85 +:102DC000972D937002C080E090E00E9441143BC1B7 +:102DD000112321F08C2D972D937002C080E090E09C +:102DE0000E94571430C18C2D112319F00E942F22FC +:102DF00002C00E9497220E941C2325C1872D837048 +:102E000009F052C011111FC18C2D829586958770D3 +:102E1000880F880F9C2D9F70892E912CA12CB12C8E +:102E2000082E04C0880C991CAA1CBB1C0A94D2F75B +:102E3000C4FE14C00FE010E020E030E0B901A801AA +:102E400004C0440F551F661F771F8A95D2F7CB0128 +:102E5000BA01609570958095909503C060E070E030 +:102E6000CB01272D26952695237030E022303105A1 +:102E700069F02330310589F0682979298A299B294D +:102E80002130310571F00E94741CDDC06829792958 +:102E90008A299B290E94901CD6C00E94741CC501DF +:102EA000B4010E94581CCFC0112319F0872D8170E6 +:102EB00001C08695882309F4C6C08C2D829586951D +:102EC0008770880F880F9C2D9F70892E912CA12CC4 +:102ED000B12C082E04C0880C991CAA1CBB1C0A9497 +:102EE000D2F7C4FE14C00FE010E020E030E0B901DA +:102EF000A80104C0440F551F661F771F8A95D2F79B +:102F0000CB01BA01609570958095909503C060E003 +:102F100070E0CB01272D269526952370422F50E097 +:102F20004230510569F04330510589F0682979290B +:102F30008A299B294130510571F00E944E1D83C0A2 +:102F4000682979298A299B290E946A1D7CC00E94D0 +:102F50004E1DC501B4010E94321D75C08C2D90E03C +:102F6000FC01E05EF109E531F10508F04FC0E059E0 +:102F7000FF4F0C94AC2A0C2D0F70872D8F711123ED +:102F800021F00E94CB1C802F07CF0E94EC1C802FC9 +:102F90000E94271658C0112341F0053008F053C095 +:102FA000872D8F710E94111D4EC0063008F04BC056 +:102FB000F7CF112339F0872D8F710E94CB1C43C0AE +:102FC0001123C9F3872D8F710E94EC1C3CC0112383 +:102FD00029F0872D8F710E94B61C35C00E94AC1C51 +:102FE00032C0112351F0172D1F71812F0E94CB1C6D +:102FF00063E0812F0E94DF1D26C081E00E94E81D52 +:10300000023008F182E00E94E81D1DC0112331F05A +:10301000002389F28C2D0E94591515C0002391F2CE +:103020008C2D0E94F8150FC0472D4F706C2DC701D5 +:103030000E948B080E94D01B06C0472D4F706C2D3C +:10304000C7010E944A09DD20F9F00E94DB1D80FDC6 +:103050001BC0F70112820E94D51D0E94CB1CC70124 +:103060000E9453180E94D51D0F90DF91CF911F91A0 +:103070000F91FF90EF90DF90CF90BF90AF909F9017 +:103080008F907F900C94EC1C0F90DF91CF911F914B +:103090000F91FF90EF90DF90CF90BF90AF909F90F7 +:1030A0008F907F9008950F931F93CF93DF93EC0140 +:1030B000888199812B813C81232BB9F09F3F11F4AA +:1030C0008F3F99F0CE010E94A208882371F0688199 +:1030D00079818A810E94D11D8C010E94861D0E94E7 +:1030E0004D1CB801CE010E942E16DF91CF911F9189 +:1030F0000F9108950E945F1E0E946F1E0E94341E51 +:103100000E94891E0E944F240E941C2380E090E0B0 +:103110000E94411480E090E00C9457140E944F1ECE +:103120000C947A180E94C61D292F22952F7030E02A +:103130002C3031054CF42A3031056CF42250310921 +:1031400022303105A8F407C02C30310569F02F304A +:10315000310551F00DC0803F69F018F4803E40F415 +:1031600009C0843F29F406C093FB882780F908959D +:1031700080E0089581E00895CF93DF9300D000D0E0 +:103180001F92CDB7DEB70F900F900F900F900F905A +:10319000DF91CF910895CF93DF9300D000D000D07E +:1031A000CDB7DEB726960FB6F894DEBF0FBECDBF03 +:1031B000DF91CF9108951F93CF93DF93C091740156 +:1031C00016E080917501C81799F0D0E01C9FF001BE +:1031D0001D9FF00D1124EA58FE4F408151816281FC +:1031E0007381848195810E94CB182196C770E9CFA5 +:1031F000DF91CF911F9108954091A6015091A701B1 +:103200006091A8017091A9018091AA019091AB01F0 +:103210000C94CB188091AB0182958F7009F054C04B +:103220008091A801882309F44FC080917401A09176 +:1032300075016091A6017091A7014091A90150917B +:10324000AA01B6E08A1709F43FC090E04115510584 +:10325000C1F17F3F11F46F3FA1F1B89FF001B99F19 +:10326000F00D1124EA58FE4F218172132AC02081EB +:10327000621327C02281211124C0238134812417A5 +:10328000350710F421503109241B350B283C31053A +:10329000C0F42091AB012F7020612093AB0126E098 +:1032A000289FF001299FF00D1124E558FE4F8081E1 +:1032B0008F708061808386EA91E00E9453180C949D +:1032C000DB1801968770BECF0895CF92DF92EF9200 +:1032D000FF920F931F93CF93DF93CDB7DEB7629723 +:1032E0000FB6F894DEBF0FBECDBF8C0185E0F801AC +:1032F000DE011D9601900D928A95E1F7D8014C915F +:1033000011965C91119712966C9112971396CD902D +:10331000DC9014973091A6017091A7018091A901CA +:103320009091AA01009709F46BC17F3F19F43F3FC8 +:1033300009F466C1E090A801EE2009F4C0C0209114 +:10334000AB01C816D90628F0F601E81BF90BCF012E +:1033500004C0809590958C0D9D1DFF24F394883CAE +:10336000910578F0F12C207F09F0C6C07C2DD98A18 +:10337000C88A89890E94BC1886EA91E00E94531885 +:10338000B1C0822F807F09F046C0751314C034137A +:1033900012C0611110C02F7020612093AB010E94F8 +:1033A000FC1886EA91E00E9453188091AB01D80185 +:1033B00015968C932EC0CD2819F15F3F11F44F3F25 +:1033C000F9F0F62E61111CC08091740120917501F5 +:1033D00036E0821709F45AC090E0389FF001399F17 +:1033E000F00D1124EA58FE4F7181571306C0708109 +:1033F000471303C07281711103C001968770E9CF32 +:10340000F62E662309F418C18091AB018160809388 +:10341000AB01F12C11C1751308C0341306C0611142 +:1034200004C08091AB01D801C3C04D875E878D85F4 +:103430009E856A8B0E9492186A898823E1F166232F +:10344000D1F12091AB01822F82958F7090E002978D +:1034500074F08091A6019091A70198878F831986B7 +:10346000DB86CA862C87CE0107960E94531886E019 +:10347000F801A6EAB1E001900D928A95E1F70E9469 +:103480000A190E94FC18FF24F394D6C04D875E876A +:103490008D859E850E94C61D292F22952F7030E0B4 +:1034A000223031050CF0BCC09F7009F0B6C0805EC0 +:1034B000883008F4C1C0C8010E945318E4CFC81670 +:1034C000D90608F453C0F601E81BF90BCF01883C7C +:1034D000910508F450C0F12C7C2DD98AC88A8989BD +:1034E0000E94BC18E6EAF1E086E0DF011D928A95B1 +:1034F000E9F70E94FC18A0C0751314C0341312C061 +:10350000611110C08091AB01F8018583C8010E9450 +:10351000531886E0E6EAF1E0DF011D928A95E9F7AB +:10352000FE2C8AC04D875E878D859E856A8B0E94A2 +:1035300092186A89882309F4BECF662309F4BBCFA9 +:103540002091AB01822F82958F7090E002970CF44E +:103550008ECF8091A6019091A7019A8389831B82C7 +:10356000DD82CC822E83CE0101967FCF809590950F +:103570008C0D9D1DACCFF62E662309F49CCF7513E0 +:103580002EC034132CC02091AB0120FD1FC0822F10 +:1035900082958F70D9F0D80115962C9315978F309E +:1035A00049F08F5F982F9295907F822F8F70892B93 +:1035B00015968C93C8010E94531886E0F801A6EA7C +:1035C000B1E001900D928A95E1F793CF86E0F80182 +:1035D000A6EAB1E001900D928A95E1F72DC04D87E2 +:1035E0005E878D859E850E949218811140CF8091C3 +:1035F000AB0181608093AB01C801