summaryrefslogtreecommitdiff
path: root/keyboard
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2015-10-22 13:37:45 -0400
committerJack Humbert <jack.humb@gmail.com>2015-10-22 13:37:45 -0400
commitc966e7982c4fa42d7dae6b4f4dca6966b695a973 (patch)
treeeb08b6591c19c6e47f387ee444a3894ef974aff3 /keyboard
parent40148c430e76f8632cf96a1fda96e2dfa594975c (diff)
bluetooth
Diffstat (limited to 'keyboard')
-rw-r--r--keyboard/atomic/extended_keymaps/extended_keymap_default.c2
-rwxr-xr-xkeyboard/atomic/flash-pcb.sh2
-rw-r--r--keyboard/planck/Makefile22
-rw-r--r--keyboard/planck/config.h71
-rw-r--r--keyboard/planck/keymap_midi.c44
-rw-r--r--keyboard/planck/keymaps/keymap_lock.c41
-rwxr-xr-xkeyboard/planck/planck_with_bootloader.hex1796
-rw-r--r--keyboard/preonic/Makefile3
-rw-r--r--keyboard/preonic/beeps.c386
-rw-r--r--keyboard/preonic/beeps.h5
-rw-r--r--keyboard/preonic/extended_keymaps/extended_keymap_lock.c2
-rw-r--r--keyboard/preonic/keymap_midi.c82
-rw-r--r--keyboard/preonic/keymap_midi.h6
13 files changed, 2223 insertions, 239 deletions
diff --git a/keyboard/atomic/extended_keymaps/extended_keymap_default.c b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
index e662c91889..ab08bb6d25 100644
--- a/keyboard/atomic/extended_keymaps/extended_keymap_default.c
+++ b/keyboard/atomic/extended_keymaps/extended_keymap_default.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ┌─ 2u ────────────┐
// │ X │
// └─────────────────┘
- { KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, KC_LCTL, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT },
+ { BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, KC_RGUI, KC_RALT, KC_RCTL, BL_STEP, KC_LEFT, KC_DOWN, KC_RGHT },
// ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
// │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
// └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
diff --git a/keyboard/atomic/flash-pcb.sh b/keyboard/atomic/flash-pcb.sh
index 2ae15458c0..46abc6982a 100755
--- a/keyboard/atomic/flash-pcb.sh
+++ b/keyboard/atomic/flash-pcb.sh
@@ -1,3 +1,3 @@
dfu-programmer atmega32u4 erase --force
-dfu-programmer atmega32u4 flash planck_pcb.hex
+dfu-programmer atmega32u4 flash atomic_pcb.hex
dfu-programmer atmega32u4 reset \ No newline at end of file
diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile
index 2f0ba5ba9d..d9e8ce7889 100644
--- a/keyboard/planck/Makefile
+++ b/keyboard/planck/Makefile
@@ -121,15 +121,16 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
# NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-MIDI_ENABLE = YES # MIDI controls
+# MIDI_ENABLE = YES # MIDI controls
# UNICODE_ENABLE = YES # Unicode
+# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
ifdef MIDI_ENABLE
- SRC += keymap_midi.c \
- beeps.c
+ SRC += keymap_midi.c
+ # beeps.c
endif
ifdef UNICODE_ENABLE
@@ -143,7 +144,18 @@ endif
VPATH += $(TARGET_DIR)
VPATH += $(TOP_DIR)
-include $(TOP_DIR)/protocol/lufa.mk
+
+
+ifdef BLUETOOTH_ENABLE
+ BLUEFRUIT_TRACE_SERIAL=true
+
+ include $(TOP_DIR)/protocol.mk
+ include $(TOP_DIR)/protocol/bluefruit.mk
+ include $(TOP_DIR)/protocol.mk
+else
+ include $(TOP_DIR)/protocol/lufa.mk
+endif
+
include $(TOP_DIR)/common.mk
include $(TOP_DIR)/rules.mk
diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h
index e970127703..0a1a6a9357 100644
--- a/keyboard/planck/config.h
+++ b/keyboard/planck/config.h
@@ -58,16 +58,83 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
+#ifdef BLUETOOTH_ENABLE
+#ifdef __AVR_ATmega32U4__
+ #define SERIAL_UART_BAUD 9600
+ #define SERIAL_UART_DATA UDR1
+ #define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1)
+ #define SERIAL_UART_RXD_VECT USART1_RX_vect
+ #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
+ #define SERIAL_UART_INIT() do { \
+ UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
+ UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8); /* baud rate */ \
+ UCSR1B = (1<<TXEN1); /* TX: enable */ \
+ UCSR1C = (0<<UPM11) | (0<<UPM10) | /* parity: none(00), even(01), odd(11) */ \
+ (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); /* data-8bit(011) */ \
+ sei(); \
+ } while(0)
+#else
+# error "USART configuration is needed."
+#endif
+
+
+// I'm fairly sure these aren't needed, but oh well - Jack
+
+/*
+ * PS/2 Interrupt configuration
+ */
+#ifdef PS2_USE_INT
+/* uses INT1 for clock line(ATMega32U4) */
+#define PS2_CLOCK_PORT PORTD
+#define PS2_CLOCK_PIN PIND
+#define PS2_CLOCK_DDR DDRD
+#define PS2_CLOCK_BIT 1
+
+#define PS2_DATA_PORT PORTD
+#define PS2_DATA_PIN PIND
+#define PS2_DATA_DDR DDRD
+#define PS2_DATA_BIT 0
+
+#define PS2_INT_INIT() do { \
+ EICRA |= ((1<<ISC11) | \
+ (0<<ISC10)); \
+} while (0)
+#define PS2_INT_ON() do { \
+ EIMSK |= (1<<INT1); \
+} while (0)
+#define PS2_INT_OFF() do { \
+ EIMSK &= ~(1<<INT1); \
+} while (0)
+#define PS2_INT_VECT INT1_vect
+#endif
+
+/*
+ * PS/2 Busywait configuration
+ */
+#ifdef PS2_USE_BUSYWAIT
+#define PS2_CLOCK_PORT PORTD
+#define PS2_CLOCK_PIN PIND
+#define PS2_CLOCK_DDR DDRD
+#define PS2_CLOCK_BIT 1
+
+#define PS2_DATA_PORT PORTD
+#define PS2_DATA_PIN PIND
+#define PS2_DATA_DDR DDRD
+#define PS2_DATA_BIT 0
+#endif
+
+#endif
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
-#define NO_DEBUG
+// #define NO_DEBUG
/* disable print */
-#define NO_PRINT
+// #define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
diff --git a/keyboard/planck/keymap_midi.c b/keyboard/planck/keymap_midi.c
index 748ca4d563..b7eba3ab76 100644
--- a/keyboard/planck/keymap_midi.c
+++ b/keyboard/planck/keymap_midi.c
@@ -35,7 +35,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
if (record->event.pressed) {
starting_note++;
- // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
midi_send_cc(&midi_device, 0, 0x7B, 0);
midi_send_cc(&midi_device, 1, 0x7B, 0);
midi_send_cc(&midi_device, 2, 0x7B, 0);
@@ -43,15 +43,15 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
midi_send_cc(&midi_device, 4, 0x7B, 0);
return;
} else {
- // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
- // stop_all_notes();
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
+ stop_all_notes();
return;
}
}
if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
if (record->event.pressed) {
starting_note--;
- // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
midi_send_cc(&midi_device, 0, 0x7B, 0);
midi_send_cc(&midi_device, 1, 0x7B, 0);
midi_send_cc(&midi_device, 2, 0x7B, 0);
@@ -59,8 +59,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
midi_send_cc(&midi_device, 4, 0x7B, 0);
return;
} else {
- // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
- // stop_all_notes();
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
+ stop_all_notes();
return;
}
}
@@ -72,13 +72,13 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
- // stop_all_notes();
- // for (int i = 0; i <= 7; i++) {
- // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
- // _delay_us(80000);
- // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
- // _delay_us(8000);
- // }
+ stop_all_notes();
+ for (int i = 0; i <= 7; i++) {
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ _delay_us(80000);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
+ _delay_us(8000);
+ }
return;
}
if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
@@ -88,23 +88,23 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
- // stop_all_notes();
- // for (int i = 0; i <= 7; i++) {
- // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
- // _delay_us(80000);
- // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
- // _delay_us(8000);
- // }
+ stop_all_notes();
+ for (int i = 0; i <= 7; i++) {
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ _delay_us(80000);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
+ _delay_us(8000);
+ }
return;
}
if (record->event.pressed) {
// midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
- // play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
// midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
- // stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
} \ No newline at end of file
diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c
index 4fe2e0a2bf..b844d1cdab 100644
--- a/keyboard/planck/keymaps/keymap_lock.c
+++ b/keyboard/planck/keymaps/keymap_lock.c
@@ -2,7 +2,7 @@
#include "backlight.h"
#include "action_layer.h"
#include "keymap_midi.h"
-#include "beeps.h"
+#include <avr/boot.h>
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Qwerty */
@@ -53,6 +53,16 @@ const uint16_t PROGMEM fn_actions[] = {
};
+uint16_t hextokeycode(int hex) {
+ if (hex == 0x0) {
+ return KC_0;
+ } else if (hex < 0xA) {
+ return KC_1 + (hex - 0x1);
+ } else {
+ return KC_A + (hex - 0xA);
+ }
+}
+
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
@@ -64,6 +74,35 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
backlight_set(BACKLIGHT_LEVELS);
default_layer_and(0);
default_layer_or((1<<5));
+
+ uint8_t low = boot_lock_fuse_bits_get(0x0000);
+ uint8_t high = boot_lock_fuse_bits_get(0x0003);
+ uint8_t ext = boot_lock_fuse_bits_get(0x0002);
+ uint8_t lock = boot_lock_fuse_bits_get(0x0001);
+
+ register_code(hextokeycode((low & 0xF0) >> 4));
+ unregister_code(hextokeycode((low & 0xF0) >> 4));
+ register_code(hextokeycode((low & 0x0F)));
+ unregister_code(hextokeycode((low & 0x0F)));
+
+
+ register_code(hextokeycode((high & 0xF0) >> 4));
+ unregister_code(hextokeycode((high & 0xF0) >> 4));
+ register_code(hextokeycode((high & 0x0F)));
+ unregister_code(hextokeycode((high & 0x0F)));
+
+
+ register_code(hextokeycode((ext & 0xF0) >> 4));
+ unregister_code(hextokeycode((ext & 0xF0) >> 4));
+ register_code(hextokeycode((ext & 0x0F)));
+ unregister_code(hextokeycode((ext & 0x0F)));
+
+
+ register_code(hextokeycode((lock & 0xF0) >> 4));
+ unregister_code(hextokeycode((lock & 0xF0) >> 4));
+ register_code(hextokeycode((lock & 0x0F)));
+ unregister_code(hextokeycode((lock & 0x0F)));
+
// note(0+12, 20);
// note(0+24, 20);
} else {
diff --git a/keyboard/planck/planck_with_bootloader.hex b/keyboard/planck/planck_with_bootloader.hex
new file mode 100755
index 0000000000..c61dfb743a
--- /dev/null
+++ b/keyboard/planck/planck_with_bootloader.hex
@@ -0,0 +1,1796 @@
+:020000020000FC
+:047000000C948D3E21
+:047028000C94B73DD0
+:10702F0012010002FF010020EB03F42F0000010208
+:10703F00030109021200010100803209040000005F
+:10704F00000000000C03410054004D0045004C00AF
+:10705F001603410054006D00330032005500340018
+:10706F004400460055000C0331002E0030002E0066
+:10707F0030000403090416010C0100000C0000018C
+:02708F006C7F14
+:1070920012BD01BDF89A00B5089501E00895F9996D
+:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929
+:1070B200FECF0C944938F80104910895F8013491F7
+:1070C20031962491890108950091610000930C0189
+:1070D20000E80093610001E00093610005BF02E057
+:1070E20005BF0C9486380091D70001600093D70049
+:1070F200A89507EF04BF0091600000610093600053
+:1071020000E00093600001E008950E94AA3D0E9401
+:10711200B53DFDCF0CD00F7708D0006806D00061D6
+:1071220004D0016028D0789408950093D80000918B
+:10713200D8000895FCDF00621ED04CD009B500FFD4
+:10714200FDCFF5DF0F7D17D00091E0000E7F009399
+:10715200E0000091E000077F0093E0000091E20070
+:1071620001600093E2000091E20008600093E200F7
+:1071720078940C94743B0093D800089500910D010B
+:10718200002359F40091D90000FF07C0D0DF006846
+:10719200F2DF01E000930D01CDDFE0E2F2E00081D9
+:1071A200018100FF0DC0008111811E7F11830083C8
+:1071B20001E00093EA0000E00093EA0000931E025F
+:1071C20000E00093E9000091E80003FF02C00E9482
+:1071D200F23B0895A89539D000E40093600000E0E6
+:1071E200009381000093800010E0009385000093DB
+:1071F200840001E006BB00918100036000938100DE
+:107202000091600007FFFCCF00E80093600010933C
+:107212008100A89507EF04BF18D010936000209159
+:1072220084003091850010938100109380001093A8
+:1072320085001093840001E006BB2D3D354010F01F
+:1072420002E101C002E009BD089500916000006101
+:107252000093600008950E94AD3E239741D100E063
+:1072620000930901B5D104811581012B51F437D165
+:1072720000910701002309F4B9C000E0009307015F
+:10728200B5C058D102FFFDCF37D1068335D1009367
+:107292000F0132D1009310012FD1009311012CD193
+:1072A2000093120129D10093130102852091130149
+:1072B20030911201409111015091100116811A95DD
+:1072C20041F01250A9F01A9599F11A9509F473C078
+:1072D2008BC010910F01113011F411E001C010E0C8
+:1072E200138799D00C3F11F414D17FC077D17DC0A0
+:1072F20092D010910F01112329F01A9549F01A9595
+:10730200A9F073C010E013870C3F09F06EC0ECCFF8
+:1073120056D103C04CD109F468C00D911C9144D1DF
+:107322000F3FC1F305E0009309015FC011E0EBCF0D
+:10733200D2D029F00250E1F10A9541F056C0FDD0B9
+:107342000E94A33F0FEF00930A014FC0552319F08B
+:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE
+:1073620003FFFDCF67D051D04AD008E00093600000
+:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F
+:1073820044D00FEF1FE004C009811A810150104060
+:1073920009831A8309811A81012BB1F700E800934E
+:1073A200610000910C01009361000C940000FFCF7A
+:1073B20001E003871AC08FD019F00A9539F015C081
+:1073C200535098F4BAD002E000870FC0505339F0FE
+:1073D2005A9541F05F52B1F35A95A1F306C002E00B
+:1073E2000883F0CF01E0FCCFA8D079D02396E4E067
+:1073F2000C94BA3E01E005BF00E005BF089500917C
+:10740200D8000F770093D800089509B50D7F09BD04
+:1074120000E009BD08955183408333832283109194
+:10742200E8001B7F1093E8001091E8001F7710938B
+:10743200E80008955DD053D0F8940091E000016017
+:107442000093E000089579D04AC0219749D0009175
+:107452000601035019F00250B9F00BC03CD021F0E4
+:107462000A9559F00A9529F400910A010C3F19F482
+:1074720050D02196089567D0FCCF0091010100936E
+:10748200F100009100010AC01091100124D019F0FE
+:107492000A9549F0EECF135018F400E00093F10082
+:1074A2001ED044D0E6CF105339F01A9539F01F524E
+:1074B20041F01A9541F0F4CF08E5F0CF00E006D094
+:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5
+:1074D20030E00C94113F00910F010023089521C068
+:1074E2000BD008D007D00093040106D00093050109
+:1074F20021D00BC000D008830091F10008950091C3
+:10750200EB0000620093EB0015D0077F0093E800C8
+:107512000895F5DF02E00093080103E000930901FA
+:10752200089559D007D000FFFDCF089503D002FF80
+:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A
+:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD
+:107552002BD00093F1002BD059F43DD0082F092BEA
+:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1
+:10757200042D4394003289F300910B0100230D91F5
+:107582001C9131F311970E945838E3CFD3DF00FFEB
+:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B
+:1075A200CCDFE5E00C94B93E11970C945C380D9158
+:1075B2001C910F5F1F4F1C930E93019708958281B8
+:1075C200938100811181801B910B0196DF01089547
+:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71
+:1075E200F7DF80819181A081B181AF710481158122
+:1075F20000521040048315830AC000910B0100233E
+:1076020031F4A301920103E911E00E943B3F47D00C
+:10761200B8F1662477242C0111C06EDFF301ED5618
+:10762200FE4F008301E0600E00E0701E01960091A3
+:10763200F200002311F033D0B8F47FDF30D0E8F24B
+:10764200F301B096E238F040C0F674DF02FFFDCFDE
+:107652000091F200BDDF24813581201B304024835C
+:107662003583E5CF49DFAA95AA23E1F700910B0103
+:10767200013099F62091F1008C010E945038D6CF4A
+:1076820004811581012B21F055DF02FFFDCF55DF6B
+:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051
+:1076A200F1E0028113810817190708952091EB0078
+:1076B20021602093EB000093EC000091ED0002703A
+:1076C200012B0093ED000091ED0002600093ED00AC
+:1076D2001091EE00012F000F00E0001F0895412FCE
+:1076E2000093E900089500E009D000FD05C000E024
+:1076F200F7DF10E202E0DACF00E00895F1DF009157
+:10770200EB0008950F770132A9F5112369F11A955B
+:1077120059F01A9561F01A9569F01A95F9F01A95CF
+:10772200C1F01A95D9F024C00E942C3920C00E94C1
+:10773200263A1DC029D00091090123D001E01FD0B3
+:1077420020D0009108011BD00E94923A0E94973AE1
+:107752000EC01AD00091080114D007C002E00093B5
+:10776200080100E0009309010FD00E94923A03C081
+:107772000E94803A02C001E0089500E0089501D01D
+:1077820000E00093F10008950091E800077F009364
+:10779200E800089508950350F9F4112339F01A9579
+:1077A20051F01A9581F01A9599F016C004E016D09E
+:1077B20001E810E703C011D003E510E7E7E1F2E0CA
+:1077C20000831183D8CF06E109D00FE510E7F6CF89
+:1077D20004D005E710E7F2CFD0CF0CE000931A02F5
+:1077E200089527D120D100931D02E1D0212F11232A
+:1077F20029F12A95E9F02250F1F0225099F02A95C8
+:1078020049F0225061F02A9581F02A95E1F02A95FB
+:10781200E9F023C0003809F44FC00C94833B0038D0
+:10782200E1F7C8C00023C9F71EC00023B1F72DC07D
+:10783200033098F744C1033080F70BC1003868F376
+:10784200033858F7C9C0013841F77BC1013051F400
+:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA
+:1078620009F41ED008951091E3001078DCD00F7750
+:10787200012B0093E300E9D0ACD000FFFDCF0091D3
+:10788200E30000680093E300089591D0123040F4C1
+:107892000FD010931E02DAD000911E020C94CB3B43
+:1078A2000091EB0001D004C000620093EB00089548
+:1078B2000091E800077FC0C0BA93AA93229700E024
+:1078C2000093190274D0AFD0202F2A9519F02A956F
+:1078D200E9F022C002E100931A020FE210E7E7E1A9
+:1078E200F2E0008311839DD008839DD00983E0DFFD
+:1078F20000911A0210E02881398102171307A8F4B7
+:107902000F7181F401E00093190211C002E10093AA
+:107912001A0201E410E7E3CF0E94CC3B002319F7DF
+:107922008ED040C01093190202C020931A027ED05A
+:10793200A7E1B2E001C08AD000911A02002309F146
+:1079420048D004FD1EC045D000FD03C042D004FF54
+:10795200FACF10E0012F1395003281F0ED91FC91E6
+:107962001197049133D02D913C912F5F3F4F3C935F
+:107972002E93FD0103810A95038361F72AD004FF48
+:10798200DACF00911902013039F423D004FD04C08A
+:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F
+:1079A20018D00B7F49D02296A991B99108951091D0
+:1079B200F10008957DDF00911E0208D047D009D062
+:1079C2000F773AD006D002FFFDCFBFC00093F1007F
+:1079D20008950091E800089524D010911D021058D6
+:1079E20029F01A9589F01A9591F019C061DF00917A
+:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63
+:107A020018D0E7DF0F770CC053DF00E0F2CF51D080
+:107A12000F7710E0F801E55EFD4F0081EACF0FD04D
+:107A22000BC001D000D00091F1000895D2DF0F7E8B
+:107A320003C00091E8000B7F0093E80008950091D5
+:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31
+:107A5200F3CF00911D02002329F00A9509F10A953E
+:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE
+:107A7200B9F4D9DF0F7711F416D01BD00093E900C7
+:107A82001091EB0010FF0BC00ED010E01093E90034
+:107A920021E0F801E55EFD4F20834FD003C042D0C4
+:107AA20045D0CFDFC9CF1091EB0010621093EB00ED
+:107AB20008951091E800177F1093E800089500914F
+:107AC2001D02002311F4AFDF02C0013011F4B7DF51
+:107AD200B3CF023031F52DD019F52091F1002F7777
+:107AE2002093E90023D000FF19C081F01FD000616C
+:107AF200DCDE01E010E0422F0E949F3E0093EA008C
+:107B020000E00093EA0012D00860CFDE0BD030E034
+:107B1200F901E55EFD4F008310D0DACF03D0D7CF55
+:107B2200BFDE089500E00093E90008950091EB00A4
+:107B3200089579DF3CDF00230895BADE4ADF0E7F25
+:107B4200089583DF46DF02FFFDCF73DF42DF0F7749
+:107B520073CF0091D70001600093D7000E948B3849
+:107B620000E000931F0208950C94BF388A93FA93A1
+:107B7200EA933A922A921A920A927A936A935A93BF
+:107B82004A933A932A931A930A938FB70091DA0091
+:107B920000FF24C00091D80000FF20C00EEF009328
+:107BA200DA000091D90000FF11C001E000930D013D
+:107BB200ABD0026096D09AD00860A2D00E949B38C7
+:107BC2000091E0000E7F0093E00008C000E0009307
+:107BD2000D0100931E0298D0046083D07FD002FF73
+:107BE20005C084D002FF02C00BEF75D077D000FF32
+:107BF2001BC07CD000FF18C001E000930E016AD0C8
+:107C020083D000626ED00EEF6FD0006179D06ED05B
+:107C12000F7D76D00091D80000620093D80009B59C
+:107C22000D7F09BD00E009BD59D004FF20C05ED020
+:107C320004FF1DC009B500FD05C00E94EB3809B55F
+:107C420000FFFDCF0091D8000F7D0093D80042D0F5
+:107C520000910E01002359F04CD00FEE45D00F7E5B
+:107C620052D000643ED042D001604AD042D036D0D9
+:107C720005FF0FC03BD005FF0CC000E000930E01D2
+:107C820035D00F7E3DD00FED2FD00F7D3CD0006858
+:107C920028D024D003FF0DC029D003FF0AC000E082
+:107CA20000931F0207EF17D00E94743B2DD0116082
+:107CB20018D08FBF09911991299139914991599100
+:107CC200699179910990199029903990E991F991E6
+:107CD200899118950FEE0093E10008950091E1005B
+:107CE20008951183008308950093E1000091E2005A
+:107CF20008950091E200006203D00091E200086062
+:107D02000093E2000895FCDFE0E2F2E000811181DD
+:107D1200089500008895FECF01E60DBF02E00EBF78
+:107D2200C2EED2E00E947438002311F00E94D33ECA
+:107D32000E9465380E948A3E0C948A3E4A951AF047
+:107D4200000F111FFBCF0895BA92AA929A928A92BB
+:107D52007A926A925A924A92BA93AA939A938A937D
+:107D62000895BB84AA84998488847F806E805D8014
+:107D72004C80BB81AA8199818881F0E00FB6F8948A
+:107D8200CE0FDF1F0FBE089520E006D0E9F7089559
+:107D9200259102D0E9F708952D9301501040202F2C
+:107DA200212B089585E890E7FC0105911491FC01CF
+:107DB2003296A591B491FC01349625913491422FCB
+:107DC200432B19F0F901E4DF01C0DEDF069610E76C
+:107DD2008139910748F308952F930CD02F9101D048
+:107DE20008953CD0F12FE02F45E047BFE89536D00B
+:107DF20012D0089533D0F12FE02F43E047BFE8952A
+:107E02002DD008952BD0F12FE02F43E047BFE89506
+:107E120025D001D0089522D041E147BFE8951EC088
+:107E22001DD0F12FE02F41E247BFC895002D16C0AB
+:107E320015D0F12FE02F49E047BFC895002D0EC0A5
+:107E4200F32FE22F012E102E41E047BFE89506C026
+:107E520005D0002E29E027BFE89500C0022E27B7E3
+:107E620020FDFCCF202D0895022E27B726FDFCCF42
+:107E7200202D08950E94A53E22974801C901DA01EA
+:107E820010C05BD001E0A00E00E0B01E00E4A0161E
+:107E920000E0B00608F440C0830120E030E00E9418
+:107EA200F23E0A2F0B2B09F440C0082F0F7710E087
+:107EB2002C01401A510A320100E4A02E03C00A2FFD
+:107EC2000B2BE1F04816590680F0F40101914F01A5
+:107ED2000983119729F001914F010883119711C06D
+:107EE200F2013196049108830CC0F20104910983D6
+:107EF2003196E817F907A1F7F401EDCF1BD00883FB
+:107F020019839201088119810E94213F16D0AA94F7
+:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE
+:107F220009F4AFCF83011DD0B7CF01E02296ECE078
+:107F32000C94B23E82010C945F3802E0400E00E0E5
+:107F4200501E08959A938A9380E090E08C0109D0A4
+:107F520080589F4F8F3F0FE69007C0F38991999108
+:107F6200089520E030E00C94FB3E00000000000089
+:067F720000000000FC000D
+:107FE4000C94ED3E0C94113F0C94193F0C94213FDA
+:0C7FF4000C94F23E0C94033F0C94293FC7
+:040000030000700089
+:100000000C949D020C94E1020C94E1020C94E10228
+:100010000C94E1020C94E1020C94E1020C94E102D4
+:100020000C94E1020C94E1020C941C120C94EE125C
+:100030000C948D240C94E1020C94E1020C94E102E6
+:100040000C94E1020C94E1020C94E1020C94E102A4
+:100050000C94E1020C94FA240C94E1020C94E10259
+:100060000C94E1020C94E1020C94E1020C94E10284
+:100070000C94E1020C94E1020C94E1020C94E10274
+:100080000C94860A0C94E1020C94E1020C94E102B7
+:100090000C94E1020C94E1020C94E1020C94E10254
+:1000A0000C94E1020C94E1020C94E10207634236E5
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD
+:1000D0000000803F08000000BE922449123EABAAF7
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52
+:1000F000AA3E00000000BF000000803F000000009A
+:1001000000084178D3BB4387D1133D190E3CC3BDD2
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F
+:1001200080EFFFBE01C4FF7F3F0000000000000021
+:10013000F1A4F1A3018C028C048C2B0014001A0092
+:100140000800150017001C0018000C001200130016
+:100150002A00290004001600070009000A000B000D
+:100160000D000E000F0033003400E1001D001B00E5
+:100170000600190005001100100036003700380095
+:1001800028000030E000E200E30002202C002C00F8
+:1001900001205000510052004F002B0014001A00A3
+:1001A000090013000A000D000F0018001C003300A6
+:1001B0002A002900040015001600170007000B0094
+:1001C000110008000C0012003400E1001D001B00AB
+:1001D0000600190005000E00100036003700380038
+:1001E00028000030E000E200E30002202C002C0098
+:1001F00001205000510052004F002B003400360007
+:10020000370013001C0009000A00060015000F004B
+:100210002A00290004001200080018000C00070042
+:100220000B001700110016003800E1003300140025
+:100230000D000E001B00050010001A0019001D0023
+:1002400028000030E000E200E30002202C002C0037
+:1002500001205000510052004F0035021E021F02C3
+:100260002002210222022302240225022602270262
+:100270002A0001003A003B003C003D003E003F00E8
+:100280002D022E022F0230023102010040004100F7
+:100290004200430044004500032004200520005094
+:1002A0000100010001000100010002200100010025
+:1002B0000100AB00AA00A900AE0035001E001F001F
+:1002C0002000210022002300240025002600270012
+:1002D0002A0001003A003B003C003D003E003F0088
+:1002E0002D002E002F0030003100010040004100A1
+:1002F0004200430044004500032004200520005034
+:1003000001000100010001000100010001000100E5
+:100310000120AB00AA00A900AE0028035400680029
+:100320006500200050006C0061006E0063006B00EF
+:1003300020004B006500790062006F0061007200D0
+:10034000640000002C034F007200740068006F000E
+:100350006C0069006E0065006100720020004B00B7
+:100360006500790062006F00610072006400730034
+:100370000000040309040902D000060100A03209AC
+:100380000400000103010100092111010001223FC5
+:10039000000705810308000A0904010001030102A6
+:1003A00000092111010001224D0007058203080008
+:1003B0000A090402000103000000092111010001E3
+:1003C0002236000705830308000A0904030002031C
+:1003D000000000092111010001222000070584030B
+:1003E00020000107050403200001090404000001A6
+:1003F00001000009240100010900010509040500AC
+:10040000020103000007240100014100062402014B
+:100410000100062402020200092403010301020173
+:10042000000924030204010101000905060240003D
+:1004300005000005250101010905850240000500B0
+:100440000005250101031201100100000008EDFE66
+:1004500060600100010200010631FF0974A1010979
+:1004600075150025FF952075088102097615002570
+:10047000FF952075089102C005010980A101850240
+:1004800016010026B7001A01002AB7007510950161
+:100490008100C0050C0901A1018503160100269CFD
+:1004A000021A01002A9C02751095018100C0050105
+:1004B0000902A1010901A100050919012905150079
+:1004C00025019505750181029501750381010501DD
+:1004D000093009311581257F950275088106093893
+:1004E0001581257F950175088106050C0A380215CE
+:1004F00081257F950175088106C0C005010906A107
+:1005000001050719E029E715002501950875018106
+:1005100002950175088101050819012905950575E0
+:100520000191029501750391010507190029FF1535
+:100530000025FF950675088100C011241FBECFEF6E
+:10054000DAE0DEBFCDBF04B603FE24C0809178039D
+:1005500090917903A0917A03B0917B038730904BFF
+:10056000A740B04BB9F4109278031092790310921F
+:100570007A0310927B0314BE84B7877F84BF88E11F
+:100580000FB6F89480936000109260000FBEE0E018
+:10059000F8E3099511E0A0E0B1E0E2EAFFE502C06E
+:1005A00005900D92A63BB107D9F713E0A6EBB1E099
+:1005B00001C01D92A837B107E1F70E94F90E0C9413
+:1005C000CF2F0C9400000895089561110DC0FC0117
+:1005D0008281882331F085EE0E949D190E94B62BFE
+:1005E00003C085EE0E94651A80E090E008958B3B81
+:1005F000910568F4883A910530F5853A9105C0F483
+:100600008430910598F4019709F06FC071C0803E65
+:10061000910508F46AC0883E910540F09C01205F76
+:1006200031092031310508F060C05CC09C01A1C0D7
+:10063000853A910509F45FC0863A910509F45EC0D8
+:1006400023E830E496C0883A910509F45AC0893A03
+:10065000910509F459C08A3A910509F458C08B3ABA
+:10066000910509F457C08C3A910509F456C08D3AAA
+:10067000910509F455C0803B910509F454C08E3AA8
+:10068000910509F453C08F3A910509F452C0813B9A
+:10069000910509F451C0823B910509F450C0833B98
+:1006A000910509F44FC0843B910509F44EC0853B88
+:1006B000910509F44DC0863B910509F44CC0873B78
+:1006C000910509F44BC0883B910509F44AC0893B68
+:1006D000910509F449C08A3B910509F048C02AE216
+:1006E00036E447C09C01306544C020E030E041C0A2
+:1006F00021E030E03EC021E830E43BC022E830E4B5
+:1007000038C022EE34E435C029EE34E432C02AEE9B
+:1007100034E42FC025EB34E42CC026EB34E429C0AC
+:1007200027EB34E426C02CEC34E423C02DEC34E475
+:1007300020C023E835E41DC02AE835E41AC022E9C8
+:1007400035E417C024E935E414C021E236E411C0D1
+:1007500023E236E40EC024E236E40BC025E236E4A0
+:1007600008C026E236E405C027E236E402C020E0F5
+:1007700034E4C90108959CE0799FF001112490E3CD
+:10078000899FE00DF11D1124E60FF11DEE0FFF1FF3
+:10079000E65CFE4F25913491C9010895880F991F99
+:1007A00082559040FC0125913491C9010895880F2C
+:1007B000991F825D9E4FFC0125913491C9010895D6
+:1007C0000E94BB039C013A9521153F4108F4DFC00C
+:1007D0009C0130522115304120F49F700E94D703B4
+:1007E00008959C0130532115304118F49927906CDD
+:1007F00008959C0130542031310520F48F709927E1
+:10080000946D0895803120E4920719F480E091ED11
+:100810000895813140E4940719F480E090ED089543
+:10082000823120E4920719F480E092ED089583313B
+:1008300040E4940719F480E093ED0895811520E5D4
+:10084000920711F40C941F25813040E5940731F490
+:100850008091680281608093680208959C013056FF
+:100860002115304108F402C097FF02C0906F08952F
+:10087000803E9105E0F4803C910568F58133910557
+:1008800009F474C048F48932910509F46AC08A32C7
+:10089000910509F07AC074C089339105F9F0823866
+:1008A0009105E1F08533910509F06FC050C0833E9A
+:1008B0009105A9F140F4803E9105C9F0823E910571
+:1008C00009F063C01BC0863E910571F1873E91051A
+:1008D00009F05BC037C00E94CE03089520917B02CF
+:1008E00020FD02C021FF51C080EE90E04EC08091FB
+:1008F0007B0280FFF9CF89E390E047C080917B02C3
+:1009000082FF0AC080917B0284FF03C080E090E0F8
+:100910003CC083EE90E039C082EE90E036C080911A
+:100920007B0282FFEFCFF8CF80917B0283FF07C06D
+:1009300080917B0284FDEACF87EE90E026C086EEB0
+:1009400090E023C080917B0283FFF2CFF8CF8091AB
+:100950007B0285FF03C089E290E017C085E390E049
+:1009600014C080917B0285FDF9CFF5CF80917B0289
+:1009700086FF03C08AE290E008C081E390E005C0F2
+:1009800080917B0286FDF9CFF5CF0E94F702089592
+:100990005F926F927F928F929F92AF92BF92CF920F
+:1009A000DF92EF92FF920F931F93CF93DF93CDB718
+:1009B000DEB728970FB6F894DEBF0FBECDBF9E01FD
+:1009C0002F5F3F4F4E0189E0880E911C60E070E080
+:1009D00000E010E0E12CF12CC12CD12CA12CB12C89
+:1009E00088E0782E622E532E41E050E0E3E2F1E001
+:1009F000A62DB52D872D01900D928A95E1F7F9016D
+:100A0000819191919F01FC01E07FFF27E032F10588
+:100A100059F48F709927FA0102C0EE0FFF1F8A95D3
+:100A2000E2F7AE2ABF2A37C0E033F10559F48F70E0
+:100A30009927FA0102C0EE0FFF1F8A95E2F7CE2A2E
+:100A4000DF2A29C0E034F10559F48F709927FA01A3
+:100A500002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0A5
+:100A6000E035F10559F48F709927FA0102C0EE0FB5
+:100A7000FF1F8A95E2F70E2B1F2B0DC0E036F10504
+:100A800051F48F709927FA0102C0EE0FFF1F8A956B
+:100A9000E2F76E2B7F2B2815390509F0A7CF94B10B
+:100AA0008A2D8095892384B985B18A2985B997B122
+:100AB0008C2D8095892387B988B18C2988B99AB102
+:100AC0008E2D809589238AB98BB18E298BB99DB1E2
+:100AD000802F809589238DB98EB1802B8EB990B3EC
+:100AE000862F8095892380BB81B3862B81BB289676
+:100AF0000FB6F894DEBF0FBECDBFDF91CF911F912F
+:100B00000F91FF90EF90DF90CF90BF90AF909F90AC
+:100B10008F907F906F905F9008955F926F927F9219
+:100B20008F929F92AF92BF92CF92DF92EF92FF92FD
+:100B30000F931F93CF93DF93CDB7DEB768970FB6B0
+:100B4000F894DEBF0FBECDBF85B7806885BF85B77F
+:100B5000806885BF0E94CF076E9A769A0E94C8046B
+:100B60009E012F5F3F4F4E0189E1880E911C60E08E
+:100B700070E000E010E0E12CF12CC12CD12CA12C74
+:100B8000B12C98E1792E622E532E41E050E0EBE239
+:100B9000F1E0A62DB52D872D01900D928A95E1F7F4
+:100BA000F901819191919F01FC01E07FFF27E032E3
+:100BB000F10559F48F709927FA0102C0EE0FFF1F5B
+:100BC0008A95E2F7AE2ABF2A37C0E033F10559F41F
+:100BD0008F709927FA0102C0EE0FFF1F8A95E2F786
+:100BE000CE2ADF2A29C0E034F10559F48F70992705
+:100BF000FA0102C0EE0FFF1F8A95E2F7EE2AFF2AE4
+:100C00001BC0E035F10559F48F709927FA0102C035
+:100C1000EE0FFF1F8A95E2F70E2B1F2B0DC0E0365B
+:100C2000F10551F48F709927FA0102C0EE0FFF1FF2
+:100C30008A95E2F76E2B7F2B2815390509F0A7CF8F
+:100C400094B18A2D8095892384B985B18A2985B983
+:100C500097B18C2D8095892387B988B18C2988B963
+:100C60009AB18E2D809589238AB98BB18E298BB943
+:100C70009DB1802F809589238DB98EB1802B8EB93F
+:100C800090B3862F8095892380BB81B3862B81BB4F
+:100C90001092B7011092B6011092BF011092BE01DE
+:100CA0001092B9011092B8011092C1011092C001C6
+:100CB0001092BB011092BA011092C3011092C201AE
+:100CC0001092BD011092BC011092C5011092C40196
+:100CD00068960FB6F894DEBF0FBECDBFDF91CF91FF
+:100CE0001F910F91FF90EF90DF90CF90BF90AF904A
+:100CF0009F908F907F906F905F9008955F926F921A
+:100D00007F928F929F92AF92BF92CF92DF92EF929B
+:100D1000FF920F931F93CF93DF93CDB7DEB7A097CA
+:100D20000FB6F894DEBF0FBECDBF7E0149E1E40EE1
+:100D3000F11C2EEBC22E21E0D22E5E0151E2A50E57
+:100D4000B11C38E0532E470101E010E048E1642E69
+:100D500055E0752EE3E2F1E0D401852D01900D926E
+:100D60008A95E1F7F701819191917F019C01207FA4
+:100D700033272032310589F424B18F709927A801D7
+:100D800002C0440F551F8A95E2F7CA01242B24B9EB
+:100D900095B18095892385B94FC02033310589F4F9
+:100DA00027B18F709927F80102C0EE0FFF1F8A95B7
+:100DB000E2F7CF012E2B27B998B18095892388B906
+:100DC0003BC02034310589F42AB18F709927A801DE
+:100DD00002C0440F551F8A95E2F7CA01242B2AB995
+:100DE0009BB1809589238BB927C02035310589F4C3
+:100DF0002DB18F709927F80102C0EE0FFF1F8A9561
+:100E0000E2F7CF012E2B2DB99EB1809589238EB9A3
+:100E100013C02036310581F420B38F709927A801C3
+:100E200002C0440F551F8A95E2F7CA01242B20BB4C
+:100E300091B38095892381BB50EA5A95F1F7BE01A1
+:100E40006F5F7F4F80E090E020E030E0EBE2F1E088
+:100E5000DE011196462D01900D924A95E1F7FB01B6
+:100E600041915191BF01FA01E07FFF27E032F10586
+:100E700011F4E3B113C0E033F10511F4E6B10EC093
+:100E8000E034F10511F4E9B109C0E035F10511F4E0
+:100E9000ECB104C0E036F105B9F4EFB1F0E04F7009
+:100EA000552702C0F595E7954A95E2F7E0FD08C0A1
+:100EB000A801022E02C0440F551F0A94E2F702C097
+:100EC00040E050E0842B952B2F5F3F4F2C303105B5
+:100ED00009F0BCCFF601208131812817390721F0B4
+:100EE00091838083709200010E94C804F2E0CF0ECB
+:100EF000D11CEA14FB0409F02DCF80910001882356
+:100F000061F1815080930001811121C08091BE0167
+:100F10009091BF019093B7018093B6018091C00179
+:100F20009091C1019093B9018093B8018091C20161
+:100F30009091C3019093BB018093BA018091C40149
+:100F40009091C5019093BD018093BC0106C08FE9CB
+:100F50009FE00197F1F700C0000081E0A0960FB676
+:100F6000F894DEBF0FBECDBFDF91CF911F910F91DF
+:100F7000FF90EF90DF90CF90BF90AF909F908F90B9
+:100F80007F906F905F900895E82FF0E0EE0FFF1FC5
+:100F9000EA54FE4F80819181089508950895279A1B
+:100FA0002F988FEF9FEF90938700809386008AE0C1
+:100FB0008093800089E1809381000C945F2B8111E4
+:100FC0000BC080918000877F8093800010928D00FD
+:100FD00010928C002F9808952F98833041F48091BF
+:100FE00080008860809380008FEF9FEF12C0909107
+:100FF000800098609093800023E030E0281B310946
+:10100000220F331F8FEF9FEF02C0969587952A9589
+:10101000E2F790938D0080938C0008950F931F93B7
+:10102000CF93DF93CDB7DEB7CC58D1090FB6F89484
+:10103000DEBF0FBECDBF8C01862F642F882379F0D1
+:10104000F80192812FE7482F992329F08DE792E04C
+:101050000E94F81404C08DE792E00E940815F80180
+:1010600080818B3061F49181933009F068C0828176
+:10107000882309F4CDC0809103018F5F0EC08A30B0
+:10108000E1F5F8019181933009F059C082818823FC
+:1010900009F4BEC08091030181508093030120E0D8
+:1010A0004BE760E08DE792E00E94E81420E04BE718
+:1010B00061E08DE792E00E94E81420E04BE762E0F7
+:1010C0008DE792E00E94E81420E04BE763E08DE7B3
+:1010D00092E00E94E81420E04BE764E08DE792E0A4
+:1010E000C457DF4F0FB6F894DEBF0FBECDBFDF9100
+:1010F000CF911F910F910C94E814893069F4F80195
+:1011000091819330E1F492819923C9F0809101019A
+:101110009091020101960EC0883089F4F801918106
+:10112000933069F49281992351F08091010190915B
+:10113000020101979093020180930101B0CFF80161
+:10114000928140910301992391F196E4E3E4F1E067
+:10115000DE01A95BBF4F01900D929A95E1F7405DCA
+:10116000F8019181FCE09F9F40191124E091010159
+:10117000F0910201E80FF11DEE0FFF1F87E490E0F0
+:101180008C0F9D1FE80FF91F8081480F2FE760E04B
+:101190008DE792E0C457DF4F0FB6F894DEBF0FBE65
+:1011A000CDBFDF91CF911F910F910C94F81496E46D
+:1011B000E3E4F1E0DE01119601900D929A95E1F7DA
+:1011C000405DF8019181FCE09F9F40191124E0915E
+:1011D0000101F0910201E80FF11DEE0FFF1F81E008
+:1011E00090E08C0F9D1FE80FF91F8081480F2FE7BB
+:1011F00060E08DE792E0C457DF4F0FB6F894DEBF92
+:101200000FBECDBFDF91CF911F910F910C940815A8
+:10121000C457DF4F0FB6F894DEBF0FBECDBFDF91CE
+:10122000CF911F910F910895CF93DF93EA019B0116
+:10123000AC0160E074E284E79BE40E945F2C0E94B2
+:10124000C72C709397006093960020E130E02C1B30
+:101250003D0B02C0759567952A95E2F7709399004A
+:1012600060939800DF91CF9108951092020210923E
+:10127000010210929000109291001092FD011092C4
+:10128000FE011092FF01109200021092FC011092D8
+:10129000FB01E9EDF1E0A9ECB1E01192119211929C
+:1012A00011921D921D9281E0E93FF807B1F7089570
+:1012B000AF92BF92CF92DF92EF92FF920F931F9364
+:1012C000CF93DF936B017C0109EF11E047EDA42E72
+:1012D00041E0B42EC7E0D0E0A7019601F801929159
+:1012E0008291729162918F010E945B2C882349F058
+:1012F0002197F2E0AF1AB108CF3F8FEFD80761F71F
+:1013000034C0F8011082118212821382F501118219
+:101310001082FE01EE0FFF1FEE0FFF1FE752FE4F80
+:10132000DE01AA0FBB1FA753BE4FCE011AC0019604
+:1013300044815581668177814083518362837383C1
+:10134000148215821682178212962D913C91139762
+:1013500011963C932E9313961C921E9212973496DC
+:1013600012968730910519F7C3CF809101029091B1
+:101370000202019797FD05C090930202809301023B
+:1013800004C01092020210920102E0910102F09159
+:101390000202309789F410929000109291001092FE
+:1013A000FD011092FE011092FF01109200021092B6
+:1013B000FC011092FB019EC03197DF01AA0FBB1FF9
+:1013C000AA0FBB1FA752BE4FCD90DD90ED90FC90B1
+:1013D000EE0FFF1FE753FE4FC081D181A090FD01AA
+:1013E000B090FE010091FF0110910002A70196014B
+:1013F0006A2D7B2D802F912F0E945B2C87FF2FC0A1
+:1014000081E08093C801AE016A2D7B2D802F912F42
+:101410000E9414092091FD013091FE014091FF01CD
+:1014200050910002C701B6010E94F62B20E030E087
+:101430004AEF53E40E945F2C9B01AC016A2D7B2D87
+:10144000802F912F0E94F72B5B018C01A701960141
+:101450007B2D912F0E945B2C1816ACF638C0A7018B
+:1014600096016A2D7B2D802F912F0E94AA2D181690
+:1014700084F581E08093C801AE016A2D7B2D802F19
+:10148000912F0E941409A70196016091FD017091AE
+:10149000FE018091FF01909100020E94F62B20E056
+:1014A00030E04AEF53E40E945F2C9B01AC016A2DAF
+:1014B0007B2D802F912F0E94F62B5B018C01A701C1
+:1014C00096017B2D912F0E94AA2D87FFD5CF1092D8
+:1014D000C801AE01C701B6010E941409C092FD0106
+:1014E000D092FE01E092FF01F0920002D093FC0145
+:1014F000C093FB01DF91CF911F910F91FF90EF906F
+:10150000DF90CF90BF90AF90089508951F920F92F3
+:101510000FB60F9211242F933F934F935F936F93C6
+:101520007F938F939F93AF93BF93EF93FF9380919C
+:10153000960090919700892B09F455C08091C801BD
+:10154000811151C08091F9019091FA01813091058A
+:1015500071F082309105C1F0892BC1F52091FD0118
+:101560003091FE014091FF01509100021DC0609139
+:10157000FD017091FE018091FF01909100029B019D
+:10158000AC010E94F72B0EC020E030E040E450E4B4
+:101590006091FD017091FE018091FF019091000228
+:1015A0000E94AE2D9B01AC0160E074E284E79BE4F5
+:1015B0000E945F2C0E94C72C709397006093960046
+:1015C0007595679570939900609398008091F901E3
+:1015D0009091FA01019663E070E00E948A2F909347
+:1015E000FA018093F901FF91EF91BF91AF919F9123
+:1015F0008F917F916F915F914F913F912F910F90BC
+:101600000FBE0F901F901895AF92BF92CF92DF92AE
+:10161000EF92FF920F931F93CF93DF936B017C01A7
+:10162000EA0120E030E0A9010E94AA2D18160CF072
+:10163000B4C03E9A82E8809390008AE18093910042
+:10164000A090FD01B090FE010091FF0110910002F9
+:1016500020E030E0A9016A2D7B2D802F912F0E9480
+:101660005B2C81112DC0AE01C701B6010E94140987
+:10167000C092FD01D092FE01E092FF01F0920002C3
+:10168000D093FC01C093FB01809101029091020272
+:10169000FC01EE0FFF1FEE0FFF1FE752FE4FC0824F
+:1016A000D182E282F382FC01EE0FFF1FE753FE4F6F
+:1016B000D183C083019690930202809301026DC092
+:1016C000A70196016A2D7B2D802F912F0E945B2C04
+:1016D00087FF2CC0AE016A2D7B2D802F912F0E9499
+:1016E00014092091FD013091FE014091FF015091BC
+:1016F0000002C701B6010E94F62B20E030E04AEF5D
+:1017000053E40E945F2C9B01AC016A2D7B2D802F3E
+:10171000912F0E94F72B5B018C01A70196017B2D75
+:10172000912F0E945B2C1816ACF69DCFA701960155
+:101730006A2D7B2D802F912F0E94AA2D18160CF058
+:1017400092CFAE016A2D7B2D802F912F0E9414091C
+:10175000A70196016091FD017091FE018091FF014A
+:10176000909100020E94F62B20E030E04AEF53E413
+:101770000E945F2C9B01AC016A2D7B2D802F912F45
+:101780000E94F62B5B018C01A70196017B2D912F06
+:101790000E94AA2D87FFD5CF66CFDF91CF911F91F1
+:1017A0000F91FF90EF90DF90CF90BF90AF90089592
+:1017B00080910C020895CF93DF9300D01F92CDB794
+:1017C000DEB720916E03243021F523E029839B832B
+:1017D0008A832093E9008FEF06C095ED9A95F1F783
+:1017E0000000882329F09091E800815095FFF5CF03
+:1017F0008091E80085FF0DC040E050E063E070E0BC
+:10180000CE0101960E94BA0F8091E8008E778093F6
+:10181000E8000F900F900F90DF91CF910895CF9334
+:10182000DF9300D01F92CDB7DEB720916E03243036
+:1018300029F522E029839B838A8383E08093E90052
+:101840008FEF06C095ED9A95F1F70000882329F0F7
+:101850009091E800815095FFF5CF8091E80085FFD9
+:101860000DC040E050E063E070E0CE0101960E94C0
+:10187000BA0F8091E8008E778093E8000F900F9068
+:101880000F90DF91CF91089520916E032430F9F4E9
+:1018900022E02093E9002FEF06C035ED3A95F1F7ED
+:1018A0000000222329F03091E800215035FFF5CFC8
+:1018B0002091E80025FF0BC040E050E065E070E0BB
+:1018C0000E94BA0F8091E8008E778093E800089517
+:1018D000CF93DF93EC0180916E03843041F581E07A
+:1018E0008093E9008FEF06C095ED9A95F1F700001F
+:1018F000882329F09091E800815095FFF5CF8091E1
+:10190000E80085FF14C040E050E068E070E0CE01E0
+:101910000E94BA0F8091E8008E778093E80088E0FB
+:10192000FE01A4E0B2E001900D928A95E1F7DF910B
+:10193000CF910895BF92CF92DF92EF92FF920F93D3
+:101940001F93CF93DF937C01B62EE90100E010E0F6
+:10195000C42ED12C0BC04991202F2B0D2F774F7700
+:101960006FE0C7010E94E8140F5F1F4F0C151D05A3
+:1019700094F3DF91CF911F910F91FF90EF90DF9043
+:10198000CF90BF90089570E06F5F7F4F6F707727A3
+:101990000C94E8140F931F93CF93C42F63307105F9
+:1019A00009F04AC0842F807F803849F1803909F0DE
+:1019B00043C0622F6F7770E080E090E00E94FA2CC5
+:1019C00020E030E040E451E40E945F2C9B01AC0138
+:1019D00060E070E080E090E40E94112E0F7710E04C
+:1019E00023E0159507952A95E1F72DEC3CEC42E0B4
+:1019F00053E40E94AE2DA8010E94040B1DC0622F6B
+:101A00006F7770E080E090E00E94FA2C20E030E0F8
+:101A100040E451E40E945F2C9B01AC0160E070E067
+:101A200080E090E40E94112E2DEC3CEC42E053E467
+:101A30000E94AE2D0E945809CC3F29F4CF911F91EE
+:101A40000F910C943509CF911F910F9108950F9329
+:101A50001F93CF93DF93CDB7DEB727970FB6F894D8
+:101A6000DEBF0FBECDBF8C0114C08A810E94C2149C
+:101A70009A819D839B819E839C819F8381111EC03F
+:101A800089818430B1F08730A1F08630A1F08530B3
+:101A9000A1F0BE016F5F7F4F84E091E00E942F189C
+:101AA0008111E3CF84E091E00E9420180E949B14F2
+:101AB0000DC083E003C082E001C081E0AE014B5F56
+:101AC0005F4F682FC8010E945515E3CF27960FB6C8
+:101AD000F894DEBF0FBECDBFDF91CF911F910F9164
+:101AE0000895EF92FF920F93CF93DF9300D000D031
+:101AF00000D0CDB7DEB77B014A832B830C83842FC4
+:101B00002E834D830E94C2142E814D8181111BC0F2
+:101B100082E0E816F10479F083E0E816F10421F0A0
+:101B2000EA94EF2821F50BC0073F11F487E001C0CC
+:101B300084E089830BC0273FD9F786E0FACF473F7F
+:101B4000B9F785E0F6CF42954F704983BE016F5FCC
+:101B50007F4F84E091E00E94E51784E091E00E94CD
+:101B6000031884E091E00E9420180E949B1426969E
+:101B70000FB6F894DEBF0FBECDBFDF91CF910F91AE
+:101B8000FF90EF90089580916D03811109C00E942C
+:101B9000A1110E94FE118091E20084608093E20016
+:101BA000089510926D03089508950C94E4020C9426
+:101BB000892480916E03843049F58091E9008F700B
+:101BC0009091EC0090FF02C090E801C090E0982B4B
+:101BD00084E08093E9008091EB0080FF14C0809145
+:101BE000EE0087FD03C00FC01092F1008091E80065
+:101BF00085FDFACF8091E80080FF05C08091E80064
+:101C00008E778093E8009F709093E900089542E0FA
+:101C100061EC81E00E94171142E061EC82E00E94D9
+:101C2000171142E061EC83E00E94171146E261EC7B
+:101C300084E00E94171142E361E885E00E941711D9
+:101C400042E360E886E00C941711809170038330C2
+:101C500009F454C030F4813071F0823009F0AAC028
+:101C600091C08A3009F47EC08B3009F45FC089309E
+:101C700009F0A0C020C080916F03813A09F09AC09A
+:101C80008091E800877F8093E800809173039091B2
+:101C90007403892B21F060E080E090E003C068E0ED
+:101CA00084E092E070E00E9458108091E8008B7709
+:101CB0008093E800089580916F03813209F07AC023
+:101CC0008091730390917403892B09F073C0809104
+:101CD000E800877F8093E80005C080916E03882329
+:101CE00009F468C08091E80082FFF7CF8091F1008D
+:101CF00080930C028091E8008B7758C080916F032D
+:101D0000813A09F057C08091730390917403892B35
+:101D100009F050C08091E800877F8093E8008091AF
+:101D2000E80080FFFCCF80911A013BC080916F03D7
+:101D3000813209F03FC08091730390917403892B25
+:101D4000C9F58091E800877F8093E8000E944E11DA
+:101D50009091710381E0911101C080E080931A019C
+:101D60000C948C1E80916F03813221F58091E800E4
+:101D7000877F8093E8000E944E11809172038093C8
+:101D80000302089580916F03813AA1F48091E800E5
+:101D9000877F8093E8008091E80080FFFCCF8091EE
+:101DA00003028093F1008091E8008E778093E80031
+:101DB0000C944E11089584B7877F84BF88E10FB6D5
+:101DC000F89480936000109260000FBE90E080E86D
+:101DD0000FB6F89480936100909361000FBE0E944B
+:101DE000A1110E94FE11E2EEF0E080818460808308
+:101DF00008958DE792E00E94241561E77DE08DE76C
+:101E000092E00E947A1567E27DE08DE792E00E9401
+:101E10007E150E94DB0E78946AEC7CE08DE792E000
+:101E20000E94201563EC7CE08DE792E00E9418157B
+:101E30006AE97CE08DE792E00E941C150E94850A09
+:101E40000E949B140E94AC1880E191E00E945418FB
+:101E50000BC00E944E2480916C03882329F00E94BD
+:101E6000742481110E94A40F80916E03853089F340
+:101E70008DE792E00E942D170E94B618F5CF292F0A
+:101E8000332723303105B1F04CF42130310509F40A
+:101E90004DC02230310509F04EC007C02132310556
+:101EA00041F12232310591F146C0E0EDF0E086E7E4
+:101EB00093E045C099278130910569F08230910502
+:101EC00089F0892B09F037C0E2E7F3E0E491F0E014
+:101ED00082E793E034C0E4E4F3E0E491F0E084E4EA
+:101EE00093E02DC0EAE1F3E0E491F0E08AE193E0D1
+:101EF00026C0643000F5E62FF0E0EE0FFF1FE75735
+:101F0000FE4F80819181E9E0F0E019C0643098F4DF
+:101F1000E62FF0E0DF01AA0FBB1FAF56BE4F8D9139
+:101F20009C91E756FE4FE081F0E009C0E2E1F0E06D
+:101F300086E494E004C0E0E0F0E080E090E0DA01C4
+:101F40008D939C93CF01089580E189BD82E189BD85
+:101F500009B400FEFDCF8091D8008F7D8093D8001A
+:101F60008091E00082608093E0008091E00081FD3C
+:101F7000FCCF0895BF92CF92DF92EF92FF920F9322
+:101F80001F93CF93DF937C018B01EA010E946F11B5
+:101F9000B82E811133C0209731F028813981021B7E
+:101FA000130BE20EF31EC12CD12C23C08091E8004C
+:101FB00085FD15C08091E8008E778093E80020971A
+:101FC00049F0888199818C0D9D1D9983888325E036
+:101FD000B22E14C00E946F11882359F00EC0F70171
+:101FE00081917F018093F10001501109FFEFCF1A19
+:101FF000DF0A01151105D1F601C0B82E8B2DDF9136
+:10200000CF911F910F91FF90EF90DF90CF90BF90F5
+:102010000895BF92CF92DF92EF92FF920F931F939A
+:10202000CF93DF937C018B01EA010E946F11B82EE0
+:10203000811133C0209731F028813981021B130BA5
+:10204000E20EF31EC12CD12C23C08091E80085FD47
+:1020500015C08091E8008B778093E800209749F0C5
+:10206000888199818C0D9D1D9983888345E0B42ECC
+:1020700014C00E946F11882359F00EC08091F100A6
+:10208000F70181937F0101501109FFEFCF1ADF0A99
+:1020900001151105D1F601C0B82E8B2DDF91CF911E
+:1020A0001F910F91FF90EF90DF90CF90BF90089518
+:1020B00040917503509176034617570748F0611514
+:1020C000710539F44091E8004E774093E80001C073
+:1020D000BA01FC0140E033C080916E03882309F40B
+:1020E00042C0853009F441C08091E80083FD39C0C9
+:1020F0008091E80082FD2FC08091E80080FF1FC022
+:102100009091F3008091F200392F20E0A901482B33
+:10211000CA0106C041914093F100615071090196D6
+:102120006115710519F088309105A0F341E0089719
+:1021300009F040E08091E8008E778093E800611517
+:10214000710551F64111C8CF06C080916E038823F6
+:1021500051F0853051F08091E80082FFF6CF80E0A9
+:10216000089581E0089582E0089583E00895409104
+:102170007503509176034617570748F061157105AE
+:1021800039F44091E8004E774093E80001C0BA016D
+:10219000FC0140E034C080916E03882309F443C001
+:1021A000853009F442C08091E80083FD3AC08091F7
+:1021B000E80082FD30C08091E80080FF20C090914F
+:1021C000F3008091F200392F20E0A901482BCA01C9
+:1021D00007C044914093F100319661507109019616
+:1021E0006115710519F08830910598F341E0089761
+:1021F00009F040E08091E8008E778093E800611557
+:10220000710549F64111C7CF06C080916E0388233E
+:1022100051F0853051F08091E80082FFF6CF80E0E8
+:10222000089581E0089582E0089583E00895982F4D
+:102230002CC09093E900981739F07091EC00209130
+:10224000ED005091F00003C0242F762F50E021FDC7
+:1022500002C09F5F1AC03091EB003E7F3093EB00CD
+:102260003091ED003D7F3093ED003091EB00316017
+:102270003093EB007093EC002093ED005093F0004E
+:102280002091EE0027FDE5CF07C0973090F28F70C8
+:102290008093E90081E0089580E0089580916F03C4
+:1022A00087FD05C08091E80080FF0EC012C08091BC
+:1022B000E80082FD05C080916E038111F8CF08957A
+:1022C0008091E8008B7708C080916E038111EACF7E
+:1022D00008958091E8008E778093E80008958091BA
+:1022E000E4009091E50045E62091EC0020FD1FC040
+:1022F00023C020916E03222391F0253091F020918C
+:10230000EB0025FD10C02091E4003091E500281776
+:10231000390751F34150C90139F784E0089582E04B
+:10232000089583E0089581E0089580E00895209164
+:10233000E80020FFDECFF9CF2091E80022FFD9CFBF
+:10234000F4CF0E940F120E941712E0EEF0E080819D
+:1023500081608083E8EDF0E080818F77808319BC15
+:10236000A7EDB0E08C918E7F8C9380818F7E8083EF
+:1023700010926D0308950F931F93CF93DF930E94E4
+:102380000F120E941712C8EDD0E088818F778883E2
+:1023900088818068888388818F7D888319BC1092AA
+:1023A0006E0310926A0310926C0310926B0300EE9E
+:1023B00010E0F80180818B7F808388818160888331
+:1023C00042E060E080E00E941711E1EEF0E08081E1
+:1023D0008E7F8083E2EEF0E0808181608083808167
+:1023E00088608083F80180818E7F8083888180610E
+:1023F0008883DF91CF911F910F910895E8EDF0E070
+:1024000080818F7E8083E7EDF0E080818160808332
+:1024100084E082BF81E080936D030C94BB11E8EDF2
+:10242000F0E080818E7F80831092E2000895109208
+:10243000DA001092E10008951F920F920FB60F92EA
+:1024400011242F933F934F935F936F937F938F93B9
+:102450009F93AF93BF93EF93FF938091E10082FF2F
+:102460000BC08091E20082FF07C08091E1008B7F6A
+:102470008093E1000E94D90D8091DA0080FF1FC097
+:102480008091D80080FF1BC08091DA008E7F8093FE
+:10249000DA008091D90080FF0DC080E189BD82E122
+:1024A00089BD09B400FEFDCF81E080936E030E94D8
+:1024B000C30D05C019BC10926E030E94D10D80910E
+:1024C000E10080FF19C08091E20080FF15C080917B
+:1024D000E2008E7F8093E2008091E2008061809331
+:1024E000E2008091D80080628093D80019BC85E01A
+:1024F00080936E030E94D50D8091E10084FF30C06F
+:102500008091E20084FF2CC080E189BD82E189BD19
+:1025100009B400FEFDCF8091D8008F7D8093D80054
+:102520008091E1008F7E8093E1008091E2008F7EB8
+:102530008093E2008091E20081608093E2008091CC
+:102540006A03882311F084E007C08091E30087FFCD
+:1025500002C083E001C081E080936E030E94D70D2A
+:102560008091E10083FF29C08091E20083FF25C0B4
+:102570008091E100877F8093E10082E080936E0389
+:1025800010926A038091E1008E7F8093E100809138
+:10259000E2008E7F8093E2008091E2008061809370
+:1025A000E20042E060E080E00E9417118091F000BC
+:1025B00088608093F0000E94D40DFF91EF91BF914D
+:1025C000AF919F918F917F916F915F914F913F91CB
+:1025D0002F910F900FBE0F901F9018951F920F9282
+:1025E0000FB60F9211242F933F934F935F936F93E6
+:1025F0007F938F939F93AF93BF93CF93EF93FF936B
+:102600008091E9008F709091EC0090FF02C090E8FB
+:1026100001C090E0C92FC82B1092E9008091F00012
+:10262000877F8093F00078940E9432131092E90023
+:102630008091F00088608093F000CF70C093E90033
+:10264000FF91EF91CF91BF91AF919F918F917F912A
+:102650006F915F914F913F912F910F900FBE0F900F
+:102660001F9018951F93CF93DF93CDB7DEB7AC972C
+:102670000FB6F894DEBF0FBECDBFEFE6F3E080915A
+:10268000F100819323E0E737F207C9F70E94250E96
+:102690008091E80083FF37C180916F0390917003B0
+:1026A000953009F488C038F49130B1F170F093306E
+:1026B00009F029C131C0983009F4F8C0993009F403
+:1026C00004C1963009F01FC19DC0803821F08238C6
+:1026D00009F019C108C080916B0390916C03992394
+:1026E00089F082600FC080917303909174038F70A2
+:1026F00099278093E9008091EB0085FB882780F97A
+:102700001092E9009091E800977F9093E800809301
+:10271000F1001092F100D5C0882319F0823009F041
+:10272000F2C08F7121F0823009F0EDC00BC08091B2
+:102730007103813009F0E7C0933009F080E08093A5
+:102740006C032FC08091710381112BC080917303A2
+:10275000909174038F709927009709F4D4C08093E7
+:10276000E9002091EB0020FF1CC020917003233072
+:1027700021F48091EB00806212C09091EB00906197
+:102780009093EB0021E030E001C0220F8A95EAF738
+:102790002093EA001092EA008091EB008860809319
+:1027A000EB001092E9008091E800877F8093E800B9
+:1027B0000E944E11A8C08111A6C080917103909112
+:1027C00072038F779927182F9091E3009078982BB8
+:1027D0009093E3008091E800877F8093E8000E9457
+:1027E0004E118091E80080FFFCCF8091E30080686B
+:1027F0008093E300112311F083E001C082E0809315
+:102800006E0381C08058823008F07DC080917103D2
+:10281000909172038C3D23E0920779F583E08A83DF
+:102820008AE289834FB7F894DE01139620E03EE0F8
+:1028300051E2E32FF0E050935700E49120FF03C0F2
+:10284000E295EF703F5FEF708E2F90E0EA3010F06E
+:10285000C79601C0C0968D939D932F5F243149F791
+:102860004FBF8091E800877F8093E8006AE270E0C4
+:10287000CE0101960E94581013C0AE01455D5F4F16
+:10288000609173030E943F0F0097E9F12091E800E7
+:10289000277F2093E800BC018BA59CA50E94B71060
+:1028A0008091E8008B778093E8002DC0803859F53F
+:1028B0008091E800877F8093E80080916A0380938D
+:1028C000F1008091E8008E7771CF81111CC090914A
+:1028D00071039230C0F48091E800877F8093E80014
+:1028E00090936A030E944E1180916A03811104C083
+:1028F0008091E30087FF02C084E001C081E0809303
+:102900006E030E94070E8091E80083FF0AC0809149
+:10291000E800877F8093E8008091EB0080628093DD
+:10292000EB00AC960FB6F894DEBF0FBECDBFDF91C3
+:10293000CF911F910895CF9380916E038823B1F0BA
+:102940008091E9008F709091EC0090FF02C090E8B8
+:1029500001C090E0C92FC82B1092E9008091E800D7
+:1029600083FD0E943213CF70C093E900CF91089588
+:10297000881F8827881F089591E0883F08F490E019
+:10298000892F0895982F907F903B99F038F49039D3
+:1029900081F0903A71F09038C9F40BC0903DA1F0ED
+:1029A00018F4903C99F410C0903E19F0903F71F4E7
+:1029B00002C083E00895E82FE15FEF3038F4F0E0E3
+:1029C000E356FE4F8081089582E0089580E00895E7
+:1029D0000F932F774F776F70606BDC01ED91FC9157
+:1029E000022F242F462F63E070E009950F91089580
+:1029F0000F932F774F776F706069DC01ED91FC9139
+:102A0000022F242F462F63E070E009950F9108955F
+:102A10000F932F774F776F706068DC01ED91FC9119
+:102A2000022F242F462F63E070E009950F9108953F
+:102A3000FC01738362830895FC01738F628F089594
+:102A4000FC01758F648F0895CF93DF93EC011DA275
+:102A50001FA21EA2BC01685D7F4F40EC88519F4FB2
+:102A60000E9461171B821A821D821C821F821E8295
+:102A7000198618861B861A861D861C861F861E864A
+:102A8000198A188A1B8A1A8A1D8A1C8A1F8A1E8A1A
+:102A9000198E188E1B8E1A8E1D8E1C8E1F8E1E8EEA
+:102AA00019A218A2DF91CF910895CF92DF92FF92E1
+:102AB0000F931F93CF93DF931F92CDB7DEB7F62E00
+:102AC0006A018C0108511F4F08C0F60161916F0126
+:102AD000C80149830E94681749818C2D841B8F157A
+:102AE000A0F30F90DF91CF911F910F91FF90DF9096
+:102AF000CF900895FC01718360830895FC0171A358
+:102B000060A30895AF92BF92CF92DF92EF92FF92AF
+:102B10000F931F93CF93DF9300D01F92CDB7DEB7F3
+:102B20007C016B01142FB22EA02EDC0195968C91A6
+:102B300095978430F1F45A96ED91FC915B9730971C
+:102B400009F4D8C0CB01019763E070E00E94762FB2
+:102B5000DB01AA0FBB1FA60FB71F49832A830B8374
+:102B60004C2D4A1B9E012F5F3F4FBD01C7010995A8
+:102B7000B1C06230710509F453C06330710529F0AA
+:102B80006130710509F09CC083C0842F807F803A3A
+:102B900001F130F48038B9F0803909F0ABC00DC0D4
+:102BA000803EE9F0803F09F1803B09F0A3C0D701E6
+:102BB0001296ED91FC91139723C0D7011496ED91D5
+:102BC000FC9115971DC0D7011696ED91FC911797B2
+:102BD00017C0D7011896ED91FC91199711C0D70134
+:102BE0001A96ED91FC911B970BC0423F09F082C0F1
+:102BF000D7011C96ED91FC911D97309731F47AC066
+:102C0000309709F477C0123F21F42A2D4B2D62EF43
+:102C100004C0612F6F702A2D4B2DC70109955AC032
+:102C2000842F807F803D59F0803F79F0803C09F00F
+:102C300061C0D7011E96ED91FC911F9719C0D70175
+:102C40005096ED91FC91519713C0433F31F4D70159
+:102C50005296ED91FC91539708C0413F09F04AC04C
+:102C6000D7015496ED91FC915597309741F442C0AD
+:102C7000309709F43FC0133F11F0113F19F44B2D69
+:102C8000612F03C0612F6F704B2DC701099522C0C2
+:102C9000842F0E94BC14882331F0D7015696ED9101
+:102CA000FC91579707C0163F29F5D7015896ED912B
+:102CB000FC9159973097F1F0612FC70109950AC02F
+:102CC00064307105A8F416C00A2D2B2D412FB601D2
+:102CD000C7010995D7015E96ED91FC915F973097FA
+:102CE00089F00A2D2B2D412FB601C70109950AC085
+:102CF000C12CD12CD7015C96ED91FC915D9730975A
+:102D000019F7E8CF0F900F900F90DF91CF911F919F
+:102D10000F91FF90EF90DF90CF90BF90AF9008950C
+:102D2000EF92FF920F931F93CF93DF93EC01162F37
+:102D3000862F0E94BC14882369F0FDA081E08DA33A
+:102D400000E020E0412F61E070E0CE010E9482159A
+:102D5000FDA27CC0812F0E94B8144DA1882309F4E4
+:102D600040C0443029F01AA321E030E03FA32EA355
+:102D7000812F0E94C214813031F070F0823051F006
+:102D8000833059F507C08DA300E020E0412F61E0BA
+:102D900070E01EC08DA35AC0103F19F0173FE9F430
+:102DA00004C084E08DA31AA33FC02EA13FA1C90196
+:102DB00063E070E00E94762F8C0F9D1FFC0112A330
+:102DC000B9016F5F7F4F7FA36EA30CA12BA14AA116
+:102DD000CE010E9482151DA239C01DA21FA21EA2F3
+:102DE00035C0442399F12EA13FA1C90163E070E0F1
+:102DF0000E94762F7C01FE01E80FF91F12A3B90192
+:102E00006F5F7F4F7FA36EA38130910591F082E0C9
+:102E1000E816F104D9F40CA12BA14AA1CE010E941D
+:102E200082158DA1843091F081E090E09FA38EA364
+:102E30000DC0423059F400E02BA14AA1CE010E94FE
+:102E400082158DA1843011F0FFA2EEA2DF91CF9107
+:102E50001F910F91FF90EF900895CF92DF92EF9224
+:102E6000FF920F931F93CF93DF93EC01E8A1F9A199
+:102E7000309709F009958E0108511F4FC8010E9433
+:102E80009A17E12CF12CC82ED12C0FC060E0C8019C
+:102E90000E94AE17682FCE010E94901661E0C80113
+:102EA0000E94BF178FEFE81AF80AEC14FD0470F3C4
+:102EB000DF91CF911F910F91FF90EF90DF90CF9016
+:102EC0000895FC0142837483638311821082089504
+:102ED0000F931F93CF93DF93EC01062F0E94E0170F
+:102EE000182F298130E0C90101966A8170E00E94A3
+:102EF0008A2F488150E08417950729F4812F0E947A
+:102F0000E31780E012C0EB81FC81E20FF31F008326
+:102F10002981822F90E001966A8170E00E948A2FB9
+:102F20008983812F0E94E31781E0DF91CF911F9168
+:102F30000F910895CF93DF93EC010E94E017298150
+:102F40009881291710F0C22F02C0CA81C20FC91B75
+:102F50000E94E3178C2FDF91CF910895FC0120810F
+:102F6000862F90E0820F911D628170E00E948A2F6F
+:102F70000380F481E02DE80FF91F808108950F93FD
+:102F80001F93CF93DF931F92CDB7DEB78C01698378
+:102F90000E94E017482FF80180816981262F30E0D8
+:102FA000280F311D6281C90170E00E948A2F808341
+:102FB000842F0F90DF91CF911F910F910C94E31705
+:102FC0008FB7F89408958FBF0895FC01CB0120912D
+:102FD0006E032430B1F421812F702093E90040E08A
+:102FE00050E064E070E00E94BA0F81110BC0909134
+:102FF000E80095FD07C09091E8009E779093E80067
+:10300000089582E0089520916E032430A9F4FC0114
+:1030100081818F708093E9003091F3002091F2005C
+:10302000932F80E0822B892B49F08091E8008E77E6
+:103030008093E8000C946F1182E0089580E0089579
+:1030400020916E03243051F4FC0121812F702093D4
+:10305000E9002091E80020FD0C9403180895FC017C
+:10306000CB0120916E03243011F080E00895268179
+:103070002F702093E9002091E80022FFF6CF2091E5
+:10308000E80025FFF2CF40E050E064E070E00E94ED
+:1030900009108091E80085FD05C08091E8008B77DC
+:1030A0008093E80081E0089590930F0280930E02D0
+:1030B000089580910E0290910F020895E0910E0202
+:1030C000F0910F02309721F00190F081E02D0994EA
+:1030D00080E00895E0910E02F0910F02309721F008
+:1030E0000280F381E02D09940895E0910E02F091A1
+:1030F0000F02309721F00480F581E02D09940895A6
+:1031000020911002309111028217930771F0909371
+:10311000110280931002E0910E02F0910F0230979D
+:1031200021F00680F781E02D099408952091120284
+:10313000309113028217930771F0909313028093DA
+:103140001202E0910E02F0910F02309721F00084FC
+:10315000F185E02D099408950E94B6240E948D0502
+:103160000E948A250C945F2B0C94CE075F926F927D
+:103170007F928F929F92AF92BF92CF92DF92EF9207
+:10318000FF920F931F93CF93DF93CDB7DEB72A97AC
+:103190000FB6F894DEBF0FBECDBF0E947E0694E14D
+:1031A000C92E92E0D92E00E010E0AA24A394B12CFD
+:1031B000502E802F0E94C4073C01F601E190F1904F
+:1031C0006F01E826F926E114F10431F40F5F1F4F77
+:1031D0000430110569F73AC08091680281FD0E94B0
+:1031E000CD0720E030E04501022E02C0880C991C7A
+:1031F0000A94E2F7C4018E219F21892B09F12E83C5
+:103200005F826820792081E0672809F480E0888760
+:103210000E94BF248160782F9A8789874E815F81C1
+:1032200068858A850E946F19F801EE0FFF1FEC5E1A
+:10323000FD4F80819181882599259183808316C0D7
+:103240002F5F3F4F2C30310571F6C0CF8FEF898350
+:103250008A831B820E94BF248160782F9D838C8388
+:1032600049815A816B818D810E946F190E94772854
+:1032700010911C020E945E181817D9F00E945E1867
+:1032800080931C022A960FB6F894DEBF0FBECDBF06
+:10329000DF91CF911F910F91FF90EF90DF90CF9032
+:1032A000BF90AF909F908F907F906F905F900C94A5
+:1032B000B4182A960FB6F894DEBF0FBECDBFDF91CB
+:1032C000CF911F910F91FF90EF90DF90CF90BF9023
+:1032D000AF909F908F907F906F905F900895CF9365
+:1032E000DF93CDB7DEB72B970FB6F894DEBF0FBED6
+:1032F000CDBF4F83588769877A878B87DE01119608
+:1033000086E0FD0111928A95E9F785E0FE01379686
+:1033100001900D928A95E1F749815A816B817C81F8
+:103320008D819E810E9447212B960FB6F894DEBFB7
+:103330000FBECDBFDF91CF910895CF93C82F8823C3
+:1033400009F4C1C0823859F40E945E1881FDBBC0E7
+:1033500089E30E94AC230E94282489E30CC08338AF
+:1033600079F40E945E1880FDAEC083E50E94AC2314
+:103370000E94282483E50E94CE23CF910C94282418
+:10338000843859F40E945E1882FD9DC087E40E9433
+:10339000AC230E94282487E4EECF8450813A48F47D
+:1033A0008C2F0E94C72A81118EC08C2F0E94AC23C3
+:1033B000E4CF8C2F805E883050F4C77081E090E0BD
+:1033C00001C0880FCA95EAF70E94EF23D6CF8C2F51
+:1033D000855A833078F4C53A29F0C63A31F482E848
+:1033E00090E005C081E890E002C083E890E0CF91D2
+:1033F0000C9480188C2F885A833108F064C0C83A26
+:1034000039F1C93A41F1CA3A49F1CB3A51F1CC3AD2
+:1034100059F1CD3A61F1C03B69F1CE3A71F1CF3A41
+:1034200079F1C13B81F1C23B89F1C33B91F1C43BCE
+:1034300099F1C53BA1F1C63BA9F1C73BB1F1C83B2E
+:10344000B9F1C93BC1F1CA3BC9F58AE292E038C083
+:1034500082EE90E035C089EE90E032C08AEE90E0D6
+:103460002FC085EB90E02CC086EB90E029C087EB65
+:1034700090E026C08CEC90E023C08DEC90E020C062
+:1034800083E891E01DC08AE891E01AC082E991E0EA
+:1034900017C084E991E014C081E292E011C083E298
+:1034A00092E00EC084E292E00BC085E292E008C098
+:1034B00086E292E005C087E292E002C080E090E000
+:1034C000CF910C949618CF910895882309F44DC09C
+:1034D000823859F40E945E1881FF47C089E30E9438
+:1034E000AC230E94282489E30CC0833871F40E9425
+:1034F0005E1880FF3AC083E50E94AC230E94282416
+:1035000083E50E94CE230C942824843859F40E9429
+:103510005E1882FF2AC087E40E94AC230E94282400
+:1035200087E4EFCF982F9450913A08F4EACF982F80
+:10353000905E983058F4282F277081E090E001C009
+:10354000880F2A95EAF70E94F523DDCF982F955A28
+:10355000933020F480E090E00C948018885A8331F6
+:1035600020F480E090E00C9496180895882321F0D0
+:103570000E94EF230C9428240895882321F00E94B0
+:10358000F5230C9428240895BF92CF92DF92EF92F6
+:10359000FF920F931F93CF93DF93CDB7DEB727979B
+:1035A0000FB6F894DEBF0FBECDBF8C0185E0F801E9
+:1035B000DE01119601900D928A95E1F7F8013081B4
+:1035C0002181F280558152955F7083819481892B8E
+:1035D00039F02F3F41F481E090E03F3F31F003C0EC
+:1035E00081E090E002C080E090E080FD73C3398309
+:1035F0002A8389819A815E830E946923B92E8F83F1
+:103600000E9468230E9490222B2D22952F7030E07B
+:103610005E816F812530310509F4E6C06CF42430F9
+:1036200031050CF0A2C04B2D407F8B2D8F702230C6
+:1036300031050CF045C017C02C3031054CF42A3050
+:1036400031050CF0E7C12830310509F043C3E5C06E
+:103650002D30310509F4BAC20CF4A2C22F30310565
+:1036600009F038C323C3182F411101C002C01295BD
+:10367000107FFF2059F0112309F46BC2812F6F8353
+:103680000E94FF230E9428246F8163C2862F0E941C
+:10369000651A112309F41EC3812F0E940524279661
+:1036A0000FB6F894DEBF0FBECDBFDF91CF911F9153
+:1036B0000F91FF90EF90DF90CF90BF900C94282453
+:1036C000403211F08295807F662319F0613071F5E8
+:1036D00023C0FF20B1F0511101C032C0513081F53B
+:1036E00027960FB6F894DEBF0FBECDBFDF91CF9106
+:1036F0001F910F91FF90EF90DF90CF90BF900C94AF
+:103700000F24511101C003C0513009F4E3C28E836C
+:103710000E9412248E819AC1FF2021F0563008F0B9
+:10372000D9C20EC0553008F0D5C290C1FF20C9F0F3
+:10373000552331F0F801958190FF0BC29F7095835E
+:1037400027960FB6F894DEBF0FBECDBFDF91CF91A5
+:103750001F910F91FF90EF90DF90CF90BF900C944E
+:10376000B61A552309F472C109C22B2D2695269548
+:10377000237030E02115310529F02130310509F0A1
+:10378000A9C219C0FF2021F0862F9B2D937002C083
+:1037900080E090E027960FB6F894DEBF0FBECDBF55
+:1037A000DF91CF911F910F91FF90EF90DF90CF901D
+:1037B000BF900C948018FF2021F0862F9B2D9370D2
+:1037C00002C080E090E027960FB6F894DEBF0FBEEF
+:1037D000CDBFDF91CF911F910F91FF90EF90DF90C0
+:1037E000CF90BF900C949618862FFF2019F00E945E
+:1037F0007D2702C00E94E52727960FB6F894DEBF0A
+:103800000FBECDBFDF91CF911F910F91FF90EF9031
+:10381000DF90CF90BF900C946C288B2D837009F0B3
+:1038200079C0F11057C2262F229526952770220FB6
+:10383000220F862F8F70C82ED12CE12CF12C022E56
+:1038400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF4
+:1038500010C06FE070E080E090E004C0660F771F5A
+:10386000881F991F2A95D2F760957095809590953D
+:1038700003C060E070E0CB012B2D269526952370C8
+:10388000422F50E042305105D9F04330510569F1E3
+:103890006C297D298E299F294130510551F12796A8
+:1038A0000FB6F894DEBF0FBECDBFDF91CF911F9151
+:1038B0000F91FF90EF90DF90CF90BF900C94A522D6
+:1038C0006C297D298E299F2927960FB6F894DEBF93
+:1038D0000FBECDBFDF91CF911F910F91FF90EF9061
+:1038E000DF90CF90BF900C94B7220E94A522C70111
+:1038F000B60127960FB6F894DEBF0FBECDBFDF919D
+:10390000CF911F910F91FF90EF90DF90CF90BF90DC
+:103910000C949322FF2019F08B2D817001C08695A5
+:10392000882309F4D7C1262F229526952770220FC8
+:10393000220F862F8F70C82ED12CE12CF12C022E55
+:1039400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF3
+:1039500010C06FE070E080E090E004C0660F771F59
+:10396000881F991F2A95D2F760957095809590953C
+:1039700003C060E070E0CB012B2D269526952370C7
+:10398000422F50E042305105D9F04330510569F1E2
+:103990006C297D298E299F294130510551F12796A7
+:1039A0000FB6F894DEBF0FBECDBFDF91CF911F9150
+:1039B0000F91FF90EF90DF90CF90BF900C94442335
+:1039C0006C297D298E299F2927960FB6F894DEBF92
+:1039D0000FBECDBFDF91CF911F910F91FF90EF9060
+:1039E000DF90CF90BF900C9456230E944423C701D0
+:1039F000B60127960FB6F894DEBF0FBECDBFDF919C
+:103A0000CF911F910F91FF90EF90DF90CF90BF90DB
+:103A10000C943223603F59F120F4603E08F494C0C6
+:103A200008C0623F09F467C0F0F1633F09F08CC041
+:103A300065C0162F1F708B2D8F71FF2021F00E9403
+:103A4000DD22812F7DCE0E94F822812F27960FB68E
+:103A5000F894DEBF0FBECDBFDF91CF911F910F91C4
+:103A6000FF90EF90DF90CF90BF900C94BD1AFF2095
+:103A7000B1F0553008F02EC18B2D8F7127960FB6FF
+:103A8000F894DEBF0FBECDBFDF91CF911F910F9194
+:103A9000FF90EF90DF90CF90BF900C94172356309B
+:103AA00008F018C1E9CFFF2099F08B2D8F71279670
+:103AB0000FB6F894DEBF0FBECDBFDF91CF911F913F
+:103AC0000F91FF90EF90DF90CF90BF900C94DD228C
+:103AD0008B2D8F7127960FB6F894DEBF0FBECDBF2A
+:103AE000DF91CF911F910F91FF90EF90DF90CF90DA
+:103AF000BF900C94F822F110EBCFD7CFFF2099F0B4
+:103B00008B2D8F7127960FB6F894DEBF0FBECDBFF9
+:103B1000DF91CF911F910F91FF90EF90DF90CF90A9
+:103B2000BF900C94CE2227960FB6F894DEBF0FBE3E
+:103B3000CDBFDF91CF911F910F91FF90EF90DF905C
+:103B4000CF90BF900C94C922FF20A9F0552309F40F
+:103B5000ACCF862F27960FB6F894DEBF0FBECDBF31
+:103B6000DF91CF911F910F91FF90EF90DF90CF9059
+:103B7000BF900C949D19552309F4AACF862F279640
+:103B80000FB6F894DEBF0FBECDBFDF91CF911F916E
+:103B90000F91FF90EF90DF90CF90BF900C94651A3B
+:103BA0004B2D4F70C8010E94E50227960FB6F8947E
+:103BB000DEBF0FBECDBFDF91CF911F910F91FF9060
+:103BC000EF90DF90CF90BF900C94FD21F11082C058
+:103BD0009B2D9F70492F50E04230510599F144F4DC
+:103BE0004115510569F04130510509F073C019C004
+:103BF00043305105C1F14430510509F06BC044C058
+:103C000027960FB6F894DEBF0FBECDBFDF91CF91E0
+:103C10001F910F91FF90EF90DF90CF90BF900C9489
+:103C2000702B27960FB6F894DEBF0FBECDBFDF9185
+:103C3000CF911F910F91FF90EF90DF90CF90BF90A9
+:103C40000C94872B27960FB6F894DEBF0FBECDBF1E
+:103C5000DF91CF911F910F91FF90EF90DF90CF9068
+:103C6000BF900C94A32B27960FB6F894DEBF0FBE1F
+:103C7000CDBFDF91CF911F910F91FF90EF90DF901B
+:103C8000CF90BF900C94B62B862F27960FB6F89442
+:103C9000DEBF0FBECDBFDF91CF911F910F91FF907F
+:103CA000EF90DF90CF90BF900C94DA2B4B2D4F709C
+:103CB000C80127960FB6F894DEBF0FBECDBFDF91C7
+:103CC000CF911F910F91FF90EF90DF90CF90BF9019
+:103CD0000C940E0827960FB6F894DEBF0FBECDBF2A
+:103CE000DF91CF911F910F91FF90EF90DF90CF90D8
+:103CF000BF9008950E940C240E94E1230E94282472
+:103D00000E9418290E946C2880E090E00E94801890
+:103D100080E090E00C9496180E94FC230C947A1E8C
+:103D20000E946923292F22952F7030E02C30310515
+:103D30004CF42A3031056CF422503109223031051F
+:103D400070F407C02C30310531F02F30310539F4D3
+:103D500002C081E0089593FB882780F9089580E0F0
+:103D60000895CF93DF9300D000D01F92CDB7DEB778
+:103D70000F900F900F900F900F90DF91CF910895BB
+:103D8000CF93DF9300D000D000D0CDB7DEB726961A
+:103D90000FB6F894DEBF0FBECDBFDF91CF9108956F
+:103DA0001F93CF93DF93C091530216E012C0D0E06F
+:103DB0001C9FF0011D9FF00D1124ED5DFD4F408112
+:103DC000518162817381848195810E94C01E2196F8
+:103DD000C77080915402C813EACFDF91CF911F9131
+:103DE000089540911D0250911E0260911F02709132
+:103DF000200280912102909122020C94C01E0F9308
+:103E00001F93CF93DF938091220282958F7009F0E8
+:103E100069C080911F02882309F464C0A0915302F5
+:103E2000D0915402B0911D02C0911E0280912002D7
+:103E30009091210221E030E0BF3F11F020E030E01E
+:103E4000122FBC016095709506E04AC0009721F0E2
+:103E5000CF3F29F4212F05C021E030E002C020E04F
+:103E600030E020FD3BC04A2F50E0049FF001059F49
+:103E7000F00D1124ED5DFD4F2181C2132FC0208173
+:103E8000B2132CC02281211129C02381348128172B
+:103E9000390718F0281B390B02C0260F371F283CA2
+:103EA0003105E0F4809122028F70806180932202BC
+:103EB00086E0849FF001859FF00D1124E85DFD4FA1
+:103EC00080818F70806180838DE192E00E94C41AAE
+:103ED000DF91CF911F910F910C94D01EAF5FA7700F
+:103EE000AD13B4CFDF91CF911F910F910895EF9251
+:103EF000FF920F931F93CF93DF93CDB7DEB76297F7
+:103F00000FB6F894DEBF0FBECDBF8C0185E0F8017F
+:103F1000DE011D9601900D928A95E1F7D8014C9132
+:103F200011965C91119712966C9112971396ED90E1
+:103F3000FC90149770911D02E0911E028091200266
+:103F400090912102009739F0EF3F41F421E030E0F9
+:103F50007F3F31F003C021E030E002C020E030E0DC
+:103F600020FD5CC120911F02222309F4F1C0E81654
+:103F7000F90628F09701281B390BC90104C0809568
+:103F800090958E0D9F1D883C910508F098C08091FA
+:103F90002202982F907F09F064C0E51314C07413B7
+:103FA00012C0611110C08F708061809322020E9444
+:103FB000F11E8DE192E00E94C41A80912202D80184
+:103FC00015968C9343C1EF2839F05F3F41F481E0AF
+:103FD00090E04F3F31F003C081E090E002C080E00C
+:103FE00090E080FD03C081E0862702C080E090E081
+:103FF00080FF2EC0809153022091540236E013C0FE
+:1040000090E0389FF001399FF00D1124ED5DFD4FD8
+:104010007181571306C07081471303C07281671303
+:1040200017C0019687708213EBCF12C19F7059F0B1
+:10403000882309F40BC107C09F7029F0F80195810E
+:10404000907F09F403C1805E883008F4FFC0D2C0BD
+:10405000662309F4FBC080912202816080932202D2
+:10406000F5C0E51308C0741306C0611104C0D8017F
+:1040700015968C939DC04D875E878D859E856A8B36
+:104080000E94901E6A89882309F4B4C0662309F44B
+:10409000B1C020912202822F82958F7090E002970A
+:1040A0000CF4C6C080911D0290911E0298878F83E8
+:1040B0001986FB86EA862C87CE01079646C080913A
+:1040C0002202982F907F59F47E2DF98AE88A8989F7
+:1040D0000E94B11E8DE192E00E94C41A95C0E513C2
+:1040E00011C074130FC061110DC0F8018583C801A0
+:1040F0000E94C41AEDE1F2E086E0DF011D928A958C
+:10410000E9F7A2C04D875E878D859E856A8B0E94E8
+:10411000901E6A89882309F46DC0662309F46AC079
+:1041200020912202822F82958F7090E002970CF4EA
+:104130007FC080911D0290911E029A8389831B8209
+:10414000FD82EC822E83CE0101960E94C41A70C0BB
+:10415000E816F90628F09701281B390BC90104C09D
+:10416000809590958E0D9F1D883C910508F046C066
+:10417000662309F43FC0E51330C074132EC02091AC
+:10418000220220FD21C0322F32953F70832F90E014
+:104190000097D1F0D80115962C9315970F9741F001
+:1041A000832F8F5F8295807F2F70282B15962C93FD
+:1041B000C8010E94C41A86E0F801ADE1B2E00190A6
+:1041C0000D928A95E1F73EC086E0F801ADE1B2E0DC
+:1041D00001900D928A95E1F737C04D875E878D85F6
+:1041E0009E850E94901E811123C0809122028160D1
+:1041F00080932202C8010E94C41A26C07E2DF98A2B
+:10420000E88A89890E94B11EEDE1F2E086E0DF01D3
+:104210001D928A95E9F70E94F11E18C0662351F39A
+:104220004D875E878D859E850E94901E882311F3A1
+:1042300086E0F801ADE1B2E001900D928A95E1F7D8
+:104240000E94FF1E0E94F11E81E014C080E012C097
+:104250004D875E878D859E850E946923292F229533
+:104260002F7030E0223031050CF4E0CE24303105DF
+:104270000CF6E2CE62960FB6F894DEBF0FBECDBF4D
+:10428000DF91CF911F910F91FF90EF9008951F93B1
+:10429000CF93DF93CDB7DEB72C970FB6F894DEBF80
+:1042A0000FBECDBF4F83588769877A878B879C87DE
+:1042B000CE0107960E94771F8823D9F02F81388579
+:1042C0008A859B85892B39F03F3F19F080E090E08B
+:1042D00004C02F3FD9F781E090E0892B09F06DC031
+:1042E0004F81588569857A858B859C850E94C01E83
+:1042F00064C086E0FE013796DE01119601900D92B2
+:104300008A95E1F7FF81E8854A855B85411551056E
+:1043100039F0EF3F41F481E090E0FF3F31F003C01E
+:1043200081E090E002C080E090E080FD46C02091F6
+:10433000540230E0C90101968770992760915302B9
+:1043400070E08617970709F440C0F983EA835D831C
+:104350004C8396E0929FD001939FB00D1124AD5DE8
+:10436000BD4FFE01319601900D929A95E1F7809331
+:1043700054020E94D01E21C0189FC00111248D5DDF
+:104380009D4F0E94771F882371F1E09153021E9F79
+:10439000F0011124ED5DFD4F4081518162817381F7
+:1043A000848195810E94C01E8091530290E0019605
+:1043B000877099278093530201C016E080915302C1
+:1043C000909154028913D8CF0EC00E948C1E109277
+:1043D000540210925302EDE1F2E086E0DF011D92FB
+:1043E0008A95E9F7EACF2C960FB6F894DEBF0FBE98
+:1043F000CDBFDF91CF911F910895DF92EF92FF9291
+:104400000F931F93CF93DF93EC01009709F46CC0D7
+:10441000D12CEE24E394F12C8E010F5F1F4FFE018F
+:104420008491843748F4843008F04AC0813071F0B8
+:10443000823009F059C01EC0853709F43DC070F1C3
+:10444000982F9458903708F04FC03DC02296F8013D
+:104450008491982F905E983050F48770FE2D01C0A3
+:10446000FF0F8A95EAF78F2F0E94FF2330C00E942A
+:104470009D192DC02296F8018491982F905E983056
+:1044800050F48770FE2D01C0FF0F8A95EAF78F2F39
+:104490000E9405241CC00E94651A19C02296F801CA
+:1044A000049107C08FE99FE00197F1F700C0000079
+:1044B00001500111F7CF0BC02296F801D49007C02C
+:1044C0000E949D1903C08F770E94651AE8018D2D07
+:1044D00007C08150EFE9FFE03197F1F700C000001D
+:1044E000882309F499CFF5CFDF91CF911F910F91D8
+:1044F000FF90EF90DF9008956093590270935A02F5
+:1045000080935B0290935C020C947A1E6093550238
+:104510007093560280935702909358020C947A1E1F
+:1045200008950C947C220F931F93009159021091CF
+:104530005A0220915B0230915C02602B712B822B1E
+:10454000932B1F910F910C947C220F931F9300913A
+:10455000590210915A0220915B0230915C02602353
+:104560007123822393231F910F910C947C220F932C
+:104570001F930091590210915A0220915B023091D1
+:104580005C0260277127822793271F910F910C945B
+:104590007C2260E070E0CB010C94862241E050E088
+:1045A00060E070E004C0440F551F661F771F8A95B6
+:1045B000D2F7CB01BA010C94862241E050E060E0D2
+:1045C00070E004C0440F551F661F771F8A95D2F70D
+:1045D0008091550290915602A0915702B0915802D5
+:1045E000482B592B6A2B7B2BCB01BA010C948622CA
+:1045F00041E050E060E070E004C0440F551F661FCA
+:10460000771F8A95D2F74095509560957095809167
+:10461000550290915602A0915702B091580248233A
+:1046200059236A237B23CB01BA010C94862241E0F3
+:1046300050E060E070E004C0440F551F661F771F14
+:104640008A95D2F78091550290915602A091570217
+:10465000B0915802482759276A277B27CB01BA0116
+:104660000C9486220F931F930091550210915602CD
+:104670002091570230915802602B712B822B932B83
+:104680001F910F910C9486220F931F930091550256
+:1046900010915602209157023091580260237123E5
+:1046A000822393231F910F910C9486220F931F93C3
+:1046B00000915502109156022091570230915802F4
+:1046C00060277127822793271F910F910C948622D0
+:1046D0000895CF92DF92EF92FF920F931F93CF93A3
+:1046E000DF93EC01C0905902D0905A02E0905B0237
+:1046F000F0905C028091550290915602A091570271
+:10470000B0915802C82AD92AEA2AFB2A0FE110E000
+:10471000B701A601002E04C0769567955795479579
+:104720000A94D2F740FF08C0BE01802F0E94E00328
+:104730008130910509F007C00150110948F7BE0109
+:1047400080E00E94E003DF91CF911F910F91FF90D5
+:10475000EF90DF90CF90089540911B0150911C0184
+:1047600020E030E09FEFFA01E20FF31F628168174B
+:10477000A1F09F3F19F4611101C0922F2F5F3F4FAD
+:104780002630310581F707C0FA01E90FF11D97FDC9
+:10479000FA95828308959F3FB9F7089540911B01D0
+:1047A00050911C0120E030E0FA01E20FF31F9281EA
+:1047B000981301C012822F5F3F4F26303105A1F7B9
+:1047C000089581E090E0E0911B01F0911C01E80F59
+:1047D000F91F1082019688309105A9F708959091EC
+:1047E0005D02982B90935D020895809590915D02F3
+:1047F000982390935D02089510925D020895909120
+:104800005E02982B90935E020895809590915E02CF
+:10481000982390935E02089510925E02089580930B
+:104820005F02089510925F02089540911B0150911C
+:104830001C0120E030E080E0FA01E20FF31F9181DB
+:1048400091118F5F2F5F3F4F27303105A9F70895F2
+:10485000E0911B01F0911C0180915D028083E09149
+:104860001B01F0911C01808190915E02892B808355
+:1048700090915F02992361F0E0911B01F0911C017E
+:104880008081892B80830E94152481110E9412242B
+:1048900080911B0190911C010C946A1880916E0309
+:1048A000843009F11092690220E488E190E00FB6AB
+:1048B000F894A895809360000FBE2093600083B7A2
+:1048C000817F846083BF83B7816083BF789488953C
+:1048D00083B78E7F83BF88E10FB6F8948093600022
+:1048E000109260000FBE0895CF930E94E3020E94D1
+:1048F0007E060E94E402C0E08C2F0E94C407892B30
+:1049000029F4CF5FC430C1F780E001C081E0CF91CE
+:1049100008950E948C1E0C945F2B1F920F920FB66D
+:104920000F9211248F939F93AF93BF93809169024D
+:10493000811113C080916A0290916B02A0916C0268
+:10494000B0916D024196A11DB11D80936A029093B2
+:104950006B02A0936C02B0936D02BF91AF919F91D7
+:104960008F910F900FBE0F901F90189582E084BD1D
+:1049700093E095BD9AEF97BD80936E0008958FB731
+:10498000F89440916A0250916B0260916C027091B0
+:104990006D028FBFCA010895CF92DF92EF92FF920E
+:1049A0000F931F932FB7F89440916A0250916B02B6
+:1049B00060916C0270916D022FBF6A017B01EE2441
+:1049C000FF248C0120E030E0C016D106E206F30699
+:1049D00020F09A01281B390B05C09C0120953095C9
+:1049E000240F351FC9011F910F91FF90EF90DF90A9
+:1049F000CF9008951F920F920FB60F9211248F93AC
+:104A00009F93AF93BF9380916A0290916B02A091A4
+:104A10006C02B0916D020196A11DB11D80936A02D6
+:104A200090936B02A0936C02B0936D02BF91AF9113
+:104A30009F918F910F900FBE0F901F9018950E941D
+:104A4000A111F8942FEF87EA91E621508040904021
+:104A5000E1F700C0000087E090EBDC018093780371
+:104A600090937903A0937A03B0937B032CE088E1C1
+:104A700090E00FB6F894A895809360000FBE209345
+:104A80006000FFCFCF92DF92EF92FF920F931F93C0
+:104A9000CF93DF93C82ED12C01E010E08D2D0E9422
+:104AA000C4077C01C0E0D0E098010C2E02C0220FA8
+:104AB000331F0A94E2F72E213F21232B29F421965C
+:104AC000CC30D10589F708C06C2F7D2D80E00E9485
+:104AD000BB03C812F4CF06C0D39484E0D812DECF53
+:104AE00080E001C081E0DF91CF911F910F91FF9095
+:104AF000EF90DF90CF900895CF93C82F8CE20E9463
+:104B00004225882321F08C2FCF910C94422580E000
+:104B1000CF910895CF930E94CD26811102C00E94AB
+:104B2000AE26C5E608C00E947E068FE39CE9019789
+:104B3000F1F700C00000C150B1F789E20E947C2566
+:104B400081110AC18AE20E947C2581110E94AE2651
+:104B500085E00E947C2581110E941F250E94D82695
+:104B60008093680287E00E947C25882399F18BE17D
+:104B70000E947C25882351F09091680291FB882740
+:104B800080F921E0822780FB91F922C08EE00E940B
+:104B90007C25882351F09091680292FB882780F948
+:104BA00021E0822780FB92F913C080E10E947C25DE
+:104BB00090916802882341F093FB882780F921E0D7
+:104BC000822780FB93F904C0892F809580FB90F9A0
+:104BD00090936802809168020E94DC260E94EA2677
+:104BE00080937B0280EE0E947C25882341F0809197
+:104BF0007B02982F909590FB80F980937B0289E34C
+:104C00000E947C25882359F090917B0291FB882794
+:104C100080F921E0822780FB91F990937B0282EE5C
+:104C20000E947C25882359F090917B0292FB882773
+:104C300080F921E0822780FB92F990937B0286EE37
+:104C40000E947C25882359F090917B0293FB882752
+:104C500080F921E0822780FB93F990937B0283EE19
+:104C60000E947C25882359F090917B0294FB882731
+:104C700080F921E0822780FB94F990937B0285E301
+:104C80000E947C25882359F090917B0295FB882710
+:104C900080F921E0822780FB95F990937B0281E3E4
+:104CA0000E947C25882359F090917B0296FB8827EF
+:104CB00080F921E0822780FB96F990937B0281E1C5
+:104CC0000E947C25882359F090917B0297FB8827CE
+:104CD00080F921E0822780FB97F990937B028091F5
+:104CE0007B020E94EE2687E20E947C25C82F8EE17F
+:104CF0000E947C258111C2608FE10E947C25811178
+:104D0000C46080E20E947C258111C86081E20E941B
+:104D10007C258111C06182E20E947C258111C062E4
+:104D200083E20E947C258111C06484E20E947C257C
+:104D3000882311F0C06802C0CC2329F08C2F0E9478
+:104D4000E5266C2F03C00E94E126682F70E080E00A
+:104D500090E0CF910C949122CF9108956DEE7EEF6B
+:104D600080E090E00E94BA2F60E082E090E00E9434
+:104D7000AC2F60E083E090E00E94AC2F60E084E024
+:104D800090E00E94AC2F60E085E090E00E94AC2FA4
+:104D900060E086E090E00C94AC2F80E090E00E9410
+:104DA000A62F21E08D3E9E4F09F020E0822F08952E
+:104DB00082E090E00C949E2F682F82E090E00C94AB
+:104DC000AC2F83E090E00C949E2F682F83E090E05E
+:104DD0000C94AC2F84E090E00C949E2F682F84E01C
+:104DE00090E00C94AC2F86E090E00C949E2F682FFE
+:104DF00086E090E00C94AC2F8091760280FF0BC08F
+:104E00006091200185E0689FB00111247595679538
+:104E1000759567952AC081FF09C06091200185E0E2
+:104E2000689FB0011124759567951FC082FF07C068
+:104E30006091200185E0689FB001112416C0409167
+:104E400070024423C9F060911F01461788F7209132
+:104E5000200185E0289F90011124429FC001439FBB
+:104E6000900D112470E00E948A2F6038710540F483
+:104E70006115710539F002C065E070E0862F089574
+:104E80008FE7089581E008958091760280FF08C041
+:104E900060911E0170E0759567957595679521C0C5
+:104EA00081FF06C060911E0170E07595679519C07D
+:104EB00082FF04C060911E0170E010C080917002FA
+:104EC0008823C1F060911D018617A0F790911E0103
+:104ED000989FC001112470E00E948A2F60387105EC
+:104EE00028F46115710521F0862F08958FE7089544
+:104EF00081E0089561E070E0F4CF803F21F40E94EA
+:104F0000FC26819504C0813F29F40E94FC268093F1
+:104F100073020895823F21F40E94FC26819504C00B
+:104F2000833F29F40E94FC26809372020895893FF2
+:104F300019F40E94442705C08A3F31F40E94442797
+:104F400081958093740208958B3F21F40E94442739
+:104F5000819504C08C3F29F40E94442780937502F8
+:104F60000895843F21F480917102816017C0853FCC
+:104F700021F480917102826011C0863F21F48091FA
+:104F8000710284600BC0873F21F4809171028860B8
+:104F900005C0883F31F48091710280618093710275
+:104FA00008958D3F21F48091760281600BC08E3F81
+:104FB00021F480917602826005C08F3F29F48091B0
+:104FC00076028460809376020895803F29F4809170
+:104FD000730287FF6EC007C0813F41F48091730266
+:104FE00018160CF066C01092730263C090917202A2
+:104FF000823F19F497FF5DC005C0833F31F4191655
+:105000000CF057C01092720254C0893F31F4809165
+:10501000740218160CF04DC006C08A3F39F4809116
+:10502000740287FF46C01092740243C08B3F29F47C
+:105030008091750287FF3DC006C08C3F39F4809196
+:1050400075021816B4F51092750233C0843F21F42E
+:10505000809171028E7F05C0853F31F4809171028D
+:105060008D7F8093710225C0863F21F4809171026B
+:105070008B7FF7CF873F21F480917102877FF1CF3B
+:10508000883F21F4809171028F7EEBCF8D3F21F418
+:10509000809176028E7F0BC08E3F21F48091760244
+:1050A0008D7F05C08F3F29F4809176028B7F80939E
+:1050B00076028091720281110EC08091730281117B
+:1050C0000AC080917402811106C08091750281111D
+:1050D00002C010927002089581E792E00E94751854
+:1050E0000E94BF2490936F0280936E020895CF9325
+:1050F00080916E0290916F020E94CC2440917002C8
+:10510000442321F02091210130E006C020912201AA
+:105110005AE0259F900111248217930708F486C056
+:105120008091720281110DC090917302911109C09A
+:1051300090917402911105C090917502992309F420
+:1051400075C04F3F19F04F5F40937002181624F45A
+:105150000E94FC26809372028091720287FF05C034
+:105160000E94FC268195809372028091730218162A
+:1051700024F40E94FC26809373028091730287FFBF
+:1051800005C00E94FC268195809373026091720293
+:10519000662339F1C0917302CC2319F1772767FD9B
+:1051A0007095872F972F0E94FA2C23E333E343E374
+:1051B0005FE30E94AE2D0E94C72C609372026C2F99
+:1051C000772767FD7095872F972F0E94FA2C23E38E
+:1051D00033E343E35FE30E94AE2D0E94C72C60934C
+:1051E000730280917402181624F40E94442780935D
+:1051F00074028091740287FF05C00E944427819544
+:105200008093740280917502181624F40E9444273A
+:10521000809375028091750287FF05C00E94442724
+:10522000819580937502CF910C946C28CF9108954D
+:10523000E1E7F2E085E0DF011D928A95E9F710923F
+:105240007002109276020895833089F130F4813033
+:1052500061F0823009F06EC019C0853009F449C090
+:10526000B8F1863009F066C055C020912201862F22
+:1052700090E0820F911D8F3F910520F4620F6093A3
+:10528000220108958FEF809322010895209121013A
+:10529000862F90E0820F911D8F3F910520F4620FC1
+:1052A0006093210108958FEF80932101089520914B
+:1052B0002001862F90E0820F911D8F3F910520F4F1
+:1052C000620F6093200108958FEF8093200108956D
+:1052D00020911F01862F90E0820F911D8F3F910535
+:1052E00020F4620F60931F0108958FEF80931F01D8
+:1052F000089520911E01862F90E0820F911D8F3F0F
+:10530000910520F4620F60931E0108958FEF809342
+:105310001E01089520911D01862F90E0820F911D9E
+:105320008F3F910520F4620F60931D0108958FEF68
+:1053300080931D010895833021F130F4813059F0BC
+:10534000823009F049C012C0853089F128F18630D9
+:1053500009F042C037C080912201681720F4861BF3
+:1053600080932201089510922201089580912101D5
+:10537000681720F4861B8093210108951092210163
+:10538000089580912001681720F4861B80932001E6
+:10539000089510922001089580911F01681720F44C
+:1053A000861B80931F01089510921F01089580911C
+:1053B0001E01681720F4861B80931E010895109229
+:1053C0001E01089580911D01681720F4861B8093AB
+:1053D0001D01089510921D01089541E050E060E024
+:1053E00070E004C0440F551F661F771F8A95D2F7DF
+:1053F000CB01BA010E9491220C948C1E873208F5D1
+:105400008E3108F0B9C08E3009F47EC060F4873068
+:1054100009F465C018F4863059F549C0883051F157
+:105420008B3031F5AEC0883130F4863108F0A9C038
+:105430008031F1F473C0893109F4A3C08B31C1F418
+:1054400059C08933F1F068F4893209F493C018F433
+:10545000873271F48FC0853309F48CC0883341F4EE
+:1054600090C0863409F46BC008F488C0883449F1D0
+:1054700080E008950E94D8260E94EA260E94F32622
+:1054800080C00E945918892B59F00E945918909396
+:105490007902809378020E948C1E80E090E004C024
+:1054A00080917802909179020E9454186AC080918C
+:1054B0006802817F8E7F8093680281E0809377020B
+:1054C00008950E948C1E2FEF83ED90E321508040C1
+:1054D0009040E1F700C000000E941F2552C080915B
+:1054E000680280FF03C0817F8E7F01C0816080934E
+:1054F000680247C09091680291FB882780F921E0FB
+:10550000822780FB91F913C09091680292FB882753
+:1055100080F921E0822780FB92F909C0909168020E
+:1055200093FB882780F921E0822780FB93F99093F1
+:105530006802882331F191609093680222C081E86B
+:1055400090E00E9480182FEF81EE94E0215080407F
+:105550009040E1F700C0000080E090E00E948018D9
+:105560002FEF89E698E1215080409040E1F700C09C
+:10557000000007C080E003C08D5101C089530E9424
+:10558000ED2981E0089580E0089580E00895CF93AB
+:10559000C82F80917702813071F020F0823009F0BD
+:1055A00083C037C0A0911B01B0911C018C91823245
+:1055B00009F07CC007C0A0911B01B0911C018C9127
+:1055C000823249F48C2F0E94C32A81111EC08C2F75
+:1055D0000E94FE291CC08C2F0E94C52A811115C073
+:1055E000C43169F030F4CB3081F0C03109F062C0D1
+:1055F00009C0C93221F0C83309F05CC006C010925E
+:10560000770258C082E08093770281E090E0817059
+:1056100054C0C932C1F060F4C431A9F020F4C730DD
+:1056200009F046C02EC0CE51CA3008F041C011C0AA
+:10563000CE3409F118F4CB34D9F517C0C13599F03F
+:10564000C235B1F50EC010927A0281E080937702E4
+:1056500034C0EC2FF0E0E455FE4F808180937A0255
+:1056600027C061E003C061E007C06AE080917A0270
+:105670000E9424291DC06AE080917A020E949B2921
+:1056800017C08EE18093220182E3809321018AE09A
+:105690008093200184E180931F0188E080931E01A4
+:1056A00088E280931D0104C01092770280E005C05B
+:1056B00081E003C080E090E0AACFCF9108950E94DE
+:1056C000CD26811102C00E94AE260E94F32680934F
+:1056D000770380FF02C0869501C080E00C94DF074D
+:1056E00080917703982F9695292F30E0233031054C
+:1056F0004CF49F5F990F8170892B816080937703B1
+:105700000E94F7268091770386950C94DF0780919D
+:105710007703982F969591F09158990F8170892B66
+:10572000809377038E7F91E009F490E08091770376
+:1057300090FB80F9809377030E94F726809177038E
+:1057400086950C94DF0780917703982F909590FBB6
+:1057500080F9809377030E94F7268091770380FF7A
+:1057600002C0869501C080E00C94DF07309177037A
+:10577000232F26952F5F2F77822F90E0317004978B
+:105780002CF4220F232B2093770302C0309377034E
+:1057900080917703282F2E7F91E009F490E090FB11
+:1057A00080F9809377030E94F7268091770386958E
+:1057B0000C94DF0720917703922F96959827990FE5
+:1057C000822F8170892B809377038E7F91E009F47B
+:1057D00090E08091770390FB80F9809377030E949B
+:1057E000F7268091770386950C94DF075058BB27E6
+:1057F000AA270ED075C166D130F06BD120F031F4FC
+:105800009F3F11F41EF45BC10EF4E095E7FB51C11C
+:10581000E92F77D180F3BA176207730784079507DA
+:1058200018F071F49EF58FC10EF4E0950B2EBA2F8F
+:10583000A02D0B01B90190010C01CA01A001112496
+:10584000FF27591B99F0593F50F4503E68F11A1642
+:10585000F040A22F232F342F4427585FF3CF4695D3
+:1058600037952795A795F0405395C9F77EF41F16F5
+:10587000BA0B620B730B840BBAF09150A1F0FF0FBF
+:10588000BB1F661F771F881FC2F70EC0BA0F621FAB
+:10589000731F841F48F4879577956795B795F7959B
+:1058A0009E3F08F0B3CF9395880F08F09927EE0F2D
+:1058B000979587950895D9D008F481E008950CD084
+:1058C0000FC107D140F0FED030F021F45F3F19F056
+:1058D000F0C0511139C1F3C014D198F39923C9F321
+:1058E0005523B1F3951B550BBB27AA2762177307E6
+:1058F000840738F09F5F5F4F220F331F441FAA1F9A
+:10590000A9F333D00E2E3AF0E0E830D09150504059
+:10591000E695001CCAF729D0FE2F27D0660F771F07
+:10592000881FBB1F261737074807AB07B0E809F0E9
+:10593000BB0B802DBF01FF2793585F4F2AF09E3F7E
+:10594000510568F0B6C000C15F3FECF3983EDCF350
+:10595000869577956795B795F7959F5FC9F7880FF7
+:10596000911D9695879597F90895E1E0660F771F49
+:10597000881FBB1F621773078407BA0720F0621BDA
+:10598000730B840BBA0BEE1F88F7E095089504D0D3
+:105990006894B111D9C00895BCD088F09F5790F099
+:1059A000B92F9927B751A0F0D1F0660F771F881F44
+:1059B000991F1AF0BA95C9F712C0B13081F0C3D05F
+:1059C000B1E00895C0C0672F782F8827B85F39F0FD
+:1059D000B93FCCF3869577956795B395D9F73EF4A3
+:1059E00090958095709561957F4F8F4F9F4F08954B
+:1059F000E89409C097FB3EF4909580957095619569
+:105A00007F4F8F4F9F4F9923A9F0F92F96E9BB271E
+:105A10009395F695879577956795B795F111F8CF9A
+:105A2000FAF4BB0F11F460FF1BC06F5F7F4F8F4F05
+:105A30009F4F16C0882311F096E911C0772321F0FB
+:105A40009EE8872F762F05C0662371F096E8862F93
+:105A500070E060E02AF09A95660F771F881FDAF7EA
+:105A6000880F9695879597F90895990F0008550F17
+:105A7000AA0BE0E8FEEF16161706E807F907C0F0D4
+:105A800012161306E407F50798F0621B730B840BDC
+:105A9000950B39F40A2661F0232B242B252B21F4B6
+:105AA00008950A2609F4A140A6958FEF811D811D56
+:105AB000089597F99F6780E870E060E008959FEF90
+:105AC00080EC089500240A94161617061806090695
+:105AD000089500240A941216130614060506089564
+:105AE000092E0394000C11F4882352F0BB0F40F4EC
+:105AF000BF2B11F460FF04C06F5F7F4F8F4F9F4F2C
+:105B0000089557FD9058440F551F59F05F3F71F0AD
+:105B10004795880F97FB991F61F09F3F79F0879514
+:105B20000895121613061406551FF2CF4695F1DF9D
+:105B300008C0161617061806991FF1CF869571052D
+:105B4000610508940895E894BB2766277727CB0161
+:105B500097F908958ADF08F48FEF08950BD0C0CF2E
+:105B6000B1DF28F0B6DF18F0952309F0A2CFA7CF58
+:105B70001124EACFC6DFA0F3959FD1F3950F50E033
+:105B8000551F629FF001729FBB27F00DB11D639FEF
+:105B9000AA27F00DB11DAA1F649F6627B00DA11D95
+:105BA000661F829F2227B00DA11D621F739FB00D3B
+:105BB000A11D621F839FA00D611D221F749F3327AB
+:105BC000A00D611D231F849F600D211D822F762F44
+:105BD0006A2F11249F5750408AF0E1F088234AF041
+:105BE000EE0FFF1FBB1F661F771F881F915050408D
+:105BF000A9F79E3F510570F05CCFA6CF5F3FECF355
+:105C0000983EDCF3869577956795B795F795E79578
+:105C10009F5FC1F7FE2B880F911D9695879597F989
+:105C20000895FA01EE0FFF1F30962105310599F115
+:105C30006115710561F48038BFE39B0749F16894F1
+:105C40009038810561F08038BFEF9B0741F09923C0
+:105C500042F5FF3FE1053105210511F1E894089473
+:105C6000E795D901AA2329F4AB2FBE2FF85FD0F313
+:105C700010C0FF5F70F4A695E0F7F73950F019F007
+:105C8000FF3A38F49F779F930CD00F9007FC905801
+:105C900008953EF014CF60E070E080E89FE308953F
+:105CA0004FE79F775F934F933F932F939ED02F9112
+:105CB0003F914F915F9152DF05C019F40EF0F9CE7C
+:105CC00042CFFDCE26DFC8F39638C0F707F80F9213
+:105CD000E8942BE33AEA48EB5FE74EDF0F920F922E
+:105CE0000F924DB75EB70F92C0D0ECEAF0E016D03D
+:105CF0004F915F91EF91FF91E595EE1FFF1F49F0E6
+:105D0000FE57E0684427EE0F441FFA95E1F74195EE
+:105D1000550B32D00F9007FE26C00895DF93CF9326
+:105D20001F930F93FF92EF92DF927B018C01689497
+:105D300005C0DA2EEF011EDFFE01E894A591259142
+:105D4000359145915591AEF3EF0162DDFE0197016A
+:105D5000A801DA9479F7DF90EF90FF900F911F91EF
+:105D6000CF91DF9108959B01AC0160E070E080E885
+:105D70009FE3A5CD9ECEACC0CCDEE8F39923D9F34A
+:105D8000940F511DBBF39150504094F059F088236B
+:105D900032F0660F771F881F91505040C1F79E3F29
+:105DA000510544F7880F911D9695879597F90895A9
+:105DB0005F3FACF0983E9CF0BB2786957795679542
+:105DC000B79508F4B1609395C1F7BB0F58F711F47C
+:105DD00060FFE8CF6F5F7F4F8F4F9F4FE3CFB4CE11
+:105DE0000EF076C06CCE689464CE93DEC8F399232F
+:105DF000D1F3C6F3DF93CF931F930F93FF92C92F75
+:105E0000DD2788232AF02197660F771F881FDAF78E
+:105E100020E030E040E85FEB9FE3883920F0803EEF
+:105E200030F021968F77E3DCE4EDF0E003C0DFDCB7
+:105E3000E1E0F1E073DF8B01BE01EC01FB2E6F5757
+:105E400071097595771F880B990BD4DD28E132E72E
+:105E500041E35FE38FDEAF2D9801AE01FF900F911C
+:105E60001F91CF91DF91D4DC3BCEFA01DC01AA0F68
+:105E7000BB1F9B01AC01BF5728F4222733274427BF
+:105E800050781FC0B75188F4AB2F00244695379542
+:105E90002795011CA395D2F3002069F0220F331F30
+:105EA000441FB395DAF30DD0A1CC61307105A0E8A1
+:105EB0008A07B94630F49B01AC016627772788270B
+:105EC0009078309621F02083318342835383089564
+:105ED0009F3F31F0915020F4879577956795B7955E
+:105EE000880F911D9695879597F90895AA1BBB1B5E
+:105EF00051E107C0AA1FBB1FA617B70710F0A61BCA
+:105F0000B70B881F991F5A95A9F780959095BC01EA
+:105F1000CD01089597FB072E16F4009407D077FD66
+:105F200009D00E94762F07FC05D03EF4909581950C
+:105F30009F4F0895709561957F4F0895F999FECF11
+:105F400092BD81BDF89A992780B50895A8E1B0E087
+:105F500042E050E00C94C12F262FF999FECF1FBAD2
+:105F600092BD81BD20BD0FB6F894FA9AF99A0FBE82
+:105F7000019608950E94AC2F272F0C94AD2FDC01C1
+:105F8000CB01FC01F999FECF06C0F2BDE1BDF89A44
+:105F9000319600B40D9241505040B8F70895F894EE
+:025FA000FFCF31
+:105FA2000507000C058540000001064000000100C5
+:105FB200D80B680C440C0F0CDB0B01600228081490
+:105FC2000A321E40004500250026006100600020C4
+:105FD2000037006400650066006700440046002444
+:105FE2000047000000020004000500070009000B42
+:105FF200000C000E0010001100130015001700180D
+:10600200001A001C001D001F00210023002400268E
+:1060120000280029002B002D002F00300032003410
+:10602200003500370039003B008803A103BA03D3CF
+:1060320003FB04AE04780458043F4D3620020302E9
+:10604200000001000101010101000101010203043C
+:0660520005060708090025
+:00000001FF
diff --git a/keyboard/preonic/Makefile b/keyboard/preonic/Makefile
index 40bd36aecf..0145e44bc6 100644
--- a/keyboard/preonic/Makefile
+++ b/keyboard/preonic/Makefile
@@ -127,7 +127,8 @@ MIDI_ENABLE = yes # MIDI controls
BACKLIGHT_ENABLE = yes
ifdef MIDI_ENABLE
- SRC += keymap_midi.c
+ SRC += keymap_midi.c \
+ beeps.c
endif
# Optimize size but this may cause error "relocation truncated to fit"
diff --git a/keyboard/preonic/beeps.c b/keyboard/preonic/beeps.c
index 13e46e1daf..8ffd70f417 100644
--- a/keyboard/preonic/beeps.c
+++ b/keyboard/preonic/beeps.c
@@ -5,31 +5,6 @@
#include <avr/io.h>
#define PI 3.14159265
-#define CHANNEL OCR1C
-
-volatile uint16_t sample;
-uint16_t lastSample;
-
-const int sounddata_length=200;
-
-const unsigned char sounddata_data[] PROGMEM = {128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
-128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 127, 129, 128, 127, 133,
-117, 109, 125, 121, 116, 132, 140, 126, 114, 114, 116, 120, 114, 93, 73, 66, 76, 116, 142, 129,
-128, 129, 120, 119, 118, 104, 87, 123, 181, 194, 196, 198, 189, 176, 160, 162, 172, 164, 164, 183,
-197, 188, 168, 167, 170, 165, 185, 209, 206, 196, 196, 199, 185, 162, 156, 167, 176, 173, 170, 166,
-151, 142, 140, 134, 130, 127, 113, 86, 67, 66, 69, 75, 73, 75, 86, 90, 91, 84, 65, 48,
-41, 30, 26, 56, 91, 88, 72, 70, 73, 82, 89, 73, 57, 60, 74, 89, 92, 77, 63, 60,
-53, 47, 56, 64, 63, 61, 56, 54, 52, 36, 16, 22, 51, 66, 67, 70, 76, 88, 99, 92,
-77, 74, 85, 100, 106, 97, 83, 85, 96, 108, 133, 160, 164};
void delay_us(int count) {
while(count--) {
@@ -37,202 +12,235 @@ void delay_us(int count) {
}
}
-void beeps() {
- // DDRB |= (1<<7);
- // PORTB &= ~(1<<7);
-
- // // Use full 16-bit resolution.
- // ICR1 = 0xFFFF;
-
- // // I could write a wall of text here to explain... but TL;DW
- // // Go read the ATmega32u4 datasheet.
- // // And this: http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
-
- // // Pin PB7 = OCR1C (Timer 1, Channel C)
- // // Compare Output Mode = Clear on compare match, Channel C = COM1C1=1 COM1C0=0
- // // (i.e. start high, go low when counter matches.)
- // // WGM Mode 14 (Fast PWM) = WGM13=1 WGM12=1 WGM11=1 WGM10=0
- // // Clock Select = clk/1 (no prescaling) = CS12=0 CS11=0 CS10=1
-
- // TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
- // TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
-
-
- // // Turn off PWM control on PB7, revert to output low.
- // // TCCR1A &= ~(_BV(COM1C1));
- // // CHANNEL = ((1 << level) - 1);
-
- // // Turn on PWM control of PB7
- // TCCR1A |= _BV(COM1C1);
- // // CHANNEL = level << OFFSET | 0x0FFF;
- // // CHANNEL = 0b1010101010101010;
-
- // float x = 12;
- // float y = 24;
- // float length = 50;
- // float scale = 1;
-
- // // int f1 = 1000000/440;
- // // int f2 = 1000000/880;
- // // for (uint32_t i = 0; i < length * 1000; i++) {
- // // // int frequency = 1/((sin(PI*2*i*scale*pow(2, x/12.0))*.5+1 + sin(PI*2*i*scale*pow(2, y/12.0))*.5+1) / 2);
-
- // // ICR1 = f1; // Set max to the period
- // // OCR1C = f1 >> 1; // Set compare to half the period
- // // // _delay_us(10);
- // // }
- // int frequency = 1000000/440;
- // ICR1 = frequency; // Set max to the period
- // OCR1C = frequency >> 1; // Set compare to half the period
- // _delay_us(500000);
-
- // TCCR1A &= ~(_BV(COM1C1));
- // CHANNEL = 0;
-play_notes();
-
-
- // play_note(55*pow(2, 0/12.0), 1);
- // play_note(55*pow(2, 12/12.0), 1);
- // play_note(55*pow(2, 24/12.0), 1);
- // play_note(55*pow(2, 0/12.0), 1);
- // play_note(55*pow(2, 12/12.0), 1);
- // play_note(55*pow(2, 24/12.0), 1);
-
- // play_note(0, 4);
-
- // play_note(55*pow(2, 0/12.0), 8);
- // play_note(55*pow(2, 12/12.0), 4);
- // play_note(55*pow(2, 10/12.0), 4);
- // play_note(55*pow(2, 12/12.0), 8);
- // play_note(55*pow(2, 10/12.0), 4);
- // play_note(55*pow(2, 7/12.0), 2);
- // play_note(55*pow(2, 8/12.0), 2);
- // play_note(55*pow(2, 7/12.0), 16);
- // play_note(0, 4);
- // play_note(55*pow(2, 3/12.0), 8);
- // play_note(55*pow(2, 5/12.0), 4);
- // play_note(55*pow(2, 7/12.0), 4);
- // play_note(55*pow(2, 7/12.0), 8);
- // play_note(55*pow(2, 5/12.0), 4);
- // play_note(55*pow(2, 3/12.0), 4);
- // play_note(55*pow(2, 2/12.0), 16);
+int voices = 0;
+double frequency = 0;
+int volume = 0;
+int position = 0;
+
+double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+bool sliding = false;
+#define RANGE 1000
+volatile int i=0; //elements of the wave
+void beeps() {
+ play_notes();
}
-void play_note(float freq, int length) {
- DDRB |= (1<<7);
- PORTB &= ~(1<<7);
+void send_freq(double freq, int vol) {
+ int duty = (((double)F_CPU) / freq);
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> (0x10 - vol); // Set compare to half the period
+}
- if (freq > 0) {
- int frequency = 1000000/freq;
- ICR1 = frequency; // Set max to the period
- OCR1C = frequency >> 1; // Set compare to half the period
+void stop_all_notes() {
+ voices = 0;
+ TCCR3A = 0;
+ TCCR3B = 0;
+ frequency = 0;
+ volume = 0;
- TCCR1A = _BV(COM1C1) | _BV(WGM11); // = 0b00001010;
- TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
+ for (int i = 0; i < 8; i++) {
+ frequencies[i] = 0;
+ volumes[i] = 0;
}
-
- for (int i = 0; i < length; i++) {
- _delay_us(50000);
- }
-
- TCCR1A &= ~(_BV(COM1C1));
}
-// This is called at 8000 Hz to load the next sample.
-ISR(TIMER1_COMPA_vect) {
- if (sample >= sounddata_length) {
- if (sample == sounddata_length + lastSample) {
- TIMSK1 &= ~_BV(OCIE1A);
-
- // Disable the per-sample timer completely.
- TCCR1B &= ~_BV(CS10);
- }
- else {
- OCR1C = sounddata_length + lastSample - sample;
+void stop_note(double freq) {
+ for (int i = 7; i >= 0; i--) {
+ if (frequencies[i] == freq) {
+ frequencies[i] = 0;
+ volumes[i] = 0;
+ for (int j = i; (j < 7); j++) {
+ frequencies[j] = frequencies[j+1];
+ frequencies[j+1] = 0;
+ volumes[j] = volumes[j+1];
+ volumes[j+1] = 0;
+ }
}
}
- else {
- OCR1C = pgm_read_byte(&sounddata_data[sample]);
+ voices--;
+ if (voices < 0)
+ voices = 0;
+ if (voices == 0) {
+ TCCR3A = 0;
+ TCCR3B = 0;
+ frequency = 0;
+ volume = 0;
+ } else {
+ double freq = frequencies[voices - 1];
+ int vol = volumes[voices - 1];
+ if (frequency < freq) {
+ sliding = true;
+ for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
+ send_freq(f, vol);
+ }
+ sliding = false;
+ } else if (frequency > freq) {
+ sliding = true;
+ for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
+ send_freq(f, vol);
+ }
+ sliding = false;
+ }
+ send_freq(freq, vol);
+ frequency = freq;
+ volume = vol;
}
-
- ++sample;
}
-void play_notes() {
+void init_notes() {
+ // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10);
+ // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
+ // DDRC |= (1<<6);
- // Set up Timer 2 to do pulse width modulation on the speaker
- // pin.
+ // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+ // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
- DDRB |= (1<<7);
- PORTB &= ~(1<<7);
+ // ICR3 = 0xFFFF;
+ // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
- // Use internal clock (datasheet p.160)
- // ASSR &= ~(_BV(EXCLK) | _BV(AS2));
- // Set fast PWM mode (p.157)
- TCCR1A |= _BV(WGM21) | _BV(WGM20);
- TCCR1B &= ~_BV(WGM22);
+ // cli();
- // Do non-inverting PWM on pin OC2A (p.155)
- // On the Arduino this is pin 11.
- TCCR1A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0);
- TCCR1A &= ~(_BV(COM2B1) | _BV(COM2B0));
- // No prescaler (p.158)
- TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);
+ // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
+ // this gives a timer interrupt at 15625Hz. */
+ // TIMSK3 = (1 << OCIE3A);
- // Set initial pulse width to the first sample.
- OCR1A = pgm_read_byte(&sounddata_data[0]);
+ // /* clear/reset timer on match */
+ // // TCCR3A = 1<<WGM31 | 0<<WGM30; CTC mode, reset on match
+ // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */
+ // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+ // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
+ // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
+ // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
+ // // SPCR = 0x50;
+ // // SPSR = 0x01;
+ // DDRC |= (1<<6);
+ // // ICR3 = 0xFFFF;
+ // // OCR3A=80;
+ // PORTC |= (1<<6);
- cli();
+ // sei();
+}
+
+// #define highByte(c) ((c >> 8) & 0x00FF)
+// #define lowByte(c) (c & 0x00FF)
+
+ISR(TIMER3_COMPA_vect) {
+
+ if (ICR3 > 0 && !sliding) {
+ switch (position) {
+ case 0: {
+ int duty = (((double)F_CPU) / (frequency));
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> 1; // Set compare to half the period
+ break;
+ }
+ case 1: {
+ int duty = (((double)F_CPU) / (frequency*2));
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> 1; // Set compare to half the period
+ break;
+ }
+ case 2: {
+ int duty = (((double)F_CPU) / (frequency*3));
+ ICR3 = duty; // Set max to the period
+ OCR3A = duty >> 1; // Set compare to half the period
+ break;
+ }
+ }
+ position = (position + 1) % 3;
+ }
+// /* OCR2A has been cleared, per TCCR2A above */
+// // OCR3A = 127;
+
+// // pos1 += incr1;
+// // pos2 += incr2;
+// // pos3 += incr3;
+
+// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)];
- // Set CTC mode (Clear Timer on Compare Match) (p.133)
- // Have to set OCR1A *after*, otherwise it gets reset to 0!
- TCCR2B = (TCCR2B & ~_BV(WGM13)) | _BV(WGM12);
- TCCR2A = TCCR2A & ~(_BV(WGM11) | _BV(WGM10));
+// // OCR3A = sample;
- // No prescaler (p.134)
- TCCR2B = (TCCR2B & ~(_BV(CS12) | _BV(CS11))) | _BV(CS10);
- // Set the compare register (OCR1A).
- // OCR1A is a 16-bit register, so we have to do this with
- // interrupts disabled to be safe.
- // OCR2A = F_CPU / SAMPLE_RATE; // 16e6 / 8000 = 2000
- OCR2A = 2000;
+// OCR3A=pgm_read_byte(&sinewave[pos1]);
+// pos1++;
+// // PORTC &= ~(1<<6);
- // Enable interrupt when TCNT1 == OCR1A (p.136)
- TIMSK1 |= _BV(OCIE2A);
+// /* buffered, 1x gain, active mode */
+// // SPDR = highByte(sample) | 0x70;
+// // while (!(SPSR & (1<<SPIF)));
- sample = 0;
- sei();
+// // SPDR = lowByte(sample);
+// // while (!(SPSR & (1<<SPIF)));
+
+// // PORTC |= (1<<6);
}
-void note(int x, float length) {
- DDRB |= (1<<1);
- int t = (int)(440*pow(2,-x/12.0)); // starting note
- for (int y = 0; y < length*1000/t; y++) { // note length
- PORTB |= (1<<1);
- delay_us(t);
- PORTB &= ~(1<<1);
- delay_us(t);
+void play_note(double freq, int vol) {
+
+ if (freq > 0) {
+ DDRC |= (1<<6);
+
+ TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
+ TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
+
+ if (frequency != 0) {
+ if (frequency < freq) {
+ for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
+ send_freq(f, vol);
+ }
+ } else if (frequency > freq) {
+ for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
+ send_freq(f, vol);
+ }
+ }
+ }
+ send_freq(freq, vol);
+ frequency = freq;
+ volume = vol;
+
+ frequencies[voices] = frequency;
+ volumes[voices] = volume;
+ voices++;
}
- PORTB &= ~(1<<1);
+ // ICR3 = 0xFFFF;
+ // for (int i = 0; i < 10000; i++) {
+ // OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
+ // // _delay_us(50);
+ // }
+
+ // TCCR3A = 0;
+ // TCCR3B = 0;
}
-void true_note(float x, float y, float length) {
- for (uint32_t i = 0; i < length * 50; i++) {
- uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
- for (int u = 0; u < 8; u++) {
- if (v & (1 << u) && !(PORTB&(1<<1)))
- PORTB |= (1<<1);
- else if (PORTB&(1<<1))
- PORTB &= ~(1<<1);
- }
- }
- PORTB &= ~(1<<1);
-} \ No newline at end of file
+// void note(int x, float length) {
+// DDRC |= (1<<6);
+// int t = (int)(440*pow(2,-x/12.0)); // starting note
+// for (int y = 0; y < length*1000/t; y++) { // note length
+// PORTC |= (1<<6);
+// delay_us(t);
+// PORTC &= ~(1<<6);
+// delay_us(t);
+// }
+// PORTC &= ~(1<<6);
+// }
+
+// void true_note(float x, float y, float length) {
+// for (uint32_t i = 0; i < length * 50; i++) {
+// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8));
+// for (int u = 0; u < 8; u++) {
+// if (v & (1 << u) && !(PORTC&(1<<6)))
+// PORTC |= (1<<6);
+// else if (PORTC&(1<<6))
+// PORTC &= ~(1<<6);
+// }
+// }
+// PORTC &= ~(1<<6);
+// } \ No newline at end of file
diff --git a/keyboard/preonic/beeps.h b/keyboard/preonic/beeps.h
index 3e3c634ff5..378983c605 100644
--- a/keyboard/preonic/beeps.h
+++ b/keyboard/preonic/beeps.h
@@ -6,4 +6,7 @@
void note(int x, float length);
void beeps();
void true_note(float x, float y, float length);
-void play_note(float freq, int length); \ No newline at end of file
+void play_note(double freq, int vol);
+void stop_note(double freq);
+void stop_all_notes();
+void init_notes(); \ No newline at end of file
diff --git a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
index 8edf8a283d..ec7bc776ac 100644
--- a/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
+++ b/keyboard/preonic/extended_keymaps/extended_keymap_lock.c
@@ -1,8 +1,8 @@
#include "extended_keymap_common.h"
#include "backlight.h"
#include "action_layer.h"
-#include "lufa.h"
#include "keymap_midi.h"
+#include "beeps.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = { /* Qwerty */
diff --git a/keyboard/preonic/keymap_midi.c b/keyboard/preonic/keymap_midi.c
index c7937bb9b5..a0fa59990c 100644
--- a/keyboard/preonic/keymap_midi.c
+++ b/keyboard/preonic/keymap_midi.c
@@ -20,37 +20,91 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <lufa.h>
uint8_t starting_note = 0x0C;
+int offset = 7;
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
{
- if (id != 0) {
- if (record->event.pressed) {
- midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
- } else {
- midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
- }
- }
-
- if (record->event.key.col == 11 && record->event.key.row == 4 && record->event.pressed) {
- starting_note++;
+ if (id != 0) {
+ if (record->event.pressed) {
+ midi_send_noteon(&midi_device, opt, (id & 0xFF), 127);
+ } else {
+ midi_send_noteoff(&midi_device, opt, (id & 0xFF), 127);
+ }
+ }
+
+ if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
+ if (record->event.pressed) {
+ starting_note++;
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ midi_send_cc(&midi_device, 0, 0x7B, 0);
+ midi_send_cc(&midi_device, 1, 0x7B, 0);
+ midi_send_cc(&midi_device, 2, 0x7B, 0);
+ midi_send_cc(&midi_device, 3, 0x7B, 0);
+ midi_send_cc(&midi_device, 4, 0x7B, 0);
+ return;
+ } else {
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
+ stop_all_notes();
+ return;
+ }
+ }
+ if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
+ if (record->event.pressed) {
+ starting_note--;
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ midi_send_cc(&midi_device, 0, 0x7B, 0);
+ midi_send_cc(&midi_device, 1, 0x7B, 0);
+ midi_send_cc(&midi_device, 2, 0x7B, 0);
+ midi_send_cc(&midi_device, 3, 0x7B, 0);
+ midi_send_cc(&midi_device, 4, 0x7B, 0);
+ return;
+ } else {
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
+ stop_all_notes();
+ return;
+ }
+ }
+
+ if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+ offset++;
midi_send_cc(&midi_device, 0, 0x7B, 0);
midi_send_cc(&midi_device, 1, 0x7B, 0);
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
+ stop_all_notes();
+ for (int i = 0; i <= 7; i++) {
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ _delay_us(80000);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
+ _delay_us(8000);
+ }
+ return;
}
- if (record->event.key.col == 8 && record->event.key.row == 4 && record->event.pressed) {
- starting_note--;
+ if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+ offset--;
midi_send_cc(&midi_device, 0, 0x7B, 0);
midi_send_cc(&midi_device, 1, 0x7B, 0);
midi_send_cc(&midi_device, 2, 0x7B, 0);
midi_send_cc(&midi_device, 3, 0x7B, 0);
midi_send_cc(&midi_device, 4, 0x7B, 0);
+ stop_all_notes();
+ for (int i = 0; i <= 7; i++) {
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
+ _delay_us(80000);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
+ _delay_us(8000);
+ }
+ return;
}
if (record->event.pressed) {
- midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+ play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
} else {
- midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+ midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
+ stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
}
} \ No newline at end of file
diff --git a/keyboard/preonic/keymap_midi.h b/keyboard/preonic/keymap_midi.h
index 02bf35c243..c5917f884e 100644
--- a/keyboard/preonic/keymap_midi.h
+++ b/keyboard/preonic/keymap_midi.h
@@ -23,7 +23,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define CHNL(note, channel) (note + (channel << 8))
-#define SCALE (int []){ 0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23, 24, 26, 28, 29, 31, 33, 35, 36}
+#define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
+ 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
+ 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
+ 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
+ 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
#define N_CN1 (0x600C + (12 * -1) + 0 )
#define N_CN1S (0x600C + (12 * -1) + 1 )