Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

GPS module compatibility fork! (Code added by dthyne)

  • Loading branch information...
commit 210a48586aa485366a0f5c8fb58fe9943bcac160 1 parent 3b34e51
@ladyada ladyada authored
View
10 firmware/Makefile
@@ -102,8 +102,8 @@ LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
#AVRDUDE_PROGRAMMER = stk500v2
AVRDUDE_PROGRAMMER = usbtiny
-
-AVRDUDE_PORT = com1 # programmer connected to serial device
+AVRDUDE_PORT = /dev/ttyACM0
+#AVRDUDE_PORT = com1 # programmer connected to serial device
#AVRDUDE_PORT = /dev/cu.KeySerial1 # programmer connected to serial device
#AVRDUDE_PORT = /dev/cu.PL2303-0B2
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port
@@ -202,8 +202,8 @@ all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
full: $(TARGET).hex $(TARGET).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) -u -U lfuse:w:0xE2:m -u -U hfuse:w:0xc6:m
- $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -U flash:w:$<
- $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -U eeprom:w:iveep.hex
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -B 5 -U flash:w:$<
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -B 5 -U eeprom:w:iveep.hex
burn-fuse:
@@ -268,7 +268,7 @@ extcoff: $(TARGET).elf
# Program the device.
program: $(TARGET).hex $(TARGET).eep
- $(AVRDUDE) $(AVRDUDE_FLAGS) -B 1 -U flash:w:$<
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -B 5 -U flash:w:$<
# Create final output files (.hex, .eep) from ELF output file.
View
549 firmware/iv.c
@@ -1,6 +1,7 @@
/***************************************************************************
- Ice Tube Clock firmware August 13, 2009
- (c) 2009 Limor Fried / Adafruit Industries
+ Ice Tube Clock with GPS firmware July 22, 2010
+ (c) 2010 Limor Fried / Adafruit Industries
+ GPS Capability added by Devlin Thyne
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -21,7 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
-
#include <avr/io.h>
#include <string.h>
#include <avr/interrupt.h> // Interrupts and timers
@@ -29,6 +29,7 @@ THE SOFTWARE.
#include <avr/pgmspace.h> // So we can store the 'font table' in ROM
#include <avr/eeprom.h> // Date/time/pref backup in permanent EEPROM
#include <avr/wdt.h> // Watchdog timer to repair lockups
+#include <stdlib.h>
#include "iv.h"
#include "util.h"
@@ -37,9 +38,9 @@ THE SOFTWARE.
uint8_t region = REGION_US;
// These variables store the current time.
-volatile uint8_t time_s, time_m, time_h;
+volatile int8_t time_s, time_m, time_h;
// ... and current date
-volatile uint8_t date_m, date_d, date_y;
+volatile int8_t date_m, date_d, date_y;
// how loud is the speaker supposed to be?
volatile uint8_t volume;
@@ -56,6 +57,15 @@ volatile uint8_t sleepmode = 0;
volatile uint8_t timeunknown = 0; // MEME
volatile uint8_t restored = 0;
+// String buffer for processing GPS data:
+char strBuffer[BUFFERSIZE];
+uint8_t intBufferStatus = 0;
+
+// Variables for the timezone offset if using GPS.
+int8_t intTimeZoneHour = -6; //Because Colorado is my time zone...
+uint8_t intTimeZoneMin = 0;
+
+
// Our display buffer, which is updated to show the time/date/etc
// and is multiplexed onto the tube
uint8_t display[DISPLAYSIZE]; // stores segments, not values!
@@ -117,7 +127,9 @@ void setsnooze(void) {
// we reset the watchdog timer
void kickthedog(void) {
+
wdt_reset();
+
}
// called @ (F_CPU/256) = ~30khz (31.25 khz)
@@ -288,57 +300,8 @@ SIGNAL (TIMER2_OVF_vect) {
time_s++; // one second has gone by
- // a minute!
- if (time_s >= 60) {
- time_s = 0;
- time_m++;
- }
+ fix_time();
- // an hour...
- if (time_m >= 60) {
- time_m = 0;
- time_h++;
- // lets write the time to the EEPROM
- eeprom_write_byte((uint8_t *)EE_HOUR, time_h);
- eeprom_write_byte((uint8_t *)EE_MIN, time_m);
- }
-
- // a day....
- if (time_h >= 24) {
- time_h = 0;
- date_d++;
- eeprom_write_byte((uint8_t *)EE_DAY, date_d);
- }
-
- /*
- if (! sleepmode) {
- uart_putw_dec(time_h);
- uart_putchar(':');
- uart_putw_dec(time_m);
- uart_putchar(':');
- uart_putw_dec(time_s);
- putstring_nl("");
- }
- */
-
- // a full month!
- // we check the leapyear and date to verify when its time to roll over months
- if ((date_d > 31) ||
- ((date_d == 31) && ((date_m == 4)||(date_m == 6)||(date_m == 9)||(date_m == 11))) ||
- ((date_d == 30) && (date_m == 2)) ||
- ((date_d == 29) && (date_m == 2) && !leapyear(2000+date_y))) {
- date_d = 1;
- date_m++;
- eeprom_write_byte((uint8_t *)EE_MONTH, date_m);
- }
-
- // HAPPY NEW YEAR!
- if (date_m >= 13) {
- date_y++;
- date_m = 1;
- eeprom_write_byte((uint8_t *)EE_YEAR, date_y);
- }
-
// If we're in low power mode we should get out now since the display is off
if (sleepmode)
return;
@@ -356,11 +319,8 @@ SIGNAL (TIMER2_OVF_vect) {
display[0] &= ~0x2;
}
- if (alarm_on && (alarm_h == time_h) && (alarm_m == time_m) && (time_s == 0)) {
- DEBUGP("alarm on!");
- alarming = 1;
- snoozetimer = 0;
- }
+
+ check_alarm(time_h, time_m, time_s);
if (timeoutcounter)
timeoutcounter--;
@@ -419,6 +379,8 @@ SIGNAL(SIG_COMPARATOR) {
}
}
}
+
+
/*********************** Main app **********/
uint32_t t;
@@ -553,9 +515,14 @@ int main(void) {
restored = 0;
// setup uart
- uart_init(BRRL_192);
+ uart_init(BRRL_4800);
+
//DEBUGP("VFD Clock");
DEBUGP("!");
+ uart_puts("\n\rHello World!\n\r");
+ uart_puts("\n\rBuffer size is:\t");
+ uart_putw_dec(BUFFERSIZE);
+ uart_puts("\n\r");
//DEBUGP("turning on anacomp");
// set up analog comparator
@@ -573,7 +540,7 @@ int main(void) {
} else {
// we aren't in low power mode so init stuff
- // init io's
+ // init IOs
initbuttons();
VFDSWITCH_PORT &= ~_BV(VFDSWITCH);
@@ -593,6 +560,15 @@ int main(void) {
boost_init(eeprom_read_byte((uint8_t *)EE_BRIGHT));
sei();
+ //Load and check the timezone information
+ intTimeZoneHour = eeprom_read_byte((uint8_t *)EE_ZONE_HOUR);
+ if ( ( 12 < intTimeZoneHour ) || ( -12 > intTimeZoneHour ) )
+ intTimeZoneHour = 0;
+
+ intTimeZoneMin = eeprom_read_byte((uint8_t *)EE_ZONE_MIN);
+ if ( ( 60 < intTimeZoneMin ) || ( 0 > intTimeZoneMin ) )
+ intTimeZoneMin = 0;
+
region = eeprom_read_byte((uint8_t *)EE_REGION);
DEBUGP("speaker init");
@@ -637,10 +613,18 @@ int main(void) {
set_date();
break;
case (SET_DATE):
- displaymode = SET_BRIGHTNESS;
- display_str("set brit");
- set_brightness();
+ //displaymode = SET_BRIGHTNESS;
+ //display_str("set brit");
+ //set_brightness();
+ displaymode = SET_ZONE;
+ display_str("set zone");
+ set_timezone();
break;
+ case (SET_ZONE):
+ displaymode = SET_BRIGHTNESS;
+ display_str("set brit");
+ set_brightness();
+ break;
case (SET_BRIGHTNESS):
displaymode = SET_VOLUME;
display_str("set vol ");
@@ -671,7 +655,14 @@ int main(void) {
kickthedog();
displaymode = SHOW_TIME;
- }
+ }
+
+ //Check to see if GPS data is ready:
+ if ( gpsdataready() ) {
+ getgpstime();
+
+ }
+
}
}
@@ -943,6 +934,72 @@ void set_date(void) {
}
}
+//Function to set the time zone
+void set_timezone(void) {
+ int8_t hour = intTimeZoneHour;
+ uint8_t min = intTimeZoneMin;
+ uint8_t mode = SHOW_MENU;
+ timeoutcounter = INACTIVITYTIMEOUT;
+
+ while (1) {
+ if (just_pressed & 0x1) { // mode change
+ return;
+ }
+ if (just_pressed || pressed) {
+ timeoutcounter = INACTIVITYTIMEOUT;
+ // timeout w/no buttons pressed after 3 seconds?
+ } else if (!timeoutcounter) {
+ //timed out!
+ displaymode = SHOW_TIME;
+ return;
+ }
+ if (just_pressed & 0x2) {
+ just_pressed = 0;
+ if (mode == SHOW_MENU) {
+ // ok now its selected
+ mode = SET_HOUR;
+ display_timezone(hour, min);
+ display[1] |= 0x1;
+ display[2] |= 0x1;
+ } else if (mode == SET_HOUR) {
+ mode = SET_MIN;
+ display_timezone(hour, min);
+ display[4] |= 0x1;
+ display[5] |= 0x1;
+ } else {
+ // done!
+ displaymode = SHOW_TIME;
+ return;
+ }
+ }
+ if ((just_pressed & 0x4) || (pressed & 0x4)) {
+ just_pressed = 0;
+
+ if (mode == SET_HOUR) {
+ hour = ( ( hour + 1 + 12 ) % 25 ) - 12;
+ display_timezone(hour, min);
+ display[1] |= 0x1;
+ display[2] |= 0x1;
+ intTimeZoneHour = hour;
+ eeprom_write_byte((uint8_t *)EE_ZONE_HOUR, hour);
+ //Debugging:
+ uart_puts("\n\rTimezone offset hour:\t");
+ uart_putw_dec(hour);
+ }
+ if (mode == SET_MIN) {
+ min = ( min + 1 ) % 60;
+ display_timezone(hour, min);
+ display[4] |= 0x1;
+ display[5] |= 0x1;
+ intTimeZoneMin = min;
+ eeprom_write_byte((uint8_t *)EE_ZONE_MIN, min);
+ }
+
+ if (pressed & 0x4)
+ delayms(75);
+ }
+ }
+}
void set_brightness(void) {
uint8_t mode = SHOW_MENU;
@@ -1548,6 +1605,24 @@ void display_alarm(uint8_t h, uint8_t m){
}
}
+// Kinda like display_time but just hours and minutes allows negative hours.
+void display_timezone(int8_t h, uint8_t m){
+ display[8] = pgm_read_byte(alphatable_p + 'c' - 'a');
+ display[7] = pgm_read_byte(alphatable_p + 't' - 'a');
+ display[6] = pgm_read_byte(alphatable_p + 'u' - 'a');
+ display[5] = pgm_read_byte(numbertable_p + (m % 10));
+ display[4] = pgm_read_byte(numbertable_p + (m / 10));
+ display[3] = 0;
+ display[2] = pgm_read_byte(numbertable_p + (abs(h) % 10));
+ display[1] = pgm_read_byte(numbertable_p + (abs(h) / 10));
+ // We use the '-' as a negative sign
+ if (h >= 0)
+ display[0] &= ~0x2; // positive numbers, implicit sign
+ else
+ display[0] |= 0x2; // negative numbers, display negative sign
+
+}
+
// display words (menus, prompts, etc)
void display_str(char *s) {
uint8_t i;
@@ -1625,3 +1700,345 @@ void spi_xfer(uint8_t c) {
while (! (SPSR & _BV(SPIF)));
}
+//GPS serial data handling functions:
+
+//Check to see if there is any serial data.
+uint8_t gpsdataready(void) {
+
+ return (UCSR0A & _BV(RXC0));
+
+}
+
+
+void getgpstime(void) {
+
+ uint8_t intOldHr = 0;
+ uint8_t intOldMin = 0;
+ uint8_t intOldSec = 0;
+
+ char charReceived = UDR0;
+
+ char *strPointer1;
+ char strTime[7];
+ char strDate[7];
+
+ //If the buffer has not been started because a '$' has not been encountered
+ //but a '$' is just now encountered, then start filling the buffer.
+ if ( ( 0 == intBufferStatus ) && ( '$' == charReceived ) ) {
+ intBufferStatus = 1;
+ strncat(strBuffer, &charReceived, 1);
+ return;
+ }
+
+ //If the buffer has started to fill...
+ if ( 0 != intBufferStatus ) {
+ //If for some reason, the buffer is full, clear it, and start over.
+ if ( ! ( ( strlen(strBuffer) < BUFFERSIZE ) ) ) {
+ memset( strBuffer, 0, BUFFERSIZE );
+ intBufferStatus = 0;
+ return;
+ }
+ //If the buffer has 6 characters in it, it is time to check to see if it is
+ //the line we are looking for that starts with "$GPRMC"
+ else if ( 6 == strlen(strBuffer) ) {
+ //If the buffer does contain the characters we are looking for,
+ //then update the status, add to the buffer, and then return for more.
+ if ( 0 == strcmp( strBuffer, "$GPRMC" ) ) {
+ //uart_puts("\n\r$GPRMC Found \n\r");
+ intBufferStatus = 2;
+ strncat(strBuffer, &charReceived, 1);
+ return;
+ }
+ //If the buffer does not contain the characters we are looking for,
+ //then clear the buffer and start over..
+ else {
+ //uart_puts("\n\r$GPRMC Not Found:\t\t");
+ //uart_puts(strBuffer);
+ memset( strBuffer, 0, BUFFERSIZE );
+ intBufferStatus = 0;
+ return;
+ }
+ }
+
+ //If the asterix at the start of the checksum at the end of the line is encountered,
+ //then parse the buffer.
+ else if ( '*' == charReceived ) {
+ //If the buffer status indicates we have not already found the
+ //needed start of the string, then start over.
+ if ( 2 != intBufferStatus ) {
+ memset( strBuffer, 0, BUFFERSIZE );
+ intBufferStatus = 0;
+ return;
+ }
+ //If the buffer status indicates we have already found the needed start of the string,
+ //then go on to parse the buffer.
+ else {
+ //Parse the buffer here...
+ //Let's test to see if this works:
+ uart_puts("\n\r");
+ uart_puts(strBuffer);
+
+ //Find the first comma:
+ strPointer1 = strchr( strBuffer, ',');
+
+ //Copy the section of memory in the buffer that contains the time.
+ memcpy( strTime, strPointer1 + 1, 6 );
+ //add a null character to the end of the time string.
+ strTime[6] = 0;
+
+
+
+ //Find eight more commas to get the date:
+ for ( int i = 0; i < 8; i++ ) {
+ strPointer1 = strchr( strPointer1 + 1, ',');
+ }
+
+ //Copy the section of memory in the buffer that contains the date.
+ memcpy( strDate, strPointer1 + 1, 6 );
+ //add a null character to the end of the date string.
+ strDate[6] = 0;
+
+ //The GPS unit will not have the proper date unless it has received a time update.
+ //NOTE: at the turn of the century, the clock will not get updates from GPS
+ //for as many years as the value of PROGRAMMING_YEAR
+ if ( PROGRAMMING_YEAR <= ( ( (strDate[4] - '0') * 10 ) ) + (strDate[5] - '0') ) {
+ //Get the 'old' values of the time:
+ intOldHr = time_h;
+ intOldMin = time_m;
+ intOldSec = time_s;
+
+ //Change the time:
+ setgpstime(strTime);
+ //Change the date:
+ setgpsdate(strDate);
+
+ //Gussy up the time and date, make the numbers come out right:
+ fix_time();
+
+ //Turn the two time values into minutes past midnight
+ uint16_t timeMinutes = ((time_h * 60) + (time_m));
+ uint16_t oldTimeMinutes = ((intOldHr * 60) + (intOldMin));
+
+ int8_t intTempHr = time_h;
+ int8_t intTempMin = time_m;
+
+ //If midnight happened between the old time and the new time
+ //and we did not just go back in time...
+ if ( ( 0 > (int16_t)( timeMinutes - oldTimeMinutes ) )
+ && ( (timeMinutes + 1440) >= oldTimeMinutes )
+ && ( abs( timeMinutes + 1440 - oldTimeMinutes ) < abs( timeMinutes - oldTimeMinutes ) ) ) {
+ timeMinutes += 1440;
+ intTempHr += 24;
+ }
+
+ if ( timeMinutes > oldTimeMinutes ) {
+
+ //Count backwards in time to the old time, checking the alarm for each minute.
+ for ( ; intTempHr >= intOldHr; intTempHr-- ) {
+ for ( ; intTempMin >= 0; intTempMin-- ) {
+ check_alarm( (uint8_t)intTempHr, (uint8_t)intTempMin, 0 );
+ }
+ intTempMin = 59;
+ }
+
+ }
+
+ }
+
+ //We've done what we needed to do, so start over.
+ memset( strBuffer, 0, BUFFERSIZE );
+ intBufferStatus = 0;
+ return;
+ }
+ }
+ //If nothing else was found, add to the buffer.
+ else {
+ strncat(strBuffer, &charReceived, 1);
+ }
+
+
+ }
+
+}
+
+//Set the time with a string taken from GPS data:
+void setgpstime(char* str) {
+ uint8_t intTempHr = 0;
+ uint8_t intTempMin = 0;
+ uint8_t intTempSec = 0;
+
+ intTempHr = (str[0] - '0') * 10;
+ intTempHr = intTempHr + (str[1] - '0');
+
+ intTempMin = (str[2] - '0') * 10;
+ intTempMin = intTempMin + (str[3] - '0');
+
+ intTempSec = (str[4] - '0') * 10;
+ intTempSec = intTempSec + (str[5] - '0');
+
+ time_h = intTempHr + intTimeZoneHour;
+
+ //If the time zone offset is negative, then subtract minutes
+ if ( 0 > intTimeZoneHour )
+ time_m = intTempMin - intTimeZoneMin;
+ else
+ time_m = intTempMin + intTimeZoneMin;
+
+ time_s = intTempSec;
+
+}
+
+//Set the date with a string taken from GPS data:
+void setgpsdate(char* str) {
+ uint8_t intTempDay = 0;
+ uint8_t intTempMon = 0;
+ uint8_t intTempYr = 0;
+
+ intTempDay = (str[0] - '0') * 10;
+ intTempDay = intTempDay + (str[1] - '0');
+
+ intTempMon = (str[2] - '0') * 10;
+ intTempMon = intTempMon + (str[3] - '0');
+
+ intTempYr = (str[4] - '0') * 10;
+ intTempYr = intTempYr + (str[5] - '0');
+
+ timeunknown = 0;
+ restored = 0;
+
+ date_d = intTempDay;
+ date_m = intTempMon;
+ date_y = intTempYr;
+
+}
+
+//Checks the alarm against the passed time.
+void check_alarm(uint8_t h, uint8_t m, uint8_t s) {
+
+ if (alarm_on && (alarm_h == h) && (alarm_m == m) && (0 == s)) {
+ DEBUGP("alarm on!");
+ alarming = 1;
+ snoozetimer = 0;
+ }
+
+}
+
+
+//Fixes the time variables whenever time is changed
+void fix_time(void) {
+
+ // a minute!
+ if (time_s >= 60) {
+ time_s = time_s - 60;
+ time_m++;
+ }
+ // If someone decides to make offset seconds with a negative number...
+ if (time_s < 0) {
+ time_s = 60 + time_s;
+ time_m--;
+ }
+
+ // an hour...
+ if (time_m >= 60) {
+ time_m = time_m - 60;
+ time_h++;
+ // let's write the time to the EEPROM
+ eeprom_write_byte((uint8_t *)EE_HOUR, time_h);
+ eeprom_write_byte((uint8_t *)EE_MIN, time_m);
+ }
+ // When offsets create negative minutes...
+ if (time_m < 0) {
+ time_m = 60 + time_m;
+ time_h--;
+ eeprom_write_byte((uint8_t *)EE_HOUR, time_h);
+ eeprom_write_byte((uint8_t *)EE_MIN, time_m);
+ }
+
+ // a day....
+ if (time_h >= 24) {
+ time_h = time_h - 24;
+ date_d++;
+ eeprom_write_byte((uint8_t *)EE_DAY, date_d);
+ }
+ // When offsets create negative hours...
+ if (time_h < 0) {
+ time_h = 24 + time_h;
+ date_d--;
+ eeprom_write_byte((uint8_t *)EE_DAY, date_d);
+ }
+
+ //if (! sleepmode) {
+ // uart_putw_dec(time_h);
+ // uart_putchar(':');
+ // uart_putw_dec(time_m);
+ // uart_putchar(':');
+ // uart_putw_dec(time_s);
+ // putstring_nl("");
+ //}
+
+
+ // a full month!
+ // we check the leapyear and date to verify when it's time to roll over months
+ if ((date_d > 31) ||
+ ((date_d == 31) && ((date_m == 4)||(date_m == 6)||(date_m == 9)||(date_m == 11))) ||
+ ((date_d == 30) && (date_m == 2)) ||
+ ((date_d == 29) && (date_m == 2) && !leapyear(2000+date_y))) {
+ date_d = 1;
+ date_m++;
+ eeprom_write_byte((uint8_t *)EE_MONTH, date_m);
+ }
+ // When offsets create negative days...
+ if (date_d < 1) {
+ //Find which month we are going back to:
+ switch (date_m) {
+ case 1: //January -> December
+ case 2: //February -> January
+ case 4: //April -> March
+ case 6: //June -> May
+ case 8: //August -> July
+ case 9: //September -> August
+ case 11: //November -> October
+ date_d = 31 + date_d;
+ date_m--;
+ break;
+
+ case 5: //May -> April
+ case 7: //July -> June
+ case 10: //October -> September
+ case 12: //December -> November
+ date_d = 30 + date_d;
+ date_m--;
+ break;
+
+ case 3: //March -> February, the fun case
+ //If we are in a leapyear, February is 29 days long...
+ if ( leapyear(2000+date_y) )
+ date_d = 29 + date_d;
+ else //otherwise, it is 28 days long...
+ date_d = 28 + date_d;
+ date_m--;
+ break;
+ default:
+ date_d = 1;
+ break;
+ }
+
+ eeprom_write_byte((uint8_t *)EE_MONTH, date_m);
+ }
+
+ // HAPPY NEW YEAR!
+ if (date_m >= 13) {
+ date_y++;
+ date_m = 1;
+ eeprom_write_byte((uint8_t *)EE_YEAR, date_y);
+ }
+ //This takes away the years and is cheaper than any cream you can buy...
+ if (date_m < 1) {
+ date_m = 12 + date_m;
+ date_y--;
+ eeprom_write_byte((uint8_t *)EE_MONTH, date_m);
+ eeprom_write_byte((uint8_t *)EE_YEAR, date_y);
+ }
+
+
+}
View
32 firmware/iv.h
@@ -1,6 +1,7 @@
/***************************************************************************
- Ice Tube Clock firmware August 13, 2009
- (c) 2009 Limor Fried / Adafruit Industries
+ Ice Tube Clock with GPS firmware July 22, 2010
+ (c) 2010 Limor Fried / Adafruit Industries
+ GPS Capability added by Devlin Thyne
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -27,6 +28,8 @@ THE SOFTWARE.
#define DEBUG 1
#define DEBUGP(x) if (DEBUG) {putstring_nl(x);}
+//The year the clock was programmed, used for error checking
+#define PROGRAMMING_YEAR 10
#define REGION_US 0
#define REGION_EU 1
@@ -35,6 +38,9 @@ THE SOFTWARE.
#define DATE 0 // mm-dd-yy
#define DAY 1 // thur jan 1
+// String buffer size:
+#define BUFFERSIZE 128
+
#define DISPLAYSIZE 9
#define MAXSNOOZE 600 // 10 minutes
@@ -58,6 +64,8 @@ THE SOFTWARE.
#define EE_VOLUME 10
#define EE_REGION 11
#define EE_SNOOZE 12
+#define EE_ZONE_HOUR 13
+#define EE_ZONE_MIN 14
void delay(uint16_t delay);
@@ -73,6 +81,7 @@ void display_time(uint8_t h, uint8_t m, uint8_t s);
void display_date(uint8_t style);
void display_str(char *s);
void display_alarm(uint8_t h, uint8_t m);
+void display_timezone(int8_t h, uint8_t m);
void set_time(void);
void set_alarm(void);
@@ -82,6 +91,15 @@ void set_volume(void);
void set_region(void);
void set_snooze(void); // not activated by default
+//Checks the alarm against the passed time.
+void check_alarm(uint8_t h, uint8_t m, uint8_t s);
+
+//Fixes the time variables whenever time is changed
+void fix_time(void);
+
+//Set the time zone:
+void set_timezone(void);
+
void beep(uint16_t freq, uint8_t times);
void tick(void);
@@ -92,6 +110,12 @@ void setdisplay(uint8_t digit, uint8_t segments);
void vfd_send(uint32_t d);
void spi_xfer(uint8_t c);
+//GPS serial data handling functions:
+uint8_t gpsdataready(void);
+void getgpstime(void);
+void setgpstime(char* str);
+void setgpsdate(char* str);
+
// displaymode
#define NONE 99
@@ -106,10 +130,11 @@ void spi_xfer(uint8_t c);
#define SET_REGION 8
#define SHOW_SNOOZE 9
#define SET_SNOOZE 10
+#define SET_ZONE 11
// sub-mode settings
#define SHOW_MENU 0
-// alarm/time
+// alarm/time/zone
#define SET_HOUR 1
#define SET_MIN 2
#define SET_SEC 3
@@ -124,6 +149,7 @@ void spi_xfer(uint8_t c);
//region
#define SET_REG 1
+
#define BOOST PD6
#define BOOST_DDR DDRD
#define BOOST_PORT PORTD
View
1,278 firmware/iv.hex
@@ -1,606 +1,698 @@
-:100000000C94AB000C943F100C94C8000C941E0E82
-:100010000C94C8000C94770E0C94C8000C94C80083
-:100020000C94C8000C94AD0C0C94C8000C94C8003F
+:100000000C94AB000C94B2120C94C8000C94EC0B42
+:100010000C94C8000C94450C0C94C8000C94C800B7
+:100020000C94C8000C9459090C94C8000C94C80096
:100030000C94C8000C94C8000C94C8000C94C80020
-:100040000C9486090C94C8000C94C8000C94C80049
-:100050000C94C8000C94C8000C94C8000C941E0C9E
+:100040000C9460050C94C8000C94C8000C94C80073
+:100050000C94C8000C94C8000C94C8000C94600B5D
:100060000C94C8000C94C800FA3E1A7ADE8EF62E64
:100070006078AE1CAA2A3ACEF30AB61E3838B86E9B
:1000800076DA6800FC60DAF266B6BEE0FEE684006E
:1000900003070809060A050C0490000B10120F0D47
-:1000A0000E11139B00616C61726D206F66660053C8
-:1000B00065742064617900646F6E6500616C6172C3
-:1000C0006D20696E697400636C6F636B20696E6983
-:1000D0007400737065616B657220696E697400628B
-:1000E0006F6F737420696E69740076666420696E40
-:1000F0006974007475726E696E67206F6E20616C32
-:1001000061726D7377007475726E696E67206F6EC1
-:1001100020627574746F6E7300636C6F636B20691B
-:100120006E697400210077616B6574696D650057B5
-:10013000414B455245534554007A00616C61726DE4
-:10014000206F6E2100623200623300623100736EF4
+:1000A0000E11139B00616C61726D206F6E210061F7
+:1000B0006C61726D206F66660053657420646179AF
+:1000C00000646F6E6500616C61726D20696E6974A9
+:1000D00000636C6F636B20696E6974007370656197
+:1000E0006B657220696E697400626F6F737420694A
+:1000F0006E69740076666420696E69740074757246
+:100100006E696E67206F6E20616C61726D7377002F
+:100110007475726E696E67206F6E20627574746F8D
+:100120006E7300636C6F636B20696E6974002100ED
+:1001300077616B6574696D650057414B4552455356
+:100140004554007A00623200623300623100736EFF
:100150006F6F7A65000011241FBECFEFD4E0DEBFC1
-:10016000CDBF11E0A0E0B1E0ECECF4E202C00590FC
-:100170000D92A43FB107D9F712E0A4EFB1E001C09E
-:100180001D92A132B107E1F70E94150F0C94641281
-:100190000C9400009C0178941092020210920102CB
-:1001A000809101029091020282179307C8F308958B
-:1001B000A895089581E08093F7015B9A8CB58F7BB9
-:1001C0008CBD85B1877D85B95E9815BC10920F02F4
+:10016000CDBF12E0A0E0B1E0E0E4FAE202C0059009
+:100170000D92A634B107D9F712E0A6E4B2E001C0AF
+:100180001D92A53FB107E1F70E9458110C941E156E
+:100190000C9400009C017894109256021092550223
+:1001A000809155029091560282179307C8F30895E3
+:1001B000A895089581E0809349025B9A8CB58F7B66
+:1001C0008CBD85B1877D85B95E9815BC1092E30220
:1001D0001092680085B1897F85B98BB18F7C8BB90E
:1001E00028988AB18F7C8AB920985A985298E1E66B
:1001F000F0E090E8908388E08083449A83B787603A
:1002000083BF889590831082449808958EE284B9C4
:1002100088E48AB989E187B984E38BB991E095B91B
:1002200085E08093680090936B0080E380936D007D
-:100230000895F999FECF84E090E092BD81BDF89ACF
-:1002400080B568E10E94F41190930C02F999FECFF9
-:1002500085E090E092BD81BDF89A80B56CE30E9484
-:10026000F41190931A02F999FECF86E090E092BDC6
-:1002700081BDF89A80B56CE30E94F411909320023E
-:10028000F999FECF88E090E092BD81BDF89A80B5E3
-:100290006CE30E94F41190930E02F999FECF87E06F
-:1002A00090E092BD81BDF89A80B568E10E94F4119A
-:1002B00090931C02F999FECF81E090E092BD81BD40
-:1002C000F89A80B564E60E94F41190930D02F999B2
-:1002D000FECF82E090E092BD81BDF89A80B56DE0DE
-:1002E0000E94F41190931F02F999FECF83E090E0F1
-:1002F00092BD81BDF89A80B58F718093100291E014
-:100300009093F9018091B60080628093B60085E0F9
-:100310008093B1009093700078940895FC018370ED
-:100320009070892B39F4CF0164E670E00E940012CE
-:10033000892B49F420E030E0CF0160E971E00E94B0
-:100340000012892B11F421E030E0822F0895F999F1
-:10035000FECF8AE090E092BD81BDF89A80B580938F
-:100360000F0285B1866085B982E380938000809119
-:100370000F02882329F0809180008068809380009C
-:1003800088E1809381008AEF90E0909387008093CA
-:10039000860080918600909187009695879590932E
-:1003A00089008093880080918800909189009093C3
-:1003B0008B0080938A000895109280001092810033
-:1003C000299A2A9878941092020210920102809140
-:1003D0000102909102020A97D0F32A9A2998789400
-:1003E0001092020210920102809101029091020289
-:1003F0000A97D0F385B1897F85B982EB809380001D
-:1004000088E18093810008951F93162F9C0140E09E
-:1004100050E060E472E48FE090E00E944912309373
-:1004200087002093860080918600909187009695A2
-:10043000879590938B0080938A0080918A00909199
-:100440008B00909389008093880028EC30E01CC0DA
-:100450008091810082608093810080ED97E0F901B6
-:100460003197F1F70197D9F7809181008D7F8093C3
-:10047000810085B1897F85B980ED97E0F9013197D9
-:10048000F1F70197D9F71150112311F785B1897F41
-:1004900085B91F9108958B3590F58E3110F08E310E
-:1004A00011F48EE12DC0843210F483E229C0893228
-:1004B00010F488E225C08E3210F48DE221C083331F
-:1004C00010F482E31DC0883310F487E319C08D3324
-:1004D00010F48CE315C0823410F481E411C0873429
-:1004E00010F486E40DC08C3410F48BE409C081351F
-:1004F00010F480E505C0863510F485E501C08AE575
-:1005000087BD83E084BD81E085BD84B5806884BDFE
-:1005100080916E00816080936E00789408951F939F
-:10052000182F262F842F6AE00E94F411E92FF0E0A3
-:10053000EC57FF4FE491E0931902842F0E94F411CD
-:10054000E82FF0E0EC57FF4FE491E093180210928F
-:100550001702822F0E94F411E92FF0E0EC57FF4FB1
-:10056000E491E0931602822F0E94F411E82FF0E04C
-:10057000EC57FF4FE491E093150210921402809122
-:10058000F601882361F5812F90E00B966CE070E016
-:100590000E9414129C012F5F3F4FC9016AE070E076
-:1005A0000E941412FC01EC57FF4FE491E0931302F8
-:1005B000C9016AE070E00E941412FB01EC57FF4F82
-:1005C000E491E09312021C3020F0809111028160CE
-:1005D00003C0809111028E7F809311021AC0812F77
-:1005E00068E10E94F411292F892F6AE00E94F4111A
-:1005F000E92FF0E0EC57FF4FE491E0931302822FD4
-:100600000E94F411E82FF0E0EC57FF4FE491E093E3
-:1006100012021F910895BF92CF92DF92EF92FF9244
-:100620000F931F93CF93DF93E0900C02F0901A0288
-:10063000009120028AE08093070210E05AE0B52E74
-:1006400045E0C42ED12CC4E0D0E08091040280FDAE
-:10065000E5C080910402882321F48091050288235B
-:1006600019F0B092070205C080910702882309F4AF
-:100670004BC08091040281FF4AC0109204021123F2
-:10068000B9F4E0900C02F0901A02009120028E2D35
-:100690006F2D402F0E948F02809112028160809303
-:1006A00012028091130281608093130211E02FC027
-:1006B000113089F48E2D6F2D402F0E948F02809172
-:1006C00015028160809315028091160281608093EB
-:1006D000160212E01CC0123089F48E2D6F2D402FAF
-:1006E0000E948F028091180281608093180280918D
-:1006F000190281608093190213E009C0E0920C0294
-:10070000F0921A020093200210921E0287C080917C
-:10071000040282FD04C08091050282FF96CF1092F0
-:100720000402113031F58E2D90E0019668E170E001
-:100730000E941412E82E6F2D402F0E948F0280918C
-:100740001202816080931202809113028160809373
-:100750001302E0920C0280910C02F999FECF1FBAAD
-:10076000D2BDC1BD80BD0FB6F894FA9AF99A0FBEFA
-:1007700044C0123039F58F2D90E001966CE370E0A3
-:100780000E941412F82E8E2D6F2D402F0E948F0282
-:10079000809115028160809315028091160281601C
-:1007A0008093160280911A02F999FECF1FBAD2BC2B
-:1007B000C1BC80BD0FB6F894FA9AF99A0FBEF092B8
-:1007C0001A021BC01330C9F4802F90E001966CE32D
-:1007D00070E00E941412082F8E2D6F2D402F0E9462
-:1007E0008F02809118028160809318028091190213
-:1007F000816080931902009320028091050282FF9C
-:1008000024CF78941092020210920102809101028A
-:10081000909102028B349105C8F317CFDF91CF91ED
-:100820001F910F91FF90EF90DF90CF90BF900895B0
-:10083000382F262F109219021092180210921702C8
-:10084000862F6AE00E94F411E92FF0E0EC57FF4F89
-:10085000E491E0931602822F0E94F411E82FF0E059
-:10086000EC57FF4FE491E09315021092140280912F
-:10087000F601882309F03BC03C3058F0809111020A
-:10088000816080931102E7E7F0E0E491E0931802C1
-:100890000AC0E8E6F0E0E491E093180280911102CA
-:1008A0008E7F80931102E4E7F0E0E491E093190277
-:1008B000832F90E00B966CE070E00E9414129C0174
-:1008C0002F5F3F4FC9016AE070E00E941412FC01E3
-:1008D000EC57FF4FE491E0931302C9016AE070E026
-:1008E0000E941412FB01EC57FF4FE4911EC0832FAE
-:1008F00090E0479668E170E00E9414129C012F5F1F
-:100900003F4FC9016AE070E00E941412FC01EC57ED
-:10091000FF4FE491E0931302C9016AE070E00E9486
-:100920001412FB01EC57FF4FE491E093120208957B
-:10093000EF92FF920F931F9310911C0200910E02F1
-:100940008AE080930702FF247AE0E72E8091040278
-:1009500080FDD3C080910402882321F48091050298
-:10096000882319F0E092070229C0809107028823AA
-:1009700029F510921E0210931C0200930E02209182
-:100980001C02F999FECF1FBA87E090E092BD81BDAD
-:1009900020BD0FB6F894FA9AF99A0FBE20910E0274
-:1009A000F999FECF1FBA88E090E092BD81BD20BDCD
-:1009B0000FB6F894FA9AF99A0FBE9FC0809104027C
-:1009C00081FF4EC010920402FF2089F4812F602F16
-:1009D0000E9418048091120281608093120280911B
-:1009E0001302816080931302FF24F39439C081E0E5
-:1009F000F81689F4812F602F0E9418048091150247
-:100A000081608093150280911602816080931602A6
-:100A100062E0F62E25C010931C0200930E02209176
-:100A20001C02F999FECF1FBA87E090E092BD81BD0C
-:100A300020BD0FB6F894FA9AF99A0FBE20910E02D3
-:100A4000F999FECF1FBA88E090E092BD81BD20BD2C
-:100A50000FB6F894FA9AF99A0FBE10921E024DC082
-:100A60008091040282FD04C08091050282FF6ECF56
-:100A70001092040281E0F816B1F4812F90E0019603
-:100A800068E170E00E941412182F602F0E94180471
-:100A90008091120281608093120280911302816022
-:100AA0008093130219C082E0F816B1F4802F90E011
-:100AB00001966CE370E00E941412082F812F602FC2
-:100AC0000E94180480911502816080931502809124
-:100AD00016028160809316028091050282FF36CF54
-:100AE000789410920202109201028091010290917A
-:100AF00002028B349105C8F329CF1F910F91FF900B
-:100B0000EF900895CF93DF9310921102EC01A2E1D0
-:100B1000B2E0E881EE23D1F08E2F81568A3128F49D
-:100B2000F0E0E95FFF4FE49108C08E2F80538A30D8
-:100B300030F4F0E0EC5AFF4FE491EC9301C01C92CA
-:100B40002196119682E0AA31B80719F7DF91CF916B
-:100B50000895CF93DF93882309F07AC01092110291
-:100B600082E080931402809317028091F60188231B
-:100B700061F580911F026AE00E94F411E82FF0E015
-:100B8000EC57FF4FE491E093120280911F020E9404
-:100B9000F411E92FF0E0EC57FF4FE491E0931302DA
-:100BA000809110020E94F411E82FF0E0EC57FF4F03
-:100BB000E491E0931502809110020E94F411E92F54
-:100BC000F0E0EC57FF4FE4912BC0809110026AE0F7
-:100BD0000E94F411E82FF0E0EC57FF4FE491E0930E
-:100BE0001202809110020E94F411E92FF0E0EC57FC
-:100BF000FF4FE491E093130280911F020E94F411D1
-:100C0000E82FF0E0EC57FF4FE491E093150280915C
-:100C10001F020E94F411E92FF0E0EC57FF4FE4911E
-:100C2000E093160280910D026AE00E94F411E82F11
-:100C3000F0E0EC57FF4FE491E093180280910D0231
-:100C40000E94F411E92FF0E0EC57FF4FE491E3C06C
-:100C5000813009F0E2C080911F02C82FD0E080915E
-:100C60000D02E82FF0E0E053F84F80911F0283302F
-:100C700010F42C96319720911002109218021092C5
-:100C8000190230E02F5F3F4F2E0F3F1FCE01880F1C
-:100C9000991F280F391FCF019695879596958795AF
-:100CA000280F391FCF0160E971E00E940012260F62
-:100CB000371FCF0164E670E00E940012261B370B3D
-:100CC000AE014F5F5F4FCA01880F991F840F951FB8
-:100CD000880F991F6AE070E00E940012C901860F18
-:100CE000971F67E070E00E9400128330B9F08430F3
-:100CF00028F4813069F0823070F407C08530A1F0AB
-:100D0000853078F08630B9F412C080E091E011C0EF
-:100D100087E091E00EC08EE091E00BC086E191E0AB
-:100D200008C08FE191E005C088E291E002C08FE247
-:100D300091E00E94820578941092020210920102C2
-:100D40008091010290910202885E9340C8F3109254
-:100D50001502109216021092170280911F0286301F
-:100D600079F1873070F4833011F1843028F48130C8
-:100D7000C1F08230D9F518C08430E1F08530B1F58A
-:100D80001CC0893031F18A3028F48730E1F0883096
-:100D900069F51CC08B3019F18B30F0F08C3031F5D7
-:100DA00021C088E391E020C08CE391E01DC080E485
-:100DB00091E01AC086E491E017C08CE491E014C081
-:100DC00080E591E011C085E591E00EC08AE591E0F3
-:100DD0000BC080E691E008C085E691E005C08BE697
-:100DE00091E002C081E791E00E94820580911002AB
-:100DF0006AE00E94F411E82FF0E0EC57FF4FE49115
-:100E0000E0931802809110020E94F411E92FF0E0A3
-:100E1000EC57FF4FE491E0931902DF91CF910895D1
-:100E20000F931F93CF93DF938AE080930702F99982
-:100E3000FECF8BE090E092BD81BDF89A80B58093A3
-:100E4000F60110E00AE0CBE0D0E001C010E08091B4
-:100E50000402882321F480910502882319F000936D
-:100E6000070204C0809107028823C9F08091040220
-:100E700080FD3FC08091040281FF14C010920402E3
-:100E8000112369F48091F601882319F487E791E032
-:100E900002C080E891E00E94820511E003C0109238
-:100EA0001E0227C08091040282FFD1CF109204025B
-:100EB000113061F690E08091F601882309F491E009
-:100EC0009093F601992319F487E791E002C080E836
-:100ED00091E00E9482058091F601F999FECF1FBA38
-:100EE000D2BDC1BD80BD0FB6F894FA9AF99A0FBE73
-:100EF000AECFDF91CF911F910F910895EF92FF92A6
-:100F00000F931F93CF93DF938AE080930702F999A1
-:100F1000FECF8AE090E092BD81BDF89AF0B400E087
-:100F20001AE0E12ECAE0D0E001C000E080910402A6
-:100F3000882321F480910502882319F0E0920702AA
-:100F400004C080910702882369F18091040280FD2A
-:100F50006CC08091040281FF28C01092040200231B
-:100F600009F5FF2051F089E891E00E948205809107
-:100F7000160281608093160204C082E991E00E940B
-:100F80008205809117028160809317028091180278
-:100F90008160809318028091190281608093190208
-:100FA00001E003C010921E0240C08091040282FF43
-:100FB000BDCF10920402013009F0B7CF10E0FF203E
-:100FC00009F411E0F12E112351F089E891E00E941B
-:100FD00082058091160281608093160204C082E926
-:100FE00091E00E9482058091170281608093170230
-:100FF00080911802816080931802809119028160AB
-:1010000080931902F999FECF1FBAD2BDC1BD10BDA0
-:101010000FB6F894FA9AF99A0FBE0E94A70180EAD7
-:101020009FE061E00E94040281CFDF91CF911F9188
-:101030000F91FF90EF9008953F924F925F926F92C1
-:101040007F928F929F92AF92BF92CF92DF92EF9258
-:10105000FF920F931F938AE080930702F999FECFC6
-:1010600089E090E092BD81BDF89A10B520E09AE049
-:10107000392E0EE18AE5582EB5E54B2EA0E57A2EE5
-:10108000FBE46F2EE6E48E2E71E4A72E6CE3962E21
-:1010900057E3B52E42E3D42E3DE2C32E98E2F92E5B
-:1010A00083E2E82E01C020E080910402882321F42D
-:1010B00080910502882319F03092070209C08091BF
-:1010C0000702882329F410921E02F999FECF2DC041
-:1010D0008091040280FD91C08091040281FF31C0A3
-:1010E000109204022223E9F48BE991E00E94820528
-:1010F000812F6AE00E94F411E82FF0E0EC57FF4FD7
-:10110000E491E160E0931802812F0E94F411E92F2D
-:10111000F0E0EC57FF4FE491E160E093190221E029
-:1011200010C010921E02F999FECF1FBA89E090E01C
-:1011300092BD81BD10BD0FB6F894FA9AF99A0FBE10
-:101140005CC08091040282FD04C08091050282FF90
-:10115000ABCF10920402213009F0A5CF1B5F1C35E4
-:1011600008F01EE1812F6AE00E94F411E82FF0E000
-:10117000EC57FF4FE491E160E0931802812F0E9449
-:10118000F411E92FF0E0EC57FF4FE491E160E093B8
-:1011900019021F3180F1143210F4E7BC85CF1932E7
-:1011A00010F4F7BC81CF1E3210F4C7BC7DCF1333CF
-:1011B00010F4D7BC79CF183310F4B7BC75CF1D33FA
-:1011C00010F497BC71CF123410F4A7BC6DCF173454
-:1011D00010F487BC69CF1C3410F467BC65CF11359F
-:1011E00010F477BC61CF163510F447BC5DCF1B35CA
-:1011F00011F057BC59CF07BD57CF1F910F91FF90EA
-:10120000EF90DF90CF90BF90AF909F908F907F90A6
-:101210006F905F904F903F90089581E58CBD089549
-:101220009B01AC01F894CA01AA27BB278EBD0DB45F
-:1012300007FEFDCFBB27A52F942F832F8EBD0DB4A6
-:1012400007FEFDCF2EBD0DB407FEFDCF409A40989E
-:1012500078940895AF92BF92CF92DF92EF92FF926F
-:101260000F931F93E82FF0E0E057FF4FE49181E0E8
-:1012700090E002C0880F991FEA95E2F77C010027F1
-:10128000F7FC0095102F209108023091090240913F
-:101290000A0250910B02A0E0B0E070E0E1E0AE2E57
-:1012A000B12CC12CD12CCB010A2E02C0959587956B
-:1012B0000A94E2F780FF11C0FD01E556FF4FE4916B
-:1012C000A601950104C0220F331F441F551FEA9544
-:1012D000D2F7E22AF32A042B152B1196A830B10578
-:1012E00011F7209308023093090240930A025093A9
-:1012F0000B02C801B7010E9410091F910F91FF90C6
-:10130000EF90DF90CF90BF90AF9008951F920F9213
-:101310000FB60F9211242F933F934F935F936F93C8
-:101320007F938F939F93AF93BF93EF93FF937894A3
-:10133000A8958091FB019091FC0101969093FC018E
-:101340008093FB01819708F46CC01092FC0110920D
-:10135000FB0180910102909102020196909302029A
-:10136000809301028091FA01893010F01092FA0105
-:101370008091FA01E82FF0E0EF5EFD4F60810E945E
-:101380002A098091FA018F5F8093FA0180911D02F2
-:10139000882309F446C08091FF0190910002892BB7
-:1013A00009F03FC08091FD019091FE01019690935C
-:1013B000FE018093FD018536910598F11092FE01A2
-:1013C0001092FD018AEF90E0909387008093860051
-:1013D00080918600909187009695879590938B00D9
-:1013E00080938A0080918A0090918B00909389006D
-:1013F0008093880080911D02807F49F080911D02BA
-:101400008F7080931D02809181008D7F08C0809134
-:101410001D02806F80931D02809181008260809305
-:101420008100FF91EF91BF91AF919F918F917F913B
-:101430006F915F914F913F912F910F900FBE0F9041
-:101440001F9018958EBD0DB407FEFDCF08954A9BE1
-:1014500034C080911B02882309F04CC081E0809346
-:101460001B02109200021092FF0182EA91E00E949A
-:10147000820589E080931E027894109202021092F5
-:1014800001028091010290910202885E9340C8F3AC
-:1014900080911C0260910E020E94180478941092B0
-:1014A0000202109201028091010290910202885E74
-:1014B0009340C8F310921E02089580911B02882366
-:1014C000C9F010921B02109200021092FF0180914D
-:1014D0001D02882379F085EA90E061E00E94B71050
-:1014E00010921D02809181008D7F8093810085B1D3
-:1014F000866085B90895BF92CF92DF92EF92FF92F6
-:101500000F931F93CF93DF938AE08093070210E03D
-:101510000AE0BB24B394B1E0EB2EF12CA3E0CA2E79
-:10152000D12CC2E0D0E080910402882321F4809184
-:101530000502882319F00093070205C08091070275
-:10154000882309F472C08091040280FD15C1809146
-:10155000040281FF6DC0109204021123D1F4809126
-:10156000F601882311F411E006C08FEA90E061E0F3
-:101570000E94B71012E080E00E94A905809112023B
-:101580008160809312028091130281608093130224
-:101590004FC0113029F48091F601882339F020C022
-:1015A0001230E1F48091F6018130A9F48091F601C6
-:1015B000882311F011E001C012E080E00E94A9052B
-:1015C00080911502816080931502809116028160DE
-:1015D000809316022DC0882339F015C0113099F47C
-:1015E0008091F601813079F480E00E94A905809114
-:1015F00018028160809318028091190281608093A3
-:10160000190213E015C083E680931E0280E00E9459
-:10161000A9057894109202021092010280910102B1
-:10162000909102028C5D9540C8F310921E02A4C0F6
-:101630008091040282FD04C08091050282FF73CF75
-:1016400010920402113079F580911F028F5F809310
-:101650001F0280911F028D3010F010931F0280E056
-:101660000E94A9058091F601882359F48091120205
-:101670008160809312028091130281608093130233
-:101680000AC0809115028160809315028091160234
-:1016900081608093160280911F02F999FECF1FBAD4
-:1016A000D2BDC1BD53C0123079F5809110028F5F59
-:1016B0008093100280911002803210F0B0921002DC
-:1016C00080E00E94A9058091F601813059F4809153
-:1016D00012028160809312028091130281608093D4
-:1016E00013020AC0809115028160809315028091D7
-:1016F000160281608093160280911002F999FECF44
-:101700001FBAD2BCC1BC22C0133031F580910D028A
-:101710008F5F80930D0280910D0264E60E94F411A8
-:1017200090930D0280E00E94A905809118028160CB
-:101730008093180280911902816080931902809130
-:101740000D02F999FECF1FBAF2BCE1BC80BD0FB605
-:10175000F894FA9AF99A0FBE8091050282FFE3CEBF
-:1017600078941092020210920102809101029091ED
-:101770000202CC97D0F3D7CEDF91CF911F910F917A
-:10178000FF90EF90DF90CF90BF9008958091F70188
-:10179000882309F452C080E88093610010926100B0
-:1017A00086E291E061E00E94B7101092F70180E4B8
-:1017B0009CE90197F1F700B605FC3FC08EE284B9C1
-:1017C00088E48AB989E187B984E38BB991E095B956
-:1017D00085E08093680090936B0080E380936D00B8
-:1017E000F999FECF89E090E092BD81BDF89A80B56D
-:1017F0000E944B0281E58CBD5B984398F999FECF1E
-:101800008AE090E092BD81BDF89A80B580930F0286
-:101810000E94A701A8950E94270A80E793E061E053
-:101820000E94040280EE96E061E00E94040280ECD7
-:101830009DE061E00E940402A89508951F920F9216
-:101840000FB60F9211242F933F934F935F936F9393
-:101850007F938F939F93AF93BF93EF93FF9300B6C4
-:1018600005FE3AC08091F701882309F065C05B9AB4
-:1018700085B1877D85B95E988CB58F7B8CBD809155
-:10188000F9018823F1F020911A02F999FECF1FBACD
-:1018900085E090E092BD81BD20BD0FB6F894FA9A24
-:1018A000F99A0FBE20912002F999FECF1FBA86E067
-:1018B00090E092BD81BD20BD0FB6F894FA9AF99AD6
-:1018C0000FBE89E391E061E00E94B71015BC109251
-:1018D0000F02109268002BC08091F701882361F1FC
-:1018E0008091F9018823F1F020911A02F999FECF35
-:1018F0001FBA85E090E092BD81BD20BD0FB6F8947F
-:10190000FA9AF99A0FBE20912002F999FECF1FBAD8
-:1019100086E090E092BD81BD20BD0FB6F894FA9AA2
-:10192000F99A0FBE8FE291E061E00E94B710E0915A
-:10193000F401F091F5010995FF91EF91BF91AF91FD
-:101940009F918F917F916F915F914F913F912F91D7
-:101950000F900FBE0F901F9018951F920F920FB609
-:101960000F9211242F933F934F935F936F937F9325
-:101970008F939F93AF93BF93EF93FF9380E88093F0
-:10198000610010926100809120028F5F809320029D
-:10199000809120028C3338F01092200280911A023C
-:1019A0008F5F80931A0280911A028C3328F1109273
-:1019B0001A0280910C028F5F80930C0220910C021E
-:1019C000F999FECF1FBA84E090E092BD81BD20BDA1
-:1019D0000FB6F894FA9AF99A0FBE20911A02F99963
-:1019E000FECF1FBA85E090E092BD81BD20BD0FB64D
-:1019F000F894FA9AF99A0FBE80910C028831B0F0EF
-:101A000010920C02809110028F5F8093100220913F
-:101A10001002F999FECF1FBA83E090E092BD81BD1C
-:101A200020BD0FB6F894FA9AF99A0FBE8091100271
-:101A3000803268F5809110028F3181F480911F020D
-:101A4000843029F180911F02863009F180911F02B4
-:101A50008930E9F080911F028B30C9F0809110022B
-:101A60008E3121F480911F02823089F08091100222
-:101A70008D3121F580911F02823001F580910D0298
-:101A800090E08053984F0E948E018823B9F481E042
-:101A90008093100280911F028F5F80931F0220911C
-:101AA0001F02F999FECF1FBA82E090E092BD81BD7E
-:101AB00020BD0FB6F894FA9AF99A0FBE80911F02D2
-:101AC0008D30B8F080910D028F5F80930D0281E020
-:101AD00080931F0220910D02F999FECF1FBA81E079
-:101AE00090E092BD81BD20BD0FB6F894FA9AF99AA4
-:101AF0000FBE8091F701882309F06EC080911E020D
-:101B0000882311F58091F801882349F08091200203
-:101B100080FF05C08BEA91E00E94820508C0809199
-:101B20000C0260911A02409120020E948F02809163
-:101B30001B02882321F080911102826003C08091F2
-:101B400011028D7F8093110280911B028823E1F0A6
-:101B500090911C0280910C029817B1F490910E02A2
-:101B600080911A02981781F480912002882361F4F1
-:101B70008BE391E061E00E94B71081E080931D0249
-:101B8000109200021092FF0180910702882329F031
-:101B9000809107028150809307028091060288237A
-:101BA00029F0809106028150809306028091FF0106
-:101BB00090910002009781F001979093000280932A
-:101BC000FF0180FF04C080911102826003C08091F8
-:101BD00011028D7F80931102FF91EF91BF91AF9120
-:101BE0009F918F917F916F915F914F913F912F9135
-:101BF0000F900FBE0F901F90189588E592E090937C
-:101C000000028093FF018EE491E061E00E94B71032
-:101C100084EB91E00E94820589E080931E02789413
-:101C20001092020210920102809101029091020230
-:101C3000885E9340C8F310921E0208951F920F927F
-:101C40000FB60F9211242F933F934F935F936F938F
-:101C50007F938F939F93AF93BF93EF93FF931092D4
-:101C60006800789418992AC08091030281FD2BC0E6
-:101C700078941092020210920102809101029091D8
-:101C800002020A97D0F318991EC00E94DC018091CD
-:101C90001D02882319F00E94FD0D15C080910302DA
-:101CA0008260809303028091040282608093040228
-:101CB00085E491E061E00E94B71005C080910302C5
-:101CC0008D7F8093030285E080936800FF91EF9100
-:101CD000BF91AF919F918F917F916F915F914F9144
-:101CE0003F912F910F900FBE0F901F9018951F924C
-:101CF0000F920FB60F9211242F933F934F935F9340
-:101D00006F937F938F939F93AF93BF93EF93FF93C3
-:101D10001092680078944D9927C08091030280FD4D
-:101D200028C0789410920202109201028091010260
-:101D3000909102020A97D0F34D9963C00E94DC0192
-:101D400080911D028823C9F58091030281608093F0
-:101D50000302809104028160809304028BE491E08D
-:101D600061E00E94B71005C0809103028E7F8093CE
-:101D700003024C993FC08091030282FD42C07894D7
-:101D800010920202109201028091010290910202CF
-:101D90000A97D0F34C9935C082E0809306021BC0AD
-:101DA0004C9B19C00E94DC01809103028B7F8093C1
-:101DB000030280911D02882319F00E94FD0D21C0AD
-:101DC00088E491E061E00E94B71080910402846091
-:101DD0008093040216C080910602882309F780913F
-:101DE00003028460809303028091050284608093E3
-:101DF000050207C010920502809103028B7F809339
-:101E0000030285E080936800FF91EF91BF91AF914D
-:101E10009F918F917F916F915F914F913F912F9102
-:101E20000F900FBE0F901F901895BF92CF92DF9228
-:101E3000EF92FF920F931F9315BC569A5E9884B74A
-:101E400014BE90E00E940E1188E10FB6F8948093C2
-:101E50006000109260000FBE2FE088E190E00FB6A6
-:101E6000F894A895809360000FBE20936000A89519
-:101E700011E01093F8011092F9018AE190E00E94BC
-:101E8000951084E291E061E00E94B71028E420BF41
-:101E900080ED97E00197F1F700B605FE0BC080B723
-:101EA000806180BF89E191E061E00E94B7100E94EB
-:101EB00019015BC08EE284B92AB989E187B984E34C
-:101EC0008BB915B985E08093680010936B0080E3AF
-:101ED00080936D005B9886E091E061E00E94B7100E
-:101EE00083EF90E061E00E94B710109369001DBB82
-:101EF00010921E028AEE90E061E00E94B71081E528
-:101F00008CBD8FED90E061E00E94B710F999FECF93
-:101F100089E090E092BD81BDF89A80B50E944B02A5
-:101F20007894F999FECF8BE090E092BD81BDF89A4C
-:101F300080B58093F60182ED90E061E00E94B710D9
-:101F40000E94A70180EA9FE061E00E94040287EC02
-:101F500090E061E00E94B7100E9419018CEB90E0C4
-:101F600061E00E94B7100E94270A87EB90E061E0D1
-:101F70000E94B71023E6B22E93E0C92E87E0D82E38
-:101F800006E0E02E18E0F12E04E015E0A89500B67A
-:101F900005FE03C00E94DA00F9CF8091040280FFA1
-:101FA0004EC01092040280911E028430C9F0853028
-:101FB00030F4882361F0833009F05EC01CC08630A5
-:101FC00061F1863008F1873009F056C02FC00093C8
-:101FD0001E028DEB91E00E9482050E949804D6CFEC
-:101FE000C0921E0287EC91E00E9482050E940B03C2
-:101FF0001092F801CBCF10931E0280ED91E00E9469
-:1020000082050E947B0AC2CFE0921E0289ED91E018
-:102010000E9482050E941C08B9CFD0921E0282EE57
-:1020200091E00E9482050E947E07B0CFF0921E02CE
-:102030008BEE91E00E9482050E941007A7CF80914D
-:10204000040281FD04C08091040282FF9FCF1092A0
-:102050000402B0921E0281E00E94A905A89578941E
-:1020600010920202109201028091010290910202EC
-:102070008C5D9540C8F3A89510921E0287CF1F92E1
-:102080000F920FB60F9211242F933F934F935F93AC
-:102090006F937F938F939F93AF93BF93EF93FF9330
-:1020A00089E60E94A21029B17894789410920202D5
-:1020B0001092010280910102909102020A97D0F3DE
-:1020C00089B1247030E090E084709070281739074F
-:1020D00011F40E94270AFF91EF91BF91AF919F9158
-:1020E0008F917F916F915F914F913F912F910F90C1
-:1020F0000FBE0F901F90189506C090E000009F5FE4
-:102100009E31E1F781508823C1F7089548EC50E0F3
-:1021100009C020E137E2FA013197F1F72150304050
-:10212000D1F781508823A9F708959093C500809333
-:10213000C40088E18093C1008EE08093C200519A70
-:1021400050980895982F8091C00085FFFCCF909300
-:10215000C60080E090E008958091C00087FFFCCF2A
-:102160008091C60008958091C00080780895AC01E8
-:1021700020E007C08091C00085FFFCCF3093C600EF
-:102180002F5FFA01E20FF11D3491332399F7662393
-:1021900071F08091C00085FFFCCF8AE08093C6007B
-:1021A0008091C00085FFFCCF8DE08093C60008952C
-:1021B000FC0107C08091C00085FFFCCF3196909351
-:1021C000C60090819923B1F70895282F982F9295F2
-:1021D0009F709A3030F48091C00085FFFCCF905DF5
-:1021E00005C08091C00085FFFCCF995A9093C6002E
-:1021F000822F90E08F7090700A973CF48091C0001D
-:1022000085FFFCCF2F70205D06C08091C00085FF48
-:10221000FCCF2F70295A2093C60008951F93182FC2
-:10222000892F0E94E510812F0E94E5101F910895CB
-:10223000EF92FF920F931F937B018C01C801AA2795
-:10224000BB270E940E11C7010E940E111F910F9112
-:10225000FF90EF9008950F931F93CF93DF938C011E
-:10226000E0E1F7E240E0C0E0D0E0C801BF010E9439
-:102270000012262F662329F4442319F4E130F105D6
-:1022800049F48091C00085FFFCCF205D2093C600FB
-:10229000205341E0CF016AE070E00E9400122196D5
-:1022A000C530D10571F0822F90E09C012E9FC001B6
-:1022B0002F9F900D3E9F900D1124081B190BFB01C1
-:1022C000D4CFDF91CF911F910F9108954F925F92DC
-:1022D0006F927F928F929F92AF92BF92CF92DF9236
-:1022E000EF92FF920F931F93CF93DF934B015C010B
-:1022F000E12C9AECF92E9AE9092F9BE3192F44243B
-:10230000C0E0D0E0C501B401A80197010E942712E6
-:10231000D22E222341F4442031F481E0E816F10466
-:102320000105110561F48091C00085FFFCCF80E3B9
-:10233000D80ED092C60080EDD80E44244394C80134
-:10234000B7012AE030E040E050E00E942712C22EA0
-:10235000732E642E552E2196CA30D105A9F06D2D0D
-:1023600070E080E090E0A80197010E94D511861AE4
-:10237000970AA80AB90A2C2D372D462D552DC901CB
-:10238000DA017C018D01BECFDF91CF911F910F91BA
-:10239000FF90EF90DF90CF90BF90AF909F908F9085
-:1023A0007F906F905F904F900895629FD001739FD0
-:1023B000F001829FE00DF11D649FE00DF11D929FE1
-:1023C000F00D839FF00D749FF00D659FF00D992720
-:1023D000729FB00DE11DF91F639FB00DE11DF91F44
-:1023E000BD01CF0111240895991B79E004C0991F04
-:1023F000961708F0961B881F7A95C9F7809508955F
-:10240000AA1BBB1B51E107C0AA1FBB1FA617B7071A
-:1024100010F0A61BB70B881F991F5A95A9F7809536
-:102420009095BC01CD01089597FB092E07260AD08F
-:1024300077FD04D0E5DF06D000201AF47095619591
-:102440007F4F0895F6F7909581959F4F0895A1E2EB
-:102450001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F1E
-:10246000FF1FA217B307E407F50720F0A21BB30B69
-:10247000E40BF50B661F771F881F991F1A9469F7E5
-:1024800060957095809590959B01AC01BD01CF0141
-:10249000089597FB092E05260ED057FD04D0D7DFEF
-:1024A0000AD0001C38F450954095309521953F4F47
-:1024B0004F4F5F4F0895F6F7909580957095619511
-:0C24C0007F4F8F4F9F4F0895F894FFCF7F
-:1024CC0073756E646179006D6F6E646179007475FB
-:1024DC006573646179007765646E73646179007407
-:1024EC0068757273646179006672696461790073EE
-:1024FC0061747572646179006A616E006665620070
-:10250C006D6172636800617072696C006D61790055
-:10251C006A756E65006A756C790061756773740015
-:10252C0073657074006F63746F62006E6F76656DA7
-:10253C0000646563656D007573612D3132687200DE
-:10254C006575722D3234687200766F6C206869671D
-:10255C006800766F6C20206C6F770062726974650E
-:10256C002000616C61726D206F6E00202020202095
-:10257C0020202000736E6F6F7A696E67007365742C
-:10258C0020616C61726D007365742074696D6500F7
-:10259C00736574206461746500736574206272697C
-:1025AC00740073657420766F6C20007365742072F0
-:0425BC0065676E00E1
+:100230000895FC0183709070892B39F4CF0164E636
+:1002400070E00E948014892B49F420E030E0CF0157
+:1002500060E971E00E948014892B11F421E030E004
+:10026000822F08951092800010928100299A2A9876
+:1002700078941092560210925502809155029091F6
+:1002800056020A97D0F32A9A299878941092560227
+:100290001092550280915502909156020A97D0F320
+:1002A00085B1897F85B982EB8093800088E1809356
+:1002B000810008951F93162F9C0140E050E060E4F8
+:1002C00072E48FE090E00E94C9143093870020937D
+:1002D00086008091860090918700969587959093EF
+:1002E0008B0080938A0080918A0090918B0090937C
+:1002F00089008093880028EC30E01CC08091810048
+:1003000082608093810080ED97E0F9013197F1F7E9
+:100310000197D9F7809181008D7F8093810085B10D
+:10032000897F85B980ED97E0F9013197F1F7019761
+:10033000D9F71150112311F785B1897F85B91F9124
+:1003400008958B3590F58E3110F08E3111F48EE1D9
+:100350002DC0843210F483E229C0893210F488E27F
+:1003600025C08E3210F48DE221C0833310F482E375
+:100370001DC0883310F487E319C08D3310F48CE36B
+:1003800015C0823410F481E411C0873410F486E47F
+:100390000DC08C3410F48BE409C0813510F480E575
+:1003A00005C0863510F485E501C08AE587BD83E088
+:1003B00084BD81E085BD84B5806884BD80916E0078
+:1003C000816080936E00789408951F93182F262FD4
+:1003D000842F6AE00E946714E92FF0E0EC57FF4F8A
+:1003E000E491E093ED02842F0E946714E82FF0E07F
+:1003F000EC57FF4FE491E093EC021092EB02822F56
+:100400000E946714E92FF0E0EC57FF4FE491E0936E
+:10041000EA02822F0E946714E82FF0E0EC57FF4FAA
+:10042000E491E093E9021092E80280914802882367
+:1004300061F5812F90E00B966CE070E00E949414BF
+:100440009C012F5F3F4FC9016AE070E00E94941445
+:10045000FC01EC57FF4FE491E093E702C9016AE029
+:1004600070E00E949414FB01EC57FF4FE491E0937D
+:10047000E6021C3020F08091E502816003C080918B
+:10048000E5028E7F8093E5021AC0812F68E10E9409
+:100490006714292F892F6AE00E946714E92FF0E082
+:1004A000EC57FF4FE491E093E702822F0E9467141C
+:1004B000E82FF0E0EC57FF4FE491E093E6021F9144
+:1004C0000895382F262F1092ED021092EC02109210
+:1004D000EB02862F6AE00E946714E92FF0E0EC57E8
+:1004E000FF4FE491E093EA02822F0E946714E82F05
+:1004F000F0E0EC57FF4FE491E093E9021092E8023C
+:1005000080914802882309F03BC03C3058F080912C
+:10051000E50281608093E502E7E7F0E0E491E09393
+:10052000EC020AC0E8E6F0E0E491E093EC0280918E
+:10053000E5028E7F8093E502E4E7F0E0E491E0934A
+:10054000ED02832F90E00B966CE070E00E94941413
+:100550009C012F5F3F4FC9016AE070E00E94941434
+:10056000FC01EC57FF4FE491E093E702C9016AE018
+:1005700070E00E949414FB01EC57FF4FE4911EC001
+:10058000832F90E0479668E170E00E9494149C01EC
+:100590002F5F3F4FC9016AE070E00E949414FC0194
+:1005A000EC57FF4FE491E093E702C9016AE070E085
+:1005B0000E949414FB01EC57FF4FE491E093E60294
+:1005C0000895482F262FEAE6F0E084918093ED020B
+:1005D000719684918093EC023196E491E093EB0262
+:1005E000862F6AE00E946714E92FF0E0EC57FF4F76
+:1005F000E491E093EA02822F0E946714E82FF0E072
+:10060000EC57FF4FE491E093E9021092E802242FA7
+:10061000332727FD309537FF03C0309521953F4F95
+:10062000C9016AE070E00E949414FC01EC57FF4F8E
+:10063000E491E093E702C9016AE070E00E9494143B
+:10064000FB01EC57FF4FE491E093E60247FD04C045
+:100650008091E5028D7F03C08091E50282608093E6
+:10066000E5020895CF93DF931092E502EC01A6EE28
+:10067000B2E0E881EE23D1F08E2F81568A3128F442
+:10068000F0E0E95FFF4FE49108C08E2F80538A307D
+:1006900030F4F0E0EC5AFF4FE491EC9301C01C926F
+:1006A0002196119682E0AE3EB80719F7DF91CF91FF
+:1006B0000895CF93DF93882309F096C01092E50246
+:1006C00082E08093E8028093EB02809148028823C5
+:1006D00009F037C08091F3026AE00E947314E82F9A
+:1006E000FF27E7FDF095EC57FF4FE491E093E6021A
+:1006F0008091F3026AE00E947314E92FFF27E7FD5F
+:10070000F095EC57FF4FE491E093E7028091E4020B
+:100710006AE00E947314E82FFF27E7FDF095EC577D
+:10072000FF4FE491E093E9028091E4026AE00E94C5
+:100730007314E92FFF27E7FDF095EC57FF4FE49185
+:1007400036C08091E4026AE00E947314E82FFF270C
+:10075000E7FDF095EC57FF4FE491E093E6028091BE
+:10076000E4026AE00E947314E92FFF27E7FDF09589
+:10077000EC57FF4FE491E093E7028091F3026AE0C7
+:100780000E947314E82FFF27E7FDF095EC57FF4F09
+:10079000E491E093E9028091F3026AE00E9473140D
+:1007A000E92FFF27E7FDF095EC57FF4FE491E09329
+:1007B000EA028091E1026AE00E947314E82FFF27A9
+:1007C000E7FDF095EC57FF4FE491E093EC02809148
+:1007D000E1026AE00E947314E92FFF27E7FDF0951C
+:1007E000EC57FF4FE491EEC0813009F0EDC08091ED
+:1007F000F302C82FDD27C7FDD0958091E102E82FD5
+:10080000FF27E7FDF095E053F84F8091F302833026
+:1008100014F42C9631972091E4021092EC0210927D
+:10082000ED02332727FD30952F5F3F4F2E0F3F1FDF
+:10083000CE01880F991F280F391FCF0196958795F4
+:1008400096958795280F391FCF0160E971E00E94C6
+:100850008014260F371FCF0164E670E00E948014D9
+:10086000261B370BAE014F5F5F4FCA01880F991FE0
+:10087000840F951F880F991F6AE070E00E94801412
+:10088000C901860F971F67E070E00E9480148330D3
+:10089000B9F0843028F4813069F0823070F407C0F8
+:1008A0008530A1F0853078F08630B9F412C080E050
+:1008B00091E011C087E091E00EC08EE091E00BC0A6
+:1008C00086E191E008C08FE191E005C088E291E007
+:1008D00002C08FE291E00E94320378941092560297
+:1008E000109255028091550290915602885E934075
+:1008F000C8F31092E9021092EA021092EB02809182
+:10090000F302863079F1873074F4833011F184304A
+:100910002CF48130C1F08230D9F518C08430E1F078
+:100920008530B1F51CC0893031F18A302CF4873024
+:10093000E1F0883069F51CC08B3019F18B30F4F090
+:100940008C3031F521C088E391E020C08CE391E048
+:100950001DC080E491E01AC086E491E017C08CE4E9
+:1009600091E014C080E591E011C085E591E00EC0F2
+:100970008AE591E00BC080E691E008C085E691E051
+:1009800005C08BE691E002C081E791E00E9432034E
+:100990008091E4026AE00E947314E82FFF27E7FDCC
+:1009A000F095EC57FF4FE491E093EC028091E40264
+:1009B0006AE00E947314E92FFF27E7FDF095EC57DA
+:1009C000FF4FE491E093ED02DF91CF91089581E52F
+:1009D0008CBD08959B01AC01F894CA01AA27BB27DE
+:1009E0008EBD0DB407FEFDCFBB27A52F942F832FFF
+:1009F0008EBD0DB407FEFDCF2EBD0DB407FEFDCF9D
+:100A0000409A409878940895AF92BF92CF92DF9227
+:100A1000EF92FF920F931F93E82FF0E0E057FF4F04
+:100A2000E49181E090E002C0880F991FEA95E2F717
+:100A30007C010027F7FC0095102F20915C0230917B
+:100A40005D0240915E0250915F02A0E0B0E070E074
+:100A500091E0A92EB12CC12CD12CCB010A2E02C0C1
+:100A6000959587950A94E2F780FF11C0FD01E55640
+:100A7000FF4FE491A601950104C0220F331F441FCC
+:100A8000551FEA95D2F7E22AF32A042B152B11966B
+:100A9000A830B10511F720935C0230935D024093BA
+:100AA0005E0250935F02C801B7010E94EA041F91E1
+:100AB0000F91FF90EF90DF90CF90BF90AF9008958F
+:100AC0001F920F920FB60F9211242F933F934F93C3
+:100AD0005F936F937F938F939F93AF93BF93EF93A6
+:100AE000FF937894A89580914F02909150020196BF
+:100AF0009093500280934F02819708F46CC010923B
+:100B0000500210924F028091550290915602019628
+:100B1000909356028093550280914E02893010F0D6
+:100B200010924E0280914E02E82FF0E0EB51FD4F03
+:100B300060810E94040580914E028F5F80934E0277
+:100B40008091F102882309F446C08091530290916C
+:100B50005402892B09F03FC08091510290915202BA
+:100B6000019690935202809351028536910598F137
+:100B700010925202109251028AEF90E090938700F7
+:100B80008093860080918600909187009695879546
+:100B900090938B0080938A0080918A0090918B00C3
+:100BA00090938900809388008091F102807F49F0C2
+:100BB0008091F1028F708093F102809181008D7F8E
+:100BC00008C08091F102806F8093F10280918100D2
+:100BD000826080938100FF91EF91BF91AF919F91CF
+:100BE0008F917F916F915F914F913F912F910F90D6
+:100BF0000FBE0F901F9018958EBD0DB407FEFDCF50
+:100C000008958091C00080780895FC01538150516F
+:100C100082814AE0849FC0011124580F748165814C
+:100C200030914402232F20518181280F8081849F9D
+:100C3000C0011124280F2093600280914D0237FFDC
+:100C400002C0581B01C0580F5093EE0260518AE059
+:100C5000789FC0011124680F6093F4020895FC018D
+:100C60005181505180814AE0849FC0011124580F66
+:100C7000338130518281849FC0011124380F258136
+:100C800020518481849FC0011124280F10924A02B0
+:100C900010924B025093E4023093F3022093E1024E
+:100CA00008958091F4028C3354F08091F4028C53B7
+:100CB0008093F4028091EE028F5F8093EE02809128
+:100CC000F40287FF0AC08091F402845C8093F402EE
+:100CD0008091EE0281508093EE028091EE028C337F
+:100CE000B4F08091EE028C538093EE02809160020A
+:100CF0008F5F809360026091600284E090E00E94C8
+:100D000010156091EE0285E090E00E941015809130
+:100D1000EE0287FF16C08091EE02845C8093EE02A3
+:100D2000809160028150809360026091600284E053
+:100D300090E00E9410156091EE0285E090E00E9424
+:100D4000101580916002883184F080916002885192
+:100D5000809360028091E4028F5F8093E40260914F
+:100D6000E40283E090E00E9410158091600287FF0A
+:100D700010C080916002885E809360028091E402DE
+:100D800081508093E4026091E40283E090E00E944D
+:100D900010158091E40280327CF58091E4028F315D
+:100DA00081F48091F302843039F18091F30286302E
+:100DB00019F18091F3028930F9F08091F3028B30C0
+:100DC000D9F08091E4028E3121F48091F3028230D7
+:100DD00099F08091E4028D31E9F48091F302823040
+:100DE000C9F48091E102992787FD90958053984F2F
+:100DF0000E941901882371F481E08093E4028091BC
+:100E0000F3028F5F8093F3026091F30282E090E03F
+:100E10000E9410158091E40218160CF449C08091CC
+:100E2000F3028630D1F0873064F4833029F18430C6
+:100E30001CF4813094F433C0843079F0853079F536
+:100E400010C08A301CF4883044F40BC08B3029F079
+:100E50008B303CF08C3019F504C08091E402815E47
+:100E600003C08091E402825E8093E4028091F302E9
+:100E700081508093F30216C08091E102992787FD8B
+:100E800090958053984F0E941901882321F08091FA
+:100E9000E402835EE9CF8091E402845EE5CF81E0E5
+:100EA0008093E4026091F30282E090E00E941015CA
+:100EB0008091F3028D3074F08091E1028F5F809316
+:100EC000E10281E08093F3026091E10281E090E031
+:100ED0000E9410158091F3021816B4F08091F3026D
+:100EE000845F8093F3028091E10281508093E1025C
+:100EF0006091F30282E090E00E9410156091E1029F
+:100F000081E090E00E9410150895DF92EF92FF9229
+:100F10000F931F93E0906002F090EE020091F402B4
+:100F20008AE080935B0210E03AE0D32E8091580271
+:100F300080FDD7C080915802882321F48091590206
+:100F4000882319F0D0925B0205C080915B02882350
+:100F500009F44BC08091580281FF4AC01092580298
+:100F60001123B9F4E0906002F090EE020091F402D7
+:100F70008E2D6F2D402F0E94E5018091E602816049
+:100F80008093E6028091E70281608093E70211E09E
+:100F90002FC0113089F48E2D6F2D402F0E94E50156
+:100FA0008091E90281608093E9028091EA02816088
+:100FB0008093EA0212E01CC0123089F48E2D6F2D4E
+:100FC000402F0E94E5018091EC0281608093EC0249
+:100FD0008091ED0281608093ED0213E009C0E09200
+:100FE0006002F092EE020093F4021092F20279C0D5
+:100FF0008091580282FD04C08091590282FF96CFF1
+:10100000109258021130F9F48E2D90E0019668E1AB
+:1010100070E00E949414E82E6F2D402F0E94E5018D
+:101020008091E60281608093E6028091E702816010
+:101030008093E702E09260026091600284E090E0B9
+:101040000E9410153DC0123001F58F2D90E00196E1
+:101050006CE370E00E949414F82E8E2D6F2D402FBB
+:101060000E94E5018091E90281608093E90280910C
+:10107000EA0281608093EA026091EE0285E090E0EE
+:101080000E941015F092EE021BC01330C9F4802F9D
+:1010900090E001966CE370E00E949414082F8E2D6E
+:1010A0006F2D402F0E94E5018091EC0281608093BA
+:1010B000EC028091ED0281608093ED020093F402D6
+:1010C0008091590282FF32CF78941092560210928A
+:1010D000550280915502909156028B349105C8F3C8
+:1010E00025CF1F910F91FF90EF90DF900895EF9221
+:1010F000FF920F931F931091F0020091E2028AE099
+:1011000080935B02FF245AE0E52E8091580280FD17
+:10111000AFC080915802882321F48091590288231E
+:1011200019F0E0925B0217C080915B02882399F46A
+:101130001092F2021093F0020093E2026091F0022A
+:1011400087E090E00E9410156091E20288E090E054
+:101150000E9410158DC08091580281FF3CC01092F2
+:101160005802FF2089F4812F602F0E946102809134
+:10117000E60281608093E6028091E70281608093BD
+:10118000E702FF24F39427C081E0F81689F4812F49
+:10119000602F0E9461028091E90281608093E902E0
+:1011A0008091EA0281608093EA0242E0F42E13C04B
+:1011B0001093F0020093E2026091F00287E090E069
+:1011C0000E9410156091E20288E090E00E941015E4
+:1011D0001092F2024DC08091580282FD04C08091AD
+:1011E000590282FF92CF1092580281E0F816B1F4B2
+:1011F000812F90E0019668E170E00E949414182F0E
+:10120000602F0E9461028091E60281608093E60275
+:101210008091E70281608093E70219C082E0F816AE
+:10122000B1F4802F90E001966CE370E00E9494147A
+:10123000082F812F602F0E9461028091E902816056
+:101240008093E9028091EA0281608093EA028091B2
+:10125000590282FF5ACF789410925602109255028A
+:1012600080915502909156028B349105C8F34DCF71
+:101270001F910F91FF90EF900895982F8091EF02AA
+:101280008823B1F08091F002891791F48091E202F5
+:10129000861771F4442361F485EA90E061E00E94CE
+:1012A0002A1381E08093F1021092540210925302AB
+:1012B00008951F920F920FB60F9211242F933F9310
+:1012C0004F935F936F937F938F939F93AF93BF934E
+:1012D000EF93FF9380E8809361001092610080910A
+:1012E000F4028F5F8093F4020E94510680914902BC
+:1012F000882309F056C08091F202882311F580916D
+:101300004A02882349F08091F40280FF05C087E7F4
+:1013100091E00E94320308C0809160026091EE0269
+:101320004091F4020E94E5018091EF02882321F0B0
+:101330008091E502826003C08091E5028D7F8093F9
+:10134000E502809160026091EE024091F4020E94F9
+:101350003D0980915B02882329F080915B028150D6
+:1013600080935B0280915A02882329F080915A026F
+:10137000815080935A0280915302909154020097B9
+:1013800081F00197909354028093530280FF04C030
+:101390008091E502826003C08091E5028D7F809399
+:1013A000E502FF91EF91BF91AF919F918F917F9156
+:1013B0006F915F914F913F912F910F900FBE0F90C2
+:1013C0001F9018954A9B34C08091EF02882309F042
+:1013D0004CC081E08093EF021092540210925302AD
+:1013E00080E891E00E94320389E08093F2027894D1
+:1013F0001092560210925502809155029091560219
+:10140000885E9340C8F38091F0026091E2020E94EE
+:101410006102789410925602109255028091550202
+:1014200090915602885E9340C8F31092F20208959C
+:101430008091EF028823C9F01092EF0210925402BB
+:10144000109253028091F102882379F08FEA90E0A4
+:1014500061E00E942A131092F102809181008D7F39
+:101460008093810085B1866085B90895FF920F93BE
+:101470001F938AE080935B0210E00AE0FF24F3945C
+:1014800080915802882321F480915902882319F011
+:1014900000935B0205C080915B02882309F472C04F
+:1014A0008091580280FD08C18091580281FF6DC073
+:1014B000109258021123D1F480914802882311F42C
+:1014C00011E006C089EB90E061E00E942A1312E06F
+:1014D00080E00E9459038091E60281608093E602D9
+:1014E0008091E70281608093E7024FC0113029F4B8
+:1014F00080914802882339F020C01230E1F48091B5
+:1015000048028130A9F480914802882311F011E04B
+:1015100001C012E080E00E9459038091E9028160DD
+:101520008093E9028091EA0281608093EA022DC0F3
+:10153000882339F015C0113099F480914802813028
+:1015400079F480E00E9459038091EC0281608093DD
+:10155000EC028091ED0281608093ED0213E015C0F2
+:1015600083E68093F20280E00E94590378941092FF
+:1015700056021092550280915502909156028C5D50
+:101580009540C8F31092F20297C08091580282FDF4
+:1015900004C08091590282FF73CF1092580211301B
+:1015A00061F58091F3028F5F8093F3028091F302E3
+:1015B0008D3014F01093F30280E00E945903809163
+:1015C0004802882359F48091E60281608093E60204
+:1015D0008091E70281608093E7020AC08091E9026E
+:1015E00081608093E9028091EA0281608093EA023F
+:1015F0006091F30282E090E04DC0123061F580917D
+:10160000E4028F5F8093E4028091E402803214F060
+:10161000F092E40280E00E945903809148028130F8
+:1016200059F48091E60281608093E6028091E7029E
+:1016300081608093E7020AC08091E9028160809313
+:10164000E9028091EA0281608093EA026091E402FB
+:1016500083E090E01FC01330F9F48091E1028F5FC6
+:101660008093E1028091E10264E60E9473149093FA
+:10167000E10280E00E9459038091EC028160809336
+:10168000EC028091ED0281608093ED026091E102B5
+:1016900081E090E00E9410158091590282FFF0CE07
+:1016A00078941092560210925502809155029091B2
+:1016B0005602CC97D0F3E4CE1F910F91FF9008957E
+:1016C0001F920F920FB60F9211242F933F934F93B7
+:1016D0005F936F937F938F939F93AF93BF93EF939A
+:1016E000FF9300B605FE28C080914902882309F0C7
+:1016F00041C05B9A85B1877D85B95E988CB58F7B3B
+:101700008CBD80914B02882361F06091EE0285E0F0
+:1017100090E00E9410156091F40286E090E00E9433
+:10172000101583E491E061E00E942A1315BC109229
+:10173000E3021092680019C0809149028823D1F019
+:1017400080914B02882361F06091EE0285E090E089
+:101750000E9410156091F40286E090E00E9410153E
+:1017600089E391E061E00E942A13E0914602F09142
+:1017700047020995FF91EF91BF91AF919F918F9192
+:101780007F916F915F914F913F912F910F900FBE7D
+:101790000F901F90189588E592E0909354028093E3
+:1017A00053028EE491E061E00E942A1389E891E0FF
+:1017B0000E94320389E08093F202789410925602DC
+:1017C000109255028091550290915602885E934086
+:1017D000C8F31092F20208951F920F920FB60F9263
+:1017E00011242F933F934F935F936F937F938F9326
+:1017F0009F93AF93BF93EF93FF93109268007894F9
+:1018000018992AC08091570281FD2BC078941092BC
+:1018100056021092550280915502909156020A97F5
+:10182000D0F318991EC00E9432018091F1028823E2
+:1018300019F00E94CB0B15C08091570282608093F3
+:1018400057028091580282608093580285E491E0AB
+:1018500061E00E942A1305C0809157028D7F80931A
+:10186000570285E080936800FF91EF91BF91AF919F
+:101870009F918F917F916F915F914F913F912F91A8
+:101880000F900FBE0F901F9018951F920F920FB6DA
+:101890000F9211242F933F934F935F936F937F93F6
+:1018A0008F939F93AF93BF93EF93FF931092680032
+:1018B00078944D9927C08091570280FD28C0789474
+:1018C0001092560210925502809155029091560244
+:1018D0000A97D0F34D9963C00E9432018091F102C2
+:1018E0008823C9F5809157028160809357028091C7
+:1018F00058028160809358028BE491E061E00E947D
+:101900002A1305C0809157028E7F809357024C990D
+:101910003FC08091570282FD42C0789410925602D7
+:101920001092550280915502909156020A97D0F379
+:101930004C9935C082E080935A021BC04C9B19C061
+:101940000E943201809157028B7F809357028091D1
+:10195000F102882319F00E94CB0B21C088E491E0AA
+:1019600061E00E942A13809158028460809358029B
+:1019700016C080915A02882309F78091570284602B
+:10198000809357028091590284608093590207C066
+:1019900010925902809157028B7F8093570285E005
+:1019A00080936800FF91EF91BF91AF919F918F91CC
+:1019B0007F916F915F914F913F912F910F900FBE4B
+:1019C0000F901F9018958F929F92BF92CF92DF92A7
+:1019D000EF92FF920F931F93DF93CF93CDB7DEB7B4
+:1019E0002F970FB6F894DEBF0FBECDBF8091C60013
+:1019F000898390914C02992349F4843209F0E4C020
+:101A000081E080934C0281E692E0D7C001E612E0CB
+:101A1000F80101900020E9F73197E01BF10BE03865
+:101A2000F105C0F4369789F4C80162E971E00E94BB
+:101A3000EF14009721F482E080934C02BDC080E84F
+:101A4000F80111928A95E9F7B4C08A3209F0B4C05E
+:101A5000923019F080E8D801A9C089E991E00E948C
+:101A60004B13C8010E944B13C8016CE270E00E9446
+:101A7000E414DE011296FC01319626E001900D92ED
+:101A80002150E1F7188600E010E001966CE270E06A
+:101A90000E94E4140F5F1F4F08301105B1F7DE01FB
+:101AA0001996FC01319686E001900D928150E1F784
+:101AB0001F868E8590E0805192402D854AE0249FBC
+:101AC00090011124820F931F0A970CF46BC01091A0
+:101AD00060020091EE028091F402CE0102960E9413
+:101AE0000506CE0109960E942F060E9451063091EC
+:101AF00060028091EE022CE33202D001112499277A
+:101B000087FD9095A80FB91F812E99248CE390E052
+:101B1000889EF001899EF00D989EF00D1124E00F33
+:101B2000F11DE0906002F090EE02AD014E1B5F0BE4
+:101B300057FF18C0BD0160567A4F6E177F0790F0AF
+:101B40009A0120563A4F37FF03C0309521953F4FF9
+:101B500088279927841B950B281739071CF4B8E1AF
+:101B6000EB0E01C0BD01E617F707E0F400E010E05E
+:101B7000CE2CDD24C7FCD0940FC08B2D6F2D40E000
+:101B80000E943D09FA9402C0BE2CB01AF7FEF5CFB0
+:101B90000F5F1F4F6BE3F62EC601801B910B88155C
+:101BA000990594F780E8E1E6F2E0DF011D928A955D
+:101BB000E9F710924C0208C0C801BE016F5F7F4F69
+:101BC00041E050E00E94F8142F960FB6F894DEBF63
+:101BD0000FBECDBFCF91DF911F910F91FF90EF907E
+:101BE000DF90CF90BF909F908F9008958AE090E013
+:101BF0000E9408158093E30285B1866085B982E36F
+:101C0000809380008091E302882329F080918000F6
+:101C100080688093800088E1809381008AEF90E063
+:101C20009093870080938600809186009091870032
+:101C3000969587959093890080938800809188007D
+:101C40009091890090938B0080938A00089584E09E
+:101C500090E00E94081568E10E946714909360026A
+:101C600085E090E00E9408156CE30E946714909351
+:101C7000EE0286E090E00E9408156CE30E94671473
+:101C80009093F40288E090E00E9408156CE30E94B3
+:101C900067149093E20287E090E00E94081568E1E3
+:101CA0000E9467149093F00281E090E00E94081572
+:101CB00064E60E9467149093E10282E090E00E9443
+:101CC00008156DE00E9467149093F30283E090E0A2
+:101CD0000E9408158F718093E40291E090934B026B
+:101CE000E6EBF0E080818062808385E08093B10044
+:101CF00090937000789408950F931F938AE08093D7
+:101D00005B028BE090E00E9408158093480210E08F
+:101D10000AE001C010E080915802882321F48091EC
+:101D20005902882319F000935B0204C080915B0282
+:101D30008823C9F08091580280FD38C080915802F4
+:101D400081FF14C010925802112369F48091480257
+:101D5000882319F48CE991E002C085EA91E00E94A1
+:101D6000320311E003C01092F20220C080915802A9
+:101D700082FFD1CF10925802113061F690E080912D
+:101D80004802882309F491E090934802992319F4BA
+:101D90008CE991E002C085EA91E00E9432038BE079
+:101DA00090E0609148020E941015B5CF1F910F91ED
+:101DB0000895EF92FF920F931F938AE080935B0246
+:101DC0008AE090E00E940815F82E00E0EAE0EE2E8E
+:101DD00001C000E080915802882321F480915902CB
+:101DE000882319F0E0925B0204C080915B02882393
+:101DF00069F18091580280FD66C08091580281FF90
+:101E000028C010925802002309F5FF2051F08EEAF5
+:101E100091E00E9432038091EA0281608093EA029D
+:101E200004C087EB91E00E9432038091EB02816055
+:101E30008093EB028091EC0281608093EC028091B0
+:101E4000ED0281608093ED0201E003C01092F20286
+:101E50003AC08091580282FFBDCF109258020130E3
+:101E600009F0B7CF10E0FF2009F411E0F12E1123A3
+:101E700051F08EEA91E00E9432038091EA02816083
+:101E80008093EA0204C087EB91E00E9432038091C4
+:101E9000EB0281608093EB028091EC028160809381
+:101EA000EC028091ED0281608093ED028AE090E087
+:101EB000612F0E9410150E94F60D80EA9FE061E0FC
+:101EC0000E945A0187CF1F910F91FF90EF900895C4
+:101ED0003F924F925F926F927F928F929F92AF92BA
+:101EE000BF92CF92DF92EF92FF920F931F938AE0FF
+:101EF00080935B0289E090E00E940815182F20E093
+:101F0000AAE03A2E0EE1FAE55F2EE5E54E2E70E5E9
+:101F1000772E6BE4662E56E4852E41E4A42E3CE336
+:101F2000932E97E3B92E82E3D82EBDE2CB2EA8E202
+:101F3000FA2EF3E2EF2E01C020E0809158028823B0
+:101F400021F480915902882319F030925B0204C079
+:101F500080915B02882349F18091580280FD89C0FD
+:101F60008091580281FF29C0109258022223E9F47F
+:101F700080EC91E00E943203812F6AE00E94671496
+:101F8000E82FF0E0EC57FF4FE491E160E093EC02C2
+:101F9000812F0E946714E92FF0E0EC57FF4FE49186
+:101FA000E160E093ED0221E008C01092F20289E0C6
+:101FB00090E0612F0E9410155CC08091580282FD54
+:101FC00004C08091590282FFB8CF1092580221308C
+:101FD00009F0B2CF1B5F1C3508F01EE1812F6AE0CB
+:101FE0000E946714E82FF0E0EC57FF4FE491E160A6
+:101FF000E093EC02812F0E946714E92FF0E0EC5788
+:10200000FF4FE491E160E093ED021F3180F1143263
+:1020100010F4E7BC92CF193210F4F7BC8ECF1E3209
+:1020200010F4C7BC8ACF133310F4D7BC86CF183353
+:1020300010F4B7BC82CF1D3310F497BC7ECF12349E
+:1020400010F4A7BC7ACF173410F487BC76CF1C34B9
+:1020500010F467BC72CF113510F477BC6ECF163513
+:1020600010F447BC6ACF1B3511F057BC66CF07BDD3
+:1020700064CF1F910F91FF90EF90DF90CF90BF90B2
+:10208000AF909F908F907F906F905F904F903F9018
+:10209000089580914902882309F44AC080E880931A
+:1020A00061001092610080E391E061E00E942A13D8
+:1020B0001092490280E49CE90197F1F700B605FC13
+:1020C00037C08EE284B988E48AB989E187B984E3AC
+:1020D0008BB991E095B985E08093680090936B008F
+:1020E00080E380936D0089E090E00E9408150E94D3
+:1020F000A10181E58CBD5B9843988AE090E00E9445
+:1021000008158093E3020E94F60DA8950E94E2094B
+:1021100080E793E061E00E945A0180EE96E061E082
+:102120000E945A0180EC9DE061E00E945A01A8954E
+:102130000895EF92FF920F931F9310914402009124
+:102140004D028AE080935B02FF248AE0E82E8091B2
+:10215000580280FDA8C080915802882321F4809104
+:102160005902882319F0E0925B0204C080915B025F
+:10217000882369F18091580281FF2CC01092580287
+:10218000FF2089F4812F602F0E94E1028091E602F6
+:1021900081608093E6028091E70281608093E7028C
+:1021A000FF24F39417C081E0F81689F4812F602F83
+:1021B0000E94E1028091E90281608093E9028091AE
+:1021C000EA0281608093EA02B2E0FB2E03C0109223
+:1021D000F20269C08091580282FD04C080915902C8
+:1021E00082FFB5CF1092580281E0F81659F5812F81
+:1021F000992787FD90950D9669E170E00E949414EF
+:10220000182F1C50812F602F0E94E1028091E6025E
+:1022100081608093E6028091E70281608093E7020B
+:10222000109344028DE090E0612F0E94101587EC1E
+:1022300091E00E944B13812F992787FD90950E9472
+:102240009E1320C082E0F816E9F4802F90E00196FA
+:102250006CE370E00E949414082F812F602F0E947D
+:10226000E1028091E90281608093E9028091EA02B3
+:1022700081608093EA0200934D028EE090E0602F2F
+:102280000E9410158091590282FF61CF78941092BC
+:1022900056021092550280915502909156028B344D
+:1022A0009105C8F354CF1F910F91FF90EF900895BF
+:1022B000AF92BF92CF92DF92EF92FF920F931F9354
+:1022C00015BC569A5E9884B714BE90E00E948113A4
+:1022D00088E10FB6F89480936000109260000FBE02
+:1022E0002FE088E190E00FB6F894A8958093600005
+:1022F0000FBE20936000A89511E010934A0210923F
+:102300004B0287E690E00E9408138EE291E061E0C4
+:102310000E942A1380EE91E00E944B1381EF91E01E
+:102320000E944B1380E890E00E949E1389E991E09F
+:102330000E944B1328E420BF80ED97E00197F1F74E
+:1023400000B605FE0BC080B7806180BF83E291E0DC
+:1023500061E00E942A130E94270E68C08EE284B9B1
+:102360002AB989E187B984E38BB915B985E08093EF
+:10237000680010936B0080E380936D005B9880E1B0
+:1023800091E061E00E942A138DEF90E061E00E94ED
+:102390002A13109369001DBB1092F20284EF90E0A3
+:1023A00061E00E942A1381E58CBD89EE90E061E036
+:1023B0000E942A1389E090E00E9408150E94A10162
+:1023C00078948DE090E00E94081580934402845F29
+:1023D000893110F0109244028EE090E00E940815BE
+:1023E00080934D028D3310F010924D028BE090E0FF
+:1023F0000E940815809348028CED90E061E00E94F5
+:102400002A130E94F60D80EA9FE061E00E945A01C3
+:1024100081ED90E061E00E942A130E94270E86EC75
+:1024200090E061E00E942A130E94E20981EC90E0B2
+:1024300061E00E942A1363E6A62E5BE0B52E48E019
+:10244000C42E37E0D32E26E0E22E95E0F92E03E0ED
+:1024500014E0A89500B605FE03C00E94DA00F9CF8B
+:102460008091580280FF58C0109258028091F20269
+:10247000853071F1863038F4833009F18430A0F46E
+:10248000882349F066C08730F1F1873098F18B30AE
+:1024900009F05FC026C01093F20284E092E00E942F
+:1024A00032030E94770857C00093F2028EE092E058
+:1024B0000E9432030E94850710924A024CC0F0929B
+:1024C000F20287E192E00E9432030E94360A43C082
+:1024D000B092F20280E292E00E9432030E949910D0
+:1024E0003AC0E092F20289E292E00E9432030E9436
+:1024F000680F31C0D092F20282E392E00E94320370
+:102500000E94D90E28C0C092F2028BE392E00E9492
+:1025100032030E947C0E1FC08091580281FD04C0CE
+:102520008091580282FF17C010925802A092F202C6
+:1025300081E00E945903A895789410925602109257
+:10254000550280915502909156028C5D9540C8F3DA
+:10255000A8951092F2028091C00087FF7ACF0E9466
+:10256000E30C77CF1F920F920FB60F9211242F9387
+:102570003F934F935F936F937F938F939F93AF930B
+:10258000BF93EF93FF9389E60E94151329B17894C6
+:1025900078941092560210925502809155029091B3
+:1025A00056020A97D0F389B1247030E090E084702D
+:1025B00090702817390711F40E94E209FF91EF91FA
+:1025C000BF91AF919F918F917F916F915F914F914B
+:1025D0003F912F910F900FBE0F901F90189506C03E
+:1025E00090E000009F5F9E31E1F781508823C1F7A2
+:1025F000089548EC50E009C020E137E2FA01319734
+:10260000F1F721503040D1F781508823A9F7089580
+:102610009093C5008093C40088E18093C1008EE050
+:102620008093C200519A50980895982F8091C000CD
+:1026300085FFFCCF9093C60080E090E008958091E4
+:10264000C00087FFFCCF8091C60008958091C00034
+:1026500080780895AC0120E007C08091C00085FF1C
+:10266000FCCF3093C6002F5FFA01E20FF11D3491C9
+:10267000332399F7662371F08091C00085FFFCCF6A
+:102680008AE08093C6008091C00085FFFCCF8DE07A
+:102690008093C6000895FC0107C08091C00085FFAB
+:1026A000FCCF31969093C60090819923B1F708959D
+:1026B000282F982F92959F709A3030F48091C00007
+:1026C00085FFFCCF905D05C08091C00085FFFCCFE9
+:1026D000995A9093C600822F90E08F7090700A975D
+:1026E0003CF48091C00085FFFCCF2F70205D06C0B8
+:1026F0008091C00085FFFCCF2F70295A2093C6001F
+:1027000008951F93182F892F0E945813812F0E941C
+:1027100058131F910895EF92FF920F931F937B011F
+:102720008C01C801AA27BB270E948113C7010E9400
+:1027300081131F910F91FF90EF9008950F931F93B6
+:10274000CF93DF938C01E0E1F7E240E0C0E0D0E01E
+:10275000C801BF010E948014262F662329F4442358
+:1027600019F4E130F10549F48091C00085FFFCCFF8
+:10277000205D2093C600205341E0CF016AE070E065
+:102780000E9480142196C530D10571F0822F90E00F
+:102790009C012E9FC0012F9F900D3E9F900D1124F4
+:1027A000081B190BFB01D4CFDF91CF911F910F9123
+:1027B00008954F925F926F927F928F929F92AF9205
+:1027C000BF92CF92DF92EF92FF920F931F93CF931E
+:1027D000DF934B015C01E12C9AECF92E9AE9092F69
+:1027E0009BE3192F4424C0E0D0E0C501B401A80147
+:1027F00097010E94A714D22E222341F4442031F4E1
+:1028000081E0E816F1040105110561F48091C00032
+:1028100085FFFCCF80E3D80ED092C60080EDD80EA5
+:1028200044244394C801B7012AE030E040E050E07E
+:102830000E94A714C22E732E642E552E2196CA30E4
+:10284000D105A9F06D2D70E080E090E0A80197011E
+:102850000E944814861A970AA80AB90A2C2D372D07
+:10286000462D552DC901DA017C018D01BECFDF91C6
+:10287000CF911F910F91FF90EF90DF90CF90BF907D
+:10288000AF909F908F907F906F905F904F90089542
+:10289000629FD001739FF001829FE00DF11D649F44
+:1028A000E00DF11D929FF00D839FF00D749FF00DD0
+:1028B000659FF00D9927729FB00DE11DF91F639F71
+:1028C000B00DE11DF91FBD01CF0111240895991B21
+:1028D00079E004C0991F961708F0961B881F7A9517
+:1028E000C9F78095089587FB082E062687FD8195F8
+:1028F00067FD6195ECDF0EF4919507FC81950895D5
+:10290000AA1BBB1B51E107C0AA1FBB1FA617B70715
+:1029100010F0A61BB70B881F991F5A95A9F7809531
+:102920009095BC01CD01089597FB092E07260AD08A
+:1029300077FD04D0E5DF06D000201AF4709561958C
+:102940007F4F0895F6F7909581959F4F0895A1E2E6
+:102950001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F19
+:10296000FF1FA217B307E407F50720F0A21BB30B64
+:10297000E40BF50B661F771F881F991F1A9469F7E0
+:1029800060957095809590959B01AC01BD01CF013C
+:10299000089597FB092E05260ED057FD04D0D7DFEA
+:1029A0000AD0001C38F450954095309521953F4F42
+:1029B0004F4F5F4F0895F6F790958095709561950C
+:1029C0007F4F8F4F9F4F0895FC018191861721F013
+:1029D0008823D9F7992708953197CF010895FB01EE
+:1029E000DC018D91019080190110D9F3990B0895A4
+:1029F000FB01DC010D900020E9F711974150504098
+:102A000028F0019000200D92C9F708951C920895B6
+:102A1000F999FECF92BD81BDF89A992780B50895A6
+:102A2000262FF999FECF1FBA92BD81BD20BD0FB6EA
+:102A3000F894FA9AF99A0FBE01960895F894FFCF88
+:102A400073756E646179006D6F6E64617900747581
+:102A50006573646179007765646E7364617900748D
+:102A60006875727364617900667269646179007374
+:102A700061747572646179006A616E0066656200F6
+:102A80006D6172636800617072696C006D617900DC
+:102A90006A756E65006A756C79006175677374009C
+:102AA00073657074006F63746F62006E6F76656D2E
+:102AB00000646563656D0020202020202020200018
+:102AC000616C61726D206F6E00736E6F6F7A696EEC
+:102AD0006700244750524D43000A0D007573612D65
+:102AE00031326872006575722D3234687200766F0B
+:102AF0006C206869676800766F6C20206C6F7700C7
+:102B0000627269746520000A0D54696D657A6F6E92
+:102B100065206F666673657420686F75723A090088
+:102B20000A0D48656C6C6F20576F726C64210A0D3A
+:102B3000000A0D4275666665722073697A652069C0
+:102B4000733A090073657420616C61726D0073657E
+:102B5000742074696D650073657420646174650028
+:102B6000736574207A6F6E65007365742062726994
+:102B7000740073657420766F6C2000736574207226
+:062B800065676E00FA001B
:00000001FF
View
10 firmware/util.h
@@ -1,6 +1,7 @@
/***************************************************************************
- Ice Tube Clock firmware August 13, 2009
- (c) 2009 Limor Fried / Adafruit Industries
+ Ice Tube Clock with GPS firmware July 22, 2010
+ (c) 2010 Limor Fried / Adafruit Industries
+ GPS Capability added by Devlin Thyne
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -22,9 +23,11 @@ THE SOFTWARE.
****************************************************************************/
#if (F_CPU == 16000000)
+#define BRRL_4800 207 // for 16MHZ
#define BRRL_9600 103 // for 16MHZ
#define BRRL_192 52 // for 16MHZ
#elif (F_CPU == 8000000)
+#define BRRL_4800 103
#define BRRL_9600 52
#define BRRL_192 26
#endif
@@ -37,6 +40,9 @@ void delay_10us(uint8_t us);
void delay_s(uint8_t s);
int uart_putchar(char c);
+
+char uart_getchar(void);
+
void uart_init(uint16_t BRR);
Please sign in to comment.
Something went wrong with that request. Please try again.