]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
bluetooth
authorJack Humbert <jack.humb@gmail.com>
Thu, 22 Oct 2015 17:37:45 +0000 (13:37 -0400)
committerJack Humbert <jack.humb@gmail.com>
Thu, 22 Oct 2015 17:37:45 +0000 (13:37 -0400)
20 files changed:
common.mk
keyboard/atomic/extended_keymaps/extended_keymap_default.c
keyboard/atomic/flash-pcb.sh
keyboard/planck/Makefile
keyboard/planck/config.h
keyboard/planck/keymap_midi.c
keyboard/planck/keymaps/keymap_lock.c
keyboard/planck/planck_with_bootloader.hex [new file with mode: 0755]
keyboard/preonic/Makefile
keyboard/preonic/beeps.c
keyboard/preonic/beeps.h
keyboard/preonic/extended_keymaps/extended_keymap_lock.c
keyboard/preonic/keymap_midi.c
keyboard/preonic/keymap_midi.h
protocol/bluefruit.mk
protocol/bluefruit/bluefruit.c
protocol/bluefruit/bluefruit.h
protocol/bluefruit/main.c
protocol/lufa/descriptor.c
protocol/lufa/lufa.c

index e61ae69e5ece6b7a8957c1d965b5cf3472809b7d..3237e539a6ad32210f9bc342d3212ac041ac9c9d 100644 (file)
--- a/common.mk
+++ b/common.mk
@@ -68,6 +68,10 @@ ifdef BACKLIGHT_ENABLE
     OPT_DEFS += -DBACKLIGHT_ENABLE
 endif
 
+ifdef BLUETOOTH_ENABLE
+    OPT_DEFS += -DBLUETOOTH_ENABLE
+endif
+
 ifdef KEYMAP_SECTION_ENABLE
     OPT_DEFS += -DKEYMAP_SECTION_ENABLE
     EXTRALDFLAGS = -Wl,-L$(TOP_DIR),-Tldscript_keymap_avr5.x
index e662c91889ae5ab59db7dae799d7fcf11ea0bb65..ab08bb6d2540e26d1e22ce866da58c1f27023bae 100644 (file)
@@ -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  },
 // ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┐
 // │        │        │        │        │        │        │        │        │        │        │        │        │        │        │        │
 // └────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┴────────┘
index 2ae15458c0e755dc49134f35b8a01c05a5183980..46abc6982a187dec58ec754cedd01a983613badb 100755 (executable)
@@ -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
index 2f0ba5ba9d670bb440879f8a6ce4686aef2df824..d9e8ce7889864a83ed92f525dd2adfd1e46cdd38 100644 (file)
@@ -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
 
