From a02490af0592182dd769ae5857b4291e19cd6cb1 Mon Sep 17 00:00:00 2001 From: XIVN1987 Date: Sat, 25 Dec 2021 18:27:33 +0800 Subject: [PATCH] add reset support --- DAPLink.uvoptx | 105 ++- DAPLink.uvprojx | 21 +- out/DAPLink.bin | Bin 11740 -> 14780 bytes out/DAPLink.hex | 1434 +++++++++++++++++++++---------------- src/DAP_config.h | 10 +- src/SWD_host/SWD_flash.c | 90 +++ src/SWD_host/SWD_flash.h | 38 + src/SWD_host/SWD_host.c | 1095 ++++++++++++++++++++++++++++ src/SWD_host/SWD_host.h | 39 + src/SWD_host/debug_ca.h | 286 ++++++++ src/SWD_host/debug_cm.h | 143 ++++ src/SWD_host/flash_blob.h | 33 + 12 files changed, 2644 insertions(+), 650 deletions(-) create mode 100644 src/SWD_host/SWD_flash.c create mode 100644 src/SWD_host/SWD_flash.h create mode 100644 src/SWD_host/SWD_host.c create mode 100644 src/SWD_host/SWD_host.h create mode 100644 src/SWD_host/debug_ca.h create mode 100644 src/SWD_host/debug_cm.h create mode 100644 src/SWD_host/flash_blob.h diff --git a/DAPLink.uvoptx b/DAPLink.uvoptx index b56536b..f8a3acf 100644 --- a/DAPLink.uvoptx +++ b/DAPLink.uvoptx @@ -153,7 +153,40 @@ - + + + 0 + 0 + 249 + 1 +
2812
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\寰帶鍒跺櫒\DAPLink\src\DAP_config.h + + \\DAPLink\src/DAP/DAP.c\249 +
+ + 1 + 0 + 1481 + 1 +
4930
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\寰帶鍒跺櫒\DAPLink\src\DAP\DAP.c + + \\DAPLink\src/DAP/DAP.c\1481 +
+
0 @@ -213,7 +246,7 @@ APP - 1 + 0 0 0 0 @@ -301,7 +334,7 @@ 2 7 1 - 1 + 0 0 0 .\src\DAP\JTAG_DP.c @@ -324,7 +357,7 @@ - CSL/StdPD + SWD_host 0 0 0 @@ -336,14 +369,34 @@ 0 0 0 + .\src\SWD_host\SWD_host.c + SWD_host.c + 0 + 0 + + + + + CSL/StdPD + 0 + 0 + 0 + 0 + + 4 + 10 + 1 + 0 + 0 + 0 .\src\CSL\NUCM480_StdPeriph_Driver\clk.c clk.c 0 0 - 3 - 10 + 4 + 11 1 0 0 @@ -354,8 +407,8 @@ 0 - 3 - 11 + 4 + 12 1 0 0 @@ -366,8 +419,8 @@ 0 - 3 - 12 + 4 + 13 1 0 0 @@ -378,8 +431,8 @@ 0 - 3 - 13 + 4 + 14 1 0 0 @@ -390,8 +443,8 @@ 0 - 3 - 14 + 4 + 15 1 0 0 @@ -402,8 +455,8 @@ 0 - 3 - 15 + 4 + 16 1 0 0 @@ -414,8 +467,8 @@ 0 - 3 - 16 + 4 + 17 1 0 0 @@ -426,8 +479,8 @@ 0 - 3 - 17 + 4 + 18 1 0 0 @@ -438,8 +491,8 @@ 0 - 3 - 18 + 4 + 19 1 0 0 @@ -458,8 +511,8 @@ 0 0 - 4 - 19 + 5 + 20 1 0 0 @@ -470,8 +523,8 @@ 0 - 4 - 20 + 5 + 21 2 0 0 diff --git a/DAPLink.uvprojx b/DAPLink.uvprojx index b83827b..63ac65c 100644 --- a/DAPLink.uvprojx +++ b/DAPLink.uvprojx @@ -339,7 +339,7 @@ - .\src;.\src\DAP;.\src\CSL\CMSIS\CoreSupport;.\src\CSL\CMSIS\DeviceSupport;.\src\CSL\NUCM480_StdPeriph_Driver + .\src;.\src\DAP;.\src\SWD_host;.\src\CSL\CMSIS\CoreSupport;.\src\CSL\CMSIS\DeviceSupport;.\src\CSL\NUCM480_StdPeriph_Driver @@ -430,6 +430,16 @@ + + SWD_host + + + SWD_host.c + 1 + .\src\SWD_host\SWD_host.c + + + CSL/StdPD @@ -561,4 +571,13 @@ + + + + DAPLink + 1 + + + + diff --git a/out/DAPLink.bin b/out/DAPLink.bin index 1ae0c101a141b1e8ba7bd7eed4c295220fca8811..799ab47827777ad841c380c00e83e8a8671a45cf 100644 GIT binary patch delta 5311 zcmbt2ZB$g(wddTq^8pMnfJCjsaA$%#dvCAQk*9UDr#%GpJ znx;dlOGBEZ&>I!avcayb7fonnoKW=%2~Aw7X=*b_=rUh=(^^I`wwH?D3-fW_K6fTm zWBdNdTAQ=aIs5GIz0bMx*@FWc0^D-MU93T<{C0#E0aO9p3Q!I3^}pL;ZE*7$>2E)U(F$T!(mH5cH{{60L7V@xP-CZ z#K^5voWRICr)rlqO@2{D@%*^xV=8hPS&U+ik#CuUTfI6tPwmlV!VGD%RjN47_Ogt;J1*|luLb0>xHzqU z29V;oxYbaBZx;Iv2j=&Jj8cF~y_rYY%=hXMhme`~!Z@KnrJB2}!+TSNd!(Bd=8x9$aMhQlC)|tX8KzX@zvo+Ub0m>J$dg`FJ`9 z|A2R!WWETcoN<@R3CKZxk72jw@ZTer{tKQj-B`9yVa_rrCeoc)5*KDPWPa%OHCXz8 ze=p;oSMUe%$&AK83%MNe^|QiZ51OCpBg&Ixz7KQ0K?|%AWef585Xbo#U{iixZs-v7 z{-yq>{qOi|$C(BA3I2&RwsstO4fSW#=YINyu}Q|LNk&FP_`Hz`A6F5=68!g_QMdeR zuhB5N-^h&qUR#C#KF**IjGjxIb7Z?`J81j3x-r!4-dcw~HV93!WdC`y;evqLvAbE% znVKb|E_@1(?yJim?lH2Xp8(!>;r{HbVJ|Q}bYXjT+HjA7V)qxa!<@kg*k~aeHnk01 zLOgPw4re#h^Kj0>kJq9Oz<=VtWAL23t+Jo-*Zb?nb&k#cA^$wK9xP(&{ccoZ3U6ve zMeFZnRqK=d8=;_`PYbrng4}( zaa(3VBk$Hc*R-vV6$~#Tj_uTUJ#Rgue%XWU&w?swp|0!u{#UH1Vr6)iihs6l{F(J_ zquWBI?mjiW(suYr0;Ah8|#Fg3A*~ZZEl%y=^ zCd06nFTR$Y%Oa^-5(l!K`F$Q!Gv@N7H?C4>4<(zMF^uiHE_Rp4%63uJ=N{Q;LluF^ zKZ>Omd&W+;(1G_;ratijOLfLJm?Jx#uMl@yn(uq~o?JgJLE$eVjbr8K)h1Rz3lP^K zdhMuDollx|MZ7m>5k4(GnX@wU zcB*Y(n?TJyAby-vm{I0lnv%a;)a90An^=|m-STfkPH|9$E?R|}MrmQfnP7#V?14&T zvy$zHD4&qa;(^?J6LX3vm&o~u_)%_U;B1uhp$W$Fhlm|Ycy{cY5*^E9H4+Eoov~ZA zIgV9m^ChtoZC)Q+ppCD`9NHL;*|brLeM1|^V>f9disx#hE}o^0Y&=~X-%1#?adin{ zG-L}w6WH=>gmA2i&CnSvTO!ayY8ii^gb734)pm%#&YL~=C&ai^f5CEh`$5Cf7Ms_4 zY1jqLPJY@Xex6rgXg-Q)W+w8Eu~@E(hTfZX3j^3q)1lZ+X3Vfzq4YUC4q*A>VM>TN zAMK6v=|$lbu>5B=epP41@+a!lRh<>fC$H+PSpMLe&Wh!Cuj;H=9yol#(=_>`htgVu z(SJQbUw05HG zC5%%y++sa@Fum;Z2<@{(IUgg+D}=UcI(tjQT>WOq5;JPIw!x{-3352RdsLmJZX7q; z0b@AGz*>r7zyge&qKM0>w|lV@g%Ko=tKS4wJakW9>(A=&Fioc%FR)};M=P-0N7~?0 zB}yN`&WRMgUN8%KIZ&&YWrXWZ92Gn#q?gV5i=YNoe;1sh8@m30&gROP0W$`63bSW_7)*G|_1*r{p@ zYQGWKqmsPv4%2220tsYL@s7SG>0Ty~Vp$>ipnF~=-np7;fK+wXJ0Clju zpvC%T-KCMFpn0%9shzr7PMZe>K#+Kipy@=?z07rjvKJyd6>>R|v;tHp+GzVq^!Uu` zKSdV<^=Vj7inc;#V1aeuePCQd&*A+<34EA3W*yAtXu|w%W}c0)BkocJaTD<9p-dD_)S-kM&JAU;(`bTb_vWt&q-~29@hrh8CCm6N z!UrF*ZnU=8%y4otFbwy@=2?)zv~$sCMy;)wZ}`SQ9X?qk>x|zNlE=mp&fr~3mn=Oy zPgi!~R2tBaMUp!^NM(v4D!UBD`Uxm`O6!+1g8fvrSFRNda=FcUQUG!9MEZOLxH5*hNx0nQTH2Ib=40UrH?`|n!V=urWcpS*oGpN$ z&=P$W@}jbJNXL9cO_}_(w@x>VxGdmm28tiLiLxVMf&|tFU`ZEI`&;3)_@Ce$v(zS3 z0)uS{E{M9@HJ>C~jpmaP+H^pL`Yw1Cetv$AzeC6uY{F7|D_mJUQM4WJV0NBR&F$XS zw9cN^%ucQ~tMi0@q!l+7a+<`h!W}s;BxvP2{(hqpp*)5 zB?1;lto?}lfk5mzt9k3tL6dWOq)oUL+;LMs0!x)(^wFY0wH~ z3-??n-cN(~#uODsltZy(>#`2QorB<73Rvhp1TRo}4_LG}sNGc0d6TRm5S>JM8#G@2 zk6*$!#`|Oi=za(krk4DXxWI)bNTq8*1%**34Uxse+tLb5UbmMhkHTH~C(;?T*{LEg z#==3GS786oV~2xHa!)NyiH=w|;GAHESc2Qp3aI-ssDBlnyBMwOq2GtJ2O#e602d?4 zL~4w!2%=pz`(=c61#rt!h`84vrhjLyUtJDNS0AjRteF%FeBGCUoh#Gw1X&JKOZV|Je2`gn_X{ zwo7#UjLd@nBk%&Gc2fLAlqk{YR*5K^;GV1&^1!GUBQ3U;gQyIDhPW3XykP&3Mtn#+ z_`ez+j4syh>NRoXjD%lWhVAlg^u}KmKMtBhc576>)K2Wx@a|}`k5@^m7p#2%;Qk0r?uxkoDB_wTM9B`2zEng`M7vWCIv#DG3CKH9Z*Z|z5wqg% zpj|2fX14;PDu6`*v_jd>cL3y$Zb&w}Fz;3_JE7EXQfX3P@Qfl?nqFF84uyySNVV(w7VVRen*=4#rh zdt#>0lI5vB5IYABMUWSFxN$wTqbt@Iq|ue8lPosI+Gku&Pd^RG*a%|wf|!>9_5i#D zunS=47^U#V+QI!@V?$oa({ZXbH@E_)EBgQJXR!CNc8A^F+Nxb%r^kD z^#G3nJOc1TVAcS(Ca)xZCIIVT?|Wb?J?pqC0QbTAN~(-qDbWJ(+BD)ku-Gt$ve63q zbxFT65tLkL_1u^aw})01)HBR?T%jF>r&-4D3T-T^VX-UpYv%~Ye(~v&ow!|`Te^wq zs1birT2gfKAoOw-mwIf`lfDMzxB|azo}sRh%D*;KQh!#pnY@R=Rf2`yMkf>VJF5$?u%s zd-tAme?8~+==vY-9N<;}Upo(=m)d%2k5bz}Z6mdRKTl9@(-c2I@kwgire_1w-C&yQ z2LN`k|2;)B^IvY7C;k6IS58B|A2Xbc)yW)$Vev@}aPT5*;mApJeIrtTnE?KH1`zmH zwcirP>g|_7eTmwMELQKioE+tZ1|HP)hqwgtyFyFCNJSdC5qqyf>N6932&soBnwLe! z&erOFlSV{5-;LBn9`Q)+$ki?nQ2PEn8NzeQw`R2Q$2H$FyS0u1%q`VjC!ixVWW$yCi?_0j}+-}DuAPGrebOt_rODkf$) zGPb3rJBrnYY|P}K5g1WlmZX{Y7^EK6$X@eZ)EU%B*1VHCOEvPeWj?|rVL4bCqdDeL zt1;UJKz1Q!1|GmJtfL%DxeAIgvdcO`7p8LYK9Y)iu)zj8Bgr&IUrsQBlxis?R4}BBBZvFeOH3mJfkn*B;Tg zw}0~I2=L-!!rB7pEUC3EcF19IF_-vaDVAoHog~|B%LjV2OCw@}2_0&ON{6V8Z_z46 z#EVIea@zPVEh+-fiz{qE; zNL~;HB@o@eqBFg<-#pxz-qw$Xnp7TvpbHj^r`SgChvHX|?UIern^ zAgIU-y8_*H-9owrSaD}qP1Yo^)GD>4P5y1tr_wB@l@^Ozw}zpLmA5X3ivFeVwiH`V zA^#e2P1LDq{z9=Pd6(EvY>ryb*_5FW}D z?q*dNpnxNV4hSJo-_GNJCw2HdDsZ3LtFOK0g6vSxfg(CUd&o^irRYYo&pDHbMNItz z!@Sfb{Uix##P5>|nC3L@Vq5Xj1t^O?&VL~tm_+6nd=`VDYL|kR)Rq~Ll6kQ_QT?^1@l5nkRx=Bww z)DzM*dw&84EU6>sk?n64E>IQRsmHtzm3Mnjr|QFPQ~6#aH@K_O9P*(1j>_9;&+v45 z7Sic)7!{ahjb|w%jK$~#Y2#s+~kKj*GC@Q>V81~PfK zf!2JHfo#6ez+;mZ13O5v*wOI%h{iJ+WT)fIy*xr2yctUaRaj1rs?FO+3dJ^QyLXxR zf;Xb#QdX&@cND#viB?>StfaK0jM;pIcF%Ps#~Dz2^KtB{!_-@yi!Us-Bb;%>Lo)4P+#0}O)JJyFn-ItGYoz;7_X~oWKb~PQ-2Dfb>xP|S5O}rZrp%R zR*@A=RpgDP8HM@rvFzuxV@HGJSW~)ul)Cic>4gjm{mc8I8i4w|xC|f^BqtW0nSp(5 Y0q^fEp7rq>J9{m2_ZAz+%?$wj1w}0M<^TWy diff --git a/out/DAPLink.hex b/out/DAPLink.hex index 661e304..384f599 100644 --- a/out/DAPLink.hex +++ b/out/DAPLink.hex @@ -1,63 +1,63 @@ :020000040000FA -:10000000104E0020312B0000712B0000732B0000DC -:10001000752B0000772B0000792B000000000000FA -:100020000000000000000000000000007B2B00002A -:100030007D2B0000000000007F2B0000812B0000C2 -:10004000832B0000832B0000832B0000832B0000F8 -:10005000832B0000832B0000832B0000832B0000E8 -:10006000832B0000832B0000832B0000832B0000D8 -:10007000832B0000832B0000832B0000832B0000C8 -:10008000832B0000832B0000832B0000832B0000B8 -:10009000832B0000832B0000832B0000832B0000A8 -:1000A000832B0000832B0000832B0000832B000098 -:1000B000832B0000832B0000832B0000832B000088 -:1000C000832B0000832B0000832B0000832B000078 -:1000D000832B0000832B0000832B0000832B000068 -:1000E000832B0000832B0000832B0000832B000058 -:1000F000832B0000832B0000832B0000832B000048 -:1001000087080000832B0000832B0000832B000056 -:10011000832B000041040000832B0000832B000090 -:10012000832B0000832B0000832B0000832B000017 -:10013000832B0000832B0000832B0000832B000007 -:10014000832B0000832B0000832B0000832B0000F7 -:10015000832B0000832B0000832B0000832B0000E7 -:10016000832B0000832B0000832B0000832B0000D7 -:10017000832B0000832B0000832B0000832B0000C7 -:10018000832B0000832B0000832B0000832B0000B7 -:10019000832B0000832B0000832B0000832B0000A7 -:1001A000832B0000832B0000832B0000832B000097 -:1001B000832B0000832B0000DFF810D002F0FEFC40 -:1001C00000480047CD020000AFF30080104E002031 +:10000000204E0020ED3600002D3700002F37000075 +:1000100031370000333700003537000000000000A2 +:100020000000000000000000000000003737000062 +:1000300039370000000000003B3700003D3700006A +:100040003F3700003F3700003F3700003F370000D8 +:100050003F3700003F3700003F3700003F370000C8 +:100060003F3700003F3700003F3700003F370000B8 +:100070003F3700003F3700003F3700003F370000A8 +:100080003F3700003F3700003F3700003F37000098 +:100090003F3700003F3700003F3700003F37000088 +:1000A0003F3700003F3700003F3700003F37000078 +:1000B0003F3700003F3700003F3700003F37000068 +:1000C0003F3700003F3700003F3700003F37000058 +:1000D0003F3700003F3700003F3700003F37000048 +:1000E0003F3700003F3700003F3700003F37000038 +:1000F0003F3700003F3700003F3700003F37000028 +:10010000870800003F3700003F3700003F370000FE +:100110003F370000410400003F3700003F37000038 +:100120003F3700003F3700003F3700003F370000F7 +:100130003F3700003F3700003F3700003F370000E7 +:100140003F3700003F3700003F3700003F370000D7 +:100150003F3700003F3700003F3700003F370000C7 +:100160003F3700003F3700003F3700003F370000B7 +:100170003F3700003F3700003F3700003F370000A7 +:100180003F3700003F3700003F3700003F37000097 +:100190003F3700003F3700003F3700003F37000087 +:1001A0003F3700003F3700003F3700003F37000077 +:1001B0003F3700003F370000DFF810D003F0EEFAC1 +:1001C00000480047CD020000AFF30080204E002021 :1001D00010B500F0ACF84FF08044606B5C4908400B :1001E0006063606B5B4908436063E06A20F0030072 :1001F00040F48270E062D4F8200220F0F00040F079 -:100200003000C4F82002544801F0E5FB0020C4F897 -:10021000000100225149524802F058F900F092F9C9 -:1002200000F0C6FA02F063F9BDE81040352000F096 -:1002300073B810B5012211464A4801F001FF4FF092 +:100200003000C4F82002544802F0C3F90020C4F8BA +:10021000000100225149524802F036FF00F092F9E5 +:1002200000F0C6FA02F041FFBDE81040352000F0B2 +:1002300073B810B5012211464A4802F0DFFC4FF0B6 :100240008040816B21F0FF018163816B41F0770178 -:100250008163454C00221146204601F08AFB20466E -:1002600001F0B9FB414C4FF4E131204601F037FF7A +:100250008163454C00221146204602F068F9204691 +:1002600002F097F9414C4FF4E131204602F015FDC0 :10027000616841F013016160BDE81040302000F07A :100280004BB870B500F053F84FF08044E06D20F4A7 -:100290007F40E065E06D40F42A40E065012001F018 -:1002A000B5FD012001F054FC314D284601F067FDF9 +:100290007F40E065E06D40F42A40E065012002F017 +:1002A00093FB012002F032FA314D284602F045FB63 :1002B0001121C4F834120021C4F800112D490D6039 :1002C0002D482E49B5FBF0F0086070BDFFF7D9FF4F -:1002D000FFF7AFFF01F082F8FFF77AFF214C012210 -:1002E00040341146204601F05FFE012202212046E3 -:1002F00001F05AFE224D1D4C2E1D00F0CAF900F0EF +:1002D000FFF7AFFF01F09FF8FFF77AFF214C0122F3 +:1002E00040341146204602F03DFC01220221204606 +:1002F00002F038FC224D1D4C2E1D00F0CAF900F012 :1003000013FBA06940F34070401C2860A06940F3D3 :100310000070401C3060F0E700F01F0201219140A6 :100320004009800000F1E020C0F80011704710B5CE :100330005921880716228823C0F80011C0F800212F :10034000C0F80031D0F80041002CF5D010BD0000FD :10035000FFFF00F00000EE0E1B00004093050000C0 -:10036000542C000040400040123C8C770020074095 -:1003700000B0710B7401002040420F007801002092 +:100360003438000040400040123C8C7700200740A9 +:1003700000B0710B8001002040420F00840100207A :100380008048004070B5034601251878072815D02D :10039000F34C607818B16068A268904210D0F148C0 -:1003A000626800EB82100A46194602F0F5FB6068AD +:1003A000626800EB82100A46194603F0D3F96068D0 :1003B000401C60606068102803D004E0EA480570C3 :1003C00070BD002060606068A1688842F8D16570E7 :1003D00070BD10B5E5480068E5490844E34C241DAC @@ -71,13 +71,13 @@ :10045000042068606869C00704D0286940F4FA6025 :10046000286103E0286920F080002861E00715D0AA :1004700001206860F00705D0286940F4FA6028611F -:1004800002F0C6FAB00703D5286920F010002861F1 +:1004800003F0A4F8B00703D5286920F01000286114 :10049000700703D5286940F4FA602861200701D568 :1004A00008206860A0074CD5002C10DA4FF00040FF :1004B0006860AE482438016841F001010160AB4832 -:1004C0001438016841F00101016002F010FAE00304 -:1004D00004D54FF48030686002F035FAA0030DD5E2 -:1004E0004FF40030686002F074FAA4484178202983 +:1004C0001438016841F00101016002F0EEFFE00321 +:1004D00004D54FF48030686003F013F8A0030DD505 +:1004E0004FF40030686003F052F8A44841782029A6 :1004F00004D10079012801D100F077F9600304D517 :100500004FF480206860FFF79AFF200304D54FF472 :1005100000206860FFF75DFFE00202D54FF4801015 @@ -88,13 +88,13 @@ :100560000871183A11608149203908607F4941209B :10057000083908607D494820103908607B492120EE :10058000083108607949882008604020091D08600A -:1005900070477CB5684601F0BCFF9DF80000784CC0 +:1005900070477CB5684602F09AFD9DF80000784CE3 :1005A0000006A4F1040529D59DF80100012809D011 :1005B000022807D0032805D0212807D0002000F00A :1005C000B9F87CBD002000F0B5F87CBD9DF80400B2 :1005D000012808D16A48083800686549072208449C :1005E000684900F098F8206840F0800020600720FB -:1005F00028600021084601F091FF7CBD9DF80100B4 +:1005F00028600021084602F06FFD7CBD9DF80100D7 :1006000000260B2820D004DC09280AD00A2804D1AF :1006100014E020282FD022281AD0002000F08AF8D9 :100620007CBD9DF803000328FAD1554810300168BD @@ -103,10 +103,10 @@ :100650009DF80400012808D19DF802009DF80310C0 :1006600040EA01204849A1F80C04206840F08000CD :1006700020602E607CBD9DF80400012803D1072175 -:10068000404801F04BFF206840F0800020602E6061 +:10068000404802F029FD206840F0800020602E6084 :100690007CBD70B5324CA0686168884201D1607839 :1006A000B0B3344DE068A26805EB80112D4800EB33 -:1006B000821000F002FEA068401C102800D100202B +:1006B000821000F023FEA068401C102800D100200A :1006C000A060A16862680020914200D1607021782A :1006D00081B12070E06805EB801124481038006873 :1006E000234A1044402200F016F8204940200C39DB @@ -117,9 +117,9 @@ :10073000F5D118BD0021124B03EB0112126802F033 :100740000F02824208D10E48001D00EB0110016823 :1007500041F0020101607047491C0C29ECD370473D -:1007600010010020A00100202B01002030050C40CA -:1007700000010C40A005002000000C406C0100208E -:1007800008050C4024010020A0090020BB490020DE +:1007600010010020AC0100202B01002030050C40BE +:1007700000010C40AC05002000000C407801002076 +:1007800008050C4024010020AC090020BB490020D2 :10079000A1F84E047047BA480168BA488180B84948 :1007A000091F0968B84A114401600121C1807047DE :1007B000B34942201C390860B149C8202439086077 @@ -134,7 +134,7 @@ :100840000222F1E70322EFE7002308E0082306E095 :10085000182304E0282302E0382300E00023317944 :1008600059B101290BD002290BD000210091316828 -:1008700001F0D1FCC5F80041F8BD0021F6E70421E4 +:1008700002F0AFFAC5F80041F8BD0021F6E7042107 :10088000F4E70421F2E770B5824BD8697B4AC007D0 :100890004FF400754FF000041AD1D869C00617D480 :1008A00019E01868C1B2B2F80002A84210D2B2F83A @@ -166,572 +166,762 @@ :100A4000431CA2F80834104490F806020860B2F87B :100A50000804A84201D3A2F80844012080F31088BA :100A6000B2F80604401EA2F80604002080F31088A5 -:100A7000486840F002004860BDE8F881A009002005 -:100A800064050C40F00D002000010C4004E000E083 -:100A9000A00B0020002007402401002070B54FF07B -:100AA000402501220221284601F07EFAFE49012458 -:100AB0000C6001221146284601F076FAFA49091F16 -:100AC0000C6001220421284601F06EFA2846BDE898 -:100AD00070400122042101F067BA10B54FF04024A4 -:100AE00000220221204601F05FFA20460022BDE8E4 -:100AF0001040012101F058BAEFE7002070470022B2 -:100B0000062824D006DC052821D2DFE800F02020CA -:100B100020200C00F0280DD0FD2818D0FE2813D07E -:100B2000FF2814D10AE0E14802680A6000790871E0 -:100B300005220CE011200870012208E04020087016 -:100B400000204870022202E01020087001221046A6 -:100B500070474FF47A414843401EFDD170470278F8 -:100B6000407842EA00208001401EFDD10870D04844 -:100B7000704710B5CC4B02781B1DCD4C002A05D018 -:100B8000012A08D0FF200870204610BD407800F0F0 -:100B90000100186003E0407800F0010018600020B8 -:100BA0000870204610BD70B50D460478002C00D1A9 -:100BB0000124012C04D000242C704FF0011070BDD2 -:100BC000BC4901200870FFF769FFF5E770B50446DE -:100BD000B84900250D70FFF780FF2570012070BD1A -:100BE00010B50446FFF789FF6070002020700220D6 -:100BF00010BDF0B5037842788478C57844EA0524BE -:100C0000057940792D0445EA00600443A64DD607D6 -:100C10004FF001074FF0000004D0DE0701D02F6035 -:100C200000E02860A44E5FEA827C05D55FEA837C01 -:100C300001D5376000E0306064B3A04FBC4200D9FA -:100C40003C464FF0E027B86104EB4404A4017C610A -:100C500005243C61D40702D02C689C4214D194072F -:100C600003D53468B4EB530F0ED1540702D5B0EB63 -:100C7000930F09D1940602D5B0EB531F04D114068B -:100C800007D5B0EBD31F04D03C69C4F30044002C5B -:100C9000E0D038612868326840EA4200087088482D -:100CA000F0BD30B50278437842EA03228378C078F9 -:100CB0001B0443EA006002438248002A08D0824DA8 -:100CC00000247C4BAA4206D301225A705A600FE0DE -:100CD000FF220A7030BD5C707C4D1544B5FBF2F20A -:100CE000022A03D90325B2FBF5F200E001225A6083 -:100CF0000C7030BD70B50D4610F8014B0146002C4C -:100D000001D14FF48074204600F07AFB0020287057 -:100D1000E41DE008401C0004401C70BD0078654ADA -:100D200000F003035B1C1375C0F3800050750020B6 -:100D300008704FF00110704710B5FF220A700122B1 -:100D4000012410F8013B0AE010F8011B01F03F01FB -:100D500001B94021C91DC90808440A44521C5B1E40 -:100D6000591CF1D1204662F31F4010BD0078FF22CC -:100D70000A70401C0004401C7047FF2008704FF0B0 -:100D80000110704710B54B4A03781372437884788A -:100D900043EA04235381C378007943EA0020908119 -:100DA000002008704A4810BD2DE9F04F87B0044676 -:100DB00006940020049005918D1CDFF818A10021F5 -:100DC0008AF80010002703916678A41C002E69D0D1 -:100DD00014F8018B5FEA887165D587B33548B0F8A0 -:100DE0000A9008F0110001280DD101A9404600F039 -:100DF000A2FD022815D1B9F1010912D39AF8001009 -:100E00000029F2D00DE001A90E2000F094FD022887 -:100E100006D1B9F1010903D39AF800100029F2D0E4 -:100E2000002701283ED1019929700199090A6970AA -:100E30000199090CA9700199090EE9702D1D5FEA4D -:100E4000C8616AD520786178E27840EA0120A1780B -:100E5000090441EA026108430290241D1548B0F8D4 -:100E60000CB05FEAC87011D01248B0F80A900021A7 -:100E7000404600F060FD022806D1B9F1010903D314 -:100E80009AF800100029F2D001280BD10948B0F8D7 -:100E90000A9001A9404600F04EFD022821D1B9F187 -:100EA000010919E0B6E06EE004480040702C000033 -:100EB00001000200F80D002000480040C0C62D00CF -:100EC0000100060001000400006CDC02FFD7B80539 -:100ED000010005002B01002003D39AF8001000291F -:100EE000D7D001280DD1F949019A09691140029A18 -:100EF000914206D0BBF1010B03D39AF800100029F0 -:100F0000C4D0F249019A09691140029A914201D074 -:100F100040F0100001287DD132E0EC49B1F80A9090 -:100F20005FEAC87111D05FBB0021404600F003FDAD -:100F3000022806D1B9F1010903D39AF8001000295B -:100F4000F2D0012872D101271AE001A9404600F031 -:100F5000F2FC022806D1B9F1010903D39AF8001076 -:100F60000029F2D0012861D1019929700199090A5B -:100F700069700199090CA9700199090EE9702D1D7C -:100F80000021039148E0F7B1D048B0F80A9001A9D8 -:100F90000E2000F0D0FC022806D1B9F1010903D3DC -:100FA0009AF800100029F2D001283FD1019828704A -:100FB0000198000A68700198000CA8700198000E52 -:100FC000E8702D1D002720786178E27840EA012042 -:100FD000A178090441EA026108430190241D5FEAF7 -:100FE000886103D5B9490861012015E0B748B0F818 -:100FF0000A9001A9404600F09EFC022806D1B9F1F2 -:10100000010903D39AF800100029F2D001280DD16C -:10101000012100E00AE003910499491C04919AF827 -:10102000001019B9761E002E7FF4D2AE5EB114F80E -:10103000011B8A0703D5C90602D5241D00E0241D23 -:10104000761E002EF3D101282FD1EFB19F4846899B -:1010500001A90E2000F06FFC022806D1761E711C3B -:1010600003D09AF800100029F2D001281DD101996F -:1010700029700199090A69700199090CA9700199EF -:10108000090EE9702D1D10E0039971B18F48468952 -:1010900000210E2000F04FFC022806D1761E711CA4 -:1010A00003D09AF800100029F2D0DDE90412117083 -:1010B000059948700598291A069807B0201A41EA40 -:1010C0000040BDE8F08F30B504464278801C002A0D -:1010D0000BD010F8013B9D0703D5DB0602D5001DA0 -:1010E00000E0001D521E002AF3D100220A704A704F -:1010F000001B0004801C30BD744A1278012A00D005 -:10110000E1E751E62DE9F84F044600260020894624 -:10111000CF1CDFF8BCA100218AF80010641C2178E4 -:10112000627841EA0225A41C002D74D014F8018BCA -:10113000DFF898B15FEA88715BD55FEAC87135D096 -:10114000BBF80A400021404600F0F5FB022806D11A -:10115000641E611C03D09AF800100029F2D0012807 -:1011600059D123E025B95FEAC87001D04FF00E08CD -:10117000BBF80A406946404600F0DDFB022806D174 -:10118000641E611C03D09AF800100029F2D00128D7 -:1011900041D1009939700099090A79700099090CB8 -:1011A000B9700099090EF9703F1D761C6D1E691CFF -:1011B000D8D130E020786178E27840EA0120A17847 -:1011C000090441EA026108430090241D3F48B0F839 -:1011D0000AB06946404600F0AEFB022806D1BBF1DA -:1011E000010B03D39AF800100029F2D0012812D184 -:1011F000761C6D1E681CDDD13448448900210E2008 -:1012000000F099FB022806D1641E611C03D09AF8F5 -:1012100000100029F2D089F80060310A89F8011025 -:1012200089F80200A7EB0900BDE8F88F10B5044665 -:101230002648007801280AD000200870487088707D -:101240000320E178890706D540F4802010BD2046B0 -:10125000FFF758FFF5E76178A27841EA02210422FE -:1012600002EB810140EA014010BD38B50C464178DF -:10127000827841EA0222C1780079090441EA0060DB -:10128000024300926946002000F055FB00202070C8 -:10129000012038BD10B50D4A1278012A05D0FF2073 -:1012A0000870012040F4A02010BDFFF7DEFFF9E731 -:1012B000FF2008704FF00110704710B50278A2F1BE -:1012C00080031F2B06D8FFF7F3FF10BDF80D002099 -:1012D0002B01002001F8012B0C4610F8011B1729E7 -:1012E00057D2DFE801F00C14181C44484C5650202B -:1012F000245656565656282C3034383C4000007838 -:10130000611CFFF7FCFB207000F10210DDE72146B5 -:10131000FFF72FFC3AE02146FFF745FC36E0204678 -:10132000FFF754FC32E02146FFF719FC2EE020467F -:10133000FFF756FC2AE02146FFF75BFC26E021463A -:10134000FFF7AFFC22E02146FFF7D4FC1EE0214668 -:10135000FFF7E4FC1AE02146FFF7EEFC16E0214619 -:10136000FFF704FD12E02146FFF707FD0EE02146DE -:10137000FFF708FD0AE02146FFF7BEFE06E0214622 -:10138000FFF754FF02E02146FFF784FF00F1011050 -:101390009BE7FF2004F8010C4FF0011095E72DE9C1 -:1013A000F04102787F2A02D0BDE8F04185E70A705B -:1013B0004478851C4C708E1C4FF0021708E03146B3 -:1013C0002846FFF77AFF074405EB104580B2064434 -:1013D000641E601CF3D13846BDE8F0810748002147 -:1013E0000170417016224260017264224281818143 -:1013F0000161012202754175FFF77EBBF80D0020E7 -:101400002DE9F04100220023FF4CFE4E00274FF053 -:10141000010C06F10408656815E013B911F8012BF9 -:101420000823D40702D0C6F800C000E03760C8F82F -:1014300000702C46641EFDD1C8F800C02C46641E06 -:10144000FDD152085B1E401E441CE6D1BDE8F08170 -:101450002DE9F05F834689460120DFF8A883C8F8AC -:10146000000008F1040500262E6001272F60C8F84F -:1014700000B02E602F604FEA5B00C8F800002E60BD -:101480002F600BEB00014FEA9B00C8F800002E60B4 -:101490002F6001444FEADB00C8F800002E602F6087 -:1014A0000844C8F800002E602F60C8F800602E6065 -:1014B0002F60C8F800702E602F60002201214FF0CD -:1014C000402000F071FDDFF840A39AF814100800E6 -:1014D00004D02E602F60491E0029FAD12E60D8F862 -:1014E00000102F602E60D8F800202F6041EA4202E1 -:1014F0002E60D8F800102F6042EA8104012C12D02F -:10150000022C62D0042C60D0213020B12E602F60DC -:10151000401E0028FAD100F014FA0120C8F800009B -:10152000E0B2BDE8F09F5FEA8B7125D50022002173 -:1015300020202E60D8F800302F601944520842EA6B -:10154000C372401E0028F4D12E60D8F800002F602E -:101550004140C80700D00824B9F1000F01D0C9F8F4 -:1015600000209AF8140020B12E602F60401E002841 -:10157000FAD100F0E6F918E020B12E602F60401E8D -:101580000028FAD100F0DDF9D9F80000002220216E -:10159000C8F800002E602F6002444008491E002950 -:1015A000F6D1C8F800202E602F609AF8080038B1F4 -:1015B0000021C8F800102E602F60401E0028FAD1CC -:1015C0000120C8F80000E0B2ABE79AF8151041B16D -:1015D0005FEA8B7105D521212E602F60491E0029FD -:1015E000FAD120B12E602F60401E0028FAD100F001 -:1015F000A8F99AF8150058B15FEA8B7008D400205A -:10160000C8F8000021202E602F60401E0028FAD16B -:101610000120C8F80000E0B283E72DE9F05F8246C0 -:101620008B4600220120774E3060371D4FF00008B6 -:10163000C7F80080DFF8D091D9F804000146491EB0 -:10164000FDD101243C600146491EFDD1C6F800A031 -:10165000C7F800800146491EFDD13C600146491E85 -:10166000FDD102EB0A034FEA5A023260C7F800804C -:101670000146491EFDD13C600146491EFDD113447F -:101680004FEA9A023260C7F800800146491EFDD138 -:101690003C600146491EFDD113444FEADA02326034 -:1016A000C7F800800146491EFDD13C600146491E35 -:1016B000FDD199183160C7F800800146491EFDD15F -:1016C0003C600146491EFDD13160C7F800800146EB -:1016D000491EFDD13C600146491EFDD1012131600A -:1016E000C7F800800146491EFDD13C60401EFDD177 -:1016F000002201214FF0402000F056FC99F81430F0 -:1017000019000DD0D9F80450C7F800802846401EB3 -:10171000FDD13C602A46521EFDD15B1E002BF3D149 -:10172000C7F80080D9F804000246521EFDD1326885 -:101730003C6003465B1EFDD1C7F8008003465B1E7C -:10174000FDD133683C6005466D1EFDD142EA43027F -:10175000C7F8008003465B1EFDD133683C60054638 -:101760006D1EFDD142EA8305012D17D0022D7DD0DB -:10177000042D7BD0213159B1C7F800800246521E9A -:10178000FDD13C600246521EFDD1491E0029F3D115 -:1017900000F0D7F801203060E8B2C2E65FEA8A7252 -:1017A00043D54FF0000C00232022C7F800800146EB -:1017B000491EFDD1D6F800A03C600146491EFDD16E -:1017C00053444FEA5C0141EACA7C521E002AECD124 -:1017D0003A46C7F80080CE460146491EFDD1316821 -:1017E0001460401EFDD14B40D80700D00825BBF146 -:1017F000000F01D0CBF800C09EF8143093B1DEF892 -:1018000004C003E000480040F80D0020C2F800804A -:101810006046401EFDD114606146491EFDD15B1E2D -:10182000002BEED100F08DF831E059B1C7F80080FF -:101830000246521EFDD13C600246521EFDD1491E99 -:101840000029F3D100F07DF8DBF800004FF0000C28 -:101850002023D9F804203060C7F800801146491EC3 -:10186000FDD13C601146491EFDD100E026E08444D4 -:1018700040085B1E002BEED1C6F800C03946C7F801 -:1018800000801046401EFDD10C60521EFDD199F81B -:10189000081079B100203060D9F80420C7F8008022 -:1018A0001046401EFDD13C601046401EFDD1491E31 -:1018B0000029F3D101203060E8B232E699F8152012 -:1018C0007AB15FEA8A720CD52123C7F800800246FC -:1018D000521EFDD13C600246521EFDD15B1E002B04 -:1018E000F3D159B1C7F800800246521EFDD13C60C9 -:1018F0000246521EFDD1491E0029F3D100F021F805 -:1019000099F8150098B15FEA8A7010D40020306011 -:101910002121D9F80420C7F800801046401EFDD1CF -:101920003C601046401EFDD1491E0029F3D1012024 -:101930003060E8B2F5E5064A5278002A00D087E523 -:101940006BE6012211464FF0402000F02DBB000055 -:10195000F80D002000F01F0201219140C943F84A10 -:10196000800F02EB800002680A4002607047F54871 -:10197000F0E770B510F47F3F14D0C0F38143022B21 -:1019800023D06FEA9044A40722D0ED4C1C3404EB22 -:1019900083031C68C0F38725C0F34416B540AC43ED -:1019A00014431C60420E52070ED0E54BC0F3017287 -:1019B0000C3303EB82021468C0F34263C0F304509B -:1019C00083409C430C43146070BDDD4B2833E0E73B -:1019D000DB4B2C33DDE700F01F0201219140D84A98 -:1019E000800F02EB800002680A430260704710B566 -:1019F000044641EA4210D24940F010005C310860D0 -:101A0000D04B1846FFF7E7FF2146BDE81040002203 -:101A10001846AEE7CC48016841F004010160C848AF -:101A2000001F016841F08001016030BF7047C64867 -:101A3000016821F004010160C148001F016821F024 -:101A40008001016030BF7047BD48001F0068C007BB -:101A500001D0BE48704700207047B948001F006899 -:101A6000800702D54FF4004070470020704710B542 -:101A700001F00CF84FF08041D1F834024207B4482D -:101A800019D0D1F8342202F00702012A15D0D1F87A -:101A9000342202F00702022A12D0D1F8342202F0D6 -:101AA0000702032A0FD0D1F8341201F007010429EC -:101AB0000CD0006810BD006810BD0068400810BD63 -:101AC0000068800810BD0068C00810BD00680009EB -:101AD00010BD10B500F0DAFF4FF08041D1F83402AC -:101AE00010F0700F9A4819D0D1F83422C2F30212C4 -:101AF000012A15D0D1F83422C2F30212022A12D0E0 -:101B0000D1F83422C2F30212032A0FD0D1F83412D2 -:101B1000C1F3021104290CD0006810BD006810BD8B -:101B20000068400810BD0068800810BD0068C0084B -:101B300010BD0068000910BD10B500F0A7FF844873 -:101B4000006810BD10B500F0A1FF8148006810BD0D -:101B500030B505467F490124A20705E0081EA1F122 -:101B6000010101DC002404E0D2F8503235EA030020 -:101B7000F4D1204630BD2DE9F04107460E46704CA9 -:101B8000241F206D00F01005206840F00400206044 -:101B90001020FFF7DDFF206940F007002061206A78 -:101BA00020F00F0232432262206920F007013943FE -:101BB0002161A4F5007400F069FF002D05D1D4F86F -:101BC000000220F00400C4F80002BDE8F08108B56E -:101BD000002061A10968009159493C31096811F45C -:101BE000A02F13D159488A0310D4C1F381321DF8B4 -:101BF0000220C1F30800801CC1F34421491C574B4B -:101C0000584311FB02F1B0FBF1F0C00008BD4C4895 -:101C10003C30016841F48031016070472DE9F84F94 -:101C200004460D46FFF7F3FFDFF8209104B3444864 -:101C3000001F016841F0040101601020FFF788FFD8 -:101C40004FF40020009046484649284488426BD80B -:101C50004FF0FF3100274FF000080026AB4601236C -:101C6000A9B3032B45D0042B0ED0022B0FD010E0CC -:101C70003348001F016841F0010101600120FFF7B6 -:101C800067FF00200090DEE74FEA8B0501E04FEA96 -:101C90004B05022269B3B9FBF2F0334CDFF8C8C040 -:101CA0000444CCF1000C644520D80224DFF8BCE0E9 -:101CB000C0F35D0A0AFB04F0DFF8A4C08444F445D5 -:101CC0000FD8B0EB950F03D9A0EB950C02E013E011 -:101CD000C0EB950C8C4504D261461746A0461E46C3 -:101CE00021B1641C40F201208442E3D9521C202A15 -:101CF000D0D95B1C042BB3D90098711E40EA813106 -:101D0000781E41EA4020A8F1020108430C493C3109 -:101D100008600420FFF71CFF7E43B9FBF6F000FBD0 -:101D200008F04000BDE8F88F4CB1054810493C3040 -:101D300001600420FFF70CFFBDE8F84F47E719E00A -:101D4000040200400600C05710ED00E0001BB70081 -:101D50007401002080F5200001020204C0C62D009D -:101D6000800F05FD8074D21A00F7C2FFC0687804A6 -:101D70001E420800854844F21E210160D9E770B573 -:101D800006464FF08044D4F8500200F01005804819 -:101D9000864200D9064604F50074206840F004002D -:101DA00020601020FFF7D4FE206940F0070020617A -:101DB000206A20F00F0020622068A4F50074C0079C -:101DC00005D031460020FFF729FF064609E03146DD -:101DD0004FF40020FFF722FF0646D4F8500200F02F -:101DE000100500210220FFF7C6FE2DB9D4F800022D -:101DF00020F00400C4F80002304670BD6349303959 -:101E00000A6822F0380202430A6070475F4940398D -:101E10000A6802430A6070475C4940390A68824395 -:101E20000A60704730B54FF0E022002414610428A6 -:101E30000DD0564D303D2B6823F0380303432B6003 -:101E400051619461106940F00300106130BD106968 -:101E500040F004001061F3E74FF0E021002008613A -:101E6000704730B504464FF08045042C01D0052C56 -:101E700008D1D5F8000240F00800C5F8000208209B -:101E8000FFF766FED5F8900220F007002043C5F862 -:101E9000900230BD3D4950310A6822F4403202437D -:101EA0000A607047394854300068704730B5374C85 -:101EB000603404EB8000046840F2F715AC4344EA58 -:101EC00001111143194341F00101016030BD1FB5FB -:101ED000304991E81C00C9688DE81C0003912E4A26 -:101EE0009106904205D1D1F8180200F0010004B02B -:101EF00010BD2A4A904204D1D1F81802C0F3400024 -:101F0000F5E7274A904204D1D1F81802C0F3002027 -:101F1000EDE7244A904204D1D1F81802C0F34020E2 -:101F2000E5E7410E490710D0C0F301725DF82210B9 -:101F3000164A303A11440968C0F34262C0F30450B3 -:101F40008240114021FA00F0D1E70020CFE71FB511 -:101F50001049D1E905340A69C9698DE81C0003916B -:101F600010F47F3F10D0C0F381425DF82210074A81 -:101F7000203A11440968C0F38722C0F3441082401C -:101F8000114021FA00F0B2E70020B0E74002004023 -:101F900000B0710B782C0000100000A2110010A2FC -:101FA000120080A2130090A2F0B50023012703269F -:101FB00007FA03F48C4309D105685C0006FA04FCB7 -:101FC00025EA0C0502FA04F4254305605B1C102B7E -:101FD000EED3F0BD10B5836901248C40A343140EE9 -:101FE0008C4023438361C3694FF001148C4022F07D -:101FF0007F42A3438A401343C36110BD826901231A -:102000008B409A438261C2694FF001138B409A431F -:10201000C2617047F0B500230127032607FA03F4D5 -:102020000C4209D0856A5C0006FA04FC25EA0C051E -:1020300002FA04F4254385625B1C102BEED3F0BD3D -:10204000F0B500230127032607FA03F40C4209D058 -:10205000056B5C0006FA04FC25EA0C0502FA04F4A0 -:10206000254305635B1C102BEED3F0BD4A0503D559 -:1020700070228261082282610A0503D5426942F01A -:10208000010242618A0401D5F94A82614A0401D5FC -:102090001F224264090404D58021C16140F20F313E -:1020A00081637047002141607047416821F44051CD -:1020B0004160704742688A4342607047016941F459 -:1020C00000710161416941F480714161416841F4ED -:1020D00040514160704742680A43426070472DE9B1 -:1020E000FF4104460F4600250026E24890E80E0016 -:1020F000C0688DE80E000390DF494FF080408C42AD -:1021000008D1D0F81412C1F30165D0F82002C0F351 -:10211000032639E0D9498C4208D1D0F81412C1F312 -:102120008165D0F82002C0F303362DE0D4498C42FB -:1021300008D1D0F81C12C1F30165D0F8300200F0CC -:102140000F0621E0CF498C4208D1D0F81C12C1F310 -:102150008165D0F83002C0F3031615E0CA498C42FD -:1021600008D1D0F81C12C1F30175D0F83002C0F3C9 -:10217000032609E0C5498C4206D1D0F81C128D0F08 -:10218000D0F83002C0F30336002020630320E06063 -:10219000A068BF490840A060E846012D02D1FFF7C2 -:1021A00016FD0190002F17D058F82510761CB1FBB2 -:1021B000F6F000EB5700B0FBF7F0801EB0F5803F63 -:1021C0000CD3B1FBF6F000EBC700B0FBF7F06FF0FB -:1021D000010101EB10106062BDE8FF8140F040504A -:1021E0006062F9E7F0B50446002600204FF0804712 -:1021F0000EE0002304E05B1CBB4201D3012602E099 -:10220000A5696D04F7D4012E04D023680B54401C3B -:102210009042EED3F0BD2DE9FF5F0446DDF838A013 -:102220000F4690469946002500269248D0E905239E -:102230000169C0698DE80E0003908F494FF080401E -:102240008C4208D1D0F81412C1F30165D0F82002F5 -:10225000C0F3032639E089498C4208D1D0F8141222 -:10226000C1F38165D0F82002C0F303362DE0844924 -:102270008C4208D1D0F81C12C1F30165D0F83002AD -:1022800000F00F0621E07F498C4208D1D0F81C12E3 -:10229000C1F38165D0F83002C0F3031615E07A4926 -:1022A0008C4208D1D0F81C12C1F30175D0F830026D -:1022B000C0F3032609E075498C4206D1D0F81C1200 -:1022C0008D0FD0F83002C0F30336EB46012D02D15A -:1022D000FFF77DFC0190DFB15BF82510761CB1FBA8 -:1022E000F6F000EB5700B0FBF7F0801EB0F5803F32 -:1022F0000BD3B1FBF6F000EBC700B0FBF7F06FF0CB -:10230000010101EB1010606202E040F04050606299 -:1023100048EA090848EA0A08C4F80C80BDE8FF9FAB -:10232000026A22F0FF020A430262416841F400613E -:10233000416070472DE9FF4704460F46904600254F -:1023400000264C48D0E90923016AC06A8DE80E00D6 -:10235000039002202063484940078C4208D1D0F8FE -:102360001412C1F30165D0F82002C0F3032639E04E -:1023700042498C4208D1D0F81412C1F38165D0F8DB -:102380002002C0F303362DE03D498C4208D1D0F83D -:102390001C12C1F30165D0F8300200F00F0621E0F5 -:1023A00038498C4208D1D0F81C12C1F38165D0F8AD -:1023B0003002C0F3031615E033498C4208D1D0F83F -:1023C0001C12C1F30175D0F83002C0F3032609E0F6 -:1023D0002E498C4206D1D0F81C128D0FD0F8300255 -:1023E000C0F30336E946012D02D1FFF7F0FB01905F -:1023F00087B159F82500761CB0FBF6F000EBC7005A -:10240000B0FBF7F06FF0010101EB1010090C8842EE -:1024100000D26062B8F1000F09D0A06A20F020005D -:10242000A062A06A40F00200A062BDE8FF87A06A37 -:1024300040F04000A062A06A20F00200A062F4E731 -:1024400010B503230363C36A124C2340C362C36AFB -:1024500041EA02610B43C36210BD01230363C36AF7 -:1024600023F0CF03C362C36A11430B43C3627047B7 -:1024700001000001982C00000000074000100740F8 -:102480000020074000300740004007400050074050 -:102490000FFFF0FFFFF8FF00F0B504460026002014 -:1024A0004FF080470EE0002304E05B1CBB4201D3E9 -:1024B000012602E0A569ED00F7D5012E04D00B5CE2 -:1024C0002360401C9042EED1F0BD0000F74BD86372 -:1024D000D9621A630068C0791862F5484FF4DA616E -:1024E00040F8041CC16F41F00101C1677047F0481A -:1024F0001438D0F8901021F00101C0F890104FF47A -:10250000FA61016140F20F11416002680A43026002 -:102510007047E6490822403100F0A1BAE34A9060D2 -:10252000002010615161106AE249086070472DE98E -:10253000F04103460D46DD4C216ADE48DD4ADC4FA2 -:102540000C38143AEC37061F8D4213D9216A19440E -:102550006160216A691AE160016841F080010160EF -:1025600010683844226A194600F079FA206A30600F -:10257000BDE8F08100216160E160016841F0800107 -:102580000160106838442A46194600F068FA356040 -:10259000EEE730B4C54B4033D87900029979014455 -:1025A000C248C44CC34DDA78083C0835C06B0F2ACA -:1025B00028D006DC012A15D0022A19D0032A07D117 -:1025C0003BE0BA4B4033212A1B7921D0222A29D063 -:1025D000206840F002002060286840F00200286077 -:1025E00030BC7047122900D31221006830BC9EE72E -:1025F0004068C278837803EB0222914200D31146EF -:1026000030BC94E70C2900D30C21006930BC8EE764 -:10261000092900D30921826952F82320406830BC7F -:10262000104484E7426952F823208A4200D81146B8 -:10263000C06850F8230030BC79E79A78042A08D2A1 -:10264000806850F8220002788A4200D8114630BCD7 -:102650006DE7206840F002002060286840F002002A -:102660002860BDE72DE9F05F904A00255560D560F0 -:1026700002F14009494699F800308F4E0879DFF899 -:102680003CC2DFF83CB249785FEA036A00F00F070A -:102690004FF0010806F104046FD5DFF814A2A6F18B -:1026A00004090AF1EC0AD1B3062921D008290FD078 -:1026B0000A2924D0DCF8000040F00200CCF8000029 -:1026C000DBF8000040F00200CBF80000BDE8F09F0E -:1026D000D9F800005044D1690170206840F08000B2 -:1026E0002060C6F80080BDE8F05F0021084615E7CD -:1026F000FFF74FFFBDE8F05F002108460EE7D9F86D -:1027000000005044516A0170206840F08000206051 -:10271000C6F80080BDE8F05F00210846FEE6FFE74E -:10272000802B04D0812B14D0822B17D031E00020D5 -:10273000D16B4968C9794B0600D50120890603D5BC -:102740001178490640EA1160D9F800105144087028 -:102750001FE0D9F80000504405701AE0D9F80000D5 -:1027600000EB0A03002004EB00110A6802F00F02DC -:10277000BA4203D10CEB001103E01BE0401C0C2813 -:10278000F1D3086810F0020F01D0012000E0002012 -:102790001870D9F800004649ED31084405702068EA -:1027A00040F08000206002203060BDE8F05F002132 -:1027B0000846B3E63D4840300529807841D004DC26 -:1027C000012913D0032904D14CE0092940D00B2959 -:1027D0006BD0DCF8000040F00200CCF80000DBF821 -:1027E000000040F00200CBF800006FE710B10128B4 -:1027F00020D020E00020D2F838C02D4A143A02EB55 -:102800000011D1F8083503F00F03BB420ED108FACE -:1028100000F313EA0C0F09D101F5A1614B6823F015 -:1028200002034B600B6823F080030B60401C0C28F4 -:10283000E5D300E01570206840F08000206035602E -:1028400044E79061206840F08000206035603DE7FB -:10285000D061506B00B18047206840F0800020605C -:10286000356033E7190709D1032807D199F8031018 -:1028700021B914490B6843F006030B6010B101281D -:1028800022D023E0002004EB0011096801F00F01C1 -:10289000B94206D10CEB0010016841F00201016061 -:1028A00014E0401C0C28EED310E015E02C010020B1 -:1028B00014000C4014050C4004050C400C050C40A1 -:1028C0001C050C4000D0044082F80080206840F0D5 -:1028D000800020603560F9E65062116B09B1506AE2 -:1028E0008847206840F0800020603560EEE610B533 -:1028F00008226249624800F0B2F86148007810F09E -:10290000600011D05E494039202810D0402814D0F2 -:102910005C48016841F0020101605A4810300168CA -:1029200041F00201016010BDBDE810409AE6C86A9E -:102930000028F8D0BDE810400047886A0028F2D08F -:10294000BDE8104000472DE9F0414D4C403CE068A7 -:102950004C4D0026083D002827D0E368276A214611 -:10296000281F464A4968BB420FD900681044226AB2 -:1029700000F075F8206A2860216A60680844606089 -:10298000E068216A401AE060F2E500681044E268FD -:1029900000F065F8E0682860E068216A884201D1AB -:1029A000012060706660E660E2E53548017851B963 -:1029B0004078052807D134498868A269904202D03E -:1029C00008B9A069886060780028DDD02E60667044 -:1029D000CEE570B52A4C403C20696169884216D228 -:1029E000284E08363568301F0068244901442A46BD -:1029F000A06800F034F8A0682844A060206928444A -:102A0000206120696169884201D2206A306070BD0E -:102A100010B51B48002240384260C26082600261EB -:102A200042618263026442640020174B03EB001191 -:102A3000D1F8084524F08004C1F80845401C0C2852 -:102A4000F4D39A6010BD0E494039886270470C4932 -:102A50004039486370470A4940398863704718B560 -:102A60000023009306E0009B009CCB5C0355009B79 -:102A70005B1C0093521E531CF5D118BD00010C4085 -:102A80006C0100200C050C4000000C4010B5FFF755 -:102A90009EF8214A90604FF08043D3F8101201F065 -:102AA0000701022903D002F10C0050F82100D3F8ED -:102AB000201201F00F01491CB0FBF1F01060174922 -:102AC00008444900B0FBF1F0506010BD1448C16CDF -:102AD00021F00F0141F00801C1641248D0F89010B4 -:102AE00041F48021C0F89010016841F002010160BA -:102AF0000D490A6802F0F7320A604A6802F0F732BC -:102B00004A60016821F0020101600848016821F073 -:102B1000F0010160704700007401002020A107004F -:102B200000C0004008020040041104404041004041 -:102B300014484FF0590101604FF0160101604FF049 -:102B4000880101601048416841F4804141600F48AC -:102B5000416841F002014160416841F00401416077 -:102B60000B48804707484FF00001016009480047C3 -:102B7000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE72D -:102B8000FEE7FEE700010040000200400070004048 -:102B9000CD2A0000B901000040EA01039B0703D0E1 -:102BA00009E008C9121F08C0042AFAD203E011F88C -:102BB000013B00F8013B521EF9D27047064C074D0D -:102BC00006E0E06840F0010394E8070098471034FD -:102BD000AC42F6D3FDF7F4FAC82C0000E82C000054 -:102BE00070B58C1810F8015B15F0070301D110F8CF -:102BF000013B2A1106D110F8012B03E010F8016BFC -:102C000001F8016B5B1EF9D12B0705D40023521E7E -:102C10000DD401F8013BFAE710F8013BCB1A921CE6 -:102C200003E013F8015B01F8015B521EF9D5A142E4 -:102C3000D8D3002070BD02E008C8121F08C1002AC6 -:102C4000FAD170477047002001E001C1121F002A2D -:102C5000FBD170471D0000202F000020D000002075 -:102C6000E000002004010020EC000020F80000201B -:102C7000312E313000000000000000000400000090 -:102C8000080000000C00000000000000040000002C -:102C90000800000010000000001BB700000000004A -:102CA00000800000001BB700001BB7000000000000 -:102CB00000800000001BB700001BB70000000000F0 -:102CC00000800000001BB700E82C0000000000207E -:102CD000A0010000E02B0000DC2D0000A00100207E -:102CE000704C0000462C00001206100BFF0901A1D9 -:102CF0000119012940151326FF16750895408129F1 -:102D00000F129114C0120132021640160421501401 -:102D1000010102150109026B230301246409043334 -:102D2000020315092110011401221D160705810354 -:102D3000402D01070501071008080B0102020201DE -:102D40001B09041E29091305241D10010524521C0A -:102D50000424020E10090601020705820308150A61 -:102D600009040233020A2E0705830240072A0307DB -:102D700010080403090412035812491256124E1285 -:102D800031123912381237141E034D1A340A123018 -:102D900012201243124D1A53201253122D124412B4 -:102DA000413250229A1B209E041AB0047169081106 -:102DB000B21DB2121C050F0CB82B1002EC19DC016D -:102DC000122AC21602210809202271131BB75A0CBD -:0C2DD00008390462800B10102728000056 +:100A7000486840F002004860BDE8F881AC090020F9 +:100A800064050C40FC0D002000010C4004E000E077 +:100A9000AC0B0020002007402401002070B54FF06F +:100AA000402501220221284602F05CF8FE4901247B +:100AB0000C6001221146284602F054F8FA49091F39 +:100AC0000C6001220421284602F04CF82846BDE8BB +:100AD00070400122042102F045B810B54FF04024C7 +:100AE00000220221204602F03DF820460022BDE807 +:100AF0001040012102F036B8EFE710B5EB49EC48A1 +:100B000001F021F9012010BD0022062824D006DCC6 +:100B1000052821D2DFE800F0202020200C00F0285A +:100B20000DD0FD2818D0FE2813D0FF2814D10AE0DC +:100B3000E04802680A600079087105220CE0112083 +:100B40000870012208E0402008700020487002224E +:100B500002E0102008700122104670474FF47A41DD +:100B60004843401EFDD170470278407842EA002099 +:100B70008001401EFDD10870CF48704710B5CA4BA8 +:100B800002781B1DCC4C002A05D0012A08D0FF207A +:100B90000870204610BD407800F00100186003E0A6 +:100BA000407800F00100186000200870204610BD59 +:100BB00070B50D460478002C00D10124012C04D01E +:100BC00000242C704FF0011070BDBC49012008704A +:100BD000FFF764FFF5E770B50446B84900250D70CE +:100BE000FFF77BFF2570012070BD10B50446FFF7AD +:100BF00084FF607000202070022010BD2DE9F047B6 +:100C00008946057844788178C27841EA02260179DC +:100C10004079090441EA00600643DFF88C82E1076D +:100C20004FF001004FF0000706D0E90702D0C8F8E6 +:100C3000000001E0C8F80070DFF884A2A10706D523 +:100C4000A90702D5CAF8000001E0CAF80070200622 +:100C500005D5E80918B99549954801F074F876B3B7 +:100C60009848864200D906464FF0E0218F6106EB96 +:100C700046008001486105200861E00703D0D8F8EC +:100C80000000A84215D1A00704D5DAF80000B0EBA7 +:100C9000550F0ED1600702D5B7EB950F09D1A0060D +:100CA00002D5B7EB551F04D1200607D5B7EBD51FEA +:100CB00004D00869C0F300400028DED00F61D8F8E6 +:100CC0000000DAF8001040EA410089F800007E4890 +:100CD000BDE8F08730B50278437842EA0322837892 +:100CE000C0781B0443EA006002437848002A08D019 +:100CF000774D0024714BAA4206D301225A705A60E4 +:100D00000FE0FF220A7030BD5C70724D1544B5FBD8 +:100D1000F2F2022A03D90325B2FBF5F200E0012228 +:100D20005A600C7030BD70B50D4610F8014B01468D +:100D3000002C01D14FF48074204600F07FFB00208E +:100D40002870E41DE008401C0004401C70BD0078C1 +:100D50005A4A00F003035B1C1375C0F38000507502 +:100D6000002008704FF00110704710B5FF220A7084 +:100D70000122012410F8013B0AE010F8011B01F0E8 +:100D80003F0101B94021C91DC90808440A44521C49 +:100D90005B1E591CF1D1204662F31F4010BD007844 +:100DA000FF220A70401C0004401C7047FF2008709E +:100DB0004FF00110704710B5404A03781372437822 +:100DC000847843EA04235381C378007943EA0020FE +:100DD000908100200870404810BD2DE9F04F87B089 +:100DE000044606940020049005918D1CDFF8ECA0C9 +:100DF00000218AF80010002703916678A41C002EB9 +:100E000051D014F8018B5FEA887169D587B32B48FC +:100E1000B0F80A9008F0110001280DD101A9404650 +:100E200000F0A7FD022815D1B9F1010912D39AF8F3 +:100E300000100029F2D00DE001A90E2000F099FD6C +:100E4000022806D1B9F1010903D39AF8001000294C +:100E5000F2D00027012826D1019929700199090AA9 +:100E600069700199090CA9700199090EE9702D1D8D +:100E70005FEAC8616ED520786178E27840EA0120A7 +:100E8000A178090441EA026108430290241D0B483D +:100E9000B0F80CB05FEAC87030D00848B0F80A90DB +:100EA000002140461DE0A7E0044800400400FA0588 +:100EB0000CED00E05038000001000200040E00209C +:100EC00000480040C0C62D000100060001000400DB +:100ED000006CDC02FFD7B805010005002B010020E3 +:100EE0006EE000F046FD022806D1B9F1010903D3F6 +:100EF0009AF800100029D3D001287DD1F948B0F824 +:100F00000A9001A9404600F034FD022806D1B9F14B +:100F1000010903D39AF800100029F2D001280DD15D +:100F2000F049019A09691140029A914206D0BBF139 +:100F3000010B03D39AF800100029DFD0E949019A88 +:100F400009691140029A914201D040F01000012835 +:100F500052D132E0E349B1F80A905FEAC87111D08A +:100F60005FBB0021404600F004FD022806D1B9F124 +:100F7000010903D39AF800100029F2D0012872D198 +:100F800001271AE001A9404600F0F3FC022806D12F +:100F9000B9F1010903D39AF800100029F2D0012811 +:100FA00061D1019929700199090A69700199090CA7 +:100FB000A9700199090EE9702D1D0021039148E0E7 +:100FC00007B3C848B0F80A9001A90E2000F0D1FC80 +:100FD000022806D1B9F1010903D39AF800100029BB +:100FE000F2D001283FD1019828700198000A68705A +:100FF0000198000CA87000E035E00198000EE87040 +:101000002D1D002720786178E27840EA0120A17840 +:10101000090441EA026108430190241D5FEA8861E6 +:1010200003D5B0490861012013E0AE48B0F80A903A +:1010300001A9404600F09DFC022806D1B9F1010942 +:1010400003D39AF800100029F2D001280BD1012116 +:1010500003910499491C04919AF8001019B9761E5D +:10106000002E7FF4CEAE5EB114F8011B8A0703D5C3 +:10107000C90602D5241D00E0241D761E002EF3D1E2 +:1010800001282FD1EFB19748468901A90E2000F021 +:1010900070FC022806D1761E711C03D09AF800104D +:1010A0000029F2D001281DD1019929700199090A5E +:1010B00069700199090CA9700199090EE9702D1D3B +:1010C00010E0039971B18748468900210E2000F095 +:1010D00050FC022806D1761E711C03D09AF800102D +:1010E0000029F2D0DDE904121170059948700598C5 +:1010F000291A069807B0201A41EA0040BDE8F08F8F +:1011000030B504464278801C002A0BD010F8013B11 +:101110009D0703D5DB0602D5001D00E0001D521E11 +:10112000002AF3D100220A704A70001B0004801CC0 +:1011300030BD6C4A1278012A00D0E1E74DE62DE976 +:10114000F84F0446002600208946CF1CDFF898A1FE +:1011500000218AF80010641C2178627841EA022597 +:10116000A41C002D74D014F8018BDFF878B15FEA6D +:1011700088715BD55FEAC87135D0BBF80A400021A1 +:10118000404600F0F6FB022806D1641E611C03D025 +:101190009AF800100029F2D0012859D123E025B98E +:1011A0005FEAC87001D04FF00E08BBF80A406946EC +:1011B000404600F0DEFB022806D1641E611C03D00D +:1011C0009AF800100029F2D0012841D10099397015 +:1011D0000099090A79700099090CB9700099090EF3 +:1011E000F9703F1D761C6D1E691CD8D130E0207847 +:1011F0006178E27840EA0120A178090441EA0261BD +:1012000008430090241D3748B0F80AB069464046AC +:1012100000F0AFFB022806D1BBF1010B03D39AF813 +:1012200000100029F2D0012812D1761C6D1E681C16 +:10123000DDD12C48448900210E2000F09AFB0228C1 +:1012400006D1641E611C03D09AF800100029F2D068 +:1012500089F80060310A89F8011089F80200A7EBCB +:101260000900BDE8F88F10B504461E480078012833 +:101270000AD000200870487088700320E178890740 +:1012800006D540F4802010BD2046FFF758FFF5E753 +:101290006178A27841EA0221042202EB810140EA4E +:1012A000014010BD38B50C464178827841EA0222EF +:1012B000C1780079090441EA00600243009269465E +:1012C000002000F056FB00202070012038BD10B532 +:1012D000044A1278012A09D0FF200870012040F446 +:1012E000A02010BD040E00202B010020FFF7DAFF24 +:1012F000F5E7FF2008704FF00110704710B5027835 +:10130000A2F180031F2B02D8FFF7F3FFE9E701F8F2 +:10131000012B0C4610F8011B172957D2DFE801F00A +:101320000C14181C44484C565020245656565656F9 +:10133000282C3034383C40000078611CFFF7E4FB77 +:10134000207000F10210CCE72146FFF717FC3AE0CD +:101350002146FFF72DFC36E02046FFF73CFC32E04B +:101360002146FFF701FC2EE02046FFF73EFC2AE075 +:101370002146FFF743FC26E02146FFF7ABFC22E0C5 +:101380002146FFF7D0FC1EE02146FFF7E0FC1AE003 +:101390002146FFF7EAFC16E02146FFF700FD12E0C8 +:1013A0002146FFF703FD0EE02146FFF704FD0AE0AA +:1013B0002146FFF7BEFE06E02146FFF754FF02E09C +:1013C0002146FFF784FF00F101108AE7FF2004F8AF +:1013D000010C4FF0011084E72DE9F04102787F2ADB +:1013E00002D0BDE8F04189E70A704478851C4C7052 +:1013F0008E1C4FF0021708E031462846FFF77EFFAB +:10140000074405EB104580B20644641E601CF3D10E +:101410003846BDE8F081084800210170417016226D +:101420004260017264224281818101610122027560 +:101430004175FFF761BB0000040E00202DE9F0416B +:1014400000220023FF4CFE4E00274FF0010C06F156 +:101450000408656815E013B911F8012B0823D407B7 +:1014600002D0C6F800C000E03760C8F800702C4613 +:10147000641EFDD1C8F800C02C46641EFDD1520880 +:101480005B1E401E441CE6D1BDE8F0812DE9F05FF3 +:10149000834689460120DFF8A883C8F8000008F1D8 +:1014A000040500262E6001272F60C8F800B02E60CA +:1014B0002F604FEA5B00C8F800002E602F600BEB36 +:1014C00000014FEA9B00C8F800002E602F60014425 +:1014D0004FEADB00C8F800002E602F600844C8F80F +:1014E00000002E602F60C8F800602E602F60C8F8E2 +:1014F00000702E602F60002201214FF0402001F08B +:1015000031FBDFF840A39AF81410080004D02E60D5 +:101510002F60491E0029FAD12E60D8F800102F60E4 +:101520002E60D8F800202F6041EA42022E60D8F8E1 +:1015300000102F6042EA8104012C12D0022C62D0EC +:10154000042C60D0213020B12E602F60401E002876 +:10155000FAD100F014FA0120C8F80000E0B2BDE8AA +:10156000F09F5FEA8B7125D50022002120202E609C +:10157000D8F800302F601944520842EAC372401E66 +:101580000028F4D12E60D8F800002F604140C80731 +:1015900000D00824B9F1000F01D0C9F800209AF852 +:1015A000140020B12E602F60401E0028FAD100F0F8 +:1015B000E6F918E020B12E602F60401E0028FAD115 +:1015C00000F0DDF9D9F8000000222021C8F8000061 +:1015D0002E602F6002444008491E0029F6D1C8F849 +:1015E00000202E602F609AF8080038B10021C8F85A +:1015F00000102E602F60401E0028FAD10120C8F88C +:101600000000E0B2ABE79AF8151041B15FEA8B71C8 +:1016100005D521212E602F60491E0029FAD120B165 +:101620002E602F60401E0028FAD100F0A8F99AF829 +:10163000150058B15FEA8B7008D40020C8F800008C +:1016400021202E602F60401E0028FAD10120C8F80A +:101650000000E0B283E72DE9F05F82468B4600226E +:101660000120774E3060371D4FF00008C7F800802A +:10167000DFF8D091D9F804000146491EFDD10124BC +:101680003C600146491EFDD1C6F800A0C7F80080A5 +:101690000146491EFDD13C600146491EFDD102EBC9 +:1016A0000A034FEA5A023260C7F800800146491E19 +:1016B000FDD13C600146491EFDD113444FEA9A0218 +:1016C0003260C7F800800146491EFDD13C600146EA +:1016D000491EFDD113444FEADA023260C7F8008098 +:1016E0000146491EFDD13C600146491EFDD19918B5 +:1016F0003160C7F800800146491EFDD13C600146BB +:10170000491EFDD13160C7F800800146491EFDD158 +:101710003C600146491EFDD101213160C7F80080BF +:101720000146491EFDD13C60401EFDD10022012131 +:101730004FF0402001F016FA99F8143019000DD03E +:10174000D9F80450C7F800802846401EFDD13C60FF +:101750002A46521EFDD15B1E002BF3D1C7F8008034 +:10176000D9F804000246521EFDD132683C6003469F +:101770005B1EFDD1C7F8008003465B1EFDD13368B8 +:101780003C6005466D1EFDD142EA4302C7F8008069 +:1017900003465B1EFDD133683C6005466D1EFDD1DE +:1017A00042EA8305012D17D0022D7DD0042D7BD078 +:1017B000213159B1C7F800800246521EFDD13C606C +:1017C0000246521EFDD1491E0029F3D100F0D7F880 +:1017D00001203060E8B2C2E65FEA8A7243D54FF07A +:1017E000000C00232022C7F800800146491EFDD1CD +:1017F000D6F800A03C600146491EFDD153444FEA93 +:101800005C0141EACA7C521E002AECD13A46C7F874 +:101810000080CE460146491EFDD131681460401E4D +:10182000FDD14B40D80700D00825BBF1000F01D0F7 +:10183000CBF800C09EF8143093B1DEF804C003E08A +:1018400000480040040E0020C2F800806046401EA0 +:10185000FDD114606146491EFDD15B1E002BEED107 +:1018600000F08DF831E059B1C7F800800246521EF1 +:10187000FDD13C600246521EFDD1491E0029F3D124 +:1018800000F07DF8DBF800004FF0000C2023D9F8C1 +:1018900004203060C7F800801146491EFDD13C602D +:1018A0001146491EFDD100E026E0844440085B1E3D +:1018B000002BEED1C6F800C03946C7F800801046AC +:1018C000401EFDD10C60521EFDD199F8081079B16F +:1018D00000203060D9F80420C7F800801046401E70 +:1018E000FDD13C601046401EFDD1491E0029F3D1B8 +:1018F00001203060E8B232E699F815207AB15FEA4B +:101900008A720CD52123C7F800800246521EFDD1F1 +:101910003C600246521EFDD15B1E002BF3D159B133 +:10192000C7F800800246521EFDD13C600246521E9E +:10193000FDD1491E0029F3D100F021F899F81500D6 +:1019400098B15FEA8A7010D4002030602121D9F864 +:101950000420C7F800801046401EFDD13C601046B0 +:10196000401EFDD1491E0029F3D101203060E8B2AC +:10197000F5E5064A5278002A00D087E56BE6012299 +:1019800011464FF0402001F0EDB80000040E002099 +:1019900070B54FF0402501220221284601F0E2F8FF +:1019A000FD4901240C6001221146284601F0DAF8B5 +:1019B000F949091F0C6001220421284601F0D2F8E0 +:1019C0002846BDE870400122042101F0CBB810B5D3 +:1019D0004FF0402400220221204601F0C3F82046A7 +:1019E0000022BDE81040012101F0BCB8EB494FF4E2 +:1019F0007A620968B1FBF2F14143002001E000BFC7 +:101A0000401C8842FBD3704710B5002305E0DC0082 +:101A100021FA04F4C4545B1CDBB29342F7D310BD2B +:101A200070B505460E46002431462846FFF7A1FF53 +:101A3000022803D1641CE4B20A2CF5D370BD10B5A2 +:101A4000FFF7E9FCFFF7A4FF012010BD10B5FFF779 +:101A5000BEFF012010BD38B50C4600F00C00801C04 +:101A60006946FFF7DDFF002222609DF8031042EA7D +:101A7000016121609DF8022041EA024121609DF848 +:101A8000012041EA022121609DF8002011432160DC +:101A9000012800D0002038BD38B5082806D1C04A3A +:101AA00013688B4201D1012038BD116000F00C0495 +:101AB00004226846FFF7A8FF69462046FFF7B0FFFB +:101AC0000128F1D0002038BD38B505460C4605F098 +:101AD0007F4105F0F00001430820FFF7DDFF18B358 +:101AE00005F00C05ED1C69462846FFF799FF69468D +:101AF0002846FFF795FF002222609DF8031042EA76 +:101B0000016121609DF8022041EA024121609DF8B7 +:101B1000012041EA022121609DF80020114321604B +:101B2000012800D0002038BD002038BD38B504465B +:101B30000D4604F07F4104F0F00001430820FFF758 +:101B4000ABFF08B14CB901E0002038BD94484168B2 +:101B5000A94201D1012038BD456004F00C04641C89 +:101B6000042229466846FFF74FFF69462046FFF7E3 +:101B700057FF012801D0002038BD0E200021FFF7BB +:101B80004FFF0128F8D0002038BDF8B507460D46B4 +:101B9000002A13D0960883490020FFF7C7FF78B1C9 +:101BA0000524042239466846FFF72EFF6946204681 +:101BB000FFF736FF012805D00020F8BD0020F8BD52 +:101BC0000020F8BD0D27002409E029463846FFF71C +:101BD00027FF012801D00020F8BD2D1D641CB44250 +:101BE000F3D30E200021FFF71BFF0128F4D00020C3 +:101BF000F8BDF8B507460D46002A13D09608694986 +:101C00000020FFF793FF78B1052404223946684687 +:101C1000FFF7FAFE69462046FFF702FF012805D0CC +:101C20000020F8BD0020F8BD0020F8BD0F270021DE +:101C30003846FFF7F5FE012801D00020F8BD00244A +:101C4000761E09E029463846FFF7EAFE012801D052 +:101C50000020F8BD2D1D641CB442F3D30E2029468C +:101C6000FFF7DEFE0128F4D00020F8BD1CB50C46BD +:101C70000146042201A8FFF7C7FE052001A9FFF7CE +:101C8000CFFE012801D000201CBD0F206946FFF7C0 +:101C9000C7FE012801D000201CBD0E206946FFF7B9 +:101CA000BFFE002222609DF8031042EA016121601C +:101CB0009DF8022041EA024121609DF8012041EA9D +:101CC000022121609DF80020114321600128E3D00A +:101CD00000201CBD38B50C46014604226846FFF7BB +:101CE00093FE05206946FFF79BFE012801D00020E6 +:101CF00038BD042221466846FFF786FE0D2069465E +:101D0000FFF78EFE012801D0002038BD0E200021F3 +:101D1000FFF786FE012801D0002038BD012038BD24 +:101D200070B504460D461F490020FFF7FFFE30B195 +:101D300029462046FFF79AFF18B1012070BD002008 +:101D400070BD002070BD70B504460D4615490020D9 +:101D5000FFF7ECFE30B129462046FFF7BBFF18B174 +:101D6000012070BD002070BD002070BD38B5054653 +:101D70000C460C490020891EFFF7D8FEA0B1694629 +:101D80002846FFF773FF88B1A807C20E0098D0401D +:101D90002070012038BD0000044800408001002070 +:101DA00030010020520000230020F3E70020F1E77B +:101DB00070B505460C46F7490020FFF7B7FE48B15D +:101DC000A807C00E04FA00F12846FFF783FF18B1F8 +:101DD000012070BD002070BD002070BD2DE9F041D4 +:101DE00005460E46144607E031462846FFF7BEFF7B +:101DF00040B16D1C761C641E0CB1A807F4D1DFF84D +:101E0000988314E00020BDE8F081D8F80000411E5E +:101E10002940471ABC4201D224F003073A46314612 +:101E20002846FFF7E6FE28B13D443E44E41B032C60 +:101E3000EBD809E00020E6E731462846FFF796FF99 +:101E400030B16D1C761C641E002CF5D10120DAE740 +:101E50000020D8E72DE9F04105460E46144607E07C +:101E600031782846FFF7A4FF40B16D1C761C641E34 +:101E70000CB1A807F4D1DFF8208313E00020C2E7FB +:101E8000D8F80000411E2940471ABC4201D224F074 +:101E900003073A4631462846FFF777FE28B13D440E +:101EA0003E44E41B032CEBD809E00020ABE731787B +:101EB0002846FFF77DFF30B16D1C761C641E002C98 +:101EC000F5D101209FE700209DE773B50646002469 +:101ED0006425B2480199FFF736FF48B1AF4846F490 +:101EE0008031001FFFF72FFF20B1AC4E083E10E0FD +:101EF00000207CBD00207CBD01A93046FFF710FF0B +:101F000020B10198C00303D501207CBD00207CBD19 +:101F1000641CAC42F0DB00207CBD38B505460021D6 +:101F20000820FFF7B9FD70B30024204655F82410AF +:101F3000FFF7CBFF40B3641C042CF6D30920696A79 +:101F4000FFF7C3FF28B30D24204655F82410FFF7F0 +:101F5000BCFF00B3641C102CF6D31020296CFFF7D3 +:101F6000B4FFD0B18D488E490838FFF7ECFEB0B110 +:101F700069460420FFF76FFD98B1009810F0A00F9C +:101F800011D0002006E700E001E0002002E7002079 +:101F900000E70020FEE60020FCE60020FAE6002034 +:101FA000F8E60020F6E60120F4E62DE9F0410E46C1 +:101FB0000024642501467948001FFFF7C4FE10B1D4 +:101FC000764F083F0AE000201DE731463846FFF70C +:101FD000A7FE48B13068C00302D4641CAC42F4DBF5 +:101FE000AC4203D100200EE700200CE731466B48DD +:101FF000FFF796FE08B1012005E7002003E7F8B5DA +:10200000684D0024654E083E0CE069463046FFF7F7 +:1020100087FE20B10098800303D50120F8BD002081 +:10202000F8BD641CAC42F0D30020F8BD2DE9F043AC +:1020300091B00446DDE91878894615461E464421CC +:10204000684601F0A0FB009501960297CDF80C8040 +:1020500060680990A0680D9020680E90CDF83C90C3 +:102060004FF0807010906846FFF757FF68B1FFF798 +:10207000C6FF60B169460020FFF797FF48B100989E +:1020800048B1002011B0BDE8F0830020FAE700203D +:10209000F8E70020F6E70120F4E71CB500206A46C7 +:1020A000FF211154401CC0B20828FAD369463320DE +:1020B000FFF7C4F901201CBD08B58DF80000000A27 +:1020C0008DF8010069461020FFF7B8F9012008BD1E +:1020D0001CB504460020019001A90820FFF7AEF9C5 +:1020E00069460020FFF7B7FC012801D000201CBD85 +:1020F0009DF800009DF803109DF8012040EA016062 +:102100009DF80210090441EA0221084320600120E1 +:102110001CBD08B500200090FFF7BFFF68B14EF26C +:102120009E70FFF7C9FF50B1FFF7B7FF48B168468F +:10213000FFF7CEFF38B1012008BD002008BD002008 +:1021400008BD002008BD002008BDF8B500200090A3 +:10215000002464251049401E091D08604860FFF7EF +:102160006EFCFFF7D6FF90B11E210020FFF794FC14 +:10217000D0B100210820FFF78FFCB8B14FF0A0418B +:102180000420FFF789FC98B14FF020461CE00020A6 +:10219000F8BD0000500000232C010020F8ED00E005 +:1021A00001005FA040420F000020F1E70020EFE7B0 +:1021B0000020EDE769460420FFF74DFC50B100997F +:1021C00036EA010002D0641CAC42F3DBAC4203D11E +:1021D0000020DDE70020DBE7C9490420FFF75CFCB5 +:1021E00030B100210820FFF757FC18B10120CFE7DC +:1021F0000020CDE70020CBE7002806D1C1480168C8 +:10220000C14A01F4E06111439DE57047F8B5054608 +:102210000224062D01D0FFF712FCBC49B94E4F1C19 +:10222000E436072D7DD2DFE805F00417085D6387EB +:10223000A2000120FFF7E0FF95E00120FFF7DCFF9F +:102240001420FFF7D3FB0020FFF7D6FF1420FFF781 +:10225000CDFBFFF7FBFB86E0FFF777FF08B13546C4 +:1022600013E0002094E7641E64B2002C01DC00201F +:102270008EE70120FFF7C0FF1420FFF7B7FB002017 +:10228000FFF7BAFF1420FFF7B1FB39462846FFF7E6 +:102290005AFD0028E7D09B4C0121F0342046FFF77F +:1022A00052FDC8B10120FFF7A7FF1420FFF79EFBE6 +:1022B0000020FFF7A1FF1420FFF798FB694628468E +:1022C000FFF72EFD50B100988003F7D5002120467E +:1022D000FFF739FD20B146E0002059E7002057E71D +:1022E000002055E73046FFF72EFD78BB00204FE772 +:1022F000FFF70FFFB0B11E210020FFF7CDFB98B113 +:1023000000210820FFF7C8FB80B14FF0A041042056 +:10231000FFF7C2FB60B139463046FFF714FD48B104 +:1023200021E02AE0002033E7002031E700202FE7FA +:1023300000202DE700202BE7FFF707FF38B1734996 +:102340003046C91CFFF7FFFC18B104E00BE0002089 +:102350001EE700201CE769463046FFF7E1FC20B18C +:1023600000988003F7D5012012E7002010E73046DF +:10237000FFF7E9FC18B1FFF769FB002008E7002030 +:1023800006E7F8B50446062C01D0FFF758FB5F4E70 +:102390005C4DF61CF11EE435072C7DD2DFE804F01D +:1023A00004170860668CA6000120FFF725FF99E05E +:1023B0000120FFF721FF1420FFF718FB0020FFF793 +:1023C0001BFF1420FFF712FBFFF740FB8AE0FFF72B +:1023D000BCFE30B12C4631462046FFF7B4FC10B1AC +:1023E00003E00020D4E60020D2E669462046FFF74D +:1023F00097FC48B300988003F7D5424D0121F03592 +:102400002846FFF7A0FC08B33E4E69463046FFF76A +:1024100087FCE8B1009800F4E0613B480143304696 +:10242000FFF791FCB0B11420FFF7E0FA69462046AF +:10243000FFF776FC80B100988003F7D5002128468D +:10244000FFF781FC50B14DE00020A1E600209FE69F +:1024500000209DE600209BE6002099E6002097E6FC +:102460002846FFF770FC80BB002091E6FFF751FE85 +:10247000C0B11E210020FFF70FFBA8B100210820EA +:10248000FFF70AFB90B14FF0A0410420FFF704FBD7 +:1024900070B11E49491C00E02EE02846FFF753FCAE +:1024A00040B11FE0002073E6002071E600206FE6D7 +:1024B00000206DE600206BE6FFF747FE30B13146A5 +:1024C0002846FFF740FC18B104E00BE000205FE66F +:1024D00000205DE669462846FFF722FC20B10098FF +:1024E0008003F7D5012053E6002051E62846FFF788 +:1024F0002AFC18B1FFF7AAFA002049E6002047E6B7 +:10250000000F00500CED00E00400FA0500005FA091 +:1025100000F01F0201219140C943F84A800F02EBED +:10252000800002680A4002607047F548F0E770B525 +:1025300010F47F3F14D0C0F38143022B23D06FEA05 +:102540009044A40722D0ED4C1C3404EB83031C6898 +:10255000C0F38725C0F34416B540AC4314431C6058 +:10256000420E52070ED0E54BC0F301720C3303EB61 +:1025700082021468C0F34263C0F3045083409C435A +:102580000C43146070BDDD4B2833E0E7DB4B2C338C +:10259000DDE700F01F0201219140D84A800F02EBD5 +:1025A000800002680A430260704710B5044641EAA1 +:1025B0004210D24940F010005C310860D04B184600 +:1025C000FFF7E7FF2146BDE8104000221846AEE7BE +:1025D000CC48016841F004010160C848001F01684F +:1025E00041F08001016030BF7047C648016821F0AA +:1025F00004010160C148001F016821F080010160F1 +:1026000030BF7047BD48001F0068C00701D0BE48FA +:10261000704700207047B948001F0068800702D546 +:102620004FF4004070470020704710B501F00CF8DF +:102630004FF08041D1F834024207B44819D0D1F8A4 +:10264000342202F00702012A15D0D1F8342202F018 +:102650000702022A12D0D1F8342202F00702032A1C +:102660000FD0D1F8341201F0070104290CD0006812 +:1026700010BD006810BD0068400810BD00688008EB +:1026800010BD0068C00810BD0068000910BD10B57D +:1026900000F0DAFF4FF08041D1F8340210F0700FF3 +:1026A0009A4819D0D1F83422C2F30212012A15D067 +:1026B000D1F83422C2F30212022A12D0D1F8342205 +:1026C000C2F30212032A0FD0D1F83412C1F302115F +:1026D00004290CD0006810BD006810BD00684008D7 +:1026E00010BD0068800810BD0068C00810BD0068FB +:1026F000000910BD10B500F0A7FF8448006810BDA8 +:1027000010B500F0A1FF8148006810BD30B5054646 +:102710007F490124A20705E0081EA1F1010101DCA7 +:10272000002404E0D2F8503235EA0300F4D1204608 +:1027300030BD2DE9F04107460E46704C241F206D38 +:1027400000F01005206840F0040020601020FFF722 +:10275000DDFF206940F007002061206A20F00F02B1 +:1027600032432262206920F0070139432161A4F538 +:10277000007400F069FF002D05D1D4F8000220F0AC +:102780000400C4F80002BDE8F08108B5002061A192 +:102790000968009159493C31096811F4A02F13D1FF +:1027A00059488A0310D4C1F381321DF80220C1F3C5 +:1027B0000800801CC1F34421491C574B584311FBAE +:1027C00002F1B0FBF1F0C00008BD4C483C3001689C +:1027D00041F48031016070472DE9F84F04460D4601 +:1027E000FFF7F3FFDFF8209104B34448001F0168AE +:1027F00041F0040101601020FFF788FF4FF4002032 +:10280000009046484649284488426BD84FF0FF3133 +:1028100000274FF000080026AB460123A9B3032B85 +:1028200045D0042B0ED0022B0FD010E03348001FF0 +:10283000016841F0010101600120FFF767FF0020FE +:102840000090DEE74FEA8B0501E04FEA4B050222DC +:1028500069B3B9FBF2F0334CDFF8C8C00444CCF1E3 +:10286000000C644520D80224DFF8BCE0C0F35D0A08 +:102870000AFB04F0DFF8A4C08444F4450FD8B0EBA1 +:10288000950F03D9A0EB950C02E013E0C0EB950C7B +:102890008C4504D261461746A0461E4621B1641CF1 +:1028A00040F201208442E3D9521C202AD0D95B1C7B +:1028B000042BB3D90098711E40EA8131781E41EA99 +:1028C0004020A8F1020108430C493C310860042073 +:1028D000FFF71CFF7E43B9FBF6F000FB08F0400059 +:1028E000BDE8F88F4CB1054810493C300160042028 +:1028F000FFF70CFFBDE8F84F47E719E0040200407E +:102900000600C05710ED00E0001BB700800100205A +:1029100080F5200001020204C0C62D00800F05FDD5 +:102920008074D21A00F7C2FFC06878041E42080003 +:10293000854844F21E210160D9E770B506464FF084 +:102940008044D4F8500200F010058048864200D937 +:10295000064604F50074206840F004002060102052 +:10296000FFF7D4FE206940F007002061206A20F0C4 +:102970000F0020622068A4F50074C00705D031461E +:102980000020FFF729FF064609E031464FF40020FA +:10299000FFF722FF0646D4F8500200F01005002190 +:1029A0000220FFF7C6FE2DB9D4F8000220F0040083 +:1029B000C4F80002304670BD634930390A6822F01D +:1029C000380202430A6070475F4940390A6802438F +:1029D0000A6070475C4940390A6882430A60704760 +:1029E00030B54FF0E0220024146104280DD0564D7C +:1029F000303D2B6823F0380303432B605161946111 +:102A0000106940F00300106130BD106940F004000F +:102A10001061F3E74FF0E02100200861704730B506 +:102A200004464FF08045042C01D0052C08D1D5F880 +:102A3000000240F00800C5F800020820FFF766FE1B +:102A4000D5F8900220F007002043C5F8900230BD71 +:102A50003D4950310A6822F4403202430A6070470F +:102A6000394854300068704730B5374C603404EB57 +:102A70008000046840F2F715AC4344EA01111143A9 +:102A8000194341F00101016030BD1FB5304991E8A3 +:102A90001C00C9688DE81C0003912E4A91069042E3 +:102AA00005D1D1F8180200F0010004B010BD2A4A87 +:102AB000904204D1D1F81802C0F34000F5E7274A4C +:102AC000904204D1D1F81802C0F30020EDE7244A67 +:102AD000904204D1D1F81802C0F34020E5E7410E3E +:102AE000490710D0C0F301725DF82210164A303A3F +:102AF00011440968C0F34262C0F30450824011409F +:102B000021FA00F0D1E70020CFE71FB51049D1E945 +:102B100005340A69C9698DE81C00039110F47F3FF0 +:102B200010D0C0F381425DF82210074A203A1144C8 +:102B30000968C0F38722C0F344108240114021FA93 +:102B400000F0B2E70020B0E74002004000B0710B97 +:102B500058380000100000A2110010A2120080A23C +:102B6000130090A2F0B500230127032607FA03F40F +:102B70008C4309D105685C0006FA04FC25EA0C05C3 +:102B800002FA04F4254305605B1C102BEED3F0BD64 +:102B900010B5836901248C40A343140E8C40234359 +:102BA0008361C3694FF001148C4022F07F42A3433C +:102BB0008A401343C36110BD826901238B409A434D +:102BC0008261C2694FF001138B409A43C261704722 +:102BD000F0B500230127032607FA03F40C4209D0BD +:102BE000856A5C0006FA04FC25EA0C0502FA04F486 +:102BF000254385625B1C102BEED3F0BDF0B500239E +:102C00000127032607FA03F40C4209D0056B5C0088 +:102C100006FA04FC25EA0C0502FA04F425430563D0 +:102C20005B1C102BEED3F0BD4A0503D570228261E8 +:102C3000082282610A0503D5426942F0010242611D +:102C40008A0401D5F94A82614A0401D51F224264EF +:102C5000090404D58021C16140F20F3181637047BE +:102C6000002141607047416821F440514160704744 +:102C700042688A4342607047016941F40071016112 +:102C8000416941F480714161416841F440514160C2 +:102C9000704742680A43426070472DE9FF4104468D +:102CA0000F4600250026E24890E80E00C0688DE837 +:102CB0000E000390DF494FF080408C4208D1D0F8DD +:102CC0001412C1F30165D0F82002C0F3032639E0E5 +:102CD000D9498C4208D1D0F81412C1F38165D0F8DB +:102CE0002002C0F303362DE0D4498C4208D1D0F83D +:102CF0001C12C1F30165D0F8300200F00F0621E08C +:102D0000CF498C4208D1D0F81C12C1F38165D0F8AC +:102D10003002C0F3031615E0CA498C4208D1D0F83E +:102D20001C12C1F30175D0F83002C0F3032609E08C +:102D3000C5498C4206D1D0F81C128D0FD0F8300254 +:102D4000C0F30336002020630320E060A068BF4981 +:102D50000840A060E846012D02D1FFF716FD019062 +:102D6000002F17D058F82510761CB1FBF6F000EBB9 +:102D70005700B0FBF7F0801EB0F5803F0CD3B1FBDD +:102D8000F6F000EBC700B0FBF7F06FF0010101EBCC +:102D900010106062BDE8FF8140F040506062F9E7CA +:102DA000F0B50446002600204FF080470EE00023D7 +:102DB00004E05B1CBB4201D3012602E0A5696D045F +:102DC000F7D4012E04D023680B54401C9042EED35C +:102DD000F0BD2DE9FF5F0446DDF838A00F469046B0 +:102DE0009946002500269248D0E905230169C0696B +:102DF0008DE80E0003908F494FF080408C4208D13F +:102E0000D0F81412C1F30165D0F82002C0F30326F4 +:102E100039E089498C4208D1D0F81412C1F3816598 +:102E2000D0F82002C0F303362DE084498C4208D14B +:102E3000D0F81C12C1F30165D0F8300200F00F0683 +:102E400021E07F498C4208D1D0F81C12C1F3816582 +:102E5000D0F83002C0F3031615E07A498C4208D14D +:102E6000D0F81C12C1F30175D0F83002C0F303266C +:102E700009E075498C4206D1D0F81C128D0FD0F8AC +:102E80003002C0F30336EB46012D02D1FFF77DFC83 +:102E90000190DFB15BF82510761CB1FBF6F000EB7A +:102EA0005700B0FBF7F0801EB0F5803F0BD3B1FBAD +:102EB000F6F000EBC700B0FBF7F06FF0010101EB9B +:102EC0001010606202E040F04050606248EA090879 +:102ED00048EA0A08C4F80C80BDE8FF9F026A22F0A5 +:102EE000FF020A430262416841F400614160704799 +:102EF0002DE9FF4704460F469046002500264C4822 +:102F0000D0E90923016AC06A8DE80E00039002200F +:102F10002063484940078C4208D1D0F81412C1F30D +:102F20000165D0F82002C0F3032639E042498C4203 +:102F300008D1D0F81412C1F38165D0F82002C0F393 +:102F400003362DE03D498C4208D1D0F81C12C1F364 +:102F50000165D0F8300200F00F0621E038498C42BC +:102F600008D1D0F81C12C1F38165D0F83002C0F34B +:102F7000031615E033498C4208D1D0F81C12C1F376 +:102F80000175D0F83002C0F3032609E02E498C42C7 +:102F900006D1D0F81C128D0FD0F83002C0F30336E2 +:102FA000E946012D02D1FFF7F0FB019087B159F8F6 +:102FB0002500761CB0FBF6F000EBC700B0FBF7F085 +:102FC0006FF0010101EB1010090C884200D2606221 +:102FD000B8F1000F09D0A06A20F02000A062A06A1A +:102FE00040F00200A062BDE8FF87A06A40F0400008 +:102FF000A062A06A20F00200A062F4E710B50323EB +:103000000363C36A124C2340C362C36A41EA02618C +:103010000B43C36210BD01230363C36A23F0CF03D4 +:10302000C362C36A11430B43C362704701000001CE +:1030300078380000000007400010074000200740DB +:103040000030074000400740005007400FFFF0FFEE +:10305000FFF8FF00F0B50446002600204FF080473F +:103060000EE0002304E05B1CBB4201D3012602E01A +:10307000A569ED00F7D5012E04D00B5C2360401C40 +:103080009042EED1F0BD0000F74BD863D9621A63CD +:103090000068C0791862F5484FF4DA6140F8041C02 +:1030A000C16F41F00101C1677047F0481438D0F892 +:1030B000901021F00101C0F890104FF4FA61016105 +:1030C00040F20F11416002680A4302607047E6490E +:1030D0000822403100F0A1BAE34A9060002010615C +:1030E0005161106AE249086070472DE9F0410346DA +:1030F0000D46DD4C216ADE48DD4ADC4F0C38143ABF +:10310000EC37061F8D4213D9216A19446160216A88 +:10311000691AE160016841F080010160106838447B +:10312000226A194600F079FA206A3060BDE8F08121 +:1031300000216160E160016841F080010160106878 +:1031400038442A46194600F068FA3560EEE730B494 +:10315000C54B4033D879000299790144C248C44C28 +:10316000C34DDA78083C0835C06B0F2A28D006DC3E +:10317000012A15D0022A19D0032A07D13BE0BA4B05 +:103180004033212A1B7921D0222A29D0206840F0FF +:1031900002002060286840F00200286030BC7047C0 +:1031A000122900D31221006830BC9EE74068C27823 +:1031B000837803EB0222914200D3114630BC94E79E +:1031C0000C2900D30C21006930BC8EE7092900D3FB +:1031D0000921826952F82320406830BC104484E7FA +:1031E000426952F823208A4200D81146C06850F83C +:1031F000230030BC79E79A78042A08D2806850F816 +:10320000220002788A4200D8114630BC6DE720685F +:1032100040F002002060286840F002002860BDE70E +:103220002DE9F05F904A00255560D56002F1400914 +:10323000494699F800308F4E0879DFF83CC2DFF834 +:103240003CB249785FEA036A00F00F074FF00108CB +:1032500006F104046FD5DFF814A2A6F104090AF1FF +:10326000EC0AD1B3062921D008290FD00A2924D08D +:10327000DCF8000040F00200CCF80000DBF80000B1 +:1032800040F00200CBF80000BDE8F09FD9F8000044 +:103290005044D1690170206840F080002060C6F879 +:1032A0000080BDE8F05F0021084615E7FFF74FFFFB +:1032B000BDE8F05F002108460EE7D9F80000504451 +:1032C000516A0170206840F080002060C6F80080DC +:1032D000BDE8F05F00210846FEE6FFE7802B04D042 +:1032E000812B14D0822B17D031E00020D16B49689C +:1032F000C9794B0600D50120890603D51178490606 +:1033000040EA1160D9F80010514408701FE0D9F864 +:103310000000504405701AE0D9F8000000EB0A03E1 +:10332000002004EB00110A6802F00F02BA4203D138 +:103330000CEB001103E01BE0401C0C28F1D30868E3 +:1033400010F0020F01D0012000E000201870D9F821 +:1033500000004649ED3108440570206840F08000C7 +:10336000206002203060BDE8F05F00210846B3E62F +:103370003D4840300529807841D004DC012913D034 +:10338000032904D14CE0092940D00B296BD0DCF88B +:10339000000040F00200CCF80000DBF8000040F034 +:1033A0000200CBF800006FE710B1012820D020E028 +:1033B0000020D2F838C02D4A143A02EB0011D1F89F +:1033C000083503F00F03BB420ED108FA00F313EAED +:1033D0000C0F09D101F5A1614B6823F002034B608A +:1033E0000B6823F080030B60401C0C28E5D300E041 +:1033F0001570206840F080002060356044E79061DF +:10340000206840F08000206035603DE7D061506B5F +:1034100000B18047206840F080002060356033E7CD +:10342000190709D1032807D199F8031021B91449C4 +:103430000B6843F006030B6010B1012822D023E093 +:10344000002004EB0011096801F00F01B94206D118 +:103450000CEB0010016841F00201016014E0401C17 +:103460000C28EED310E015E03801002014000C40C9 +:1034700014050C4004050C400C050C401C050C40C8 +:1034800000D0044082F80080206840F08000206076 +:103490003560F9E65062116B09B1506A88472068BF +:1034A00040F0800020603560EEE610B508226249E9 +:1034B000624800F0B2F86148007810F0600011D066 +:1034C0005E494039202810D0402814D05C4801685B +:1034D00041F0020101605A481030016841F00201D8 +:1034E000016010BDBDE810409AE6C86A0028F8D017 +:1034F000BDE810400047886A0028F2D0BDE81040BF +:1035000000472DE9F0414D4C403CE0684C4D002611 +:10351000083D002827D0E368276A2146281F464A2D +:103520004968BB420FD900681044226A00F075F860 +:10353000206A2860216A606808446060E068216A47 +:10354000401AE060F2E500681044E26800F065F8B7 +:10355000E0682860E068216A884201D1012060703B +:103560006660E660E2E53548017851B940780528A3 +:1035700007D134498868A269904202D008B9A0698D +:10358000886060780028DDD02E606670CEE570B56A +:103590002A4C403C20696169884216D2284E083680 +:1035A0003568301F0068244901442A46A06800F0AD +:1035B00034F8A0682844A06020692844206120696C +:1035C0006169884201D2206A306070BD10B51B4825 +:1035D000002240384260C2608260026142618263C0 +:1035E000026442640020174B03EB0011D1F8084538 +:1035F00024F08004C1F80845401C0C28F4D39A60DC +:1036000010BD0E494039886270470C494039486303 +:1036100070470A4940398863704718B50023009302 +:1036200006E0009B009CCB5C0355009B5B1C009359 +:10363000521E531CF5D118BD00010C40780100202A +:103640000C050C4000000C4010B5FFF79EF8214A15 +:1036500090604FF08043D3F8101201F00701022967 +:1036600003D002F10C0050F82100D3F8201201F031 +:103670000F01491CB0FBF1F01060174908444900E4 +:10368000B0FBF1F0506010BD1448C16C21F00F0187 +:1036900041F00801C1641248D0F8901041F4802133 +:1036A000C0F89010016841F0020101600D490A68FC +:1036B00002F0F7320A604A6802F0F7324A600168A5 +:1036C00021F0020101600848016821F0F001016069 +:1036D000704700008001002020A1070000C00040CA +:1036E00008020040041104404041004014484FF0DB +:1036F000590101604FF0160101604FF0880101602F +:103700001048416841F4804141600F48416841F0F0 +:1037100002014160416841F0040141600B4880476B +:1037200007484FF00001016009480047FEE7FEE747 +:10373000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE761 +:103740000001004000020040007000408936000087 +:10375000B901000040EA01039B0703D009E008C952 +:10376000121F08C0042AFAD203E011F8013B00F846 +:10377000013B521EF9D27047D2B201E000F8012B92 +:10378000491EFBD270470022F6E710B513460A46E1 +:1037900004461946FFF7F0FF204610BD064C074DC2 +:1037A00006E0E06840F0010394E807009847103411 +:1037B000AC42F6D3FCF704FDA8380000C83800007E +:1037C00070B58C1810F8015B15F0070301D110F8E3 +:1037D000013B2A1106D110F8012B03E010F8016B10 +:1037E00001F8016B5B1EF9D12B0705D40023521E93 +:1037F0000DD401F8013BFAE710F8013BCB1A921CFB +:1038000003E013F8015B01F8015B521EF9D5A142F8 +:10381000D8D3002070BD02E008C8121F08C1002ADA +:10382000FAD170477047002001E001C1121F002A41 +:10383000FBD170471D0000202F000020D000002089 +:10384000E000002004010020EC000020F80000202F +:10385000312E3130000000000000000004000000A4 +:10386000080000000C000000000000000400000040 +:103870000800000010000000001BB700000000005E +:1038800000800000001BB700001BB7000000000014 +:1038900000800000001BB700001BB7000000000004 +:1038A00000800000001BB700C838000000000020A6 +:1038B000AC010000C0370000BC390000AC010020A2 +:1038C000744C0000263800001206100BFF0901A1FD +:1038D0000119012940151326FF1675089540812905 +:1038E0000F129114C0120132021640160421501416 +:1038F000010102150109026B230301246409043349 +:10390000020315092110011401221D160705810368 +:10391000402D01070501071008080B0102020201F2 +:103920001B09041E29091305241D10010524521C1E +:103930000424020E10090601020705820308150A75 +:1039400009040233020A2E0705830240072A0307EF +:1039500010080403090412035812491256124E1299 +:1039600031123912381237141E034D1A340A12302C +:1039700012201243124D1A53201253122D124412C8 +:10398000413250229A1B209E041AB004716908111A +:10399000B21DB2121C050F0CB82B1002EC19DC0181 +:1039A000122AC2162208022A10192E0126131BB74A +:0C39B0005A0C08390462800B1010272804 :04000005000001B93D :00000001FF diff --git a/src/DAP_config.h b/src/DAP_config.h index 051b569..5605479 100644 --- a/src/DAP_config.h +++ b/src/DAP_config.h @@ -215,8 +215,13 @@ static __inline uint32_t PIN_nRESET_IN(void) return 0; } +extern uint8_t swd_write_word(uint32_t addr, uint32_t val); static __inline void PIN_nRESET_OUT(uint32_t bit) { + if(bit == 0) + { + swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk)); + } } @@ -243,9 +248,12 @@ static void DAP_SETUP(void) } +extern uint8_t swd_write_word(uint32_t addr, uint32_t val); static uint32_t RESET_TARGET(void) { - return 0; // change to '1' when a device reset sequence is implemented + swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk)); + + return 1; // change to '1' when a device reset sequence is implemented } diff --git a/src/SWD_host/SWD_flash.c b/src/SWD_host/SWD_flash.c new file mode 100644 index 0000000..dec3c6d --- /dev/null +++ b/src/SWD_host/SWD_flash.c @@ -0,0 +1,90 @@ +/** + * @file SWD_flash.c + * @brief Program target flash through SWD + */ +#include "swd_host.h" +#include "SWD_flash.h" + + +extern const program_target_t flash_algo; + + +error_t target_flash_init(uint32_t flash_start, uint32_t func) +{ + if(func == 0) + { + if (0 == swd_set_target_state_hw(RESET_PROGRAM)) { + return ERROR_RESET; + } + + // Download flash programming algorithm to target and initialise. + if (0 == swd_write_memory(flash_algo.algo_start, (uint8_t *)flash_algo.algo_blob, flash_algo.algo_size)) { + return ERROR_ALGO_DL; + } + } + else + { + if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.init, flash_start, 0, func, 0)) { + return ERROR_INIT; + } + } + + return ERROR_SUCCESS; +} + +error_t target_flash_uninit(uint32_t func) +{ + if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.init, func, 0, 0, 0)) { + return ERROR_UNINIT; + } + + return ERROR_SUCCESS; +} + +error_t target_flash_program_page(uint32_t addr, const uint8_t *buf, uint32_t size) +{ + while (size > 0) { + uint32_t write_size = size > flash_algo.program_buffer_size ? flash_algo.program_buffer_size : size; + + // Write page to buffer + if (!swd_write_memory(flash_algo.program_buffer, (uint8_t *)buf, write_size)) { + return ERROR_ALGO_DATA_SEQ; + } + + // Run flash programming + if (swd_flash_syscall_exec(&flash_algo.sys_call_s, + flash_algo.program_page, + addr, + flash_algo.program_buffer_size, + flash_algo.program_buffer, + 0)) { + return ERROR_WRITE; + } + + addr += write_size; + buf += write_size; + size -= write_size; + } + + return ERROR_SUCCESS; +} + +error_t target_flash_erase_sector(uint32_t addr) +{ + if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.erase_sector, addr, 0, 0, 0)) { + return ERROR_ERASE_SECTOR; + } + + return ERROR_SUCCESS; +} + +error_t target_flash_erase_chip(void) +{ + error_t status = ERROR_SUCCESS; + + if (0 != swd_flash_syscall_exec(&flash_algo.sys_call_s, flash_algo.erase_chip, 0, 0, 0, 0)) { + return ERROR_ERASE_ALL; + } + + return status; +} diff --git a/src/SWD_host/SWD_flash.h b/src/SWD_host/SWD_flash.h new file mode 100644 index 0000000..37c7342 --- /dev/null +++ b/src/SWD_host/SWD_flash.h @@ -0,0 +1,38 @@ +#ifndef __SWD_FLASH_H__ +#define __SWD_FLASH_H__ + +#include + + +typedef enum { + /* Shared errors */ + ERROR_SUCCESS = 0, + ERROR_FAILURE, + ERROR_INTERNAL, + + /* Target flash errors */ + ERROR_RESET, + ERROR_ALGO_DL, + ERROR_ALGO_DATA_SEQ, + ERROR_INIT, + ERROR_UNINIT, + ERROR_SECURITY_BITS, + ERROR_UNLOCK, + ERROR_ERASE_SECTOR, + ERROR_ERASE_ALL, + ERROR_WRITE, + + // Add new values here + + ERROR_COUNT +} error_t; + + +error_t target_flash_init(uint32_t flash_start, uint32_t func); +error_t target_flash_uninit(uint32_t func); +error_t target_flash_program_page(uint32_t addr, const uint8_t *buf, uint32_t size); +error_t target_flash_erase_sector(uint32_t addr); +error_t target_flash_erase_chip(void); + + +#endif // __SWD_FLASH_H__ diff --git a/src/SWD_host/SWD_host.c b/src/SWD_host/SWD_host.c new file mode 100644 index 0000000..2038f68 --- /dev/null +++ b/src/SWD_host/SWD_host.c @@ -0,0 +1,1095 @@ +/** + * @file SWDd_host.c + * @brief Host driver for accessing the DAP + */ +#include "swd_host.h" + +#include "DAP_config.h" +#include "DAP.h" +#include "debug_cm.h" + +uint32_t Flash_Page_Size = 4096; + +extern uint32_t Flash_Page_Size; + + +#define NVIC_Addr (0xe000e000) +#define DBG_Addr (0xe000edf0) + +// AP CSW register, base value +#define CSW_VALUE (CSW_RESERVED | CSW_MSTRDBG | CSW_HPROT | CSW_DBGSTAT | CSW_SADDRINC) + +// SWD register access +#define SWD_REG_AP (1) +#define SWD_REG_DP (0) +#define SWD_REG_R (1<<1) +#define SWD_REG_W (0<<1) +#define SWD_REG_ADR(a) (a & 0x0c) + +#define DCRDR 0xE000EDF8 +#define DCRSR 0xE000EDF4 +#define DHCSR 0xE000EDF0 +#define REGWnR (1 << 16) + +#define MAX_SWD_RETRY 10 +#define MAX_TIMEOUT 1000000 // Timeout for syscalls on target + +#define SCB_AIRCR_PRIGROUP_Pos 8 +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) + + +typedef struct { + uint32_t select; + uint32_t csw; +} DAP_STATE; + +typedef struct { + uint32_t r[16]; + uint32_t xpsr; +} DEBUG_STATE; + +static DAP_STATE dap_state; + +static uint8_t swd_read_core_register(uint32_t n, uint32_t *val); +static uint8_t swd_write_core_register(uint32_t n, uint32_t val); + + +void delaymS(uint32_t ms) +{ + uint32_t cnt = SystemCoreClock/4/1000 * ms; + + for(uint32_t i = 0; i < cnt; i++) __NOP(); +} + + +static void int2array(uint8_t *res, uint32_t data, uint8_t len) +{ + uint8_t i = 0; + + for(i = 0; i < len; i++) { + res[i] = (data >> 8 * i) & 0xFF; + } +} + +static uint8_t swd_transfer_retry(uint32_t req, uint32_t *data) +{ + uint8_t i, ack; + + for (i = 0; i < MAX_SWD_RETRY; i++) { + ack = SWD_Transfer(req, data); + + if (ack != DAP_TRANSFER_WAIT) { + return ack; + } + } + + return ack; +} + + +uint8_t swd_init(void) +{ + DAP_Setup(); + PORT_SWD_SETUP(); + + return 1; +} + +uint8_t swd_off(void) +{ + PORT_OFF(); + + return 1; +} + +// Read debug port register. +uint8_t swd_read_dp(uint8_t adr, uint32_t *val) +{ + uint32_t tmp_in; + uint8_t tmp_out[4]; + uint8_t ack; + uint32_t tmp; + + tmp_in = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(adr); + ack = swd_transfer_retry(tmp_in, (uint32_t *)tmp_out); + + *val = 0; + tmp = tmp_out[3]; + *val |= (tmp << 24); + tmp = tmp_out[2]; + *val |= (tmp << 16); + tmp = tmp_out[1]; + *val |= (tmp << 8); + tmp = tmp_out[0]; + *val |= (tmp << 0); + + return (ack == 0x01); +} + +// Write debug port register +uint8_t swd_write_dp(uint8_t adr, uint32_t val) +{ + uint32_t req; + uint8_t data[4]; + uint8_t ack; + + switch (adr) { + case DP_SELECT: + if (dap_state.select == val) { + return 1; + } + + dap_state.select = val; + break; + + default: + break; + } + + req = SWD_REG_DP | SWD_REG_W | SWD_REG_ADR(adr); + int2array(data, val, 4); + ack = swd_transfer_retry(req, (uint32_t *)data); + + return (ack == 0x01); +} + +// Read access port register. +uint8_t swd_read_ap(uint32_t adr, uint32_t *val) +{ + uint8_t tmp_in, ack; + uint8_t tmp_out[4]; + uint32_t tmp; + uint32_t apsel = adr & 0xff000000; + uint32_t bank_sel = adr & APBANKSEL; + + if (!swd_write_dp(DP_SELECT, apsel | bank_sel)) { + return 0; + } + + tmp_in = SWD_REG_AP | SWD_REG_R | SWD_REG_ADR(adr); + // first dummy read + swd_transfer_retry(tmp_in, (uint32_t *)tmp_out); + ack = swd_transfer_retry(tmp_in, (uint32_t *)tmp_out); + + *val = 0; + tmp = tmp_out[3]; + *val |= (tmp << 24); + tmp = tmp_out[2]; + *val |= (tmp << 16); + tmp = tmp_out[1]; + *val |= (tmp << 8); + tmp = tmp_out[0]; + *val |= (tmp << 0); + + return (ack == 0x01); +} + +// Write access port register +uint8_t swd_write_ap(uint32_t adr, uint32_t val) +{ + uint8_t data[4]; + uint8_t req, ack; + uint32_t apsel = adr & 0xff000000; + uint32_t bank_sel = adr & APBANKSEL; + + if (!swd_write_dp(DP_SELECT, apsel | bank_sel)) { + return 0; + } + + switch (adr) { + case AP_CSW: + if (dap_state.csw == val) { + return 1; + } + + dap_state.csw = val; + break; + + default: + break; + } + + req = SWD_REG_AP | SWD_REG_W | SWD_REG_ADR(adr); + int2array(data, val, 4); + + if (swd_transfer_retry(req, (uint32_t *)data) != 0x01) { + return 0; + } + + req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF); + ack = swd_transfer_retry(req, NULL); + + return (ack == 0x01); +} + + +// Write 32-bit word aligned values to target memory using address auto-increment. +// size is in bytes. +static uint8_t swd_write_block(uint32_t address, uint8_t *data, uint32_t size) +{ + uint8_t tmp_in[4], req; + uint32_t size_in_words; + uint32_t i, ack; + + if (size == 0) { + return 0; + } + + size_in_words = size / 4; + + // CSW register + if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) { + return 0; + } + + // TAR write + req = SWD_REG_AP | SWD_REG_W | (1 << 2); + int2array(tmp_in, address, 4); + + if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) { + return 0; + } + + // DRW write + req = SWD_REG_AP | SWD_REG_W | (3 << 2); + + for (i = 0; i < size_in_words; i++) { + if (swd_transfer_retry(req, (uint32_t *)data) != 0x01) { + return 0; + } + + data += 4; + } + + // dummy read + req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF); + ack = swd_transfer_retry(req, NULL); + return (ack == 0x01); +} + +// Read 32-bit word aligned values from target memory using address auto-increment. +// size is in bytes. +static uint8_t swd_read_block(uint32_t address, uint8_t *data, uint32_t size) +{ + uint8_t tmp_in[4], req, ack; + uint32_t size_in_words; + uint32_t i; + + if (size == 0) { + return 0; + } + + size_in_words = size / 4; + + if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) { + return 0; + } + + // TAR write + req = SWD_REG_AP | SWD_REG_W | AP_TAR; + int2array(tmp_in, address, 4); + + if (swd_transfer_retry(req, (uint32_t *)tmp_in) != DAP_TRANSFER_OK) { + return 0; + } + + // read data + req = SWD_REG_AP | SWD_REG_R | AP_DRW; + + // initiate first read, data comes back in next read + if (swd_transfer_retry(req, NULL) != 0x01) { + return 0; + } + + for (i = 0; i < (size_in_words - 1); i++) { + if (swd_transfer_retry(req, (uint32_t *)data) != DAP_TRANSFER_OK) { + return 0; + } + + data += 4; + } + + // read last word + req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF); + ack = swd_transfer_retry(req, (uint32_t *)data); + return (ack == 0x01); +} + +// Read target memory. +static uint8_t swd_read_data(uint32_t addr, uint32_t *val) +{ + uint8_t tmp_in[4]; + uint8_t tmp_out[4]; + uint8_t req, ack; + uint32_t tmp; + // put addr in TAR register + int2array(tmp_in, addr, 4); + req = SWD_REG_AP | SWD_REG_W | (1 << 2); + + if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) { + return 0; + } + + // read data + req = SWD_REG_AP | SWD_REG_R | (3 << 2); + + if (swd_transfer_retry(req, (uint32_t *)tmp_out) != 0x01) { + return 0; + } + + // dummy read + req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF); + ack = swd_transfer_retry(req, (uint32_t *)tmp_out); + *val = 0; + tmp = tmp_out[3]; + *val |= (tmp << 24); + tmp = tmp_out[2]; + *val |= (tmp << 16); + tmp = tmp_out[1]; + *val |= (tmp << 8); + tmp = tmp_out[0]; + *val |= (tmp << 0); + return (ack == 0x01); +} + +// Write target memory. +static uint8_t swd_write_data(uint32_t address, uint32_t data) +{ + uint8_t tmp_in[4]; + uint8_t req, ack; + // put addr in TAR register + int2array(tmp_in, address, 4); + req = SWD_REG_AP | SWD_REG_W | (1 << 2); + + if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) { + return 0; + } + + // write data + int2array(tmp_in, data, 4); + req = SWD_REG_AP | SWD_REG_W | (3 << 2); + + if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01) { + return 0; + } + + // dummy read + req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF); + ack = swd_transfer_retry(req, NULL); + return (ack == 0x01) ? 1 : 0; +} + +// Read 32-bit word from target memory. +/* static */ uint8_t swd_read_word(uint32_t addr, uint32_t *val) +{ + if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) { + return 0; + } + + if (!swd_read_data(addr, val)) { + return 0; + } + + return 1; +} + +// Write 32-bit word to target memory. +/* static */ uint8_t swd_write_word(uint32_t addr, uint32_t val) +{ + if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE32)) { + return 0; + } + + if (!swd_write_data(addr, val)) { + return 0; + } + + return 1; +} + +// Read 8-bit byte from target memory. +static uint8_t swd_read_byte(uint32_t addr, uint8_t *val) +{ + uint32_t tmp; + + if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE8)) { + return 0; + } + + if (!swd_read_data(addr, &tmp)) { + return 0; + } + + *val = (uint8_t)(tmp >> ((addr & 0x03) << 3)); + return 1; +} + +// Write 8-bit byte to target memory. +static uint8_t swd_write_byte(uint32_t addr, uint8_t val) +{ + uint32_t tmp; + + if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE8)) { + return 0; + } + + tmp = val << ((addr & 0x03) << 3); + + if (!swd_write_data(addr, tmp)) { + return 0; + } + + return 1; +} + +// Read unaligned data from target memory. +// size is in bytes. +uint8_t swd_read_memory(uint32_t address, uint8_t *data, uint32_t size) +{ + uint32_t n; + + // Read bytes until word aligned + while ((size > 0) && (address & 0x3)) { + if (!swd_read_byte(address, data)) { + return 0; + } + + address++; + data++; + size--; + } + + // Read word aligned blocks + while (size > 3) { + // Limit to auto increment page size + n = Flash_Page_Size - (address & (Flash_Page_Size - 1)); + + if (size < n) { + n = size & 0xFFFFFFFC; // Only count complete words remaining + } + + if (!swd_read_block(address, data, n)) { + return 0; + } + + address += n; + data += n; + size -= n; + } + + // Read remaining bytes + while (size > 0) { + if (!swd_read_byte(address, data)) { + return 0; + } + + address++; + data++; + size--; + } + + return 1; +} + +// Write unaligned data to target memory. +// size is in bytes. +uint8_t swd_write_memory(uint32_t address, uint8_t *data, uint32_t size) +{ + uint32_t n = 0; + + // Write bytes until word aligned + while ((size > 0) && (address & 0x3)) { + if (!swd_write_byte(address, *data)) { + return 0; + } + + address++; + data++; + size--; + } + + // Write word aligned blocks + while (size > 3) { + // Limit to auto increment page size + n = Flash_Page_Size - (address & (Flash_Page_Size - 1)); + + if (size < n) { + n = size & 0xFFFFFFFC; // Only count complete words remaining + } + + if (!swd_write_block(address, data, n)) { + return 0; + } + + address += n; + data += n; + size -= n; + } + + // Write remaining bytes + while (size > 0) { + if (!swd_write_byte(address, *data)) { + return 0; + } + + address++; + data++; + size--; + } + + return 1; +} + +// Execute system call. +static uint8_t swd_write_debug_state(DEBUG_STATE *state) +{ + uint32_t i, status; + + if (!swd_write_dp(DP_SELECT, 0)) { + return 0; + } + + // R0, R1, R2, R3 + for (i = 0; i < 4; i++) { + if (!swd_write_core_register(i, state->r[i])) { + return 0; + } + } + + // R9 + if (!swd_write_core_register(9, state->r[9])) { + return 0; + } + + // R13, R14, R15 + for (i = 13; i < 16; i++) { + if (!swd_write_core_register(i, state->r[i])) { + return 0; + } + } + + // xPSR + if (!swd_write_core_register(16, state->xpsr)) { + return 0; + } + + if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN)) { + return 0; + } + + // check status + if (!swd_read_dp(DP_CTRL_STAT, &status)) { + return 0; + } + + if (status & (STICKYERR | WDATAERR)) { + return 0; + } + + return 1; +} + +static uint8_t swd_read_core_register(uint32_t n, uint32_t *val) +{ + int i = 0, timeout = 100; + + if (!swd_write_word(DCRSR, n)) { + return 0; + } + + // wait for S_REGRDY + for (i = 0; i < timeout; i++) { + if (!swd_read_word(DHCSR, val)) { + return 0; + } + + if (*val & S_REGRDY) { + break; + } + } + + if (i == timeout) { + return 0; + } + + if (!swd_read_word(DCRDR, val)) { + return 0; + } + + return 1; +} + +static uint8_t swd_write_core_register(uint32_t n, uint32_t val) +{ + int i = 0, timeout = 100; + + if (!swd_write_word(DCRDR, val)) { + return 0; + } + + if (!swd_write_word(DCRSR, n | REGWnR)) { + return 0; + } + + // wait for S_REGRDY + for (i = 0; i < timeout; i++) { + if (!swd_read_word(DHCSR, &val)) { + return 0; + } + + if (val & S_REGRDY) { + return 1; + } + } + + return 0; +} + +static uint8_t swd_wait_until_halted(void) +{ + // Wait for target to stop + uint32_t val, i, timeout = MAX_TIMEOUT; + + for (i = 0; i < timeout; i++) { + if (!swd_read_word(DBG_HCSR, &val)) { + return 0; + } + + if (val & S_HALT) { + return 1; + } + } + + return 0; +} + +uint8_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4) +{ + DEBUG_STATE state = {{0}, 0}; + // Call flash algorithm function on target and wait for result. + state.r[0] = arg1; // R0: Argument 1 + state.r[1] = arg2; // R1: Argument 2 + state.r[2] = arg3; // R2: Argument 3 + state.r[3] = arg4; // R3: Argument 4 + state.r[9] = sysCallParam->static_base; // SB: Static Base + state.r[13] = sysCallParam->stack_pointer; // SP: Stack Pointer + state.r[14] = sysCallParam->breakpoint; // LR: Exit Point + state.r[15] = entry; // PC: Entry Point + state.xpsr = 0x01000000; // xPSR: T = 1, ISR = 0 + + if (!swd_write_debug_state(&state)) { + return 0; + } + + if (!swd_wait_until_halted()) { + return 0; + } + + if (!swd_read_core_register(0, &state.r[0])) { + return 0; + } + + // Flash functions return 0 if successful. + if (state.r[0] != 0) { + return 0; + } + + return 1; +} + +// SWD Reset +static uint8_t swd_reset(void) +{ + uint8_t tmp_in[8]; + uint8_t i = 0; + + for (i = 0; i < 8; i++) { + tmp_in[i] = 0xff; + } + + SWJ_Sequence(51, tmp_in); + return 1; +} + +// SWD Switch +static uint8_t swd_switch(uint16_t val) +{ + uint8_t tmp_in[2]; + tmp_in[0] = val & 0xff; + tmp_in[1] = (val >> 8) & 0xff; + SWJ_Sequence(16, tmp_in); + return 1; +} + +// SWD Read ID +static uint8_t swd_read_idcode(uint32_t *id) +{ + uint8_t tmp_in[1]; + uint8_t tmp_out[4]; + tmp_in[0] = 0x00; + SWJ_Sequence(8, tmp_in); + + if (swd_read_dp(0, (uint32_t *)tmp_out) != 0x01) { + return 0; + } + + *id = (tmp_out[3] << 24) | (tmp_out[2] << 16) | (tmp_out[1] << 8) | tmp_out[0]; + return 1; +} + + +static uint8_t JTAG2SWD() +{ + uint32_t tmp = 0; + + if (!swd_reset()) { + return 0; + } + + if (!swd_switch(0xE79E)) { + return 0; + } + + if (!swd_reset()) { + return 0; + } + + if (!swd_read_idcode(&tmp)) { + return 0; + } + + return 1; +} + +uint8_t swd_init_debug(void) +{ + uint32_t tmp = 0; + int i = 0; + int timeout = 100; + // init dap state with fake values + dap_state.select = 0xffffffff; + dap_state.csw = 0xffffffff; + swd_init(); + + // call a target dependant function + // this function can do several stuff before really initing the debug + //target_before_init_debug(); + + if (!JTAG2SWD()) { + return 0; + } + + if (!swd_write_dp(DP_ABORT, STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR)) { + return 0; + } + + // Ensure CTRL/STAT register selected in DPBANKSEL + if (!swd_write_dp(DP_SELECT, 0)) { + return 0; + } + + // Power up + if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ)) { + return 0; + } + + for (i = 0; i < timeout; i++) { + if (!swd_read_dp(DP_CTRL_STAT, &tmp)) { + return 0; + } + if ((tmp & (CDBGPWRUPACK | CSYSPWRUPACK)) == (CDBGPWRUPACK | CSYSPWRUPACK)) { + // Break from loop if powerup is complete + break; + } + } + if (i == timeout) { + // Unable to powerup DP + return 0; + } + + if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ | TRNNORMAL | MASKLANE)) { + return 0; + } + + // call a target dependant function: + // some target can enter in a lock state, this function can unlock these targets + //target_unlock_sequence(); + + if (!swd_write_dp(DP_SELECT, 0)) { + return 0; + } + + return 1; +} +/* +__attribute__((weak)) void swd_set_target_reset(uint8_t asserted) +{ + (asserted) ? PIN_nRESET_OUT(0) : PIN_nRESET_OUT(1); +} +*/ +void swd_set_target_reset(uint8_t asserted) +{ + /* ļжԴ˺ʹö asserted=1 ãʱ asserted=0 ãΪֻһֻڵڶεô˺ʱִλ */ + if(asserted == 0) + { + swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk)); + } +} + +uint8_t swd_set_target_state_hw(TARGET_RESET_STATE state) +{ + uint32_t val; + int8_t ap_retries = 2; + /* Calling swd_init prior to entering RUN state causes operations to fail. */ + if (state != RUN) { + swd_init(); + } + + switch (state) { + case RESET_HOLD: + swd_set_target_reset(1); + break; + + case RESET_RUN: + swd_set_target_reset(1); + delaymS(20); + swd_set_target_reset(0); + delaymS(20); + swd_off(); + break; + + case RESET_PROGRAM: + if (!swd_init_debug()) { + return 0; + } + + // Enable debug + while(swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN) == 0) { + if( --ap_retries <=0 ) + return 0; + // Target is in invalid state? + swd_set_target_reset(1); + delaymS(20); + swd_set_target_reset(0); + delaymS(20); + } + + // Enable halt on reset + if (!swd_write_word(DBG_EMCR, VC_CORERESET)) { + return 0; + } + + // Reset again + swd_set_target_reset(1); + delaymS(20); + swd_set_target_reset(0); + delaymS(20); + + do { + if (!swd_read_word(DBG_HCSR, &val)) { + return 0; + } + } while ((val & S_HALT) == 0); + + // Disable halt on reset + if (!swd_write_word(DBG_EMCR, 0)) { + return 0; + } + + break; + + case NO_DEBUG: + if (!swd_write_word(DBG_HCSR, DBGKEY)) { + return 0; + } + + break; + + case DEBUG: + if (!JTAG2SWD()) { + return 0; + } + + if (!swd_write_dp(DP_ABORT, STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR)) { + return 0; + } + + // Ensure CTRL/STAT register selected in DPBANKSEL + if (!swd_write_dp(DP_SELECT, 0)) { + return 0; + } + + // Power up + if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ)) { + return 0; + } + + // Enable debug + if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN)) { + return 0; + } + + break; + + case HALT: + if (!swd_init_debug()) { + return 0; + } + + // Enable debug and halt the core (DHCSR <- 0xA05F0003) + if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN | C_HALT)) { + return 0; + } + + // Wait until core is halted + do { + if (!swd_read_word(DBG_HCSR, &val)) { + return 0; + } + } while ((val & S_HALT) == 0); + break; + + case RUN: + if (!swd_write_word(DBG_HCSR, DBGKEY)) { + return 0; + } + swd_off(); + + default: + return 0; + } + + return 1; +} + +uint8_t swd_set_target_state_sw(TARGET_RESET_STATE state) +{ + uint32_t val; + + /* Calling swd_init prior to enterring RUN state causes operations to fail. */ + if (state != RUN) { + swd_init(); + } + + switch (state) { + case RESET_HOLD: + swd_set_target_reset(1); + break; + + case RESET_RUN: + swd_set_target_reset(1); + delaymS(20); + swd_set_target_reset(0); + delaymS(20); + swd_off(); + break; + + case RESET_PROGRAM: + if (!swd_init_debug()) { + return 0; + } + + // Enable debug and halt the core (DHCSR <- 0xA05F0003) + if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN | C_HALT)) { + return 0; + } + + // Wait until core is halted + do { + if (!swd_read_word(DBG_HCSR, &val)) { + return 0; + } + } while ((val & S_HALT) == 0); + + // Enable halt on reset + if (!swd_write_word(DBG_EMCR, VC_CORERESET)) { + return 0; + } + + // Perform a soft reset + if (!swd_read_word(NVIC_AIRCR, &val)) { + return 0; + } + + if (!swd_write_word(NVIC_AIRCR, VECTKEY | (val & SCB_AIRCR_PRIGROUP_Msk) | SYSRESETREQ)) { + return 0; + } + + delaymS(20); + + do { + if (!swd_read_word(DBG_HCSR, &val)) { + return 0; + } + } while ((val & S_HALT) == 0); + + // Disable halt on reset + if (!swd_write_word(DBG_EMCR, 0)) { + return 0; + } + + break; + + case NO_DEBUG: + if (!swd_write_word(DBG_HCSR, DBGKEY)) { + return 0; + } + + break; + + case DEBUG: + if (!JTAG2SWD()) { + return 0; + } + + if (!swd_write_dp(DP_ABORT, STKCMPCLR | STKERRCLR | WDERRCLR | ORUNERRCLR)) { + return 0; + } + + // Ensure CTRL/STAT register selected in DPBANKSEL + if (!swd_write_dp(DP_SELECT, 0)) { + return 0; + } + + // Power up + if (!swd_write_dp(DP_CTRL_STAT, CSYSPWRUPREQ | CDBGPWRUPREQ)) { + return 0; + } + + // Enable debug + if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN)) { + return 0; + } + + break; + + case HALT: + if (!swd_init_debug()) { + return 0; + } + + // Enable debug and halt the core (DHCSR <- 0xA05F0003) + if (!swd_write_word(DBG_HCSR, DBGKEY | C_DEBUGEN | C_HALT)) { + return 0; + } + + // Wait until core is halted + do { + if (!swd_read_word(DBG_HCSR, &val)) { + return 0; + } + } while ((val & S_HALT) == 0); + break; + + case RUN: + if (!swd_write_word(DBG_HCSR, DBGKEY)) { + return 0; + } + swd_off(); + + default: + return 0; + } + + return 1; +} diff --git a/src/SWD_host/SWD_host.h b/src/SWD_host/SWD_host.h new file mode 100644 index 0000000..31e313b --- /dev/null +++ b/src/SWD_host/SWD_host.h @@ -0,0 +1,39 @@ +#ifndef SWDHOST_CM_H +#define SWDHOST_CM_H + +#include + +#include "flash_blob.h" + + +typedef enum { + RESET_HOLD, // Hold target in reset + RESET_PROGRAM, // Reset target and setup for flash programming. + RESET_RUN, // Reset target and run normally + NO_DEBUG, // Disable debug on running target + DEBUG, // Enable debug on running target + HALT, // Halt the target without resetting it + RUN // Resume the target without resetting it +} TARGET_RESET_STATE; + + +uint8_t swd_init(void); +uint8_t swd_off(void); +uint8_t swd_init_debug(void); +uint8_t swd_read_dp(uint8_t adr, uint32_t *val); +uint8_t swd_write_dp(uint8_t adr, uint32_t val); +uint8_t swd_read_ap(uint32_t adr, uint32_t *val); +uint8_t swd_write_ap(uint32_t adr, uint32_t val); +uint8_t swd_read_memory(uint32_t address, uint8_t *data, uint32_t size); +uint8_t swd_write_memory(uint32_t address, uint8_t *data, uint32_t size); +uint8_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4); +void swd_set_target_reset(uint8_t asserted); +uint8_t swd_set_target_state_hw(TARGET_RESET_STATE state); +uint8_t swd_set_target_state_sw(TARGET_RESET_STATE state); + + +uint8_t swd_read_word(uint32_t addr, uint32_t *val); +uint8_t swd_write_word(uint32_t addr, uint32_t val); + + +#endif diff --git a/src/SWD_host/debug_ca.h b/src/SWD_host/debug_ca.h new file mode 100644 index 0000000..edf45ce --- /dev/null +++ b/src/SWD_host/debug_ca.h @@ -0,0 +1,286 @@ +/** + * @file debug_ca.h + * @brief Access to ARM DAP (Cortex-A) using CMSIS-DAP protocol + * + * DAPLink Interface Firmware + * Copyright (c) 2009-2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DEBUG_CA_H +#define DEBUG_CA_H + +#include "DAP.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Abort Register definitions +#define DAPABORT 0x00000001 // DAP Abort +#define STKCMPCLR 0x00000002 // Clear STICKYCMP Flag (SW Only) +#define STKERRCLR 0x00000004 // Clear STICKYERR Flag (SW Only) +#define WDERRCLR 0x00000008 // Clear WDATAERR Flag (SW Only) +#define ORUNERRCLR 0x00000010 // Clear STICKYORUN Flag (SW Only) + +// Debug Control and Status definitions +#define ORUNDETECT 0x00000001 // Overrun Detect +#define STICKYORUN 0x00000002 // Sticky Overrun +#define TRNMODE 0x0000000C // Transfer Mode Mask +#define TRNNORMAL 0x00000000 // Transfer Mode: Normal +#define TRNVERIFY 0x00000004 // Transfer Mode: Pushed Verify +#define TRNCOMPARE 0x00000008 // Transfer Mode: Pushed Compare +#define STICKYCMP 0x00000010 // Sticky Compare +#define STICKYERR 0x00000020 // Sticky Error +#define READOK 0x00000040 // Read OK (SW Only) +#define WDATAERR 0x00000080 // Write Data Error (SW Only) +#define MASKLANE 0x00000F00 // Mask Lane Mask +#define MASKLANE0 0x00000100 // Mask Lane 0 +#define MASKLANE1 0x00000200 // Mask Lane 1 +#define MASKLANE2 0x00000400 // Mask Lane 2 +#define MASKLANE3 0x00000800 // Mask Lane 3 +#define TRNCNT 0x001FF000 // Transaction Counter Mask +#define CDBGRSTREQ 0x04000000 // Debug Reset Request +#define CDBGRSTACK 0x08000000 // Debug Reset Acknowledge +#define CDBGPWRUPREQ 0x10000000 // Debug Power-up Request +#define CDBGPWRUPACK 0x20000000 // Debug Power-up Acknowledge +#define CSYSPWRUPREQ 0x40000000 // System Power-up Request +#define CSYSPWRUPACK 0x80000000 // System Power-up Acknowledge + +// Debug Select Register definitions +#define CTRLSEL 0x00000001 // CTRLSEL (SW Only) +#define APBANKSEL 0x000000F0 // APBANKSEL Mask +#define APSEL 0xFF000000 // APSEL Mask + +// Access Port Register Addresses +#define AP_CSW 0x00 // Control and Status Word +#define AP_TAR 0x04 // Transfer Address +#define AP_DRW 0x0C // Data Read/Write +#define AP_BD0 0x10 // Banked Data 0 +#define AP_BD1 0x14 // Banked Data 1 +#define AP_BD2 0x18 // Banked Data 2 +#define AP_BD3 0x1C // Banked Data 3 +#define AP_ROM 0xF8 // Debug ROM Address +#define AP_IDR 0xFC // Identification Register + +// AP Control and Status Word definitions +#define CSW_SIZE 0x00000007 // Access Size: Selection Mask +#define CSW_SIZE8 0x00000000 // Access Size: 8-bit +#define CSW_SIZE16 0x00000001 // Access Size: 16-bit +#define CSW_SIZE32 0x00000002 // Access Size: 32-bit +#define CSW_ADDRINC 0x00000030 // Auto Address Increment Mask +#define CSW_NADDRINC 0x00000000 // No Address Increment +#define CSW_SADDRINC 0x00000010 // Single Address Increment +#define CSW_PADDRINC 0x00000020 // Packed Address Increment +#define CSW_DBGSTAT 0x00000040 // Debug Status +#define CSW_TINPROG 0x00000080 // Transfer in progress +#define CSW_HPROT 0x02000000 // User/Privilege Control +#define CSW_MSTRTYPE 0x20000000 // Master Type Mask +#define CSW_MSTRCORE 0x00000000 // Master Type: Core +#define CSW_MSTRDBG 0x60000000 // Master Type: Debug +#define CSW_RESERVED 0x01000000 // Reserved Value + +// Core Debug Register Address Offsets +#define DBG_OFS 0x0DF0 // Debug Register Offset inside NVIC +#define DBG_HCSR_OFS 0x00 // Debug Halting Control & Status Register +#define DBG_CRSR_OFS 0x04 // Debug Core Register Selector Register +#define DBG_CRDR_OFS 0x08 // Debug Core Register Data Register +#define DBG_EMCR_OFS 0x0C // Debug Exception & Monitor Control Register + +// Core Debug Register Addresses +#define DBG_HCSR (DBG_Addr + DBG_HCSR_OFS) +#define DBG_CRSR (DBG_Addr + DBG_CRSR_OFS) +#define DBG_CRDR (DBG_Addr + DBG_CRDR_OFS) +#define DBG_EMCR (DBG_Addr + DBG_EMCR_OFS) + +// Debug Halting Control and Status Register definitions +#define C_DEBUGEN 0x00000001 // Debug Enable +#define C_HALT 0x00000002 // Halt +#define C_STEP 0x00000004 // Step +#define C_MASKINTS 0x00000008 // Mask Interrupts +#define C_SNAPSTALL 0x00000020 // Snap Stall +#define S_REGRDY 0x00010000 // Register R/W Ready Flag +#define S_HALT 0x00020000 // Halt Flag +#define S_SLEEP 0x00040000 // Sleep Flag +#define S_LOCKUP 0x00080000 // Lockup Flag +#define S_RETIRE_ST 0x01000000 // Sticky Retire Flag +#define S_RESET_ST 0x02000000 // Sticky Reset Flag +#define DBGKEY 0xA05F0000 // Debug Key + +// Debug Exception and Monitor Control Register definitions +#define VC_CORERESET 0x00000001 // Reset Vector Catch +#define VC_MMERR 0x00000010 // Debug Trap on MMU Fault +#define VC_NOCPERR 0x00000020 // Debug Trap on No Coprocessor Fault +#define VC_CHKERR 0x00000040 // Debug Trap on Checking Error Fault +#define VC_STATERR 0x00000080 // Debug Trap on State Error Fault +#define VC_BUSERR 0x00000100 // Debug Trap on Bus Error Fault +#define VC_INTERR 0x00000200 // Debug Trap on Interrupt Error Fault +#define VC_HARDERR 0x00000400 // Debug Trap on Hard Fault +#define MON_EN 0x00010000 // Monitor Enable +#define MON_PEND 0x00020000 // Monitor Pend +#define MON_STEP 0x00040000 // Monitor Step +#define MON_REQ 0x00080000 // Monitor Request +#define TRCENA 0x01000000 // Trace Enable (DWT, ITM, ETM, TPIU) + +// NVIC: Interrupt Controller Type Register +#define NVIC_ICT (NVIC_Addr + 0x0004) +#define INTLINESNUM 0x0000001F // Interrupt Line Numbers + +// NVIC: CPUID Base Register +#define NVIC_CPUID (NVIC_Addr + 0x0D00) +#define CPUID_PARTNO 0x0000FFF0 // Part Number Mask +#define CPUID_REVISION 0x0000000F // Revision Mask +#define CPUID_VARIANT 0x00F00000 // Variant Mask + +// NVIC: Application Interrupt/Reset Control Register +#define NVIC_AIRCR (NVIC_Addr + 0x0D0C) +#define VECTRESET 0x00000001 // Reset Cortex-M (except Debug) +#define VECTCLRACTIVE 0x00000002 // Clear Active Vector Bit +#define SYSRESETREQ 0x00000004 // Reset System (except Debug) +#define VECTKEY 0x05FA0000 // Write Key + +// NVIC: Debug Fault Status Register +#define NVIC_DFSR (NVIC_Addr + 0x0D30) +#define HALTED 0x00000001 // Halt Flag +#define BKPT 0x00000002 // BKPT Flag +#define DWTTRAP 0x00000004 // DWT Match +#define VCATCH 0x00000008 // Vector Catch Flag +#define EXTERNAL 0x00000010 // External Debug Request + +// Debug registers +#define DEBUG_REGSITER_BASE (0x80030000) + +#define DBGDIDR (DEBUG_REGSITER_BASE + (0 * 4)) // Debug ID +#define DBGWFAR (DEBUG_REGSITER_BASE + (6 * 4)) // Watchpoint Fault Address +#define DBGVCR (DEBUG_REGSITER_BASE + (7 * 4)) // Vector Catch +#define DBGECR (DEBUG_REGSITER_BASE + (9 * 4)) // Event Catch +#define DBGDTRRX (DEBUG_REGSITER_BASE + (32 * 4)) // Host to Target Data Transfer +#define DBGITR (DEBUG_REGSITER_BASE + (33 * 4)) // WO Instruction Transfer +#define DBGDSCR (DEBUG_REGSITER_BASE + (34 * 4)) // Debug Status and Control +#define DBGDTRTX (DEBUG_REGSITER_BASE + (35 * 4)) // Target to Host Data Transfer +#define DBGDRCR (DEBUG_REGSITER_BASE + (36 * 4)) // Debug Run Control +#define DBGEACR (DEBUG_REGSITER_BASE + (37 * 4)) // External Auxiliary Control +#define DBGPCSR (DEBUG_REGSITER_BASE + (40 * 4)) // Program Counter Sampling +#define DBGCIDSR (DEBUG_REGSITER_BASE + (41 * 4)) // Context ID Sampling +#define DBGVIDSR (DEBUG_REGSITER_BASE + (42 * 4)) // Virtualization ID Sampling +#define DBGBVR0 (DEBUG_REGSITER_BASE + (64 * 4)) // Breakpoint Value +#define DBGBVR1 (DEBUG_REGSITER_BASE + (65 * 4)) // Breakpoint Value +#define DBGBVR2 (DEBUG_REGSITER_BASE + (66 * 4)) // Breakpoint Value +#define DBGBVR3 (DEBUG_REGSITER_BASE + (67 * 4)) // Breakpoint Value +#define DBGBVR4 (DEBUG_REGSITER_BASE + (68 * 4)) // Breakpoint Value +#define DBGBVR5 (DEBUG_REGSITER_BASE + (69 * 4)) // Breakpoint Value +#define DBGBVR6 (DEBUG_REGSITER_BASE + (70 * 4)) // Breakpoint Value +#define DBGBVR7 (DEBUG_REGSITER_BASE + (71 * 4)) // Breakpoint Value +#define DBGBVR8 (DEBUG_REGSITER_BASE + (72 * 4)) // Breakpoint Value +#define DBGBVR9 (DEBUG_REGSITER_BASE + (73 * 4)) // Breakpoint Value +#define DBGBVR10 (DEBUG_REGSITER_BASE + (74 * 4)) // Breakpoint Value +#define DBGBVR11 (DEBUG_REGSITER_BASE + (75 * 4)) // Breakpoint Value +#define DBGBVR12 (DEBUG_REGSITER_BASE + (76 * 4)) // Breakpoint Value +#define DBGBVR13 (DEBUG_REGSITER_BASE + (77 * 4)) // Breakpoint Value +#define DBGBVR14 (DEBUG_REGSITER_BASE + (78 * 4)) // Breakpoint Value +#define DBGBVR15 (DEBUG_REGSITER_BASE + (79 * 4)) // Breakpoint Value +#define DBGBCR0 (DEBUG_REGSITER_BASE + (80 * 4)) // Breakpoint Control +#define DBGBCR1 (DEBUG_REGSITER_BASE + (81 * 4)) // Breakpoint Control +#define DBGBCR2 (DEBUG_REGSITER_BASE + (82 * 4)) // Breakpoint Control +#define DBGBCR3 (DEBUG_REGSITER_BASE + (83 * 4)) // Breakpoint Control +#define DBGBCR4 (DEBUG_REGSITER_BASE + (84 * 4)) // Breakpoint Control +#define DBGBCR5 (DEBUG_REGSITER_BASE + (85 * 4)) // Breakpoint Control +#define DBGBCR6 (DEBUG_REGSITER_BASE + (86 * 4)) // Breakpoint Control +#define DBGBCR7 (DEBUG_REGSITER_BASE + (87 * 4)) // Breakpoint Control +#define DBGBCR8 (DEBUG_REGSITER_BASE + (88 * 4)) // Breakpoint Control +#define DBGBCR9 (DEBUG_REGSITER_BASE + (89 * 4)) // Breakpoint Control +#define DBGBCR10 (DEBUG_REGSITER_BASE + (90 * 4)) // Breakpoint Control +#define DBGBCR11 (DEBUG_REGSITER_BASE + (91 * 4)) // Breakpoint Control +#define DBGBCR12 (DEBUG_REGSITER_BASE + (92 * 4)) // Breakpoint Control +#define DBGBCR13 (DEBUG_REGSITER_BASE + (93 * 4)) // Breakpoint Control +#define DBGBCR14 (DEBUG_REGSITER_BASE + (94 * 4)) // Breakpoint Control +#define DBGBCR15 (DEBUG_REGSITER_BASE + (95 * 4)) // Breakpoint Control +#define DBGWVR0 (DEBUG_REGSITER_BASE + (96 * 4)) // Watchpoint Value +#define DBGWVR1 (DEBUG_REGSITER_BASE + (97 * 4)) // Watchpoint Value +#define DBGWVR2 (DEBUG_REGSITER_BASE + (98 * 4)) // Watchpoint Value +#define DBGWVR3 (DEBUG_REGSITER_BASE + (99 * 4)) // Watchpoint Value +#define DBGWVR4 (DEBUG_REGSITER_BASE + (100 * 4)) // Watchpoint Value +#define DBGWVR5 (DEBUG_REGSITER_BASE + (101 * 4)) // Watchpoint Value +#define DBGWVR6 (DEBUG_REGSITER_BASE + (102 * 4)) // Watchpoint Value +#define DBGWVR7 (DEBUG_REGSITER_BASE + (103 * 4)) // Watchpoint Value +#define DBGWVR8 (DEBUG_REGSITER_BASE + (104 * 4)) // Watchpoint Value +#define DBGWVR9 (DEBUG_REGSITER_BASE + (105 * 4)) // Watchpoint Value +#define DBGWVR10 (DEBUG_REGSITER_BASE + (106 * 4)) // Watchpoint Value +#define DBGWVR11 (DEBUG_REGSITER_BASE + (107 * 4)) // Watchpoint Value +#define DBGWVR12 (DEBUG_REGSITER_BASE + (108 * 4)) // Watchpoint Value +#define DBGWVR13 (DEBUG_REGSITER_BASE + (109 * 4)) // Watchpoint Value +#define DBGWVR14 (DEBUG_REGSITER_BASE + (110 * 4)) // Watchpoint Value +#define DBGWVR15 (DEBUG_REGSITER_BASE + (111 * 4)) // Watchpoint Value +#define DBGWCR0 (DEBUG_REGSITER_BASE + (112 * 4)) // Watchpoint Control +#define DBGWCR1 (DEBUG_REGSITER_BASE + (113 * 4)) // Watchpoint Control +#define DBGWCR2 (DEBUG_REGSITER_BASE + (114 * 4)) // Watchpoint Control +#define DBGWCR3 (DEBUG_REGSITER_BASE + (115 * 4)) // Watchpoint Control +#define DBGWCR4 (DEBUG_REGSITER_BASE + (116 * 4)) // Watchpoint Control +#define DBGWCR5 (DEBUG_REGSITER_BASE + (117 * 4)) // Watchpoint Control +#define DBGWCR6 (DEBUG_REGSITER_BASE + (118 * 4)) // Watchpoint Control +#define DBGWCR7 (DEBUG_REGSITER_BASE + (119 * 4)) // Watchpoint Control +#define DBGWCR8 (DEBUG_REGSITER_BASE + (120 * 4)) // Watchpoint Control +#define DBGWCR9 (DEBUG_REGSITER_BASE + (121 * 4)) // Watchpoint Control +#define DBGWCR10 (DEBUG_REGSITER_BASE + (122 * 4)) // Watchpoint Control +#define DBGWCR11 (DEBUG_REGSITER_BASE + (123 * 4)) // Watchpoint Control +#define DBGWCR12 (DEBUG_REGSITER_BASE + (124 * 4)) // Watchpoint Control +#define DBGWCR13 (DEBUG_REGSITER_BASE + (125 * 4)) // Watchpoint Control +#define DBGWCR14 (DEBUG_REGSITER_BASE + (126 * 4)) // Watchpoint Control +#define DBGWCR15 (DEBUG_REGSITER_BASE + (127 * 4)) // Watchpoint Control +#define DBGBXVR0 (DEBUG_REGSITER_BASE + (144 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR1 (DEBUG_REGSITER_BASE + (145 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR2 (DEBUG_REGSITER_BASE + (146 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR3 (DEBUG_REGSITER_BASE + (147 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR4 (DEBUG_REGSITER_BASE + (148 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR5 (DEBUG_REGSITER_BASE + (149 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR6 (DEBUG_REGSITER_BASE + (150 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR7 (DEBUG_REGSITER_BASE + (151 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR8 (DEBUG_REGSITER_BASE + (152 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR9 (DEBUG_REGSITER_BASE + (153 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR10 (DEBUG_REGSITER_BASE + (154 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR11 (DEBUG_REGSITER_BASE + (155 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR12 (DEBUG_REGSITER_BASE + (156 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR13 (DEBUG_REGSITER_BASE + (157 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR14 (DEBUG_REGSITER_BASE + (158 * 4)) // Breakpoint Extended Valueb +#define DBGBXVR15 (DEBUG_REGSITER_BASE + (159 * 4)) // Breakpoint Extended Valueb +#define DBGOSLAR (DEBUG_REGSITER_BASE + (192 * 4)) // OS Lock Access +#define DBGOSLSR (DEBUG_REGSITER_BASE + (193 * 4)) // OS Lock Status +#define DBGPRCR (DEBUG_REGSITER_BASE + (196 * 4)) // Powerdown and Reset Control +#define DBGPRSR (DEBUG_REGSITER_BASE + (197 * 4)) // Powerdown and Reset Status +#define DBGITCTRL (DEBUG_REGSITER_BASE + (960 * 4)) // Integration Mode Control +#define DBGCLAIMSET (DEBUG_REGSITER_BASE + (1000 * 4)) // Claim Tag Set +#define DBGCLAIMCLR (DEBUG_REGSITER_BASE + (1001 * 4)) // Claim Tag Clear +#define DBGLAR (DEBUG_REGSITER_BASE + (1004 * 4)) // Lock Access +#define DBGLSR (DEBUG_REGSITER_BASE + (1005 * 4)) // Lock Status +#define DBGAUTHSTATUS (DEBUG_REGSITER_BASE + (1006 * 4)) // Authentication Status +#define DBGDEVID2 (DEBUG_REGSITER_BASE + (1008 * 4)) // Debug Device ID 2 +#define DBGDEVID1 (DEBUG_REGSITER_BASE + (1009 * 4)) // Debug Device ID 1 +#define DBGDEVID (DEBUG_REGSITER_BASE + (1010 * 4)) // Debug Device ID +#define DBGDEVTYPE (DEBUG_REGSITER_BASE + (1011 * 4)) // Device Type +#define DBGPID0 (DEBUG_REGSITER_BASE + (1012 * 4)) // Debug Peripheral ID +#define DBGPID1 (DEBUG_REGSITER_BASE + (1013 * 4)) // Debug Peripheral ID +#define DBGPID2 (DEBUG_REGSITER_BASE + (1014 * 4)) // Debug Peripheral ID +#define DBGPID3 (DEBUG_REGSITER_BASE + (1015 * 4)) // Debug Peripheral ID +#define DBGPID4 (DEBUG_REGSITER_BASE + (1016 * 4)) // Debug Peripheral ID +#define DBGCID0 (DEBUG_REGSITER_BASE + (1020 * 4)) // Debug Component ID +#define DBGCID1 (DEBUG_REGSITER_BASE + (1021 * 4)) // Debug Component ID +#define DBGCID2 (DEBUG_REGSITER_BASE + (1022 * 4)) // Debug Component ID +#define DBGCID3 (DEBUG_REGSITER_BASE + (1023 * 4)) // Debug Component ID + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/SWD_host/debug_cm.h b/src/SWD_host/debug_cm.h new file mode 100644 index 0000000..631b8f5 --- /dev/null +++ b/src/SWD_host/debug_cm.h @@ -0,0 +1,143 @@ +/** + * @file debug_cm.h + * @brief Access to ARM DAP (Cortex-M) using CMSIS-DAP protocol + */ +#ifndef DEBUG_CM_H +#define DEBUG_CM_H + +#include "DAP.h" + + +// Abort Register definitions +#define DAPABORT 0x00000001 // DAP Abort +#define STKCMPCLR 0x00000002 // Clear STICKYCMP Flag (SW Only) +#define STKERRCLR 0x00000004 // Clear STICKYERR Flag (SW Only) +#define WDERRCLR 0x00000008 // Clear WDATAERR Flag (SW Only) +#define ORUNERRCLR 0x00000010 // Clear STICKYORUN Flag (SW Only) + +// Debug Control and Status definitions +#define ORUNDETECT 0x00000001 // Overrun Detect +#define STICKYORUN 0x00000002 // Sticky Overrun +#define TRNMODE 0x0000000C // Transfer Mode Mask +#define TRNNORMAL 0x00000000 // Transfer Mode: Normal +#define TRNVERIFY 0x00000004 // Transfer Mode: Pushed Verify +#define TRNCOMPARE 0x00000008 // Transfer Mode: Pushed Compare +#define STICKYCMP 0x00000010 // Sticky Compare +#define STICKYERR 0x00000020 // Sticky Error +#define READOK 0x00000040 // Read OK (SW Only) +#define WDATAERR 0x00000080 // Write Data Error (SW Only) +#define MASKLANE 0x00000F00 // Mask Lane Mask +#define MASKLANE0 0x00000100 // Mask Lane 0 +#define MASKLANE1 0x00000200 // Mask Lane 1 +#define MASKLANE2 0x00000400 // Mask Lane 2 +#define MASKLANE3 0x00000800 // Mask Lane 3 +#define TRNCNT 0x001FF000 // Transaction Counter Mask +#define CDBGRSTREQ 0x04000000 // Debug Reset Request +#define CDBGRSTACK 0x08000000 // Debug Reset Acknowledge +#define CDBGPWRUPREQ 0x10000000 // Debug Power-up Request +#define CDBGPWRUPACK 0x20000000 // Debug Power-up Acknowledge +#define CSYSPWRUPREQ 0x40000000 // System Power-up Request +#define CSYSPWRUPACK 0x80000000 // System Power-up Acknowledge + +// Debug Select Register definitions +#define CTRLSEL 0x00000001 // CTRLSEL (SW Only) +#define APBANKSEL 0x000000F0 // APBANKSEL Mask +#define APSEL 0xFF000000 // APSEL Mask + +// Access Port Register Addresses +#define AP_CSW 0x00 // Control and Status Word +#define AP_TAR 0x04 // Transfer Address +#define AP_DRW 0x0C // Data Read/Write +#define AP_BD0 0x10 // Banked Data 0 +#define AP_BD1 0x14 // Banked Data 1 +#define AP_BD2 0x18 // Banked Data 2 +#define AP_BD3 0x1C // Banked Data 3 +#define AP_ROM 0xF8 // Debug ROM Address +#define AP_IDR 0xFC // Identification Register + +// AP Control and Status Word definitions +#define CSW_SIZE 0x00000007 // Access Size: Selection Mask +#define CSW_SIZE8 0x00000000 // Access Size: 8-bit +#define CSW_SIZE16 0x00000001 // Access Size: 16-bit +#define CSW_SIZE32 0x00000002 // Access Size: 32-bit +#define CSW_ADDRINC 0x00000030 // Auto Address Increment Mask +#define CSW_NADDRINC 0x00000000 // No Address Increment +#define CSW_SADDRINC 0x00000010 // Single Address Increment +#define CSW_PADDRINC 0x00000020 // Packed Address Increment +#define CSW_DBGSTAT 0x00000040 // Debug Status +#define CSW_TINPROG 0x00000080 // Transfer in progress +#define CSW_HPROT 0x02000000 // User/Privilege Control +#define CSW_MSTRTYPE 0x20000000 // Master Type Mask +#define CSW_MSTRCORE 0x00000000 // Master Type: Core +#define CSW_MSTRDBG 0x20000000 // Master Type: Debug +#define CSW_RESERVED 0x01000000 // Reserved Value + +// Core Debug Register Address Offsets +#define DBG_OFS 0x0DF0 // Debug Register Offset inside NVIC +#define DBG_HCSR_OFS 0x00 // Debug Halting Control & Status Register +#define DBG_CRSR_OFS 0x04 // Debug Core Register Selector Register +#define DBG_CRDR_OFS 0x08 // Debug Core Register Data Register +#define DBG_EMCR_OFS 0x0C // Debug Exception & Monitor Control Register + +// Core Debug Register Addresses +#define DBG_HCSR (DBG_Addr + DBG_HCSR_OFS) +#define DBG_CRSR (DBG_Addr + DBG_CRSR_OFS) +#define DBG_CRDR (DBG_Addr + DBG_CRDR_OFS) +#define DBG_EMCR (DBG_Addr + DBG_EMCR_OFS) + +// Debug Halting Control and Status Register definitions +#define C_DEBUGEN 0x00000001 // Debug Enable +#define C_HALT 0x00000002 // Halt +#define C_STEP 0x00000004 // Step +#define C_MASKINTS 0x00000008 // Mask Interrupts +#define C_SNAPSTALL 0x00000020 // Snap Stall +#define S_REGRDY 0x00010000 // Register R/W Ready Flag +#define S_HALT 0x00020000 // Halt Flag +#define S_SLEEP 0x00040000 // Sleep Flag +#define S_LOCKUP 0x00080000 // Lockup Flag +#define S_RETIRE_ST 0x01000000 // Sticky Retire Flag +#define S_RESET_ST 0x02000000 // Sticky Reset Flag +#define DBGKEY 0xA05F0000 // Debug Key + +// Debug Exception and Monitor Control Register definitions +#define VC_CORERESET 0x00000001 // Reset Vector Catch +#define VC_MMERR 0x00000010 // Debug Trap on MMU Fault +#define VC_NOCPERR 0x00000020 // Debug Trap on No Coprocessor Fault +#define VC_CHKERR 0x00000040 // Debug Trap on Checking Error Fault +#define VC_STATERR 0x00000080 // Debug Trap on State Error Fault +#define VC_BUSERR 0x00000100 // Debug Trap on Bus Error Fault +#define VC_INTERR 0x00000200 // Debug Trap on Interrupt Error Fault +#define VC_HARDERR 0x00000400 // Debug Trap on Hard Fault +#define MON_EN 0x00010000 // Monitor Enable +#define MON_PEND 0x00020000 // Monitor Pend +#define MON_STEP 0x00040000 // Monitor Step +#define MON_REQ 0x00080000 // Monitor Request +#define TRCENA 0x01000000 // Trace Enable (DWT, ITM, ETM, TPIU) + +// NVIC: Interrupt Controller Type Register +#define NVIC_ICT (NVIC_Addr + 0x0004) +#define INTLINESNUM 0x0000001F // Interrupt Line Numbers + +// NVIC: CPUID Base Register +#define NVIC_CPUID (NVIC_Addr + 0x0D00) +#define CPUID_PARTNO 0x0000FFF0 // Part Number Mask +#define CPUID_REVISION 0x0000000F // Revision Mask +#define CPUID_VARIANT 0x00F00000 // Variant Mask + +// NVIC: Application Interrupt/Reset Control Register +#define NVIC_AIRCR (NVIC_Addr + 0x0D0C) +#define VECTRESET 0x00000001 // Reset Cortex-M (except Debug) +#define VECTCLRACTIVE 0x00000002 // Clear Active Vector Bit +#define SYSRESETREQ 0x00000004 // Reset System (except Debug) +#define VECTKEY 0x05FA0000 // Write Key + +// NVIC: Debug Fault Status Register +#define NVIC_DFSR (NVIC_Addr + 0x0D30) +#define HALTED 0x00000001 // Halt Flag +#define BKPT 0x00000002 // BKPT Flag +#define DWTTRAP 0x00000004 // DWT Match +#define VCATCH 0x00000008 // Vector Catch Flag +#define EXTERNAL 0x00000010 // External Debug Request + + +#endif diff --git a/src/SWD_host/flash_blob.h b/src/SWD_host/flash_blob.h new file mode 100644 index 0000000..36e74d6 --- /dev/null +++ b/src/SWD_host/flash_blob.h @@ -0,0 +1,33 @@ +#ifndef FLASH_BLOB_H +#define FLASH_BLOB_H + +#include + + +typedef struct { + uint32_t breakpoint; + uint32_t static_base; + uint32_t stack_pointer; +} program_syscall_t; + +typedef struct { + const uint32_t init; + const uint32_t uninit; + const uint32_t erase_chip; + const uint32_t erase_sector; + const uint32_t program_page; + const program_syscall_t sys_call_s; + const uint32_t program_buffer; + const uint32_t algo_start; + const uint32_t algo_size; + const uint32_t *algo_blob; + const uint32_t program_buffer_size; +} program_target_t; + +typedef struct { + const uint32_t start; + const uint32_t size; +} sector_info_t; + + +#endif