aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Eveland <zeveland@blacklabel-development.com>2012-02-07 23:46:31 -0500
committerZach Eveland <zeveland@blacklabel-development.com>2012-02-07 23:46:31 -0500
commit12e2af9cd76abfe7c35d6e4c38cfb62016e1a23e (patch)
tree18a41b2b5b6be8ac6c1ad8d63491127c63ae4ccd
parente720ffb81d6efcc23491ad044b5c0e037fcf4be4 (diff)
fixed bug in Caterina which caused some programming instructions to fail
Timer 1 interrupts were trashing self-programming timing. Now disable Timer 1 compare match before doing Flash tasks and reenable afterward.
-rwxr-xr-xbootloaders/caterina_LUFA/Caterina.c28
-rw-r--r--bootloaders/caterina_LUFA/Caterina.hex458
2 files changed, 251 insertions, 235 deletions
diff --git a/bootloaders/caterina_LUFA/Caterina.c b/bootloaders/caterina_LUFA/Caterina.c
index 326bce7..11404a7 100755
--- a/bootloaders/caterina_LUFA/Caterina.c
+++ b/bootloaders/caterina_LUFA/Caterina.c
@@ -121,7 +121,7 @@ int main(void)
CDC_Task();
USB_USBTask();
/* Time out and start the sketch if one is present */
- if (Timeout > 16000 && pgm_read_word(0) != 0xFFFF)
+ if (Timeout > 16000)
RunBootloader = false;
LEDPulse();
@@ -154,11 +154,16 @@ void SetupHardware(void)
TX_LED_OFF();
RX_LED_OFF();
- /* Initialize TIMER1 to handle bootloader timeout and LED tasks. Compare match happens at approx. 1 ms interval */
+ /* Initialize TIMER1 to handle bootloader timeout and LED tasks.
+ * With 16 MHz clock and 1/64 prescaler, timer 1 is clocked at 250 kHz
+ * Our chosen compare match generates an interrupt every 1 ms.
+ * This interrupt is disabled selectively when doing memory reading, erasing,
+ * or writing since SPM has tight timing requirements.
+ */
OCR1AH = 0;
OCR1AL = 250;
- TIMSK1 = (1 << OCIE1A);
- TCCR1B = ((1 << CS11) | (1 << CS10));
+ TIMSK1 = (1 << OCIE1A); // enable timer 1 output compare A match interrupt
+ TCCR1B = ((1 << CS11) | (1 << CS10)); // 1/64 prescaler on timer 1 input
/* Initialize USB Subsystem */
USB_Init();
@@ -176,8 +181,9 @@ ISR(TIMER1_COMPA_vect, ISR_BLOCK)
TX_LED_OFF();
if (RxLEDPulse && !(--RxLEDPulse))
RX_LED_OFF();
-
- Timeout++;
+
+ if (pgm_read_word(0) != 0xFFFF)
+ Timeout++;
}
/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready
@@ -267,9 +273,13 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
return;
}
+ /* Disable timer 1 interrupt - can't afford to process nonessential interrupts
+ * while doing SPM tasks */
+ TIMSK1 = 0;
+
/* Check if command is to read memory */
if (Command == 'g')
- {
+ {
/* Re-enable RWW section */
boot_rww_enable();
@@ -353,6 +363,9 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
/* Send response byte back to the host */
WriteNextResponseByte('\r');
}
+
+ /* Re-enable timer 1 interrupt disabled earlier in this routine */
+ TIMSK1 = (1 << OCIE1A);
}
#endif
@@ -555,6 +568,7 @@ void CDC_Task(void)
}
else if ((Command == 'B') || (Command == 'g'))
{
+ Timeout = 0;
// Delegate the block write/read to a separate function for clarity
ReadWriteMemoryBlock(Command);
}
diff --git a/bootloaders/caterina_LUFA/Caterina.hex b/bootloaders/caterina_LUFA/Caterina.hex
index a06aa85..5da8582 100644
--- a/bootloaders/caterina_LUFA/Caterina.hex
+++ b/bootloaders/caterina_LUFA/Caterina.hex
@@ -1,6 +1,6 @@
:1070000055C000006EC000006CC000006AC00000E7
:1070100068C0000066C0000064C0000062C00000DC
-:1070200060C000005EC00000B0C400005AC0000094
+:1070200060C000005EC00000BBC400005AC0000089
:1070300058C0000056C0000054C0000052C00000FC
:1070400050C0000078C000004CC000004AC00000E2
:1070500048C0000046C0000044C0000042C000001C
@@ -9,238 +9,240 @@
:1070800030C000002EC000002CC000002AC000004C
:1070900028C0000026C0000024C0000022C000005C
:1070A00020C000001EC000001CC0000011241FBE34
-:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0EEEA55
+:1070B000CFEFDAE0DEBFCDBF11E0A0E0B1E0E4EC5D
:1070C000FEE702C005900D92AE38B107D9F711E086
-:1070D000AEE8B1E001C01D92A43AB107E1F777D361
-:1070E000E4C68ECFF89410926F0010928100109237
+:1070D000AEE8B1E001C01D92A43AB107E1F78ED34A
+:1070E000EFC68ECFF89410926F001092810010922C
:1070F00085001092840081E085BF15BE47985D9A97
:10710000289A0C94000008952091980130919901DB
:107110002F5F3F4F3093990120939801932F37FFB2
:1071200003C08EEF831B982F990F921710F4479886
:107130000895479A08951F920F920FB60F92112447
-:107140008F939F93109285001092840080918E01FE
-:1071500090918F01009741F0019790938F01809358
-:107160008E01892B09F45D9A809190019091910193
-:10717000009741F001979093910180939001892BA2
-:1071800009F4289A8091920190919301019690932D
-:107190009301809392019F918F910F900FBE0F905A
-:1071A0001F90189584E08093E9000DC08091E8005D
-:1071B0008B778093E80003C08EB3882351F08091D1
-:1071C000E80082FFF9CF8091E80085FFEFCF809142
-:1071D000F1000895982F83E08093E9008091E80002
-:1071E00085FD0DC08091E8008E778093E80003C094
-:1071F0008EB3882369F08091E80080FFF9CF9093E7
-:10720000F1005D9884E690E090938F0180938E0169
-:1072100008954F925F926F927F928F929F92AF925A
-:10722000BF92CF92DF92EF92FF920F931F93CF9373
-:10723000DF9384E08093E9008091E80082FF4CC2F4
-:10724000289884E690E09093910180939001AADFC2
-:10725000182F853419F41092090103C0843519F4EC
-:10726000A1DF8DE00FC28C34E1F38035D1F3843798
-:1072700021F484E4AFDF80E005C2813611F489E5B2
-:1072800001C28134B1F48EDF182F8CDF90E0880FBB
-:10729000991FAA2797FDA095BA2F312F330F20E011
-:1072A000442737FD4095542F822B932BA42BB52BCD
-:1072B000BAC1803711F483E5E5C1833549F4C0E0F4
-:1072C000D1E0899187DF21E0C730D207D1F7DBC158
-:1072D000863521F481E37EDF80E3D4C1833731F446
-:1072E00087E878DF85E976DF8EE1CCC18536B9F4B1
-:1072F000E0E0F0E093E085E090935700E89507B672
-:1073000000FCFDCF80935700E89507B600FCFDCF49
-:10731000E058FF4FA0E7E030FA0771F7A2CF8C36B4
-:1073200051F440DF809599E0E1E0F0E0082E909381
-:107330005700E89596CF823739F4E1E0F0E089E034
-:107340008093570084919EC1863439F4E0E0F0E0E8
-:1073500089E080935700849195C18E3439F4E3E03D
-:10736000F0E089E08093570084918CC1813539F435
-:10737000E2E0F0E089E080935700849183C1823697
-:1073800031F489E527DF80E025DF80E87BC18234A6
-:1073900019F0873609F0DBC005DF082F03DFF82E70
-:1073A00001DF682E8554823008F06BC1902F80E099
-:1073B000CF2DD0E0C82BD92B173609F04BC081E177
-:1073C00080935700E895DD24CC24C3943FC0E0901F
-:1073D0009401F09095010091960110919701B6E407
-:1073E0006B16D9F4ED2DF0E0EE29FF29E4918E2FF4
-:1073F000F1DEDD2081F082E090E0A0E0B0E0E80E78
-:10740000F91E0A1F1B1FE0929401F0929501009350
-:10741000960110939701DC2418C0D801C701B695D6
-:10742000A795979587952BD5D5DE82E090E0A0E0D3
-:10743000B0E0E80EF91E0A1F1B1FE0929401F092C3
-:10744000950100939601109397012197209709F0D9
-:10745000BECF19C18090940190909501A0909601A3
-:10746000B090970196E4691609F05DC083E0F401DD
-:1074700080935700E89507B600FCFDCF54C0F6E4B2
-:107480006F1661F5772031F1E0909401F09095014D
-:10749000009196011091970185DED82ECC24852D80
-:1074A00090E08C299D29F7010C0140925700E89546
-:1074B000112482E090E0A0E0B0E0E80EF91E0A1F7F
-:1074C0001B1FE0929401F092950100939601109396
-:1074D000970102C067DE582E742423C0E090940107
-:1074E000F0909501009196011091970116950795DE
-:1074F000F794E79457DE682FC701C9D480919401AF
-:1075000090919501A0919601B09197010296A11DCD
-:10751000B11D8093940190939501A0939601B0932F
-:107520009701219704C0552477244424439420973D
-:1075300009F0A5CF96E4691609F093CE85E0F40131
-:1075400080935700E89507B600FCFDCF8ACE8334C0
-:1075500071F4009194011091950124DE90E021E0F6
-:10756000F8010C0120935700E89511247ACE833658
-:1075700019F5E0909401F090950100919601109119
-:10758000970110DEF701E16090E021E00C0120930B
-:107590005700E895112482E090E0A0E0B0E0E80E0A
-:1075A000F91E0A1F1B1FE0929401F09295010093AF
-:1075B00096011093970155CE8D3661F4E0919401B8
-:1075C000F091950185E080935700E89507B600FC9F
-:1075D000FDCF47CE823551F4E0919401F0919501B1
-:1075E00005911491812FF6DD802F4CC0843421F554
-:1075F000E0909401F090950100919601109197010F
-:1076000016950795F794E794CDDD682FC7013FD411
-:107610008091940190919501A0919601B09197016C
-:107620000296A11DB11D8093940190939501A093A2
-:107630009601B093970115CE843609F5E090940138
-:10764000F09095010091960110919701D801C70122
-:10765000B695A7959795879512D4BCDD82E090E00A
-:10766000A0E0B0E0E80EF91E0A1F1B1FE092940193
-:10767000F0929501009396011093970104C08B310D
-:1076800011F08FE3A7DD83E08093E9009091E8009B
-:107690008091E8008E778093E80095FF04C010C0C9
-:1076A0008EB38823C9F08091E80080FFF9CF8091E4
-:1076B000E8008E778093E80003C08EB3882361F0E2
-:1076C0008091E80080FFF9CF84E08093E900809109
-:1076D000E8008B778093E800DF91CF911F910F91A5
-:1076E000FF90EF90DF90CF90BF90AF909F908F90E2
-:1076F0007F906F905F904F90089590919C01892F9B
-:107700008F77813249F580919D018032A1F08132DD
-:1077100019F5913A09F58091E800877F8093E80098
-:107720008AE091E067E070E0E1D18091E8008B773A
-:107730008093E8000895913279F48091E800877F82
-:107740008093E8008AE091E067E070E033D28091B6
-:10775000E8008E778093E800089582E061EC42E0D3
-:107760008BD083E061E842E187D084E060E842E1C9
-:1077700083C084B7877F84BF88E10FB6F894809375
-:107780006000109260000FBE20E880E090E00FB62D
-:10779000F89420936100809361000FBE81E085BF63
-:1077A00092E095BF3F9A209A559AE1E6F0E0208357
-:1077B000108247985D9A289A109289008AEF8093E8
-:1077C000880090936F0083E080938100C6C0CF93C0
-:1077D000DF9388E10FB6F894809360001092600008
-:1077E0000FBEC7DF7894E0E0F0E0C591D49110C0FF
-:1077F00010DD33D3809192019091930181589E4383
-:1078000030F08FEFCF3FD80711F0109209017CDCE8
-:1078100080910901882361F78091E0008160809365
-:10782000E00060DC80E090E0DF91CF910895FA0104
-:10783000923071F0933089F0913029F481E191E038
-:1078400022E130E015C080E090E020E030E010C0A0
-:1078500083E291E02EE330E00BC0882329F481E637
-:1078600091E024E030E004C085E691E026E230E0DB
-:1078700091838083C90108958093E9008091EB0092
-:1078800081608093EB001092ED006093EC004093D8
-:10789000ED008091EE00881F8827881F0895809151
-:1078A0009C0188238CF403C08EB38823B1F08091AF
-:1078B000E80082FFF9CF8091E8008B778093E800A1
-:1078C00008958EB3882349F08091E80080FFF9CFB6
-:1078D0008091E8008E778093E8000895EF92FF9200
-:1078E0000F931F9345D04CD008ED10E0F801808134
-:1078F0008F77808380818068808380818F7D808383
-:1079000019BC1EBA10929A0180EEE82EF12CF701F4
-:1079100080818B7F8083F80180818160808380E01B
-:1079200060E042E0A9DFE1EEF0E080818E7F8083BD
-:10793000E2EEF0E0808181608083808188608083D6
-:10794000F70180818E7F8083F80180818061808350
-:107950001F910F91FF90EF900895E7EDF0E0808187
-:10796000816080838AE482BF81E080939B01B6CFEF
-:10797000E8EDF0E080818E7F80831092E200089530
-:107980001092DA001092E10008951F920F920FB644
-:107990000F9211242F933F934F935F936F937F9395
-:1079A0008F939F93AF93BF93EF93FF938091DA00F0
-:1079B00080FF1BC08091D80080FF17C08091DA0043
-:1079C0008E7F8093DA008091D90080FF0BC080E128
-:1079D00089BD82E189BD09B400FEFDCF81E08EBB87
-:1079E0003BD203C019BC1EBA37D28091E10080FFA0
-:1079F00017C08091E20080FF13C08091E2008E7F6B
-:107A00008093E2008091E20080618093E2008091A7
-:107A1000D80080628093D80019BC85E08EBB1CD250
-:107A20008091E10084FF2CC08091E20084FF28C097
-:107A300080E189BD82E189BD09B400FEFDCF80915E
-:107A4000D8008F7D8093D8008091E1008F7E809355
-:107A5000E1008091E2008F7E8093E2008091E2005D
-:107A600081608093E20080919A01882331F48091B3
-:107A7000E30087FD02C081E001C084E08EBBECD151
-:107A80008091E10083FF21C08091E20083FF1DC04F
-:107A90008091E100877F8093E10082E08EBB1092AD
-:107AA0009A018091E1008E7F8093E1008091E20055
-:107AB0008E7F8093E2008091E20080618093E200FB
-:107AC00080E060E042E0D8DEC7D1FF91EF91BF9146
-:107AD000AF919F918F917F916F915F914F913F9166
-:107AE0002F910F900FBE0F901F9018959C01409101
-:107AF000A2015091A3014617570718F4F90190E02D
-:107B000044C06115710511F0AB01F8CF8091E80018
-:107B10008E778093E80040E050E0F0CF8EB388236A
-:107B200009F444C0853009F443C08091E80083FF24
-:107B300002C081E008958091E80082FD31C080910B
-:107B4000E80080FF22C08091F3009091F200782F2E
-:107B500060E0292F30E0262B372B07C081918093DE
-:107B6000F100415050402F5F3F4F4115510519F032
-:107B70002830310598F390E02830310509F491E080
-:107B80008091E8008E778093E8004115510531F629
-:107B9000992321F605C08EB3882341F0853041F04A
-:107BA0008091E80082FFF7CF80E0089582E0089599
-:107BB00083E008959C016115710529F48091E80026
-:107BC0008B778093E800F90126C08EB3882391F16A
-:107BD000853091F18091E80083FF02C081E0089533
-:107BE0008091E80082FFF1CF06C08091F10081937F
-:107BF0006150704059F02091F3008091F200322FD3
-:107C000020E090E0822B932B892B79F78091E8007C
-:107C10008B778093E80061157105B9F605C08EB3C6
-:107C2000882341F0853041F08091E80080FFF7CF54
-:107C300080E0089582E0089583E008950F931F93F4
-:107C4000DF93CF9300D0CDB7DEB7ECE9F1E08091C0
-:107C5000F100819381E0E43AF807C9F74EDD8091A5
-:107C6000E80083FFE4C080919C0190919D019530D4
-:107C700009F46DC0963040F4913081F1913070F08C
-:107C8000933009F0D4C02AC0983009F4A3C09930C9
-:107C900009F4B2C0963009F0CAC07CC0803809F43B
-:107CA000C6C0823809F0C3C08091A001877080935C
-:107CB000E9008091EB001092E9002091E800277F15
-:107CC0002093E80090E025E0969587952A95E1F7C6
-:107CD00081708093F1001092F10087C0882319F021
-:107CE000823009F0A4C08F71823009F0A0C0809169
-:107CF0009E01882331F52091A001277009F497C0D7
-:107D00002093E9008091EB0080FF1BC0933021F4A9
-:107D10008091EB00806213C08091EB0080618093C2
-:107D2000EB0081E090E002C0880F991F2A95E2F7EE
-:107D30008093EA001092EA008091EB0088608093C3
-:107D4000EB001092E9008091E800877F51C0882302
-:107D500009F06DC010919E011F770FB7F8948091C4
-:107D6000E800877F8093E8009ADD8091E80080FF3B
-:107D7000FCCF8091E3008078812B8093E3008068C2
-:107D80008093E300112311F482E001C083E08EBBF5
-:107D90000FBF4DC08058823008F049C080919E01CD
-:107DA00090919F016091A001AE014F5F5F4F3FDD59
-:107DB000BC01009709F43BC08091E800877F809365
-:107DC000E80089819A8192DE8091E8008B77809328
-:107DD000E8002DC0803859F58091E800877F8093B6
-:107DE000E80080919A018093F1008091E8008E77FD
-:107DF0008093E80054DD1BC08823C9F490919E0154
-:107E00009230A8F48091E800877F8093E8009093F7
-:107E10009A0145DD80919A01882331F48091E30035
-:107E200087FD02C081E001C084E08EBB96DC8091BA
-:107E3000E80083FF0AC08091EB0080628093EB0032
-:107E40008091E800877F8093E8000F900F90CF919A
-:107E5000DF911F910F91089508951F938EB388238A
-:107E600061F01091E9001092E9008091E80083FF31
-:107E700001C0E4DE17701093E9001F910895F9998D
-:107E8000FECF92BD81BDF89A992780B50895262F1F
-:107E9000F999FECF1FBA92BD81BD20BD0FB6F894EF
-:0E7EA000FA9AF99A0FBE01960895F894FFCF52
-:107EAE004341544552494E4100010000000000007C
-:107EBE00081201100102000008EB034A2001000025
-:107ECE0001000109023E0002010080320904000097
-:107EDE0001020201000524001001042402040524FD
-:107EEE00060001070582030800FF09040100020ACB
-:107EFE0000000007050402100001070583021000B0
-:107F0E0001040309042603410056005200200043D9
-:107F1E000044004300200042006F006F0074006CAC
-:0E7F2E00006F0061006400650072000000003A
+:107140002F938F939F93EF93FF931092850010924C
+:10715000840080918E0190918F01009741F00197FA
+:1071600090938F0180938E01892B09F45D9A809111
+:10717000900190919101009741F0019790939101B6
+:1071800080939001892B09F4289AE0E0F0E0859142
+:1071900094918F5F9F4F49F080919201909193015C
+:1071A00001969093930180939201FF91EF919F91AB
+:1071B0008F912F910F900FBE0F901F90189584E024
+:1071C0008093E9000DC08091E8008B778093E80000
+:1071D00003C08EB3882351F08091E80082FFF9CF7D
+:1071E0008091E80085FFEFCF8091F1000895982FFE
+:1071F00083E08093E9008091E80085FD0DC08091D7
+:10720000E8008E778093E80003C08EB3882369F08E
+:107210008091E80080FFF9CF9093F1005D9884E6BB
+:1072200090E090938F0180938E0108954F925F922A
+:107230006F927F928F929F92AF92BF92CF92DF9286
+:10724000EF92FF920F931F93CF93DF9384E080938D
+:10725000E9008091E80082FF56C2289884E690E019
+:107260009093910180939001AADF182F853419F42F
+:107270001092090103C0843519F4A1DF8DE019C211
+:107280008C34E1F38035D1F3843721F484E4AFDF2B
+:1072900080E00FC2813611F489E50BC28134B1F46C
+:1072A0008EDF182F8CDF90E0880F991FAA2797FD9B
+:1072B000A095BA2F312F330F20E0442737FD40959A
+:1072C000542F822B932BA42BB52BC4C1803711F4E0
+:1072D00083E5EFC1833549F4C0E0D1E0899187DFD0
+:1072E00021E0C730D207D1F7E5C1863521F481E32B
+:1072F0007EDF80E3DEC1833731F487E878DF85E91C
+:1073000076DF8EE1D6C18536B9F4E0E0F0E093E0B7
+:1073100085E090935700E89507B600FCFDCF809379
+:107320005700E89507B600FCFDCFE058FF4FA0E7F7
+:10733000E030FA0771F7A2CF8C3651F440DF809528
+:1073400099E0E1E0F0E0082E90935700E89596CFA1
+:10735000823739F4E1E0F0E089E0809357008491CE
+:10736000A8C1863439F4E0E0F0E089E0809357006A
+:1073700084919FC18E3439F4E3E0F0E089E080939A
+:107380005700849196C1813539F4E2E0F0E089E05C
+:107390008093570084918DC1823631F489E527DFCF
+:1073A00080E025DF80E885C1823419F0873609F056
+:1073B000E5C0109293011092920101DF082FFFDEC9
+:1073C000F82EFDDE682E8554823008F071C1902FB2
+:1073D00080E0CF2DD0E0C82BD92B10926F0017364C
+:1073E00009F04BC081E180935700E895DD24CC245F
+:1073F000C3943FC0E0909401F090950100919601F4
+:1074000010919701B6E46B16D9F4ED2DF0E0EE295A
+:10741000FF29E4918E2FEBDEDD2081F082E090E009
+:10742000A0E0B0E0E80EF91E0A1F1B1FE0929401D5
+:10743000F09295010093960110939701DC2418C0F7
+:10744000D801C701B695A7959795879523D5CFDE27
+:1074500082E090E0A0E0B0E0E80EF91E0A1F1B1FDA
+:10746000E0929401F0929501009396011093970198
+:107470002197209709F0BECF7DC080909401909015
+:107480009501A0909601B090970196E4691609F0D5
+:107490005DC083E0F40180935700E89507B600FCD7
+:1074A000FDCF54C0F6E46F1661F5772031F1E0901E
+:1074B0009401F090950100919601109197017FDE63
+:1074C000D82ECC24852D90E08C299D29F7010C0124
+:1074D00040925700E895112482E090E0A0E0B0E0EF
+:1074E000E80EF91E0A1F1B1FE0929401F09295010D
+:1074F000009396011093970102C061DE582E742408
+:1075000023C0E0909401F0909501009196011091B4
+:10751000970116950795F794E79451DE682FC701F8
+:10752000C1D48091940190919501A0919601B09160
+:1075300097010296A11DB11D80939401909395012E
+:10754000A0939601B0939701219704C05524772406
+:1075500044244394209709F0A5CF96E4691641F49A
+:1075600085E0F40180935700E89507B600FCFDCF55
+:107570008DE03DDE82E080936F009CC0833471F427
+:1075800000919401109195011ADE90E021E0F8013C
+:107590000C0120935700E895112470CE833619F51D
+:1075A000E0909401F090950100919601109197015F
+:1075B00006DEF701E16090E021E00C012093570026
+:1075C000E895112482E090E0A0E0B0E0E80EF91E1A
+:1075D0000A1F1B1FE0929401F092950100939601FF
+:1075E000109397014BCE8D3661F4E0919401F091A8
+:1075F000950185E080935700E89507B600FCFDCF24
+:107600003DCE823551F4E0919401F09195010591C0
+:107610001491812FECDD802F4CC0843421F5E09053
+:107620009401F090950100919601109197011695A3
+:107630000795F794E794C3DD682FC70133D4809191
+:10764000940190919501A0919601B09197010296B5
+:10765000A11DB11D8093940190939501A093960173
+:10766000B09397010BCE843609F5E0909401F09029
+:1076700095010091960110919701D801C701B69527
+:10768000A7959795879506D4B2DD82E090E0A0E0BB
+:10769000B0E0E80EF91E0A1F1B1FE0929401F09261
+:1076A0009501009396011093970104C08B3111F05E
+:1076B0008FE39DDD83E08093E9009091E800809165
+:1076C000E8008E778093E80095FF04C010C08EB369
+:1076D0008823C9F08091E80080FFF9CF8091E8000D
+:1076E0008E778093E80003C08EB3882361F0809189
+:1076F000E80080FFF9CF84E08093E9008091E80002
+:107700008B778093E800DF91CF911F910F91FF90CD
+:10771000EF90DF90CF90BF90AF909F908F907F9031
+:107720006F905F904F90089590919C01892F8F7773
+:10773000813249F580919D018032A1F0813219F5A5
+:10774000913A09F58091E800877F8093E8008AE00C
+:1077500091E067E070E0D5D18091E8008B7780936D
+:10776000E8000895913279F48091E800877F809352
+:10777000E8008AE091E067E070E027D28091E800BD
+:107780008E778093E800089582E061EC42E07FD03C
+:1077900083E061E842E17BD084E060E842E177C0C9
+:1077A00084B7877F84BF88E10FB6F8948093600028
+:1077B000109260000FBE20E880E090E00FB6F894D1
+:1077C00020936100809361000FBE81E085BF92E04D
+:1077D00095BF3F9A209A559AE1E6F0E02083108207
+:1077E00047985D9A289A109289008AEF80938800C2
+:1077F00090936F0083E080938100BAC088E10FB658
+:10780000F89480936000109260000FBEC9DF7894F6
+:107810000CC00CDD2DD38091920190919301815881
+:107820009E4310F0109209016FDC809109018823BA
+:1078300081F78091E00081608093E00053DC80E07C
+:1078400090E00895FA01923071F0933089F0913010
+:1078500029F481E191E022E130E015C080E090E080
+:1078600020E030E010C083E291E02EE330E00BC076
+:10787000882329F481E691E024E030E004C085E625
+:1078800091E026E230E091838083C90108958093DE
+:10789000E9008091EB0081608093EB001092ED0095
+:1078A0006093EC004093ED008091EE00881F8827E4
+:1078B000881F089580919C0188238CF403C08EB3A7
+:1078C0008823B1F08091E80082FFF9CF8091E80031
+:1078D0008B778093E80008958EB3882349F08091D8
+:1078E000E80080FFF9CF8091E8008E778093E80070
+:1078F0000895EF92FF920F931F9345D04CD008ED5F
+:1079000010E0F80180818F77808380818068808398
+:1079100080818F7D808319BC1EBA10929A0180EEFF
+:10792000E82EF12CF70180818B7F8083F801808124
+:107930008160808380E060E042E0A9DFE1EEF0E07A
+:1079400080818E7F8083E2EEF0E0808181608083A1
+:10795000808188608083F70180818E7F8083F80139
+:107960008081806180831F910F91FF90EF90089537
+:10797000E7EDF0E08081816080838AE482BF81E06E
+:1079800080939B01B6CFE8EDF0E080818E7F80830D
+:107990001092E20008951092DA001092E10008952A
+:1079A0001F920F920FB60F9211242F933F934F9374
+:1079B0005F936F937F938F939F93AF93BF93EF9357
+:1079C000FF938091DA0080FF1BC08091D80080FF78
+:1079D00017C08091DA008E7F8093DA008091D90001
+:1079E00080FF0BC080E189BD82E189BD09B400FE42
+:1079F000FDCF81E08EBB3BD203C019BC1EBA37D28B
+:107A00008091E10080FF17C08091E20080FF13C0E9
+:107A10008091E2008E7F8093E2008091E20080619D
+:107A20008093E2008091D80080628093D80019BCD6
+:107A300085E08EBB1CD28091E10084FF2CC0809138
+:107A4000E20084FF28C080E189BD82E189BD09B4DC
+:107A500000FEFDCF8091D8008F7D8093D80080916B
+:107A6000E1008F7E8093E1008091E2008F7E809321
+:107A7000E2008091E20081608093E20080919A01AF
+:107A8000882331F48091E30087FD02C081E001C0CA
+:107A900084E08EBBECD18091E10083FF21C0809116
+:107AA000E20083FF1DC08091E100877F8093E100A9
+:107AB00082E08EBB10929A018091E1008E7F8093CC
+:107AC000E1008091E2008E7F8093E2008091E200ED
+:107AD00080618093E20080E060E042E0D8DEC7D1C0
+:107AE000FF91EF91BF91AF919F918F917F916F9196
+:107AF0005F914F913F912F910F900FBE0F901F906C
+:107B000018959C014091A2015091A3014617570777
+:107B100018F4F90190E044C06115710511F0AB0152
+:107B2000F8CF8091E8008E778093E80040E050E045
+:107B3000F0CF8EB3882309F444C0853009F443C0E4
+:107B40008091E80083FF02C081E008958091E80001
+:107B500082FD31C08091E80080FF22C08091F30057
+:107B60009091F200782F60E0292F30E0262B372B00
+:107B700007C081918093F100415050402F5F3F4FEB
+:107B80004115510519F02830310598F390E028305F
+:107B9000310509F491E08091E8008E778093E80048
+:107BA0004115510531F6992321F605C08EB388237E
+:107BB00041F0853041F08091E80082FFF7CF80E00E
+:107BC000089582E0089583E008959C016115710590
+:107BD00029F48091E8008B778093E800F90126C0B2
+:107BE0008EB3882391F1853091F18091E80083FF75
+:107BF00002C081E008958091E80082FFF1CF06C0C5
+:107C00008091F10081936150704059F02091F30010
+:107C10008091F200322F20E090E0822B932B892B71
+:107C200079F78091E8008B778093E8006115710502
+:107C3000B9F605C08EB3882341F0853041F08091BC
+:107C4000E80080FFF7CF80E0089582E0089583E0A8
+:107C500008950F931F93DF93CF9300D0CDB7DEB776
+:107C6000ECE9F1E08091F100819381E0E43AF807DA
+:107C7000C9F75ADD8091E80083FFE4C080919C0140
+:107C800090919D01953009F46DC0963040F491308B
+:107C900081F1913070F0933009F0D4C02AC098304F
+:107CA00009F4A3C0993009F4B2C0963009F0CAC0F3
+:107CB0007CC0803809F4C6C0823809F0C3C0809106
+:107CC000A00187708093E9008091EB001092E90099
+:107CD0002091E800277F2093E80090E025E096952A
+:107CE00087952A95E1F781708093F1001092F10059
+:107CF00087C0882319F0823009F0A4C08F718230C8
+:107D000009F0A0C080919E01882331F52091A00147
+:107D1000277009F497C02093E9008091EB0080FF61
+:107D20001BC0933021F48091EB00806213C08091DE
+:107D3000EB0080618093EB0081E090E002C0880F4F
+:107D4000991F2A95E2F78093EA001092EA00809149
+:107D5000EB0088608093EB001092E9008091E800CE
+:107D6000877F51C0882309F06DC010919E011F7755
+:107D70000FB7F8948091E800877F8093E8009ADD40
+:107D80008091E80080FFFCCF8091E3008078812B18
+:107D90008093E30080688093E300112311F482E074
+:107DA00001C083E08EBB0FBF4DC08058823008F009
+:107DB00049C080919E0190919F016091A001AE0108
+:107DC0004F5F5F4F3FDDBC01009709F43BC08091DE
+:107DD000E800877F8093E80089819A8192DE809114
+:107DE000E8008B778093E8002DC0803859F58091AA
+:107DF000E800877F8093E80080919A018093F100EA
+:107E00008091E8008E778093E80054DD1BC08823C2
+:107E1000C9F490919E019230A8F48091E800877F88
+:107E20008093E80090939A0145DD80919A01882320
+:107E300031F48091E30087FD02C081E001C084E05D
+:107E40008EBBA2DC8091E80083FF0AC08091EB002A
+:107E500080628093EB008091E800877F8093E80048
+:107E60000F900F90CF91DF911F910F91089508957A
+:107E70001F938EB3882361F01091E9001092E900FE
+:107E80008091E80083FF01C0E4DE17701093E900E1
+:107E90001F910895F999FECF92BD81BDF89A992757
+:107EA00080B50895262FF999FECF1FBA92BD81BDE6
+:107EB00020BD0FB6F894FA9AF99A0FBE019608956C
+:047EC000F894FFCF64
+:107EC4004341544552494E41000100000000000066
+:107ED400081201100102000008EB034A200100000F
+:107EE40001000109023E0002010080320904000081
+:107EF40001020201000524001001042402040524E7
+:107F0400060001070582030800FF09040100020AB4
+:107F14000000000705040210000107058302100099
+:107F240001040309042603410056005200200043C3
+:107F34000044004300200042006F006F0074006C96
+:0E7F4400006F00610064006500720000000024
:040000030000700089
:00000001FF