index e970127703791077c7e413fdacd1b9180b683a94..0a1a6a9357f206e75b582fb7b495e2441b17fcb9 100644 (file)
@@ -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
index 748ca4d56319c3610ad79525de384636ef18d920..b7eba3ab7651b9b907ad0ea6552c821fd9022267 100644 (file)
@@ -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
index 4fe2e0a2bf8a71d06fe371a880cc9726a622067a..b844d1cdab3e0b6df4c32af366a6edb03364b6e5 100644 (file)
@@ -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 (executable)
index 0000000..c61dfb7
--- /dev/null
@@ -0,0 +1,1796 @@
+:020000020000FC\r
+:047000000C948D3E21\r
+:047028000C94B73DD0\r
+:10702F0012010002FF010020EB03F42F0000010208\r
+:10703F00030109021200010100803209040000005F\r
+:10704F00000000000C03410054004D0045004C00AF\r
+:10705F001603410054006D00330032005500340018\r
+:10706F004400460055000C0331002E0030002E0066\r
+:10707F0030000403090416010C0100000C0000018C\r
+:02708F006C7F14\r
+:1070920012BD01BDF89A00B5089501E00895F9996D\r
+:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929\r
+:1070B200FECF0C944938F80104910895F8013491F7\r
+:1070C20031962491890108950091610000930C0189\r
+:1070D20000E80093610001E00093610005BF02E057\r
+:1070E20005BF0C9486380091D70001600093D70049\r
+:1070F200A89507EF04BF0091600000610093600053\r
+:1071020000E00093600001E008950E94AA3D0E9401\r
+:10711200B53DFDCF0CD00F7708D0006806D00061D6\r
+:1071220004D0016028D0789408950093D80000918B\r
+:10713200D8000895FCDF00621ED04CD009B500FFD4\r
+:10714200FDCFF5DF0F7D17D00091E0000E7F009399\r
+:10715200E0000091E000077F0093E0000091E20070\r
+:1071620001600093E2000091E20008600093E200F7\r
+:1071720078940C94743B0093D800089500910D010B\r
+:10718200002359F40091D90000FF07C0D0DF006846\r
+:10719200F2DF01E000930D01CDDFE0E2F2E00081D9\r
+:1071A200018100FF0DC0008111811E7F11830083C8\r
+:1071B20001E00093EA0000E00093EA0000931E025F\r
+:1071C20000E00093E9000091E80003FF02C00E9482\r
+:1071D200F23B0895A89539D000E40093600000E0E6\r
+:1071E200009381000093800010E0009385000093DB\r
+:1071F200840001E006BB00918100036000938100DE\r
+:107202000091600007FFFCCF00E80093600010933C\r
+:107212008100A89507EF04BF18D010936000209159\r
+:1072220084003091850010938100109380001093A8\r
+:1072320085001093840001E006BB2D3D354010F01F\r
+:1072420002E101C002E009BD089500916000006101\r
+:107252000093600008950E94AD3E239741D100E063\r
+:1072620000930901B5D104811581012B51F437D165\r
+:1072720000910701002309F4B9C000E0009307015F\r
+:10728200B5C058D102FFFDCF37D1068335D1009367\r
+:107292000F0132D1009310012FD1009311012CD193\r
+:1072A2000093120129D10093130102852091130149\r
+:1072B20030911201409111015091100116811A95DD\r
+:1072C20041F01250A9F01A9599F11A9509F473C078\r
+:1072D2008BC010910F01113011F411E001C010E0C8\r
+:1072E200138799D00C3F11F414D17FC077D17DC0A0\r
+:1072F20092D010910F01112329F01A9549F01A9595\r
+:10730200A9F073C010E013870C3F09F06EC0ECCFF8\r
+:1073120056D103C04CD109F468C00D911C9144D1DF\r
+:107322000F3FC1F305E0009309015FC011E0EBCF0D\r
+:10733200D2D029F00250E1F10A9541F056C0FDD0B9\r
+:107342000E94A33F0FEF00930A014FC0552319F08B\r
+:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE\r
+:1073620003FFFDCF67D051D04AD008E00093600000\r
+:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F\r
+:1073820044D00FEF1FE004C009811A810150104060\r
+:1073920009831A8309811A81012BB1F700E800934E\r
+:1073A200610000910C01009361000C940000FFCF7A\r
+:1073B20001E003871AC08FD019F00A9539F015C081\r
+:1073C200535098F4BAD002E000870FC0505339F0FE\r
+:1073D2005A9541F05F52B1F35A95A1F306C002E00B\r
+:1073E2000883F0CF01E0FCCFA8D079D02396E4E067\r
+:1073F2000C94BA3E01E005BF00E005BF089500917C\r
+:10740200D8000F770093D800089509B50D7F09BD04\r
+:1074120000E009BD08955183408333832283109194\r
+:10742200E8001B7F1093E8001091E8001F7710938B\r
+:10743200E80008955DD053D0F8940091E000016017\r
+:107442000093E000089579D04AC0219749D0009175\r
+:107452000601035019F00250B9F00BC03CD021F0E4\r
+:107462000A9559F00A9529F400910A010C3F19F482\r
+:1074720050D02196089567D0FCCF0091010100936E\r
+:10748200F100009100010AC01091100124D019F0FE\r
+:107492000A9549F0EECF135018F400E00093F10082\r
+:1074A2001ED044D0E6CF105339F01A9539F01F524E\r
+:1074B20041F01A9541F0F4CF08E5F0CF00E006D094\r
+:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5\r
+:1074D20030E00C94113F00910F010023089521C068\r
+:1074E2000BD008D007D00093040106D00093050109\r
+:1074F20021D00BC000D008830091F10008950091C3\r
+:10750200EB0000620093EB0015D0077F0093E800C8\r
+:107512000895F5DF02E00093080103E000930901FA\r
+:10752200089559D007D000FFFDCF089503D002FF80\r
+:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A\r
+:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD\r
+:107552002BD00093F1002BD059F43DD0082F092BEA\r
+:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1\r
+:10757200042D4394003289F300910B0100230D91F5\r
+:107582001C9131F311970E945838E3CFD3DF00FFEB\r
+:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B\r
+:1075A200CCDFE5E00C94B93E11970C945C380D9158\r
+:1075B2001C910F5F1F4F1C930E93019708958281B8\r
+:1075C200938100811181801B910B0196DF01089547\r
+:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71\r
+:1075E200F7DF80819181A081B181AF710481158122\r
+:1075F20000521040048315830AC000910B0100233E\r
+:1076020031F4A301920103E911E00E943B3F47D00C\r
+:10761200B8F1662477242C0111C06EDFF301ED5618\r
+:10762200FE4F008301E0600E00E0701E01960091A3\r
+:10763200F200002311F033D0B8F47FDF30D0E8F24B\r
+:10764200F301B096E238F040C0F674DF02FFFDCFDE\r
+:107652000091F200BDDF24813581201B304024835C\r
+:107662003583E5CF49DFAA95AA23E1F700910B0103\r
+:10767200013099F62091F1008C010E945038D6CF4A\r
+:1076820004811581012B21F055DF02FFFDCF55DF6B\r
+:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051\r
+:1076A200F1E0028113810817190708952091EB0078\r
+:1076B20021602093EB000093EC000091ED0002703A\r
+:1076C200012B0093ED000091ED0002600093ED00AC\r
+:1076D2001091EE00012F000F00E0001F0895412FCE\r
+:1076E2000093E900089500E009D000FD05C000E024\r
+:1076F200F7DF10E202E0DACF00E00895F1DF009157\r
+:10770200EB0008950F770132A9F5112369F11A955B\r
+:1077120059F01A9561F01A9569F01A95F9F01A95CF\r
+:10772200C1F01A95D9F024C00E942C3920C00E94C1\r
+:10773200263A1DC029D00091090123D001E01FD0B3\r
+:1077420020D0009108011BD00E94923A0E94973AE1\r
+:107752000EC01AD00091080114D007C002E00093B5\r
+:10776200080100E0009309010FD00E94923A03C081\r
+:107772000E94803A02C001E0089500E0089501D01D\r
+:1077820000E00093F10008950091E800077F009364\r
+:10779200E800089508950350F9F4112339F01A9579\r
+:1077A20051F01A9581F01A9599F016C004E016D09E\r
+:1077B20001E810E703C011D003E510E7E7E1F2E0CA\r
+:1077C20000831183D8CF06E109D00FE510E7F6CF89\r
+:1077D20004D005E710E7F2CFD0CF0CE000931A02F5\r
+:1077E200089527D120D100931D02E1D0212F11232A\r
+:1077F20029F12A95E9F02250F1F0225099F02A95C8\r
+:1078020049F0225061F02A9581F02A95E1F02A95FB\r
+:10781200E9F023C0003809F44FC00C94833B0038D0\r
+:10782200E1F7C8C00023C9F71EC00023B1F72DC07D\r
+:10783200033098F744C1033080F70BC1003868F376\r
+:10784200033858F7C9C0013841F77BC1013051F400\r
+:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA\r
+:1078620009F41ED008951091E3001078DCD00F7750\r
+:10787200012B0093E300E9D0ACD000FFFDCF0091D3\r
+:10788200E30000680093E300089591D0123040F4C1\r
+:107892000FD010931E02DAD000911E020C94CB3B43\r
+:1078A2000091EB0001D004C000620093EB00089548\r
+:1078B2000091E800077FC0C0BA93AA93229700E024\r
+:1078C2000093190274D0AFD0202F2A9519F02A956F\r
+:1078D200E9F022C002E100931A020FE210E7E7E1A9\r
+:1078E200F2E0008311839DD008839DD00983E0DFFD\r
+:1078F20000911A0210E02881398102171307A8F4B7\r
+:107902000F7181F401E00093190211C002E10093AA\r
+:107912001A0201E410E7E3CF0E94CC3B002319F7DF\r
+:107922008ED040C01093190202C020931A027ED05A\r
+:10793200A7E1B2E001C08AD000911A02002309F146\r
+:1079420048D004FD1EC045D000FD03C042D004FF54\r
+:10795200FACF10E0012F1395003281F0ED91FC91E6\r
+:107962001197049133D02D913C912F5F3F4F3C935F\r
+:107972002E93FD0103810A95038361F72AD004FF48\r
+:10798200DACF00911902013039F423D004FD04C08A\r
+:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F\r
+:1079A20018D00B7F49D02296A991B99108951091D0\r
+:1079B200F10008957DDF00911E0208D047D009D062\r
+:1079C2000F773AD006D002FFFDCFBFC00093F1007F\r
+:1079D20008950091E800089524D010911D021058D6\r
+:1079E20029F01A9589F01A9591F019C061DF00917A\r
+:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63\r
+:107A020018D0E7DF0F770CC053DF00E0F2CF51D080\r
+:107A12000F7710E0F801E55EFD4F0081EACF0FD04D\r
+:107A22000BC001D000D00091F1000895D2DF0F7E8B\r
+:107A320003C00091E8000B7F0093E80008950091D5\r
+:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31\r
+:107A5200F3CF00911D02002329F00A9509F10A953E\r
+:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE\r
+:107A7200B9F4D9DF0F7711F416D01BD00093E900C7\r
+:107A82001091EB0010FF0BC00ED010E01093E90034\r
+:107A920021E0F801E55EFD4F20834FD003C042D0C4\r
+:107AA20045D0CFDFC9CF1091EB0010621093EB00ED\r
+:107AB20008951091E800177F1093E800089500914F\r
+:107AC2001D02002311F4AFDF02C0013011F4B7DF51\r
+:107AD200B3CF023031F52DD019F52091F1002F7777\r
+:107AE2002093E90023D000FF19C081F01FD000616C\r
+:107AF200DCDE01E010E0422F0E949F3E0093EA008C\r
+:107B020000E00093EA0012D00860CFDE0BD030E034\r
+:107B1200F901E55EFD4F008310D0DACF03D0D7CF55\r
+:107B2200BFDE089500E00093E90008950091EB00A4\r
+:107B3200089579DF3CDF00230895BADE4ADF0E7F25\r
+:107B4200089583DF46DF02FFFDCF73DF42DF0F7749\r
+:107B520073CF0091D70001600093D7000E948B3849\r
+:107B620000E000931F0208950C94BF388A93FA93A1\r
+:107B7200EA933A922A921A920A927A936A935A93BF\r
+:107B82004A933A932A931A930A938FB70091DA0091\r
+:107B920000FF24C00091D80000FF20C00EEF009328\r
+:107BA200DA000091D90000FF11C001E000930D013D\r
+:107BB200ABD0026096D09AD00860A2D00E949B38C7\r
+:107BC2000091E0000E7F0093E00008C000E0009307\r
+:107BD2000D0100931E0298D0046083D07FD002FF73\r
+:107BE20005C084D002FF02C00BEF75D077D000FF32\r
+:107BF2001BC07CD000FF18C001E000930E016AD0C8\r
+:107C020083D000626ED00EEF6FD0006179D06ED05B\r
+:107C12000F7D76D00091D80000620093D80009B59C\r
+:107C22000D7F09BD00E009BD59D004FF20C05ED020\r
+:107C320004FF1DC009B500FD05C00E94EB3809B55F\r
+:107C420000FFFDCF0091D8000F7D0093D80042D0F5\r
+:107C520000910E01002359F04CD00FEE45D00F7E5B\r
+:107C620052D000643ED042D001604AD042D036D0D9\r
+:107C720005FF0FC03BD005FF0CC000E000930E01D2\r
+:107C820035D00F7E3DD00FED2FD00F7D3CD0006858\r
+:107C920028D024D003FF0DC029D003FF0AC000E082\r
+:107CA20000931F0207EF17D00E94743B2DD0116082\r
+:107CB20018D08FBF09911991299139914991599100\r
+:107CC200699179910990199029903990E991F991E6\r
+:107CD200899118950FEE0093E10008950091E1005B\r
+:107CE20008951183008308950093E1000091E2005A\r
+:107CF20008950091E200006203D00091E200086062\r
+:107D02000093E2000895FCDFE0E2F2E000811181DD\r
+:107D1200089500008895FECF01E60DBF02E00EBF78\r
+:107D2200C2EED2E00E947438002311F00E94D33ECA\r
+:107D32000E9465380E948A3E0C948A3E4A951AF047\r
+:107D4200000F111FFBCF0895BA92AA929A928A92BB\r
+:107D52007A926A925A924A92BA93AA939A938A937D\r
+:107D62000895BB84AA84998488847F806E805D8014\r
+:107D72004C80BB81AA8199818881F0E00FB6F8948A\r
+:107D8200CE0FDF1F0FBE089520E006D0E9F7089559\r
+:107D9200259102D0E9F708952D9301501040202F2C\r
+:107DA200212B089585E890E7FC0105911491FC01CF\r
+:107DB2003296A591B491FC01349625913491422FCB\r
+:107DC200432B19F0F901E4DF01C0DEDF069610E76C\r
+:107DD2008139910748F308952F930CD02F9101D048\r
+:107DE20008953CD0F12FE02F45E047BFE89536D00B\r
+:107DF20012D0089533D0F12FE02F43E047BFE8952A\r
+:107E02002DD008952BD0F12FE02F43E047BFE89506\r
+:107E120025D001D0089522D041E147BFE8951EC088\r
+:107E22001DD0F12FE02F41E247BFC895002D16C0AB\r
+:107E320015D0F12FE02F49E047BFC895002D0EC0A5\r
+:107E4200F32FE22F012E102E41E047BFE89506C026\r
+:107E520005D0002E29E027BFE89500C0022E27B7E3\r
+:107E620020FDFCCF202D0895022E27B726FDFCCF42\r
+:107E7200202D08950E94A53E22974801C901DA01EA\r
+:107E820010C05BD001E0A00E00E0B01E00E4A0161E\r
+:107E920000E0B00608F440C0830120E030E00E9418\r
+:107EA200F23E0A2F0B2B09F440C0082F0F7710E087\r
+:107EB2002C01401A510A320100E4A02E03C00A2FFD\r
+:107EC2000B2BE1F04816590680F0F40101914F01A5\r
+:107ED2000983119729F001914F010883119711C06D\r
+:107EE200F2013196049108830CC0F20104910983D6\r
+:107EF2003196E817F907A1F7F401EDCF1BD00883FB\r
+:107F020019839201088119810E94213F16D0AA94F7\r
+:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE\r
+:107F220009F4AFCF83011DD0B7CF01E02296ECE078\r
+:107F32000C94B23E82010C945F3802E0400E00E0E5\r
+:107F4200501E08959A938A9380E090E08C0109D0A4\r
+:107F520080589F4F8F3F0FE69007C0F38991999108\r
+:107F6200089520E030E00C94FB3E00000000000089\r
+:067F720000000000FC000D\r
+:107FE4000C94ED3E0C94113F0C94193F0C94213FDA\r
+:0C7FF4000C94F23E0C94033F0C94293FC7\r
+:040000030000700089\r
+:100000000C949D020C94E1020C94E1020C94E10228\r
+:100010000C94E1020C94E1020C94E1020C94E102D4\r
+:100020000C94E1020C94E1020C941C120C94EE125C\r
+:100030000C948D240C94E1020C94E1020C94E102E6\r
+:100040000C94E1020C94E1020C94E1020C94E102A4\r
+:100050000C94E1020C94FA240C94E1020C94E10259\r
+:100060000C94E1020C94E1020C94E1020C94E10284\r
+:100070000C94E1020C94E1020C94E1020C94E10274\r
+:100080000C94860A0C94E1020C94E1020C94E102B7\r
+:100090000C94E1020C94E1020C94E1020C94E10254\r
+:1000A0000C94E1020C94E1020C94E10207634236E5\r
+:1000B000B79BD8A71A39685618AEBAAB558C1D3CF9\r
+:1000C000B7CC5763BD6DEDFD753EF6177231BF00BD\r
+:1000D0000000803F08000000BE922449123EABAAF7\r
+:1000E000AA2ABECDCCCC4C3E00000080BEABAAAA52\r
+:1000F000AA3E00000000BF000000803F000000009A\r
+:1001000000084178D3BB4387D1133D190E3CC3BDD2\r
+:100110004282AD2B3E68EC8276BED98FE1A93E4C7F\r
+:1001200080EFFFBE01C4FF7F3F0000000000000021\r
+:10013000F1A4F1A3018C028C048C2B0014001A0092\r
+:100140000800150017001C0018000C001200130016\r
+:100150002A00290004001600070009000A000B000D\r
+:100160000D000E000F0033003400E1001D001B00E5\r
+:100170000600190005001100100036003700380095\r
+:1001800028000030E000E200E30002202C002C00F8\r
+:1001900001205000510052004F002B0014001A00A3\r
+:1001A000090013000A000D000F0018001C003300A6\r
+:1001B0002A002900040015001600170007000B0094\r
+:1001C000110008000C0012003400E1001D001B00AB\r
+:1001D0000600190005000E00100036003700380038\r
+:1001E00028000030E000E200E30002202C002C0098\r
+:1001F00001205000510052004F002B003400360007\r
+:10020000370013001C0009000A00060015000F004B\r
+:100210002A00290004001200080018000C00070042\r
+:100220000B001700110016003800E1003300140025\r
+:100230000D000E001B00050010001A0019001D0023\r
+:1002400028000030E000E200E30002202C002C0037\r
+:1002500001205000510052004F0035021E021F02C3\r
+:100260002002210222022302240225022602270262\r
+:100270002A0001003A003B003C003D003E003F00E8\r
+:100280002D022E022F0230023102010040004100F7\r
+:100290004200430044004500032004200520005094\r
+:1002A0000100010001000100010002200100010025\r
+:1002B0000100AB00AA00A900AE0035001E001F001F\r
+:1002C0002000210022002300240025002600270012\r
+:1002D0002A0001003A003B003C003D003E003F0088\r
+:1002E0002D002E002F0030003100010040004100A1\r
+:1002F0004200430044004500032004200520005034\r
+:1003000001000100010001000100010001000100E5\r
+:100310000120AB00AA00A900AE0028035400680029\r
+:100320006500200050006C0061006E0063006B00EF\r
+:1003300020004B006500790062006F0061007200D0\r
+:10034000640000002C034F007200740068006F000E\r
+:100350006C0069006E0065006100720020004B00B7\r
+:100360006500790062006F00610072006400730034\r
+:100370000000040309040902D000060100A03209AC\r
+:100380000400000103010100092111010001223FC5\r
+:10039000000705810308000A0904010001030102A6\r
+:1003A00000092111010001224D0007058203080008\r
+:1003B0000A090402000103000000092111010001E3\r
+:1003C0002236000705830308000A0904030002031C\r
+:1003D000000000092111010001222000070584030B\r
+:1003E00020000107050403200001090404000001A6\r
+:1003F00001000009240100010900010509040500AC\r
+:10040000020103000007240100014100062402014B\r
+:100410000100062402020200092403010301020173\r
+:10042000000924030204010101000905060240003D\r
+:1004300005000005250101010905850240000500B0\r
+:100440000005250101031201100100000008EDFE66\r
+:1004500060600100010200010631FF0974A1010979\r
+:1004600075150025FF952075088102097615002570\r
+:10047000FF952075089102C005010980A101850240\r
+:1004800016010026B7001A01002AB7007510950161\r
+:100490008100C0050C0901A1018503160100269CFD\r
+:1004A000021A01002A9C02751095018100C0050105\r
+:1004B0000902A1010901A100050919012905150079\r
+:1004C00025019505750181029501750381010501DD\r
+:1004D000093009311581257F950275088106093893\r
+:1004E0001581257F950175088106050C0A380215CE\r
+:1004F00081257F950175088106C0C005010906A107\r
+:1005000001050719E029E715002501950875018106\r
+:1005100002950175088101050819012905950575E0\r
+:100520000191029501750391010507190029FF1535\r
+:100530000025FF950675088100C011241FBECFEF6E\r
+:10054000DAE0DEBFCDBF04B603FE24C0809178039D\r
+:1005500090917903A0917A03B0917B038730904BFF\r
+:10056000A740B04BB9F4109278031092790310921F\r
+:100570007A0310927B0314BE84B7877F84BF88E11F\r
+:100580000FB6F89480936000109260000FBEE0E018\r
+:10059000F8E3099511E0A0E0B1E0E2EAFFE502C06E\r
+:1005A00005900D92A63BB107D9F713E0A6EBB1E099\r
+:1005B00001C01D92A837B107E1F70E94F90E0C9413\r
+:1005C000CF2F0C9400000895089561110DC0FC0117\r
+:1005D0008281882331F085EE0E949D190E94B62BFE\r
+:1005E00003C085EE0E94651A80E090E008958B3B81\r
+:1005F000910568F4883A910530F5853A9105C0F483\r
+:100600008430910598F4019709F06FC071C0803E65\r
+:10061000910508F46AC0883E910540F09C01205F76\r
+:1006200031092031310508F060C05CC09C01A1C0D7\r
+:10063000853A910509F45FC0863A910509F45EC0D8\r
+:1006400023E830E496C0883A910509F45AC0893A03\r
+:10065000910509F459C08A3A910509F458C08B3ABA\r
+:10066000910509F457C08C3A910509F456C08D3AAA\r
+:10067000910509F455C0803B910509F454C08E3AA8\r
+:10068000910509F453C08F3A910509F452C0813B9A\r
+:10069000910509F451C0823B910509F450C0833B98\r
+:1006A000910509F44FC0843B910509F44EC0853B88\r
+:1006B000910509F44DC0863B910509F44CC0873B78\r
+:1006C000910509F44BC0883B910509F44AC0893B68\r
+:1006D000910509F449C08A3B910509F048C02AE216\r
+:1006E00036E447C09C01306544C020E030E041C0A2\r
+:1006F00021E030E03EC021E830E43BC022E830E4B5\r
+:1007000038C022EE34E435C029EE34E432C02AEE9B\r
+:1007100034E42FC025EB34E42CC026EB34E429C0AC\r
+:1007200027EB34E426C02CEC34E423C02DEC34E475\r
+:1007300020C023E835E41DC02AE835E41AC022E9C8\r
+:1007400035E417C024E935E414C021E236E411C0D1\r
+:1007500023E236E40EC024E236E40BC025E236E4A0\r
+:1007600008C026E236E405C027E236E402C020E0F5\r
+:1007700034E4C90108959CE0799FF001112490E3CD\r
+:10078000899FE00DF11D1124E60FF11DEE0FFF1FF3\r
+:10079000E65CFE4F25913491C9010895880F991F99\r
+:1007A00082559040FC0125913491C9010895880F2C\r
+:1007B000991F825D9E4FFC0125913491C9010895D6\r
+:1007C0000E94BB039C013A9521153F4108F4DFC00C\r
+:1007D0009C0130522115304120F49F700E94D703B4\r
+:1007E00008959C0130532115304118F49927906CDD\r
+:1007F00008959C0130542031310520F48F709927E1\r
+:10080000946D0895803120E4920719F480E091ED11\r
+:100810000895813140E4940719F480E090ED089543\r
+:10082000823120E4920719F480E092ED089583313B\r
+:1008300040E4940719F480E093ED0895811520E5D4\r
+:10084000920711F40C941F25813040E5940731F490\r
+:100850008091680281608093680208959C013056FF\r
+:100860002115304108F402C097FF02C0906F08952F\r
+:10087000803E9105E0F4803C910568F58133910557\r
+:1008800009F474C048F48932910509F46AC08A32C7\r
+:10089000910509F07AC074C089339105F9F0823866\r
+:1008A0009105E1F08533910509F06FC050C0833E9A\r
+:1008B0009105A9F140F4803E9105C9F0823E910571\r
+:1008C00009F063C01BC0863E910571F1873E91051A\r
+:1008D00009F05BC037C00E94CE03089520917B02CF\r
+:1008E00020FD02C021FF51C080EE90E04EC08091FB\r
+:1008F0007B0280FFF9CF89E390E047C080917B02C3\r
+:1009000082FF0AC080917B0284FF03C080E090E0F8\r
+:100910003CC083EE90E039C082EE90E036C080911A\r
+:100920007B0282FFEFCFF8CF80917B0283FF07C06D\r
+:1009300080917B0284FDEACF87EE90E026C086EEB0\r
+:1009400090E023C080917B0283FFF2CFF8CF8091AB\r
+:100950007B0285FF03C089E290E017C085E390E049\r
+:1009600014C080917B0285FDF9CFF5CF80917B0289\r
+:1009700086FF03C08AE290E008C081E390E005C0F2\r
+:1009800080917B0286FDF9CFF5CF0E94F702089592\r
+:100990005F926F927F928F929F92AF92BF92CF920F\r
+:1009A000DF92EF92FF920F931F93CF93DF93CDB718\r
+:1009B000DEB728970FB6F894DEBF0FBECDBF9E01FD\r
+:1009C0002F5F3F4F4E0189E0880E911C60E070E080\r
+:1009D00000E010E0E12CF12CC12CD12CA12CB12C89\r
+:1009E00088E0782E622E532E41E050E0E3E2F1E001\r
+:1009F000A62DB52D872D01900D928A95E1F7F9016D\r
+:100A0000819191919F01FC01E07FFF27E032F10588\r
+:100A100059F48F709927FA0102C0EE0FFF1F8A95D3\r
+:100A2000E2F7AE2ABF2A37C0E033F10559F48F70E0\r
+:100A30009927FA0102C0EE0FFF1F8A95E2F7CE2A2E\r
+:100A4000DF2A29C0E034F10559F48F709927FA01A3\r
+:100A500002C0EE0FFF1F8A95E2F7EE2AFF2A1BC0A5\r
+:100A6000E035F10559F48F709927FA0102C0EE0FB5\r
+:100A7000FF1F8A95E2F70E2B1F2B0DC0E036F10504\r
+:100A800051F48F709927FA0102C0EE0FFF1F8A956B\r
+:100A9000E2F76E2B7F2B2815390509F0A7CF94B10B\r
+:100AA0008A2D8095892384B985B18A2985B997B122\r
+:100AB0008C2D8095892387B988B18C2988B99AB102\r
+:100AC0008E2D809589238AB98BB18E298BB99DB1E2\r
+:100AD000802F809589238DB98EB1802B8EB990B3EC\r
+:100AE000862F8095892380BB81B3862B81BB289676\r
+:100AF0000FB6F894DEBF0FBECDBFDF91CF911F912F\r
+:100B00000F91FF90EF90DF90CF90BF90AF909F90AC\r
+:100B10008F907F906F905F9008955F926F927F9219\r
+:100B20008F929F92AF92BF92CF92DF92EF92FF92FD\r
+:100B30000F931F93CF93DF93CDB7DEB768970FB6B0\r
+:100B4000F894DEBF0FBECDBF85B7806885BF85B77F\r
+:100B5000806885BF0E94CF076E9A769A0E94C8046B\r
+:100B60009E012F5F3F4F4E0189E1880E911C60E08E\r
+:100B700070E000E010E0E12CF12CC12CD12CA12C74\r
+:100B8000B12C98E1792E622E532E41E050E0EBE239\r
+:100B9000F1E0A62DB52D872D01900D928A95E1F7F4\r
+:100BA000F901819191919F01FC01E07FFF27E032E3\r
+:100BB000F10559F48F709927FA0102C0EE0FFF1F5B\r
+:100BC0008A95E2F7AE2ABF2A37C0E033F10559F41F\r
+:100BD0008F709927FA0102C0EE0FFF1F8A95E2F786\r
+:100BE000CE2ADF2A29C0E034F10559F48F70992705\r
+:100BF000FA0102C0EE0FFF1F8A95E2F7EE2AFF2AE4\r
+:100C00001BC0E035F10559F48F709927FA0102C035\r
+:100C1000EE0FFF1F8A95E2F70E2B1F2B0DC0E0365B\r
+:100C2000F10551F48F709927FA0102C0EE0FFF1FF2\r
+:100C30008A95E2F76E2B7F2B2815390509F0A7CF8F\r
+:100C400094B18A2D8095892384B985B18A2985B983\r
+:100C500097B18C2D8095892387B988B18C2988B963\r
+:100C60009AB18E2D809589238AB98BB18E298BB943\r
+:100C70009DB1802F809589238DB98EB1802B8EB93F\r
+:100C800090B3862F8095892380BB81B3862B81BB4F\r
+:100C90001092B7011092B6011092BF011092BE01DE\r
+:100CA0001092B9011092B8011092C1011092C001C6\r
+:100CB0001092BB011092BA011092C3011092C201AE\r
+:100CC0001092BD011092BC011092C5011092C40196\r
+:100CD00068960FB6F894DEBF0FBECDBFDF91CF91FF\r
+:100CE0001F910F91FF90EF90DF90CF90BF90AF904A\r
+:100CF0009F908F907F906F905F9008955F926F921A\r
+:100D00007F928F929F92AF92BF92CF92DF92EF929B\r
+:100D1000FF920F931F93CF93DF93CDB7DEB7A097CA\r
+:100D20000FB6F894DEBF0FBECDBF7E0149E1E40EE1\r
+:100D3000F11C2EEBC22E21E0D22E5E0151E2A50E57\r
+:100D4000B11C38E0532E470101E010E048E1642E69\r
+:100D500055E0752EE3E2F1E0D401852D01900D926E\r
+:100D60008A95E1F7F701819191917F019C01207FA4\r
+:100D700033272032310589F424B18F709927A801D7\r
+:100D800002C0440F551F8A95E2F7CA01242B24B9EB\r
+:100D900095B18095892385B94FC02033310589F4F9\r
+:100DA00027B18F709927F80102C0EE0FFF1F8A95B7\r
+:100DB000E2F7CF012E2B27B998B18095892388B906\r
+:100DC0003BC02034310589F42AB18F709927A801DE\r
+:100DD00002C0440F551F8A95E2F7CA01242B2AB995\r
+:100DE0009BB1809589238BB927C02035310589F4C3\r
+:100DF0002DB18F709927F80102C0EE0FFF1F8A9561\r
+:100E0000E2F7CF012E2B2DB99EB1809589238EB9A3\r
+:100E100013C02036310581F420B38F709927A801C3\r
+:100E200002C0440F551F8A95E2F7CA01242B20BB4C\r
+:100E300091B38095892381BB50EA5A95F1F7BE01A1\r
+:100E40006F5F7F4F80E090E020E030E0EBE2F1E088\r
+:100E5000DE011196462D01900D924A95E1F7FB01B6\r
+:100E600041915191BF01FA01E07FFF27E032F10586\r
+:100E700011F4E3B113C0E033F10511F4E6B10EC093\r
+:100E8000E034F10511F4E9B109C0E035F10511F4E0\r
+:100E9000ECB104C0E036F105B9F4EFB1F0E04F7009\r
+:100EA000552702C0F595E7954A95E2F7E0FD08C0A1\r
+:100EB000A801022E02C0440F551F0A94E2F702C097\r
+:100EC00040E050E0842B952B2F5F3F4F2C303105B5\r
+:100ED00009F0BCCFF601208131812817390721F0B4\r
+:100EE00091838083709200010E94C804F2E0CF0ECB\r
+:100EF000D11CEA14FB0409F02DCF80910001882356\r
+:100F000061F1815080930001811121C08091BE0167\r
+:100F10009091BF019093B7018093B6018091C00179\r
+:100F20009091C1019093B9018093B8018091C20161\r
+:100F30009091C3019093BB018093BA018091C40149\r
+:100F40009091C5019093BD018093BC0106C08FE9CB\r
+:100F50009FE00197F1F700C0000081E0A0960FB676\r
+:100F6000F894DEBF0FBECDBFDF91CF911F910F91DF\r
+:100F7000FF90EF90DF90CF90BF90AF909F908F90B9\r
+:100F80007F906F905F900895E82FF0E0EE0FFF1FC5\r
+:100F9000EA54FE4F80819181089508950895279A1B\r
+:100FA0002F988FEF9FEF90938700809386008AE0C1\r
+:100FB0008093800089E1809381000C945F2B8111E4\r
+:100FC0000BC080918000877F8093800010928D00FD\r
+:100FD00010928C002F9808952F98833041F48091BF\r
+:100FE00080008860809380008FEF9FEF12C0909107\r
+:100FF000800098609093800023E030E0281B310946\r
+:10100000220F331F8FEF9FEF02C0969587952A9589\r
+:10101000E2F790938D0080938C0008950F931F93B7\r
+:10102000CF93DF93CDB7DEB7CC58D1090FB6F89484\r
+:10103000DEBF0FBECDBF8C01862F642F882379F0D1\r
+:10104000F80192812FE7482F992329F08DE792E04C\r
+:101050000E94F81404C08DE792E00E940815F80180\r
+:1010600080818B3061F49181933009F068C0828176\r
+:10107000882309F4CDC0809103018F5F0EC08A30B0\r
+:10108000E1F5F8019181933009F059C082818823FC\r
+:1010900009F4BEC08091030181508093030120E0D8\r
+:1010A0004BE760E08DE792E00E94E81420E04BE718\r
+:1010B00061E08DE792E00E94E81420E04BE762E0F7\r
+:1010C0008DE792E00E94E81420E04BE763E08DE7B3\r
+:1010D00092E00E94E81420E04BE764E08DE792E0A4\r
+:1010E000C457DF4F0FB6F894DEBF0FBECDBFDF9100\r
+:1010F000CF911F910F910C94E814893069F4F80195\r
+:1011000091819330E1F492819923C9F0809101019A\r
+:101110009091020101960EC0883089F4F801918106\r
+:10112000933069F49281992351F08091010190915B\r
+:10113000020101979093020180930101B0CFF80161\r
+:10114000928140910301992391F196E4E3E4F1E067\r
+:10115000DE01A95BBF4F01900D929A95E1F7405DCA\r
+:10116000F8019181FCE09F9F40191124E091010159\r
+:10117000F0910201E80FF11DEE0FFF1F87E490E0F0\r
+:101180008C0F9D1FE80FF91F8081480F2FE760E04B\r
+:101190008DE792E0C457DF4F0FB6F894DEBF0FBE65\r
+:1011A000CDBFDF91CF911F910F910C94F81496E46D\r
+:1011B000E3E4F1E0DE01119601900D929A95E1F7DA\r
+:1011C000405DF8019181FCE09F9F40191124E0915E\r
+:1011D0000101F0910201E80FF11DEE0FFF1F81E008\r
+:1011E00090E08C0F9D1FE80FF91F8081480F2FE7BB\r
+:1011F00060E08DE792E0C457DF4F0FB6F894DEBF92\r
+:101200000FBECDBFDF91CF911F910F910C940815A8\r
+:10121000C457DF4F0FB6F894DEBF0FBECDBFDF91CE\r
+:10122000CF911F910F910895CF93DF93EA019B0116\r
+:10123000AC0160E074E284E79BE40E945F2C0E94B2\r
+:10124000C72C709397006093960020E130E02C1B30\r
+:101250003D0B02C0759567952A95E2F7709399004A\r
+:1012600060939800DF91CF9108951092020210923E\r
+:10127000010210929000109291001092FD011092C4\r
+:10128000FE011092FF01109200021092FC011092D8\r
+:10129000FB01E9EDF1E0A9ECB1E01192119211929C\r
+:1012A00011921D921D9281E0E93FF807B1F7089570\r
+:1012B000AF92BF92CF92DF92EF92FF920F931F9364\r
+:1012C000CF93DF936B017C0109EF11E047EDA42E72\r
+:1012D00041E0B42EC7E0D0E0A7019601F801929159\r
+:1012E0008291729162918F010E945B2C882349F058\r
+:1012F0002197F2E0AF1AB108CF3F8FEFD80761F71F\r
+:1013000034C0F8011082118212821382F501118219\r
+:101310001082FE01EE0FFF1FEE0FFF1FE752FE4F80\r
+:10132000DE01AA0FBB1FA753BE4FCE011AC0019604\r
+:1013300044815581668177814083518362837383C1\r
+:10134000148215821682178212962D913C91139762\r
+:1013500011963C932E9313961C921E9212973496DC\r
+:1013600012968730910519F7C3CF809101029091B1\r
+:101370000202019797FD05C090930202809301023B\r
+:1013800004C01092020210920102E0910102F09159\r
+:101390000202309789F410929000109291001092FE\r
+:1013A000FD011092FE011092FF01109200021092B6\r
+:1013B000FC011092FB019EC03197DF01AA0FBB1FF9\r
+:1013C000AA0FBB1FA752BE4FCD90DD90ED90FC90B1\r
+:1013D000EE0FFF1FE753FE4FC081D181A090FD01AA\r
+:1013E000B090FE010091FF0110910002A70196014B\r
+:1013F0006A2D7B2D802F912F0E945B2C87FF2FC0A1\r
+:1014000081E08093C801AE016A2D7B2D802F912F42\r
+:101410000E9414092091FD013091FE014091FF01CD\r
+:1014200050910002C701B6010E94F62B20E030E087\r
+:101430004AEF53E40E945F2C9B01AC016A2D7B2D87\r
+:10144000802F912F0E94F72B5B018C01A701960141\r
+:101450007B2D912F0E945B2C1816ACF638C0A7018B\r
+:1014600096016A2D7B2D802F912F0E94AA2D181690\r
+:1014700084F581E08093C801AE016A2D7B2D802F19\r
+:10148000912F0E941409A70196016091FD017091AE\r
+:10149000FE018091FF01909100020E94F62B20E056\r
+:1014A00030E04AEF53E40E945F2C9B01AC016A2DAF\r
+:1014B0007B2D802F912F0E94F62B5B018C01A701C1\r
+:1014C00096017B2D912F0E94AA2D87FFD5CF1092D8\r
+:1014D000C801AE01C701B6010E941409C092FD0106\r
+:1014E000D092FE01E092FF01F0920002D093FC0145\r
+:1014F000C093FB01DF91CF911F910F91FF90EF906F\r
+:10150000DF90CF90BF90AF90089508951F920F92F3\r
+:101510000FB60F9211242F933F934F935F936F93C6\r
+:101520007F938F939F93AF93BF93EF93FF9380919C\r
+:10153000960090919700892B09F455C08091C801BD\r
+:10154000811151C08091F9019091FA01813091058A\r
+:1015500071F082309105C1F0892BC1F52091FD0118\r
+:101560003091FE014091FF01509100021DC0609139\r
+:10157000FD017091FE018091FF01909100029B019D\r
+:10158000AC010E94F72B0EC020E030E040E450E4B4\r
+:101590006091FD017091FE018091FF019091000228\r
+:1015A0000E94AE2D9B01AC0160E074E284E79BE4F5\r
+:1015B0000E945F2C0E94C72C709397006093960046\r
+:1015C0007595679570939900609398008091F901E3\r
+:1015D0009091FA01019663E070E00E948A2F909347\r
+:1015E000FA018093F901FF91EF91BF91AF919F9123\r
+:1015F0008F917F916F915F914F913F912F910F90BC\r
+:101600000FBE0F901F901895AF92BF92CF92DF92AE\r
+:10161000EF92FF920F931F93CF93DF936B017C01A7\r
+:10162000EA0120E030E0A9010E94AA2D18160CF072\r
+:10163000B4C03E9A82E8809390008AE18093910042\r
+:10164000A090FD01B090FE010091FF0110910002F9\r
+:1016500020E030E0A9016A2D7B2D802F912F0E9480\r
+:101660005B2C81112DC0AE01C701B6010E94140987\r
+:10167000C092FD01D092FE01E092FF01F0920002C3\r
+:10168000D093FC01C093FB01809101029091020272\r
+:10169000FC01EE0FFF1FEE0FFF1FE752FE4FC0824F\r
+:1016A000D182E282F382FC01EE0FFF1FE753FE4F6F\r
+:1016B000D183C083019690930202809301026DC092\r
+:1016C000A70196016A2D7B2D802F912F0E945B2C04\r
+:1016D00087FF2CC0AE016A2D7B2D802F912F0E9499\r
+:1016E00014092091FD013091FE014091FF015091BC\r
+:1016F0000002C701B6010E94F62B20E030E04AEF5D\r
+:1017000053E40E945F2C9B01AC016A2D7B2D802F3E\r
+:10171000912F0E94F72B5B018C01A70196017B2D75\r
+:10172000912F0E945B2C1816ACF69DCFA701960155\r
+:101730006A2D7B2D802F912F0E94AA2D18160CF058\r
+:1017400092CFAE016A2D7B2D802F912F0E9414091C\r
+:10175000A70196016091FD017091FE018091FF014A\r
+:10176000909100020E94F62B20E030E04AEF53E413\r
+:101770000E945F2C9B01AC016A2D7B2D802F912F45\r
+:101780000E94F62B5B018C01A70196017B2D912F06\r
+:101790000E94AA2D87FFD5CF66CFDF91CF911F91F1\r
+:1017A0000F91FF90EF90DF90CF90BF90AF90089592\r
+:1017B00080910C020895CF93DF9300D01F92CDB794\r
+:1017C000DEB720916E03243021F523E029839B832B\r
+:1017D0008A832093E9008FEF06C095ED9A95F1F783\r
+:1017E0000000882329F09091E800815095FFF5CF03\r
+:1017F0008091E80085FF0DC040E050E063E070E0BC\r
+:10180000CE0101960E94BA0F8091E8008E778093F6\r
+:10181000E8000F900F900F90DF91CF910895CF9334\r
+:10182000DF9300D01F92CDB7DEB720916E03243036\r
+:1018300029F522E029839B838A8383E08093E90052\r
+:101840008FEF06C095ED9A95F1F70000882329F0F7\r
+:101850009091E800815095FFF5CF8091E80085FFD9\r
+:101860000DC040E050E063E070E0CE0101960E94C0\r
+:10187000BA0F8091E8008E778093E8000F900F9068\r
+:101880000F90DF91CF91089520916E032430F9F4E9\r
+:1018900022E02093E9002FEF06C035ED3A95F1F7ED\r
+:1018A0000000222329F03091E800215035FFF5CFC8\r
+:1018B0002091E80025FF0BC040E050E065E070E0BB\r
+:1018C0000E94BA0F8091E8008E778093E800089517\r
+:1018D000CF93DF93EC0180916E03843041F581E07A\r
+:1018E0008093E9008FEF06C095ED9A95F1F700001F\r
+:1018F000882329F09091E800815095FFF5CF8091E1\r
+:10190000E80085FF14C040E050E068E070E0CE01E0\r
+:101910000E94BA0F8091E8008E778093E80088E0FB\r
+:10192000FE01A4E0B2E001900D928A95E1F7DF910B\r
+:10193000CF910895BF92CF92DF92EF92FF920F93D3\r
+:101940001F93CF93DF937C01B62EE90100E010E0F6\r
+:10195000C42ED12C0BC04991202F2B0D2F774F7700\r
+:101960006FE0C7010E94E8140F5F1F4F0C151D05A3\r
+:1019700094F3DF91CF911F910F91FF90EF90DF9043\r
+:10198000CF90BF90089570E06F5F7F4F6F707727A3\r
+:101990000C94E8140F931F93CF93C42F63307105F9\r
+:1019A00009F04AC0842F807F803849F1803909F0DE\r
+:1019B00043C0622F6F7770E080E090E00E94FA2CC5\r
+:1019C00020E030E040E451E40E945F2C9B01AC0138\r
+:1019D00060E070E080E090E40E94112E0F7710E04C\r
+:1019E00023E0159507952A95E1F72DEC3CEC42E0B4\r
+:1019F00053E40E94AE2DA8010E94040B1DC0622F6B\r
+:101A00006F7770E080E090E00E94FA2C20E030E0F8\r
+:101A100040E451E40E945F2C9B01AC0160E070E067\r
+:101A200080E090E40E94112E2DEC3CEC42E053E467\r
+:101A30000E94AE2D0E945809CC3F29F4CF911F91EE\r
+:101A40000F910C943509CF911F910F9108950F9329\r
+:101A50001F93CF93DF93CDB7DEB727970FB6F894D8\r
+:101A6000DEBF0FBECDBF8C0114C08A810E94C2149C\r
+:101A70009A819D839B819E839C819F8381111EC03F\r
+:101A800089818430B1F08730A1F08630A1F08530B3\r
+:101A9000A1F0BE016F5F7F4F84E091E00E942F189C\r
+:101AA0008111E3CF84E091E00E9420180E949B14F2\r
+:101AB0000DC083E003C082E001C081E0AE014B5F56\r
+:101AC0005F4F682FC8010E945515E3CF27960FB6C8\r
+:101AD000F894DEBF0FBECDBFDF91CF911F910F9164\r
+:101AE0000895EF92FF920F93CF93DF9300D000D031\r
+:101AF00000D0CDB7DEB77B014A832B830C83842FC4\r
+:101B00002E834D830E94C2142E814D8181111BC0F2\r
+:101B100082E0E816F10479F083E0E816F10421F0A0\r
+:101B2000EA94EF2821F50BC0073F11F487E001C0CC\r
+:101B300084E089830BC0273FD9F786E0FACF473F7F\r
+:101B4000B9F785E0F6CF42954F704983BE016F5FCC\r
+:101B50007F4F84E091E00E94E51784E091E00E94CD\r
+:101B6000031884E091E00E9420180E949B1426969E\r
+:101B70000FB6F894DEBF0FBECDBFDF91CF910F91AE\r
+:101B8000FF90EF90089580916D03811109C00E942C\r
+:101B9000A1110E94FE118091E20084608093E20016\r
+:101BA000089510926D03089508950C94E4020C9426\r
+:101BB000892480916E03843049F58091E9008F700B\r
+:101BC0009091EC0090FF02C090E801C090E0982B4B\r
+:101BD00084E08093E9008091EB0080FF14C0809145\r
+:101BE000EE0087FD03C00FC01092F1008091E80065\r
+:101BF00085FDFACF8091E80080FF05C08091E80064\r
+:101C00008E778093E8009F709093E900089542E0FA\r
+:101C100061EC81E00E94171142E061EC82E00E94D9\r
+:101C2000171142E061EC83E00E94171146E261EC7B\r
+:101C300084E00E94171142E361E885E00E941711D9\r
+:101C400042E360E886E00C941711809170038330C2\r
+:101C500009F454C030F4813071F0823009F0AAC028\r
+:101C600091C08A3009F47EC08B3009F45FC089309E\r
+:101C700009F0A0C020C080916F03813A09F09AC09A\r
+:101C80008091E800877F8093E800809173039091B2\r
+:101C90007403892B21F060E080E090E003C068E0ED\r
+:101CA00084E092E070E00E9458108091E8008B7709\r
+:101CB0008093E800089580916F03813209F07AC023\r
+:101CC0008091730390917403892B09F073C0809104\r
+:101CD000E800877F8093E80005C080916E03882329\r
+:101CE00009F468C08091E80082FFF7CF8091F1008D\r
+:101CF00080930C028091E8008B7758C080916F032D\r
+:101D0000813A09F057C08091730390917403892B35\r
+:101D100009F050C08091E800877F8093E8008091AF\r
+:101D2000E80080FFFCCF80911A013BC080916F03D7\r
+:101D3000813209F03FC08091730390917403892B25\r
+:101D4000C9F58091E800877F8093E8000E944E11DA\r
+:101D50009091710381E0911101C080E080931A019C\r
+:101D60000C948C1E80916F03813221F58091E800E4\r
+:101D7000877F8093E8000E944E11809172038093C8\r
+:101D80000302089580916F03813AA1F48091E800E5\r
+:101D9000877F8093E8008091E80080FFFCCF8091EE\r
+:101DA00003028093F1008091E8008E778093E80031\r
+:101DB0000C944E11089584B7877F84BF88E10FB6D5\r
+:101DC000F89480936000109260000FBE90E080E86D\r
+:101DD0000FB6F89480936100909361000FBE0E944B\r
+:101DE000A1110E94FE11E2EEF0E080818460808308\r
+:101DF00008958DE792E00E94241561E77DE08DE76C\r
+:101E000092E00E947A1567E27DE08DE792E00E9401\r
+:101E10007E150E94DB0E78946AEC7CE08DE792E000\r
+:101E20000E94201563EC7CE08DE792E00E9418157B\r
+:101E30006AE97CE08DE792E00E941C150E94850A09\r
+:101E40000E949B140E94AC1880E191E00E945418FB\r
+:101E50000BC00E944E2480916C03882329F00E94BD\r
+:101E6000742481110E94A40F80916E03853089F340\r
+:101E70008DE792E00E942D170E94B618F5CF292F0A\r
+:101E8000332723303105B1F04CF42130310509F40A\r
+:101E90004DC02230310509F04EC007C02132310556\r
+:101EA00041F12232310591F146C0E0EDF0E086E7E4\r
+:101EB00093E045C099278130910569F08230910502\r
+:101EC00089F0892B09F037C0E2E7F3E0E491F0E014\r
+:101ED00082E793E034C0E4E4F3E0E491F0E084E4EA\r
+:101EE00093E02DC0EAE1F3E0E491F0E08AE193E0D1\r
+:101EF00026C0643000F5E62FF0E0EE0FFF1FE75735\r
+:101F0000FE4F80819181E9E0F0E019C0643098F4DF\r
+:101F1000E62FF0E0DF01AA0FBB1FAF56BE4F8D9139\r
+:101F20009C91E756FE4FE081F0E009C0E2E1F0E06D\r
+:101F300086E494E004C0E0E0F0E080E090E0DA01C4\r
+:101F40008D939C93CF01089580E189BD82E189BD85\r
+:101F500009B400FEFDCF8091D8008F7D8093D8001A\r
+:101F60008091E00082608093E0008091E00081FD3C\r
+:101F7000FCCF0895BF92CF92DF92EF92FF920F9322\r
+:101F80001F93CF93DF937C018B01EA010E946F11B5\r
+:101F9000B82E811133C0209731F028813981021B7E\r
+:101FA000130BE20EF31EC12CD12C23C08091E8004C\r
+:101FB00085FD15C08091E8008E778093E80020971A\r
+:101FC00049F0888199818C0D9D1D9983888325E036\r
+:101FD000B22E14C00E946F11882359F00EC0F70171\r
+:101FE00081917F018093F10001501109FFEFCF1A19\r
+:101FF000DF0A01151105D1F601C0B82E8B2DDF9136\r
+:10200000CF911F910F91FF90EF90DF90CF90BF90F5\r
+:102010000895BF92CF92DF92EF92FF920F931F939A\r
+:10202000CF93DF937C018B01EA010E946F11B82EE0\r
+:10203000811133C0209731F028813981021B130BA5\r
+:10204000E20EF31EC12CD12C23C08091E80085FD47\r
+:1020500015C08091E8008B778093E800209749F0C5\r
+:10206000888199818C0D9D1D9983888345E0B42ECC\r
+:1020700014C00E946F11882359F00EC08091F100A6\r
+:10208000F70181937F0101501109FFEFCF1ADF0A99\r
+:1020900001151105D1F601C0B82E8B2DDF91CF911E\r
+:1020A0001F910F91FF90EF90DF90CF90BF90089518\r
+:1020B00040917503509176034617570748F0611514\r
+:1020C000710539F44091E8004E774093E80001C073\r
+:1020D000BA01FC0140E033C080916E03882309F40B\r
+:1020E00042C0853009F441C08091E80083FD39C0C9\r
+:1020F0008091E80082FD2FC08091E80080FF1FC022\r
+:102100009091F3008091F200392F20E0A901482B33\r
+:10211000CA0106C041914093F100615071090196D6\r
+:102120006115710519F088309105A0F341E0089719\r
+:1021300009F040E08091E8008E778093E800611517\r
+:10214000710551F64111C8CF06C080916E038823F6\r
+:1021500051F0853051F08091E80082FFF6CF80E0A9\r
+:10216000089581E0089582E0089583E00895409104\r
+:102170007503509176034617570748F061157105AE\r
+:1021800039F44091E8004E774093E80001C0BA016D\r
+:10219000FC0140E034C080916E03882309F443C001\r
+:1021A000853009F442C08091E80083FD3AC08091F7\r
+:1021B000E80082FD30C08091E80080FF20C090914F\r
+:1021C000F3008091F200392F20E0A901482BCA01C9\r
+:1021D00007C044914093F100319661507109019616\r
+:1021E0006115710519F08830910598F341E0089761\r
+:1021F00009F040E08091E8008E778093E800611557\r
+:10220000710549F64111C7CF06C080916E0388233E\r
+:1022100051F0853051F08091E80082FFF6CF80E0E8\r
+:10222000089581E0089582E0089583E00895982F4D\r
+:102230002CC09093E900981739F07091EC00209130\r
+:10224000ED005091F00003C0242F762F50E021FDC7\r
+:1022500002C09F5F1AC03091EB003E7F3093EB00CD\r
+:102260003091ED003D7F3093ED003091EB00316017\r
+:102270003093EB007093EC002093ED005093F0004E\r
+:102280002091EE0027FDE5CF07C0973090F28F70C8\r
+:102290008093E90081E0089580E0089580916F03C4\r
+:1022A00087FD05C08091E80080FF0EC012C08091BC\r
+:1022B000E80082FD05C080916E038111F8CF08957A\r
+:1022C0008091E8008B7708C080916E038111EACF7E\r
+:1022D00008958091E8008E778093E80008958091BA\r
+:1022E000E4009091E50045E62091EC0020FD1FC040\r
+:1022F00023C020916E03222391F0253091F020918C\r
+:10230000EB0025FD10C02091E4003091E500281776\r
+:10231000390751F34150C90139F784E0089582E04B\r
+:10232000089583E0089581E0089580E00895209164\r
+:10233000E80020FFDECFF9CF2091E80022FFD9CFBF\r
+:10234000F4CF0E940F120E941712E0EEF0E080819D\r
+:1023500081608083E8EDF0E080818F77808319BC15\r
+:10236000A7EDB0E08C918E7F8C9380818F7E8083EF\r
+:1023700010926D0308950F931F93CF93DF930E94E4\r
+:102380000F120E941712C8EDD0E088818F778883E2\r
+:1023900088818068888388818F7D888319BC1092AA\r
+:1023A0006E0310926A0310926C0310926B0300EE9E\r
+:1023B00010E0F80180818B7F808388818160888331\r
+:1023C00042E060E080E00E941711E1EEF0E08081E1\r
+:1023D0008E7F8083E2EEF0E0808181608083808167\r
+:1023E00088608083F80180818E7F8083888180610E\r
+:1023F0008883DF91CF911F910F910895E8EDF0E070\r
+:1024000080818F7E8083E7EDF0E080818160808332\r
+:1024100084E082BF81E080936D030C94BB11E8EDF2\r
+:10242000F0E080818E7F80831092E2000895109208\r
+:10243000DA001092E10008951F920F920FB60F92EA\r
+:1024400011242F933F934F935F936F937F938F93B9\r
+:102450009F93AF93BF93EF93FF938091E10082FF2F\r
+:102460000BC08091E20082FF07C08091E1008B7F6A\r
+:102470008093E1000E94D90D8091DA0080FF1FC097\r
+:102480008091D80080FF1BC08091DA008E7F8093FE\r
+:10249000DA008091D90080FF0DC080E189BD82E122\r
+:1024A00089BD09B400FEFDCF81E080936E030E94D8\r
+:1024B000C30D05C019BC10926E030E94D10D80910E\r
+:1024C000E10080FF19C08091E20080FF15C080917B\r
+:1024D000E2008E7F8093E2008091E2008061809331\r
+:1024E000E2008091D80080628093D80019BC85E01A\r
+:1024F00080936E030E94D50D8091E10084FF30C06F\r
+:102500008091E20084FF2CC080E189BD82E189BD19\r
+:1025100009B400FEFDCF8091D8008F7D8093D80054\r
+:102520008091E1008F7E8093E1008091E2008F7EB8\r
+:102530008093E2008091E20081608093E2008091CC\r
+:102540006A03882311F084E007C08091E30087FFCD\r
+:1025500002C083E001C081E080936E030E94D70D2A\r
+:102560008091E10083FF29C08091E20083FF25C0B4\r
+:102570008091E100877F8093E10082E080936E0389\r
+:1025800010926A038091E1008E7F8093E100809138\r
+:10259000E2008E7F8093E2008091E2008061809370\r
+:1025A000E20042E060E080E00E9417118091F000BC\r
+:1025B00088608093F0000E94D40DFF91EF91BF914D\r
+:1025C000AF919F918F917F916F915F914F913F91CB\r
+:1025D0002F910F900FBE0F901F9018951F920F9282\r
+:1025E0000FB60F9211242F933F934F935F936F93E6\r
+:1025F0007F938F939F93AF93BF93CF93EF93FF936B\r
+:102600008091E9008F709091EC0090FF02C090E8FB\r
+:1026100001C090E0C92FC82B1092E9008091F00012\r
+:10262000877F8093F00078940E9432131092E90023\r
+:102630008091F00088608093F000CF70C093E90033\r
+:10264000FF91EF91CF91BF91AF919F918F917F912A\r
+:102650006F915F914F913F912F910F900FBE0F900F\r
+:102660001F9018951F93CF93DF93CDB7DEB7AC972C\r
+:102670000FB6F894DEBF0FBECDBFEFE6F3E080915A\r
+:10268000F100819323E0E737F207C9F70E94250E96\r
+:102690008091E80083FF37C180916F0390917003B0\r
+:1026A000953009F488C038F49130B1F170F093306E\r
+:1026B00009F029C131C0983009F4F8C0993009F403\r
+:1026C00004C1963009F01FC19DC0803821F08238C6\r
+:1026D00009F019C108C080916B0390916C03992394\r
+:1026E00089F082600FC080917303909174038F70A2\r
+:1026F00099278093E9008091EB0085FB882780F97A\r
+:102700001092E9009091E800977F9093E800809301\r
+:10271000F1001092F100D5C0882319F0823009F041\r
+:10272000F2C08F7121F0823009F0EDC00BC08091B2\r
+:102730007103813009F0E7C0933009F080E08093A5\r
+:102740006C032FC08091710381112BC080917303A2\r
+:10275000909174038F709927009709F4D4C08093E7\r
+:10276000E9002091EB0020FF1CC020917003233072\r
+:1027700021F48091EB00806212C09091EB00906197\r
+:102780009093EB0021E030E001C0220F8A95EAF738\r
+:102790002093EA001092EA008091EB008860809319\r
+:1027A000EB001092E9008091E800877F8093E800B9\r
+:1027B0000E944E11A8C08111A6C080917103909112\r
+:1027C00072038F779927182F9091E3009078982BB8\r
+:1027D0009093E3008091E800877F8093E8000E9457\r
+:1027E0004E118091E80080FFFCCF8091E30080686B\r
+:1027F0008093E300112311F083E001C082E0809315\r
+:102800006E0381C08058823008F07DC080917103D2\r
+:10281000909172038C3D23E0920779F583E08A83DF\r
+:102820008AE289834FB7F894DE01139620E03EE0F8\r
+:1028300051E2E32FF0E050935700E49120FF03C0F2\r
+:10284000E295EF703F5FEF708E2F90E0EA3010F06E\r
+:10285000C79601C0C0968D939D932F5F243149F791\r
+:102860004FBF8091E800877F8093E8006AE270E0C4\r
+:10287000CE0101960E94581013C0AE01455D5F4F16\r
+:10288000609173030E943F0F0097E9F12091E800E7\r
+:10289000277F2093E800BC018BA59CA50E94B71060\r
+:1028A0008091E8008B778093E8002DC0803859F53F\r
+:1028B0008091E800877F8093E80080916A0380938D\r
+:1028C000F1008091E8008E7771CF81111CC090914A\r
+:1028D00071039230C0F48091E800877F8093E80014\r
+:1028E00090936A030E944E1180916A03811104C083\r
+:1028F0008091E30087FF02C084E001C081E0809303\r
+:102900006E030E94070E8091E80083FF0AC0809149\r
+:10291000E800877F8093E8008091EB0080628093DD\r
+:10292000EB00AC960FB6F894DEBF0FBECDBFDF91C3\r
+:10293000CF911F910895CF9380916E038823B1F0BA\r
+:102940008091E9008F709091EC0090FF02C090E8B8\r
+:1029500001C090E0C92FC82B1092E9008091E800D7\r
+:1029600083FD0E943213CF70C093E900CF91089588\r
+:10297000881F8827881F089591E0883F08F490E019\r
+:10298000892F0895982F907F903B99F038F49039D3\r
+:1029900081F0903A71F09038C9F40BC0903DA1F0ED\r
+:1029A00018F4903C99F410C0903E19F0903F71F4E7\r
+:1029B00002C083E00895E82FE15FEF3038F4F0E0E3\r
+:1029C000E356FE4F8081089582E0089580E00895E7\r
+:1029D0000F932F774F776F70606BDC01ED91FC9157\r
+:1029E000022F242F462F63E070E009950F91089580\r
+:1029F0000F932F774F776F706069DC01ED91FC9139\r
+:102A0000022F242F462F63E070E009950F9108955F\r
+:102A10000F932F774F776F706068DC01ED91FC9119\r
+:102A2000022F242F462F63E070E009950F9108953F\r
+:102A3000FC01738362830895FC01738F628F089594\r
+:102A4000FC01758F648F0895CF93DF93EC011DA275\r
+:102A50001FA21EA2BC01685D7F4F40EC88519F4FB2\r
+:102A60000E9461171B821A821D821C821F821E8295\r
+:102A7000198618861B861A861D861C861F861E864A\r
+:102A8000198A188A1B8A1A8A1D8A1C8A1F8A1E8A1A\r
+:102A9000198E188E1B8E1A8E1D8E1C8E1F8E1E8EEA\r
+:102AA00019A218A2DF91CF910895CF92DF92FF92E1\r
+:102AB0000F931F93CF93DF931F92CDB7DEB7F62E00\r
+:102AC0006A018C0108511F4F08C0F60161916F0126\r
+:102AD000C80149830E94681749818C2D841B8F157A\r
+:102AE000A0F30F90DF91CF911F910F91FF90DF9096\r
+:102AF000CF900895FC01718360830895FC0171A358\r
+:102B000060A30895AF92BF92CF92DF92EF92FF92AF\r
+:102B10000F931F93CF93DF9300D01F92CDB7DEB7F3\r
+:102B20007C016B01142FB22EA02EDC0195968C91A6\r
+:102B300095978430F1F45A96ED91FC915B9730971C\r
+:102B400009F4D8C0CB01019763E070E00E94762FB2\r
+:102B5000DB01AA0FBB1FA60FB71F49832A830B8374\r
+:102B60004C2D4A1B9E012F5F3F4FBD01C7010995A8\r
+:102B7000B1C06230710509F453C06330710529F0AA\r
+:102B80006130710509F09CC083C0842F807F803A3A\r
+:102B900001F130F48038B9F0803909F0ABC00DC0D4\r
+:102BA000803EE9F0803F09F1803B09F0A3C0D701E6\r
+:102BB0001296ED91FC91139723C0D7011496ED91D5\r
+:102BC000FC9115971DC0D7011696ED91FC911797B2\r
+:102BD00017C0D7011896ED91FC91199711C0D70134\r
+:102BE0001A96ED91FC911B970BC0423F09F082C0F1\r
+:102BF000D7011C96ED91FC911D97309731F47AC066\r
+:102C0000309709F477C0123F21F42A2D4B2D62EF43\r
+:102C100004C0612F6F702A2D4B2DC70109955AC032\r
+:102C2000842F807F803D59F0803F79F0803C09F00F\r
+:102C300061C0D7011E96ED91FC911F9719C0D70175\r
+:102C40005096ED91FC91519713C0433F31F4D70159\r
+:102C50005296ED91FC91539708C0413F09F04AC04C\r
+:102C6000D7015496ED91FC915597309741F442C0AD\r
+:102C7000309709F43FC0133F11F0113F19F44B2D69\r
+:102C8000612F03C0612F6F704B2DC701099522C0C2\r
+:102C9000842F0E94BC14882331F0D7015696ED9101\r
+:102CA000FC91579707C0163F29F5D7015896ED912B\r
+:102CB000FC9159973097F1F0612FC70109950AC02F\r
+:102CC00064307105A8F416C00A2D2B2D412FB601D2\r
+:102CD000C7010995D7015E96ED91FC915F973097FA\r
+:102CE00089F00A2D2B2D412FB601C70109950AC085\r
+:102CF000C12CD12CD7015C96ED91FC915D9730975A\r
+:102D000019F7E8CF0F900F900F90DF91CF911F919F\r
+:102D10000F91FF90EF90DF90CF90BF90AF9008950C\r
+:102D2000EF92FF920F931F93CF93DF93EC01162F37\r
+:102D3000862F0E94BC14882369F0FDA081E08DA33A\r
+:102D400000E020E0412F61E070E0CE010E9482159A\r
+:102D5000FDA27CC0812F0E94B8144DA1882309F4E4\r
+:102D600040C0443029F01AA321E030E03FA32EA355\r
+:102D7000812F0E94C214813031F070F0823051F006\r
+:102D8000833059F507C08DA300E020E0412F61E0BA\r
+:102D900070E01EC08DA35AC0103F19F0173FE9F430\r
+:102DA00004C084E08DA31AA33FC02EA13FA1C90196\r
+:102DB00063E070E00E94762F8C0F9D1FFC0112A330\r
+:102DC000B9016F5F7F4F7FA36EA30CA12BA14AA116\r
+:102DD000CE010E9482151DA239C01DA21FA21EA2F3\r
+:102DE00035C0442399F12EA13FA1C90163E070E0F1\r
+:102DF0000E94762F7C01FE01E80FF91F12A3B90192\r
+:102E00006F5F7F4F7FA36EA38130910591F082E0C9\r
+:102E1000E816F104D9F40CA12BA14AA1CE010E941D\r
+:102E200082158DA1843091F081E090E09FA38EA364\r
+:102E30000DC0423059F400E02BA14AA1CE010E94FE\r
+:102E400082158DA1843011F0FFA2EEA2DF91CF9107\r
+:102E50001F910F91FF90EF900895CF92DF92EF9224\r
+:102E6000FF920F931F93CF93DF93EC01E8A1F9A199\r
+:102E7000309709F009958E0108511F4FC8010E9433\r
+:102E80009A17E12CF12CC82ED12C0FC060E0C8019C\r
+:102E90000E94AE17682FCE010E94901661E0C80113\r
+:102EA0000E94BF178FEFE81AF80AEC14FD0470F3C4\r
+:102EB000DF91CF911F910F91FF90EF90DF90CF9016\r
+:102EC0000895FC0142837483638311821082089504\r
+:102ED0000F931F93CF93DF93EC01062F0E94E0170F\r
+:102EE000182F298130E0C90101966A8170E00E94A3\r
+:102EF0008A2F488150E08417950729F4812F0E947A\r
+:102F0000E31780E012C0EB81FC81E20FF31F008326\r
+:102F10002981822F90E001966A8170E00E948A2FB9\r
+:102F20008983812F0E94E31781E0DF91CF911F9168\r
+:102F30000F910895CF93DF93EC010E94E017298150\r
+:102F40009881291710F0C22F02C0CA81C20FC91B75\r
+:102F50000E94E3178C2FDF91CF910895FC0120810F\r
+:102F6000862F90E0820F911D628170E00E948A2F6F\r
+:102F70000380F481E02DE80FF91F808108950F93FD\r
+:102F80001F93CF93DF931F92CDB7DEB78C01698378\r
+:102F90000E94E017482FF80180816981262F30E0D8\r
+:102FA000280F311D6281C90170E00E948A2F808341\r
+:102FB000842F0F90DF91CF911F910F910C94E31705\r
+:102FC0008FB7F89408958FBF0895FC01CB0120912D\r
+:102FD0006E032430B1F421812F702093E90040E08A\r
+:102FE00050E064E070E00E94BA0F81110BC0909134\r
+:102FF000E80095FD07C09091E8009E779093E80067\r
+:10300000089582E0089520916E032430A9F4FC0114\r
+:1030100081818F708093E9003091F3002091F2005C\r
+:10302000932F80E0822B892B49F08091E8008E77E6\r
+:103030008093E8000C946F1182E0089580E0089579\r
+:1030400020916E03243051F4FC0121812F702093D4\r
+:10305000E9002091E80020FD0C9403180895FC017C\r
+:10306000CB0120916E03243011F080E00895268179\r
+:103070002F702093E9002091E80022FFF6CF2091E5\r
+:10308000E80025FFF2CF40E050E064E070E00E94ED\r
+:1030900009108091E80085FD05C08091E8008B77DC\r
+:1030A0008093E80081E0089590930F0280930E02D0\r
+:1030B000089580910E0290910F020895E0910E0202\r
+:1030C000F0910F02309721F00190F081E02D0994EA\r
+:1030D00080E00895E0910E02F0910F02309721F008\r
+:1030E0000280F381E02D09940895E0910E02F091A1\r
+:1030F0000F02309721F00480F581E02D09940895A6\r
+:1031000020911002309111028217930771F0909371\r
+:10311000110280931002E0910E02F0910F0230979D\r
+:1031200021F00680F781E02D099408952091120284\r
+:10313000309113028217930771F0909313028093DA\r
+:103140001202E0910E02F0910F02309721F00084FC\r
+:10315000F185E02D099408950E94B6240E948D0502\r
+:103160000E948A250C945F2B0C94CE075F926F927D\r
+:103170007F928F929F92AF92BF92CF92DF92EF9207\r
+:10318000FF920F931F93CF93DF93CDB7DEB72A97AC\r
+:103190000FB6F894DEBF0FBECDBF0E947E0694E14D\r
+:1031A000C92E92E0D92E00E010E0AA24A394B12CFD\r
+:1031B000502E802F0E94C4073C01F601E190F1904F\r
+:1031C0006F01E826F926E114F10431F40F5F1F4F77\r
+:1031D0000430110569F73AC08091680281FD0E94B0\r
+:1031E000CD0720E030E04501022E02C0880C991C7A\r
+:1031F0000A94E2F7C4018E219F21892B09F12E83C5\r
+:103200005F826820792081E0672809F480E0888760\r
+:103210000E94BF248160782F9A8789874E815F81C1\r
+:1032200068858A850E946F19F801EE0FFF1FEC5E1A\r
+:10323000FD4F80819181882599259183808316C0D7\r
+:103240002F5F3F4F2C30310571F6C0CF8FEF898350\r
+:103250008A831B820E94BF248160782F9D838C8388\r
+:1032600049815A816B818D810E946F190E94772854\r
+:1032700010911C020E945E181817D9F00E945E1867\r
+:1032800080931C022A960FB6F894DEBF0FBECDBF06\r
+:10329000DF91CF911F910F91FF90EF90DF90CF9032\r
+:1032A000BF90AF909F908F907F906F905F900C94A5\r
+:1032B000B4182A960FB6F894DEBF0FBECDBFDF91CB\r
+:1032C000CF911F910F91FF90EF90DF90CF90BF9023\r
+:1032D000AF909F908F907F906F905F900895CF9365\r
+:1032E000DF93CDB7DEB72B970FB6F894DEBF0FBED6\r
+:1032F000CDBF4F83588769877A878B87DE01119608\r
+:1033000086E0FD0111928A95E9F785E0FE01379686\r
+:1033100001900D928A95E1F749815A816B817C81F8\r
+:103320008D819E810E9447212B960FB6F894DEBFB7\r
+:103330000FBECDBFDF91CF910895CF93C82F8823C3\r
+:1033400009F4C1C0823859F40E945E1881FDBBC0E7\r
+:1033500089E30E94AC230E94282489E30CC08338AF\r
+:1033600079F40E945E1880FDAEC083E50E94AC2314\r
+:103370000E94282483E50E94CE23CF910C94282418\r
+:10338000843859F40E945E1882FD9DC087E40E9433\r
+:10339000AC230E94282487E4EECF8450813A48F47D\r
+:1033A0008C2F0E94C72A81118EC08C2F0E94AC23C3\r
+:1033B000E4CF8C2F805E883050F4C77081E090E0BD\r
+:1033C00001C0880FCA95EAF70E94EF23D6CF8C2F51\r
+:1033D000855A833078F4C53A29F0C63A31F482E848\r
+:1033E00090E005C081E890E002C083E890E0CF91D2\r
+:1033F0000C9480188C2F885A833108F064C0C83A26\r
+:1034000039F1C93A41F1CA3A49F1CB3A51F1CC3AD2\r
+:1034100059F1CD3A61F1C03B69F1CE3A71F1CF3A41\r
+:1034200079F1C13B81F1C23B89F1C33B91F1C43BCE\r
+:1034300099F1C53BA1F1C63BA9F1C73BB1F1C83B2E\r
+:10344000B9F1C93BC1F1CA3BC9F58AE292E038C083\r
+:1034500082EE90E035C089EE90E032C08AEE90E0D6\r
+:103460002FC085EB90E02CC086EB90E029C087EB65\r
+:1034700090E026C08CEC90E023C08DEC90E020C062\r
+:1034800083E891E01DC08AE891E01AC082E991E0EA\r
+:1034900017C084E991E014C081E292E011C083E298\r
+:1034A00092E00EC084E292E00BC085E292E008C098\r
+:1034B00086E292E005C087E292E002C080E090E000\r
+:1034C000CF910C949618CF910895882309F44DC09C\r
+:1034D000823859F40E945E1881FF47C089E30E9438\r
+:1034E000AC230E94282489E30CC0833871F40E9425\r
+:1034F0005E1880FF3AC083E50E94AC230E94282416\r
+:1035000083E50E94CE230C942824843859F40E9429\r
+:103510005E1882FF2AC087E40E94AC230E94282400\r
+:1035200087E4EFCF982F9450913A08F4EACF982F80\r
+:10353000905E983058F4282F277081E090E001C009\r
+:10354000880F2A95EAF70E94F523DDCF982F955A28\r
+:10355000933020F480E090E00C948018885A8331F6\r
+:1035600020F480E090E00C9496180895882321F0D0\r
+:103570000E94EF230C9428240895882321F00E94B0\r
+:10358000F5230C9428240895BF92CF92DF92EF92F6\r
+:10359000FF920F931F93CF93DF93CDB7DEB727979B\r
+:1035A0000FB6F894DEBF0FBECDBF8C0185E0F801E9\r
+:1035B000DE01119601900D928A95E1F7F8013081B4\r
+:1035C0002181F280558152955F7083819481892B8E\r
+:1035D00039F02F3F41F481E090E03F3F31F003C0EC\r
+:1035E00081E090E002C080E090E080FD73C3398309\r
+:1035F0002A8389819A815E830E946923B92E8F83F1\r
+:103600000E9468230E9490222B2D22952F7030E07B\r
+:103610005E816F812530310509F4E6C06CF42430F9\r
+:1036200031050CF0A2C04B2D407F8B2D8F702230C6\r
+:1036300031050CF045C017C02C3031054CF42A3050\r
+:1036400031050CF0E7C12830310509F043C3E5C06E\r
+:103650002D30310509F4BAC20CF4A2C22F30310565\r
+:1036600009F038C323C3182F411101C002C01295BD\r
+:10367000107FFF2059F0112309F46BC2812F6F8353\r
+:103680000E94FF230E9428246F8163C2862F0E941C\r
+:10369000651A112309F41EC3812F0E940524279661\r
+:1036A0000FB6F894DEBF0FBECDBFDF91CF911F9153\r
+:1036B0000F91FF90EF90DF90CF90BF900C94282453\r
+:1036C000403211F08295807F662319F0613071F5E8\r
+:1036D00023C0FF20B1F0511101C032C0513081F53B\r
+:1036E00027960FB6F894DEBF0FBECDBFDF91CF9106\r
+:1036F0001F910F91FF90EF90DF90CF90BF900C94AF\r
+:103700000F24511101C003C0513009F4E3C28E836C\r
+:103710000E9412248E819AC1FF2021F0563008F0B9\r
+:10372000D9C20EC0553008F0D5C290C1FF20C9F0F3\r
+:10373000552331F0F801958190FF0BC29F7095835E\r
+:1037400027960FB6F894DEBF0FBECDBFDF91CF91A5\r
+:103750001F910F91FF90EF90DF90CF90BF900C944E\r
+:10376000B61A552309F472C109C22B2D2695269548\r
+:10377000237030E02115310529F02130310509F0A1\r
+:10378000A9C219C0FF2021F0862F9B2D937002C083\r
+:1037900080E090E027960FB6F894DEBF0FBECDBF55\r
+:1037A000DF91CF911F910F91FF90EF90DF90CF901D\r
+:1037B000BF900C948018FF2021F0862F9B2D9370D2\r
+:1037C00002C080E090E027960FB6F894DEBF0FBEEF\r
+:1037D000CDBFDF91CF911F910F91FF90EF90DF90C0\r
+:1037E000CF90BF900C949618862FFF2019F00E945E\r
+:1037F0007D2702C00E94E52727960FB6F894DEBF0A\r
+:103800000FBECDBFDF91CF911F910F91FF90EF9031\r
+:10381000DF90CF90BF900C946C288B2D837009F0B3\r
+:1038200079C0F11057C2262F229526952770220FB6\r
+:10383000220F862F8F70C82ED12CE12CF12C022E56\r
+:1038400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF4\r
+:1038500010C06FE070E080E090E004C0660F771F5A\r
+:10386000881F991F2A95D2F760957095809590953D\r
+:1038700003C060E070E0CB012B2D269526952370C8\r
+:10388000422F50E042305105D9F04330510569F1E3\r
+:103890006C297D298E299F294130510551F12796A8\r
+:1038A0000FB6F894DEBF0FBECDBFDF91CF911F9151\r
+:1038B0000F91FF90EF90DF90CF90BF900C94A522D6\r
+:1038C0006C297D298E299F2927960FB6F894DEBF93\r
+:1038D0000FBECDBFDF91CF911F910F91FF90EF9061\r
+:1038E000DF90CF90BF900C94B7220E94A522C70111\r
+:1038F000B60127960FB6F894DEBF0FBECDBFDF919D\r
+:10390000CF911F910F91FF90EF90DF90CF90BF90DC\r
+:103910000C949322FF2019F08B2D817001C08695A5\r
+:10392000882309F4D7C1262F229526952770220FC8\r
+:10393000220F862F8F70C82ED12CE12CF12C022E55\r
+:1039400004C0CC0CDD1CEE1CFF1C0A94D2F764FFF3\r
+:1039500010C06FE070E080E090E004C0660F771F59\r
+:10396000881F991F2A95D2F760957095809590953C\r
+:1039700003C060E070E0CB012B2D269526952370C7\r
+:10398000422F50E042305105D9F04330510569F1E2\r
+:103990006C297D298E299F294130510551F12796A7\r
+:1039A0000FB6F894DEBF0FBECDBFDF91CF911F9150\r
+:1039B0000F91FF90EF90DF90CF90BF900C94442335\r
+:1039C0006C297D298E299F2927960FB6F894DEBF92\r
+:1039D0000FBECDBFDF91CF911F910F91FF90EF9060\r
+:1039E000DF90CF90BF900C9456230E944423C701D0\r
+:1039F000B60127960FB6F894DEBF0FBECDBFDF919C\r
+:103A0000CF911F910F91FF90EF90DF90CF90BF90DB\r
+:103A10000C943223603F59F120F4603E08F494C0C6\r
+:103A200008C0623F09F467C0F0F1633F09F08CC041\r
+:103A300065C0162F1F708B2D8F71FF2021F00E9403\r
+:103A4000DD22812F7DCE0E94F822812F27960FB68E\r
+:103A5000F894DEBF0FBECDBFDF91CF911F910F91C4\r
+:103A6000FF90EF90DF90CF90BF900C94BD1AFF2095\r
+:103A7000B1F0553008F02EC18B2D8F7127960FB6FF\r
+:103A8000F894DEBF0FBECDBFDF91CF911F910F9194\r
+:103A9000FF90EF90DF90CF90BF900C94172356309B\r
+:103AA00008F018C1E9CFFF2099F08B2D8F71279670\r
+:103AB0000FB6F894DEBF0FBECDBFDF91CF911F913F\r
+:103AC0000F91FF90EF90DF90CF90BF900C94DD228C\r
+:103AD0008B2D8F7127960FB6F894DEBF0FBECDBF2A\r
+:103AE000DF91CF911F910F91FF90EF90DF90CF90DA\r
+:103AF000BF900C94F822F110EBCFD7CFFF2099F0B4\r
+:103B00008B2D8F7127960FB6F894DEBF0FBECDBFF9\r
+:103B1000DF91CF911F910F91FF90EF90DF90CF90A9\r
+:103B2000BF900C94CE2227960FB6F894DEBF0FBE3E\r
+:103B3000CDBFDF91CF911F910F91FF90EF90DF905C\r
+:103B4000CF90BF900C94C922FF20A9F0552309F40F\r
+:103B5000ACCF862F27960FB6F894DEBF0FBECDBF31\r
+:103B6000DF91CF911F910F91FF90EF90DF90CF9059\r
+:103B7000BF900C949D19552309F4AACF862F279640\r
+:103B80000FB6F894DEBF0FBECDBFDF91CF911F916E\r
+:103B90000F91FF90EF90DF90CF90BF900C94651A3B\r
+:103BA0004B2D4F70C8010E94E50227960FB6F8947E\r
+:103BB000DEBF0FBECDBFDF91CF911F910F91FF9060\r
+:103BC000EF90DF90CF90BF900C94FD21F11082C058\r
+:103BD0009B2D9F70492F50E04230510599F144F4DC\r
+:103BE0004115510569F04130510509F073C019C004\r
+:103BF00043305105C1F14430510509F06BC044C058\r
+:103C000027960FB6F894DEBF0FBECDBFDF91CF91E0\r
+:103C10001F910F91FF90EF90DF90CF90BF900C9489\r
+:103C2000702B27960FB6F894DEBF0FBECDBFDF9185\r
+:103C3000CF911F910F91FF90EF90DF90CF90BF90A9\r
+:103C40000C94872B27960FB6F894DEBF0FBECDBF1E\r
+:103C5000DF91CF911F910F91FF90EF90DF90CF9068\r
+:103C6000BF900C94A32B27960FB6F894DEBF0FBE1F\r
+:103C7000CDBFDF91CF911F910F91FF90EF90DF901B\r
+:103C8000CF90BF900C94B62B862F27960FB6F89442\r
+:103C9000DEBF0FBECDBFDF91CF911F910F91FF907F\r
+:103CA000EF90DF90CF90BF900C94DA2B4B2D4F709C\r
+:103CB000C80127960FB6F894DEBF0FBECDBFDF91C7\r
+:103CC000CF911F910F91FF90EF90DF90CF90BF9019\r
+:103CD0000C940E0827960FB6F894DEBF0FBECDBF2A\r
+:103CE000DF91CF911F910F91FF90EF90DF90CF90D8\r
+:103CF000BF9008950E940C240E94E1230E94282472\r
+:103D00000E9418290E946C2880E090E00E94801890\r
+:103D100080E090E00C9496180E94FC230C947A1E8C\r
+:103D20000E946923292F22952F7030E02C30310515\r
+:103D30004CF42A3031056CF422503109223031051F\r
+:103D400070F407C02C30310531F02F30310539F4D3\r
+:103D500002C081E0089593FB882780F9089580E0F0\r
+:103D60000895CF93DF9300D000D01F92CDB7DEB778\r
+:103D70000F900F900F900F900F90DF91CF910895BB\r
+:103D8000CF93DF9300D000D000D0CDB7DEB726961A\r
+:103D90000FB6F894DEBF0FBECDBFDF91CF9108956F\r
+:103DA0001F93CF93DF93C091530216E012C0D0E06F\r
+:103DB0001C9FF0011D9FF00D1124ED5DFD4F408112\r
+:103DC000518162817381848195810E94C01E2196F8\r
+:103DD000C77080915402C813EACFDF91CF911F9131\r
+:103DE000089540911D0250911E0260911F02709132\r
+:103DF000200280912102909122020C94C01E0F9308\r
+:103E00001F93CF93DF938091220282958F7009F0E8\r
+:103E100069C080911F02882309F464C0A0915302F5\r
+:103E2000D0915402B0911D02C0911E0280912002D7\r
+:103E30009091210221E030E0BF3F11F020E030E01E\r
+:103E4000122FBC016095709506E04AC0009721F0E2\r
+:103E5000CF3F29F4212F05C021E030E002C020E04F\r
+:103E600030E020FD3BC04A2F50E0049FF001059F49\r
+:103E7000F00D1124ED5DFD4F2181C2132FC0208173\r
+:103E8000B2132CC02281211129C02381348128172B\r
+:103E9000390718F0281B390B02C0260F371F283CA2\r
+:103EA0003105E0F4809122028F70806180932202BC\r
+:103EB00086E0849FF001859FF00D1124E85DFD4FA1\r
+:103EC00080818F70806180838DE192E00E94C41AAE\r
+:103ED000DF91CF911F910F910C94D01EAF5FA7700F\r
+:103EE000AD13B4CFDF91CF911F910F910895EF9251\r
+:103EF000FF920F931F93CF93DF93CDB7DEB76297F7\r
+:103F00000FB6F894DEBF0FBECDBF8C0185E0F8017F\r
+:103F1000DE011D9601900D928A95E1F7D8014C9132\r
+:103F200011965C91119712966C9112971396ED90E1\r
+:103F3000FC90149770911D02E0911E028091200266\r
+:103F400090912102009739F0EF3F41F421E030E0F9\r
+:103F50007F3F31F003C021E030E002C020E030E0DC\r
+:103F600020FD5CC120911F02222309F4F1C0E81654\r
+:103F7000F90628F09701281B390BC90104C0809568\r
+:103F800090958E0D9F1D883C910508F098C08091FA\r
+:103F90002202982F907F09F064C0E51314C07413B7\r
+:103FA00012C0611110C08F708061809322020E9444\r
+:103FB000F11E8DE192E00E94C41A80912202D80184\r
+:103FC00015968C9343C1EF2839F05F3F41F481E0AF\r
+:103FD00090E04F3F31F003C081E090E002C080E00C\r
+:103FE00090E080FD03C081E0862702C080E090E081\r
+:103FF00080FF2EC0809153022091540236E013C0FE\r
+:1040000090E0389FF001399FF00D1124ED5DFD4FD8\r
+:104010007181571306C07081471303C07281671303\r
+:1040200017C0019687708213EBCF12C19F7059F0B1\r
+:10403000882309F40BC107C09F7029F0F80195810E\r
+:10404000907F09F403C1805E883008F4FFC0D2C0BD\r
+:10405000662309F4FBC080912202816080932202D2\r
+:10406000F5C0E51308C0741306C0611104C0D8017F\r
+:1040700015968C939DC04D875E878D859E856A8B36\r
+:104080000E94901E6A89882309F4B4C0662309F44B\r
+:10409000B1C020912202822F82958F7090E002970A\r
+:1040A0000CF4C6C080911D0290911E0298878F83E8\r
+:1040B0001986FB86EA862C87CE01079646C080913A\r
+:1040C0002202982F907F59F47E2DF98AE88A8989F7\r
+:1040D0000E94B11E8DE192E00E94C41A95C0E513C2\r
+:1040E00011C074130FC061110DC0F8018583C801A0\r
+:1040F0000E94C41AEDE1F2E086E0DF011D928A958C\r
+:10410000E9F7A2C04D875E878D859E856A8B0E94E8\r
+:10411000901E6A89882309F46DC0662309F46AC079\r
+:1041200020912202822F82958F7090E002970CF4EA\r
+:104130007FC080911D0290911E029A8389831B8209\r
+:10414000FD82EC822E83CE0101960E94C41A70C0BB\r
+:10415000E816F90628F09701281B390BC90104C09D\r
+:10416000809590958E0D9F1D883C910508F046C066\r
+:10417000662309F43FC0E51330C074132EC02091AC\r
+:10418000220220FD21C0322F32953F70832F90E014\r
+:104190000097D1F0D80115962C9315970F9741F001\r
+:1041A000832F8F5F8295807F2F70282B15962C93FD\r
+:1041B000C8010E94C41A86E0F801ADE1B2E00190A6\r
+:1041C0000D928A95E1F73EC086E0F801ADE1B2E0DC\r
+:1041D00001900D928A95E1F737C04D875E878D85F6\r
+:1041E0009E850E94901E811123C0809122028160D1\r
+:1041F00080932202C8010E94C41A26C07E2DF98A2B\r
+:10420000E88A89890E94B11EEDE1F2E086E0DF01D3\r
+:104210001D928A95E9F70E94F11E18C0662351F39A\r
+:104220004D875E878D859E850E94901E882311F3A1\r
+:1042300086E0F801ADE1B2E001900D928A95E1F7D8\r
+:104240000E94FF1E0E94F11E81E014C080E012C097\r
+:104250004D875E878D859E850E946923292F229533\r
+:104260002F7030E0223031050CF4E0CE24303105DF\r
+:104270000CF6E2CE62960FB6F894DEBF0FBECDBF4D\r
+:10428000DF91CF911F910F91FF90EF9008951F93B1\r
+:10429000CF93DF93CDB7DEB72C970FB6F894DEBF80\r
+:1042A0000FBECDBF4F83588769877A878B879C87DE\r
+:1042B000CE0107960E94771F8823D9F02F81388579\r
+:1042C0008A859B85892B39F03F3F19F080E090E08B\r
+:1042D00004C02F3FD9F781E090E0892B09F06DC031\r
+:1042E0004F81588569857A858B859C850E94C01E83\r
+:1042F00064C086E0FE013796DE01119601900D92B2\r
+:104300008A95E1F7FF81E8854A855B85411551056E\r
+:1043100039F0EF3F41F481E090E0FF3F31F003C01E\r
+:1043200081E090E002C080E090E080FD46C02091F6\r
+:10433000540230E0C90101968770992760915302B9\r
+:1043400070E08617970709F440C0F983EA835D831C\r
+:104350004C8396E0929FD001939FB00D1124AD5DE8\r
+:10436000BD4FFE01319601900D929A95E1F7809331\r
+:1043700054020E94D01E21C0189FC00111248D5DDF\r
+:104380009D4F0E94771F882371F1E09153021E9F79\r
+:10439000F0011124ED5DFD4F4081518162817381F7\r
+:1043A000848195810E94C01E8091530290E0019605\r
+:1043B000877099278093530201C016E080915302C1\r
+:1043C000909154028913D8CF0EC00E948C1E109277\r
+:1043D000540210925302EDE1F2E086E0DF011D92FB\r
+:1043E0008A95E9F7EACF2C960FB6F894DEBF0FBE98\r
+:1043F000CDBFDF91CF911F910895DF92EF92FF9291\r
+:104400000F931F93CF93DF93EC01009709F46CC0D7\r
+:10441000D12CEE24E394F12C8E010F5F1F4FFE018F\r
+:104420008491843748F4843008F04AC0813071F0B8\r
+:10443000823009F059C01EC0853709F43DC070F1C3\r
+:10444000982F9458903708F04FC03DC02296F8013D\r
+:104450008491982F905E983050F48770FE2D01C0A3\r
+:10446000FF0F8A95EAF78F2F0E94FF2330C00E942A\r
+:104470009D192DC02296F8018491982F905E983056\r
+:1044800050F48770FE2D01C0FF0F8A95EAF78F2F39\r
+:104490000E9405241CC00E94651A19C02296F801CA\r
+:1044A000049107C08FE99FE00197F1F700C0000079\r
+:1044B00001500111F7CF0BC02296F801D49007C02C\r
+:1044C0000E949D1903C08F770E94651AE8018D2D07\r
+:1044D00007C08150EFE9FFE03197F1F700C000001D\r
+:1044E000882309F499CFF5CFDF91CF911F910F91D8\r
+:1044F000FF90EF90DF9008956093590270935A02F5\r
+:1045000080935B0290935C020C947A1E6093550238\r
+:104510007093560280935702909358020C947A1E1F\r
+:1045200008950C947C220F931F93009159021091CF\r
+:104530005A0220915B0230915C02602B712B822B1E\r
+:10454000932B1F910F910C947C220F931F9300913A\r
+:10455000590210915A0220915B0230915C02602353\r
+:104560007123822393231F910F910C947C220F932C\r
+:104570001F930091590210915A0220915B023091D1\r
+:104580005C0260277127822793271F910F910C945B\r
+:104590007C2260E070E0CB010C94862241E050E088\r
+:1045A00060E070E004C0440F551F661F771F8A95B6\r
+:1045B000D2F7CB01BA010C94862241E050E060E0D2\r
+:1045C00070E004C0440F551F661F771F8A95D2F70D\r
+:1045D0008091550290915602A0915702B0915802D5\r
+:1045E000482B592B6A2B7B2BCB01BA010C948622CA\r
+:1045F00041E050E060E070E004C0440F551F661FCA\r
+:10460000771F8A95D2F74095509560957095809167\r
+:10461000550290915602A0915702B091580248233A\r
+:1046200059236A237B23CB01BA010C94862241E0F3\r
+:1046300050E060E070E004C0440F551F661F771F14\r
+:104640008A95D2F78091550290915602A091570217\r
+:10465000B0915802482759276A277B27CB01BA0116\r
+:104660000C9486220F931F930091550210915602CD\r
+:104670002091570230915802602B712B822B932B83\r
+:104680001F910F910C9486220F931F930091550256\r
+:1046900010915602209157023091580260237123E5\r
+:1046A000822393231F910F910C9486220F931F93C3\r
+:1046B00000915502109156022091570230915802F4\r
+:1046C00060277127822793271F910F910C948622D0\r
+:1046D0000895CF92DF92EF92FF920F931F93CF93A3\r
+:1046E000DF93EC01C0905902D0905A02E0905B0237\r
+:1046F000F0905C028091550290915602A091570271\r
+:10470000B0915802C82AD92AEA2AFB2A0FE110E000\r
+:10471000B701A601002E04C0769567955795479579\r
+:104720000A94D2F740FF08C0BE01802F0E94E00328\r
+:104730008130910509F007C00150110948F7BE0109\r
+:1047400080E00E94E003DF91CF911F910F91FF90D5\r
+:10475000EF90DF90CF90089540911B0150911C0184\r
+:1047600020E030E09FEFFA01E20FF31F628168174B\r
+:10477000A1F09F3F19F4611101C0922F2F5F3F4FAD\r
+:104780002630310581F707C0FA01E90FF11D97FDC9\r
+:10479000FA95828308959F3FB9F7089540911B01D0\r
+:1047A00050911C0120E030E0FA01E20FF31F9281EA\r
+:1047B000981301C012822F5F3F4F26303105A1F7B9\r
+:1047C000089581E090E0E0911B01F0911C01E80F59\r
+:1047D000F91F1082019688309105A9F708959091EC\r
+:1047E0005D02982B90935D020895809590915D02F3\r
+:1047F000982390935D02089510925D020895909120\r
+:104800005E02982B90935E020895809590915E02CF\r
+:10481000982390935E02089510925E02089580930B\r
+:104820005F02089510925F02089540911B0150911C\r
+:104830001C0120E030E080E0FA01E20FF31F9181DB\r
+:1048400091118F5F2F5F3F4F27303105A9F70895F2\r
+:10485000E0911B01F0911C0180915D028083E09149\r
+:104860001B01F0911C01808190915E02892B808355\r
+:1048700090915F02992361F0E0911B01F0911C017E\r
+:104880008081892B80830E94152481110E9412242B\r
+:1048900080911B0190911C010C946A1880916E0309\r
+:1048A000843009F11092690220E488E190E00FB6AB\r
+:1048B000F894A895809360000FBE2093600083B7A2\r
+:1048C000817F846083BF83B7816083BF789488953C\r
+:1048D00083B78E7F83BF88E10FB6F8948093600022\r
+:1048E000109260000FBE0895CF930E94E3020E94D1\r
+:1048F0007E060E94E402C0E08C2F0E94C407892B30\r
+:1049000029F4CF5FC430C1F780E001C081E0CF91CE\r
+:1049100008950E948C1E0C945F2B1F920F920FB66D\r
+:104920000F9211248F939F93AF93BF93809169024D\r
+:10493000811113C080916A0290916B02A0916C0268\r
+:10494000B0916D024196A11DB11D80936A029093B2\r
+:104950006B02A0936C02B0936D02BF91AF919F91D7\r
+:104960008F910F900FBE0F901F90189582E084BD1D\r
+:1049700093E095BD9AEF97BD80936E0008958FB731\r
+:10498000F89440916A0250916B0260916C027091B0\r
+:104990006D028FBFCA010895CF92DF92EF92FF920E\r
+:1049A0000F931F932FB7F89440916A0250916B02B6\r
+:1049B00060916C0270916D022FBF6A017B01EE2441\r
+:1049C000FF248C0120E030E0C016D106E206F30699\r
+:1049D00020F09A01281B390B05C09C0120953095C9\r
+:1049E000240F351FC9011F910F91FF90EF90DF90A9\r
+:1049F000CF9008951F920F920FB60F9211248F93AC\r
+:104A00009F93AF93BF9380916A0290916B02A091A4\r
+:104A10006C02B0916D020196A11DB11D80936A02D6\r
+:104A200090936B02A0936C02B0936D02BF91AF9113\r
+:104A30009F918F910F900FBE0F901F9018950E941D\r
+:104A4000A111F8942FEF87EA91E621508040904021\r
+:104A5000E1F700C0000087E090EBDC018093780371\r
+:104A600090937903A0937A03B0937B032CE088E1C1\r
+:104A700090E00FB6F894A895809360000FBE209345\r
+:104A80006000FFCFCF92DF92EF92FF920F931F93C0\r
+:104A9000CF93DF93C82ED12C01E010E08D2D0E9422\r
+:104AA000C4077C01C0E0D0E098010C2E02C0220FA8\r
+:104AB000331F0A94E2F72E213F21232B29F421965C\r
+:104AC000CC30D10589F708C06C2F7D2D80E00E9485\r
+:104AD000BB03C812F4CF06C0D39484E0D812DECF53\r
+:104AE00080E001C081E0DF91CF911F910F91FF9095\r
+:104AF000EF90DF90CF900895CF93C82F8CE20E9463\r
+:104B00004225882321F08C2FCF910C94422580E000\r
+:104B1000CF910895CF930E94CD26811102C00E94AB\r
+:104B2000AE26C5E608C00E947E068FE39CE9019789\r
+:104B3000F1F700C00000C150B1F789E20E947C2566\r
+:104B400081110AC18AE20E947C2581110E94AE2651\r
+:104B500085E00E947C2581110E941F250E94D82695\r
+:104B60008093680287E00E947C25882399F18BE17D\r
+:104B70000E947C25882351F09091680291FB882740\r
+:104B800080F921E0822780FB91F922C08EE00E940B\r
+:104B90007C25882351F09091680292FB882780F948\r
+:104BA00021E0822780FB92F913C080E10E947C25DE\r
+:104BB00090916802882341F093FB882780F921E0D7\r
+:104BC000822780FB93F904C0892F809580FB90F9A0\r
+:104BD00090936802809168020E94DC260E94EA2677\r
+:104BE00080937B0280EE0E947C25882341F0809197\r
+:104BF0007B02982F909590FB80F980937B0289E34C\r
+:104C00000E947C25882359F090917B0291FB882794\r
+:104C100080F921E0822780FB91F990937B0282EE5C\r
+:104C20000E947C25882359F090917B0292FB882773\r
+:104C300080F921E0822780FB92F990937B0286EE37\r
+:104C40000E947C25882359F090917B0293FB882752\r
+:104C500080F921E0822780FB93F990937B0283EE19\r
+:104C60000E947C25882359F090917B0294FB882731\r
+:104C700080F921E0822780FB94F990937B0285E301\r
+:104C80000E947C25882359F090917B0295FB882710\r
+:104C900080F921E0822780FB95F990937B0281E3E4\r
+:104CA0000E947C25882359F090917B0296FB8827EF\r
+:104CB00080F921E0822780FB96F990937B0281E1C5\r
+:104CC0000E947C25882359F090917B0297FB8827CE\r
+:104CD00080F921E0822780FB97F990937B028091F5\r
+:104CE0007B020E94EE2687E20E947C25C82F8EE17F\r
+:104CF0000E947C258111C2608FE10E947C25811178\r
+:104D0000C46080E20E947C258111C86081E20E941B\r
+:104D10007C258111C06182E20E947C258111C062E4\r
+:104D200083E20E947C258111C06484E20E947C257C\r
+:104D3000882311F0C06802C0CC2329F08C2F0E9478\r
+:104D4000E5266C2F03C00E94E126682F70E080E00A\r
+:104D500090E0CF910C949122CF9108956DEE7EEF6B\r
+:104D600080E090E00E94BA2F60E082E090E00E9434\r
+:104D7000AC2F60E083E090E00E94AC2F60E084E024\r
+:104D800090E00E94AC2F60E085E090E00E94AC2FA4\r
+:104D900060E086E090E00C94AC2F80E090E00E9410\r
+:104DA000A62F21E08D3E9E4F09F020E0822F08952E\r
+:104DB00082E090E00C949E2F682F82E090E00C94AB\r
+:104DC000AC2F83E090E00C949E2F682F83E090E05E\r
+:104DD0000C94AC2F84E090E00C949E2F682F84E01C\r
+:104DE00090E00C94AC2F86E090E00C949E2F682FFE\r
+:104DF00086E090E00C94AC2F8091760280FF0BC08F\r
+:104E00006091200185E0689FB00111247595679538\r
+:104E1000759567952AC081FF09C06091200185E0E2\r
+:104E2000689FB0011124759567951FC082FF07C068\r
+:104E30006091200185E0689FB001112416C0409167\r
+:104E400070024423C9F060911F01461788F7209132\r
+:104E5000200185E0289F90011124429FC001439FBB\r
+:104E6000900D112470E00E948A2F6038710540F483\r
+:104E70006115710539F002C065E070E0862F089574\r
+:104E80008FE7089581E008958091760280FF08C041\r
+:104E900060911E0170E0759567957595679521C0C5\r
+:104EA00081FF06C060911E0170E07595679519C07D\r
+:104EB00082FF04C060911E0170E010C080917002FA\r
+:104EC0008823C1F060911D018617A0F790911E0103\r
+:104ED000989FC001112470E00E948A2F60387105EC\r
+:104EE00028F46115710521F0862F08958FE7089544\r
+:104EF00081E0089561E070E0F4CF803F21F40E94EA\r
+:104F0000FC26819504C0813F29F40E94FC268093F1\r
+:104F100073020895823F21F40E94FC26819504C00B\r
+:104F2000833F29F40E94FC26809372020895893FF2\r
+:104F300019F40E94442705C08A3F31F40E94442797\r
+:104F400081958093740208958B3F21F40E94442739\r
+:104F5000819504C08C3F29F40E94442780937502F8\r
+:104F60000895843F21F480917102816017C0853FCC\r
+:104F700021F480917102826011C0863F21F48091FA\r
+:104F8000710284600BC0873F21F4809171028860B8\r
+:104F900005C0883F31F48091710280618093710275\r
+:104FA00008958D3F21F48091760281600BC08E3F81\r
+:104FB00021F480917602826005C08F3F29F48091B0\r
+:104FC00076028460809376020895803F29F4809170\r
+:104FD000730287FF6EC007C0813F41F48091730266\r
+:104FE00018160CF066C01092730263C090917202A2\r
+:104FF000823F19F497FF5DC005C0833F31F4191655\r
+:105000000CF057C01092720254C0893F31F4809165\r
+:10501000740218160CF04DC006C08A3F39F4809116\r
+:10502000740287FF46C01092740243C08B3F29F47C\r
+:105030008091750287FF3DC006C08C3F39F4809196\r
+:1050400075021816B4F51092750233C0843F21F42E\r
+:10505000809171028E7F05C0853F31F4809171028D\r
+:105060008D7F8093710225C0863F21F4809171026B\r
+:105070008B7FF7CF873F21F480917102877FF1CF3B\r
+:10508000883F21F4809171028F7EEBCF8D3F21F418\r
+:10509000809176028E7F0BC08E3F21F48091760244\r
+:1050A0008D7F05C08F3F29F4809176028B7F80939E\r
+:1050B00076028091720281110EC08091730281117B\r
+:1050C0000AC080917402811106C08091750281111D\r
+:1050D00002C010927002089581E792E00E94751854\r
+:1050E0000E94BF2490936F0280936E020895CF9325\r
+:1050F00080916E0290916F020E94CC2440917002C8\r
+:10510000442321F02091210130E006C020912201AA\r
+:105110005AE0259F900111248217930708F486C056\r
+:105120008091720281110DC090917302911109C09A\r
+:1051300090917402911105C090917502992309F420\r
+:1051400075C04F3F19F04F5F40937002181624F45A\r
+:105150000E94FC26809372028091720287FF05C034\r
+:105160000E94FC268195809372028091730218162A\r
+:1051700024F40E94FC26809373028091730287FFBF\r
+:1051800005C00E94FC268195809373026091720293\r
+:10519000662339F1C0917302CC2319F1772767FD9B\r
+:1051A0007095872F972F0E94FA2C23E333E343E374\r
+:1051B0005FE30E94AE2D0E94C72C609372026C2F99\r
+:1051C000772767FD7095872F972F0E94FA2C23E38E\r
+:1051D00033E343E35FE30E94AE2D0E94C72C60934C\r
+:1051E000730280917402181624F40E94442780935D\r
+:1051F00074028091740287FF05C00E944427819544\r
+:105200008093740280917502181624F40E9444273A\r
+:10521000809375028091750287FF05C00E94442724\r
+:10522000819580937502CF910C946C28CF9108954D\r
+:10523000E1E7F2E085E0DF011D928A95E9F710923F\r
+:105240007002109276020895833089F130F4813033\r
+:1052500061F0823009F06EC019C0853009F449C090\r
+:10526000B8F1863009F066C055C020912201862F22\r
+:1052700090E0820F911D8F3F910520F4620F6093A3\r
+:10528000220108958FEF809322010895209121013A\r
+:10529000862F90E0820F911D8F3F910520F4620FC1\r
+:1052A0006093210108958FEF80932101089520914B\r
+:1052B0002001862F90E0820F911D8F3F910520F4F1\r
+:1052C000620F6093200108958FEF8093200108956D\r
+:1052D00020911F01862F90E0820F911D8F3F910535\r
+:1052E00020F4620F60931F0108958FEF80931F01D8\r
+:1052F000089520911E01862F90E0820F911D8F3F0F\r
+:10530000910520F4620F60931E0108958FEF809342\r
+:105310001E01089520911D01862F90E0820F911D9E\r
+:105320008F3F910520F4620F60931D0108958FEF68\r
+:1053300080931D010895833021F130F4813059F0BC\r
+:10534000823009F049C012C0853089F128F18630D9\r
+:1053500009F042C037C080912201681720F4861BF3\r
+:1053600080932201089510922201089580912101D5\r
+:10537000681720F4861B8093210108951092210163\r
+:10538000089580912001681720F4861B80932001E6\r
+:10539000089510922001089580911F01681720F44C\r
+:1053A000861B80931F01089510921F01089580911C\r
+:1053B0001E01681720F4861B80931E010895109229\r
+:1053C0001E01089580911D01681720F4861B8093AB\r
+:1053D0001D01089510921D01089541E050E060E024\r
+:1053E00070E004C0440F551F661F771F8A95D2F7DF\r
+:1053F000CB01BA010E9491220C948C1E873208F5D1\r
+:105400008E3108F0B9C08E3009F47EC060F4873068\r
+:1054100009F465C018F4863059F549C0883051F157\r
+:105420008B3031F5AEC0883130F4863108F0A9C038\r
+:105430008031F1F473C0893109F4A3C08B31C1F418\r
+:1054400059C08933F1F068F4893209F493C018F433\r
+:10545000873271F48FC0853309F48CC0883341F4EE\r
+:1054600090C0863409F46BC008F488C0883449F1D0\r
+:1054700080E008950E94D8260E94EA260E94F32622\r
+:1054800080C00E945918892B59F00E945918909396\r
+:105490007902809378020E948C1E80E090E004C024\r
+:1054A00080917802909179020E9454186AC080918C\r
+:1054B0006802817F8E7F8093680281E0809377020B\r
+:1054C00008950E948C1E2FEF83ED90E321508040C1\r
+:1054D0009040E1F700C000000E941F2552C080915B\r
+:1054E000680280FF03C0817F8E7F01C0816080934E\r
+:1054F000680247C09091680291FB882780F921E0FB\r
+:10550000822780FB91F913C09091680292FB882753\r
+:1055100080F921E0822780FB92F909C0909168020E\r
+:1055200093FB882780F921E0822780FB93F99093F1\r
+:105530006802882331F191609093680222C081E86B\r
+:1055400090E00E9480182FEF81EE94E0215080407F\r
+:105550009040E1F700C0000080E090E00E948018D9\r
+:105560002FEF89E698E1215080409040E1F700C09C\r
+:10557000000007C080E003C08D5101C089530E9424\r
+:10558000ED2981E0089580E0089580E00895CF93AB\r
+:10559000C82F80917702813071F020F0823009F0BD\r
+:1055A00083C037C0A0911B01B0911C018C91823245\r
+:1055B00009F07CC007C0A0911B01B0911C018C9127\r
+:1055C000823249F48C2F0E94C32A81111EC08C2F75\r
+:1055D0000E94FE291CC08C2F0E94C52A811115C073\r
+:1055E000C43169F030F4CB3081F0C03109F062C0D1\r
+:1055F00009C0C93221F0C83309F05CC006C010925E\r
+:10560000770258C082E08093770281E090E0817059\r
+:1056100054C0C932C1F060F4C431A9F020F4C730DD\r
+:1056200009F046C02EC0CE51CA3008F041C011C0AA\r
+:10563000CE3409F118F4CB34D9F517C0C13599F03F\r
+:10564000C235B1F50EC010927A0281E080937702E4\r
+:1056500034C0EC2FF0E0E455FE4F808180937A0255\r
+:1056600027C061E003C061E007C06AE080917A0270\r
+:105670000E9424291DC06AE080917A020E949B2921\r
+:1056800017C08EE18093220182E3809321018AE09A\r
+:105690008093200184E180931F0188E080931E01A4\r
+:1056A00088E280931D0104C01092770280E005C05B\r
+:1056B00081E003C080E090E0AACFCF9108950E94DE\r
+:1056C000CD26811102C00E94AE260E94F32680934F\r
+:1056D000770380FF02C0869501C080E00C94DF074D\r
+:1056E00080917703982F9695292F30E0233031054C\r
+:1056F0004CF49F5F990F8170892B816080937703B1\r
+:105700000E94F7268091770386950C94DF0780919D\r
+:105710007703982F969591F09158990F8170892B66\r
+:10572000809377038E7F91E009F490E08091770376\r
+:1057300090FB80F9809377030E94F726809177038E\r
+:1057400086950C94DF0780917703982F909590FBB6\r
+:1057500080F9809377030E94F7268091770380FF7A\r
+:1057600002C0869501C080E00C94DF07309177037A\r
+:10577000232F26952F5F2F77822F90E0317004978B\r
+:105780002CF4220F232B2093770302C0309377034E\r
+:1057900080917703282F2E7F91E009F490E090FB11\r
+:1057A00080F9809377030E94F7268091770386958E\r
+:1057B0000C94DF0720917703922F96959827990FE5\r
+:1057C000822F8170892B809377038E7F91E009F47B\r
+:1057D00090E08091770390FB80F9809377030E949B\r
+:1057E000F7268091770386950C94DF075058BB27E6\r
+:1057F000AA270ED075C166D130F06BD120F031F4FC\r
+:105800009F3F11F41EF45BC10EF4E095E7FB51C11C\r
+:10581000E92F77D180F3BA176207730784079507DA\r
+:1058200018F071F49EF58FC10EF4E0950B2EBA2F8F\r
+:10583000A02D0B01B90190010C01CA01A001112496\r
+:10584000FF27591B99F0593F50F4503E68F11A1642\r
+:10585000F040A22F232F342F4427585FF3CF4695D3\r
+:1058600037952795A795F0405395C9F77EF41F16F5\r
+:10587000BA0B620B730B840BBAF09150A1F0FF0FBF\r
+:10588000BB1F661F771F881FC2F70EC0BA0F621FAB\r
+:10589000731F841F48F4879577956795B795F7959B\r
+:1058A0009E3F08F0B3CF9395880F08F09927EE0F2D\r
+:1058B000979587950895D9D008F481E008950CD084\r
+:1058C0000FC107D140F0FED030F021F45F3F19F056\r
+:1058D000F0C0511139C1F3C014D198F39923C9F321\r
+:1058E0005523B1F3951B550BBB27AA2762177307E6\r
+:1058F000840738F09F5F5F4F220F331F441FAA1F9A\r
+:10590000A9F333D00E2E3AF0E0E830D09150504059\r
+:10591000E695001CCAF729D0FE2F27D0660F771F07\r
+:10592000881FBB1F261737074807AB07B0E809F0E9\r
+:10593000BB0B802DBF01FF2793585F4F2AF09E3F7E\r
+:10594000510568F0B6C000C15F3FECF3983EDCF350\r
+:10595000869577956795B795F7959F5FC9F7880FF7\r
+:10596000911D9695879597F90895E1E0660F771F49\r
+:10597000881FBB1F621773078407BA0720F0621BDA\r
+:10598000730B840BBA0BEE1F88F7E095089504D0D3\r
+:105990006894B111D9C00895BCD088F09F5790F099\r
+:1059A000B92F9927B751A0F0D1F0660F771F881F44\r
+:1059B000991F1AF0BA95C9F712C0B13081F0C3D05F\r
+:1059C000B1E00895C0C0672F782F8827B85F39F0FD\r
+:1059D000B93FCCF3869577956795B395D9F73EF4A3\r
+:1059E00090958095709561957F4F8F4F9F4F08954B\r
+:1059F000E89409C097FB3EF4909580957095619569\r
+:105A00007F4F8F4F9F4F9923A9F0F92F96E9BB271E\r
+:105A10009395F695879577956795B795F111F8CF9A\r
+:105A2000FAF4BB0F11F460FF1BC06F5F7F4F8F4F05\r
+:105A30009F4F16C0882311F096E911C0772321F0FB\r
+:105A40009EE8872F762F05C0662371F096E8862F93\r
+:105A500070E060E02AF09A95660F771F881FDAF7EA\r
+:105A6000880F9695879597F90895990F0008550F17\r
+:105A7000AA0BE0E8FEEF16161706E807F907C0F0D4\r
+:105A800012161306E407F50798F0621B730B840BDC\r
+:105A9000950B39F40A2661F0232B242B252B21F4B6\r
+:105AA00008950A2609F4A140A6958FEF811D811D56\r
+:105AB000089597F99F6780E870E060E008959FEF90\r
+:105AC00080EC089500240A94161617061806090695\r
+:105AD000089500240A941216130614060506089564\r
+:105AE000092E0394000C11F4882352F0BB0F40F4EC\r
+:105AF000BF2B11F460FF04C06F5F7F4F8F4F9F4F2C\r
+:105B0000089557FD9058440F551F59F05F3F71F0AD\r
+:105B10004795880F97FB991F61F09F3F79F0879514\r
+:105B20000895121613061406551FF2CF4695F1DF9D\r
+:105B300008C0161617061806991FF1CF869571052D\r
+:105B4000610508940895E894BB2766277727CB0161\r
+:105B500097F908958ADF08F48FEF08950BD0C0CF2E\r
+:105B6000B1DF28F0B6DF18F0952309F0A2CFA7CF58\r
+:105B70001124EACFC6DFA0F3959FD1F3950F50E033\r
+:105B8000551F629FF001729FBB27F00DB11D639FEF\r
+:105B9000AA27F00DB11DAA1F649F6627B00DA11D95\r
+:105BA000661F829F2227B00DA11D621F739FB00D3B\r
+:105BB000A11D621F839FA00D611D221F749F3327AB\r
+:105BC000A00D611D231F849F600D211D822F762F44\r
+:105BD0006A2F11249F5750408AF0E1F088234AF041\r
+:105BE000EE0FFF1FBB1F661F771F881F915050408D\r
+:105BF000A9F79E3F510570F05CCFA6CF5F3FECF355\r
+:105C0000983EDCF3869577956795B795F795E79578\r
+:105C10009F5FC1F7FE2B880F911D9695879597F989\r
+:105C20000895FA01EE0FFF1F30962105310599F115\r
+:105C30006115710561F48038BFE39B0749F16894F1\r
+:105C40009038810561F08038BFEF9B0741F09923C0\r
+:105C500042F5FF3FE1053105210511F1E894089473\r
+:105C6000E795D901AA2329F4AB2FBE2FF85FD0F313\r
+:105C700010C0FF5F70F4A695E0F7F73950F019F007\r
+:105C8000FF3A38F49F779F930CD00F9007FC905801\r
+:105C900008953EF014CF60E070E080E89FE308953F\r
+:105CA0004FE79F775F934F933F932F939ED02F9112\r
+:105CB0003F914F915F9152DF05C019F40EF0F9CE7C\r
+:105CC00042CFFDCE26DFC8F39638C0F707F80F9213\r
+:105CD000E8942BE33AEA48EB5FE74EDF0F920F922E\r
+:105CE0000F924DB75EB70F92C0D0ECEAF0E016D03D\r
+:105CF0004F915F91EF91FF91E595EE1FFF1F49F0E6\r
+:105D0000FE57E0684427EE0F441FFA95E1F74195EE\r
+:105D1000550B32D00F9007FE26C00895DF93CF9326\r
+:105D20001F930F93FF92EF92DF927B018C01689497\r
+:105D300005C0DA2EEF011EDFFE01E894A591259142\r
+:105D4000359145915591AEF3EF0162DDFE0197016A\r
+:105D5000A801DA9479F7DF90EF90FF900F911F91EF\r
+:105D6000CF91DF9108959B01AC0160E070E080E885\r
+:105D70009FE3A5CD9ECEACC0CCDEE8F39923D9F34A\r
+:105D8000940F511DBBF39150504094F059F088236B\r
+:105D900032F0660F771F881F91505040C1F79E3F29\r
+:105DA000510544F7880F911D9695879597F90895A9\r
+:105DB0005F3FACF0983E9CF0BB2786957795679542\r
+:105DC000B79508F4B1609395C1F7BB0F58F711F47C\r
+:105DD00060FFE8CF6F5F7F4F8F4F9F4FE3CFB4CE11\r
+:105DE0000EF076C06CCE689464CE93DEC8F399232F\r
+:105DF000D1F3C6F3DF93CF931F930F93FF92C92F75\r
+:105E0000DD2788232AF02197660F771F881FDAF78E\r
+:105E100020E030E040E85FEB9FE3883920F0803EEF\r
+:105E200030F021968F77E3DCE4EDF0E003C0DFDCB7\r
+:105E3000E1E0F1E073DF8B01BE01EC01FB2E6F5757\r
+:105E400071097595771F880B990BD4DD28E132E72E\r
+:105E500041E35FE38FDEAF2D9801AE01FF900F911C\r
+:105E60001F91CF91DF91D4DC3BCEFA01DC01AA0F68\r
+:105E7000BB1F9B01AC01BF5728F4222733274427BF\r
+:105E800050781FC0B75188F4AB2F00244695379542\r
+:105E90002795011CA395D2F3002069F0220F331F30\r
+:105EA000441FB395DAF30DD0A1CC61307105A0E8A1\r
+:105EB0008A07B94630F49B01AC016627772788270B\r
+:105EC0009078309621F02083318342835383089564\r
+:105ED0009F3F31F0915020F4879577956795B7955E\r
+:105EE000880F911D9695879597F90895AA1BBB1B5E\r
+:105EF00051E107C0AA1FBB1FA617B70710F0A61BCA\r
+:105F0000B70B881F991F5A95A9F780959095BC01EA\r
+:105F1000CD01089597FB072E16F4009407D077FD66\r
+:105F200009D00E94762F07FC05D03EF4909581950C\r
+:105F30009F4F0895709561957F4F0895F999FECF11\r
+:105F400092BD81BDF89A992780B50895A8E1B0E087\r
+:105F500042E050E00C94C12F262FF999FECF1FBAD2\r
+:105F600092BD81BD20BD0FB6F894FA9AF99A0FBE82\r
+:105F7000019608950E94AC2F272F0C94AD2FDC01C1\r
+:105F8000CB01FC01F999FECF06C0F2BDE1BDF89A44\r
+:105F9000319600B40D9241505040B8F70895F894EE\r
+:025FA000FFCF31\r
+:105FA2000507000C058540000001064000000100C5\r
+:105FB200D80B680C440C0F0CDB0B01600228081490\r
+:105FC2000A321E40004500250026006100600020C4\r
+:105FD2000037006400650066006700440046002444\r
+:105FE2000047000000020004000500070009000B42\r
+:105FF200000C000E0010001100130015001700180D\r
+:10600200001A001C001D001F00210023002400268E\r
+:1060120000280029002B002D002F00300032003410\r
+:10602200003500370039003B008803A103BA03D3CF\r
+:1060320003FB04AE04780458043F4D3620020302E9\r
+:10604200000001000101010101000101010203043C\r
+:0660520005060708090025\r
+:00000001FF\r
index 40bd36aecfcc4c7fa533fb777212ecb0d85a0d50..0145e44bc6b2697b5e1508e7fbb14014af1f1b92 100644 (file)
@@ -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"
index 13e46e1dafc1a7f682f3633a391121b657a38117..8ffd70f4172057057bfdc1348554fcaa9850c875 100644 (file)
@@ -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
index 3e3c634ff5123524553be7a072c028ba864ba7a6..378983c605be7c075661b874e03151c6293c59bf 100644 (file)
@@ -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
index 8edf8a283de89eaddbb7b83d0d34da69878daae7..ec7bc776ac9c6a978952236e6abc847a77f980c5 100644 (file)
@@ -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 */
index c7937bb9b5c70646d6c26d86d41e3f35213ae12c..a0fa59990c2c25fc4aa3c729f92c034428fa880b 100644 (file)
@@ -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
index 02bf35c243a06303984d48b896c8be738c3fecab..c5917f884e70c4afc5fbc5c91aaf9b3bbdbf4a4e 100644 (file)
@@ -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 )
index 7e6328f6cb9d4beb05fe25b51a68356ee4c48d26..473d73e01284c1aacf8d5099e8bc188560c35d98 100644 (file)
@@ -3,7 +3,7 @@ PJRC_DIR = protocol/pjrc
 
 SRC += $(BLUEFRUIT_DIR)/main.c \
        $(BLUEFRUIT_DIR)/bluefruit.c \
