diff --git a/.pioenvs/.sconsign.dblite b/.pioenvs/.sconsign.dblite index 0762f5f..18b001e 100644 Binary files a/.pioenvs/.sconsign.dblite and b/.pioenvs/.sconsign.dblite differ diff --git a/.pioenvs/do-not-modify-files-here.url b/.pioenvs/do-not-modify-files-here.url deleted file mode 100644 index c4a16e5..0000000 --- a/.pioenvs/do-not-modify-files-here.url +++ /dev/null @@ -1,3 +0,0 @@ - -[InternetShortcut] -URL=https://docs.platformio.org/page/projectconf/section_platformio.html#build-dir diff --git a/.pioenvs/micro/firmware.elf b/.pioenvs/micro/firmware.elf index ee1ec49..cc5844f 100755 Binary files a/.pioenvs/micro/firmware.elf and b/.pioenvs/micro/firmware.elf differ diff --git a/.pioenvs/micro/firmware.hex b/.pioenvs/micro/firmware.hex index 9542682..ab8bbcf 100644 --- a/.pioenvs/micro/firmware.hex +++ b/.pioenvs/micro/firmware.hex @@ -1,25 +1,25 @@ :100000000C94EA000C9412010C9412010C9412014D :100010000C9412010C9412010C9412010C94120114 -:100020000C9412010C9412010C9462090C943F0A76 +:100020000C9412010C9412010C94D00B0C941D062C :100030000C9412010C9412010C9412010C941201F4 :100040000C9412010C9412010C9412010C941201E4 -:100050000C9412010C9412010C9412010C94EC07F4 +:100050000C9412010C9412010C9412010C94A9043A :100060000C9412010C9412010C9412010C941201C4 :100070000C9412010C9412010C9412010C941201B4 :100080000C9412010C9412010C9412010C941201A4 :100090000C9412010C9412010C9412010C94120194 -:1000A0000C9412010C9412010C941201C707CA0798 -:1000B000B907BD07C307EB07EB07EB07CE07D2076E -:1000C000D607DC07E007EB07E60700000000240086 -:1000D00027002A002D003000000000002500280025 -:1000E0002B002E0031000000000023002600290014 -:1000F0002C002F000404040404030405020202027D -:1001000004030202020206060606060604040202B0 -:100110000204040408020110408040102040804086 -:10012000800802040180402010020110801020404D -:1001300040200000000200090F0000030401000C31 -:1001400000000000000000000000000000000000AF -:1001500000070605040100080A0B0C0D09080B0036 +:1000A0000C9412010C9412010C9412015109540980 +:1000B000430947094D0975097509750958095C090E +:1000C000600966096A0975097009000000002400CA +:1000D00027002A002D003000000000002300260029 +:1000E00029002C002F00070605040100080A0B0C4C +:1000F0000D0900000000250028002B002E00310013 +:1001000004040404040304050202020204030202BC +:10011000020206060606060604040202020404049D +:1001200008020110408040102040804080080204F6 +:10013000018040201002011080102040402000006B +:10014000000200090F0000030401000C0000000081 +:1001500000000000000000000000000000080B008C :10016000020202010009040000010202000005244D :1001700000100105240101010424020605240600E3 :10018000010705810310004009040100020A000074 @@ -27,602 +27,561 @@ :1001A00003090412010002EF02014041233700005D :1001B000010102030141726475696E6F204C4C436A :1001C0000041726475696E6F204D6963726F000043 -:1001D000000F440E11241FBECFEFDAE0DEBFCDBF0B -:1001E00012E0A0E0B1E0E4ECF5E202C005900D926F -:1001F000A835B107D9F724E0A8E5B2E001C01D9207 -:10020000AF3EB207E1F710E0C9EED0E004C021979D -:10021000FE010E94A211C83ED107C9F70E945810E2 -:100220000C94D5120C940000FC019281838969170B -:1002300010F0982F04C0962F96959695969589174D -:10024000A9F00188F289E02DE90FF11D97FDFA95DB -:10025000677081E090E001C0880F6A95EAF720811D -:10026000282381E090E021F480E0089580E090E090 -:100270000895DC0112963C91129753962C916317C6 -:1002800010F0E22F04C0E62FE695E695E6952E17CE -:1002900019F10E2E000CFF0BDC0151962D913C91B3 -:1002A00052976770E20FF31F21E030E002C0220F87 -:1002B000331F6A95E2F7442319F03081232B04C0E1 -:1002C00020953095308123232083DC01ED91FC9132 -:1002D0000484F585E02D09940895E0915A02F09187 -:1002E0005B02309741F09381891740F09481891720 -:1002F00028F4CF01089580E090E008950580F6810C -:10030000E02DEFCFDC011496ED91FC9115978FEF66 -:100310009FEF9587848708951F93CF93DF93EC0118 -:10032000122F8A819B81642BDC01ED91FC9101905D -:10033000F081E02D09958A819B81DC01ED91FC9192 -:100340000190F081E02D612F09958A819B81DC016C -:10035000ED91FC910680F781E02DDF91CF911F9107 -:1003600009940F931F93CF93DF93EC01122F8A818F -:100370009B81642BDC01ED91FC910190F081E02DDB -:1003800009958A819B81DC01ED91FC910190F081BE -:10039000E02D612F09958A819B81DC01ED91FC9113 -:1003A0000190F081E02D602F09958A819B81DC010D -:1003B000ED91FC910680F781E02DDF91CF911F91A7 -:1003C0000F910994CF93DF93EC018A819B81DC012B -:1003D000ED91FC910084F185E02D09951816190620 -:1003E0005CF48A819B81DC01ED91FC910284F385B0 -:1003F000E02D099581E001C080E0DF91CF91089563 -:10040000089508950895089508950F931F93CF9325 -:10041000DF9300D000D0CDB7DEB7862F90E034E078 -:10042000959587953A95E1F78983462B4A832B83E7 -:100430000C830FE613E0F801838144E050E0BE0135 -:100440006F5F7F4F8F5F0E947D0CF80183818F5F0C -:100450000E9458090F900F900F900F90DF91CF914D -:100460001F910F910895CF92DF92EF92FF92CF9359 -:10047000DF9300D000D0CDB7DEB780915C039091C0 -:100480005D03A0915E03B0915F03409160035091C2 -:1004900061036091620370916303841B950BA60B4B -:1004A000B70B8F739927AA27BB27892B8A2B8B2BF6 -:1004B00009F055C0809172030E94A10D882309F4B0 -:1004C0005FC0C0905C03D0905D03E0905E03F0904D -:1004D0005F038FEFC81AD80AE80AF80A8FE3C82228 -:1004E000DD24EE24FF248091600390916103A091AC -:1004F0006203B09163038C159D05AE05BF0579F1CC -:10050000809172030E94A10D44E050E0BE016F5F34 -:100510007F4F809172030E94280D049704F180910F -:100520005C0390915D03A0915E03B0915F03880F1F -:10053000991F880F991FFC01E45AFD4F49815A8188 -:100540006B817C814083518362837383C0925C039F -:10055000D0925D03E0925E03F0925F03BACF809188 -:10056000600390916103A0916203B0916303880FCF -:10057000991F880F991FFC01E45AFD4F208101C08B -:1005800020E040915C0350915D0360915E037091A7 -:100590005F038091600390916103A0916203B09129 -:1005A0006303481759076A077B07B9F08091600316 -:1005B00090916103A0916203B09163030196A11D24 -:1005C000B11D8F739927AA27BB278093600390934F -:1005D0006103A0936203B093630381E0211101C022 -:1005E00080E00F900F900F900F90DF91CF91FF90D0 -:1005F000EF90DF90CF900895CF93DF93EC0148897F -:1006000050E060E070E089899A890E94CE12E8810A -:10061000F9810484F585E02DCE01DF91CF91099415 -:100620000F931F93CF93DF93E62FE295EF70E8507F -:10063000E730F0F5022F142FEC01F0E0EE0FFF1F72 -:10064000E05DFE4F608171818A819B810E94D006AE -:100650006DEC71E08A819B810E94D006612F70E071 -:100660006F5F7F4F8A819B810E941B0768ED71E05D -:100670008A819B810E94D006402F50E060E070E0AC -:1006800020E18A819B810E94D20664EE71E08A811A -:100690009B810E94D0068A819B81DC01ED91FC91B7 -:1006A0000680F781E02DDF91CF911F910F91099482 -:1006B000DF91CF911F910F910895FF920F931F9398 -:1006C000CF93DF93E62FE295EF70E850E73008F024 -:1006D0004EC0F22E142FEC01F0E0EE0FFF1FE05D94 -:1006E000FE4F608171818A819B810E94D0066DECF2 -:1006F00071E08A819B810E94D006612F70E06F5F5C -:100700007F4F8A819B810E941B0768ED71E08A817F -:100710009B810E94D0064F2D50E060E070E020E108 -:100720008A819B810E94D20667EE71E08A819B815B -:100730000E94D006402F50E060E070E020E18A8106 -:100740009B810E94D20664EE71E08A819B810E94A7 -:10075000D0068A819B81DC01ED91FC910680F781B6 -:10076000E02DDF91CF911F910F91FF900994DF91C0 -:10077000CF911F910F91FF900895CF93C82F8B3287 -:1007800058F5823108F0C251EC2FF0E0EF5AFE4FDD -:10079000E49180917B00E3FB222720F930E095E093 -:1007A000220F331F9A95E1F78F7D282B20937B0032 -:1007B000E770E064E0937C0080917A00806480932D -:1007C0007A0080917A0086FDFCCF8091780020919C -:1007D000790090E0922B13C00E946D01009769F0A0 -:1007E000DC0113962C9113976C2F621BED91FC91F9 -:1007F0000680F781E02DCF91099480E090E0CF91C1 -:100800000895CF93DF93EC01888981506823CE014E -:100810000E94550789850E94BD038985DF91CF918C -:100820000C94BD03CF93DF93C82F8B3210F5682F44 -:1008300070E0FB01EE5CFE4F8491FB01ED5EFE4F2C -:10084000D491FB01EC50FF4FC491CC2321F18111D5 -:100850000E94AF07EC2FF0E0EE0FFF1FEA51FF4FB1 -:10086000A591B491EC91ED2381E090E0B1F480E0AA -:1008700014C00E946D01009771F0DC0113962C9159 -:1008800013976C2F621BED91FC910480F581E02D94 -:10089000DF91CF91099480E090E0DF91CF910895AE -:1008A000CF93DF93EC01888981506823CE010E94A9 -:1008B00055078985DF91CF910C9412041F93CF9334 -:1008C000DF93C82F162F8B3240F5682F70E0FB01A5 -:1008D000EE5CFE4F8491FB01ED5EFE4FD491FB0177 -:1008E000EC50FF4FC491CC2361F181110E94AF07FE -:1008F000EC2FF0E0EE0FFF1FE852FF4FA591B491EF -:100900009FB7F894111104C08C91D095D82302C0E0 -:10091000EC91DE2BDC939FBF14C00E946D01009709 -:1009200081F0DC0113962C9113976C2F621BED91D3 -:10093000FC910280F381E02D412FDF91CF911F9137 -:100940000994DF91CF911F910895BF92CF92DF92CA -:10095000EF92FF920F931F93CF93DF93EC0160E030 -:100960008E850E945E048F8581112BC010E08889DE -:10097000181708F04FC0E989FA89E10FF11DC0800E -:100980000D85BC84E12CF12CD12CB6010E2C02C0BB -:10099000759567950A94E2F761708B2D0E945E044D -:1009A00061E0802F0E945E0460E0802F0E945E0460 -:1009B0008FEFE81AF80A88E0E816F10431F71F5FB4 -:1009C000D6CF1889115017FD25C0E989FA89E10FA2 -:1009D000F11D17FDFA95C0800D85BC8487E0E82ED7 -:1009E000F12CD12CB6010E2C02C0759567950A9496 -:1009F000E2F761708B2D0E945E0461E0802F0E94FF -:100A00005E0460E0802F0E945E0481E0E81AF10835 -:100A100048F7D8CF61E08E85DF91CF911F910F917C -:100A2000FF90EF90DF90CF90BF900C945E04CF9337 -:100A3000DF938B3208F039C090E0FC01ED5EFE4F91 -:100A40002491FC01EC50FF4F8491882309F442C0AB -:100A500090E0880F991FFC01E653FF4FC591D49198 -:100A6000FC01E852FF4FA591B491611109C09FB7F5 -:100A7000F8948881209582238883EC912E230BC0E3 -:100A8000623061F49FB7F8948881322F30958323C8 -:100A90008883EC912E2B2C939FBF1CC08FB7F894AA -:100AA000E8812E2B28838FBF15C0D62FC82F0E9418 -:100AB0006D01009779F0DC0113962C9113976C2F40 -:100AC000621BED91FC910190F081E02D4D2FDF91A3 -:100AD000CF910994DF91CF910895CF93DF93EC01EB -:100AE00061E08C850E94170561E08D850E941705E5 -:100AF00061E08E850E941705E881F9810684F785FB -:100B0000E02DCE01DF91CF910994642FFC01818506 -:100B10000C9417050F931F93CF938C01C0E08C2F7B -:100B200090E0F801268537858217930758F42285CF -:100B30003385F901E80FF91F61E080810E941705F4 -:100B4000CF5FEDCFCF911F910F91089580E090E09E -:100B5000089580E00895FC0182818F5BFB01808312 -:100B600081E008953FB7F89480917A0490917B04D6 -:100B7000A0917C04B0917D0426B5A89B05C02F3FB1 -:100B800019F00196A11DB11D3FBFBA2FA92F982FB3 -:100B90008827820F911DA11DB11DBC01CD0142E02E -:100BA000660F771F881F991F4A95D1F70895611521 -:100BB000710579F0FB0101900020E9F73197AF0151 -:100BC000461B570BDC01ED91FC910280F381E02D77 -:100BD000099480E090E0089584E0E2E5F2E0DB0132 -:100BE00001900D928A95E1F784E00895CF92DF920B -:100BF000EF92FF920F931F93CF93DF93CDB7DEB7A2 -:100C0000C456D1090FB6F894DEBF0FBECDBF6C013C -:100C1000DB019C919E5F9C93FE01319684E6DF018F -:100C20001D928A95E9F788E089838BE08A8322E028 -:100C30002C8391E09D839E8339E0398774E07A8725 -:100C40009E879F873A8B44E24B8B9C8B00E011E0A0 -:100C50001E8B0D8B89E0E82EF12CF88EEF8A998F90 -:100C60003B8F7C8F2F8F98A353E059A387E08CA3F1 -:100C70004DA39EA318A70FA301E410E01AA709A78C -:100C800086E08BA74CA72DA79EA79FA789AB4AAB51 -:100C90002BAB2CAB2DAB3FAB48AF59AF9AAF5BAF93 -:100CA0009CAF2DAF9EAF21963FAF219722964FAFBD -:100CB000229723965FAF239724962FAF24972596EC -:100CC0007FAF259726969FAF269727969FAF2797AA -:100CD00028969FAF28972A963FAF2A9745E02B96F4 -:100CE0004FAF2B972D962FAF2D9760E470E02F9686 -:100CF0007FAF6EAF2F9763964FAF639785E2649691 -:100D00008FAF649765969FAF659766969FAF66971E -:100D100067969FAF679768963FAF689769964FAFA2 -:100D200069976B962FAF6B976D967FAF6EAF6D9790 -:100D3000A1964FAFA197A2968FAFA297A3969FAF10 -:100D4000A397A4969FAFA497A5965FAFA597D6014A -:100D500012969C9112979B839B879F5F9A8F9D8F82 -:100D600013968C912C968FAF2C978F5F80686A9624 -:100D70008FAF6A9744E650E0BF0180E00E94E60929 -:100D8000CC59DF4F0FB6F894DEBF0FBECDBFDF9159 -:100D9000CF911F910F91FF90EF90DF90CF9008952A -:100DA0000C94D7058F929F92AF92BF92EF92FF92D1 -:100DB0000F931F93CF93DF93CDB7DEB7A1970FB6F5 -:100DC000F894DEBF0FBECDBF7C01FA01CB0119A2A2 -:100DD000223008F42AE08E010F5D1F4F822E912CE5 -:100DE000A12CB12CBF01A50194010E948011F90131 -:100DF000CA01015011096A3014F4605D01C0695CD8 -:100E0000D8016C93232B242B252B61F7B801C70144 -:100E10000E94D705A1960FB6F894DEBF0FBECDBFD6 -:100E2000DF91CF911F910F91FF90EF90BF90AF9006 -:100E30009F908F900895CF92DF92EF92FF920F9341 -:100E40001F93CF93DF936B01770FEE08FF08F7FE38 -:100E50001FC0EC01E881F9810190F081E02D6DE285 -:100E600009958C0144275527BA014C195D096E0973 -:100E70007F092AE0CE010E94D206800F911FDF91E8 -:100E8000CF911F910F91FF90EF90DF90CF90089539 -:100E90002AE0B701A601DF91CF911F910F91FF903A -:100EA000EF90DF90CF900C94D206EF92FF920F93C9 -:100EB0001F93CF93DF938C01D62FC0E0EE24E394F1 -:100EC000F12C8C2F90E0F801268537858217930747 -:100ED00088F4B7010C2E01C0660F0A94EAF76D235F -:100EE00022853385F901E80FF91F80810E945E0495 -:100EF000CF5FE7CFDF91CF911F910F91FF90EF90E0 -:100F00000895CF92DF92EF92FF920E94B2056B019B -:100F10007C010E94B205DC01CB018C199D09AE0950 -:100F2000BF09883E9340A105B10598F3FF90EF906B -:100F3000DF90CF9008958091820481110DC082E0EE -:100F400080937E0484E080937F0410928104109249 -:100F5000800481E0809382048EE794E0089590E01D -:100F6000FC013197EF30F105B0F5EA5AFF4F0C94D0 -:100F7000A211809180008F7703C0809180008F7DC7 -:100F800080938000089580918000877FF9CF84B599 -:100F90008F7702C084B58F7D84BD089580919000C5 -:100FA0008F7707C0809190008F7D03C08091900063 -:100FB000877F8093900008958091C0008F7703C051 -:100FC0008091C0008F7D8093C00008958091C20001 -:100FD000877F8093C20008951F920F920FB60F92E1 -:100FE00011242F933F938F939F93AF93BF9380913F -:100FF000670390916803A0916903B0916A033091EF -:10100000790423E0230F2D3720F40196A11DB11D93 -:1010100005C026E8230F0296A11DB11D2093790477 -:101020008093670390936803A0936903B0936A0366 -:1010300080917A0490917B04A0917C04B0917D040E -:101040000196A11DB11D80937A0490937B04A09317 -:101050007C04B0937D04BF91AF919F918F913F919C -:101060002F910F900FBE0F901F9018954091E6049E -:101070005091E7042091E4043091E50442175307AE -:10108000B4F49091E8009570E1F39091E80092FD3E -:1010900019C08093F1008091E6049091E7040196D5 -:1010A0008F739927892B19F48EEF8093E800809134 -:1010B000E6049091E70401969093E7048093E60498 -:1010C00081E0089580E008952FB7F89487708093A9 -:1010D000E9009091E800892F807295FF04C09091FB -:1010E000F20080E4891B2FBF0895615030F02091F9 -:1010F000F100FC0120830196F8CF289A84E68093C2 -:10110000E9040895CF92DF92EF92FF920F931F931D -:10111000CF93DF936C017A018B01C0E0D0E0CE1554 -:10112000DF0581F0D8016D918D01D601ED91FC9123 -:101130000190F081E02DC6010995892B11F02196CF -:10114000EECF7E01C701DF91CF911F910F91FF90EC -:10115000EF90DF90CF900895CF93DF931F92CDB79C -:10116000DEB76983DC01ED91FC910280F381E02D13 -:1011700041E050E0BE016F5F7F4F09950F90DF9116 -:10118000CF91089583E00E94640890E0089580E084 -:1011900090E008950F931F93CF93DF93EC012B8979 -:1011A00088E0289F900111242115310529F0C901FB -:1011B00007976817790728F0295F3F4F26173707E9 -:1011C00030F483E0769567958A95E1F76B8B1B8900 -:1011D00088898117F9F03C81E0917F03F0918003C9 -:1011E000828193814A8941502A81329F400D112486 -:1011F000012F0F775B812989359F200D11242F77CF -:101200004F70DC01ED91FC910480F581E02D60EBE5 -:101210000995188BDF91CF911F910F910895FC01D3 -:1012200075876487089580E00895089508950F9361 -:10123000DC01ED91FC910480F581E02D00E0099541 -:101240000F9108950E94C912CF93DF93EC01898515 -:101250000E94BD032E853F8544E0880F991F4A9563 -:10126000E1F7821B930B9595879595958795280FA8 -:10127000391F3F872E87285F3F4FC90164E095954E -:1012800087956A95E1F7EC85FD85309709F009951A -:10129000E881F9810680F781E02DBC01CE01DF9164 -:1012A000CF91099480917B0390917C030C94401220 -:1012B0008093E9008091F200882319F08AE38093FB -:1012C000E80008951F920F920FB60F9211242F93EA -:1012D0003F934F935F936F937F938F939F93AF93BE -:1012E000BF93CF93EF93FF93C091E1008091E10012 -:1012F000837F8093E100C3FF0FC01092E90081E07B -:101300008093EB001092EC0082E38093ED0010924A -:10131000660388E08093F000C2FF19C083E00E945A -:1013200058098091EA04882339F08091EA048150B9 -:101330008093EA04882389F18091E904882339F0B5 -:101340008091E90481508093E904882341F1C4FF2E -:1013500010C08091E2008E7E81608093E2008091D7 -:10136000E1008F7E8093E100809164038E7E806136 -:1013700011C0C0FF16C08091E2008E7E8061809314 -:10138000E2008091E1008E7E8093E1008091640311 -:101390008E7E81608093640304C05D98CDCF2898D1 -:1013A000D6CFFF91EF91CF91BF91AF919F918F9148 -:1013B0007F916F915F914F913F912F910F900FBE51 -:1013C0000F901F90189583E00C945809DF92EF92CC -:1013D000FF920F931F93CF93DF93D82E8A017B0147 -:1013E000E40EF51EEB01CE15DF0571F0D7FE03C04C -:1013F000FE01849101C088810E94360821968111E6 -:10140000F2CF8FEF9FEF01C0C801DF91CF911F9105 -:101410000F91FF90EF90DF9008950F931F93CF935C -:10142000DF931F92CDB7DEB782E0898342E450E0BC -:101430006DE571E080E80E94E6090E949B07DC01EF -:1014400012960D911C9113970115110589F0D80181 -:10145000ED91FC910280F381E02DBE016F5F7F4F23 -:10146000C801099597FD04C0F80100851185ECCFEE -:1014700089810F90DF91CF911F910F9108951F9255 -:101480000F920FB60F921124CF92DF92EF92FF923C -:101490000F931F932F933F934F935F936F937F937C -:1014A0008F939F93AF93BF93EF93FF93CF93DF936C -:1014B000CDB7DEB76C97DEBFCDBF1092E90080914B -:1014C000E80083FFFBC168E0CE0145960E947508E5 -:1014D00082EF8093E8008D8987FF05C09091E80036 -:1014E00090FFFCCF03C09EEF9093E800982F90767A -:1014F00009F0C6C09E894F89588D2F89F88C9111AB -:101500000CC0803829F4809165038093F10002C0FB -:101510001092F1001092F10045C1913051F4811107 -:1015200041C14130510509F03DC1809165038D7F76 -:101530000BC0933061F4811135C14130510509F080 -:1015400031C1809165038260809365032BC1953022 -:1015500049F48091E80080FFFCCF822F806880935F -:10156000E30020C1963009F05EC00B8D1C8D22E097 -:101570001092E9001092E7041092E604F21232C0D1 -:101580001092E5041092E4040E940D0A99E0BE0155 -:101590006F5F7F4FDB01E92F1D92EA95E9F7998391 -:1015A000FA8291E09E8390EA98879AEF998720913A -:1015B000E6043091E704275F3F4F3C832B838D8304 -:1015C0001092E9001092E7041092E6041093E504EB -:1015D0000093E40449E050E080E00E94E6090E94A4 -:1015E0000D0AE0C01093E5040093E4040E949B07F9 -:1015F000DC0112960D911C9113970115110509F448 -:10160000BBC0D801ED91FC910480F581E02DBE01B5 -:101610006B5E7F4FC8010995009709F0C7C0F801BC -:1016200000851185EACF973009F445C1983021F43F -:1016300081E08093F100B6C0993009F0B3C08370A7 -:1016400009F039C1E2E0F1E081E031E096E3208188 -:10165000211109C08EE78093EA001092EA008F8979 -:10166000809366039FC08093E9003093EB00219143 -:101670002093EC009093ED008F5F873041F7EACF25 -:101680008B8D9C8D1092E9001092E7041092E60475 -:101690009093E5048093E404898D811153C08E8971 -:1016A0009D89913A49F4813209F005C147E050E043 -:1016B0006CE071E080E0BBC0913209F0FCC0833285 -:1016C00069F48F89988DA0E0B0E080930801909331 -:1016D0000901A0930A01B0930B0164C0803269F440 -:1016E0008091E80082FFFCCF67E08CE091E00E94EF -:1016F00075088BEF8093E80055C0823209F052C024 -:101700008F8980931301EEEFFFE7859194918B3FD2 -:101710009C4D19F0E0E0F8E002C0EEEFFAE08091B5 -:101720000C0190910D01A0910E01B0910F01803B31 -:101730009440A105B10509F09EC08091130180FF7E -:1017400079C099C00E949B07FC0102811381011599 -:10175000110509F4B0C0D801ED91FC910190F08120 -:10176000E02DBE016B5E7F4FC801099581111AC043 -:10177000F80100851185EBCFF1E0FF1609F44EC0AA -:10178000F3E0FF1298C08F89882309F44AC08230A1 -:1017900089F440E86DE081EC91E00E944B118823D0 -:1017A00009F489C08EEF8093E80088C018161906E6 -:1017B000CCF381C0813029F440E86BE085EB91E007 -:1017C000ECCF833009F077C00E949B07DC011296B2 -:1017D000ED90FC9013978E010F5F1F4F6801E1148D -:1017E000F10479F0D701ED91FC910680F781E02DAD -:1017F000B801C7010995080F111DF701E084F184B4 -:10180000EECFD8011C92F60101900020E9F7319744 -:10181000BF016C197D0940E0C601BFCF63EA71E0EA -:1018200002C06FE971E0FB01449150E080E80E9442 -:10183000E609B8CFEE3F2AE0F20751F080819181AE -:101840008737A7E79A0721F09093FF0A8093FE0A53 -:1018500087E797E791838083809160008093E80415 -:101860009BE088E10FB6F894A895809360000FBEC6 -:101870009093600097CF808191818737974709F0D7 -:1018800091CFA895809160008861809360008091DD -:10189000E80480936000EE3FBAE0FB0739F08091E6 -:1018A000FE0A9091FF0A918380837CCF1092FF0AF9 -:1018B0001092FE0A77CF81E28093EB006C960FB610 -:1018C000F894DEBF0FBECDBFDF91CF91FF91EF91B6 -:1018D000BF91AF919F918F917F916F915F914F9148 -:1018E0003F912F911F910F91FF90EF90DF90CF903C -:1018F0000F900FBE0F901F9018957F928F929F921E -:10190000AF92BF92CF92DF92EF92FF920F931F930D -:10191000CF93DF93C82E8B017A01809166038111EA -:1019200003C08FEF9FEF70C08091640380FF05C0FC -:101930008091E00082608093E000CE2DDF2DD12CDD -:101940008AEFB82E8C2D8770982E8C2D8072882E61 -:101950008C2D8074782E9AE3A92E209719F4DD201F -:1019600009F44DC08C2D0E946408811106C0BA9400 -:10197000BB20B9F20E948107F0CF282F30E0C217B8 -:10198000D3070CF48C2F9FB7F8949092E900209124 -:10199000E80025FF32C0282F30E0C21BD30B88207F -:1019A00029F08150A0F01092F100FBCFF801C7FEA2 -:1019B0000AC0815050F044914093F1003196F9CF24 -:1019C00041914093F1008150D8F7020F131FDD20A1 -:1019D00019F0A092E8000AC08091E80085FD08C0D7 -:1019E000A092E800DD24D394209739F0D12C05C0D3 -:1019F000209719F47110A092E8009FBFAECF5D9AB6 -:101A000084E68093EA04C701DF91CF911F910F9183 -:101A1000FF90EF90DF90CF90BF90AF909F908F900E -:101A20007F900895CF93DF93EC0180911301882379 -:101A300031F083E00E947D0C1816190634F081E025 -:101A400090E09B838A8380E090E0DF91CF910895BE -:101A500090916603992311F057FF03C08FEF9FEF1A -:101A600008959FB7F89487708093E9002091F20061 -:101A700030E0421753070CF49A01822FFB0144E631 -:101A8000815038F0289A4093E9045091F100519325 -:101A9000F7CF2115310521F08091F200882319F04C -:101AA0009FBFC90108958BE68093E800F9CF0F939B -:101AB0001F93CF93DF931F92CDB7DEB78C01FC014C -:101AC0008485958597FF12C041E050E0BE016F5FAD -:101AD0007F4F82E00E94280D019719F4898190E0E0 -:101AE00002C08FEF9FEFF80195878487F801848506 -:101AF00095850F90DF91CF911F910F910895CF930E -:101B0000DF931F92CDB7DEB7FC018485958597FDE5 -:101B100005C02FEF3FEF358724870FC041E050E02D -:101B2000BE016F5F7F4F82E00E94280D019719F47C -:101B3000898190E002C08FEF9FEF0F90DF91CF91EE -:101B400008959FB7F89487708093E9008091F20020 -:101B50009FBF0895FC018485958597FD06C082E0AE -:101B60000E94A10D90E00196089582E00E94A10DCF -:101B700090E008950F931F93CF93DF93EC018B01B7 -:101B8000FB0180810E94120421E0892B09F420E0EE -:101B9000F8018181F22FF81BFF3F69F53FB7F894F8 -:101BA0008091670390916803A0916903B0916A03E3 -:101BB0003FBF4E855F8568897989841B950BA60B8D -:101BC000B70B4E895F89688D798D481759076A0769 -:101BD0007B0710F53FB7F8948091670390916803F5 -:101BE000A0916903B0916A033FBF8E879F87A88B3E -:101BF000B98B81E012C0F13079F43FB7F89480914D -:101C0000670390916803A0916903B0916A033FBF95 -:101C10008E879F87A88BB98B80E0F8012183DF91A5 -:101C2000CF911F910F910895CF93DF93FC018EE127 -:101C300091E091838083A781B085109731F08581F1 -:101C4000968116969C938E93159780915802909149 -:101C50005902E817F90721F4B0935902A0935802EA -:101C6000C581D681209711F0B887AF8380915A0241 -:101C700090915B02E817F90721F4D0935B02C093BF -:101C80005A02DF91CF910895CF93DF93E9E4F4E016 -:101C900084E591E0749791838083A781B085109744 -:101CA00031F02581368116963C932E93159720911D -:101CB0006B0330916C03E217F30721F4B0936C03CC -:101CC000A0936B03C581D681209711F0B887AF83AD -:101CD00020916D0330916E03E217F30721F4D09346 -:101CE0006E03C0936D0323E0E138F20799F680EAB2 -:101CF00091E09093540480935304809164049091F4 -:101D000065040E94401283E594E00E94140E86EB65 -:101D100091E090936804809367048091730490919C -:101D200074040E94401287E694E0DF91CF910C94F6 -:101D3000140EFC018EE191E0918380836283168210 -:101D400015821086178280915A0290915B02892B2E -:101D500021F4F0935B02E0935A02A0915802B091F3 -:101D60005902B087A783109721F01696FC93EE9343 -:101D70001597F0935902E0935802168215828091CC -:101D800000018383680F6483609300010895FC0160 -:101D900084E591E0918380831282138281E08483C1 -:101DA000168215821086178280916D0390916E03C2 -:101DB000892B21F4F0936E03E0936D03A0916B03E4 -:101DC000B0916C03B087A783109721F01696FC930F -:101DD000EE931597F0936C03E0936B0316821582D4 -:101DE0006187158614861786168688E891E09183A8 -:101DF00080838FEF808B87E0818B428B138A0895DD -:101E000082E0809373038093740389E793E0909357 -:101E100076038093750310927803109277038EE512 -:101E200091E09093700380936F0380E8809379032F -:101E300081E880937A030E949B07FC0121818091B5 -:101E4000730390E0820F911D0897C4F5A281B381BE -:101E5000109729F48FE693E0938382830EC018963F -:101E60008D919C911997009711F0DC01F8CF8FE6C6 -:101E700093E019969C938E931897808180937103B9 -:101E8000818180937203908180917403890F808394 -:101E900080E090917303891788F4A0917503B09145 -:101EA0007603A80FB11D9C91A181B0E0AF5FBE4F3A -:101EB0009C9391819F5F91838F5FEBCF10929704EA -:101EC0001092960488EE93E0A0E0B0E0809398042E -:101ED00090939904A0939A04B0939B048AE691E0AE -:101EE00090939504809394048FEF9FEF9093A104B7 -:101EF0008093A00480918A0481110BC010927C030E -:101F000010927B0310927E0310927D0381E08093F8 -:101F10008A048BE793E09093800380937F0360E2D1 -:101F200087E694E00E94990E86EB91E09093680416 -:101F3000809367048CE18093700488EC91E0909327 -:101F4000720480937104109274041092730485E0FB -:101F500090E0909376048093750480E290E09093F3 -:101F600078048093770487E694E00E948A0560E114 -:101F700083E594E00E94990E80EA91E090935404E6 -:101F80008093530410925C0481E080935D0492E09E -:101F900090935E042EE020935F048093600420E120 -:101FA00020936104809362048FEF809366042093F2 -:101FB00055049093630482E090E00E94A8119093EE -:101FC00065048093640483E594E00E946D0589E4D0 -:101FD00094E0909393048093920484E994E0909326 -:101FE0004C0480934B0490934E0480934D0480E006 -:101FF00092ECA1E0B0E080934F0490935004A09342 -:102000005104B093520484E991E090934A04809380 -:10201000490441E060916A0481E893E00E94C70EA0 -:1020200060916A046F5F42E085E993E00E94C70E09 -:1020300060916A046E5F43E089EA93E00E94C70EF4 -:1020400060916A046D5F44E08DEB93E00E94C70EDF -:1020500060916A046C5F45E081ED93E00E94C70ED9 -:1020600060916A046B5F46E085EE93E00E94C70EC4 -:1020700060916A046A5F47E089EF93E00E94C70EAF -:1020800060916A04695F48E08DE094E00E94C70EA9 -:1020900060916A04685F49E081E294E00E94C70EA3 -:1020A00060916A04675F4AE085E394E00C94C70E90 -:1020B000789484B5826084BD84B5816084BD85B523 -:1020C000826085BD85B5816085BD80916E0081602F -:1020D00080936E00109281008091810082608093D5 -:1020E00081008091810081608093810080918000D7 -:1020F0008160809380008091910082608093910044 -:102100008091910081608093910080919000816026 -:10211000809390008091C10084608093C100809181 -:10212000C10082608093C1008091C1008160809372 -:10213000C1008091C30081608093C3008091C00082 -:1021400082608093C0008091C20081608093C20051 -:1021500080917A00846080937A0080917A00826016 -:1021600080937A0080917A00816080937A008091D8 -:102170007A00806880937A0010926603109265035B -:10218000109264038091D70081608093D70080EA29 -:102190008093D80089B5806189BD89B5826089BD89 -:1021A00009B400FEFDCF0E9481078091D8008F7C8A -:1021B00080618093D8008091E000807F8093E00070 -:1021C0008091E1008E7E8093E1008DE08093E200BB -:1021D000559A209A5D982898CEE3D1E060E08991E5 -:1021E0000E94170581E0C434D807C1F788E4E82EBF -:1021F00081E0F82E90E0C92E90E0D92EC0917F03A7 -:10220000D09180038A819B81892B01F58091920472 -:10221000909193049B838A83892B79F482E090E0E8 -:102220000E94A8119093930480939204DC01ED9294 -:10223000FC92998388839B838A838A819B81DC01BA -:10224000ED91FC910190F081E02D099500916D03D5 -:1022500010916E030115110561F0D801ED91FC910B -:102260000480F581E02DC8010995F80105811681EA -:10227000F1CF8A819B81DC01ED91FC910280F38199 -:10228000E02D09958111F5CFC114D10409F4B6CF21 -:102290000E940000B3CFDF92EF92FF920F931F9343 -:1022A000CF93DF93D82EF92EE42E062F10E0C8012D -:1022B0000196880F0E94360883E00E943608CD2DD3 -:1022C000DF2D0C0F1D1FC017D10789F0E7FE03C0DB -:1022D000FE01849101C088810E943608F82E80E0BA -:1022E0000E9436088F2121968111EDCF01C081E037 -:1022F000DF91CF911F910F91FF90EF90DF900895A4 -:10230000A1E21A2EAA1BBB1BFD010DC0AA1FBB1FF9 -:10231000EE1FFF1FA217B307E407F50720F0A21B6B -:10232000B30BE40BF50B661F771F881F991F1A94D8 -:1023300069F760957095809590959B01AC01BD0102 -:10234000CF010895EE0FFF1F0590F491E02D099441 -:102350000F931F93CF93DF938230910510F482E0A7 -:1023600090E0E091ED04F091EE0420E030E0A0E098 -:10237000B0E0309719F140815181028113814817F3 -:102380005907C8F08417950769F4109731F0129631 -:102390000C93129713961C9327C00093ED0410938F -:1023A000EE0422C02115310519F04217530718F425 -:1023B0009A01BD01EF01DF01F801DBCF21153105E5 -:1023C000F9F0281B390B2430310580F48A819B8178 -:1023D0006115710521F0FB019383828304C0909302 -:1023E000EE048093ED04FE01329644C0FE01E20F3C -:1023F000F31F8193919322503109398328833AC086 -:102400002091EB043091EC04232B41F42091160130 -:10241000309117013093EC042093EB0420911401C8 -:10242000309115012115310541F42DB73EB740918A -:10243000180150911901241B350BE091EB04F09128 -:10244000EC04E217F307A0F42E1B3F0B2817390703 -:1024500078F0AC014E5F5F4F2417350748F04E0F00 -:102460005F1F5093EC044093EB048193919302C05F -:10247000E0E0F0E0CF01DF91CF911F910F9108953F -:10248000CF93DF93009709F481C0FC013297138248 -:102490001282A091ED04B091EE04109781F4208196 -:1024A0003181820F931F2091EB043091EC042817A7 -:1024B000390751F5F093EC04E093EB0467C0ED01AC -:1024C00020E030E0CE17DF0740F44A815B819E01B7 -:1024D00041155105F1F0EA01F5CFD383C283408164 -:1024E0005181840F951FC817D90759F488819981A4 -:1024F000840F951F0296918380838A819B819383A9 -:1025000082832115310529F4F093EE04E093ED0464 -:102510003DC0E901FB83EA8349915991C40FD51F5E -:10252000EC17FD0761F480819181840F951F02965D -:10253000E90199838883828193819B838A83E0E088 -:10254000F0E012968D919C911397009719F0FD0180 -:10255000DC01F7CF8D919C9111979D012E5F3F4F2C -:10256000820F931F2091EB043091EC042817390758 -:1025700069F4309729F41092EE041092ED0402C031 -:1025800013821282B093EC04A093EB04DF91CF91FD -:10259000089581E090E0F8940C94D512DC0101C01C -:1025A0006D9341505040E0F7089510E0C9EED0E03F -:1025B00004C0FE010E94A2112196CA3ED107C9F7AC -:0425C000F894FFCFBD -:1025C4002B00C18081000000FFFFFFFF00E100003D -:1025D400000000000000EF0480000000000003027F -:1025E40003020202020201020002000200020002CF -:1025F400F301FD0107021502250235024602040516 -:10260400060708090000000000023302050217094A -:102614000000000004020002000200000000A905FE -:10262400F605A605EC0500000000AC08120DC20872 -:10263400E309AA0D7F0D570D000000000F090002E9 -:1026440024092209000000000F0900022409CA0815 -:10265400000000008201E2015D031003000000009D -:10266400030239011401020201026D05A504FC02F2 -:102674000002000000008505030250040104010269 -:102684008A050002000200020F15141312094368A0 -:10269400616E6E656C3A2000094461746120313AC0 -:1026A400203078000D0A00094461746120323A2018 -:1026B4003078004E6F7465204F666609004E6F7463 -:1026C40065204F6E0909004B65792050726573735C -:1026D4007572650900436F6E74726F6C2043686194 -:1026E4006E6765090050726F6772616D204368619F -:1026F4006E676509004368616E6E656C2050726593 -:1027040073737572650050697463682042656E6402 -:0827140009004D494449000091 +:1001D000190F810C11241FBECFEFDAE0DEBFCDBFB7 +:1001E00012E0A0E0B1E0EEE1F3E202C005900D9272 +:1001F000A837B107D9F725E0A8E7B2E001C01D9202 +:10020000A636B207E1F710E0C9EED0E004C02197AE +:10021000FE010E944F10C83ED107C9F70E94D60CBC +:100220000C9482110C9400000F931F93CF93DF93D3 +:10023000EC012B8988E0289F9001112421153105BC +:1002400029F0C90107976817790728F0295F3F4F00 +:100250002617370730F483E0769567958A95E1F79E +:100260006B8B1B8988898117F9F03C81E0910E0422 +:10027000F0910F04828193814A8941502A81329FF3 +:10028000400D1124012F0F775B812989359F200DA7 +:1002900011242F774F70DC01ED91FC910480F581E2 +:1002A000E02D60EB0995188BDF91CF911F910F9195 +:1002B0000895FC0175876487089580E00895089586 +:1002C00008950F93DC01ED91FC910480F581E02D00 +:1002D00000E009950F910895FC01928183896917C7 +:1002E00010F0982F04C0962F96959695969589179D +:1002F000A9F00188F289E02DE90FF11D97FDFA952B +:10030000677081E090E001C0880F6A95EAF720816C +:10031000282381E090E021F480E0089580E090E0DF +:100320000895DC0112963C91129753962C91631715 +:1003300010F0E22F04C0E62FE695E695E6952E171D +:1003400019F10E2E000CFF0BDC0151962D913C9102 +:1003500052976770E20FF31F21E030E002C0220FD6 +:10036000331F6A95E2F7442319F03081232B04C030 +:1003700020953095308123232083DC01ED91FC9181 +:100380000484F585E02D09940895E0917A02F091B6 +:100390007B02309741F09381891740F0948189174F +:1003A00028F4CF01089580E090E008950580F6815B +:1003B000E02DEFCFCF93C82F8B3258F5823108F064 +:1003C000C251EC2FF0E0EA51FF4FE49180917B00A5 +:1003D000E3FB222720F930E095E0220F331F9A95A6 +:1003E000E1F78F7D282B20937B00E770E064E0939A +:1003F0007C0080917A00806480937A0080917A00FA +:1004000086FDFCCF809178002091790090E0922BBE +:1004100013C00E94C501009769F0DC0113962C916E +:1004200013976C2F621BED91FC910680F781E02DF4 +:10043000CF91099480E090E0CF910895CF93DF931E +:10044000EC0189850E94DA012E853F8544E0880F02 +:10045000991F4A95E1F7821B930B95958795959582 +:100460008795280F391F3F872E87285F3F4FC90187 +:1004700064E0959587956A95E1F7EC85FD85309761 +:1004800009F00995E881F9810680F781E02DBC012A +:10049000CE01DF91CF910994CF93DF938B3208F097 +:1004A00039C090E0FC01E15EFE4F2491FC01E05078 +:1004B000FF4F8491882309F442C090E0880F991F70 +:1004C000FC01E653FF4FC591D491FC01EE50FF4F64 +:1004D000A591B491611109C09FB7F89488812095C6 +:1004E00082238883EC912E230BC0623061F49FB786 +:1004F000F8948881322F309583238883EC912E2BBA +:100500002C939FBF1CC08FB7F894E8812E2B2883B3 +:100510008FBF15C0D62FC82F0E94C501009779F054 +:10052000DC0113962C9113976C2F621BED91FC91BB +:100530000190F081E02D4D2FDF91CF910994DF9153 +:10054000CF910895CF93DF93EC0161E08C850E94F9 +:100550004C0261E08D850E944C0261E08E850E9414 +:100560004C02E881F9810684F785E02DCE01DF9108 +:10057000CF910994642FFC0181850C944C020F9358 +:100580001F93CF938C01C0E08C2F90E0F80126855B +:1005900037858217930758F422853385F901E80FD0 +:1005A000F91F61E080810E944C02CF5FEDCFCF91B7 +:1005B0001F910F91089508950895089508950E9438 +:1005C000761180910A0490910B040C94ED100F9316 +:1005D0001F93CF93DF9300D000D0CDB7DEB7862F27 +:1005E00090E034E0959587953A95E1F78983462B1D +:1005F0004A832B830C830EEF13E0F801838144E0E0 +:1006000050E0BE016F5F7F4F8F5F0E946C08F80162 +:1006100083818F5F0E94BA050F900F900F900F900B +:10062000DF91CF911F910F910895CF92DF92EF92BA +:10063000FF92CF93DF9300D000D0CDB7DEB780918B +:100640007C0390917D03A0917E03B0917F03409144 +:100650008003509181036091820370918303841B16 +:10066000950BA60BB70B8F739927AA27BB27892B4E +:100670008A2B8B2B09F055C0809101040E94300910 +:10068000882309F45FC0C0907C03D0907D03E09084 +:100690007E03F0907F038FEFC81AD80AE80AF80AA1 +:1006A0008FE3C822DD24EE24FF2480918003909103 +:1006B0008103A0918203B09183038C159D05AE0543 +:1006C000BF0579F1809101040E94300944E050E0B7 +:1006D000BE016F5F7F4F809101040E940109049762 +:1006E00004F180917C0390917D03A0917E03B091F1 +:1006F0007F03880F991F880F991FFC01E458FD4F55 +:1007000049815A816B817C814083518362837383E9 +:10071000C0927C03D0927D03E0927E03F0927F032F +:10072000BACF8091800390918103A0918203B09110 +:100730008303880F991F880F991FFC01E458FD4F10 +:10074000208101C020E040917C0350917D036091A5 +:100750007E0370917F038091800390918103A0912B +:100760008203B0918303481759076A077B07B9F0E2 +:100770008091800390918103A0918203B0918303C3 +:100780000196A11DB11D8F739927AA27BB278093BE +:10079000800390938103A0938203B093830381E04D +:1007A000211101C080E00F900F900F900F90DF910A +:1007B000CF91FF90EF90DF90CF900895CF93DF938C +:1007C000EC01488950E060E070E089899A890E94D4 +:1007D0007B11E881F9810484F585E02DCE01DF915C +:1007E000CF910994CF93DF93C82F8B3210F5682FE8 +:1007F00070E0FB01E25CFE4F8491FB01E15EFE4F85 +:10080000D491FB01E050FF4FC491CC2321F1811121 +:100810000E943909EC2FF0E0EE0FFF1FE852FF4F66 +:10082000A591B491EC91ED2381E090E0B1F480E0EA +:1008300014C00E94C501009771F0DC0113962C9141 +:1008400013976C2F621BED91FC910480F581E02DD4 +:10085000DF91CF91099480E090E0DF91CF910895EE +:100860000F931F93CF93DF93EC018B01FB018081EA +:100870000E94F20321E0892B09F420E0F801818134 +:10088000F22FF81BFF3F69F53FB7F8948091E8031A +:100890009091E903A091EA03B091EB033FBF4E852D +:1008A0005F8568897989841B950BA60BB70B4E89E8 +:1008B0005F89688D798D481759076A077B0710F59E +:1008C0003FB7F8948091E8039091E903A091EA037F +:1008D000B091EB033FBF8E879F87A88BB98B81E0D8 +:1008E00012C0F13079F43FB7F8948091E803909109 +:1008F000E903A091EA03B091EB033FBF8E879F8786 +:10090000A88BB98B80E0F8012183DF91CF911F91F3 +:100910000F910895CF93DF93EC018889815068236C +:10092000CE010E94760B89850E94DA018985DF91CC +:10093000CF910C94DA01CF93DF93EC018889815039 +:100940006823CE010E94760B8985DF91CF910C94AC +:10095000F2031F920F920FB60F9211242F933F9321 +:100960008F939F93AF93BF938091E8039091E90396 +:10097000A091EA03B091EB033091E70323E0230F4A +:100980002D3720F40196A11DB11D05C026E8230FC7 +:100990000296A11DB11D2093E7038093E803909375 +:1009A000E903A093EA03B093EB038091EC039091E9 +:1009B000ED03A091EE03B091EF030196A11DB11DCF +:1009C0008093EC039093ED03A093EE03B093EF03B9 +:1009D000BF91AF919F918F913F912F910F900FBE3B +:1009E0000F901F901895CF93DF938B3220F4DF91F7 +:1009F000CF910C947609D62FC82F0E94C50100977D +:100A000079F0DC0113962C9113976C2F621BED91FA +:100A1000FC910280F381E02D4D2FDF91CF9109945D +:100A2000DF91CF910895BF92CF92DF92EF92FF9224 +:100A30000F931F93CF93DF93C82ED62EB42EC7E00B +:100A4000D0E0022F10E087E0E82EF12CB11005C0B5 +:100A5000C7018C1B9D0BB80102C0B8018C2F02C0CE +:100A6000759567958A95E2F761708C2D0E94F30465 +:100A700061E08D2D0E94F30460E08D2D0E94F3044F +:100A8000219720F7DF91CF911F910F91FF90EF9069 +:100A9000DF90CF90BF9008951F93CF93DF93EC0129 +:100AA00060E08E850E94F3048F85811110C010E0F4 +:100AB00088891817E8F4E989FA89E10FF11D208186 +:100AC00040E06D858C850E9413051F5FF1CF18896A +:100AD000115017FD0DC0E989FA89E10FF11D17FDCD +:100AE000FA95208141E06D858C850E941305F0CF39 +:100AF00061E08E85DF91CF911F910C94F3044091BA +:100B0000F3035091F4032091F1033091F203421763 +:100B10005307B4F49091E8009570E1F39091E800E8 +:100B200092FD19C08093F1008091F3039091F4033A +:100B300001968F739927892B19F48EEF8093E80023 +:100B40008091F3039091F40301969093F4038093C2 +:100B5000F30381E0089580E00895615030F0209122 +:100B6000F100FC0120830196F8CF289A84E6809357 +:100B7000F70308958093E9008091F200882319F02B +:100B80008AE38093E8000895DF92EF92FF920F933B +:100B90001F93CF93DF93D82E8A017B01E40EF51EBD +:100BA000EB01CE15DF0571F0D7FE03C0FE01849185 +:100BB00001C088810E947F0521968111F2CF8FEFBD +:100BC0009FEF01C0C801DF91CF911F910F91FF905E +:100BD000EF90DF9008950F931F93CF93DF931F92B1 +:100BE000CDB7DEB782E0898342E450E06DE571E085 +:100BF00080E80E94C4050E94BC0BDC0112960D9196 +:100C00001C9113970115110589F0D801ED91FC9104 +:100C10000280F381E02DBE016F5F7F4FC80109950F +:100C200097FD04C0F80100851185ECCF89810F90F4 +:100C3000DF91CF911F910F9108951F920F920FB6E0 +:100C40000F921124CF92DF92EF92FF920F931F9396 +:100C50002F933F934F935F936F937F938F939F93C4 +:100C6000AF93BF93EF93FF93CF93DF93CDB7DEB7EF +:100C70006C97DEBFCDBF1092E9008091E80083FF42 +:100C8000FBC168E0CE0145960E94AD0582EF8093DE +:100C9000E8008D8987FF05C09091E80090FFFCCFA8 +:100CA00003C09EEF9093E800982F907609F0C6C09D +:100CB0009E894F89588D2F89F88C91110CC08038EE +:100CC00029F48091F0038093F10002C01092F100AA +:100CD0001092F10045C1913051F4811141C1413070 +:100CE000510509F03DC18091F0038D7F0BC0933019 +:100CF00061F4811135C14130510509F031C1809154 +:100D0000F00382608093F0032BC1953049F4809109 +:100D1000E80080FFFCCF822F80688093E30020C131 +:100D2000963009F05EC00B8D1C8D22E01092E90018 +:100D30001092F4031092F303F21232C01092F203F5 +:100D40001092F1030E94EB0599E0BE016F5F7F4FA7 +:100D5000DB01E92F1D92EA95E9F79983FA8291E088 +:100D60009E8390EA98879AEF99872091F3033091B8 +:100D7000F403275F3F4F3C832B838D831092E90060 +:100D80001092F4031092F3031093F2030093F10313 +:100D900049E050E080E00E94C4050E94EB05E0C0FD +:100DA0001093F2030093F1030E94BC0BDC01129636 +:100DB0000D911C9113970115110509F4BBC0D801C1 +:100DC000ED91FC910480F581E02DBE016B5E7F4FBB +:100DD000C8010995009709F0C7C0F8010085118581 +:100DE000EACF973009F445C1983021F481E080932F +:100DF000F100B6C0993009F0B3C0837009F039C171 +:100E0000EEE0F1E081E031E096E32081211109C0BC +:100E10008EE78093EA001092EA008F898093F903AD +:100E20009FC08093E9003093EB0021912093EC0068 +:100E30009093ED008F5F873041F7EACF8B8D9C8DCB +:100E40001092E9001092F4031092F3039093F203CE +:100E50008093F103898D811153C08E899D89913AC8 +:100E600049F4813209F005C147E050E065E071E0E6 +:100E700080E0BBC0913209F0FCC0833269F48F89F5 +:100E8000988DA0E0B0E08093010190930201A093BF +:100E90000301B093040164C0803269F48091E800DA +:100EA00082FFFCCF67E085E091E00E94AD058BEF0B +:100EB0008093E80055C0823209F052C08F89809338 +:100EC0000C01EEEFFFE7859194918B3F9C4D19F05B +:100ED000E0E0F8E002C0EEEFFAE0809105019091C9 +:100EE0000601A0910701B0910801803B9440A10543 +:100EF000B10509F09EC080910C0180FF79C099C0B6 +:100F00000E94BC0BFC01028113810115110509F43B +:100F1000B0C0D801ED91FC910190F081E02DBE01AF +:100F20006B5E7F4FC801099581111AC0F8010085D9 +:100F30001185EBCFF1E0FF1609F44EC0F3E0FF128C +:100F400098C08F89882309F44AC0823089F440E828 +:100F50006DE081EC91E00E94AB0E882309F489C01A +:100F60008EEF8093E80088C018161906CCF381C074 +:100F7000813029F440E86BE085EB91E0ECCF8330E1 +:100F800009F077C00E94BC0BDC011296ED90FC903A +:100F900013978E010F5F1F4F6801E114F10479F080 +:100FA000D701ED91FC910680F781E02DB801C701D2 +:100FB0000995080F111DF701E084F184EECFD801E7 +:100FC0001C92F60101900020E9F73197BF016C19DE +:100FD0007D0940E0C601BFCF63EA71E002C06FE95E +:100FE00071E0FB01449150E080E80E94C405B8CF55 +:100FF000EE3F2AE0F20751F0808191818737A7E721 +:101000009A0721F09093FF0A8093FE0A87E797E7FB +:1010100091838083809160008093F5039BE088E159 +:101020000FB6F894A895809360000FBE909360006F +:1010300097CF808191818737974709F091CFA89505 +:10104000809160008861809360008091F5038093B7 +:101050006000EE3FBAE0FB0739F08091FE0A909104 +:10106000FF0A918380837CCF1092FF0A1092FE0AC0 +:1010700077CF81E28093EB006C960FB6F894DEBFD9 +:101080000FBECDBFDF91CF91FF91EF91BF91AF9197 +:101090009F918F917F916F915F914F913F912F9190 +:1010A0001F910F91FF90EF90DF90CF900F900FBEA8 +:1010B0000F901F9018952FB7F89487708093E900D0 +:1010C0009091E800892F807295FF04C09091F20002 +:1010D00080E4891B2FBF08957F928F929F92AF92D9 +:1010E000BF92CF92DF92EF92FF920F931F93CF9315 +:1010F000DF93C82E8B017A018091F903811103C01F +:101100008FEF9FEF70C08091F60380FF05C0809144 +:10111000E00082608093E000CE2DDF2DD12C8AEF9D +:10112000B82E8C2D8770982E8C2D8072882E8C2D49 +:101130008074782E9AE3A92E209719F4DD2009F403 +:101140004DC08C2D0E945B08811106C0BA94BB2053 +:10115000B9F20E94A20BF0CF282F30E0C217D307BC +:101160000CF48C2F9FB7F8949092E9002091E8003E +:1011700025FF32C0282F30E0C21BD30B882029F076 +:101180008150A0F01092F100FBCFF801C7FE0AC019 +:10119000815050F044914093F1003196F9CF419144 +:1011A0004093F1008150D8F7020F131FDD2019F092 +:1011B000A092E8000AC08091E80085FD08C0A092D6 +:1011C000E800DD24D394209739F0D12C05C0209776 +:1011D00019F47110A092E8009FBFAECF5D9A84E62B +:1011E0008093F803C701DF91CF911F910F91FF907A +:1011F000EF90DF90CF90BF90AF909F908F907F90B7 +:1012000008959091F903992311F057FF03C08FEFD0 +:101210009FEF08959FB7F89487708093E90020911D +:10122000F20030E0421753070CF49A01822FFB01C1 +:1012300044E6815038F0289A4093F7035091F1002A +:101240005193F7CF2115310521F08091F2008823C9 +:1012500019F09FBFC90108958BE68093E800F9CF8C +:101260009FB7F89487708093E9008091F2009FBF48 +:10127000089590E0FC013197EF30F105B0F5EA5A9E +:10128000FF4F0C944F10809180008F7703C08091A6 +:1012900080008F7D80938000089580918000877FFB +:1012A000F9CF84B58F7702C084B58F7D84BD089552 +:1012B000809190008F7707C0809190008F7D03C050 +:1012C00080919000877F8093900008958091C00066 +:1012D0008F7703C08091C0008F7D8093C0000895F8 +:1012E0008091C200877F8093C20008951F93CF939F +:1012F000DF93282F30E0F901E25CFE4F8491F90181 +:10130000E15EFE4FD491F901E050FF4FC491CC2330 +:10131000C1F0162F81110E943909EC2FF0E0EE0F79 +:10132000FF1FEE50FF4FA591B4919FB7F894111194 +:1013300004C08C91D095D82302C0EC91DE2BDC93B5 +:101340009FBFDF91CF911F9108953FB7F89480918F +:10135000EC039091ED03A091EE03B091EF0326B55D +:10136000A89B05C02F3F19F00196A11DB11D3FBFDD +:10137000BA2FA92F982F8827820F911DA11DB11D6B +:10138000BC01CD0142E0660F771F881F991F4A9567 +:10139000D1F7089580E090E0089580E00895CF921D +:1013A000DF92EF92FF920F931F93CF93DF936C0125 +:1013B0007A018B01C0E0D0E0CE15DF0581F0D801C5 +:1013C0006D918D01D601ED91FC910190F081E02DA0 +:1013D000C6010995892B11F02196EECF7E01C70138 +:1013E000DF91CF911F910F91FF90EF90DF90CF9001 +:1013F0000895FC0182818F5BFB01808381E0089569 +:10140000CF93DF931F92CDB7DEB76983DC01ED91F7 +:10141000FC910280F381E02D41E050E0BE016F5F5E +:101420007F4F09950F90DF91CF910895089580E047 +:1014300090E0089584E0E3E7F2E0DB0101900D9293 +:101440008A95E1F784E00895CF92DF92EF92FF92C0 +:101450000F931F93CF93DF93CDB7DEB7C456D10957 +:101460000FB6F894DEBF0FBECDBF6C01DB019C91BF +:101470009E5F9C93FE01319684E6DF011D928A9562 +:10148000E9F788E089838BE08A8322E02C8391E06E +:101490009D839E8339E0398774E07A879E879F8792 +:1014A0003A8B44E24B8B9C8B00E011E01E8B0D8B42 +:1014B00089E0E82EF12CF88EEF8A998F3B8F7C8F94 +:1014C0002F8F98A353E059A387E08CA34DA39EA32D +:1014D00018A70FA301E410E01AA709A786E08BA7BD +:1014E0004CA72DA79EA79FA789AB4AAB2BAB2CABD4 +:1014F0002DAB3FAB48AF59AF9AAF5BAF9CAF2DAFB1 +:101500009EAF21963FAF219722964FAF2297239609 +:101510005FAF239724962FAF249725967FAF25970B +:1015200026969FAF269727969FAF279728969FAF1F +:1015300028972A963FAF2A9745E02B964FAF2B97D7 +:101540002D962FAF2D9760E470E02F967FAF6EAF92 +:101550002F9763964FAF639785E264968FAF64973A +:1015600065969FAF659766969FAF669767969FAFA4 +:10157000679768963FAF689769964FAF69976B9684 +:101580002FAF6B976D967FAF6EAF6D97A1964FAFF4 +:10159000A197A2968FAFA297A3969FAFA397A49669 +:1015A0009FAFA497A5965FAFA597D60112969C9181 +:1015B00012979B839B879F5F9A8F9D8F13968C9129 +:1015C0002C968FAF2C978F5F80686A968FAF6A9743 +:1015D00044E650E0BF0180E00E94C405CC59DF4FD3 +:1015E0000FB6F894DEBF0FBECDBFDF91CF911F9134 +:1015F0000F91FF90EF90DF90CF900895CF93DF93FE +:10160000EC0180910C01882331F083E00E946C088A +:101610001816190634F081E090E09B838A8380E0FD +:1016200090E0DF91CF91089583E00C94BA0583E0B8 +:101630000E945B0890E008950F931F93CF93DF9370 +:101640001F92CDB7DEB78C01FC018485958597FF8D +:1016500012C041E050E0BE016F5F7F4F82E00E9408 +:101660000109019719F4898190E002C08FEF9FEF83 +:10167000F80195878487F801848595850F90DF911F +:10168000CF911F910F910895CF93DF931F92CDB704 +:10169000DEB7FC018485958597FD05C02FEF3FEFF0 +:1016A000358724870FC041E050E0BE016F5F7F4F58 +:1016B00082E00E940109019719F4898190E002C03B +:1016C0008FEF9FEF0F90DF91CF910895FC018485FC +:1016D000958597FD06C082E00E94300990E0019652 +:1016E000089582E00E94300990E00895EF92FF9201 +:1016F0000F931F93CF93DF938C01D62FC0E0EE247E +:10170000E394F12C8C2F90E0F80126853785821721 +:10171000930788F4B7010C2E01C0660F0A94EAF70C +:101720006D2322853385F901E80FF91F80810E941E +:10173000F304CF5FE7CFDF91CF911F910F91FF901F +:10174000EF900895CF92DF92EF92FF920E94A50949 +:101750006B017C010E94A509DC01CB018C199D095C +:10176000AE09BF09883E9340A105B10598F3FF90EB +:10177000EF90DF90CF9008958091020581110DC008 +:1017800082E08093FE0484E08093FF0410920105C0 +:101790001092000581E0809302058EEF94E0089599 +:1017A0001F920F920FB60F9211242F933F934F93D6 +:1017B0005F936F937F938F939F93AF93BF93CF93D9 +:1017C000EF93FF93C091E1008091E100837F8093CC +:1017D000E100C3FF0FC01092E90081E08093EB00AD +:1017E0001092EC0082E38093ED001092F90388E000 +:1017F0008093F000C2FF19C083E00E94BA05809177 +:10180000F803882339F08091F80381508093F8031E +:10181000882389F18091F703882339F08091F703B9 +:1018200081508093F703882341F1C4FF10C0809159 +:10183000E2008E7E81608093E2008091E1008F7EE5 +:101840008093E1008091F6038E7E806111C0C0FF1D +:1018500016C08091E2008E7E80618093E2008091CC +:10186000E1008E7E8093E1008091F6038E7E8160A0 +:101870008093F60304C05D98CDCF2898D6CFFF9112 +:10188000EF91CF91BF91AF919F918F917F916F9188 +:101890005F914F913F912F910F900FBE0F901F902E +:1018A0001895CF93DF93FC018EE191E091838083C3 +:1018B000A781B085109731F08581968116969C930B +:1018C0008E9315978091780290917902E817F90725 +:1018D00021F4B0937902A0937802C581D681209734 +:1018E00011F0B887AF8380917A0290917B02E8175C +:1018F000F90721F4D0937B02C0937A02DF91CF9154 +:101900000895CF93DF93E8EDF4E086E092E07497DA +:1019100091838083A781B085109731F0258136812E +:1019200016963C932E9315972091FA033091FB0362 +:10193000E217F30721F4B093FB03A093FA03C581E8 +:10194000D681209711F0B887AF832091FC033091A6 +:10195000FD03E217F30721F4D093FD03C093FC03CA +:1019600024E0E031F20799F686E492E09093D904FE +:101970008093D8048091E9049091EA040E94ED10CC +:1019800088ED94E00E94510C8CE592E09093ED0478 +:101990008093EC048091F8049091F9040E94ED107A +:1019A0008CEE94E0DF91CF910C94510C789484B537 +:1019B000826084BD84B5816084BD85B5826085BD4B +:1019C00085B5816085BD80916E00816080936E00D9 +:1019D00010928100809181008260809381008091CB +:1019E000810081608093810080918000816080937C +:1019F000800080919100826080939100809191009D +:101A0000816080939100809190008160809390002C +:101A10008091C10084608093C1008091C100826088 +:101A20008093C1008091C10081608093C10080914A +:101A3000C30081608093C3008091C0008260809366 +:101A4000C0008091C20081608093C20080917A00C2 +:101A5000846080937A0080917A00826080937A001B +:101A600080917A00816080937A0080917A0080680A +:101A700080937A001092F9031092F0031092F6030B +:101A80008091D70081608093D70080EA8093D8004E +:101A900089B5806189BD89B5826089BD09B400FEC0 +:101AA000FDCF0E94A20B8091D8008F7C8061809333 +:101AB000D8008091E000807F8093E0008091E10079 +:101AC0008E7E8093E1008DE08093E200559A209A0B +:101AD0005D982898CCEFD1E060E089910E944C029B +:101AE00082E0C230D807C1F787EE93E0E7E8F3E081 +:101AF00011928E179F07E1F788ED94E00E94A202F1 +:101B000011E03CEF232E31E0332E44E3442E41E03C +:101B1000542E50E0652E50E0752E60E080E10E946A +:101B2000760920E041E061E08EE00E94130521E0AB +:101B300041E061E08EE00E94130561E080E10E94D7 +:101B400076099CE3C92E91E0D92E27E8A22E23E046 +:101B5000B22EE60175018CEF882E81E0982ED4011B +:101B60008D914D010E94F203F701813099F580813A +:101B700081114EC0888129818130B1F4E0910E0439 +:101B8000F0910F04A281B38190918603290F2F77E2 +:101B9000ED91FC9111970480F581E02D0FE74FE066 +:101BA00060E9CD01099513C0823089F4211106C086 +:101BB000809186038C3058F08C5007C0213039F466 +:101BC00080918603853C18F4845F80938603D70157 +:101BD0001C931EC080818823D9F088818130B1F4A4 +:101BE000E0910E04F0910F04A281B38129819091BC +:101BF0008603290F2F77ED91FC9111970480F581D1 +:101C0000E02D0FE74FE060E8CD010995D7011C9268 +:101C1000B0E1EB0EF11C2296E2E08E16E2E09E06A9 +:101C200009F09DCF60E08EE00E94760960E080E1DF +:101C30000E94760961E081E00E94760960E081E01F +:101C40000E94760961E080E10E947609FFEFAF1AF9 +:101C5000BF0A8CE0C80ED11C2C143D0409F079CFCA +:101C6000C0910E04D0910F048A819B81892B01F5CC +:101C700080918403909185039B838A83892B79F4D7 +:101C800082E090E00E945510909385038093840336 +:101C9000DC014D925C92998388839B838A838A813D +:101CA0009B81DC01ED91FC910190F081E02D099583 +:101CB000E090FC03F090FD03E114F10461F0D70122 +:101CC000ED91FC910480F581E02DC7010995F701A4 +:101CD000E580F680F1CF8A819B81DC01ED91FC915A +:101CE0000280F381E02D09958111F5CF6114710413 +:101CF00009F413CF0E94000010CFFC018EE191E0A7 +:101D00009183808362831682158210861782809168 +:101D10007A0290917B02892B21F4F0937B02E0936D +:101D20007A02A0917802B0917902B087A7831097C8 +:101D300021F01696FC93EE931597F0937902E093B9 +:101D4000780216821582809100018383680F648374 +:101D5000609300010895DF92EF92FF920F931F931B +:101D6000CF93DF93D82EF92EE42E062F10E0C80172 +:101D70000196880F0E947F0583E00E947F05CD2D8C +:101D8000DF2D0C0F1D1FC017D10789F0E7FE03C020 +:101D9000FE01849101C088810E947F05F82E80E0B9 +:101DA0000E947F058F2121968111EDCF01C081E036 +:101DB000DF91CF911F910F91FF90EF90DF900895E9 +:101DC000FC0186E092E0918380831282138281E09D +:101DD000848316821582108617828091FC0390916D +:101DE000FD03892B21F4F093FD03E093FC03A09104 +:101DF000FA03B091FB03B087A783109721F01696E2 +:101E0000FC93EE931597F093FB03E093FA0316828D +:101E10001582618715861486178616868AE392E0F6 +:101E2000918380838FEF808B87E0818B428B138A35 +:101E3000089582E0809302048093030488E094E094 +:101E400090930504809304041092070410920604F2 +:101E500080E192E09093FF038093FE0380E88093FB +:101E6000080481E8809309040E94BC0BFC012181D5 +:101E70008091020490E0820F911D0897C4F5A28121 +:101E8000B381109729F48EEF93E0938382830EC081 +:101E900018968D919C911997009711F0DC01F8CF5D +:101EA0008EEF93E019969C938E9318978081809380 +:101EB0000004818180930104908180910304890F43 +:101EC000808380E090910204891788F4A091040433 +:101ED000B0910504A80FB11D9C91A181B0E0A35F52 +:101EE000BE4F9C9391819F5F91838F5FEBCF109248 +:101EF0000D0510920C0588EE93E0A0E0B0E0809311 +:101F00000E0590930F05A0931005B09311058CE179 +:101F100092E090930B0580930A058FEF9FEF9093CB +:101F200017058093160580915A0581110BC01092F8 +:101F30000B0410920A0410920D0410920C0481E01C +:101F400080935A058AE094E090930F0480930E04E6 +:101F500060E28CEE94E00E947D0E8CE592E090931E +:101F6000ED048093EC048CE18093F5048EE692E01E +:101F70009093F7048093F6041092F9041092F804F9 +:101F800085E090E09093FB048093FA0480E290E077 +:101F90009093FD048093FC048CEE94E00E94BF02B9 +:101FA00060E188ED94E00E947D0E86E492E09093DB +:101FB000D9048093D8041092E10481E08093E20474 +:101FC00092E09093E3042EE02093E4048093E504F0 +:101FD00020E12093E6048093E7048FEF8093EB04E5 +:101FE0002093DA049093E80482E090E00E94551078 +:101FF0009093EA048093E90488ED94E00E94A202A1 +:1020000041E06091EF0480E194E00E94E00E609175 +:10201000EF046F5F42E084E294E00E94E00E609182 +:10202000EF046E5F43E088E394E00E94E00E60916D +:10203000EF046D5F44E08CE494E00E94E00E609158 +:10204000EF046C5F45E080E694E00E94E00E609152 +:10205000EF046B5F46E084E794E00E94E00E60913D +:10206000EF046A5F47E088E894E00E94E00E609128 +:10207000EF04695F48E08CE994E00E94E00E609113 +:10208000EF04685F49E080EB94E00E94E00E60910D +:10209000EF04675F4AE084EC94E00C94E00EEE0FEE +:1020A000FF1F0590F491E02D09940F931F93CF9398 +:1020B000DF938230910510F482E090E0E0916405B6 +:1020C000F091650520E030E0A0E0B0E0309719F134 +:1020D000408151810281138148175907C8F0841744 +:1020E000950769F4109731F012960C931297139696 +:1020F0001C9327C0009364051093650522C0211529 +:10210000310519F04217530718F49A01BD01EF0188 +:10211000DF01F801DBCF21153105F9F0281B390B60 +:102120002430310580F48A819B816115710521F08D +:10213000FB019383828304C09093650580936405BB +:10214000FE01329644C0FE01E20FF31F819391938A +:1021500022503109398328833AC020916205309199 +:102160006305232B41F42091160130911701309320 +:10217000630520936205209114013091150121150A +:10218000310541F42DB73EB7409118015091190126 +:10219000241B350BE0916205F0916305E217F3070C +:1021A000A0F42E1B3F0B2817390778F0AC014E5FC7 +:1021B0005F4F2417350748F04E0F5F1F509363059C +:1021C000409362058193919302C0E0E0F0E0CF017B +:1021D000DF91CF911F910F910895CF93DF930097D7 +:1021E00009F481C0FC01329713821282A091640528 +:1021F000B0916505109781F420813181820F931F82 +:1022000020916205309163052817390751F5F09345 +:102210006305E093620567C0ED0120E030E0CE1772 +:10222000DF0740F44A815B819E0141155105F1F0C1 +:10223000EA01F5CFD383C28340815181840F951F7A +:10224000C817D90759F488819981840F951F029680 +:10225000918380838A819B819383828321153105B9 +:1022600029F4F0936505E09364053DC0E901FB8323 +:10227000EA8349915991C40FD51FEC17FD0761F40A +:1022800080819181840F951F0296E901998388834B +:10229000828193819B838A83E0E0F0E012968D91A6 +:1022A0009C911397009719F0FD01DC01F7CF8D91F8 +:1022B0009C9111979D012E5F3F4F820F931F20919C +:1022C0006205309163052817390769F4309729F4BE +:1022D000109265051092640502C013821282B093B9 +:1022E0006305A0936205DF91CF91089581E090E0AE +:1022F000F8940C948211DC0101C06D934150504060 +:10230000E0F7089510E0C9EED0E004C0FE010E949D +:0E2310004F102196CA3ED107C9F7F894FFCFAF +:10231E002BFFFFFFFF00E100000000000000C18066 +:10232E008100000000006605800000000000DD0254 +:10233E00DD02DC02DC02DB02160A160A160A160A97 +:10234E0000000000160A1503E702610100000000FC +:10235E000000000000000000010001010102010365 +:10236E00010401050106010701080109010A010B1B +:10237E00011201130114011501160117012F00009E +:10238E0000000000000000000129012A012B012C91 +:10239E00012D012E012401250126012701280128E6 +:1023AE00011E011F01200121012201230000000056 +:1023BE00000000000000000001180119011A011BA5 +:1023CE00011C011D010C010D010E010F0110011167 +:1023DE0000000000000000000000000002000000ED +:1023EE0000000000000000000000000000000000DF +:1023FE0000000000000000000000000000000000CF +:10240E0002010000000000000000000004050607A5 +:10241E00080900000000DE02160A160A000000007D +:10242E00CD09240ACA091A0A00000000000AFE0A91 +:10243E00170B140B660B440B1C0B0000000059010C +:10244E00160A1E02DF02000000005901160A1E02C3 +:10245E00140100000000DD0291016C01DC02DB02C0 +:10246E00A2024C05DE03160A00000000BA02DD02CD +:10247E009B048A04DB02BF02160A160A160A1213FE +:08248E0014150F4D49444900EB :00000001FF diff --git a/.pioenvs/structure.hash b/.pioenvs/structure.hash index 7cdc213..d647d10 100644 --- a/.pioenvs/structure.hash +++ b/.pioenvs/structure.hash @@ -1 +1 @@ -d53bd8f470f949b5d5179e009803692baf79d4ac \ No newline at end of file +ff40efac42d76dcfb6ef5cb24bb1f872944d1abf \ No newline at end of file diff --git a/Arduino-MIDI.pdf b/res/doc/Arduino-MIDI.pdf similarity index 100% rename from Arduino-MIDI.pdf rename to res/doc/Arduino-MIDI.pdf diff --git a/Midi.fzz b/res/doc/Midi.fzz similarity index 100% rename from Midi.fzz rename to res/doc/Midi.fzz diff --git a/res/doc/buttonMatrixMap.ods b/res/doc/buttonMatrixMap.ods new file mode 100644 index 0000000..4a7e9b4 Binary files /dev/null and b/res/doc/buttonMatrixMap.ods differ diff --git a/pro_micro_pinout.jpg b/res/doc/pro_micro_pinout.jpg similarity index 100% rename from pro_micro_pinout.jpg rename to res/doc/pro_micro_pinout.jpg diff --git a/res/tools/hairless-midiserial/.directory b/res/tools/hairless-midiserial/.directory new file mode 100644 index 0000000..587374b --- /dev/null +++ b/res/tools/hairless-midiserial/.directory @@ -0,0 +1,6 @@ +[Dolphin] +Timestamp=2019,2,22,13,59,17 +Version=4 + +[Settings] +HiddenFilesShown=true diff --git a/res/tools/hairless-midiserial/README.txt b/res/tools/hairless-midiserial/README.txt new file mode 100644 index 0000000..7557985 --- /dev/null +++ b/res/tools/hairless-midiserial/README.txt @@ -0,0 +1,74 @@ +This tar file contains the Hairless MIDI<->Serial Bridge and the +Ardumidi Arduino MIDI library (part of ttymidi.) + +"Hairless MIDI<->Serial Bridge" allows you to send MIDI messages +to/from a serial device (like an Arduino.) + +The project home page is http://projectgus.github.com/hairless-midiserial/ + +If you're a command line kind of person, I suggest checking out +ttymidi - http://www.varal.org/ttymidi/ - a different project that +creates a Serial/MIDI bridge on the command line. Hairless Bridge is +compatible with ttymidi. + + +RUNNING THE BRIDGE +================== + +Run "hairless-midiserial" in this directory. + +The executable is static linked, so you don't need to have installed Qt. + + +ARDUINO LIBRARIES +================= + +Hairless Bridge is compatible with at least two libraries for +sending/receiving MIDI data from Arduino: Ardumidi, which is included, +and "Arduino MIDI Library", which is available from +http://arduino.cc/playground/Main/MIDILibrary + +It's up to you which library to use. "Arduino MIDI Library" is nicer +in many ways, and seems to be the way of the future, but it doesn't +let you easily send debug messages to your computer along with the +MIDI messages. + + +USING ARDUINO MIDI LIBRARY +========================== + +If you use the Arduino MIDI Library, you can follow the instructions +on their page: http://arduino.cc/playground/Main/MIDILibrary + +The only difference is you need to initialise the serial port -after- +calling MIDI.begin(), like this: + +void setup() { + MIDI.begin(1); + Serial.begin(115200); +} + + +USING ARDUMIDI +============== + +Ardumidi is an Arduino MIDI library, part of the separate ttymidi +project (http://www.varal.org/ttymidi/). It can be used with Hairless +MIDI<->Serial Bridge. + +To install Ardumidi, place the "Ardumidi" directory inside a +"libraries" directory within your Arduino "sketchbook" directory. Then +restart the Arduino IDE. Example sketches can be found in the example/ folder. + + +LICENSE +======= + +The Hairless MIDI<->Serial Bridge is licensed under the GNU Lesser +General Public License 2.1, as described in the About box of the +application. + +The Ardumidi library is licensed under the GNU General Public License +3, as described in the file Ardumidi\LICENSE. + + diff --git a/res/tools/hairless-midiserial/ardumidi/LICENSE b/res/tools/hairless-midiserial/ardumidi/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/res/tools/hairless-midiserial/ardumidi/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/res/tools/hairless-midiserial/ardumidi/ardumidi.cpp b/res/tools/hairless-midiserial/ardumidi/ardumidi.cpp new file mode 100644 index 0000000..1dbc2ac --- /dev/null +++ b/res/tools/hairless-midiserial/ardumidi/ardumidi.cpp @@ -0,0 +1,122 @@ +/* + This file is part of ttymidi. + + ttymidi is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ttymidi is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ttymidi. If not, see . +*/ +// file version 0.60 + +#include "ardumidi.h" +#include "HardwareSerial.h" + +void midi_note_off(byte channel, byte key, byte velocity) +{ + midi_command(0x80, channel, key, velocity); +} + +void midi_note_on(byte channel, byte key, byte velocity) +{ + midi_command(0x90, channel, key, velocity); +} + +void midi_key_pressure(byte channel, byte key, byte value) +{ + midi_command(0xA0, channel, key, value); +} + +void midi_controller_change(byte channel, byte control, byte value) +{ + midi_command(0xB0, channel, control, value); +} + +void midi_program_change(byte channel, byte program) +{ + midi_command_short(0xC0, channel, program); +} + +void midi_channel_pressure(byte channel, byte value) +{ + midi_command_short(0xD0, channel, value); +} + +void midi_pitch_bend(byte channel, int value) +{ + midi_command(0xE0, channel, value & 0x7F, value >> 7); +} + +void midi_command(byte command, byte channel, byte param1, byte param2) +{ + Serial.print(command | (channel & 0x0F), BYTE); + Serial.print(param1 & 0x7F, BYTE); + Serial.print(param2 & 0x7F, BYTE); +} + +void midi_command_short(byte command, byte channel, byte param1) +{ + Serial.print(command | (channel & 0x0F), BYTE); + Serial.print(param1 & 0x7F, BYTE); +} + +void midi_print(char* msg, int len) +{ + Serial.print(0xFF, BYTE); + Serial.print(0x00, BYTE); + Serial.print(0x00, BYTE); + Serial.print(len , BYTE); + Serial.print(msg); +} + +void midi_comment(char* msg) +{ + int len = 0; + char* ptr = msg; + while (*ptr++) len++; + midi_print(msg, len); +} + +int midi_message_available() { + /* + This bit will check that next bytes to be read would actually + have the midi status bit. If not it will remove uncorrect bytes + from internal buffer + */ + while ((Serial.available() > 0) && ((Serial.peek() & B10000000) != 0x80)) { + Serial.read(); + } + + /* Well we don't exactly know how many commands there might be in the Serial buffer + so we'll just guess it according the type of message that happens to be waiting + in the buffer. At least we get first one right! */ + byte command = Serial.peek() & 11110000; + if (command != MIDI_PROGRAM_CHANGE && command != MIDI_CHANNEL_PRESSURE) { + return (Serial.available()/2); + } + return (Serial.available()/3); +} + +MidiMessage read_midi_message() { + MidiMessage message; + byte midi_status = Serial.read(); + message.command = (midi_status & B11110000); + message.channel = (midi_status & B00001111); + message.param1 = Serial.read(); + if (message.command != MIDI_PROGRAM_CHANGE && message.command != MIDI_CHANNEL_PRESSURE) { + message.param2 = Serial.read(); + } + return message; +} + +int get_pitch_bend(MidiMessage m) { + return (m.param1 & 0x7F) + ((m.param2 & 0x7F) << 7); +} + diff --git a/res/tools/hairless-midiserial/ardumidi/ardumidi.h b/res/tools/hairless-midiserial/ardumidi/ardumidi.h new file mode 100644 index 0000000..bd708c8 --- /dev/null +++ b/res/tools/hairless-midiserial/ardumidi/ardumidi.h @@ -0,0 +1,83 @@ +/* + This file is part of ttymidi. + + ttymidi is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ttymidi is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ttymidi. If not, see . +*/ +// file version 0.60 + +#ifndef ardumidi_h +#define ardumidi_h + +#if (ARDUINO >= 100) + #include +#else +#include "WProgram.h" +#endif + +// MIDI notes +#define MIDI_C0 0 +#define MIDI_D0 2 +#define MIDI_E0 4 +#define MIDI_F0 5 +#define MIDI_G0 7 +#define MIDI_A0 9 +#define MIDI_B0 11 +#define MIDI_C 60 +#define MIDI_D 62 +#define MIDI_E 64 +#define MIDI_F 65 +#define MIDI_G 67 +#define MIDI_A 69 +#define MIDI_B 71 +#define MIDI_SHARP 1 +#define MIDI_FLAT -1 +#define MIDI_OCTAVE 12 + +// MIDI out +#define MIDI_NOTE_OFF 0x80 +#define MIDI_NOTE_ON 0x90 +#define MIDI_PRESSURE 0xA0 +#define MIDI_CONTROLLER_CHANGE 0xB0 +#define MIDI_PROGRAM_CHANGE 0xC0 +#define MIDI_CHANNEL_PRESSURE 0xD0 +#define MIDI_PITCH_BEND 0xE0 + +struct MidiMessage { + byte command; + byte channel; + byte param1; + byte param2; +}; + +// MIDI in +void midi_note_off(byte channel, byte key, byte velocity); +void midi_note_on(byte channel, byte key, byte velocity); +void midi_key_pressure(byte channel, byte key, byte value); +void midi_controller_change(byte channel, byte control, byte value); +void midi_program_change(byte channel, byte program); +void midi_channel_pressure(byte channel, byte value); +void midi_pitch_bend(byte channel, int value); +void midi_command(byte command, byte channel, byte param1, byte param2); +void midi_command_short(byte command, byte channel, byte param1); + +// MIDI out +int midi_message_available(); +MidiMessage read_midi_message(); +int get_pitch_bend(MidiMessage msg); + +// Other +void midi_print(char* msg, int len); +void midi_comment(char* msg); + +#endif diff --git a/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test/ardumidi_test.pde b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test/ardumidi_test.pde new file mode 100644 index 0000000..58f1ba7 --- /dev/null +++ b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test/ardumidi_test.pde @@ -0,0 +1,80 @@ +/* + This file is public domain. Use it as you like. +*/ + +#include + +int ledPin = 13; +int note_on = 0; + +void setup() +{ + Serial.begin(115200); + pinMode(ledPin, OUTPUT); +} + +void loop() +{ + + if (!note_on) + { + // play a Cminor chord on channel 0, at maximum volume (127) + midi_note_on(0, MIDI_C, 127); + midi_note_on(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127); + midi_note_on(0, MIDI_G + MIDI_OCTAVE, 127); + + // The MIDI_* macros were created to make your life easier, but you + // don't have to use them. You may enter numbers instead if you know + // what you're doing. + + note_on = 1; + digitalWrite(ledPin, HIGH); + } + + else + { + // stop the Cminor chord + midi_note_off(0, MIDI_C, 127); + midi_note_off(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127); + midi_note_off(0, MIDI_G + MIDI_OCTAVE, 127); + + note_on = 0; + digitalWrite(ledPin, LOW); + } + + delay(500); +} + +// Available commands: +// +// Start/stop playing a certain note: +// midi_note_on(byte channel, byte key, byte velocity); +// midi_note_off(byte channel, byte key, byte velocity); +// +// Change pressure of specific keys: +// midi_key_pressure(byte channel, byte key, byte value); +// +// Change controller value (used for knobs, etc): +// midi_controller_change(byte channel, byte controller, byte value); +// +// Change "program" (change the instrument): +// midi_program_change(byte channel, byte program); +// +// Change key pressure of entire channels: +// midi_channel_pressure(byte channel, byte value); +// +// Change pitch-bend wheel: +// midi_pitch_bend(byte channel, int value); +// +// Send a comment: +// midi_comment(char* str); +// +// Send a series of bytes (to be interpreted by another program): +// midi_printbytes(char* bytes, int len); +// +// Parameters: +// channel an integer from 0 to 15 +// pitch-bend value an integer from 0 to 16383 +// all other values an integer from 0 to 127 +// + diff --git a/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test_all_instruments/ardumidi_test_all_instruments.pde b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test_all_instruments/ardumidi_test_all_instruments.pde new file mode 100644 index 0000000..a6b96db --- /dev/null +++ b/res/tools/hairless-midiserial/ardumidi/examples/ardumidi_test_all_instruments/ardumidi_test_all_instruments.pde @@ -0,0 +1,86 @@ +/* + This file is public domain. Use it as you like. +*/ + +#include + +int ledPin = 13; +int note_on = 0; +int voice = 0; + +void setup() +{ + Serial.begin(115200); + pinMode(ledPin, OUTPUT); +} + +void loop() +{ + + if (!note_on) + { + // play a Cminor chord on channel 0, at maximum volume (127) + midi_note_on(0, MIDI_C, 127); + midi_note_on(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127); + midi_note_on(0, MIDI_G + MIDI_OCTAVE, 127); + + // The MIDI_* macros were created to make your life easier, but you + // don't have to use them. You may enter numbers instead if you know + // what you're doing. + + note_on = 1; + digitalWrite(ledPin, HIGH); + } + + else + { + // stop the Cminor chord + midi_note_off(0, MIDI_C, 127); + midi_note_off(0, MIDI_E + MIDI_FLAT + MIDI_OCTAVE, 127); + midi_note_off(0, MIDI_G + MIDI_OCTAVE, 127); + + // go to next instrument + voice++; + if (voice > 255) voice = 0; + midi_program_change(0, voice); + + note_on = 0; + digitalWrite(ledPin, LOW); + } + + delay(500); +} + +// Available commands: +// +// Start/stop playing a certain note: +// midi_note_on(byte channel, byte key, byte velocity); +// midi_note_off(byte channel, byte key, byte velocity); +// +// Change pressure of specific keys: +// midi_key_pressure(byte channel, byte key, byte value); +// +// Change controller value (used for knobs, etc): +// midi_controller_change(byte channel, byte controller, byte value); +// +// Change "program" (change the instrument): +// midi_program_change(byte channel, byte program); +// +// Change key pressure of entire channels: +// midi_channel_pressure(byte channel, byte value); +// +// Change pitch-bend wheel: +// midi_pitch_bend(byte channel, int value); +// +// Send a comment: +// midi_comment(char* str); +// +// Send a series of bytes (to be interpreted by another program): +// midi_printbytes(char* bytes, int len); +// +// Parameters: +// channel an integer from 0 to 15 +// pitch-bend value an integer from 0 to 16383 +// all other values an integer from 0 to 127 +// + diff --git a/res/tools/hairless-midiserial/ardumidi/examples/from_alsa_to_arduino/from_alsa_to_arduino.pde b/res/tools/hairless-midiserial/ardumidi/examples/from_alsa_to_arduino/from_alsa_to_arduino.pde new file mode 100644 index 0000000..7bdacda --- /dev/null +++ b/res/tools/hairless-midiserial/ardumidi/examples/from_alsa_to_arduino/from_alsa_to_arduino.pde @@ -0,0 +1,39 @@ +/* + This file is public domain. Use it as you like. + + This is an example program to showcase reading with + Arduino the MIDI output from an ALSA sequencer. This simply + toggles the Arduino LED whenever a MIDI "note on" or "note off" + event takes place. +*/ + +#include + +void setup() +{ + Serial.begin(115200); + pinMode(ledPin, OUTPUT); +} + +int counter = 0; + +void loop() +{ + while (midi_message_available() > 0) { + + MidiMessage m = read_midi_message(); + + if (m.command == MIDI_NOTE_ON) { + /* + If you want to find out which key was pressed, check + the value of m.param1 + */ + digitalWrite(ledPin, HIGH); + } + + else if (m.command == MIDI_NOTE_OFF) { + digitalWrite(ledPin, LOW); + } + + } +} diff --git a/res/tools/hairless-midiserial/hairless-midiserial b/res/tools/hairless-midiserial/hairless-midiserial new file mode 100644 index 0000000..8170724 Binary files /dev/null and b/res/tools/hairless-midiserial/hairless-midiserial differ diff --git a/src/main.cpp b/src/main.cpp index 2683179..9cf2aa9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,10 @@ #include #include +#define NOTE_ON_CMD 0x90 +#define NOTE_OFF_CMD 0x80 +#define NOTE_VELOCITY 127 + #define s * 1000 /* Pins */ @@ -11,7 +15,7 @@ const uint8_t scl{3}; /* Multiplexer */ #define MUX_ADDRSIZE 5 const uint8_t mux_sig{A10}; -const uint8_t mux_addr[MUX_ADDRSIZE]{15, 21, 20, 19, 18}; +const uint8_t mux_addr[MUX_ADDRSIZE]{18, 19, 20, 21, 15}; /* ShiftRegister (OUT) */ #define SHIFT_OUTPUTSIZE 16 const uint8_t shift_data{14}; @@ -30,7 +34,7 @@ ShiftRegisterOut shiftRegister(shift_data, shift_clock, shift_latch, MSBFIRST, S /* keyboard (IN) */ /* Midi links */ -USBDebugMIDI_Interface midiInterface(115200); +// USBDebugMIDI_Interface midiInterface(115200); Analog potentiometers[] = { {multiplexer.pin(0), MIDI_CC::Channel_Volume, 1}, @@ -45,63 +49,140 @@ Analog potentiometers[] = { {multiplexer.pin(9), MIDI_CC::Channel_Volume, 10} }; +byte matrix[16][6][2] = { +/*00*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*01*/ {{1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}}, +/*02*/ {{1, 6}, {1, 7}, {1, 8}, {1, 9}, {1, 10}, {1, 11}}, +/*03*/ {{1, 18}, {1, 19}, {1, 20}, {1, 21}, {1, 22}, {1, 23}}, +/*04*/ {{1, 47}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*05*/ {{1, 41}, {1, 42}, {1, 43}, {1, 44}, {1, 45}, {1, 46}}, +/*06*/ {{1, 36}, {1, 37}, {1, 38}, {1, 39}, {1, 40}, {1, 40}}, +/*07*/ {{1, 30}, {1, 31}, {1, 32}, {1, 33}, {1, 34}, {1, 35}}, +/*08*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*09*/ {{1, 24}, {1, 25}, {1, 26}, {1, 27}, {1, 28}, {1, 29}}, +/*10*/ {{1, 12}, {1, 13}, {1, 14}, {1, 15}, {1, 16}, {1, 17}}, +/*11*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*12*/ {{2, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*13*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*14*/ {{0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +/*15*/ {{2, 1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, +}; + bool ref[6*16]; +unsigned char shift = 0; + void setup() { - // Serial.begin(115200); + // Serial.begin(31250); // while (Serial.available() == 0){ // delay(.5 s); // } + // Serial.print("Serial OK"); + for (size_t i = 0; i < KEYBOARD_INSIZE; ++i) { ExtIO::pinMode(keyboard_in[i], INPUT); } - for (size_t i = 0; i < 6*8; ++i) { + for (size_t i = 0; i < 6*16; ++i) { ref[i] = false; } + // ExtIO::pinMode(shift_data, OUTPUT); + // ExtIO::pinMode(shift_latch, OUTPUT); + // ExtIO::pinMode(shift_clock, OUTPUT); + shiftRegister.begin(); } -void loop() { - // for (size_t i = 0; i < 16; ++i) { - // shiftRegister.pin(i); - // uint8_t rowValue[KEYBOARD_INSIZE]; - // bool pressed = false; - // for (size_t j = 0; j < 6; ++j) { - // if ((rowValue[i] = ExtIO::digitalRead(keyboard_in[j])) == HIGH) { - // if (!ref[j * 16 + i]) { - // Serial.print("key "); - // Serial.print(j * 16 + i); - // Serial.print(" pressed (received on pin "); - // Serial.print(keyboard_in[j], DEC); - // Serial.print(" & emmited on pin "); - // Serial.print(i); - // Serial.println(")"); - // ref[j * 16 + i] = true; - // } - // } else { - // ref[j * 16 + i] = false; - // } - // } - // } +void scanPin(int pin) { + ExtIO::digitalWrite(shift_latch, LOW); + if (pin < 8) { + byte bitsToSend = 0b00000001 << pin; + ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); + ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend); + } else { + byte bitsToSend = 0b00000001 << (pin - 8); + ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend); + ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); + } + ExtIO::digitalWrite(shift_latch, HIGH); +} +void init_shift() { + ExtIO::digitalWrite(shift_latch, LOW); + ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); + ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000001); + ExtIO::digitalWrite(shift_latch, HIGH); +} + +void next_shift() { + ExtIO::digitalWrite(shift_data, LOW); + ExtIO::digitalWrite(shift_latch, LOW); + ExtIO::digitalWrite(shift_clock, HIGH); + ExtIO::digitalWrite(shift_clock, LOW); + ExtIO::digitalWrite(shift_latch, HIGH); +} + +void noteOn(byte note); + +void noteOff(byte note); + +void loop() { + init_shift(); + for (size_t i = 0; i < 16; ++i) { + // shiftRegister.digitalWrite(i, HIGH); + uint8_t rowValue[KEYBOARD_INSIZE]; + bool pressed = false; + for (size_t j = 0; j < 6; ++j) { + if ((rowValue[i] = ExtIO::digitalRead(keyboard_in[j])) == HIGH) { + if (!ref[j * 16 + i]) { + byte type = matrix[i][j][0]; + byte key = matrix[i][j][1]; + if (type == 1) { + noteOn(key); + } else if (type == 2) { + if (key == 0 && shift >= 12) { + shift -= 12; + } else if (key == 1 && shift <= 0xFF - 47 - 12) { + shift += 12; + } + } + ref[j * 16 + i] = true; + } + } else { + if (ref[j * 16 + i]) { + if (matrix[i][j][0] == 1) { + noteOff(matrix[i][j][1]); + } + ref[j * 16 + i] = false; + } + } + } + next_shift(); + // shiftRegister.digitalWrite(i, LOW); + // delay(3 s); + } + // for (uint8_t i = 0; i < 8; ++i) { // byte bitsToSend = 0b00000001 << i; - // digitalWrite(shift_latch, LOW); - // shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend); - // digitalWrite(shift_latch, HIGH); + // ExtIO::digitalWrite(shift_latch, LOW); + // // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, bitsToSend); + // // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); + // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b11111111); + // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b11111111); + // ExtIO::digitalWrite(shift_latch, HIGH); // Serial.print(" "); // Serial.print(bitsToSend, BIN); // Serial.println(" HIGH"); - // delay(1 s); + // delay(4 s); // //bitWrite(bitsToSend, i, LOW); - // digitalWrite(shift_latch, LOW); - // shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); - // digitalWrite(shift_latch, HIGH); + // ExtIO::digitalWrite(shift_latch, LOW); + // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); + // ExtIO::shiftOut(shift_data, shift_clock, MSBFIRST, 0b00000000); + // ExtIO::digitalWrite(shift_latch, HIGH); // Serial.print(i); // Serial.println(" LOW"); - // delay(1 s); + // delay(4 s); // } // analogWrite(9, val[0] * 256 / 1024); @@ -113,3 +194,18 @@ void loop() { // loopAverage = (loopAverage + lastLoop) / 2; //delay(.5 s); } + + +void noteOn(byte note) { + MIDI_Controller.MIDI()->send(NOTE_ON_CMD, 0, note + shift, NOTE_VELOCITY); + // Serial.write(NOTE_ON_CMD); + // Serial.write(note + shift); + // Serial.write(NOTE_VELOCITY); +} + +void noteOff(byte note) { + MIDI_Controller.MIDI()->send(NOTE_OFF_CMD, 0, note + shift, NOTE_VELOCITY); + // Serial.write(NOTE_OFF_CMD); + // Serial.write(note + shift); + // Serial.write(NOTE_VELOCITY); +}