From: Erik Andresen Date: Thu, 7 May 2015 11:37:34 +0000 (+0200) Subject: avr/nano: added srf sensors X-Git-Url: https://defiant.homedns.org/gitweb/?a=commitdiff_plain;h=b039f1fc2f0d99f315139b441b49cc5386da1459;p=ros_wild_thumper.git avr/nano: added srf sensors --- diff --git a/avr/nano/main.c b/avr/nano/main.c index 0cb0acf..5418055 100644 --- a/avr/nano/main.c +++ b/avr/nano/main.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "uart.h" /* @@ -13,6 +14,10 @@ * 0x02 Distance left LSB * 0x03 Distance right MSB * 0x04 Distance right LSB + * 0x05 Distance forward MSB + * 0x06 Distance forward LSB + * 0x07 Distance backward MSB + * 0x08 Distance backward LSB * * 0xff Bootloader */ @@ -26,6 +31,10 @@ static volatile uint8_t ireg=0; static volatile uint8_t bootloader=0; static volatile uint16_t dist_left=0; static volatile uint16_t dist_right=0; +static volatile uint16_t dist_forward=0; +static volatile uint16_t dist_backward=0; +static volatile uint8_t start_dist_fwd=0; +static volatile uint8_t start_dist_bwd=0; ISR(TWI_vect) { @@ -41,6 +50,10 @@ ISR(TWI_vect) switch(ireg) { case 0x00: // register select ireg = TWDR; + + if (ireg == 0x05) start_dist_fwd=1; + if (ireg == 0x07) start_dist_bwd=1; + ireg--; // because we do ireg++ below TWI_ACK; break; @@ -72,6 +85,24 @@ ISR(TWI_vect) TWDR = tmp16; TWI_ACK; break; + case 0x05: // Distance forward MSB + tmp16 = dist_forward; + TWDR = tmp16>>8; + TWI_ACK; + break; + case 0x06: // Distance forward LSB + TWDR = tmp16; + TWI_ACK; + break; + case 0x07: // Distance backward MSB + tmp16 = dist_backward; + TWDR = tmp16>>8; + TWI_ACK; + break; + case 0x08: // Distance backward LSB + TWDR = tmp16; + TWI_ACK; + break; default: TWDR = 0; TWI_NAK; @@ -128,6 +159,40 @@ static unsigned short get_distance(uint8_t i) { } +ISR(INT0_vect) { + static uint16_t t_start=0; + uint16_t t_now = TCNT1; + uint16_t t_diff; + + if (bit_is_set(PIND, 2)) { // high level + // start timer + t_start = t_now; + } else { + t_diff = t_now - t_start; + dist_forward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm + // disable this interrupt + EIMSK |= (1 << INT0); + } +} + + +ISR(INT1_vect) { + static uint16_t t_start=0; + uint16_t t_now = TCNT1; + uint16_t t_diff; + + if (bit_is_set(PIND, 3)) { // high level + // start timer + t_start = t_now; + } else { + t_diff = t_now - t_start; + dist_backward = t_diff*2.7586 + 0.5; // t [µs] / 580 = mm + // disable this interrupt + EIMSK |= (1 << INT1); + } +} + + int main(void) { bootloader = 0x00; setup_uart(9600); @@ -137,16 +202,23 @@ int main(void) { TWAR = 0x52; TWI_RESET; + // Timer 1: Normal mode, Top: 0xffff, Prescaler: F_CPU/256=62500Hz + TCCR1A = 0x0; + TCCR1B = (1 << CS12); + + // External Interrupts + EICRA = (1 << ISC10) | (1 << ISC00); + printf("\r\nStart\r\n"); set_sleep_mode(SLEEP_MODE_IDLE); sei(); while(1) { switch(ireg) { - case 1: // ir left + case 0x01: // ir left dist_left = get_distance(0); break; - case 3: // ir right + case 0x03: // ir right dist_right = get_distance(1); break; case 0xff: // Magic reg that starts the bootloader @@ -160,6 +232,31 @@ int main(void) { break; } + if (start_dist_fwd) { + start_dist_fwd = 0; + dist_forward = 0; + + DDRD |= (1 << 2); + PORTD |= (1 << 2); + _delay_us(10); + PORTD &= ~(1 << 2); + DDRD &= ~(1 << 2); + // wait for interrupt + EIMSK |= (1 << INT0); + } + if (start_dist_bwd) { + start_dist_bwd = 0; + dist_backward = 0; + + DDRD |= (1 << 3); + PORTD |= (1 << 3); + _delay_us(10); + PORTD &= ~(1 << 3); + DDRD &= ~(1 << 3); + // wait for interrupt + EIMSK |= (1 << INT1); + } + sleep_mode(); } diff --git a/avr/nano/main.hex b/avr/nano/main.hex index c6b1c2d..faac092 100644 --- a/avr/nano/main.hex +++ b/avr/nano/main.hex @@ -1,204 +1,283 @@ -:100000000C9440000C945D000C945D000C945D0019 -:100010000C945D000C945D000C945D000C945D00EC -:100020000C945D000C945D000C945D000C945D00DC -:100030000C945D000C945D000C945D000C945D00CC -:100040000C945D000C945D000C9401010C945D0017 -:100050000C945D000C945D000C945D000C945D00AC -:100060000C945F000C945D00454647656667002070 -:100070002B2D2E3031323334353637383968000085 -:1000800011241FBECFEFD8E0DEBFCDBF11E0A0E04E -:10009000B1E0EEE9FCE002C005900D92A031B1079D -:1000A000D9F721E0A0E1B1E001C01D92AD38B2075F -:1000B000E1F70E940A020C944D060C9400001F9276 -:1000C0000F920FB60F9211248F939F938091B900D6 -:1000D000887F803879F048F4803609F04DC085EC8F -:1000E0008093BC00109217014FC0883AC1F0883B42 -:1000F000B1F042C080911701882339F08F3F99F504 -:100100008091BB00809316012EC08091BB0080932C -:1001100017018091170181508093170120C08091B1 -:1001200017018230C1F038F48130D9F48091140184 -:100130009091150109C0833019F0843061F011C02D -:1001400080911201909113018093100190931101FD -:100150009093BB0004C0809110018093BB0085EC9C -:1001600003C01092BB0085E88093BC00809117010A -:100170008F5F8093170108C08091BC008B7E8093B5 -:10018000BC0085EC8093BC009F918F910F900FBEB7 -:100190000F901F90189593E890937A0080937C00BD -:1001A00080917C00806C80937C0080917A008064D8 -:1001B00080937A0080917A0086FDFCCF8091780050 -:1001C0009091790045E080E090E020917A002064F1 -:1001D00020937A0020917A0026FDFCCF20917800B0 -:1001E00030917900820F931F415079F720917A0066 -:1001F0002F7720937A0065E070E00E949B03CB018B -:1002000008951F920F920FB60F9211248F939F9310 -:10021000EF93FF938091C00087FF17C0E0911A0110 -:10022000F0911B018091C600808381E0EF37F807D1 -:1002300030F43196F0931B01E0931A0106C08CE173 -:1002400091E090931B0180931A01FF91EF919F9190 -:100250008F910F900FBE0F901F9018959C01E1ECAD -:10026000F0E0808188618083808180688083E2EC17 -:10027000F0E080818660808340E050E084E0220FDF -:10028000331F441F551F8A95D1F760E074E284EF55 -:1002900090E00E94AF03DA01C9010197A109B109F9 -:1002A000892F9A2FAB2FBB27A7FDBA958093C50046 -:1002B00021502093C4008CE191E090931901809328 -:1002C000180190931B0180931A0108952091C0009A -:1002D00025FFFCCFFC0180818093C6000895CF9359 -:1002E000DF931F92CDB7DEB78983CE0101960E94BE -:1002F000660180E090E00F90DF91CF910895CF9359 -:10030000DF93EC01CE012196FC012081222319F01C -:100310000E946601F7CFDF91CF9108958091C000D0 -:1003200087FFFCCF8091C60090E008950C948E0169 -:1003300066E971E08FE691E00C94FB03CF93DF93C5 -:10034000FC01E253FF4FA081B181EC01C453DF4FA8 -:1003500028813981A217B307B9F02091C00025FF89 -:1003600013C02C912093C60020813181AC014553EC -:100370005F4F2417350718F42F5F3F4F03C09C01D0 -:1003800028593F4F31832083E0911801F0911901E2 -:1003900020911A0130911B012E173F07C1F1DC019A -:1003A000AC59BF4FCD91DC911197208128836D917D -:1003B0007C9111979C012B523F4FE9013881EB0151 -:1003C0002881321307C09C012C523F4FE90148811C -:1003D0004F5F48839C012D593F4F6217730728F4E4 -:1003E000EB012196CD93DC9302C08D939C93D1E0D9 -:1003F000EF37FD0730F43196F0931901E0931801BF -:1004000006C08CE191E09093190180931801DF916F -:10041000CF9108951092160180E895E20E942E0176 -:100420000E94980182E58093BA008091BC008B7E87 -:100430008093BC0085EC8093BC0086E091E00E9434 -:10044000780483B7817F83BF7894C0E0D8E180913E -:100450001701833061F08F3F91F08130B9F480E073 -:100460000E94CB0090931501809314010FC081E08E -:100470000E94CB00909313018093120107C08091DA -:100480001601853A19F4F894FE01099583B7816045 -:1004900083BF889583B78E7F83BFD9CF6F927F92BA -:1004A0009F92AF92BF92CF92DF92EF92FF920F9303 -:1004B0001F93CF93DF93CDB7DEB72C970FB6F89489 -:1004C000DEBF0FBECDBF8C017B013A01FC0117825C -:1004D0001682838181FF19C1CE0101965C01F8016A -:1004E000D380F701D3FC2591D3FE21917F012223F4 -:1004F00009F407C1253249F4D3FC2591D3FE21919B -:100500007F01253211F0912C1BC0B801822F90E0A1 -:100510000E94460463013601E2CF222309F4F1C0B0 -:10052000622F70E08FE690E02C870E94F0032C850C -:10053000892B49F0F701D3FC2591D3FE21917F014E -:1005400097FEEBCF0CC0233221F4F92DF0619F2EE2 -:10055000F1CF2C3639F4292D2068922EEBCF2223AF -:1005600009F4CFC0622F70E088E690E02C870E94EB -:10057000F0032C85892B41F06301F4E0CF0ED11CF0 -:10058000B8018FE390E012C0233641F0233789F0A1 -:10059000233521F5F92DF1609F2E0BC0630122E078 -:1005A000C20ED11CB801F301808191810E944604E2 -:1005B000B2CF630122E0C20ED11CF30160807180D2 -:1005C000F30190FC859190FE81913F01882309F40D -:1005D000A2CFB80190E00E944604F2CF243611F079 -:1005E000293639F5630197FE09C0F4E0CF0ED11C1E -:1005F000F30160817181828193810AC0F2E0CF0EA4 -:10060000D11CF30160817181882777FD8095982F37 -:10061000F92DFF7E9F2E97FF09C0909580957095CC -:1006200061957F4F8F4F9F4FF0649F2E2AE030E0FF -:1006300038C02037A1F040F42835D1F02F3609F02A -:1006400060C028E030E019C0253719F0283751F094 -:1006500058C0292D2F7E922E2AE030E00EC0892D21 -:100660008061982E992D9462992E20E130E005C08A -:10067000E92DE4609E2E20E132E0630197FE09C07F -:10068000F4E0CF0ED11CF3016081718182819381EE -:1006900008C0F2E0CF0ED11CF3016081718180E0CF -:1006A00090E0A5010E94A504782E7A1896FE05C058 -:1006B000B8018DE290E00E94460494FE16C0FE014F -:1006C000E70DF11D8081803381F0B80180E390E077 -:1006D0000E94460492FE09C0292D2072822F90E0CC -:1006E000B801885A9F4F0E9446047A94F501E70D9D -:1006F000F11D8081B80190E00E9446047110F5CF91 -:100700000ACFF8018681978102C08FEF9FEF2C9668 -:100710000FB6F894DEBF0FBECDBFDF91CF911F9112 -:100720000F91FF90EF90DF90CF90BF90AF909F9090 -:100730007F906F900895AA1BBB1B51E107C0AA1FB1 -:10074000BB1FA617B70710F0A61BB70B881F991F72 -:100750005A95A9F780959095BC01CD010895052E75 -:1007600097FB1EF400940E94C60357FD07D00E9419 -:10077000CE0307FC03D04EF40C94C603509540956D -:10078000309521953F4F4F4F5F4F0895909580953D -:10079000709561957F4F8F4F9F4F0895A1E21A2E5C -:1007A000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F15 -:1007B000A217B307E407F50720F0A21BB30BE40B65 -:1007C000F50B661F771F881F991F1A9469F76095AC -:1007D0007095809590959B01AC01BD01CF01089566 -:1007E000FC010590061621F00020D9F7C0010895FC -:1007F0003197CF0108950F931F93CF93DF93EC01AF -:100800008B01009731F46115710519F480E090E0D7 -:1008100038C06EE070E081E090E00E940305FC01CA -:100820000097A1F380E883830115110571F0138708 -:10083000028781E883838091830190918401892BD1 -:1008400021F4F0938401E09383012097C9F0D187CC -:10085000C087838182608383809185019091860126 -:10086000892B71F4F0938601E093850180918701D3 -:1008700090918801892B21F4F0938801E0938701FE -:10088000CF01DF91CF911F910F9108950F931F9387 -:10089000CF93DF93182F092FEB018B8181FD03C0CC -:1008A0008FEF9FEF20C082FF10C04E815F812C81AF -:1008B0003D81421753077CF4E881F9819F012F5F46 -:1008C0003F4F39832883108306C0E885F985812F3F -:1008D0000995892B29F72E813F812F5F3F4F3F8359 -:1008E0002E83812F902FDF91CF911F910F9108952B -:1008F0000F931F93CF93DF93E0918501F0918601D1 -:10090000238121FF1BC0EC0100E010E08991609180 -:10091000850170918601DB011896ED91FC91199784 -:10092000882331F00995892B89F30FEF1FEFEECF64 -:100930008AE00995892B11F4C80102C08FEF9FEF5F -:10094000DF91CF911F910F910895FA01AA272830C6 -:1009500051F1203181F1E8946F936E7F6E5F7F4F8C -:100960008F4F9F4FAF4FB1E03ED0B4E03CD0670F08 -:10097000781F891F9A1FA11D680F791F8A1F911D5B -:10098000A11D6A0F711D811D911DA11D20D009F4AB -:1009900068943F912AE0269F11243019305D3193ED -:1009A000DEF6CF010895462F4770405D4193B3E0D6 -:1009B0000FD0C9F7F6CF462F4F70405D4A3318F07D -:1009C000495D31FD4052419302D0A9F7EACFB4E02E -:1009D000A6959795879577956795BA95C9F70097E6 -:1009E0006105710508959B01AC010A2E0694579587 -:1009F000479537952795BA95C9F7620F731F841FDE -:100A0000951FA01D08950F931F93CF93DF93869F8B -:100A10008001879F100D969F100D1124C8010E9420 -:100A20001F05EC01009729F0A80160E070E00E942A -:100A30004606CE01DF91CF911F910F910895CF937C -:100A4000DF938230910510F482E090E0E0918B0119 -:100A5000F0918C0120E030E0A0E0B0E0309739F177 -:100A60004081518148175907B8F04817590771F468 -:100A700082819381109729F013969C938E931297FD -:100A80002CC090938C0180938B0127C021153105D8 -:100A900031F04217530718F0A901DB0101C0EF0143 -:100AA0009A01BD01DF010280F381E02DD7CF21152E -:100AB0003105F9F0281B390B2430310580F48A8187 -:100AC0009B816115710521F0FB019383828304C032 -:100AD00090938C0180938B01FE01329644C0FE01FD -:100AE000E20FF31F819391932250310939832883B8 -:100AF0003AC02091890130918A01232B41F4209141 -:100B000002013091030130938A01209389012091E1 -:100B10000001309101012115310541F42DB73EB797 -:100B20004091040150910501241B350BE09189018E -:100B3000F0918A01E217F307A0F42E1B3F0B281750 -:100B4000390778F0AC014E5F5F4F2417350748F046 -:100B50004E0F5F1F50938A014093890181939193B7 -:100B600002C0E0E0F0E0CF01DF91CF910895CF9394 -:100B7000DF93009709F487C0FC0132971382128239 -:100B8000C0918B01D0918C01209781F4208131811B -:100B9000280F391F8091890190918A01821793074C -:100BA00079F5F0938A01E09389016DC0DE0120E0C0 -:100BB00030E0AE17BF0750F412964D915C91139739 -:100BC0009D014115510509F1DA01F3CFB383A283E9 -:100BD00040815181840F951F8A179B0771F48D9175 -:100BE0009C911197840F951F029691838083129692 -:100BF0008D919C911397938382832115310529F45C -:100C0000F0938C01E0938B013EC0D9011396FC93C5 -:100C1000EE9312974D915D91A40FB51FEA17FB0754 -:100C200079F480819181840F951F0296D9011196E4 -:100C30009C938E938281938113969C938E931297AB -:100C4000E0E0F0E08A819B81009719F0FE01EC0161 -:100C5000F9CFCE01029628813981820F931F20910E -:100C6000890130918A012817390769F4309729F4EE -:100C700010928C0110928B0102C013821282D093C9 -:100C80008A01C0938901DF91CF910895DC0101C0F1 -:0E0C90006D9341505040E0F70895F894FFCF67 -:100C9E0000008D0120000D0A53746172740D000066 +:100000000C9448000C942A010C9475010C94650022 +:100010000C9465000C9465000C9465000C946500CC +:100020000C9465000C9465000C9465000C946500BC +:100030000C9465000C9465000C9465000C946500AC +:100040000C9465000C9465000C94C0010C94650040 +:100050000C9465000C9465000C9465000C9465008C +:100060000C9467000C946500B600D000BB00D00073 +:10007000C600D000CB00D00045464765666700202B +:100080002B2D2E3031323334353637383968000075 +:1000900011241FBECFEFD8E0DEBFCDBF11E0A0E03E +:1000A000B1E0E8E8F1E102C005900D92A031B1079E +:1000B000D9F721E0A0E1B1E001C01D92A739B20754 +:1000C000E1F70E94C9020C94C2080C9400001F9230 +:1000D0000F920FB60F9211248F939F93AF93BF93FC +:1000E000EF93FF938091B900887F803879F048F4CE +:1000F000803609F066C085EC8093BC001092210127 +:1001000068C0883A39F1883B29F15BC080912101B0 +:10011000882341F08F3F09F04BC08091BB00809352 +:10012000200146C08091BB00809321018091210174 +:10013000853019F481E08093170180912101873087 +:1001400019F481E080931601809121018150809300 +:1001500021012AC08091210190E0FC013197E83013 +:10016000F10520F5EC5CFF4F0C943D0680911E01DB +:1001700090911F0104C080911C0190911D018093FA +:100180001401909315019093BB000EC080911A0149 +:1001900090911B01F4CF8091180190911901EFCF3C +:1001A000809114018093BB0085EC03C01092BB00CA +:1001B00085E88093BC00809121018F5F80932101AD +:1001C00008C08091BC008B7E8093BC0085EC80933E +:1001D000BC00FF91EF91BF91AF919F918F910F90D4 +:1001E0000FBE0F901F90189593E890937A0080931C +:1001F0007C0080917C00806C80937C0080917A00F0 +:10020000806480937A0080917A0086FDFCCF809193 +:1002100078009091790045E080E090E020917A00AC +:10022000206420937A0020917A0026FDFCCF209153 +:10023000780030917900820F931F415079F7209117 +:100240007A002F7720937A0065E070E00E940A061A +:10025000CB0108951F920F920FB60F9211242F9386 +:100260003F934F935F936F937F938F939F93AF933E +:10027000BF93EF93FF9380918400909185004A9BF8 +:1002800005C090931301809312011EC020911201AA +:1002900030911301BC01621B730B80E090E00E945F +:1002A000190527EE3CE840E350E40E94A70520E052 +:1002B00030E040E05FE30E9489040E94ED04709307 +:1002C0001B0160931A01E89AFF91EF91BF91AF91E2 +:1002D0009F918F917F916F915F914F913F912F915E +:1002E0000F900FBE0F901F9018951F920F920FB690 +:1002F0000F9211242F933F934F935F936F937F93AC +:100300008F939F93AF93BF93EF93FF93809184005C +:10031000909185004B9B05C0909311018093100133 +:100320001EC02091100130911101BC01621B730BA2 +:1003300080E090E00E94190527EE3CE840E350E49D +:100340000E94A70520E030E040E05FE30E948904BE +:100350000E94ED047093190160931801E99AFF91CE +:10036000EF91BF91AF919F918F917F916F915F912D +:100370004F913F912F910F900FBE0F901F901895A6 +:100380001F920F920FB60F9211248F939F93EF93AA +:10039000FF938091C00087FF17C0E0912401F09186 +:1003A00025018091C600808381E0E938F80730F4A8 +:1003B0003196F0932501E093240106C086E291E096 +:1003C0009093250180932401FF91EF919F918F914C +:1003D0000F900FBE0F901F9018959C01E1ECF0E07C +:1003E000808188618083808180688083E2ECF0E096 +:1003F00080818660808340E050E084E0220F331FDC +:10040000441F551F8A95D1F760E074E284EF90E0B5 +:100410000E941E06DA01C9010197A109B109892FBD +:100420009A2FAB2FBB27A7FDBA958093C50021500B +:100430002093C40086E291E09093230180932201EF +:10044000909325018093240108952091C00025FFF9 +:10045000FCCFFC0180818093C6000895CF93DF9389 +:100460001F92CDB7DEB78983CE0101960E94250287 +:1004700080E090E00F90DF91CF910895CF93DF93CC +:10048000EC01CE012196FC012081222319F00E946B +:100490002502F7CFDF91CF9108958091C00087FFAB +:1004A000FCCF8091C60090E008950C944D0265E564 +:1004B00072E08EE292E00C947006CF93DF93FC0121 +:1004C000E253FF4FA081B181EC01C453DF4F28817B +:1004D0003981A217B307B9F02091C00025FF13C0DE +:1004E0002C912093C60020813181AC0145535F4F90 +:1004F0002417350718F42F5F3F4F03C09C0128597C +:100500003F4F31832083E0912201F091230120911C +:100510002401309125012E173F07C1F1DC01AC59B0 +:10052000BF4FCD91DC911197208128836D917C91F3 +:1005300011979C012B523F4FE9013881EB01288133 +:10054000321307C09C012C523F4FE90148814F5F95 +:1005500048839C012D593F4F6217730728F4EB0124 +:100560002196CD93DC9302C08D939C93D1E0E93822 +:10057000FD0730F43196F0932301E093220106C089 +:1005800086E291E09093230180932201DF91CF9145 +:1005900008951092200180E895E20E94ED010E94EA +:1005A000570282E58093BA008091BC008B7E8093D5 +:1005B000BC0085EC8093BC001092800084E08093A6 +:1005C000810085E08093690086E091E00E94ED065D +:1005D00083B7817F83BF7894C0E0D8E18091210107 +:1005E000833061F08F3F91F08130B9F480E00E9458 +:1005F000F40090931F0180931E010FC081E00E94C0 +:10060000F40090931D0180931C0107C0809120018C +:10061000853A19F4F894FE01099580911701882311 +:1006200079F01092170110921B0110921A01529A40 +:100630005A9AF5E3FA95F1F700005A985298E89A19 +:1006400080911601882379F01092160110921901F9 +:1006500010921801539A5B9A85E38A95F1F700008E +:100660005B985398E99A83B7816083BF889583B775 +:100670008E7F83BFB3CF6F927F929F92AF92BF92D4 +:10068000CF92DF92EF92FF920F931F93CF93DF935E +:10069000CDB7DEB72C970FB6F894DEBF0FBECDBF37 +:1006A0008C017B013A01FC0117821682838181FF54 +:1006B00019C1CE0101965C01F801D380F701D3FC8A +:1006C0002591D3FE21917F01222309F407C1253210 +:1006D00049F4D3FC2591D3FE21917F01253211F0FD +:1006E000912C1BC0B801822F90E00E94BB066301D1 +:1006F0003601E2CF222309F4F1C0622F70E08FE7C8 +:1007000090E02C870E9465062C85892B49F0F70123 +:10071000D3FC2591D3FE21917F0197FEEBCF0CC036 +:10072000233221F4F92DF0619F2EF1CF2C3639F4CC +:10073000292D2068922EEBCF222309F4CFC0622FFF +:1007400070E088E790E02C870E9465062C85892B55 +:1007500041F06301F4E0CF0ED11CB8018FE390E0CB +:1007600012C0233641F0233789F0233521F5F92DC6 +:10077000F1609F2E0BC0630122E0C20ED11CB801B4 +:10078000F301808191810E94BB06B2CF630122E018 +:10079000C20ED11CF30160807180F30190FC859141 +:1007A00090FE81913F01882309F4A2CFB80190E027 +:1007B0000E94BB06F2CF243611F0293639F56301C9 +:1007C00097FE09C0F4E0CF0ED11CF3016081718166 +:1007D000828193810AC0F2E0CF0ED11CF3016081C7 +:1007E0007181882777FD8095982FF92DFF7E9F2EA8 +:1007F00097FF09C090958095709561957F4F8F4FB9 +:100800009F4FF0649F2E2AE030E038C02037A1F0DF +:1008100040F42835D1F02F3609F060C028E030E0F0 +:1008200019C0253719F0283751F058C0292D2F7ECF +:10083000922E2AE030E00EC0892D8061982E992DED +:100840009462992E20E130E005C0E92DE4609E2EEF +:1008500020E132E0630197FE09C0F4E0CF0ED11C25 +:10086000F301608171818281938108C0F2E0CF0E33 +:10087000D11CF3016081718180E090E0A5010E94AC +:100880001A07782E7A1896FE05C0B8018DE290E01E +:100890000E94BB0694FE16C0FE01E70DF11D80818B +:1008A000803381F0B80180E390E00E94BB0692FEA5 +:1008B00009C0292D2072822F90E0B801885A9F4FDD +:1008C0000E94BB067A94F501E70DF11D8081B80105 +:1008D00090E00E94BB067110F5CF0ACFF801868127 +:1008E000978102C08FEF9FEF2C960FB6F894DEBF72 +:1008F0000FBECDBFDF91CF911F910F91FF90EF9071 +:10090000DF90CF90BF90AF909F907F906F900895B1 +:100910005058BB27AA270ED0E0C0D1D030F0D6D097 +:1009200020F031F49F3F11F41EF4C6C00EF4E095A0 +:10093000E7FBBCC0E92FE2D080F3BA176207730768 +:100940008407950718F071F49EF5FAC00EF4E0954F +:100950000B2EBA2FA02D0B01B90190010C01CA0179 +:10096000A0011124FF27591B99F0593F50F4503E24 +:1009700068F11A16F040A22F232F342F4427585F16 +:10098000F3CF469537952795A795F0405395C9F72E +:100990007EF41F16BA0B620B730B840BBAF09150E6 +:1009A000A1F0FF0FBB1F661F771F881FC2F70EC085 +:1009B000BA0F621F731F841F48F487957795679558 +:1009C000B795F7959E3F08F0B3CF9395880F08F041 +:1009D0009927EE0F97958795089598D088F09F579F +:1009E00090F0B92F9927B751A0F0D1F0660F771F7B +:1009F000881F991F1AF0BA95C9F712C0B13081F05B +:100A00009FD0B1E008959CC0672F782F8827B85FEA +:100A100039F0B93FCCF3869577956795B395D9F7BB +:100A20003EF490958095709561957F4F8F4F9F4FC5 +:100A30000895E89409C097FB3EF4909580957095D1 +:100A400061957F4F8F4F9F4F9923A9F0F92F96E91A +:100A5000BB279395F695879577956795B795F1118F +:100A6000F8CFFAF4BB0F11F460FF1BC06F5F7F4F2C +:100A70008F4F9F4F16C0882311F096E911C077233E +:100A800021F09EE8872F762F05C0662371F096E847 +:100A9000862F70E060E02AF09A95660F771F881F16 +:100AA000DAF7880F9695879597F9089597F99F67D4 +:100AB00080E870E060E008959FEF80EC08950024E6 +:100AC0000A941616170618060906089500240A94B3 +:100AD00012161306140605060895092E0394000C39 +:100AE00011F4882352F0BB0F40F4BF2B11F460FFC8 +:100AF00004C06F5F7F4F8F4F9F4F089557FD9058F1 +:100B0000440F551F59F05F3F71F04795880F97FBD1 +:100B1000991F61F09F3F79F087950895121613068B +:100B20001406551FF2CF4695F1DF08C016161706BA +:100B30001806991FF1CF86957105610508940895EF +:100B4000E894BB2766277727CB0197F908950BD048 +:100B5000C4CFB5DF28F0BADF18F0952309F0A6CF8F +:100B6000ABCF1124EECFCADFA0F3959FD1F3950F41 +:100B700050E0551F629FF001729FBB27F00DB11D21 +:100B8000639FAA27F00DB11DAA1F649F6627B00DB1 +:100B9000A11D661F829F2227B00DA11D621F739F9A +:100BA000B00DA11D621F839FA00D611D221F749FA8 +:100BB0003327A00D611D231F849F600D211D822FEF +:100BC000762F6A2F11249F5750408AF0E1F0882336 +:100BD0004AF0EE0FFF1FBB1F661F771F881F915043 +:100BE0005040A9F79E3F510570F060CFAACF5F3FFC +:100BF000ECF3983EDCF3869577956795B795F79576 +:100C0000E7959F5FC1F7FE2B880F911D96958795FD +:100C100097F90895AA1BBB1B51E107C0AA1FBB1F70 +:100C2000A617B70710F0A61BB70B881F991F5A9578 +:100C3000A9F780959095BC01CD010895052E97FBED +:100C40001EF400940E94350657FD07D00E9443060B +:100C500007FC03D04EF40C94350650954095309522 +:100C600021953F4F4F4F5F4F089590958095709518 +:100C700061957F4F8F4F9F4F0895EE0FFF1F059097 +:100C8000F491E02D0994A1E21A2EAA1BBB1BFD01D1 +:100C90000DC0AA1FBB1FEE1FFF1FA217B307E4075B +:100CA000F50720F0A21BB30BE40BF50B661F771FB3 +:100CB000881F991F1A9469F7609570958095909593 +:100CC0009B01AC01BD01CF010895FC010590061602 +:100CD00021F00020D9F7C00108953197CF01089580 +:100CE0000F931F93CF93DF93EC018B01009731F4A7 +:100CF0006115710519F480E090E038C06EE070E095 +:100D000081E090E00E947807FC010097A1F380E861 +:100D100083830115110571F01387028781E88383AE +:100D200080918D0190918E01892B21F4F0938E0199 +:100D3000E0938D012097C9F0D187C08783818260BD +:100D4000838380918F0190919001892B71F4F093AE +:100D50009001E0938F018091910190919201892BF4 +:100D600021F4F0939201E0939101CF01DF91CF91B3 +:100D70001F910F9108950F931F93CF93DF93182F17 +:100D8000092FEB018B8181FD03C08FEF9FEF20C006 +:100D900082FF10C04E815F812C813D814217530735 +:100DA0007CF4E881F9819F012F5F3F4F39832883CD +:100DB000108306C0E885F985812F0995892B29F7CD +:100DC0002E813F812F5F3F4F3F832E83812F902FB6 +:100DD000DF91CF911F910F9108950F931F93CF93A0 +:100DE000DF93E0918F01F0919001238121FF1BC0DF +:100DF000EC0100E010E0899160918F017091900109 +:100E0000DB011896ED91FC911997882331F0099533 +:100E1000892B89F30FEF1FEFEECF8AE00995892B1D +:100E200011F4C80102C08FEF9FEFDF91CF911F91A6 +:100E30000F910895FA01AA27283051F1203181F14C +:100E4000E8946F936E7F6E5F7F4F8F4F9F4FAF4FD2 +:100E5000B1E03ED0B4E03CD0670F781F891F9A1FE5 +:100E6000A11D680F791F8A1F911DA11D6A0F711D99 +:100E7000811D911DA11D20D009F468943F912AE0A5 +:100E8000269F11243019305D3193DEF6CF0108958D +:100E9000462F4770405D4193B3E00FD0C9F7F6CFBE +:100EA000462F4F70405D4A3318F0495D31FD405286 +:100EB000419302D0A9F7EACFB4E0A695979587951C +:100EC00077956795BA95C9F70097610571050895FB +:100ED0009B01AC010A2E06945795479537952795A7 +:100EE000BA95C9F7620F731F841F951FA01D08953F +:100EF0000F931F93CF93DF93869F8001879F100DE1 +:100F0000969F100D1124C8010E949407EC010097D0 +:100F100029F0A80160E070E00E94BB08CE01DF91DB +:100F2000CF911F910F910895CF93DF938230910558 +:100F300010F482E090E0E0919501F091960120E0BC +:100F400030E0A0E0B0E0309739F14081518148179E +:100F50005907B8F04817590771F4828193811097A7 +:100F600029F013969C938E9312972CC09093960120 +:100F70008093950127C02115310531F042175307A1 +:100F800018F0A901DB0101C0EF019A01BD01DF01E9 +:100F90000280F381E02DD7CF21153105F9F0281B10 +:100FA000390B2430310580F48A819B8161157105EC +:100FB00021F0FB019383828304C090939601809378 +:100FC0009501FE01329644C0FE01E20FF31F8193AA +:100FD000919322503109398328833AC0209193019B +:100FE00030919401232B41F42091020130910301AF +:100FF00030939401209393012091000130910101DD +:101000002115310541F42DB73EB7409104015091AF +:101010000501241B350BE0919301F0919401E21737 +:10102000F307A0F42E1B3F0B2817390778F0AC010B +:101030004E5F5F4F2417350748F04E0F5F1F5093E8 +:101040009401409393018193919302C0E0E0F0E01A +:10105000CF01DF91CF910895CF93DF93009709F4EB +:1010600087C0FC01329713821282C0919501D09102 +:101070009601209781F420813181280F391F8091BA +:101080009301909194018217930779F5F09394015D +:10109000E09393016DC0DE0120E030E0AE17BF07A2 +:1010A00050F412964D915C9113979D014115510595 +:1010B00009F1DA01F3CFB383A28340815181840F18 +:1010C000951F8A179B0771F48D919C911197840F3E +:1010D000951F02969183808312968D919C91139710 +:1010E000938382832115310529F4F0939601E093CF +:1010F00095013EC0D9011396FC93EE9312974D9142 +:101100005D91A40FB51FEA17FB0779F480819181E7 +:10111000840F951F0296D90111969C938E9382811C +:10112000938113969C938E931297E0E0F0E08A816E +:101130009B81009719F0FE01EC01F9CFCE010296D8 +:1011400028813981820F931F20919301309194015E +:101150002817390769F4309729F4109296011092F4 +:10116000950102C013821282D0939401C09393011F +:10117000DF91CF910895DC0101C06D934150504043 +:08118000E0F70895F894FFCF99 +:101188000000970120000D0A53746172740D00006D :00000001FF