-       serial_uart.c \
+       ../serial_uart.c \
        $(PJRC_DIR)/pjrc.c \
        $(PJRC_DIR)/usb_keyboard.c \
        $(PJRC_DIR)/usb_debug.c \
index cf26b83dfff3693c8dd89514db8823cef21abb94..47c63555cd814ffea120e0f5dc74a98566e76eef 100644 (file)
@@ -2,20 +2,16 @@
 Bluefruit Protocol for TMK firmware
 Author: Benjamin Gould, 2013
 Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
-
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 2 of the License, or
 (at your option) any later version.
-
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
-
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
 */
 
 #include <stdint.h>
@@ -76,6 +72,13 @@ static void send_mouse(report_mouse_t *report);
 static void send_system(uint16_t data);
 static void send_consumer(uint16_t data);
 
+
+void sendString(char string[], int length) {
+    for(int i = 0; i < length; i++) {
+        serial_send(string[i]);
+    }
+}
+
 static host_driver_t driver = {
         keyboard_leds,
         send_keyboard,
@@ -100,6 +103,7 @@ static void send_keyboard(report_keyboard_t *report)
 #endif
     bluefruit_serial_send(0xFD);
     for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) {
+
         bluefruit_serial_send(report->raw[i]);
     }
 #ifdef BLUEFRUIT_TRACE_SERIAL   
