From 3b6ba502bcfedcf0b2ef97b2e56e13a2e785de20 Mon Sep 17 00:00:00 2001 From: Edyta Date: Tue, 15 Apr 2014 15:55:14 +0200 Subject: [PATCH] minmea.h, minmea.c: Added support for GLL sentences --- README.md | 1 + example.c | Bin 2158 -> 82920 bytes minmea.c | 26 ++++++++++++++++++++++++++ minmea.h | 20 ++++++++++++++++++++ tests.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+) mode change 100644 => 100755 example.c diff --git a/README.md b/README.md index 8d788b0..bce0c0c 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ systems. * ``RMC`` (Recommended Minimum: position, velocity, time) * ``GGA`` (Fix Data) * ``GSA`` (DOP and active satellites) +* ``GLL`` (Geographic Position -- Latitude/Longitude) Adding support for more sentences is trivial; see ``minmea.c`` source. diff --git a/example.c b/example.c old mode 100644 new mode 100755 index e973814ca4830d825a57f325c85f250ddeae225c..ca9e933cf1d46518a7655cc3e3244adce7571f92 GIT binary patch literal 82920 zcmeFadwf*Yxdyx^OkjvZ6D4BMC=mh%8bYp+AgSRp5EL*9K~!jnxj-a0lL=xA0-Z!N z4rxP$Q;x+JD{X0OE2jq$FKvTR0+seqq!z^sRn#35TWX_5<(Thz)>?aJ&z_l(`u*|! zzTfW*?5w@kde^hw_g(LL*JZESv(dF+uFYoCj8Bv{L}RS}+jd7bLi^P+FI!8}99oKY zotCT(MLP4cH-QG1C;+l((&HM!JjAm%BOljD#Cb7~XuQOSWpT}URnvH}ycQ?(9dBxy zqb}OPYfF@-IRVOgnUAQJi2Ow4@j8JxFXpojUWKTn5OwpKgE%iE@0NGm<%ouSjPkc4 z-&}tmD0#6wd7n~Ub=Q>Y^2yazwN2~N8tc+BWgb`)`STVP<4*EP%vfA38;^^+VSevl zj=VK>@5yDC{ju(a(`UbW^vvadzc3zoIk-mSO2c&xE`Giu1L$6Uu0n9Nx}S)U<@ia$ zm5l2$Tp76dxdhkcxW?g{jB5feex~4>gzE}iskqW{rQl+_eihfHxW4R%G7qy9ru=L- zCoby4{26YJ;NF3Yy1G)OQ|BYp{V0T4xDs*Erebg<;NnNv55j9jO#Y$1`9TwDV{wha z#dhL{c}yoh%eIfxk{BmGKNGLslK8|;Z+AR+{y)~sl)zsv3#kwF{cR(HknulS;=i!O z|7a=ywk7|4OWZ`RB_ZztOa5+4e3_{L`Oz)$mo4!HmhxjQ`EOYA3oQA+x8%25@}IWk z&$Hw|YKhaXjSu;M(vn|diL-wiAJWexry7MJm1e1;K0$hg}= z|5Hnx{mJ-{{!t@>knubVeWoSeXraH$62I9(|65CZg@yhbmi%p&{3Dk9C6@eYmiXT- z^dk`8bx*W|{rpmRF!tT#%ZzxO_A&CeZGpeXhw^JBC97)cYD*g3r48uJh?SPDDJfgMrlhj8s#>deuWqO)Eib8Qa#yS?sje$qqaj|68?E%Nx&}9K zD&18z6j14-O%qlx<-PoZLBqwtdXp)sj9B7U!{?s zRW({;g}Z)LRXK>O8f!~yE45V>?uy#Ah?lwVtFI`zi#&nraxkcsR+l!^AS(!#0@T*A z93kr}%S-Rmpx4qeA;`U@RqlF$zt$`TM60P=TS0YDLSSaKS~=g z8Dfx4V2FV>ks&Kh=F4_ zLriY=FvMi$35J;D>}5Dv)AljM1nU4pOoX0in67CZ3^8#k_P(>&(_`1!R(Ebbbn2X@ z`5x};@9%Fp>5kSp((AuRv*?>J2rs+y*rEQMKD1>2_zU>UGX3KjH6os4rD)3sN`;}}n3e3yvFGoHeDyND++4vw|1O(LGicrN4hBA&!} z0plx0Jel!A#*0Keh4CWB3q(AX@nwvsi+DQYD;ZA`@odH^P*_!7qVFy1cW%NXCw z_$Cow&iDbw>qUGe;~k8z6!CJ#k1}2);;R`y!FYj)S2KQ^@pKWdXZ$SVNh0oMTxUE^ z#Md!?o^egY*E8P7`1${({F@l(yt3=8h&MCtVElxLw=y2bc!!8@VLXBHy&~SucoO5g zM0^|LDU7#^_zuR?8Q&!0I~mVqyk5k2F12n(;UhKfriB$+k^1Ac=WW*-EsJP@bf57 zw=M5<<27yjS&65^_BcuU<6D?5$n#D&=trUnVDlWd-?`#Yn|p%R_Pkh50pHV;@K^$9 zTRPmA(S|hK4DYljGp+x`u|w^G#_n@DT3r`5ZMZPy{#g9Y+c-S-x2_8wJ-vGhq6H#x zu8}yc`${CP6p58a;%(j02iRSX9TJEsM_iw1K=s;_^`AjMV;eUfpa)%6Jpx^3;U2q@E3;Ysdf{R^~!FHR=J?(eX5 zwArI#pVnfZ?ijBXP}rtl8`MoT1X85G71fft3$Sso>%3>f`Ti!wU<=d~LU&5g^>{Y) z^fwI?ymqhjxy~OvYrn+R<8|p|_j;G^R(W$I0NBmxoRe%%!E6yJtk4H-pb@TN@}xkr zTPCaG(FdRhP3bZLC0kv+`lS?Bi``$`8@vCc?WFBQkfiRBn>O^Ox<}yeByhp9G%1G1K0X4leu8 z9&vpH%G02X{cQ&Yq4$M+m&n9c*GJuUN%LA;k=JU|8>Togyni0AnOT zzCY2^x5#}B{%nl#^ts&eU7w;L497jv(|4QuD_!qP93hzlfGFM%v+!5vD?a6o>)I@+ z=>JgZanf|U=pD7LllUX+n(@`91kZ*OTGM5o4afVNoSm){MD2PaKruOlf>2!#fkJQn zOj?~#hQ;a}qKnNDxWm8z=rv#Qaqo$PXQON=?2W+x$ZT z1A)Jy7*m=dr8~ywIv)F^>jd}-(&=$8`j<(^N1@}Z$;F&x2j*cgrw%Vn8EnufMtsWd zblB(W2pGyV#nd>I3W7QesFRp%m=e9N=etJ=kx=XNt#KaL^R^Hv-$h4g?r1s;S39b-?D?aKL{5sUR-)fd`bN zkgz9BO1O^_zKF?^&$Z9f5zV?sTG`**>3V{e(&^eGgWWRN1r)7&ioSrwA=@s+R5uPnqf5g=d0lLBou=rytZAUnzz1!+~?}$rB$#=t*94$(23#YWVTV3alxZXj@x5Jfu z^CQ;DZafsFX~1c*+b}eprg=6$2;n-PU>5l1i zZ6OCmMCxV3fTfSY5{jS_ zBK`vU#k@m}z^h5{SrEZP1_4*h-SbHBMG!%iK>**Pbx$Bc)JSs`g$4n8ym^qnZRz68 zJv)&|`PXp{;^`<5o&Y!5Ui3qzq z;}oQ=Fy2=TK~JM83cc%-0sjPU3(&n0%z#fskPDBCARDe3K|00(1gUMV*APJGhY=)u z-N{L9uCusJ^e#_M@GeM>Z*#qeXqCPP%oN5suxXwF;X_cQE`JNz_^PP zGy(bZbf5`N;ihe!Xo7mt1k1>DTVWg;LTbNAYJY*$excMpT87$(Ak;ouhH6L497T|g zVID!c4Wfg2)8}tC#AW*+-5U5`^2-GhdB++P)1fxMjBh-`cwq;KK zEktX;;n?xl>)M9F9jaR9bL~d3#OKPyD@8V!znzTkgMI^Uwt)iO=Pd-HoyG;)>GOYC+DUj7>2}^y?eyV!b34fu z$mYXTxv332JZlj$SSHj_Xcty$HZ#~)vNSbeW@KNQS~xSC8eo5h zmHoniQ#8yhD~SE;z$HgH!^+5=k7JbI$Q;7RJcpMX(s_E&EKXm6!_(K#*>Ic>iw`dL zI2Y+|Qh6QaV(|nzyGOTS3B`0xSOy9Rt;8Wu7!Ph>4@WyOb-y0)w~H`@+G`#(c6N4&nP_u-N!>pZDO9g-}Bv$92K`2TUnQcA+~KjHohB zly}Ghn3X$Ti7s3m?dW!#apAx7jZcLy#P)(<&B(n8$ZMz~owCTvb+79JlaH4B(?0bU z_nmQFIOFO=1{Ox3e9LZ3QF_j}dfxc-jf0|Y>{Vu?t;OSdw)qdPh<0H6;wK37wmF;_ z^=jDr=yv&By}ktg5i{U*|LE_BDo_GjyOE{CXLu5$t5daGZlbf zNeK{a9}2a(J~8@n7SfQF!>mkLxv6>}!~uZ9I15My#91ap3b!8#oJ__3_5=eCi8K?C zV!K)tO_+%gJ|v!S>m`hHkAed)LAqK6xKQSfk-6=`S|^&S!Ffudxh!a-EzI2(%G_-x z=Hf;R8J#m^=$LDP`vW8iWo`wi^}fGH)ZA)?R%k(64>XhJFkcPP97^~#w_7oHO2N&y zz)c36n$e1;Uueol`+iI=pAiD|8cjd^O40O}Ake2lfMDY@D>#mnX#HDEpltmE1=NTY z@J0f@3r`fmmKG?q#TK-?!=kkiZAWCZEedUk1uYS1aDV7^Ef-Pkaf#rxUnQmF85Bq> z+ySLLc|$lUCxKemBJ-81(3V=znt>+y^7Pq4+uR0nqqnS<5YAl+ipFYYEH5l$N66T! zo`~u{uF#fQ(7NF*495CH8RI}@Fy>5@J!Osz9k*Mcb^$8XF4llr|5JBF#_AQ?9Tv1( zzdU1iTA+r7W$foC?HYHCPn47W|Q0DGiYRX6V{X04Q3^Z-7 z^XR^qi1|C6?P}4Bhak}Jd4Hf@>>wq2afJz+_Wj|E0dVIMcl3a`3lwgp1^1DGaJLZm zVAnwWZd16cEV#1VO9_bJe73+OwTWcZ5DV@h!`x7jNZoXKOP*fkcU?*l2K zxr#C3h4&(|SExX1EueG1G<$Uxqziciu-Ag>^>LBe+oIUJ#{&9OfJz^l|4+0|s263b z;YCkK5T_$aDzL!085u3&T<9DV^C%XGh!fdy(pw-zZJA0^4GZWWF|AiE`{H-&uLLWwr9J;c$- zK95}5ljk$*mbW5mW|UBN<`;rh0NnW zW;J~i$f11N#)HqF{VgJ&PUKVa?^w_#OEf&@2)B~raMKoGtx$qE*DJ7g3)tB#n1idg zA}gBO#?hshUiTk95UZX0^HgX{@lGBECKOX=eZB>_B7uamC4h znt-Y6rQjqKFm?g}n+F6;1_|}_hy^e@EZ`~vW&tq5Y+=1Z+i5|28i()LrX9#9o8Z_1 zRfV$-K~nrr!#a*iM5p~a$>*aMhQ_vFZT@wCx+?oaOWA8t);yVh+?0>z z_&SQ|zXT1QHX1E;525VIZf1QI_8mbF&8o(qnh+`UlQ{h5EAH{RdOUq&{0t|8iVP== zLFgA;LO8V)Dfk`>RJnkX1EDh%%4vd1kr2*u1@$uv)Mx?4C9tQjEEKBD1hqv$9ad03 zw?O?VJ)F9_L9JgvgGW%8Hc`s>gavIA&mpEl6x2Bd z^(zb1`#8}!*ah$;A((TH3>{BepneD_vjzUQDIaFG2F3KR3YF@H1>R36d-7&x{p_`f zDs5LaK5asz1x^;sV`o(N^j#6!)>nYsu)tFi!Ws8f**XU-P;aFLTIc#uD9m8}P`MJq zxlTbnV}bgffRe2iqJY%qvMT-o zQ0wVuA}W4|Li>#cZQo>SODg{IP!TUTiFj5qmN;1|{#_7f^%pNF54F zOP5^X96`_&X_TS0YNphf^n%_CKRcf4pKf#-P~CH4OR8Jy9#j})9cNAAu*g-Dq%v>J zq%6N?QZ|Y~5Pd*F^(v^hEKq9& z)NVY^_4JJk?egP5Zg7>DCAnHIL&w_|sILmBJ$NMS=^GgeHPQsts-TW4sB;#mvnfVz z$iM&g`C-fDKvqf+=N<+2t_5ta06T|guNU1tKdqpW zawK2xS)e|@jzXTrQ``K$nU{tUlBtG}MH0lhO@ZkauwMzV*Kpor5JGk+FvnEMS(gQ@ zRDj{(@9B#QnJXcj%?j#$3)Cn9bqbI6FAB9!L7i7n-4>`9Cs1D}a9F_8=Loeg2gnU= zB}|j1S|me9j|FOzfI5!j2cEv+p-{t3Q0o-bZUyy$1u92C9mRnLPhU(ZRE!DgsDiTR zO11yp0`)!ySYPpB9FfRhgkd`rjH!l*sS?DwT7mt;0`{l?>%g&#i}Ka3piU{M^A@OE z0cCnpIAdWbXA4bYYI#!mb7biFrv+|^;Ou#v3(5bBEu5H4HNi)HWP+oRgf==4wWOp|BMJhQcifa2l!|0Zyv$fDMMi9SGvuT9(M7&bF3H zc_#+Mx4{}tLUJg3;6%g$u~%ut39&JZ`JZFPU^HQT$qWc6aRIdKkKxBeLA71ft~PX* zqa26D9Wr$Ao2zF0pO1wtY$xYF!T&|w#9;+^K>>cn0(iRsTqXed*VA`dsOevZmNcw2 zIbU*EE<;DG1<)Y?mkU7t_4Hk2n%%AdPbk1R3*gh&()_pKcvQG)1vvAwc0nP{_?oo- zOD#w>0;%2SYQGrLYKh?7tB@|UAdM49tvJwpF{HB!DftG;(?|=_D@l~D8E17bhEyaG zoI4c~zZ7mZjqea?JNtuA^oon&9anhq1(LJNEqFHo55D4Y=_?+eu_V+kmY9@3N5VMU z72GHb+<9!!__nhr`$T`f7<(NGFK(t}?+OdvF5rQ^A4&FpbTL;pN5VLFD7XX*+%1AV z`XHb1L>FW4xWaSJlI)GP;MpX5k4g3(o3SWVdy7ok%at(B^$PAv3*4`-;i7K$;I>|$ zP+(^j7+)`7wv-Bh1#P`9JF2!`#nIT~;0xrAF{Wbh-_f(-zh6bsPS?3a+_$aR$yJW_ ztndzRdjI^dU$hC&^qjUh+HpXn{?+@2_u#*NjHx93>Ep*D`qPyFWSxA|fSJ{2uO_QJ z%xZ6wPWk1N5kcA&NR|bp2_OV71h;;-Z{W@NeUNVs*#JGRK>5xXGiONvwVbZR+3gNg z!K!ji)X?4VIndn?$cC#o3HNO)o(R$1qvbF@Yief;Q~Bv^SuJmHM>FN8Qw){7J0kj& zty2t;8=i^QI)x7?Cp)f9aj$pb`z*~ewnLP3?UcbT1~3M;&k&eFgk46XeOxBFSma9V zzp}JwpC_0y_0JJOjP{vp0r|^SQfab%D6k1{=b^#158v5gZl6s6-F%qsai{6nw_)2i znW)h|bJ#v#kPX+l<)VFd$d(W*I%V4nz}R!UZiQ`&)L`50JQ7iCLwBX7I;p8Qt~A;9 z4yKeu*4-{}MZ>zw0`i{#Vfq3H+SWoArS1gY$`=NwyD|&t9DrJEn_oP-aB#|7X94BQ1vVe1u8f1p@T#7k^{i;Ui58kG0blxq zWWsfB9q!v!bV$vK)tS&7Cd+q@$&KoC?TW)Pv(vTv=+TZod^b(To`_?Uxb`|lun!If zu>;F$hv6yN^D~dQelt_K-ju@^)i7Tg1RniU*&7l}8Wvv|eKxX&pHLcp$O7^iHpP8S zulZJ-_ANYxmFura&sUfTnFwpIk?I3FX{_h6Y4qGf$ zZ$#Ce!|RPkkl&wW740TMG{Q%0geVBx={oJ03qx_eMilddb-9% zQ8hjCOmWSNoa9Ei8}Nr;e6_g~yKX=gp1vWm%|C%So<4hQ^Sij|NtVo)qwx7NEn}1Q0Od`;u|$7T<(4eRa}Q%|}$q!;vQ!)vB7OE!C_*HS()s zm<$MzCxdMbgBvJ{KZKDcv=x73EP?h&JZF!>Y3sQ@f+bRjHo6AHl%d<8Ya*kE7?dSvX>2oXDtzes$I&H>h0@RkkSpF&T;Qd-TB z#6Ipn(Q>BgYsicy8`Y7E7ff7GgNr~ZkEP|`KJtrOLno|EHFV&XAkOC%*dYs;O@MJ* zJ)ew*f-%(q>rr6o^Cf48EnxdF;6fYl&;4N~?w9N9?Hv(}f4Rc#wBRn6xNi(2{HciW zy9NpWq6PkcF$WgS4)>o-jsK5{0PX&Lu%)+>2jmT5tHLdaMz$woV_nlbP_g$=q}(4# zw!$B2$2Y%FE^e=s+-bj2YWAdw1Gf1cV3GJp7PWIP51gF@8~QAN?cs8hk?ZOEW@y8H z6AUqcyTCkg?pX0ASTfqUFn)(of7<8$ z{rVw{D`Djqxjz=8PNV~YO8rR-gxt<%89Gi|s$U+y`pK+*PNeEZ?gUYNbEx{8(Tfb} zJ5=?_3#IyBu~h$hY*^`2S^e+-5J7s8`%~n4`YuxaN?EP*u&Vx5OZ8t@)r+YV8ifY} zVf%V}{WbbrfA!&VQ;?hgUo$Tm5-LAa4f(Z2O8qi)yl!FOb+~uW;bi0ML@Bg{znN&j z%n20LDqu3r#u~A z`{k;>9upq5-;Ig7N&9@umcEu)(aQ!Y$&6d1Bp+Ciw<=_%{avevYI@?ogO_?vH7h&Vn4Er z*gb5@c3=;tD8CiPqT7GuFIqgvqWne*i!S+zzvz{NEXq@=EL!s`f6+Jb^l&f?^PnY* z{_9D9(cObA%2R(V`q+Q@i&hP?D35Eg=(v6UqG^LH%0m?_`qTk`(SLD9H;8uSGbtAR z$?yC{51=TU7^%u;rjieP^8eCiXg~OJ>|n6DUrOxS-xFJ>%`6`zTih;W(O(?#7rl0n zMY)s3qBkD(7kzi=;FQ6A92R}>n7`;R23eFF87zAE5B{R{C`z%Bs`U7Gg4vT}unDA( zg&lic=TPRNeUIyNV$VNLY_X9XFR;a$M`3?gVqZb*BWN$L>+E2#x$+|RpZ-MbvuvXS z(Sy?#C+{r!`xE}68wOdFgF1_Lo$?o*HOQhIkyv!q%l@K#=_Ywcs!~RaNa>XW+qv_e zo+SNyc;gi)5`4HQ<#$1XI49|Lt~HS!&-A;og=E}gtDiK9M*Mydde-Ah$9U-*<_7ZJ zb3T`2g%2-InB^EU%YF#2fH8mYEoqToVE1W<+Sc;jm56s1$eB!mlPj)H`fshXK&-Vp z3($6qNiSc3T^UVVaj3m*-vr+I@e+}Q*W~%*PD|Vo97pB*gUZ{3^9$lt{IT|XFfo4z zFX1!j@dbIXjIEt}V;*PbG0Fk0IliL?vy~VGVb!Y<=oipQ1wqjJ`;eQ2+V!u|cmJER z15I$!_B+Kt_yHcZ+e=;C)#?M~h!(_on++^!bp|LzPMWh`q-|-wKCsHX4Cn z)kiBA{tA2kcRIX@$=*)y7kUmD>rQ}NNYD$}GlzPP*cn;F2*Q7%0=)C?P0!&(Z=cvv z3*cvbjODGUVX-m;Rm)qy4Ai3k83^5DRXY;$ED}7qHuq4k{b|n;8bokM+@GE#?`EEp4dOEcmkCTgG-@&7NS|WP~-wTZwPk7^#;ZyWS%&D%kc;^E$^k!>nJX33}sc}qQW=&0C z>MW$96U&P9ZAMI>KVZZJ>N+DP(C#*30%f_3Q3b`nK!=A|KZ8j!%s_}uq2_DR<$QC6 z$~eAyvy=5nAXS?ACaBacUy{!PNAcc7C>D@kFtdbKqYuGtcSbvJ6L9N2!WU(L*mZ&ROdVN%N(Uz5YT;ern@(!go7V!RRN zocq?6kKKz}`rS98Khe+NjfdWar}Z6lo_P7;!qa>=R`EG+g16A&UFY-`;fA;5Zr zf%LAkg?IJNhVtXQr|SZ_?_*gXX6&S$O7lN8rZ9dF` zSR7ZP-(veU5d@3c9_@V-_Jq?i01&SP(Lh9hjGip|E911Y-k(alI{u#*UXce?vm`klP@k1z1AaICN&cvfFi913uF)IVfjffI$mO-|`zyRHFpi2b4Y zU?9$xGwX6t_5qFxlfVghA44vo7|A6<_L3inymdojpF9l}z=wMd$MYSqetxX>@G00~ zTi|7ogh)pvJ6Xx^eWh}LMqA;6?u=WD>K-7Sd<9Q)-XR?=e><~J)1^2+o7k5 z(5WYjFkVj-VVoW>!UVq^{gwvU{U7bpF1mQG$QUm?Jt-|G(L*tGoj~XG{z-I8hxb>hW$kiu8&Jl4f0gUX&oe^&X(mifsP z5FcUx^gsH3l-+!2suy~Lkn}tb-+x~KnGfS#vi{zW>2hhmVk3sO3@?Yk+2(l;U#-NQ zLsI^7H}|}0?M@`Dmxs2=7-9ATX44ItJJve`J{j$~Y5lPN>F$&^Pv(0Dh`$cduLPK3 z(dR&}$09*K#Tw7706XC0P!J!?@BV4%{0{9YdWsXhM(+S$n-3MVf;)IA8Z;`s1SMhq zmzd`!4|ftAkN(;o{tNHi$xil;8z>hC+Ft#?IPBnUKK==fU;inrX{o5``Y4Vx z4bTQEiZPWj)$>nNJyQeq%(vF#OH4jw%wdZU2u;7k_h8-V@O;|uc4Ty1f1?xcX)^pf zg!HU)^t*>C=ZkbqyaMA9^6}Q7p&2LuKUU=MeAe&&@cJU>#t(c2aVvcGb_+fIkCX^f z@*w2qL+2k5eISl9-i;LC**$adDrCQIO!H$k-`n8Svqa(lMq%g&y(6wE==2P=;rX9;uG2f$;dOq?j1`ZW>=5r#JGzBk zRa=i|Y~HzX-5tUDH~gobEb7|bB6OMS8^zjQ*pQFX2j7Y!j;F&8ixeii`f;#67cc2^ zdgeN9;G=Uc{6B0h4la%ZrQ!C&@S&rZ`$mzIpGtqg@kIX#xZ8Ya0%}L=q6=~a)+Zye zlem~bVPQa9Ll%9fei^go$_3I~2U>%&dC!}4;P*EPkL|YHY;$n?P zbv(9LQd~ib=L7{)Bn8Gn_PyUDMhBoR5$hQz0-by9A?q2(vF-=W_K;%KKiof^QS~+b zoxnGR0<(jk;5(RISfmEG7wpS-xnTFCJJ&!?B+gU8I5Wtg4AmpukM56?UXAX8$)L6u2`sd&J_z~-|RR660hcT=p~re(N4Ob zfu9-D-AuKjj4&!$rn`k|tP57-7^-m&2HmcqEF7|ahkvIZM}x&eaA7}>Vno6_@6cC- zy-;CLPd(-U{ssv6KYw|SZ?5zDF&H+v1BH_;CQlM5CV%EHuYX6Cygs;o;h|BI zuh@pU2Yujg7IW!4GIoDV?EYCp4*o4+_|e$?H`)&VEl%7-d0w!4N1~q}{F`I=QEwEd zUcvSv=W}Q-;TZZ+H&u`Ndd01nLUiF4lS46e>v|0l6aOraPR*9q^Py%8CElpELi-VX zk-fl%D+<>TP9uDmd0#r%ozRNq=!t`RTY z90YBOgH_In-4B6h4>|Z&!f-sqS!_G_R-CwrI{21jIKEjD)wUS#cXxP)-a7&HieVVB z_+GzRJ@5Q{_**O(#&LShw8*_?9zxt)z7D z{(T>@=ED9K8?LiJuE*3ynB4o?=<510cou#eFT}^UoqRDZ$J}Fmx1tvw=3c=!z@5lB z+&N2*5Zpb0!&!LBYn%9a%bELE*}iBiKG(MJH6hRfEEqAS|Ih!@IrV!xW1F{-+I0?N z#-p$X_e$ZjxSl|4?QbT2ZnXC;(4Muu6Zr1pGaDaed-J8H=n7qrNQR=gU$78m_*JOG z3j+H@i2DldkOFVJJj)VKqeRy&P=Rbm>Nh92uE(g~Cwf6fU#s*>oT7x5ld;WD3JG2# z)*50(g9v_a;aM!*z0PDWUd6xgxPD$T=9wPlo<;586|uL_(DiA|Sa?)w(R-tl^9(@k zgltS(c-%Y7fzxSXq1{dVIl%Yb8mC&I?>~cz$E)HiOvU4j;!hatp(RNz=WJ&Lx zl|ZiT$?S>xdcoQ$pUped-ZdK4lHUhWAx@}3Xszpq@WX-e3;rcpE~jw{NSwo^qeVUS zn1{d^Phb$ls8vZ+&>RkK9Mg=(}48?lDhoWMiL+)=tdHQ9v2l&pY(D}=1V|@z^yo{xv`yRGn1yt>Q z!F%xF`w8C8*5U(rV`^92!S@}l3y-!IpKf(MO?DO@Xoa?rawA?*y6|-CjX3hQ@afhY zhxkT9XPBUjy#F$xATk6{4WPE`gVZAY#u3-kT1J0H#}U_Q90Waz>wwn%1MH_A;64z> zi{CPY=_GNZY_T2tQX`1h@jaMUz0-T1&Ho)tZ8%!N82Iva(`XfiA}}_-a8(~pMc@Y? zdcA)>*p<-gU=Y_@Xk+MTEsSa{8sa&eB&Rc|pN@*-)pNXI{n$+zWmG?t)h}~+PqX^C zh}GMCqm0^p=nI4wyH{fU&4CogU6jD}7TSwLBcyb|E8f!9)En?Os9&s7IqB;A55VB1 z!SDGN_Im%|d23_aEZd2`=8pTJnI`B&`6_`5BQ*1PbW{sy|EZy`nrZ>M{_Z(gFeB;I>(g7@Y))SBPP-+A`4YYc|iSruwk+sL#BKDApfkJRlpRe*}D$og^c*}X@$ zvhY_aetEHXc>%VxAG(7#6bJOQr2%$B&<;@r>nXQsvp2+k*j~PZ1Q>;XwS^k5V=JY9 zSI(pGLnPBLpMsR8@v-}hY|}4K=l$r|{RL6eqceCv;sDLbuuieMozjGTwL!~bP;c>ns$IEaMrU$rb_m%=onvxQmbKe2PTXFtT@EKOetPATpj&4Nmr%dqLuRlnLE6hJR6dp8*$15;sU-6TTs6-b^;{5NvFqd1G6;uxexz zw`?PGko4+ypoy4jXs17c{Cx2piFhjziTo;>0ha%5I*HG*Y4ASmhIB9djWB{sJQ-`* zO>`u`$W~hmrHBOR;t^3kw&iE!!=HK>soqY!h5mXxBx^a0!t2*})j-JwT?KY=xs<-6{+_udWBf59{0a87+4}W8S*z(^DzWos}^V$d^ z98YXB#qhQXlR%@rOyd_Z426*C+mOlELIj^c+w>d4Xx_Q;Qf=O)3D~TQZGPDg8{7ON zYO#e?P#fHp@oi_!d$e;Xhj_j8Q$*$_cFjd%yVBHY{qxUQ0F}0+A>Fr~rT{DLzd}mu zo135?_yie4DQO#X^^`u49O?Q3tG#v)HWjq1rA%+h(O%;6jjsmF%ERJ9K#Q- zh%=vEQD{olKer1zMYp&M2G!*vru1_y$9zIz;sC7BH2_+ikc;wd2I2MFi5=UVKv@?h zBD>iM#dQwFAFZnd6qr8=*`=n@%gd>V1Re5-@m1;kq*v$-Kb?kbuI)rq=;yY8PTWdO z!Z_k;VfzT35TGCHFOG0xeB}5^<6#Bt9(_NU{A-%G_ ztI&@hce_azLk__j4Tg0L#iN)Kb&%3Rg(4 z;Qkssf;)@7I+={3jtj4W;;CI=mtFDec&5}f9~P51B_4&-+C!n zqgtRp4UWlf3~?JC!bbaH4ya=Lff^$TvKi=$kgb2}Gh}#NOwmv453>_JC3;sjd)IG- z=bo3K-_a|o6lH&nVnN%BTwieVQ{==7W(dyQa79?;3_Y(@=!E%;LsQ1|+rK_V`4zr` zpz}-kbsaNaTo}B#i{QnX&;NK|^7PE`t&8V8X5m?mz;j?1-SaEkdA|(zSa6Ho*CH>} zfE^lsHxJzjPht@8K_rbv%v7-kkrz{cO%=hU-Ar{p*jD?;C#&O_-oJHzwj-lRfq$7 zcS26Ov1_FchI_;&4d)e$u|w5Ml^EYOrb;kiJE4|(s^t#OOI*F($A$kX4#KAu2jL%l zQ0UlWUu;sj!rx8&&&~$nQ?zxP^3P+$=Xy&VtH8c+f_Nex@4mtF#jv%R=glqi0lGZb&}UdSv`r?-G7L{ZHO zS_lg9@f)(q7rEDe3Q4=_=uE}xn53d*;aKQ>nqdZA_cD9m1e6rht`8KHuyD}WQH$KG zl>WHRl7FsQI;_)B6In3I9hd1&^1^x_u#|fO`CXq&vtT(v`j< z*)0B8aB=>G;F)L=AN+L8nP>-YPUoD1?hbx-*~CA1i}$^8@JuwdbjF3-H@aR&*VpqD ztIr2x>DQ8#da%NZUbJM|k?9-8oR@=h;5?lAyB-wHp%ila!SDaXdS4v5DaK(foG8NS z8Z7^ZtsU3tiaQNq@yN5&<)mHU*bNS4WP^EZ#&xy7f%Zsl*-bk@8?oX`Osdu0s8OBO zLFXX|Uo4}s=y*(Yh5hqH4?*MD*r4&keE^pg~T#n!aU~Nt9 z824Zt*gwDzaH0L;rpxwomV=({DbzYg9#Sqt8i#@p*sQ0YK?`c$5A~}!iwK+#u{d-z2aXiP7_SA2IL9zkU+? zy+g6zJ(zJa_eFQ!Gn|+G?t;kqwav&w&KQy7J@PyI?a_{34`I&1*zb1a9&|@@s)tV4 z>pj8!FS+>@sy{K2SO7O+Skt+T4tNaT5V0nH9I6oCyZ@HBvAIV`JGf#a>;Qh*^=e~N zSy`v+jf%!bjF!R?Pobu9=&1OFz87TAIKdg-R3NrJM{$__`DPTp&E`Gm?fdF%#}Rn$ zHrJ~l_u`2XT8x(Z6_i0JojR=allx(p3r{g?LU0zAB~JY`v+c1w{Y%W|Ji_IkB$%s>bSY*=>9PMGU-6EUgxnp0L>|&8E4pvl#$)1XA7WD+@>DM5= zg`&A}Bqv$_2T@$-j5C|lji-LbIO%$|qM@O#5(;n7y0&~__%F0WWocD4lA9VTw5~>E z=%=82VQ=sU@R$B0m>3M~?n<=oz4LhvVi9&5*3O6ZvRmulmR>@LV_Q5D#xqntZqES!j2FuLQhd0GKuNP-verNOgtbJC!WRe7p9*FC^a4= zhrqy`>zw}M^)wl=5%~>>)$I}T-+2L`N94=}{2Tg{({}hHFd)4P7IRa;h~w?!{%i?*J{0Tq!gW_i$D8@-D54m`9hrkQ*B(twDk<&t!=LvtD zbivvK2x+8dqaK3A%Kd3PPoS1o^gbt`!~+E%jtTw)zEJecuj=Kh#%6$W0J5{k2R_;MAaN{{5}$Lcs{i~n+O8;uRNbdJ$nuB zc4wRf6S3Q0@Vsx^{8kc@y0>z@YCWHb_Sc7_T{a)`ew|j3sDJ-Hbdu-dVJ&SQ{+-x) zus;gNHgG0NJ!s|t3N27>930&C-=xA9+Tupv&%W>h&D9##uW&drA|;OvLK6UKG>oyRzuhW&8bX49gy7;OX( zR%@%a*&Tbo_vNqc+Xr9vK1)3dx7r;(T&(|774m+?!-K=z1G;WpZtd2Ev$c8iW@_^m z<65vlb1x~YEXTjfIhEyz@V=_5va+nQtg1wFmsOcR_|krvr0iUlf`F+rQ#1S}c_XPzeH;Ru4WC>|+aLz`$;iygOwUdOKRFrcQ`7RY({rb$E`rR{(lgR>GN$IH zr@FvW`qb2{G~{GtPD{&6U6`7ko|c0kby5y~??GS*-m|Ew^xV|+ywvoZ)b#As%&C&g z)ayohp&#mZoN-f(%hKGdDFeCoeS%5hP}&X7ZXwtgP(RECx{BwA5*N zpwCU6G;OX4BU51HLXOnT^ejP{mztde3|zUX8R@B0Q7ms7E>dO#Ha7zpQ%x9I%*mJv z05FiAnlX(6K%UHL83Y6ji~&kX&B!H_nGg_YnbRgs6D=@rF@*u=s2);)bQ%gxo0JV{ zRhtc@Wq(tk6(>#25@l#%qK$IcMl%DgloQlSd1$5dv~;izCet%BvZ3~wlcvoQ7{VHt zq@ukf37R)89pc;slFVtc9R}AgF4}P-5CrOo*q^3SL*e>UCNorr>KE3uNb~_^z#=7F zheDnIMwePu-#9%y@+!?;(dceWD-&T!O;v48MQKUd>WZ>8+RVnr ziUxO8U2W2J=Jb?FjTQGaRn(SMOiaqpPjWXjRa}?EiC_ih9fK=VSz6r~C`1m7nj6bX zYfH+sGEMaHwCo({BNUTVDPs+iv8hR8%kXDH*=oU2Mt~i2*|OF7`Pa?7&d8je#DwwX zsYyuWjhQw@L8TyXqESM-t#}Eonp{QVDL@jLD^pp)({15+x@`cSZZq*@Ff@Rk6iH-; zg3Ah?mZyhf3aLU-i5!-*AJW+%L`JRcez5;%hQ7EAeN-+S2N#3WU&Uwe+rj%hEE^31ZSikp7W7D3q^G z&Jc5$NI1+N6i`NH+CY9#W)BMKuIkd&5#?g$piodD9CJh*nLQ|^)PdS6bpQyz5eK)E zXv`oVp;99Ghd}F_eM9879~4U&IcZq~j9W5$P)KGS3xkD^$pN5usV=*byrnOUhz2WnqMGAKou>QoX> z#_S-h8kiBnr%4CQ5AYe*ejrK!I#>l^^c$>$0JJfY&%*-9#D9=43D68m4Q3pr2O?li zmgnygK{nyf4a2udCw{U3_dz@>9k7Wbs|HyidJonOC;}B^tx>}qE%mO_23+45s1KXSC|)D}1k~m?NumX{v65>nXM!OTjU7)Ik(Zy( zNU%<>ZFD!3)zqg53`G|Z#>BMA7J}NuAQ^~ZQ(1%8h>VU^T$;*Qc^n&HFhtvK&CT`V ztqVCJGI$$E=OM%t#En09HC0+B@p8R9NZb(O$hd-q*%pRP@(1ZVl-LR!FciT#{Qq3k_Pg!?V?v z%+c^4@-17o44XL_nR$7^m{vUm=%|8{IruxFywok{p8+id^%dr)m6zU^pP%KY!1}_U zN-vfbc735pB3WHhVdaY+oDv|C z!kDLlCS3_K7*7)f%+Jp;nQL$k>&cN88>SuwAZyAonQaiQKy0iitE(+XT~kf7&fpx@ zH8tG+hM7#(HPtl53azWAs;r^TU!k?W;9OQ3u}(9otk_hq(YhH~)5H`nBjWrhgz`(; zg2^)ql_(n#wh+!Y28fg`n7m^|TgaLga9skxZzZfJYg!opXeN_2WlamXu+a92*fjo( zK&zPel(wyCLYgCZOj0bF?SS+85Yfy8tdv9{{y79pR!-W0m_eTU-|*8U{c`qTc5;G6 zlRbp>qX8l*KmR>k6`of$K7N>ENL#q?Kt0 zsYzkRixA3Cb%u-^Wpy?6)fMabn2^JVdghpe$7b2N>C^BWDpx$n%E-##YEeFH#A7x* zWz5OWNz3N5Mm&}j&lA1LBaF_)>VT32#UQ)zXT`#vBvV&JXDeMKW8 ztIO-^Rp19Ht@iU|+=k?pG}TtQ1wcjBs?}~nh#NnliV8B(QhqIit&{CrdYFekHy+z@*SP)PXP zK(m?sB%L*uxq+T16NnkQzGa?73+mEVynqP=!y4&ACE@1k#1C%v0MjPD8zTtTJJ~te zfjR=|tbuu9Y}z1_a*$}iIt-pOOjAw+!pMs#PcWfsX46zNj7)M6#Ce2;rpN4l95M7! zD4b1L7IQx`2Seb89)C!uw7&x4#&3WgW-}u`5|fVk3WGY(qn4?U@I4SxrV* zTQH6Np_&Wox8`|)MRUPfk@RM!3Zu11bHGeB2b^`=Y@WT!&6*~6Y{bzd%mOE6WU1*L z5A#))HIm-c=9pRYObz$uQbOi;s>uI0v%9;nhf-C$s)R>)Fb^|FWs_PHYf2l|n9^!W zSJhUytIEP8g_JjFOB6g12WDOonj=`x{<$D>BF_bx zIf%I+$;?J?YR|xQF34A#lWBpWzB)i5tuKPF4xa60n1+Mk9N~{-EkX7s*WE$uxeRkv zX4@2q{@Gs0UV=Y|bw%Dw2$}~*+)MCJg2XB%=z+L3i`9j$>w~GJ4oz;>ESI0uKf;Hv z&y;=O~G_ZxJ9Oh4jxZ9>R_ZW4J9f?ZYvn0NRS?lXRM^e9*$`UG0!gQ zOB)(1N*Zd)GUP*6HLsYOHZ2EdrL(5xWTZ{aNnM5PeZV^xMQ_E9fbw}4qqApB!@o$$kwdcQG*3<@rFY7L?UQ^LfQdOQJ?^2TnQC5=X=Nnx*u=+M~rmp*C#T z8;`{rm4nmZAu>l1fUd8f!~yD2t}qFRaS>52*?_0TT+~9Xel8Ko`w5IlVCll_LB6IGgae?LX$Ji zr6SdVZ@|JVL;-xM*I$cS{bhA^4Sd^ydEB+?U(oz}`VTG=qW|FRLFqrZNErPG5e%e% zgHY&GC?`8en?brzZ4fA9ZiT^@%QCvAQD2}nWDS~8k@(`MieNfXYh;Kun-LM~0e{3@ zRV}v6*^FU7Gm*-71lV!molfGz7l`uh=f+3;AcGN6;b??>p#XmQTZEUZ5JAv~IOA}Q zRH^shK3~&OVc*P4MaY+B@J%?ZlX!~&#Bd?5zaZ1NM>On*WiP{(jBD>bm*8Coctyk9 z&-!V&=f{r1*COSIIB|HxFGKRo`tHJY4=$!@TE|9BJ6pgT{J%ldQt(abNwdUiAK&1e zRa%~eopg6oV^URZQe%a?q_VDIO^Hm>X5Un@Wd1_e&BaSf78Wm9GQViSeAlf^o#UE2 z6A4DHHokHC`10vVTGIGNO+c6M?Jo_eprN9)y1K3`sjf0a2eQ~yuepd$j`5|p>Lhnv5@xU^^;JAMt7$jaR^OLYS6h)( zi}fVSpzg*d96?EHXsT_*ZGC-R1NIygr}d>}Ym_ErH5KC2Oj2pXDlASztAa%3(?gS+ zh!dK8Zv!fxt`+>>2Xn>up(zc%$y!mh7JNVeL>il_ z-CA+&>eAYBd|?`%dsS^|^>i|arkH#4tv6}4by`!cz^W+6vL&pF*s#;JC4>~KrY3h1 zmRI=JY`J!;tj~bvnmlEE<3wQ{EM_v1#kV%q)>br7&*7j_i79q;6q|l5EmAF}B1XNM z<|=JKBUY@dawpweP(3a5`>IDPzLZN?4jYO0ggRx~u?3&iTsR+d%cylm3FtMQ%t zB;K_Kco|eD`Qll%FGC;hH$lw`D0hR-SyL_ zOc70#)`&CFWfc&0RYe+}6HcjZ91Fc^qP;8DiWbK4Eu({!(**#gq`I=Hb|9K+vMs3w z#AMxRI_U zyXT_=FLm8I>*mGtm)x#3g2`Gp2e~S^Mh)h87urlqgB{Xt0?t5un@HIca_URntA%}v z8`={;Gb&-3^vg4*;Le{~RW3*o_>+{|6Y0ji%#@}apoA|oY#y+Im>6nQwdL3oXsD`} zJ%gRb6c=>k%g2wOo-~`oKHfyZi8nnT-Up^)!mh+UMyt|FRGH*nUDcRWUx)raF-a@Z z=4vis=jGEWp!|>FXM7`uAAXKvjQhXO|7qa=H1K~K`2V*C@P4&^N??S%=UN~R7uO*1 zKD&eS{+>&t9bD^d*=%=w^hJN&g>Ts%T=%Sd!0zB1Q&T*4@x#zlqBQLi#95we8-BP> z>c!jHkfpT(oUcf}6xS8Fws`Fh-n$WUJ;F5;*F0RG;B|C$_^DsefX!1XGw_i=rOD`tz`aV4%vxTfQ}5!W5K?#A^E zTo2)T1lP}TJ&WrPxL(EeKCaJj#k8S3u1UD2kqhI z#q~a}&v3Wytbn!h(^}j%r-r#`P0i&*ORxmm@yfaTTsiTnljR zz;yyw{N>S(Ww;*2^*pZgxUxqD^l9Z`8SD8>OOU^f=> z2IrjqYu6#MrnHJbzNu-OL8a7Y<2Hq@8|ul&4fRJIktoVO>@Kubl+E!0x^-04uzNv- z#1$fO=s!ea^sNYn*rPF>(xM#E8-N<+7`BWg_ULaRX15QE9>s#&%Yi98OVsyxJJkLV zE3pmz7zoijQDR8SPNWR8Zv{E?hT5ONUk7ia`A%MY(N^A;0yR1#mA46?9J+uq4R_aQ zsY4%F2eO!lnEK$&NR1k&#rzTQLtACc9#h9WuZ%fjc7SH+Lo()!xdw%Y`eZCF=4+^C z=oT4^kD1MKZ8DY+!^($#TgDP&o@U;6WGpGBgR$?Hi`tW8-eK(z|3t)6v?!-N0SQqK z`_%|8*@g-o!{$CorhkKkVe=>onf?Gt!wUH%GHRS%bH0chyW{G!NFBkSGu=3%1-IIW ztHGmfL=GWGEX4f~`fr%}CI5var(?nuNc#$(XgaQw>}fHlQP7bhWA>PtAaG2SF^6`^ zY7~oeq%KEl%r9{7m~0f=##owBjJ?S*MHP$roO$Uo=F~2^6PbmMtT9N9sbf|)*`QQD z)|SJJsBv*IACZ%(vRHh~d{ZnT<_pHA$-KmvELNvtNin-1q9a%4CCA)vilxNRKpc58 zFEu8E^{H5T%mMN;ojQyfmmM>bdDlzIf|#$cJ{6k-ql`LuILW(;#Y^62%De>0yNV^oEGG}MWL{EC7rC7+W63eUAP;k7EG6cB@~2{{F;6h& zl6mPdZ;(>OvSV6^=@Ol3TyD(Uq?{`$XT)$YHDU!ZmymLm7MG#pj30(%T+5RSV^7B$Wh^9EyUWL|Czrx`|UhSXoR%qx)k zQ?WTQACa;~<`u@I(4JImffmc;t5HGR8r)o>U1}emaUY^1PJnDv)QI)a;U@ct!%*HP z$B4&)v?*=`Ur@g(X~a{Eb!a2zGjo$|L=zA;p-eSG+lZ~mjT(`PJo|_-tW&#;KgDRf z%*HC|YuDn!tr&SmmLW$dVXIqUxd%W0cI`7pSZY!xcDE+3C%n~K>JMx~K~8%5{e zS~t41UbEfwU!aKEx@6RkS^FYcuIS2&+H%civ;79hSG`S)7uVvAx>x;y756MbDhG9K z)Y~u<+fvC`?bUqg?!Cw>Md~Pe9otE=G-T_xjiXm*$kz6aqpSRpEgMHS`Xj9y zM>qK+%^R=bi!-n3D>;?RF!PKIhmy+dyPCNnPFKPrli^_GnG!6jYImk76m zrvv1Np2zmP{}lY}**F^F9h9WIH;%6HM|N!-eV;$Fb7LZ26(FiVBx!eG^ZlAaq@5#M zcpZmkdxn}Hvh|6Li7OTDQ<8QsXs_nGfZxSsL%ovz7m|M8M(vt)C@>KjQjlG;*z+4l zQJ=OSNxB1|Ye#$q>GrbuzCpUEt%b7GH)U*&lzzR86=+xU1;)L&?(^eU$h-yG6@0<* z1GprDbO&2&fI8Gpw=vXC|2)R#rpAWagqhLAM(x1+k3rQ9$fUV6-k~-!8MReQ5}jeF zO`4DWT45LXDJf7!ZM|EIr9_;fiQXLzY!0Tjkv1ELUE=;7*K0`QgiV5tRA8C}OYnn@ zvGJ$qY$=j47F_&@-NDzHcd&4=U1aj!&sa(@V_#KRH(nb}g{Io10he6+6r+=cV~EJNV)WjirjO`TFG*@y%PL6%w?#KpddW^x%TpREG+{_K;X1?O) zR$2Xxs)FUR`kM@HP~Qa9G{*KBxw=c%$GR3iYIm$eec$recbAR#{`&3;uCGGXcLxwT z(2TJ?%f@&>A`Jwf5Q34ao@!CkI174UZ!2NJsz?6m232 z&yY|a%EP(|d7MP@IQQh72)C4A@i|q8IO^0&H9l&swa83yw8ge`YPC~ni>+F9ti@W? zda1=?wY@qz|NnaIv(EuLbANZk$y)#Qed}BAwZ6UAE0B1Nq&<*$O|Hc2b5rp5xheQ! zCKwcMW8o;&y|1GIg=T3Vx1|Iu@(C*gFb-#eaa}Y9;&`#EnWg z<8;@rUGD;L8716m*jlHyinh@v|9b`9sN_}`kK8&F!6;ok@=vr{Eqpw>7Psdsa5;rm zS@1fdxkLL5!8sd*Bp^@mAw+#QPlnqGI50ff!LnnG@xo zD1&x6()|$j!Y|@akT0y1}vvAfKk+dqr*svoTF)zqtt*cni{1BEaz(4*->i17F9=8jXqDk zzfGDIr3Ng|*POLcYQPo+8gSA5kk%+K+==w*lziHzM8&;U`!3OOH>ga~naB@>z*x zGv6h>uc3;8^e^CeLU^4peuSE=)MvSR9tujA>&03wbVJ6#AXn$jC7R~xyfLUq=kOYx z!zEFw&vLDfYh{$`vs|aq1W~*c(3O{7g5bO(I<8+u9DjtJTG3 zP<@n&x9rihMNul=7Bz|zI+r4V(iAL(Vl)*7xl7WSePI1vuJ=1+-X&m(DTQm75;P=Y zwQ!OKxn=3T06@i-%(sW+POwmdk6#I5L9C@bWThyr%^(+DEfinq!Z$J&k1GH4yC1)K z@P9P$|7ebXgWUKg#%Z6XrQ@o*cwD2T81rus>dcZ9_T^#M>x94sD33C~3(iK~X|IBM z9;nkmi61~|IJ3#*40Vfgy5EAIcAu-=JMr@5{sq}J=2QgkTqr5~)_cGS`PW-kYoSAZJ-G00A{cJ7AnY4qJ9 z>9c3I>m3C-hPbPwwOHQ+pl$*+&T@2Gjqf;1z#=4OOao(73_O`;xy57qA z3aE!c)v~@whRDz^sJtai(ndg4p_;{*H57M?q^P_985IiRhOM|;tho3d47Z>v9oe~! z49-xOk+#Q5J4KACMeT6zm6SATuj?ft?JX;vPXs<9MqzJPSKH}FAc`okvoU9h_*O8D~mS79|@sL z;~bKlr#0uAIEN&QR>i5WTC_aQPTu*2=4_0=#6te1MvLO?8B&U2aVNhqOf!7V{JpD*BUp1&R)xhn8I#&(+U|YrWj5J;vR6PE&t)hY% zYwe!~f;MiZ@7i4F4P3DyC7s z#lPED@pbY$hX3}#iUp)cWVQj0>nF#VQZi4!@ucfjqLR!i6kfDA2~yY8ODp&S#U`w}Pw#SeBcD zCdscv{M?{Z&}{G%44|03NJ2^qf8r--un6FiB9ldlAb^KK{x--ufUevCE|(nLBSSZs z05%!?I0N{ArM^{43SWE>>%+kMmd|5371fNk7QF;ao7%kwLy{P=;U5|jjfsepQq$$V0~LHQPb zI|J(1OwNH?{s<@^;HRZNWReUDpAyzlMoIM`uI^EOX0ap2t!FB~DSFZOE_&8^z%J9vA?+p1p z7WQ!|$Kh?2jJ0?%eICrjr}qoz&x!&SrD8rg-;)#gT07KPaW|Np_YG{T_ynu{sg9;@ zsBl?HM;Ul&#a)Ck1J^*Qxfi)T(!Cjf&y?>muBSWf_82-}jp@A)0af%d&@&ayNsniQ zDji16Ntd7ApF-c_kj+V#LE38&po;NoIH_VBE#f07yd(pcf{4Hsnu_6m%P>O3Ju*zW zO)+c$gOH{26UDK@Nb$JhQhdtg2U%ybC@j1XPG~d63SX|aLh=|9DL$|8{KCbU?>=P| zcxgG6mPj$J-V{M&L`+7!!a{ONz>(3w+Z>Edg`gH^sYPxMj7|mfc+|&Y`0{jM^fe0Y zG)8G96A;F9^kk*3%t{$u1u5h{t7vhI$*Dbs%&~$%h{IvAN`AWNWPEY(nUs-l%&Z)E zS|RdkH0p49IkJ8%h$dp>tr)3cK`9u<0Vp{H;|nFfBb=^%GdgF`g_bjeh!o^TxY9(V zU~!DXCzyyBIMF1>z)2=122P%Wz?uL5-$fgPpn2$OPYueZfU)*$*^Dq10Rf|UZAB>5 zrC*d=zR}#$FAhYix-lxZluK+Wm)cVP8wDFGu(I58j^~yizS-MC&sGgns7zP6E#Lg2 z&CUIBMhuE9D`tFdk({1eBxihFIfp7hxW0u;q;9-{7)#C?yil~6RoY&yJpRqJ*^vO+isqg=*>)5OAjo&<}`lognCsg1PdPb z(qDzC1tGA~6N`pnM;u`9>Vp-dC#}6{ZRfJz92>mp>3O)~X{9*LfbPQK)KFx!+_!It z|JK$dmL0#_n|_bC*qIw2Ug~8Mcj1@$?$BmuPHbRp^*(2AtY)aOvuEv3ysH|$rMnxw z*!lr)X=J3Ajts1cjJz|lWlg3gGv)aDOlDxMx3+&Bf6nAsBI6xNcrh3 zBoaHkgg4zg?mCfow^gN?v2~>fhMfA+1Dze-9;YehG?#_{R@3z}$_cb3G18Wv__s{) zt%*4~|I3`!$`Ai4`?8p`Oj#geX`EELjIoxOwUkxwbj}*Xu-2)tmX&!3;NeE+GcgmH zb!E;x9jJ~F1*%xmLc5AkmZoA5K%@il2%z?`)7u>xnMNgeLP~~fB7(|{Z)+x-yT zMtD`u)>z;;tQbeJ_=JT{FlQ!cK4n%(`OlqN|-~0Y6Cc;cR##+EBhbC$1NQp6||S>hD0G$am+w;>wfo zb58L2ko$Pp`Ea_gJrr*9j)H64Ya_zaIRQ5iqB|+gVCkGNyDCh-F_+Hiua^;yjpt=X zzD+l$t8Nd`KQ8a)Aq@5{+e5sRL3e%-9d{CUe&}ooxl>;wKfhPL7;;~~Bcj%HlE!b1 z@58k5wPElx;`h;`=DYI);aI4}`R@GK$LX?scYd|oeG+$mf8)xse13jeyBV*d`R@E? z_I6(RGydv38eUQ?Kg)^k{C06cDBKO9aweUh9_|X!{T-|YP+N_EemVGC{`unnx9EIt z=j4`+*JnfZfZ_AC`|6XVpD&*8h5Xqv(zS(`!hYlY|G2C1qYys z;3PSn8XmZYtycJh?T6UA*UoKAX%Rl{lG)JRcLnyrBQi+#9A9m4Qm0!6MTip1W)ky8l>#%R zwKtvW7Ise|U3AK9YUt9BotN#|_-Btnw$&iJlvn4u%08Py=45XD!9w2fv7b6>dYe25 zn`bbB2sViwm+2GJxv)+Vxi?YtcVeTdD(ujizBV)#ZD6+t?qrKeomxgZ@9(gDUHu(h z?cHrc9UpETxhqlV<7yamOLwxfMKu~M9L`M{nhL7%|Hj@}Y!@|Ev9%M07Ctf`b*-OO zgLiqLuza5prG=t*-CH)n<~9v4{=XYsPnvRG;Ay5IcAIrlVLI`h!67( zB-Tye-V+B=3bF| zD4nf>>I!Io!QwUkjCyViMo+SMSzV(z>A8L<2?8A{LT*L3!2aCyLs_9S>vQ}tB7Sh= zK{y>@$_z$CZ*Xj&wXtsHsz7vOqra@VzQM0oTgn@nE)G-l4fK9}-KsiY4;hS_+V>AR zP0cHqG#kl45-yfMA-#bEkE{*6@CtezeBJ6*%{fUk!-zT%&2D#IHNOQTQ7F7{{F<6q zW#gz`9dqQFqs&Y##4&4X&$2*M+K6q+<`!%#TE&Zn*wozAkP~%v3T_aEZ2YkSe11cH zP|4NC0ejoFbwxYz*#+^7MNoYL>A?YxdT8kCRoyR|puV!ZKVW1InwB2aLG1@+vT|`F zGzYa%u7slmb^6Y)^?BP5oOQHC4NoQ zU7BxbyGN6IW5RNYhm~8}rFoCGdo=%~>{+?Q$2Hxh`DbnSX#Ru~2cfhPA5d;-m*!8k z-J{9R+hJbfYUP%8Y0l7gkLFkLoi@x%e7|x_yEGrrc8}&K@nJvAOZ+M2mUd}!o`+>Y z6QA{Sc!@pbmUe04v#;W%$*oFZxhNifP$d0?GTyG-vw22*rE*KVGQhwQ@s!fH_0k zJ(|BBoy$x7vT{qiG!JXLN7Ikz@)B=QZfTe1Ms4?KzKso5;j|I|Nx7w6n(t`4NAtIp zxxB=$Dz~&t^N6;4G#{Lj%S-$X<(777epA~$ny;Ug%S-%*a!b23-_&-G<~5(p^3OEaqN9!)tTmsersmUbPOuC{wLKQTL(mw1YDOS?3uYP(1C-g9$# ziSJWxX_w~x+V0VuFgKT%c%pJkyEG?jyGL{Dg}J=MpI2^am*$|hdo;PNFQr8J^S8qq3rL}C_m}(!e2oqH}#X}1*@zDTTX5Dc{lC_#( zg1r9kEc`Zzz8e(@g@yg!vj8yB7d)i#nS|e|_>pfB_!fas3A=qz&g!YbU(44CzE1E> zHZ&TRZxQUMOG+O1opTF75^bcS`e{lj|6WlPyD|y_nJ{5z^ za{L${pm6h$m(OMRac??F4_xPZ51;~H4!eyX-TB*uANR7; z&i(9VBQP+)9u5~!@B(R&lppSgPXq9Kot4M5vW@J(&+>8q{0#utnS6G?<7fGjH({+K6q~J#jCq)Me7=OA<>R>l zM~C!xP({Qa8}6NkkNHwL8t2y_fJzp+c`A*0KTOIaU+uaAuNEJltqihQ`ySZI$EbVQ z>+k(W=NF)QEZ?I*mahbSB_G50y%1kH_{za&Wl*5C{}6WOF~j8<1LMJW2zHh)AM&x> z4&rCSJqo^~CkdClPlxz;Zo)f89-P%f9{%_Z-pV_iEbtB=#{Lnw*{9N24#Q;ljNdR8 ztK9MmW~yPgPo=ROfk}C`j*u@@9EwKzTZRvYdR_uwt+CS}4<9Ou)=oVBw?e!}i+L<9 z3X8Rq6nhn0UfAiF$I`~;@h$%lg9#Ir$9Gm9-x19E?`21l$2T*NZ`Y|(JRg$BJmynt z_-wwU3#C}e2526TRs5Ic$$P3yifY?<4G+CsoX7WGg%l5vU>?fj1N~E#nF9E8*ElKK zED_jRX|iqDXZ$27_Q3NLIIx_VjuQMB#!ZF4>t#%@z@-=kcGB zhtJHzm3eqV9-f$oCk6GA1XsNM5levmF|ib*Rg7(ZNoW#N;coLwVkYq%;9*lfjwlvO zf$u}V#ri45Sg{V~1Hi0V#GNn&=6`9BKU|L)KHET1DEupdIgXHDqLuvv%y9U8G2URQ_-V@wll(8hv~#bdzX5FLT#5e-Z0A~u9VP(jYlI=8 z0dTP#7a2}9crvh^gC+lLU_0+h%;oxazLoe=U^~xB%vJGrewFwOz;<4h_*P&$pGy1y zu$@OG-Un>wPl=xew)3XMe+0JkrNpPOi&$CUEmH9>5!`rV=SxXH3)s$&67!Ia;T1Oh zC1Me0NXiF;$H&WxlZCE zz&nHbRxY@irQ|o*mWuF6e;@eJ5$xeHIEpT?^8dJAhr#23_XhsQ3T~U-6T&sX!{Bc) z{O185172lt12E6`oMmt`Fwgj0ZSWf4L#uGc4zNT|?*qRS!tKC&j=Sn35aY{L#XKjp z+4$cA%(Fw;Gm(B3`GKjQ5#I>RvqT3Cz73e?i(Y2%F!0e(dL9Hm{4UmG7&_NZyCQ%m0G&kPLkk8h-6xv-!gVU&Q})J+?c>x0>`w zf%iFs>wu3z9(!W;7mI+4QqT_#UIpxiun%neW9ghGGQhU~63%FGO&-1-*q$vVow&FM z*ghN`_5$1fyb|sC`+0P(#kUXnj{)m8PG{@(&FIgCB| z=vRo}2euE>HwG$1NfGp4L!St|ALnDDuoZt5G30$6y!6j)KK7}EWl0{s44C6Tv%M7U zsXatzczhq+kF^cdBq;BTz{ecC9~jJ!DRzAk>0it9|84T4{N@<`C-dms(PQjq5(E14F@xxXL%DWAAhR5yl)uH^l z7kGIHKM1@ZXSrT&_`eNoAIdujZ2OZEq~`@-yUvXA-^}CxC=Zuv67_c4CGz{63A`Wu=UqnLi@;?@A1!ra;&tE+=zpo#GQ9Wl{EuMAYaXU=9I##Q zNdBq7!>_wuH)zB)z=shZdLy0>OG&7HEg?pH_@+YoI^bc9r@q0xz;;a+={%w07L*sr z=ndcg=vrX=Fg~~E;YWctpugg_4f;QjM}Hl7e`vgT4|o{k)5DNO{trq2L$?1aD#Cb< z_%mBbj{|QHmG30dF@CH!^qIhWeusT-1~&i?qy168q5tK;0{YqkgFg$r9dy1Kk={kR zd6>S>1Mf$E+Wfi^xb{u050QTt@J{rf=YyA+6NUDn|8LVj_-*_S04EW@8K9B>MdDC< zdIz`~{UP5>NiV`ca}4>l-QaP+WzbguRe4kb^Sh27uf~cQz=wcse{=zGCG@{*jQ{z- z_F?>10zVY;p8!6L{NMm6x?S>r7TB({CGG{b55wD@hi}Ql+#)A1-p+tQ|NjcSKa_t@0;f^G zD08$^EPkEm{}}LwQ2s^m3BsKQeH1RPtr znP{e7YUQ_OdV03la2lHGRWJ)y)Gcf9En+a%o()A!k*HAgN)^P`u68p^SM2IDE_C3c z3gc|oZ5XJRPZ*%rZ{)8hIdO$ac6%|P7bm99JZIL)8BXR;t;mAEbKvjXxhL_5Wj!?l z470&7_oNckBBpSR%wnXl)Bn?goD&zv=pyzzxC%yKkr6IxX!l!jO9odZwqn_o-_q8` z)kh>C5iO~z;NK$wE3=vpsL~xmhy2(Ows_QlU*7Rn@{;u5Um z3|3bLf1P>C?{t8bSL2V?V+mqc`^P;emy*0 zT5Y|s_VC&Qp_b

VATt4s~FGCnDIPa-su8yeS*6nN{coQa&Q3sN8iJTsxr_1p1lY zZd`c-{|T(#))8VyzGT2((VjrowWsEHqh2!Xj-=mt1u7@*2I*_fhEW~F1oQFeuX!Iz z;KYl55W4Nb*?~dA6`hXo48 zY`eI@#*m!=$`4DJlWdDwQ8ie_+>ETlu2inqZ(}hqICbY~mJNlCbr^l!VHebfO@0qn zk8g%%&>oUmE!y?XODgLa9xd!z**4V3pj$qQHks(kNviLMdIpn9(;gEo?CV-udGSX$ z9vvOsnf}hO3o`d(n}v^vV3Df7k=;wy(@c>}cQW5~ir7AoyewU1fbMF;j@j`idp(jJ ziS&&)S?(I!8nUN^BLk7IZ5$oAp1;G~7^POrpHPOTGPfI6lo@)ntoUlxJ0-V-T_7AC zZ`dU$0e0EyKAkMJMh`7n2Z-$I&Dlv28pBMhH_MArZvA~`h!R({bfq!eg$3D)$c_PV zV0CKEi>nzMIbz$kWb{|7O9q`W8=PLW+Yt_AQ&)F)G7)w$@z)w(yXnJ%rpV0Doi^$x zM_?OEtQu0?m&F`|RVR}Pc1oD8+{Z#5QZSC`Iv)-_w@T$#C_CJ%2BF7%^hS_H^`mo> z>Zh~PW|@wK!-%SNY*WZZt=B-d(iiBMQj4&eHr*Amq-{cUFi=>P-o(OCjUB6=Ro93e z2HYK?h^7bAT_y)zHN>ksA+xc{4g$7&05*xF>f9 zE>qim+@9uB_flohj)(=h&ik!cpHx?fBL3Kpzcqs~D^%BXNh|%9wM2xjnX(B@nc-UB zDTNBr!4eIp#cx+j&aA%aXNOYkFjA@4WtL2KZ?O$Nc(2HH;1%v{xjo6809X&viG|&m z5n-&gZ>`Vhni|edQ@Li(nO#K%FWKs+J2SnTsy1%sc$7?}a%9`2t8CSos@B*mja0V> J3^qEH{{l0;DP;fv literal 2158 zcmbW2-)`GB6vprM6ldO2*okVpMXr)GSde;du-FThtZA?o22CDGL?lupsk&~F2ij}w z$#zIti5)nbQe8;m;nBzM{P;(M-3WH!RF_L5)6Bs?f5YqHt9|%Y+k(MF^RIXdN4LK9 zGtYG;mbx;WnLgLWvH$cclNL&&Q^N|N*Tf)#)rng$gMB!2K$&P^Azh{`2TU!2x(rip z8H3Z{G6ekMP&qGGqA8?vC}6$>R+hQsY@Q?JY|)1sT>)nb3<_zTk@LzSNUtdd+CZU& zOqM=SDS^hzd2vUQ7IYFCZ#7(J%#m$`Un+hZG_T1FTxqzd<}@ChOODE74DZocsTI7A zf!W~BC)liZcS!}m(;Pn&4Y;JL{a~lRUEG{a$B;-eodi<`L7-zYw|&wWMA45@@w^fU zN7f0c``PhE$VioL#<*LS=tB>AokFStSwHJUktFv8ld9W`zC}P6&zON+D*SVDHl2)4 zW|NZ-v-8n(eD&_rVaQly-d{IK(b=xgjKRvUsFTp>QHz|Z9{lhIrhlBD_n;Q`;wAZW zNw>3OJ8>AKS4;XnOS8-~=+@?DmL?Sy$C(th?z)c8=gcCkJYJ5bSEK3aX!iT$^k8i~ zpXV={@QPERq3#E1Q*c^ytiT5sbv}Sh?wyp(Se#LA_eDrvIe+Y@`Ld~TZ*LC_ThJ2L zhIlYX3z-%h*b-43KzBzBc0?TRJqVAFsuKsojnw037`~q~Cmk(;xb}YEo>|UvY^9)8 zx+&2F+G~U|8VjLOf4erL>-N{FB=QT2m!4fewt&3b*pqiKH^^=eqmAg+!)QD{ zdB$OsrmXd0M7hs9jD8wl1UIzx;IE41(k%~GyJvNZP|s}D^PLO?CalWc82i;s7ilatitude, &frame->latitude_scale, &latitude_direction, + &frame->longitude, &frame->longitude_scale, &longitude_direction, + &frame->time, + &frame->status, + &frame->mode)) + return false; + if (strcmp(type+2, "GLL")) + return false; + + frame->latitude *= latitude_direction; + frame->longitude *= longitude_direction; + + return true; +} + int minmea_gettimeofday(struct timeval *tv, const struct minmea_date *date, const struct minmea_time *time) { if (date->year == -1 || time->hours == -1) diff --git a/minmea.h b/minmea.h index 1caa0b3..173bf7e 100644 --- a/minmea.h +++ b/minmea.h @@ -29,6 +29,7 @@ enum minmea_sentence_id { MINMEA_SENTENCE_RMC, MINMEA_SENTENCE_GGA, MINMEA_SENTENCE_GSA, + MINMEA_SENTENCE_GLL }; struct minmea_date { @@ -67,6 +68,24 @@ struct minmea_sentence_gga { int dgps_age; }; +enum minmea_gll_status { + MINMEA_GLL_STATUS_DATA_VALID = 'A', + MINMEA_GLL_STATUS_DATA_NOT_VALID = 'V' +}; + +enum minmea_gll_mode { + MINMEA_GLL_MODE_AUTONOMOUS = 'A', + MINMEA_GLL_MODE_DPGS = 'D', + MINMEA_GLL_MODE_DR = 'E' +}; + +struct minmea_sentence_gll { + int latitude, latitude_scale; + int longitude, longitude_scale; + struct minmea_time time; + char status; + char mode; +}; enum minmea_gsa_mode { MINMEA_GPGSA_MODE_AUTO = 'A', MINMEA_GPGSA_MODE_FORCED = 'M', @@ -121,6 +140,7 @@ bool minmea_scan(const char *sentence, const char *format, ...); bool minmea_parse_rmc(struct minmea_sentence_rmc *frame, const char *sentence); bool minmea_parse_gga(struct minmea_sentence_gga *frame, const char *sentence); bool minmea_parse_gsa(struct minmea_sentence_gsa *frame, const char *sentence); +bool minmea_parse_gll(struct minmea_sentence_gll *frame, const char *sentence); /** * Convert GPS UTC date/time representation to a UNIX timestamp. diff --git a/tests.c b/tests.c index c45bde3..605cad9 100644 --- a/tests.c +++ b/tests.c @@ -377,12 +377,36 @@ START_TEST(test_minmea_parse_gsa1) } END_TEST +START_TEST(test_minmea_parse_gpgll) +{ + const char *sentence = "$GPGLL,3723.2475,N,12158.3416,W,161229.487,A,A*41"; + struct minmea_sentence_gll frame = {}; + struct minmea_sentence_gll expected = {}; + + expected.latitude = 37232475; + expected.latitude_scale = 10000; + expected.longitude = -121583416; + expected.longitude_scale = 10000; + expected.time.hours = 16; + expected.time.minutes = 12; + expected.time.seconds = 29; + expected.time.microseconds = 487000; + expected.status = MINMEA_GLL_STATUS_DATA_VALID; + expected.mode = MINMEA_GLL_MODE_AUTONOMOUS; + + ck_assert(minmea_check(sentence) == true); + ck_assert(minmea_parse_gll(&frame, sentence) == true); + ck_assert(!memcmp(&frame, &expected, sizeof(frame))); +} +END_TEST + START_TEST(test_minmea_usage1) { const char *sentences[] = { "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62", "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47", "$GNGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1", + "$GPGLL,3723.2475,N,12158.3416,W,161229.487,A,A*41", NULL, }; @@ -403,6 +427,11 @@ START_TEST(test_minmea_usage1) ck_assert(minmea_parse_gsa(&frame, *sentence) == true); } break; + case MINMEA_SENTENCE_GLL: { + struct minmea_sentence_gll frame; + ck_assert(minmea_parse_gll(&frame, *sentence) == true); + } break; + default: { } break; @@ -495,6 +524,7 @@ Suite *minmea_suite(void) tcase_add_test(tc_parse, test_minmea_parse_rmc2); tcase_add_test(tc_parse, test_minmea_parse_gga1); tcase_add_test(tc_parse, test_minmea_parse_gsa1); + tcase_add_test(tc_parse, test_minmea_parse_gpgll); suite_add_tcase(s, tc_parse); TCase *tc_usage = tcase_create("minmea_usage");