@@ -198,5 +202,4 @@ static void send_consumer(uint16_t data)
 #ifdef BLUEFRUIT_TRACE_SERIAL
     bluefruit_trace_footer();
 #endif
-}
-
+}
\ No newline at end of file
index 4f9b58836d0210d9ec436f0649ba01da824859a7..ceacc4a36711279bbb705f945e423d0c41e64b8f 100644 (file)
@@ -2,17 +2,14 @@
 Bluefruit Protocol for TMK firmware
 Author: Benjamin Gould, 2013
 Based on code Copyright 2011 Jun Wako <wakojun@gmail.com>
-
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 2 of the License, or
 (at your option) any later version.
-
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
-
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
@@ -25,4 +22,4 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 host_driver_t *bluefruit_driver(void);
 
-#endif
+#endif
\ No newline at end of file
index 871062ab11727e852071a13b11c7ff549297e5c2..0dbb637e2cfd1d959e4f2a3a1ca3df44a267d45e 100644 (file)
@@ -22,7 +22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <avr/wdt.h>
 #include <avr/sleep.h>
 #include <util/delay.h>
-#include "serial.h"
+#include "../serial.h"
 #include "keyboard.h"
 #include "usb.h"
 #include "host.h"
@@ -40,23 +40,26 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define BLUEFRUIT_HOST_DRIVER   1
 #define PJRC_HOST_DRIVER        2
 
+
 int main(void)
 {   
 
     CPU_PRESCALE(0);
 
-    DDRD  = _BV(PD5);
-    DDRB  = _BV(PB0);
+    // DDRD  = _BV(PD5);
+    // DDRB  = _BV(PB0);
     
-    PORTD = _BV(PD5);
-    PORTB = _BV(PB0);
+    // PORTD = _BV(PD5);
+    // PORTB = _BV(PB0);
 
     print_set_sendchar(sendchar);
 
-    usb_init();
-    _delay_ms(2000);
+    // usb_init();
+    // _delay_ms(2000);
     // while (!usb_configured()) /* wait */
 
+
+
     dprintf("Initializing keyboard...\n");
     keyboard_init();
     
@@ -64,53 +67,72 @@ int main(void)
     // is not configured, choose the Bluefruit, otherwise use USB
     // Definitely would prefer to have this driven by an input pin and make
     // it switch dynamically - BCG
-    if (!usb_configured()) {
+    // if (!usb_configured()) {
     
-        // Send power to Bluefruit... Adafruit says it takes 27 mA, I think
-        // the pins should provide 40 mA, but just in case I switch the 
-        // Bluefruit using a transistor - BCG
-        DDRB   = _BV(PB6);
-        PORTB |= _BV(PB6);
+    //     // Send power to Bluefruit... Adafruit says it takes 27 mA, I think
+    //     // the pins should provide 40 mA, but just in case I switch the 
+    //     // Bluefruit using a transistor - BCG
+    //     DDRB   = _BV(PB6);
+    //     PORTB |= _BV(PB6);
     
         dprintf("Setting host driver to bluefruit...\n");
         host_set_driver(bluefruit_driver());
 
         dprintf("Initializing serial...\n");
         serial_init();
-        
-        // wait an extra second for the PC's operating system
-        // to load drivers and do whatever it does to actually
-        // be ready for input
-        _delay_ms(1000);
-        PORTD = ~_BV(PD5);
-        dprintf("Starting main loop");
-        while (1) {
-            keyboard_task();
-        }
 
-    } else {
+    // char swpa[] = "+++\r\n";
+    // for (int i = 0; i < 5; i++) {
+    //     serial_send(swpa[i]);
+    // }
+
+    // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n";
+    // for (int i = 0; i < 20; i++) {
+    //     serial_send(ble_enable[i]);
+    // }
+
+    // char reset[] = "ATZ\r\n";
+    // for (int i = 0; i < 5; i++) {
+    //     serial_send(reset[i]);
+    // }
+
+    // for (int i = 0; i < 5; i++) {
+    //     serial_send(swpa[i]);
+    // }
 
-        // I'm not smart enough to get this done with LUFA - BCG
-        dprintf("Setting host driver to PJRC...\n");
-        host_set_driver(pjrc_driver());
-#ifdef SLEEP_LED_ENABLE
-    sleep_led_init();
-#endif
         // wait an extra second for the PC's operating system
         // to load drivers and do whatever it does to actually
         // be ready for input
         _delay_ms(1000);
-        PORTB = ~_BV(PB0);
+        // PORTD = ~_BV(PD5);
         dprintf("Starting main loop");
         while (1) {
-            while (suspend) {
-                suspend_power_down();
-                if (remote_wakeup && suspend_wakeup_condition()) {
-                    usb_remote_wakeup();
-                }
-            }
-            keyboard_task(); 
+            keyboard_task();
         }
-    }
+
+//     } else {
+
+//         // I'm not smart enough to get this done with LUFA - BCG
+//         dprintf("Setting host driver to PJRC...\n");
+//         host_set_driver(pjrc_driver());
+// #ifdef SLEEP_LED_ENABLE
+//     sleep_led_init();
+// #endif
+//         // wait an extra second for the PC's operating system
+//         // to load drivers and do whatever it does to actually
+//         // be ready for input
+//         _delay_ms(1000);
+//         PORTB = ~_BV(PB0);
+//         dprintf("Starting main loop");
+//         while (1) {
+//             while (suspend) {
+//                 suspend_power_down();
+//                 if (remote_wakeup && suspend_wakeup_condition()) {
+//                     usb_remote_wakeup();
+//                 }
+//             }
+//             keyboard_task(); 
+//         }
+//     }
 
 }
index 5454926b18ee23b4d3a63543dfca47cb04d0f921..b345da27b4f3824d302111d06c5903801272e226 100644 (file)
@@ -266,7 +266,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 
             .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
 
-            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
+            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(500)
         },
 
     /*
index b31f3031ee2fa60313eab34e22270919379efa75..85c7bf712f9c14782e579a8ae3248847a70d3bf0 100644 (file)
@@ -840,13 +840,13 @@ int main(void)
 
 
     /* wait for USB startup & debug output */
-    // while (USB_DeviceState != DEVICE_STATE_Configured) {
+    while (USB_DeviceState != DEVICE_STATE_Configured) {
 // #if defined(INTERRUPT_CONTROL_ENDPOINT)
         // ;
 // #else
         USB_USBTask();
 // #endif
-    // }
+    }
     print("USB configured.\n");
 
     /* init modules */