From 0db02ce928c9853c91785a74413e7dc19724f19f Mon Sep 17 00:00:00 2001 From: "SmallChi(Koike)" <564952747@qq.com> Date: Thu, 28 Nov 2019 10:10:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A02019=E7=89=88=E6=9C=AC808?= =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E7=9A=84=E4=BD=8D=E7=BD=AE=E9=99=84=E5=8A=A0?= =?UTF-8?q?=E5=92=8C=E7=BB=88=E7=AB=AF=E5=8F=82=E6=95=B0=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +-- doc/JTT.808-2019.PDF | Bin 3098838 -> 3101872 bytes .../MessageBody/JT808_0x8103Test.cs | 2 + .../MessagePack/JT808MessagePackWriterTest.cs | 12 ++ .../Interfaces/IJT808_2019_Version.cs | 13 ++ src/JT808.Protocol/JT808.Protocol.csproj | 4 +- src/JT808.Protocol/JT808.Protocol.xml | 130 +++++++++++++++++- .../MessageBody/JT808_0x0004.cs | 6 +- .../MessageBody/JT808_0x0005.cs | 3 +- .../MessageBody/JT808_0x0100.cs | 3 +- .../MessageBody/JT808_0x0102.cs | 3 +- .../MessageBody/JT808_0x0107.cs | 51 +++++-- .../MessageBody/JT808_0x0200_0x05.cs | 37 +++++ .../MessageBody/JT808_0x0200_0x06.cs | 37 +++++ .../MessageBody/JT808_0x0301.cs | 5 +- .../MessageBody/JT808_0x0302.cs | 5 +- .../MessageBody/JT808_0x0303.cs | 5 +- .../MessageBody/JT808_0x8004.cs | 3 +- .../MessageBody/JT808_0x8103_0x0018.cs | 15 +- .../MessageBody/JT808_0x8103_0x0019.cs | 15 +- .../MessageBody/JT808_0x8103_0x0023.cs | 41 ++++++ .../MessageBody/JT808_0x8103_0x0024.cs | 41 ++++++ .../MessageBody/JT808_0x8103_0x0025.cs | 41 ++++++ .../MessageBody/JT808_0x8103_0x0026.cs | 41 ++++++ .../MessageBody/JT808_0x8103_0x0032.cs | 38 +++++ .../MessageBody/JT808_0x8103_0x0084.cs | 3 +- .../MessageBody/JT808_0x8105.cs | 3 +- .../MessageBody/JT808_0x8108.cs | 24 +++- .../MessageBody/JT808_0x8204.cs | 17 +++ .../MessageBody/JT808_0x8301.cs | 5 +- .../MessageBody/JT808_0x8302.cs | 4 +- .../MessageBody/JT808_0x8303.cs | 5 +- .../MessageBody/JT808_0x8304.cs | 5 +- .../MessagePack/JT808MessagePackReader.cs | 4 + .../MessagePack/JT808MessagePackWriter.cs | 5 + 35 files changed, 582 insertions(+), 63 deletions(-) create mode 100644 src/JT808.Protocol/Interfaces/IJT808_2019_Version.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x0200_0x05.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x0200_0x06.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8103_0x0023.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8103_0x0024.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8103_0x0025.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8103_0x0026.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8103_0x0032.cs create mode 100644 src/JT808.Protocol/MessageBody/JT808_0x8204.cs diff --git a/README.md b/README.md index b561727..5435e63 100644 --- a/README.md +++ b/README.md @@ -316,7 +316,7 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0 | 6 | 0x8100 | √ | √ | 终端注册应答 | | 7 | 0x0003 | √ | √ | 终端注销 | | 8 | 0x0102 | √ | √ | 终端鉴权 |修改| -| 9 | 0x8103 | √ | x | 设置终端参数 |修改且增加| +| 9 | 0x8103 | √ | √ | 设置终端参数 |修改且增加| | 10 | 0x8104 | √ | √ | 查询终端参数 | | 11 | 0x0104 | √ | √ | 查询终端参数应答 | | 12 | 0x8105 | √ | √ | 终端控制 | @@ -325,19 +325,19 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0 | 15 | 0x0107 | √ | √ | 查询终端属性应答 | | 16 | 0x8108 | √ | √ | 下发终端升级包 | | 17 | 0x0108 | √ | √ | 终端升级结果通知 | -| 18 | 0x0200 | √ | √ | 位置信息汇报 | +| 18 | 0x0200 | √ | √ | 位置信息汇报 |增加附加信息| | 19 | 0x8201 | √ | √ | 位置信息查询 | | 20 | 0x0201 | √ | √ | 位置信息查询应答 | | 21 | 0x8202 | √ | √ | 临时位置跟踪控制 | | 22 | 0x8203 | √ | √ | 人工确认报警消息 | | 23 | 0x8300 | √ | √ | 文本信息下发 | -| 24 | 0x8301 | √ | √ | 事件设置 | -| 25 | 0x0301 | √ | √ | 事件报告 | -| 26 | 0x8302 | √ | √ | 提问下发 | -| 27 | 0x0302 | √ | √ | 提问应答 | -| 28 | 0x8303 | √ | √ | 信息点播菜单设置 | -| 29 | 0x0303 | √ | √ | 信息点播/取消 | -| 30 | 0x8304 | √ | √ | 信息服务 | +| 24 | 0x8301 | √ | √ | 事件设置 |删除| +| 25 | 0x0301 | √ | √ | 事件报告 |删除| +| 26 | 0x8302 | √ | √ | 提问下发 |删除| +| 27 | 0x0302 | √ | √ | 提问应答 |删除| +| 28 | 0x8303 | √ | √ | 信息点播菜单设置 |删除| +| 29 | 0x0303 | √ | √ | 信息点播/取消 |删除| +| 30 | 0x8304 | √ | √ | 信息服务 |删除| | 31 | 0x8400 | √ | √ | 电话回拨 | | 32 | 0x8401 | √ | √ | 设置电话本 | | 33 | 0x8500 | √ | √ | 车辆控制 | @@ -378,3 +378,4 @@ Platform=AnyCpu Server=False Toolchain=.NET Core 3.0 | 68 | 0x0004 | √ | √ | 查询服务器时间请求 |新增| | 69 | 0x8004 | √ | √ | 查询服务器时间应答 |新增| | 70 | 0x0005 | √ | √ | 终端补传分包请求 |新增| +| 71 | 0x8204 | √ | √ | 链路检测 |新增| diff --git a/doc/JTT.808-2019.PDF b/doc/JTT.808-2019.PDF index 7ea6824437893f6dc77363406f9af5d89aa4f8f9..ef4ecd1d8e06d58209ce8636e823443b7f319e56 100644 GIT binary patch delta 46630 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 Bzw-b9 delta 43583 zcmbrkby(F~w>C^kcQ=a;X%>r?29fTP?v|EZv~)-c(%mH?jg*ui-3TZR(jDKA?cUEh z*E#!p-#^~#ayXei;vV;yuvSfJJM2tCJ8VD*YzSNkdY1GH2PVj&31pjj8N}t|Eh@q*OMj`_)o`j zbAx#PXvE6{sKT2{bA?0?<>inCbAkA{frcN%2TXtk{!vZ<=iw~IEd@XP<}}e7aw4g1Sg1#AJ{L!2jb@B;*gaDY!_jfF589m>UEE z=D<842w(sh41xfsfO$brW`ZR_d{1*yAb#L5UM>(na2PKT87c!n=r3#u@c!d*NGh2K zGALDM5D6QOo9l0^3qbz(8PbJH4j@de3-yli-~G(@o+FFvWw%lVH_1b`*HfH6;4fdEEx0_Q*gV>tmwLim6dn1=vP;sl%k0kHOD zEFX|Jyg*+7z?{+(g2kV}2W$`ry!8(VpTZ*nc$ptiMFQBs4;&-`9P|_t3E-foe3Xy? zKnjdYN&zh}E-9V*K#t4>z>@zjClNse1pb9JbW%A)kjde=IsfsQz#pGQZ2yJLf^Ad+ z`hW8oA1CKu3o&>EczIvE_?xL3G11(x{(bqMIwx~^1omA2N}S1kbk*O>%U+3KdF+7|DWsrhEEkG+7nfNr9?A^|M$!Of)7z@ z7dJ8z6mUH^_#cw`AK3|nm0JP?eoALa5Euv+w-gBS1U4WOxPVOI13>Z*D7b-fz9*0X zoA`i?`WqX6GU6#yfc4V6Kw<#%(gJ^oh(p>jb^8hl8=jBz@1XN>{#(#BQ?n?5pmXv4 zW9i>PH={v&qGEp@u$iERXU=Kf#JbxFH|3%E;r+FaBc!B)_fZv`-P8?tw2%w8NuKa34b zNC6Da1w=-Q|Gyag$+1#0fFprt>72cq?a zU8n$17oX5808rBZFVX)Uj(-UMsqBb9Q5SF!K=l7bWx$01b#Xm`Ljs5fConGwMCqUC zJ#nbyQ#65SNdgqd#l!JjRtmuVKZW=|72}_L01l9b0EGfLScdOUq2S{J|KUJBF5Z8M zt9q*7AQF%cf8J$JATUxxW=zd6LwhP4O=f6nV1j>nj{)oAfEN<<|5Psi_VRx!17OAf zsS-S4kq;pLr~Kl7DwBZqe-(r$ZvvqIUj+e}myiG!{{2k(FSi04{_hn6c*Xz+$VmR> zr6;?&D3G;?__+B0#Yt*^3I*WFzaFo^qCYT~O8WzIKyU%U0|Xxs0ze1>Ap(RL5E4L00U-l~ z91sdXC;_1Y1Ox~*AT)r`0zwA}Js=E#Fap8^2s0oofIJ6;wMlG<&98%+^T`{)`x{l? z;OR~N^b;x<LCAgu&AIb>{HT-~1d z9e}ukg`<_5HIVRp0^lamJoev+P%mAfKv%?16+B|aeK&I?_>Ffko*AQhD{GECh;4mA zGUf0sq&ne*&vJ}enF=--?_l_gK78j6fU8VtAfA&oA=hIC7o^&_Sy#%`%F@EBmGEyM z!ABN!!se=iC18@oY)R!$jM+1453vw^U=?7O)ttL(jHT(^?OsT`>P=b&K(E24TuU%K z8U;vBfp9O|)!yM^i{aEP{J>W$C%*n3(1Ox#Hl7}+UvRF{8{8zuRKQ&-iD92hla6^O z_6pB{JC_?yk10<;1mDXJ#(WjV0fr;KMM~R@xlkbVz9)Lf+jx6MY$UfEZ>+>K4aOa& zQSNa(Q!kir;1~CjX;6(@3{*UoLJ^0_j|Fqi3WnY~-=pQ3v9cIyT6_Ubi4`HS&?H?R zO}zVLypEgY-jwn54(EA^H3$=A5zMAwRbwT&h%ZKlZ^N5Qb7U)No7RP4nnqcewS$zL1=>|#V+T&mqWGi zJ>+>b{s9q^YD(|lITxAE=2?5-7OcY5s)VfU3I>;1+1ky17^Ttb!8{G>ZRo=iRF@*- zBzgH7HbW4;djO|zexD0Tj9bGJTq15n_nG1ci7hcA?)9^bxB!AQHI3dY55zHLj0Ln> zM%anwk$smNL}SeJZ)Q+<@H?4riSuG`X?#UcF6kWR5=4ar%-zID#Pf}AAq5;#|6R*y z3IbSFK?R&IWprp1HB|A$%NXh*{Wyw9Cx_N^+k|N};Mi@s{W|NT@x(M54e(3cQEJsf zZ^rrt7@9p!4&+%?br|>(>t1A`3d{|-xd=8S$YAFDJ2yPNuz9Ei1z(Q!1=U;u$q%_W z4D#rCiMSZpF8gjrQqe9pL;-dwv*vhIou1(DmZl=0oLen%;Lu7 zEBi^L@T$~%ZczDn`1tdc?ZFlMpc(_Z-lZIVHRw6^E#+d(WJ~pz#@c}i@!z9ZHQBbc z_GdaAH-zpNX|Ngyr2*1GE5Sis=pg=B8B>d#OSef%o&Yy;WJFe^vz0eECDGoIl=VD| z{Ay$xQWkE@$nW9$V13{!U_ad!6(4ZHBWJ+5n<1(sAVM4X$hu*Li0hGdkeE&=>y%uh ziwv-If6LnUzyy@OwBsT8&Ry?&j_os%h8J1liMZ6msfLq|oc{yL0uuCd5n?|PzZ8S?Y68KnS{3@Jt=PNn;p7ChJlr8_Q4R!x z0g*bWh$T={y;w$j4i#OY^Esn53fsxRTX74DnH<=%G!I8we>+GO;;bYAmI#)cR;)C84PJPg2{tLB@Mv3B?h}V zcFBmVy(39;;cVTXUxHhYXh-yiNePi6$)F5{=FLlsGYlXOkHCo2Nhu9)ji)bzA$P&^ zQqN(+V1vT1UpfSUCj5yF;C9GLX-f^aS8;TLB1^i_yNn?VY{nsL)-v_RSedy_>9C#B z?G%l^l1`A_E_nFf#2U&LEL89P97LpWMgpHZ!t;s!z84tDCRRRQHj##t=CgAVB?Zx; zmQkz0wZx!s+MkJ$)^sSyF=S`I`C+gz#ydYTe(`q!lfzE+a;8(ocL>6!;T*xrP~;fO z!79%E&fUSwvV(!k#dyX{dY2U`hSFmmt}rrO%Oy&@jYNAk&kr9RjpoA}Gq+AMk-IbM zh$UUG*-Na9q4gEVOqiGUN;>*@D&U+H%GFQDF;`&{&B)_O+n<(Vd}9u*LhK_eiuzRD zFN4z?)~{yuHcQUTkD|7JVy5Aldju)6uGWNMmc6o=<1(^B?n|7$S#Y zQ{-Yw`GIiikBF=k8(&&sip1sAaTYAdF&O7^sAMDu0;o7&<2j(n#YGdd?)sCKICG1N zovTQOy#n7FzTtym2Z@weUyO~b{#YsDW@1?QnaC8UqA(e~1C}6D6z3FvD!}3< zgo0R3Oj6_piD5b4q8sx1l9^uyD4b`8BOaE?bk{^Khlc$FdNL#+BNN!#s9v8tUW&}y zc4P~7DqUH@{(|9%9wIB5`-a3eXI?y80=t`dvN$+*UM3oQrpc>-8sQj9Vq2+dEmK;MX=PsDM6kA^qa|KxG`MH1}oX49ypH zA-zjfcF>UGjC5?o~0KPk7s>w60wcjv{(33;{a=&tK(du%V4rdRE}~!fDwdD5XCXtA=!BtepWA} zE!sbGh5PK1o3U{DTEgQ#qtoGGtw3iX6FW5J&8JDhNV6|Nj>r-h;ML(T4JVaRapT#( z3L|8*CAqq??2W{P)<{d=^r74+PqH4W!c$tqJ%+hQMZ#yzVb_7CzcYom|jScS4 zkj*)%^j1x%B#xqUh8REyOq9~ZIdRd6yHNw39BO#Eel1#f>>Q92hEFtoIifCq2fis*4bPae5MX-tr7H0UtNpKaxDsZ84IzG(# z@;>ldWM3rF_+b{V&=c9sF1o(EMO7J=V#S&Y4N;dr!JUDQXQLP z)8d=r2@=(g;S!8V+b`p?EOv%KT4u)A({ys?qfKmUC)Y?A>s|X8Vuljera)gf&C^zM zzUh)ZH?Vr?J_iq?XCgbB?@E(uv0Xb<8H+xKF+$ivJ?~Ws-}d8fU^Vq9K;7Q(7aQTQ`5ji*2TO(}f+~Oym&e zTs@cuCA6GWV$xggnUS&h)cHGw`*4~p1095tY&AKi(g@betc@Xcm5Q52u~cFqd;83l zHJP#JN_=g%mg|oCr*2%1WfFH-?Drb^{&BJGFLPSCZgQRy5Oh_A;Z0-vs_l0u<0{>A zuPo~Kf)g~&Zm~|VPZTCrImnrY!pOQC(}yh8q0d~)!mbf6LxmH|s1!cG8$>9N<}R9Q z-`nD{eC+EA*m}K@3Gyk)>Tn zYJ(VEOU}z6^ri)4Rx?tEbNehJZiW2CjMW@UNfs8f5nKIwo}h(^uDX(XK151ZDbz5P zWhm*0>4hZcX>8cAbmnr+QA7@yw2)b_!U)39CwEQ!^P_VWNL&cGmr6s+ zLX{4a)>_7~S+MeR>r{)mk*P8aSjNyEE270I$B@ma_le%hIJ}lSo3J!ff|vB+h6bU; zU3!)%qDs(33_@X96e>$s~Wl zbp_V(jiHGs$hRa=ZLb-!aU+r(5^xp-F~mQWO9?(!+s1gMgyi!r2@Zvs!Pbje z)Hei;%J(>i+)6n5)Wn1Z$j+w)>6tAR@|94z$gA`nO^vtL6q8^P2-CV_9ilBSVii$E zBN2?8Z@NzLuv3bRw5LCTc{;p2ZhfWO^5u&NMiK$fz( z%5ck^h-|6)w}0td0P>>go&mE)Be)6|3?U+i_lpn3DMWxak36{V?1{I zO>s^*E3h_%#-bDvEaDeABfI=ezz~d$F3!;?HiYvLnJnNp@`{*yBp0D?QOn3xSa@q(Q}CZN z(XY{>P(D(A;-Y|>j6q8KejdO-&pUk?kN-sv|@U*8gY@tZWzwH9O1OFn0!MkR@(8}Px(5mVkK7G zgR!bIF_NQ45t6%4RX_7q1q2^22baGz@RuxsIvzH^j>&ZS|=WS(qJ?o~uC~0uO*O zv!KzKPYcZ<#8^R>^ z13QNOMo*PCJ1n!|g64qkByhkt`FWk<^ulPUot3K*KeQ{QA<6k*iQU3%V>ji*bY5?0 zbKzIV!t2(h*|XEOKmQTkqoXA=lj+a77@hHqXcnPASE*m}JZ^b?xR`F2dfWK4BlEMz zXO0^$75V#ZE8-djlG(CC|1%zY0;bFUlg6pl47=1DAJ+pls8f}}?r%UbS11Os?K7g8 zq5ducq=zo&#NJn$i^H=1Kx580SD2KRVwda4z{D(u`|Pu`CcL}D3%)~*e7y?SqG&HZ z;wBx35{Hd8NK-!taz7(W#%J_ByrIp{0fplF8@eOHyHh6_-;#FnA5Wo%B6oMcMcYNr zd&=YduO_P>O?_?BCsP?WpmM=qs0{t?sh~cmyQi~IuhTsze@UXH&WH2S(=pL@zw>GB z&ikz~QPMSU(}&BOY|*>PjO>+%qYKf8>tO9TC;$76jO>TAo8qP`HcbWPHjT@(Nh;{W zB$nv?uj$QMqx;*=jy{7o<(t#9qR`Vxth0Q+PrQ6YY>HyiE@%&$P{;1(;%DlbXqL6l z99r|A(P^rob@*RhG*P{{uikq6{jin&_?xl%@ppz%`T*6j;>KZ6Gpu^wDOTs*&BfZP z;iCi_mu7Bg=iO0Lljvhm8r*3{oKdwX31YR}?oxpE>ito1)1%B7Pmck|mDLgz>1}q_ z^%gYaIcMj$$1N-cDyWFl?MpVlf^U9P4bS|hfPbY1ej(6n#7=v%ic~~9wO|C-3|*|P zA}o5v?4Y71gT|fZ35_ZTD*MG5b_Y9y#eUaC?_{UNG8af*ad}IF3KQl7)~q6xV{55? zOR4KJcp8J+fyxtO?Xz>Xpa0G29u?G2GE`ZKt|j|p`r|Sa^vaVp^~L@D!LYWIQK#SO z?p7yTr+L;+)1uXGs@3i?&uB(2$GD(miF*t4tpX78xW+Ml)-nD$EBlNVXEKRORZd4& z?_Iw(hsEYk4m@jNwK>wc+}r78D6`KVzb$Xmg%5EU1(I`m-i$gaSe&iZ3sx>4qtim2 zhPy=UbhG!N#Rr4_GnxBl=fw@jV?BeY#L)zHIKF3ky;|Q^?oW;UA2zg|Rvw1S$EdQ6 z{O&h@I~n<1X-j}Fp>NOctsZY4JFaQdFV>928!NTVbH0_o!=mcEi8EU5xZZmwdVg)D zP-*mVwn?=6_;`ISySfeaKL3>g1Z!{6=wSo;0HwjDs3zo3Z_kfzoT%Ea*Ek+8Qe-;yO$HVxMeX#mvY@{A zsYc3`klE$c$Gb~t_m=lH7CGVeD%D8pnCRUVV(;{V&)Hyc_2W&L*BRDo$HVbE(UtqN zRH{|z$Cr*JSREpxWC;SIN{E#d(-97*u|l<)AC&H9%iY&~br>;!x8MyZFn(*uyt?Yi ze!SaEj_F>nHndijXt|Q64GDMvrNlkBx!K)JW-mlMblqn@fVNW}KsB)sT}~e# zmT+tfL@yE0cgA{3CE4PNF&l(41*cA;2@VROq3<~F13dvT;&UhbWjUawQ_*{4zbOi|8`|JFo%9czJ6^zP<)!`BLKKFXdRA$pC%FOZ*gN}r*& zlN1fc9TL@yM%dgpV0h5<4jt=82UOwNRJXxi)5?OLH2xWO?lXM zehKk#S$=Ho{>!ej|LI#@C*ix3&GSVn|A(D~M!(0?m=+(Xir~ip4H#D z77;8{!s$^jhZ;@gVYpJ#H7-=d`OBG$<69atQbmgZw;DT{05v0DXvD^!x$v;(G3Ky8|VbQ(=vmo1Ql~fUPK@7fs)$beWTCq+aK>fkX)%i282CXS$_G*v7PrchRzVT z?zA&I=4J&G?snMTNIjhE53IU0o{2iTym&b*BkG+v>DVhZUDV^AU#`cel$j_5E9I{`VKGgFnaZEz}4G3tGw)B*+{ew0u0!p)0XceJ_2D zvq1PV%d?WsjyT7w$7n{jrN?&RP++`}d_&KXAEcATF=7YCnd^hGUhIlOjg7NI8-uHdmKCpI!goPd##;xA> zsLF6finT1yiD@Y!IQg=OD$gIGSCk`@apqwS6zdeeQ>&G{1|P4dhcA9#X?Gtb32zPH z24yT%hR4t^qV$5F$Yy3Zo6_waUkx zOm?3;M22&;Tax!~k+WC+eBTm&$Wic~KcX^OMTy2C2h-DG*Hv7^m%1uBxJe5lZAR=O z$BWR}E12}~+=Bkfr~uj+_0V5eVcC%~^}IuZf`n#!}) zy;7^WGnF!o&#`h)zm5a@huJ$n$f`@-eS5)?Ra^>7geTulh=k&MWwfqnpE|7O0i}_x z%Ou3*a}IkZzO>Fn(9)7u@H{?-WwX=niM&>)v;OiST4m^>e+rCiCz1BDzg<(ruY~Un z3BxwIR_0@PG9(ONi@@whTW)F{24#jOvfeqd+Zr%B%Ya zFYIfoSX&OV*g7A@A{^0fGw&fYLs;;5wuAqp4f zQ0zS2$JQ6#)ZTAj zVN#2lKV_%Pp`2GjgudT+X9Z(koW5Li+r4XonWHBlwpoRiuURE_4p(M|F%U)Fm?!8R z*+gqTG98&_67gMsQ1kp%gmh`Nv(voOr}#mzH+`C>$I=5ymYDMd!!$rK0>sIW2L52$YDJ6NVuW`2{Ylype;swTHQbLNq_w_3!je zRp8S?-nkHscUtHDAe*{kMwsfK6T9!Uh1zJ6X7n6sii+I_dBQFgnK2C`iWf6){5rD8 z9*1udrORsuD0vm>%0^h0diPbGQDvNes0XFtK{XBC%mUf22UbO=wfvLiQ`PpegdHX) zS?{8KZkDRo<=(gGmpT26=o0m-NSSyQSsnVjxk`i??@uUO#EQ^E>Nz(?ZRxIU#D^Kg5d*Gw#M<$>uig6USG?#>(Q5x@l&lU0 zXj@k6`|^mr!Y~JTPbxzKIa=*J?~}?H?J1h%^z*MVTHW6>;JC2Oi>!VgcQV53c(;c$ zqH(Cy&1@k=kO|tr6cV0D_H-&M7bGG7wA&1ce^f|MKLLJ?wz|2rfXmR5`O;aT@AyeV zD}#N334P;);KXwsbCK2|&DD>Xjx=*WAKE`b9CC)7%yPSQRkW%0O6&UhuhyRy3bvti zx25xj*BpD*d&TRjF^9`qG7W0$0}r~vO|^Ih^`6R)=Np zPjq)OS-lobmkcU6SaYGswH)w9xwdoA+p%oO^tbwj4Uq+Y8x8xPP6yOYR$T(AVJ0U* zB&g1x`%^9WM4i`d=#&|3!ivGe76%H-n`i|Ldvj!gt+k{}eO`N>!L3+QC>Qo8$BnVh zkB<3MySD7|`h#p9UUKI~c|(e53a^YU668$c&I~?x`V<>{=+Z{reMd8O2^n{WlHMBj zO<)(-{yq^DCh;I(Jy)GV=U~@7X7#lv#3N*gd@bjj`bP29O!JGiUtphE->(`+;&LDL z&cwYjQ#I4{JfY7`&Sw_ah%DTk@}m#+h=y#WS9weaB{5#iJ#S9R1}#~TnEXKE;21cq^M!twp9DQP}sJ>0aUR*c7j^PsR>i0jLrunXF_bP`fSR9JpKG&^T8ss zOmb<(`!3coZy;P*+a@1;E$MgFEV?f@uP~Y^>~?wQIvweoL=>xCGfZ_!juLM>QH-l# z-+nhvpAb~p;+O^doxbiIm!qu2k6c4TH7gLcgjjj|1OxV6xLW7nteZ#$F%hsL)8Zomkd>#I9#rBXI~|#=*yTMxOq#_0!VMge~G(+sUU62x>DX`p)WOg z+=_Ngq`V~(pv-wzW16|lU!ZJ?AzAXCUb>(Z@{crE`_wPJfbR!JA?O4x)uA)~9`z6l zNj+8Px#{aLjCnC4>cGsWeuFE-y$2;-(~kRMoA-9B%A{97kl92Q755=oMMC>pd8U#p zD9M%g)SB`{aAboIw`jZ3=dDO;h~2h8oly-#p|ol;|{-nED%;Cw0hE7@N1N z%)0PbSj`>7dAUsCI9EL*dA~QT(Dr^$uU(cHP}K=V@;c&Hm*6k>l^eVCWA`~d)2_vd zmWK2cp6=rqHi}0kBO=byjv0fxY{JVzE6X*_7I15vG#w)yb)i*x?8CToz>p)*0~HoI zc=R0LtCodGd}!nqUpy+ed&?oS;LtihEuG6O_(C#=)n|!8@#8hrN~U%7rKCiYNI1XO z2_*=VHGG+a7f(keI+5e`!@Qq8wH7wEOE(L9dq_5eif5VEJQ@qA_7m1uPvfelI=?RB z=Y3hJxk?^y>to;G1Z9Z~#<{QbzVs*8(fg{d8Ln)bkwBhd?w5R<@jew9^D``ao3Lx= z!k`Y6#7JBfi8EgvdayF*<109W%2$@by4SRLYDH)vjL2PDS){K_4Fe*TRXkBGIo@E*Tjd!= z&M$AwDm~LXPN2;E+2Q<-WsJG&>TfO*RZKT~{Oc3hhBYekK~cjd3pW-s#~dNn!A+;N z4-ckEiH!rl_M=f>js*7FqgI>o))wTK=Sa8YO}IxpXl{~L0Z$+NyDZK1XBY{NgKY%w zI9y`q+uzPd)qjhj&Lb6;tc>*pjiBalP`qrXl^FCM^o6R0^V`nWud9wea$Y;1_qK^K zOc;l?DryacHzo9nPQE~KE$qEUL*c}r%+1{hO~>1^re=LvpOI84_%-RUANPCwEf197 zIbqX{@{B7_ud$^5Xnx;!v{oO#(e#RvhVLb z%fLt4Tk=qHVNx1Q#5IruKDrvZ&E;`y-tF3tgXbUO5f5S4b?7-Ls zyw&&7-B1<}Jx4SgCc~Z3La~fKq6|~jE40qnRa7-^A|rAL7TTZ`@?WBd#jLyI)XJOp z`GN0SINhe5r(zucY<4fy9-&r@){uDzCMXtXHRx?S8aWbI$0fTkr=AV8)M$$OT{{FOB-Xyt=$&;*Pix*BrRsz2Opx= z8yKJsy~z?t9^(=Sq)>MI3xH`mokOY{?cb5EC)JJ=S%j;z5=OP+m!*?5s$COl@o8Cx z;9y#1^H1F^Pl&Rua30-jPO%)`u9Nh*srzSXA#unXX$j@T)iZvh|7<>m-EyJ*8S*RW zT~yn+q_Ciu#su~+Y?9^yWY_SL7IXZ0@j+-w=X!2COs^ox$PMr{k&}o&B^}-0#TVxE>$;mtO0P$)~i{fp)*~u;|dB z>~-v;YYT#2bSSPzn2bH6J8=Gs4eh1|_Zkwd>c2%K}(P@ zHCc{hgIEiW9K_AkJy}0W_#+uK7rowU@GGlO_YRp8hA_tlug?`QVMa1cH*7dx=Q3-$ zyo;4LWjpG`eM~&Bj8!pq9}kZV@?=MYl3q(l1+7>Le?wf}Y4&rd$Qn9DEIeK{ME(7K zPlEhCUs2LB{bRXZcV8VNM-Edbes@9Bpha(*ZeQM99xB!IHkt--b z&T2VG{IO2=Ons%tCk`;~b4?Ns8_emfQC7v*jQl4FMvyYTxuyhIt{sSt61X44Dh0zDPmvtGsm&Bt$OAO^G@wG0u!Bf7+Q%-3E%>I zj^KjzxG#s8=9~%~zU*^xOK*KHxe`uQv)X@2kAG>pOqp9^t3(vFz}IFScXbrm>A01F zdx5W+;CF4lUW1Ki-=6iOo(JvDBEu{bS(Ty zSK(OTiVIpkH+VVjU>M|aZx~cvFZ-p0=Ag{)91$x73VGoFK5zx zGuq_abhK2}*W622%%SfOYcyn?V{o%Hb`zH@SSi_dgO@y+jcKV`;kkT?S*J1(KJ6gn}m}JJHSvM{@W3=Ce8DjNY;Rs;_3} z7V?i{)_u?TdB^AMiV4lV12~%eQomHwbGV+HOJ9l0v=>F*-F=gjR$D4tG&-IOb+_bPHhRVkBla;89F3Nu`-mo9-|?YrubPL$ zg0cOrOLVDdk;8`LZd|q$^rM0ti1%3i5pVF}1K~P4`+O5R-JX?xqSu1due&<>vF}H@ z+*cu$jNItcEL-oVb$63`4b&s0Uu7!3KTr(A9jYcV8>;62B+!a2$4&Y`V`8UV=*8unYwGLsMp_Sw#p*L4osUrG6*)wm+xfib6uVYdd1q@9<*BdT{MC=_)a1| zA!$*r4SbC0x3|r!|339P_xt58HLNHAa2=g0z4iiEdJT=M?26R4$fKI>_46K;&d%T0z(>GIPZD)IsUB}<$o0!+PzcM*LKbK%6_(mds zmFn(-br~>Z=6~}Zo-X6XP^&Y}Y2rYfGj;yQSDxbYi;U2ur4bZu#>=36OV-&F)BBNq zsy@9}FIapI-F)f{FV-#;yxNp~amn84r?XdltRsdRe(Fk*cku71Rl8yr z`&wzpi!9+1ARAj6qv27DCIHWMNm<)uLA{)~f8;Y@6S62H`-#dG+hbDtlTqTTaG~bI zvz`n8_MvlE!aGB(Gk@Bkm0Hp>kJ(ej2Q7ql{may%7{A1gfYzcI-^4}k)t{%>uaQ<( zTttl)*&iuWgRYjKepR=7=*{;^2u+lVQ~ijTh)azLMdfmNyPXo)wO&+Y>@ytdU7{t^ zkIe|bTZTilWT>3kp8FhQn3PN&VBu+qeQ$rOKO>0%)qvXU)~G26+T7}-I!Q*rH%J@4DzDFV z;H*B9U>$weFPqok^M1;LN@F~!F1A85n!YDdt7pf_mOY-*Z?*iDnq-S@{$l-k0m5&k zpsE(ZimHfj?2A|izv;KjM7$-WQQtf0yP|GMeQ>P>?^+nA@L(RF(8_6+Z4$c}O4?p> zRuxv~W0;33Ko5cuEE@)Rd#y^GZTVhER(3hePc}tJ%+I_SZ{*ti^^;Zu^nPU%VlYTZ z&&4os5sIawVRxhMv0P$Mht^T0_Ct=?a2nB2qR#Ldr|d|lG>>N^eS3s|nTQeoxtGJU z@}#8Wn>=jIBTrUJVgK!kATq^}a+4n-C$5DHX#QCQD$wtRhCZ04#~%WgD47KDYUT(NncttNnD19yeW}+^&-WjgbEI3{j5i7kI7b+TG z^JeduY*U~f?1=Xa5C0<UQ+8SuwRPyKBl*arvhaC^fdzSXZS)S>RUEuAl z-3`v%aD~1@ZNsm_rw;a4M`Nq+*!)?CeKAz6K(CN7yc5n%t_R~|y03e|(t9&+ne5>d zn^bzi<8-bSZw4ikiKq3US72i^ zymQ12`!si{dm3}Yp_O0}?lMC_P@oKze%f2umlZ00>Cy9TRNY=XR_$i&qHR3pcs&#L z^5c)!xgE`~Q+BvI4*2RG2npN8k73bmdm!uuNJ1dWUHAFe1lLTr8%Pf6QKAY99xrP^c#aP%ZO0+f* zRzy-1L>KCcKj^BPXVUiS{a4vH&=sXlIHR~Hv(~S^sGWbt+O)C|Z2RDp#T*7#N@(5` zzwag}>NOQ#R!T4Yvf+g>`%6rv!RIP!ix1FCuUn@jpoKsxgl(glB zSZz}M2IbSS-sPR=4P6F?#n@ZjPfOk{PRq27`dN#w#6de#j+~kbrPuL3uLrCMyofKy zek=+L%H+}};r2Rmbzr$Z5dF4i`sp?%#G{o>v70=y5BaTY8BsoZ)Mkg-s>`sxZNqb@ z1=BUvsgCfy*VG*AK3i~{bd9#ZoE`K;vdY_IyI|l4WoGcS>9F+Bx;~1ShyG#N&*)DA zFK8T~ky%Ue44i39vCJgH(N5>y2K-|eS}M0JNE1Y~iM?l?rifO&y=@|;lMp0n|NN^)z6sd{!5l*HHhbhk-E#k z#z)qb(Q;G~r$>wBWg5D6`YLA{farV_91-+sX)PrHQfkx}C z)Cv2Stj7k&4FyO_%%-fEFMh?%Fvc=EG+&}MTDZBwe{r+VAV zfX-EK!5v&A9KVF%myU=XkhdZ|Vs%OKe@_GK4J)+09 z?FVtaddGnwQMYVf#k4RXg@i<`8go4xBC-&5ls*h&7}+@8k<7YJ38}u^S90PA)5w-sgFd zzGJpC?zeFUvy*tIW++OR`n#YPb`d^do1Ze$8b{3$3v5l$@l9aU*#jr~6iuPkiqoI0 z?khvaiKY!u?A{JUtQX_YM=ML+eRd~i5eT-8jm=qD%lYWvEPrg}n3{67ihR9s z6Wd17pf8S9eEj5Hwby48`B)> z8S!dLrb8|AEAFp-DDrCm}?bxhD}%*ba!yX{?l&ea;->%tqV z=&|MF*ww*RLGhjMu}^BKb&KB9mK1Fxl=-0_h(cb*7Bs@KGBOx{hcD2Fs`?K6Ir&-@2#emjs0HQDOE3mP_8 zN*f!~L33-rrE^+DnC+P6p|cpyRm0`vLh**jb-Ps>1e*c2EhGXJEGC13E6?ZEXW`0s z5S`=Ywx{uNpZkuVb(x=D%7nYGpgIr6I){JdGDtvdg{iGGh)?Q#ZZeauE%17D-?0i& z29=|Qc>B$(mr3ob^2V-9xMmPR1scm@YLE2Fg&m`{okX7dfWu9v2j~OLEV?&=`bBI5 ztd+W3e#GgwM8{)cIdr7nry@4M2lV8@mnc`8Lg33 zAxB+WGIxfmZodK~`7vEI4Vh;fBzxpY`i+liWaR6x@%Aci4$NR~Lku10gnnGRv_iH8ErytIHG;a2me%od#`PZW6+1qJ2XA6@m zZBH{s=o2@sm>2|ho=r)YihKC@rDj>)v(o%zOPJ|9tY-=PYVh^Ao5>kRs>6ObsYP!I z5{}|Hu#i*6EQq?FbJw_$f@5nIXr@Q#Q}uuZwS%39mwLcXEge22`UK^0befI**<#dHw`bh@=m+% z^P|{U!h|`MJXws*F!64XhJPaF!LlY9#%!@T<`?t5zNsd42lF}nOl1$1-9;ODfs(iB z(%r#{kwx>NZ__QVJbbW1e#@);jHOu?Re!3z8jipvX&P`+RT&P1XGj}QH zSGJ0|y^zsAY45rmBW#^>suug^$c|>qL_&ilU89phRM*xVqT+CyMZZrYR$n^M@QujW zFbS{xgHh$w*;I8<$Ch6F9$B?end^=cS&NPRE9816{Ms%OE8S18Cg?P_rZO8>r08WK zir*s?TR0S6K}j(cG4DAibhUZzIH#WJ zpIL`AciEUcyh&^-&{<(j54ALUF5%W;?*4@Won4@{%*?Hm5GanSk zv1KhKS~cg$*DU?p1ss*0^K#WQu1!6N5|h&*nrQ}6ZdHzZ-pUx(cn#u%;Pl2W(4c=nJMI$!76Z9tO08%{322p1s(u_e`jSh{iI_Nj&XUIdgIUTiEmpKy%NC#>@iNyr`l$f+M( zge)@x#_&?b{eNE}yosKu2gLb%T&LEO{wi!0_fJ|S46f2 zo6f8EWEuRcx-Gvd>>j3zp5?GkVjedecM;H8x@jtna^rCQ^R+WZxhDaf>!vo+Z;Va~ z+|NZn3&31ATe7W>wt{iy;jxdlg3WMf=Hd8t9WX9itACG&%G|&7FEce|LkI%+teY)Y z6`v`{h-7@GV9n84c!_`_qX=0P5q4jEw{7={kR-j_vvelcu=vvC@Ati7x+t%4YXw;X z!^wf*y5jtjW>~`fp4%m)){zgyb)>6ZN1_7|_pc*`&K(~Lpo%8%<^h-h#28e?0f=q+ zkww0a%zr_YS|nfp^-kQvtC#A^4ns{>tJ;6K+Gqr<;~VKJnI2KFVDWL>(X>zLGj7kg zd7Jeg;_DUnvCIOK94J}eS8Y1;dres-Cfk{Kh{|UvdWQJ1ueM>yMkqv}yEaI2i~>jZ zgYJ(-(7mN~+DMHvpgTGf@AjZOeElOrZr(1y_kYs`!21&scyEajCPFrLZ(t&1i;ZvD z=@)lPpj7?d;CiKml=dr+7UL3(?O!3i>RFfq*vc#4wAyDrki}6q+4bK zQbG)^wp>gcW6OYqD8{zRLE1f2A%6Z$!p~~!7sbR|#`rmow=5tf&%*8oX!AC$SoY!4 z1AmYykC=~s72V{xXU)b6gm_tPxicmNGM)-?2xKW<&OW@qa0QPSqvUW@*_xAkbEfJ| zCB;J|um}QT=Z%BjdL^r8ZvC=hRGc&rSD-cGA5$?-li((#qtFMqEKlQ|H){jQ9q=4w40&SygcLg=lw^w|=k zC=2{@6k`?e4pmP%jU~`j4F2VMm{sbjT59(DIqjABDpPN`6DaMha1|(TN3Lz@^)cBb zY0WE#PAUBHwTM5qeBBa;D8mnBlzde(I@j0bYkO*Ci~2P)Lh_3l{|j-4@EmNbvwszo zaBij77j(4rlw3dU*Uu?w{YKn-ZTe&n;1Hf~R~@kiOUI)s1Q2%vV1&0bLiP&%YADb#n{dueWH|6CbG1+rnTAqb*G3HQS0O+tSIlbh0g-)|Q^8b#*;g z+?P~6+8Re&<7jIf*BYsy_J348tYb_CZ40d}bhgm%sk&Ed8~Zis92Jx;Xj^FaRNeM# z)$QtUOa)~N+7=3{e){{{m#^Nwe*1>XFJCE|(o5yP`Hc};`t-S_M`^9o&~r=A({_V< zN0&ICww9i(wa#nwuBCUgd)HATn)O`|w7Hf?D);uLpa1gnAHRC@_J3bqeg63T>gzXu zf4fYT#~=Ru=Qs2qe|&=uXkWdU`_dncP3Q~mG|-<8c`T=AKTEwa{3MR0|CPDc2Y3{gG;+ZXc-@>hBS? z+?__$a(^08%LC0B`twK=h5kI9M%40rny3~Ul8I{R6(WdVdVhVIs1_2IiE1HjF;Oj~ zD<-OiG{r=r zeIbdRsTPvgnQ9?vC526YJNirY4E-M#LAC1G2*KU2e}pKH&HU=&_1`{t^TS{M?JXwi zD`;eV^UoS-Sbu(e{g+=)?P71ZzyJB~|FWzKC-n#O(en>KzJa({p{0*Lef`%rj1x$^ zED!Cg58uB2@rOU&{q&a~-<+CPpZxIauhb-?>z}Z{Pg&TRgqf^ydZQA5V4Giwk6Q-7aS6A(K)8WTIUCTXP4s=}eITzvaCBu&XGJouz?l`_j2ChePsPpP0ZztEP zVy&`Tw3JfxC9U%cKcWRtp%!?7C4kIjWK=ytPSb&^4uOi z#`f%Ee~fdK)-}g?yEq;HxIOo{Iezhqj|&#`Wq&wcFS<-a-h<{y-pd~Jv(Ha|e*NRG zZ>aFeiT356oSOgLsD2>zwLGoe47~dJZ_6*s_Xwn6ZALG8M-Mo+?j1>w%V*XqLO8SA zO(*~zx0_HSy>q(>HPJiUO|?4)!RI{e*KMZcPQ{+x5kcLlh-gz~p4~?~S={0tds}tw z>wij|_(QO@%@o|Jf|HIq6%twnwusp|!X_*d-Zn#7ysKO*$89Sk9*PslkcaAv^!05MOT-*mh0qUK}f!CU!3_ zoFKa_6|6iA1uGx{MF0odAAyNg~93Asq(y}IKnQrq-rKo-~l3MWf?OwYYa?uodhkws? zmUVwa>yxf4Vdm4U3w^ed77Fyv_;^y_(P*=xz;MtuMS+vQn@n2Gm#5Z9(#zAs(Obu^ zv53&yI_BodH7NnpgU3H-$316GQyoAZE&>x+ZWbbOwWRn~52YY5E&U~d7&{Um{Czqp zR5+0UfvTt7vI0j&J6r`O9(WN{{C~XR9ajNUu=?E5_b~L_J)Cgz`pX^N2d0;M`W;Lu z55oy5i(Ve)6LMy}JUpBbP5tul9P^cq1EYE#dlF!}?(vcS;`1l^i_f1;*xbugzv0F# zCkDRr{)Dl7c?RzZzLS23=XxH_JSdD1&on_`g?OHg>+;LFyH ztUW$W>Kktsb4@^+at6e`mP5<;`(*2C`df{Ct9fr_U{bS@xyi=@sEysafeS8Bahm}MJO-p}4 zguwED=ZrDPVE6KHXK2%x#~VloYbeW+!k6_@0c);+QJuR?Lo0+kgnzSb2$O0@q0>s% zX-A>cHJuAxZX37-oGJ8%-km9QMenXdp+8E!wLL+;>q`93yDs!UFU^i}ogKq%IP&}* z9Alr&PZ{g4?a}F7SCF8+>q5`^0tex3u<54fvRNymb!E#UbWPaWJ~~0E>mpD4!sezU zdp+tav0V)~&su%h9;l2GwE1Nh8 zF?^A>!rL>jyEu;%f%H%e<2+6kv*x(hQFq9NvhQuh`(%-fU!g)sh}H+<=234&tHin( zWr@P6*5!ueVhTS{X}smDZn!QV_>w!+3QeIpjb%JB-XBVA(|`5^@~$MUQWvFFD&xf^ zTk>y3tlw2eG;~q!q?(9^tAh5nIWeF;_qYf9>K?vTY1xfzP7IIR#xC@@broLy+w-pM zt1tTMDXu_34i6`#=*n?C6QStTX*?62AgS)DQ{a+*-y3cCa(}opR@bt-=$x*3_@+ri&z0s} zLmPa4a}7#Z!VsKnf*c<}-h<(MJ~Nsao9SW0SgsDHma%kJp@6AGyYAWzLrJ&2dpbL$ zItG&7KRj;8c*{J7%p!gNG{?;1!X(~I2s+jwHMjG-=6_sSA{(qM+%kHh>sa^H{5Jji z4yqdm=v6+UJnkPh#vhWqhvOOMj&)?su|@xdLTYXn4tDrZ_pIUBGsq6hP+v+h*OI4t zreWt*`52iCYI0lHSBXbq*0r|$wX=fj`&u#l@P)Nr z!PV>B#~UtdN4|=i%$hRrxP^IEleZmoe`|o*{sgfc^iqw9JLywwdkl-`pwQ5uLp@lA8WH9bsdLKYsDSx|fA7ikJhkKQKK6`vWP9iqyt)D7sqY^h39n!bc<47|{OTbexd9`@Lo?)j=;muP zfrOTt+miJoOV;Ob<^fuQqhnVd)^eshdC^twtwZ}F)Yin~C7e17Gg3`GZGXZvRv&iw zeviZ1N(o=@@gcTWMyW?2tR3UKZiN^YpMGQAG*(R}?7|AwZQ_VV)|ipoCSPATtQ@Sm zkt5BmVbn$)SOck3Bi4Qlb#dpWcRH}edhf5(`5hTlN7id!KK?UUxekiuL!1gX5 z0e>fJqhWPBNjA3VvOiu60ursp;kKE(l*voXadfdj&F|&4#obVo&9p|QL z5Bi4XweuS0nvd^06MLS*);HLXn(;Cvtn77)*bE~-9EH5{NY>u5@=0gH)7mQn;&Y*t z-xbl>H!RhhgC@sKU(Os63|h4vVvTrO?SBy7Ng2L5;+z%3+9Ry}ArT!F*%t!4f{QQ- zqo=63_ruxVVADZC*dB*>ZGY$+mi^A{oDNIRBt{3YR$SlNzdC0VXVbMuxvVzby~f=2 zNR}Yb34iZT$$+P7+ioKBeiRrLW;es{?kjA*ftaVVp@jifq3svFdEahqz^m?bS%1`m zfGn3SZ4Jx{PYlS~gl#G)8@RRV;K(+7Q=4$F@=+WNeRpGXix*?FP9JA{u|^jwcy1tV z8oV{9SCkGfVQg6j==hFjjV(DM{y1yjHh}5)hi7x~<*g-$+nV%5UE#7R=?UlL4DKD2 zy)!*cr1SOJEJdo{M$6MX1W7mU9e=?+mk>ZtaB{GS^)mC)v)p0*mS^u{ufixFZr_Jn zysk9AeTtM4w$?9_toK`1w2!mi$6Qn&`W@=x#-~}03rUqS!f6jJwVz(RycK19>&`Z0 z^Q?r+QNLv^yMj{)dV37ve%4a-1K$o0KWItsZ7%L&^BM1p9uTJKaS7;u*?$<67Xh|) zyu~PvbV;<0w_x$@V(dL7wxQGmM;vNw7?Ql~BfA-MNkY6olr}m2mI>|RGXxm%j?NGu zELs?g6kB+T`YsTP*hG|+noWDs2NJxT_d+|n%q|sKk zfpB^!V?{^^cArk}P#8GpHi#A(y|E^-N}i`W!epOcFco5rnPLNm6rEvY8|@m_`Y zppPV~y5HC;dY5-b)Pc=umz||?R+eqF&+RtI{kW>t zpkpmL^wVKrEIPpfAfbgP8(Fd*5E5E^f(R0YyuQ+bFcY;iNIgI9)T1;i{OtRGH4Y;qnez9biK! z*X3b7(Im2JEWLVs@3A4)IcE3jr%#0o0F$uo_^x1`lJXS&@qadr5pi_RHbE;-?-H5m z5w>b)n-~F3Tv*IVYp9E%*Cd6#OHH6B+7H1AcFU6)qmPb#`Y^b@ap@|HMh zX-LV|gNU2AgyWL5EF)V6m~7QrmI;;3BU!`Jw!D_tjLK`v{ z(SOl<;G-)_aLz=>vPA}5-z z*t3g$;`BC>d*xAI-S3ju7JR|{u5@pnzeT#sE_t-nE7$Ho?RlCpT(JbkNzCKaZC%CZ z2!F?PV=Rl!DNI69cFu(499uJtHQmT9?CBO9HIVzSPkj?U&ps|UAuyS&Yu(mEe~ulS zVq$d;9h@-KtPVXq(y`NdvrQG8lZe-hrMjmcmn_0J} zyog@Ymxqf+v!R`fhk!fb5H@^lJFQ2EO@9>F(O-PO247mw5NqAFL5enjI~luXgA!M3 z?_z5|dJu+&b*IWLEXTQ1t-czbgOBycpzpddh`e@z^~m@+K5hc+SKkU3bQ%VgT2GrG zhT8f**kDe38lUrZpx;01jn4yuJG&DE^X0iu`#?a(o)4c?L&G|ArO1XJM}As%mb3m^$4dk2mzCQgAD$jMe@vfv_}=PkS$(A5Dlqu&-nn(H z=^R$?t~K<2b@K8wP2lpi2%3$+hkwJDCagezND7=ESQvm0X{1p?z&QbyC?MZSW#}!4 z&!0B_V5xxmR3LqrL_G|ow}JD4znDv+Zj-0mwaczmHs3@LK%ev{qx(KJadu`69gC#6 zNV4AL1MML>&yC=3W&-XHpItVEr9ZoJ6zyfR>$(rXX4%QHHr@!0BxWt?MOE%}1ZtN3vW}}J1U0v%X&P6RbLOPBmDvOD?dFB$9rBCF2 zSKDvJI!-*mv@^;rmnSwWxPPxtB{ka)+t$X^Kx_$Xqf`T>mN3Tb!HBygdE8US)-R6i zN?z&znE8mSA=z|JWrU^hzlo=oX0QJnzODW*8B=8N#M0akFRE!PPj33Zi!40npCqks z60w<>37<)DzTG(64!Xo9Y*U_WmZN%3Pk6p`&+$gC^RG5nMVmJOs`MSP`TR}O8>Tj?iAT@zNaJ;^KnHUB?t#d&0`ig-kGdYu<8bHh(v(jk&apu#LS06Wln4 zSmCiBIy=D+mr9qy?&oBVLIy(KC{eEs*j>c2p5XP5&GhuIjrm^5UoW&bhyeE)VJRmo z%MS~(9R&zSLTSUwtuTg}TG!P9#Oe4X5XNEPaCjPLNFak4)*AvjJl)I^$U!Dn8=f9y zsXhyPNF1-mPJc%jui@&BAP$INM*!Olt9I41Mmf>gc7i+i%k#s{2;r6uoy{>7w@KOV zo8pe|3N~~$Pcpqn?07-i6^6~b=4h^3aW#-J5zvW@udDHtOG|GT_eEo_%knw#Zjja@ zGC*0UhQ)BS&fmj@sUYVIL&M+r6vG}3b-~oMN(?TwpMUOYHS3%SgO-lLWz5jDf(+fc z79^2zCJb6n2A9p?GNZ+#)LVMXmk!aXCtc+DH4NdYC#A=?#k7P>LFV>wdvY^G!g9T(Tb}Rfjhg0 z@p`ZAY|Z8u57`sFC2so?Q-{rY*og)?r;#_ zvo7yBfqRekgFQ>==4bP9l&p4)~G*Q;zl284d%o)aL>+5$+kS4MqKcsg`oAn-c zoUqO6NMDb`c{{vjXj?hn<9nB-m2yDnni|4)!}U+VTDw(ZV%bEB9I<+ip0Iw`Yid+$ z_J6Y8_m0?u7yje%Bfzp*xjoM{qa-}?hd-Zep?lV@Us>$4xg;=?So>q>_`Zg#-1y9@ zVVJoN&T$sUd!lyKp`)W}x{2O7s-~Oi-I=OssOuZ|PSHD;$b#g2n67g^(D!1OY@p+? zgywBooOqi(2iZ#soZcj-syvgE|5kd>Ie)cqJ_@<*#q~BS@-HMOn^NYhwC}F=tTpY%T6dt9rhol#+qn$f9ks?8jca!XwTEc%MA1dPK-NYiGtbw~8*cA|IA1WrBIwSL+>W07kcBXRM92Z+?0-*WoCUJmURoJE~WXd z+wi;>Za72Lb&~*i2d`W2lyX*%bv9kR^lYF%Sfu;Vp>%a2U81og`p$XJ;eYezlR_&= zg~o@pgvkJ`_X~dioIboIdLv++vsm2OPm9c8do)!cr z-uA4ftaEQ7`-96}Vna}z^KL53L+Z4ko19-W7I>b9+*NZ`Ta?7kum0dkTHY>Mj-JQK zP*HEFQcg_qNIoZjuF`LEi~9jjSCk^o?He3XYx__MAx)u?cR zgMQFa5WBG|*wvitYtI!GMo0ODMqY~w12pIkX$w%GJH^qWz(Bpa7z&$oCp_YBnWAS@ zNcVjlj;ga$iSeSiK|LW9jAnF(1m=qHI%tShcvIoHv4;amas2l$(sbC{Qn zkg?%dZt1t~hoH1AW;#Mra0`X5M`uDNc|#Hw;uT+4<@NC!d|K)Y1| zaiL@-!DDP-q=@jGs#|#D0ynKqWASbQ;J~V3@eG;feR8%O zd7n4&?4IVj+<$;allW}Zs@DUkk>j7N_u$GyIiPoA9*Xy6dk`RonvYD;z@`TElfka* z^@YcMFI$9QH{i&V)Gi?8f)l#{hwfMX>-4ToE4*^N&VlhZOCRr7Cmk24=0lQDNclKc z(s2#`FW}v{L%Vs5whnzc8RxTb%LdZnFc*ez88+mGcz@hv3l4FX4Z9D|=?)D9zOXnJ zXI-q%;qw-UrSh+aj9kFPxnwZ6Vd6&Ces(9|E+h=Nrq}GMKO}eAMV1Otm{aX5@U{aR zpfESvZ?tD0+0csL3#bbF+#AP7D}qYrq^^pf(mAQCn(3Y6-*iLo+;z|%=cKMsA}*=x zJB3&iyML?rodB`0pSq%S`zXZ8q@#kZnak4h*rYv$NtX|o&51?)--~eLx`cqY0tFEw z>tb^mvaq)36LEK-(Jzjje|6bAdNdpfUrEhb4-*XX?0opHNmG= zIe#XK;8Uyi`VL;RpQnbM=3hxrXgV_dbCqU4|B<(^wDKDqBIJ_&(KXW)dv;;*xVvLq zi9(FUdUPEv?^DBSl`kc%H66Lz_sqVQ#i_RUt_f7V5M661v3d0}Ng$IfPq-{&yt~bE z9N2bk{<{@pN8@g@vEDX%a%xyT_l1PXrhiK}+E;x5#nRPMu2h)Kk8@aE7DwJrSj|CQ z#}jN3_{anp9w8LkwXK~fX$rIy6(}s4Igr@-o^ck-9VrxKhIB^@r2wmSND4AUhDQli z9}#3{pg|b7;#nufk^!GdKzF(-8L%SU0>;aSZti%)4C56Yh=yG$jXU!gH`%Fj}+HjR1OeI>fSCDGM zOssXtKXdZDgqEFHdb1^zkB^WX4*@2we-dqddYf9D$NPL)gLDY!ETfnLc9u!B05A0M z3K&J_7__GBPNnL0mt77oKYwP2g&OKWcQUzdNMAY@Q8$`!l4I%!CAIGOY)!bUZQcjx z|EXgY>5GJ+#;cm$-PsxrIjp8Fd;9>D>YdsgJ76}MhYKJd74a+~it!MZp}-n(Q>e-N z{69%hbG+{Eb?uln5U-jdTo0gGag=9{O(*jUJi9_TWwo#M;BrTK2R3lZIo;I4Dr*b5 zNea7(k1TkU;MI7%9iF%1mLKl2lUuXq+tm3hDex76EuKw_LLzSjj`&ovmrD;X8GnP% zQq%JIAz@v!?nTgZ1BZ7-U8-jbUKDk#p0#^N-Q+CyiZ&5??%X@lWOMJ{k*v?}gTwpO zv+C_m1U*+}3)Y2c)hsU9FpzSqV4?$=!oB=LubzVdS2`R%=8uOP&ZmJ@B)=Dt(jkeC zSBSKNBHwpQI;~C!91Yy&96Sh)zJCefg7fYVFs%y{T}{RztO(t??B>qG3K()8hYgJI z^x5$v&FZJ$Nw8ozVm}>(2(P~2zL%af-~v{tIM8i1xvht`g^qk-^j%v z&Y3{Yy8t)Hmj~@aQY}LhnL@%SJS$23k)X#*6nkve_Yw#h4sk-rZm$mSibRpMW_%~@ ztA^`_;TPjEI}srI{l=lo%J`!7R&;fI$Fa7LZza?;+`^%q6uq7t`hhWI8r(Zto}II^ znhAPNlY2)1befl~5HB`=Qgkk9;L{#5-8KNqnXp#QrJ7T*-XFK&Rwj1y@s$Xoj?A~` zgD6%4_EIdhhvP;dDr8(jKcY3SDez5L&pZ$Rxjikrv$-VT9fkXJ-YS>*Mf3USR1t9Cw- z5LbUlf;%Y~@n&X!tXgp8gdzd1GGHp1_vzh&rcgxawt$6a=0;#Jp zLQ!rH7FivC-{K8e^?dBIkSraW`~O*p8;RYh1DHG9;}I3stGkOZ-71ZlCufgBv?5_;q-*f zCy+wmHr09P&pi0YUPejLY;vr1<#43jO2)YZj#eaM^^)7KCdj(mBnzB}{Gq8K5@|2x z46geCEUPFc(Q0p&>pdV4eSEcK=;Kqla_KWJJaI8`A=pl^%sOf!>sv%^#lFVvq8(6x)}$6fbvwQR`9iCzP}+wXW2;QopNy?dsC5E^C2BX>g@|?N_Uf z7NyyiRzEeAlq>07^*658#?{)mTAN9`QoE=A*;YE+I%iwuyw*sCuB_@32;Tz@I4Iu3 zfaeV0J)Dso%}aPlJAkYP9H#APUV{C4cpt(qWl z?m_;U^OoKsdIRVV*K2&{`Hv+;-yRZmQJTKv_#UbE7iy1)I|vST_0MYGx#L+;o%JMe z=7dx>k8m@SqDk!d}P3;JF+VIkUJ4dk+ZqvP^SP8f3 z{(T6nppMQvV}&40A95bz3M+1jAn57qeXR6VNuw1zSZk?|MD5NT3S)XYb1gQj^um!G z-%Bd*PZUB=eMGoHy=9s`w#v&so6D0Ho}BIs(g}p+&Z)Az|B9Ua!v}A5UKNd9-Y+SH zO!`QV3_nJfqeXXrA9`6HMzXG%s~sU1Mq*)7m=!HN`T(EFgQsRYk3pXtm*6eu&n5NF(udIr!~&ZoB#HJiE2`G^*eEH^b2jRK_Wbj zn}Zpso~L<(r+|SEx9ZSiuy#N(0h_)>pvU%XOx3~c<-k#Yhpm9KKX>p~ccfPbM&FTM z9U}D{>D5EKz7J6!)a!XSuLx8fnaAHhiD)M!A!cn)9`|UM&0x8-<{-OFMrlPuk}dFO zT;|se<`1jvelIScS7jX5L9-mdouiK@@0mAh_F4v3J=4^~)$M;stYMbAQK=Iu~ zcHE#ZScCe1_u|&#x*iz5GoQ~+t*64VI-me*^_9nmhO2DrpBox^g|1p8N}Llys>HEP z?%=wG%{UvCscrW|bYAEgdck|I-Q77Y&-;Cd`k;LN0IVmSRTK-P^A>p$EGK_DfXr$z8|aWa z7|8}UtShbyZC#Cdw=v$)XtVZ;FGQ$xM3R4BBbDQ)O5o(qj2ZpIkX$^9B@4s-vW;^x z8PnrPb-gp9H*X`zIm_yYAV5E7e}CbJGIn4`Sy_A*#6!4+e9hq#r4q3_$92c(4)!U{OlWiZ;P;1n-IJ)X8+6e%uQ?*w zzi41yd@|8>`sreGbAg?C6}2^N&ExKW!|)qxKS?m5rRSk0#m|Q4q_zo`kjoHp?tpW< z#0FtJA=4T$tRY^tM(!1#`g!nf9gj~U$r2u-b6|6eqZc$(fWwU%hpag>sD`hlBl}vQ zct`fN!19jlBaEuuLBsDBZ}Nu-d?4Y?=EzJK@5DyLXU=~S*XQd}7v91gBmh}|!|_*B zk(UL+Ciz$u-0DbUmsFbzC-6^p)}D}XTH$+gDP4^Q&b6xbkEC?A;Z>KU_PoxAHH^Hy z5p}_5w|^Fw$m>!UewL2~)CaI=U8_7tM9X$Nr>-Dc6U1HOh@M}Cbf z$>A0kI3+&_CqQE#*PKs+#&+X>UNieXEJFRp{AV%Ojr=G1wEd$0WOLoH1vVX$kH-Bi z9viRhnUF1RS^$%^2rnBx3_$nn5RVUaiW$u?vN(V)p+B8d57wW~LJiLeVndO6+sTdE zu;B@z>z4Jqvk)Z=)W5MG9)I@0qX<>58^_>@jODiZz5eQ6d(OjjlQbBAc;c+HVzh_9 zMI3=fUpQQ*!L&LftOnoexJ3=t)p3g&)Vt#r394xQUc?b7{w#uf0nat_A#ntL`UO_w zy@SkeO7S`SrPOaU!>@YSn7^iveEvea#IM|(UCQ15($XKRanJ=6CiaWg%oKX&fZ3U! zH?d`W9zz@)_Hx(7nOGfvR0t_wn~lZnOOGE_KIy)6RBSUJauS2T!gEV|fbLhmwmP|+ z?+nU;$1~7R#8fz(7;+oUivOYPDy~o^sz5#yMtY-U0 zT%4~<;&AJ*Pty8lEv!R*=2ycJSx16*#y-ABTUNPA&ZW(KDS>h2Ctw*}$uqQ>4?Lpd zLWssDFtL(VZ5~}M@pM5q1(x{w1K<2y7m_`7Rbf_X*+V6NQmIi^I9QssFpS-G+tgrt z>fl|#NrqVsowsG^akRp}Fm1Ghd&d1P%yM{hbE)D_y^s#80@E{S^7#*EDX8AxnA40!6 zR?BVpy_L_4!e(rmYU_)_0=FB83rlTChXgm%bq@gXkXpexAgk8PdyTIn7mkn*zHZRN zEKl%}2(E4su|hCNJ8QUVIs~1%caT)a;57pRP~AItS~&)<0T<0htn?ti$9IOb`13A) zDy&Nt`1u*L{O;*E(J_`7<6q6rs|Ahk}T)z3;)&INESpa31Z@7-`4yLF1$7sR_le&ZhQw;tWH4_QN4;k&Lm3JA*SZI!O*aQ6HgMp9B&b!(jY+A(RB@f zw5_A-8so_zQgW}JP3OBe$j)S+bT;O`44#yN^jA!gcVjN!hVt5~z%M1(e_F#tknX`L zs)XN(T?wr#d!V44)P{Khcm;I4)bimzccMbMbXRocC&*_4jL_hL?$)ek4A0Cg)p=`x zL?R8*@zOEp^9Dvb?b40Om7joJFdwCV{pWaHp3?UfS$TgiTUFrD!P`P_Fxadrc#w9X zt_ZWhnR1@o2+)|r3%Iq5kWYLMZ&Yy;+ZEZwZoqs6?XBf^WoIJx#riM@N-T1-4}6wy;=%;Xzs zCo&x3FCeks?}G2v{81raOFNw5K;QjvGZVR~uH>-4dAUJ16XjO0jtXIpg@j{IXo86n2U##s>b`G4!|}6?KT6{Z5w=~|?cU3}YbCi~VRZq!~ z-M~M}E!Nh8YaQopoVRtHw>)+reo^}25KXRDmniS;y2rSYKb7WBJo)VZZ|~ZcZvg5$28R1f^nmXaAfGi)DLZyIA&+9^S^fo#Q-jRu{ln1k1Juk{!q=7bX zXl+Rl8J*_It(Lui<8%4rh%Y#JA)zH5K|z33r2q)UYR>uTB@&VXvj_IBP5ku%cW2W` z?SBwjW3q_ISoV1`r`1l2!4P60v_ko5zW6Ix+wY)N+BRKBA*#qyuNhx)AxXU^dXb!b zj!-2zOl)E?m&!C=29_^koUBg)1=xP|A}P5Jh{Dn&bqC6Sh_6N|Jja|6F`gc^7phjI z*-%+P7rpel-t@AhoDv%aZ^WkvDzrg!0@?``HIO4Kv1NRbiX z>RAbwPAJafL6(1aeD|2|MerCQT|WpOa~prbf%V_f;#-U6()O%bbBf&7ww3M+sv}Gx ziv=F}iil@_B6yrPbEZWcaH#V|Lab8^ID*y6;1p8Z^LzP4Td>7X4lVTps2!}P-3v(ivPe=o% zP=+{S8(6Cd`eX5@e6Ja)yL+M*X&EBvc>2N8Na0bw9n2#MBdL8kka?egZwGTKVI37A zbv(D>C{Fpy;=uxei=}1U;w+k$XdFIjnsVa663zJ5>>&g7HnD(D#hU4VO29|W>L~k$ z8EX@NnWK97-BYnPP-+dHs9Cc<`HGTZwgA0;F8hCUD=R0G0SVZAAJ_^+V&P}v!5@qmfZ z7!QP;LabYfRH2#iJv+qQK{anU*_YRlQ2Jzli8k&?8v*1=J_|3X(c>&b6_|+YLkesG z&XNk~IvmeeY&tG+u12WA?hvsSCQHJLX^iTy0?#!|3wdFLs(pgU!CJeFUEf*D!#ldg zh7g_7gpDH>cs$r(qI2_$rh>SKP9wq2obP$@iv&CKc}4laPC;a4gi0i*b2YVAeDOVh zmnW=##)X7o^W}Zxos}TkH$mo}EoEJPLSi%R?54=5w+GQ+ zKMXuR{SJ;U|6JNpyduyPl*+1jm73FkbAW?Mdjo11z2v=&G-)C6V~52u=(h%v-6W3O z6{%x!dH{pnvC3`EmyDcCSSz2mFk-X}#t7T#)A7R;28!B}x}Y8*-W;eAUdFKAC#5j* z2;~<+64M5_w3DN4T7}@C5tzn-wPE;ZR*zLXm9=eUHEU{hb!X5rWzYPdMQAyHFMs5d zL$DzxOB97+(eewJFK+osM3Dz2g^~09F{HNgNxldv(gFbB26v{#*n0lff}>pqkQ>rB zb1Ye)*v55B!!wj>CZmcd1}%}?Xj!nJV0h19HY7!aB|Pl9_rU9{`3Ed-PhL5^bx32RJ2``%dn&U1BMWmr#H6zLgHJ1h?#TQ zyi^6-2tx`7wW|xYxcL(6k&vqA>jp}%UB5f= z6CBdGjap`@E7AyTC)dL-Aw5cwQX<<6J4^N2hlf&uQmJkDmRpPY{OI0>R7kyTyZkm( z?BV)M+=lZKG@NklybUBLX8T8&boT5MQ!}%Dxq_LWfOW8+Na#LWq@#e40fvx&Hy@7x zKg4)`exjf43;DfRn1LsM6CK@mFdXk20B|8%q7%J`AX*T;_m&_;Z_$Ysy<1&EqL=6- z1W}Ku$LTFNiF(od38!A%Ij8)5e>3~XXWwULci)|NXZD?W-{&dTGOJP^^XBSE4}SP) z<}sz_n5SVWCE`OO50&(XP`4*eHDQRWM5!}7X z`G>8T{xbGgAJv{&{G{MuHed-jpo$e7lqU{EYs7qhvPGr)VkN&ApW7>?=0T;k#IsSh z49nJ|DLy0R1y_JVouBz9W>+v(4b7u+`r++aJtglFIt5*g*oeEzZhCO!dX#l;pH64k zdhtSRT}HuRzE)iJQS@1i)!e&H%Q$1nTF0eWUZhFt#RJ!q`ItvKg$(eL($BT0)qk$xUt+Bcy4)xsca93{!~H3fB=^_S#2 z_c`J29+9~Q?w#+u9)tTL%q4B*Ml~5B{ZDHBqwu0$Tz`LFQg*~)_>@0>ltyJBc9bS! z&tQ>tMXKE{A&p-sJPGF){9DV}dso#RsVeHs7#&4UJhiURH*{K9KW@9$gw^j<`D@tP zy`Y<Ef{+J$$D0ww3B$t$In&I?Y5q8?83N@gKMe0tqBKMbZR*7D4!S`m2sfo4pwiN9p0Tl%*A;f-9wD zxPE6V1yJ<~Y5vDDc5E%q?jwxVHwv70Q@vXsNafCl;s-gLjkm!n0how>$vmp&!A$i~ zbOK=BN0j-ju9%}p~o zB+5oL7a);-^oQcRYJrxg-FwacQo@~d6=gCDTAIzwgtKoje~l;O(Q2__3M}eCmaR&b zX1HMSmUTE&O`IUTRHlIqRT)6Zg`-l}&;$4ct$-ShD<;P-O&afA;}9pPy|d)|a`cop{cIyIvaCB3)|B94(^GR>g}a6O~Kd~4?ER$_6wBBh;Rs7;*bh%?z0 z*DFTtERFHNzx{VVwejL)j77A}&sFB78s~98*ftnW;*39+CE7GSJs%Y2q9|sjIjsQ< zC6aEe1}%|PJp!v4o1V=veARn2@2GWSv?+)$gyOUqejjM|C!1)IQ`p8Hk*Jj8uu#OQ zybhq6LKwKdtWP_FZYvQ@DznsdFGUVig+Q$ zI@DVqbs{!PfN_m;@}vC1{#;orW}E>iBi?<4r}lS;bj$bKc(ARj%ERlg-{cQ1^C;~w zWTqSc*!#P#Y7F@9xjaAQ(I8^;7tKASrlU%*ym{m_ll&%wD6Tqn)1#7JO)>A0>Tm&+ zaVZ{;Kl>Bpjq}5jvsfIjaOn#p%6674n!KN8tp>ay+WVoztrVoG$Lh!QJudFn09ORh zsv%{{QwG=4xRHmxrqa(W8lKQDFt|-N zcgQ}c+U&>9UzvNVxp^WKmf$!dB?$~?3R5)sZ8`3IFLd&XzhrIJb$0U7=JRlu?NuaR zFg9{wG~Ezz35+vm6T+Nwl;oYm2Cd)1$$g9#|H=0&JJoTKy_G#A!XRYVxxQ`QP59W# zOFg{51&`6bi#0a(D8roTrXP=7kW-oondyFd#n^i0IL~ORb(c%)mvL)NngGCsZ#hyq z^T_hBfUL&F^@pBoQUmtZI?f;I>%&T{$>^H9^ixi4)9tE>8T9W7T|(M@ah(m)XTLc} zp{$OoiBT$&aUM!z=bv3lVKF3P8d%=u7hn87>->pz#2JdAsExLvG!eFxIMIl+Kn8l? z9MNa-T|Ltco0b`yl$F<}7!?F=^)Aj(YijJY1!1~%ObM<}S~BC8E#JD3l(4tVBn->7 zuwOiDmxNH48VEXk3tqK28dI7OCjD4*``E5{2aRX@^(xuXt|nyesJ!|gys=0wF8Ym~ ze8JDy9|KA*l&jpj47OS>mI0a(XI(6GcFtyNCoS8^*Sg8PhVyR9JODH!+ zz?kIA+2|v(3%j@Oo+94AEUYfTEf9v-ggTd*;~4+5TH@f|wE_dX*MnAMrU?dvRxBp@ z9JU<7SplDU-V6S^pzFH=&~osy(?WFhz431ZS3O*4(m62!?{5B_l}qg(tGc`Ot84=g znFlCyC=2A#U$wXpx>kx7z#kY}iIvq=aQMxa*V(7W6Sotdijg8kr+3_K9n|a^S>?f!9F_twMhxS9`XESIY5;lXX zKrr1DVj$+<`uJT17O_GU1vJTfr~z6(CBvLm;@L_d9w}djBAjyt z(>wc1W~T2=7EOd_I!Q%DtdTFvog809AiUSd_$(ev0ACvMz;zl_|BAvT1Td?HLlqw= zMW`^0lc(&tsvQN@=_1>%X$574FWx6BlM!^#^|!QZF?{-nNpFnYPS)sR?|+o#8abC!TE?V z6Ee5?EAVf76TxfF?W~_SH>)6Ysm0S)vZ$XDSY&AVWPuyLP%kmV%u)Y*rttCm{>kyG zIf&P6mv`K;;?-;1fXmWQc~{8#zYmVj0=kw9R+bBQf;iWHpg}*V&$~jTGhLiTA!(m? zZecZcH5C|Z&tHyGDy*sM3 zHS)bdg7c;O=HTAYyKKF1Ct?H8rO~nOMv6+xaGbxnaW-D^aCv*-cPjIcfbHq5R)epe zM012`bLs9jKmpH&W%2c08v@AkG<{E(l8RJpG57zjl8KM@RWIVK>FKbWo= z0{R0O!Mdx~?Rsb(uDelWv@F(b^NzCyT%y%^aG9#;!wFw83g20b-+o*Z5wX2)2oq?d z`L}XhZ4*0xv!!qTzs~v{l7BaL8}=%;iCkRnE&Nyz zi#&G$=S>L0-;DyjJ=nL8%nK}cfvvhPGyj3&nug0tG{xj>A zbD}H7XS!>o8Is=MKj7iWFQ&ah-*Dhtkze}IYQ(3`l)y=%L|AkQY1Cj?)Byr}DcaJk z1TfQ`KW&yXE;FHJ{oW~YYvP5dcSp*H%vmRbz&*=|q9+nRrcqnZ27wx9O*dozT%V6Y zE{ZlgD=U34>$Z}q&hcl1VMdszHMMbWoj(tzKdqcw<#{i4l5N#$ne0l6+nTx}Yj@kS z)fev~vlH2?ovSIQf15h3vPloJ#CxXhTK$c=hUNq42WG@eOjl;M+QG&7Ee77!i6ROm z(rvY+@ezAEL|0l8!VhL7~Y1}1=F1! zpNgb?vpVX4@Q?^&R@)t?rj91LHodk9!tW?4WZ4;L*8vd?FCYikiu(O1#k@m49}W** zJD5n+IUWqxYVG|^b6qV$Yxx7;+zq8a&+_f=)x(`{O)M9dK+$RZOFOfXkZF{h_JjgI z7z7528{XEn)(^lCbk>Uz#h<4vuQFS(OCrQv+E8MW^J;0{~vBZ`!cC%?f`~k&sr;h2)C33G~ zjl;yl<3p4x=r$5YT2pXdre5oHPtD20)!904=+)LQ>pGHudizJdvfs42(V$&RXDjn1 zeM%eizu%srYQurrnwoRa_XmEvUOLTPO_ygf;QD%r_*Dz@Jr{6xMKeQGXHdh<&!3;l z7OE}Hq;$W|&!O5n1MnlAYyD8bD>XNg+|v(2G`Qjtxd}?bJY*8$lGegTZlO->B6rLM zD+#ONNl1$1;wlR(0cs*DlFBO5A}XR{s?Q|Uq(w!=L{+7fRYf#JG}J|&Nhnw=DERsN zI@x(X2rfKa3VQu$gq855h{1!Mvy`rUAp6M|P?{^^%kRNK*botI?a1m7*B5&d7+8Zw zz;&?x_aN=Ln+GM;<0QlK*y&_m3FqCFwN<9GfzLs{XW{TJMc`kFbkCGW-U>ME&v8-q z(-VCi9sf@Z95g@sl5hiF`dQbY__x{G3}4v@7#3GAS(eUX$j8&kIkQGOO^SJE4^0Ago+xK85CZM5`S9Cbe_v*nLpK@X zdihlR6!aIj{sGwX&9~UwSY%tqByRJnuPcLVy6!P5Hh0(4>{%2Cg1+0vVhc2RLw>Ot znFZJYwot}P%j@!OmD`pY<5i-Dwa}?O3Z`oLcid-#U%l+6q~M zc&@d2FSQ*mq1f8CZylMvErW|O%eJet^0{XXL76$Xj@Q4`&tzsDGjA|kXp_DcFRb6P z_R>OKkH`0}FQ^9YLy)F^x?(i8?lB99ttE}F4@;8?g{9_=KU^=#Nvnqe%Y0MOK}>p` zc0FzY-&9N+FDKiZh703j0!c6JPDaF#wLNr?$&HaT-3n}ulwEuV_XQyRhme_b;->5#hE&sAn^0_$9+b}87wd`&)CMg%gU$_qB(yY=j2h_ zs24&6xoz;S#NbR2<)K);>e3lr0aU@a-kcwI_gvhB-7FWV-I7Ck+~*j%!)lgN*+)PN z=0b`DfJ{Mn>PmUZ717n0oi7#Gyc|JnL#w6dupp7a7F8+7nE8}c~7 zG5VJ3LT}bWUVmR(5ZB+E8cFlq-UR%XU5>{k_A%W~Qd5KPR!Lia^AL~&Vm}DH=f@2S zO#QxedsGD(+d}%<5<;u&ux;m_MG^^@YUevl!{0~Hh&WOVhBO?~lBhnu+t_U#$wh`e z>7Hf^hg0|xVqw_nhjLva9mx?l%zud?!3^5Htj0nseRwalsZdMl(~p*A)0P+J0`e!) zKFuL7L80OLTb&tMlEDDW!e3vl#oj>Se>~(M!snUu>#uyc$g%G!4e=ljgnYfM*&Iw! zgi;xth^Zs(hbN20_al!*O)jByL`-sh=`8$bxnHl zeg#a50ebCSbt{(EQ2I z5#EO9*s zC2B=4+THj3m^;qEo6+Y!{otQd>aWO`6|3sn2_d(Pp19}h5}QJ^ z*m@)3uH|3$K7`?^_~*k4$cp!Pw&t-CBM?EQD*^?Xq}JZZppJ`2Z)+Sb4_^2oyjS#7 zZHg=Eegy*ib1!H?>%vymS;5w!oLlX@=T0a&fOHf z$Z2pTL{I~ixwEGWv#I>Bg24W3Ci%ghUY;kvgkX{#$;fqTs%l}BgZZZBiTg{{Qr9fJWtk4$k>v&)`l`&xrRI63P|ROH79t!ODS zNE^rDrxisLX1ukPd{m!;FGva(5}|OI7=d}`LllnElfl8}rEKEN3a$LxddvKRaN|Zr z7ewBrOnE+F)Bo~4!TGb;H_2@3-P z>6Xd@k7`nC{E_z=-(zE0KMMWr_8yW%j+ibIhUli7!zpGM-=I4gU zQ>TYqr5|Fc%8o`tYh;QyKTG=)A06lMDG(~|D5-*g&m1wm`hd)I1q{1F?bk~lHoXIb z!;{R{lk5KKAd;JgNKWtr{l!rOg7KFf&o?i9TDsL2Hg5*CMDUm8)9OcxX*ixlgFk&? z0_BoZQTM(?&rHHfc0Zi12h{G-Zs&Z`OajRWclH!{4IL@!RV{!uZqePYa{-Le*n#@@ zN++d({<5eFAa{u9q~q|f9^ybY$!!j{on^P!oPY-2m=n?Vt$kr-V5G3xMNAmM3=)=EzK46HvDee6_?cHGddZ_aH%+oOQ$S{~YrUGk`(roK zr|ibspU+^#n1Vs8Ve`fft!8;5Ui?o6^%p%Dwq7IumlVNN8%KUoF2|T0VOs8ruON_i z10+RE+5N^1cU8P(Lf!YfH^nq~UMf=`zN_oAIx|a5n}$9sNiZlxKOgSHJ+p~aCmIUT z|2j!|*KFj$2MuFv%l@x<`b845cvw``n#q!{BS!57d{Jm$qp?Vkk4_3*XN}2u+*a?+v9IEJX~tseHUIGPKDq}9sL{vXI;)h} zd!MS!67;yKlsKTZsnYoU9F}>Z+4HId#G~0AVQ8b22+#b|b)%x{S=m?eH_sMsi|Q-b zasz}DdH_bgmX2Q-)g1;0n6{@4u}}$!5!Su7A>8YIJN#C81%wZfomUjpO4!sVGXM`F z%RVwV*w$?9hx}$W96)4! z7F>+SdNg!`<&~IWJQFw($0zAYv=?)yoWijMMQxz8;RgcXbLs*2Xgd znPqKiOBV7JdnJA6q6Xof`;kY?1JXaeS{V|Vv%9-KZZJF1MWm>v{6rz=BDN0p5x<#t zYnl#QL0$&%;dkf9j}I%^5}yFc0h$L(%}ZAwq0Q}*2hl5486~(4&+XalgO0}SR-f`8 z5*@^^+~O$SgM_hT@9(RQOK(@#-ZV2njZm7hrw#@S^mQpbHKsTN9X}OX<5cT^zV(E@ zt8cok_`jY0vp(A>d6X>68!3J1QKh?Q&QudEtYlU&>*dgQ0*cKC6=E;H9$7^|?XUkW zv^bxvbsmYeu{sCaOxStcOAG-`oFtG;B};$gUwnAfhjLkGdNT1uK6F1F~)jRw;JxuV+nMt}UqbAKCk(0Agxbs6aUKOfSQtcF6 zJo(p9Ix(d6U&=QGf0fY^Qn)OzW8xje_ovh(hi!!{>doD?+><&&l1{%txBa-VAcmpk$ZZ4TX#DCp!CQ5*~P~P(*t8m;I$bPpaS_x6{TAb3I+8ay#w|ZrphQ z^5)J~4>#|;lps<#{sXGnonJdEGw-33d+$G!Ta+nbwY58-`pxw1HHw6~}WwzSx+pHQ{? zcj4j4_)CT{!kC67D4BiFj}$cFu~hs9^X^Z^Q^@|Bv~EDp7+(-Q)S{cWSB7lehyd}E&80J#ofKHBVR)7 zf+MHujvkRA!?aVEMC5wl&K47Pk;2u>F&h|pNu=n10q(mshQ}S4h)LO4O#munzqUIt zhn8esWZ0cqg!o?90f*T}e? z?en=oH+XWz*&t>)!hXw>s0(nh|J#a%K9R5S1Ym j|5W8I!PE4U+~06E>fGGd!ekG{q@<)DaC58cYdrWLPfmzd diff --git a/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs b/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs index ee6eb77..2e68d8a 100644 --- a/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs +++ b/src/JT808.Protocol.Test/MessageBody/JT808_0x8103Test.cs @@ -162,5 +162,7 @@ namespace JT808.Protocol.Test.MessageBody Assert.Equal(customParams, Newtonsoft.Json.JsonConvert.SerializeObject(jT808_0X8103.CustomParamList)); } + + } } diff --git a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs index b7722e5..10c87c7 100644 --- a/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs +++ b/src/JT808.Protocol.Test/MessagePack/JT808MessagePackWriterTest.cs @@ -6,6 +6,7 @@ using System.Text; using Xunit; using System.Buffers; using JT808.Protocol.Enums; +using System.Buffers.Binary; namespace JT808.Protocol.Test.MessagePack { @@ -468,5 +469,16 @@ namespace JT808.Protocol.Test.MessagePack msgpackWriter.Version = JT808Version.JTT2019; Assert.Equal(JT808Version.JTT2019, msgpackWriter.Version); } + + [Fact] + public void WriteInt16Test1() + { + byte[] array1 = new byte[2]; + byte[] array2= new byte[2]; + BinaryPrimitives.WriteInt16BigEndian(array1, -1233); + short a = -1233; + BinaryPrimitives.WriteUInt16BigEndian(array2, (ushort)a); + Assert.Equal(array1, array2); + } } } diff --git a/src/JT808.Protocol/Interfaces/IJT808_2019_Version.cs b/src/JT808.Protocol/Interfaces/IJT808_2019_Version.cs new file mode 100644 index 0000000..aa2ba24 --- /dev/null +++ b/src/JT808.Protocol/Interfaces/IJT808_2019_Version.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace JT808.Protocol.Interfaces +{ + /// + /// 只用来标识2019版本增删改情况 + /// + public interface IJT808_2019_Version + { + } +} diff --git a/src/JT808.Protocol/JT808.Protocol.csproj b/src/JT808.Protocol/JT808.Protocol.csproj index 983c0a7..00607e3 100644 --- a/src/JT808.Protocol/JT808.Protocol.csproj +++ b/src/JT808.Protocol/JT808.Protocol.csproj @@ -65,13 +65,13 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/JT808.Protocol/JT808.Protocol.xml b/src/JT808.Protocol/JT808.Protocol.xml index 5ec4efd..b96303f 100644 --- a/src/JT808.Protocol/JT808.Protocol.xml +++ b/src/JT808.Protocol/JT808.Protocol.xml @@ -1661,6 +1661,11 @@ 注意:处理808的分包读取完流需要先进行转义在进行分包 + + + 只用来标识2019版本增删改情况 + + 消息流水号 @@ -2538,26 +2543,29 @@ 制造商 ID - 5 个字节,终端制造商编码 + 2013版本 5 个字节,终端制造商编码 + 2019版本 11 个字节,终端制造商编码 终端型号 - BYTE[20] - 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 + BYTE[20] 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 + 2019版本 + BYTE[30] 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 终端ID - BYTE[7] - 7 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00” + BYTE[7] 7 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00” + 2019版本 + BYTE[30] 30 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00” - 终端 SIM 卡 ICCID + 终端 SIM 卡 ICCID BCD[10] @@ -2729,6 +2737,28 @@ 需要人工确认报警事件的 ID,从 1 开始计数 + + + 胎压 + 2019版本 + + + + + 胎压 + + + + + 胎压 + 2019版本 + + + + + 车厢温度 + + 超速报警附加信息 @@ -3694,6 +3724,70 @@ 驾驶员未登录汇报时间间隔,单位为秒(s),>0 + + + 从服务器APN。该值为空时,终端应使用主服务器相同配置 + 2019版本 + + + + + 数据 长度 + + + + + + + + + + 从服务器无线通信拨号用户名。该值为空时,终端应使用主服务器相同配置 + 2019版本 + + + + + 数据 长度 + + + + + + + + + + 从服务器无线通信拨号密码。该值为空,终端应使用主服务器相同配置 + 2019版本 + + + + + 数据 长度 + + + + + + + + + + 从服务器无线通信拨号密码。该值为空,终端应使用主服务器相同配置 + 2019版本 + + + + + 数据 长度 + + + + + + + 休眠时汇报时间间隔,单位为秒(s),>0 @@ -3821,6 +3915,21 @@ 电子围栏半径(非法位移阈值),单位为米 + + + 违规行驶时段范围 + + + + + 数据 长度 + + + + + 电子围栏半径(非法位移阈值),单位为米 + + 监控平台电话号码 @@ -4768,7 +4877,8 @@ 制造商 ID - 5 个字节,终端制造商编码 + 2013版本 5 个字节,终端制造商编码 + 2019版本 11 个字节,终端制造商编码 @@ -4835,6 +4945,12 @@ 人工确认报警类型 + + + 链路检测 + 2019版本 + + 文本信息下发 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0004.cs b/src/JT808.Protocol/MessageBody/JT808_0x0004.cs index 2bd9e48..cee0e31 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0004.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0004.cs @@ -1,10 +1,12 @@ -namespace JT808.Protocol.MessageBody +using JT808.Protocol.Interfaces; + +namespace JT808.Protocol.MessageBody { /// /// 查询服务器时间请求 /// 2019版本 /// - public class JT808_0x0004 : JT808Bodies + public class JT808_0x0004 : JT808Bodies, IJT808_2019_Version { /// /// 跳过数据体序列化 diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0005.cs b/src/JT808.Protocol/MessageBody/JT808_0x0005.cs index c5a9867..fece5fb 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0005.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0005.cs @@ -1,4 +1,5 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// 终端补传分包请求 /// 2019版本 /// - public class JT808_0x0005 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x0005 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x0005; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0100.cs b/src/JT808.Protocol/MessageBody/JT808_0x0100.cs index 94b83d0..f910b99 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0100.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0100.cs @@ -1,5 +1,6 @@ using JT808.Protocol.Enums; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// /// 终端注册 /// - public class JT808_0x0100 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x0100 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x0100; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0102.cs b/src/JT808.Protocol/MessageBody/JT808_0x0102.cs index 97570ce..f1fb49f 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0102.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0102.cs @@ -1,5 +1,6 @@ using JT808.Protocol.Enums; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// /// 终端鉴权 /// - public class JT808_0x0102 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x0102 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x0102; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0107.cs b/src/JT808.Protocol/MessageBody/JT808_0x0107.cs index 2dfbc64..7046225 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0107.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0107.cs @@ -1,4 +1,6 @@ -using JT808.Protocol.Formatters; +using JT808.Protocol.Enums; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -6,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// /// 查询终端属性应答 /// - public class JT808_0x0107 : JT808Bodies,IJT808MessagePackFormatter + public class JT808_0x0107 : JT808Bodies,IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x0107; /// @@ -21,23 +23,26 @@ namespace JT808.Protocol.MessageBody public ushort TerminalType { get; set; } /// /// 制造商 ID - /// 5 个字节,终端制造商编码 + /// 2013版本 5 个字节,终端制造商编码 + /// 2019版本 11 个字节,终端制造商编码 /// public string MakerId { get; set; } /// /// 终端型号 - /// BYTE[20] - /// 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 + /// BYTE[20] 20 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 + /// 2019版本 + /// BYTE[30] 30 个字节,此终端型号由制造商自行定义,位数不足时,后补“0X00”。 /// public string TerminalModel { get; set; } /// /// 终端ID - /// BYTE[7] - /// 7 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00” + /// BYTE[7] 7 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00” + /// 2019版本 + /// BYTE[30] 30 个字节,由大写字母和数字组成,此终端 ID 由制造商自行定义,位数不足时,后补“0X00” /// public string TerminalId { get; set; } /// - /// 终端 SIM 卡 ICCID + /// 终端 SIM 卡 ICCID /// BCD[10] /// public string Terminal_SIM_ICCID { get; set; } @@ -81,9 +86,18 @@ namespace JT808.Protocol.MessageBody { JT808_0x0107 jT808_0X0107 = new JT808_0x0107(); jT808_0X0107.TerminalType = reader.ReadUInt16(); - jT808_0X0107.MakerId = reader.ReadString(5); - jT808_0X0107.TerminalModel = reader.ReadString(20); - jT808_0X0107.TerminalId = reader.ReadString(7); + if(reader.Version== JT808Version.JTT2019) + { + jT808_0X0107.MakerId = reader.ReadString(11); + jT808_0X0107.TerminalModel = reader.ReadString(30); + jT808_0X0107.TerminalId = reader.ReadString(30); + } + else + { + jT808_0X0107.MakerId = reader.ReadString(5); + jT808_0X0107.TerminalModel = reader.ReadString(20); + jT808_0X0107.TerminalId = reader.ReadString(7); + } jT808_0X0107.Terminal_SIM_ICCID = reader.ReadBCD(10, config.Trim); jT808_0X0107.Terminal_Hardware_Version_Length = reader.ReadByte(); jT808_0X0107.Terminal_Hardware_Version_Num = reader.ReadString(jT808_0X0107.Terminal_Hardware_Version_Length); @@ -97,9 +111,18 @@ namespace JT808.Protocol.MessageBody public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0107 value, IJT808Config config) { writer.WriteUInt16(value.TerminalType); - writer.WriteString(value.MakerId.PadRight(5, '0')); - writer.WriteString(value.TerminalModel.PadRight(20, '0')); - writer.WriteString(value.TerminalId.PadRight(7, '0')); + if (writer.Version == JT808Version.JTT2019) + { + writer.WriteString(value.MakerId.PadLeft(11, '0')); + writer.WriteString(value.TerminalModel.PadLeft(30, '0')); + writer.WriteString(value.TerminalId.PadLeft(30, '0')); + } + else + { + writer.WriteString(value.MakerId.PadRight(5, '0')); + writer.WriteString(value.TerminalModel.PadRight(20, '0')); + writer.WriteString(value.TerminalId.PadRight(7, '0')); + } writer.WriteBCD(value.Terminal_SIM_ICCID, 10); writer.WriteByte((byte)value.Terminal_Hardware_Version_Num.Length); writer.WriteString(value.Terminal_Hardware_Version_Num); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_0x05.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_0x05.cs new file mode 100644 index 0000000..9794fb5 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_0x05.cs @@ -0,0 +1,37 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 胎压 + /// 2019版本 + /// + public class JT808_0x0200_0x05 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + /// + /// 胎压 + /// + public string TirePressure { get; set; } + public override byte AttachInfoId { get; set; } = 0x05; + public override byte AttachInfoLength { get; set; } = 30; + + public JT808_0x0200_0x05 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0200_0x05 value = new JT808_0x0200_0x05(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.TirePressure = reader.ReadString(value.AttachInfoLength); + return value; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x05 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.WriteByte(value.AttachInfoLength); + writer.WriteString(value.TirePressure); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0200_0x06.cs b/src/JT808.Protocol/MessageBody/JT808_0x0200_0x06.cs new file mode 100644 index 0000000..2e21478 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x0200_0x06.cs @@ -0,0 +1,37 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 胎压 + /// 2019版本 + /// + public class JT808_0x0200_0x06 : JT808_0x0200_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + /// + /// 车厢温度 + /// + public short CarTemperature { get; set; } + public override byte AttachInfoId { get; set; } = 0x05; + public override byte AttachInfoLength { get; set; } = 2; + + public JT808_0x0200_0x06 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x0200_0x06 value = new JT808_0x0200_0x06(); + value.AttachInfoId = reader.ReadByte(); + value.AttachInfoLength = reader.ReadByte(); + value.CarTemperature =reader.ReadInt16(); + return value; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x0200_0x06 value, IJT808Config config) + { + writer.WriteByte(value.AttachInfoId); + writer.WriteByte(value.AttachInfoLength); + writer.WriteInt16(value.CarTemperature); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0301.cs b/src/JT808.Protocol/MessageBody/JT808_0x0301.cs index 3986f87..6a0bb97 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0301.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0301.cs @@ -1,5 +1,7 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; namespace JT808.Protocol.MessageBody { @@ -7,7 +9,8 @@ namespace JT808.Protocol.MessageBody /// 事件报告 /// 0x0301 /// - public class JT808_0x0301 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x0301 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x0301; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0302.cs b/src/JT808.Protocol/MessageBody/JT808_0x0302.cs index 58cc27c..73eb5bd 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0302.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0302.cs @@ -1,6 +1,8 @@ using JT808.Protocol.Attributes; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; namespace JT808.Protocol.MessageBody { @@ -8,7 +10,8 @@ namespace JT808.Protocol.MessageBody /// 提问应答 /// 0x0302 /// - public class JT808_0x0302 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x0302 : JT808Bodies, IJT808MessagePackFormatter,IJT808_2019_Version { public override ushort MsgId { get; } = 0x0302; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x0303.cs b/src/JT808.Protocol/MessageBody/JT808_0x0303.cs index 1f194c9..022b61a 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x0303.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x0303.cs @@ -1,5 +1,7 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; namespace JT808.Protocol.MessageBody { @@ -7,7 +9,8 @@ namespace JT808.Protocol.MessageBody /// 信息点播/取消 /// 0x0303 /// - public class JT808_0x0303 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x0303 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x0303; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8004.cs b/src/JT808.Protocol/MessageBody/JT808_0x8004.cs index b15fe7c..0a58ffb 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8004.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8004.cs @@ -1,4 +1,5 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; @@ -8,7 +9,7 @@ namespace JT808.Protocol.MessageBody /// 查询服务器时间应答 /// 2019版本 /// - public class JT808_0x8004 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x8004 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8004; diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0018.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0018.cs index 2ac12b5..41cf582 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0018.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0018.cs @@ -1,13 +1,16 @@ using JT808.Protocol.Attributes; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; namespace JT808.Protocol.MessageBody { /// /// 服务器 TCP 端口 /// - public class JT808_0x8103_0x0018 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter + [Obsolete("2019版本已作为保留")] + public class JT808_0x8103_0x0018 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version { public override uint ParamId { get; set; } = 0x0018; /// @@ -20,11 +23,11 @@ namespace JT808.Protocol.MessageBody public uint ParamValue { get; set; } public JT808_0x8103_0x0018 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - JT808_0x8103_0x0018 jT808_0x8103_0x0018 = new JT808_0x8103_0x0018(); - jT808_0x8103_0x0018.ParamId = reader.ReadUInt32(); - jT808_0x8103_0x0018.ParamLength = reader.ReadByte(); - jT808_0x8103_0x0018.ParamValue = reader.ReadUInt32(); - return jT808_0x8103_0x0018; + JT808_0x8103_0x0018 value = new JT808_0x8103_0x0018(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.ParamValue = reader.ReadUInt32(); + return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0018 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0019.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0019.cs index e030a7f..f3bac0e 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0019.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0019.cs @@ -1,13 +1,16 @@ using JT808.Protocol.Attributes; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; namespace JT808.Protocol.MessageBody { /// /// 服务器 UDP 端口 /// - public class JT808_0x8103_0x0019 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter + [Obsolete("2019版本已作为保留")] + public class JT808_0x8103_0x0019 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version { public override uint ParamId { get; set; } = 0x0019; /// @@ -20,11 +23,11 @@ namespace JT808.Protocol.MessageBody public uint ParamValue { get; set; } public JT808_0x8103_0x0019 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) { - JT808_0x8103_0x0019 jT808_0x8103_0x0019 = new JT808_0x8103_0x0019(); - jT808_0x8103_0x0019.ParamId = reader.ReadUInt32(); - jT808_0x8103_0x0019.ParamLength = reader.ReadByte(); - jT808_0x8103_0x0019.ParamValue = reader.ReadUInt32(); - return jT808_0x8103_0x0019; + JT808_0x8103_0x0019 value = new JT808_0x8103_0x0019(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.ParamValue = reader.ReadUInt32(); + return value; } public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0019 value, IJT808Config config) diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0023.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0023.cs new file mode 100644 index 0000000..c4e4e0b --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0023.cs @@ -0,0 +1,41 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 从服务器APN。该值为空时,终端应使用主服务器相同配置 + /// 2019版本 + /// + public class JT808_0x8103_0x0023 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + public override uint ParamId { get; set; } = 0x0023; + /// + /// 数据 长度 + /// + public override byte ParamLength { get; set; } + /// + /// + /// + public string ParamValue { get; set; } + public JT808_0x8103_0x0023 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0x0023 value = new JT808_0x8103_0x0023(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.ParamValue = reader.ReadString(value.ParamLength); + return value; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0023 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int skipPosition); + writer.WriteString(value.ParamValue); + int length = writer.GetCurrentPosition() - skipPosition - 1; + writer.WriteByteReturn((byte)length, skipPosition); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0024.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0024.cs new file mode 100644 index 0000000..c2c2d33 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0024.cs @@ -0,0 +1,41 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 从服务器无线通信拨号用户名。该值为空时,终端应使用主服务器相同配置 + /// 2019版本 + /// + public class JT808_0x8103_0x0024 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + public override uint ParamId { get; set; } = 0x0024; + /// + /// 数据 长度 + /// + public override byte ParamLength { get; set; } + /// + /// + /// + public string ParamValue { get; set; } + public JT808_0x8103_0x0024 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0x0024 jT808_0x8103_0x0024 = new JT808_0x8103_0x0024(); + jT808_0x8103_0x0024.ParamId = reader.ReadUInt32(); + jT808_0x8103_0x0024.ParamLength = reader.ReadByte(); + jT808_0x8103_0x0024.ParamValue = reader.ReadString(jT808_0x8103_0x0024.ParamLength); + return jT808_0x8103_0x0024; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0024 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int skipPosition); + writer.WriteString(value.ParamValue); + int length = writer.GetCurrentPosition() - skipPosition - 1; + writer.WriteByteReturn((byte)length, skipPosition); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0025.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0025.cs new file mode 100644 index 0000000..7ea75db --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0025.cs @@ -0,0 +1,41 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 从服务器无线通信拨号密码。该值为空,终端应使用主服务器相同配置 + /// 2019版本 + /// + public class JT808_0x8103_0x0025 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + public override uint ParamId { get; set; } = 0x0025; + /// + /// 数据 长度 + /// + public override byte ParamLength { get; set; } + /// + /// + /// + public string ParamValue { get; set; } + public JT808_0x8103_0x0025 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0x0025 jT808_0x8103_0x0025 = new JT808_0x8103_0x0025(); + jT808_0x8103_0x0025.ParamId = reader.ReadUInt32(); + jT808_0x8103_0x0025.ParamLength = reader.ReadByte(); + jT808_0x8103_0x0025.ParamValue = reader.ReadString(jT808_0x8103_0x0025.ParamLength); + return jT808_0x8103_0x0025; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0025 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int skipPosition); + writer.WriteString(value.ParamValue); + int length = writer.GetCurrentPosition() - skipPosition - 1; + writer.WriteByteReturn((byte)length, skipPosition); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0026.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0026.cs new file mode 100644 index 0000000..7be08f5 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0026.cs @@ -0,0 +1,41 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 从服务器无线通信拨号密码。该值为空,终端应使用主服务器相同配置 + /// 2019版本 + /// + public class JT808_0x8103_0x0026 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + public override uint ParamId { get; set; } = 0x0026; + /// + /// 数据 长度 + /// + public override byte ParamLength { get; set; } + /// + /// + /// + public string ParamValue { get; set; } + public JT808_0x8103_0x0026 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0x0026 value = new JT808_0x8103_0x0026(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.ParamValue = reader.ReadString(value.ParamLength); + return value; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0026 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.Skip(1, out int skipPosition); + writer.WriteString(value.ParamValue); + int length = writer.GetCurrentPosition() - skipPosition - 1; + writer.WriteByteReturn((byte)length, skipPosition); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0032.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0032.cs new file mode 100644 index 0000000..00fa008 --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0032.cs @@ -0,0 +1,38 @@ +using JT808.Protocol.Attributes; +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 违规行驶时段范围 + /// + public class JT808_0x8103_0x0032 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version + { + public override uint ParamId { get; set; } = 0x0032; + /// + /// 数据 长度 + /// + public override byte ParamLength { get; set; } = 4; + /// + /// 电子围栏半径(非法位移阈值),单位为米 + /// + public byte[] ParamValue { get; set; } + public JT808_0x8103_0x0032 Deserialize(ref JT808MessagePackReader reader, IJT808Config config) + { + JT808_0x8103_0x0032 value = new JT808_0x8103_0x0032(); + value.ParamId = reader.ReadUInt32(); + value.ParamLength = reader.ReadByte(); + value.ParamValue = reader.ReadArray(4).ToArray(); + return value; + } + + public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8103_0x0032 value, IJT808Config config) + { + writer.WriteUInt32(value.ParamId); + writer.WriteByte(value.ParamLength); + writer.WriteArray(value.ParamValue); + } + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0084.cs b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0084.cs index 95ab737..ceb2b6b 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0084.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8103_0x0084.cs @@ -1,5 +1,6 @@ using JT808.Protocol.Attributes; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// /// 车牌颜色,按照 JT/T415-2006 的 5.4.12 /// - public class JT808_0x8103_0x0084 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter + public class JT808_0x8103_0x0084 : JT808_0x8103_BodyBase, IJT808MessagePackFormatter, IJT808_2019_Version { public override uint ParamId { get; set; } = 0x0084; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8105.cs b/src/JT808.Protocol/MessageBody/JT808_0x8105.cs index 682846c..7817f72 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8105.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8105.cs @@ -1,4 +1,5 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; @@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// /// 终端控制 /// - public class JT808_0x8105 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x8105 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8105; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8108.cs b/src/JT808.Protocol/MessageBody/JT808_0x8108.cs index 0662dfc..0909548 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8108.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8108.cs @@ -1,5 +1,6 @@ using JT808.Protocol.Enums; using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; namespace JT808.Protocol.MessageBody @@ -7,7 +8,7 @@ namespace JT808.Protocol.MessageBody /// /// 下发终端升级包 /// - public class JT808_0x8108 : JT808Bodies, IJT808MessagePackFormatter + public class JT808_0x8108 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8108; /// @@ -16,7 +17,8 @@ namespace JT808.Protocol.MessageBody public JT808UpgradeType UpgradeType { get; set; } /// /// 制造商 ID - /// 5 个字节,终端制造商编码 + /// 2013版本 5 个字节,终端制造商编码 + /// 2019版本 11 个字节,终端制造商编码 /// public string MakerId { get; set; } /// @@ -40,7 +42,14 @@ namespace JT808.Protocol.MessageBody { JT808_0x8108 jT808_0X8108 = new JT808_0x8108(); jT808_0X8108.UpgradeType = (JT808UpgradeType)reader.ReadByte(); - jT808_0X8108.MakerId = reader.ReadString(5); + if (reader.Version == JT808Version.JTT2019) + { + jT808_0X8108.MakerId = reader.ReadString(11); + } + else + { + jT808_0X8108.MakerId = reader.ReadString(5); + } jT808_0X8108.VersionNumLength = reader.ReadByte(); jT808_0X8108.VersionNum = reader.ReadString(jT808_0X8108.VersionNumLength); jT808_0X8108.UpgradePackageLength = reader.ReadInt32(); @@ -51,7 +60,14 @@ namespace JT808.Protocol.MessageBody public void Serialize(ref JT808MessagePackWriter writer, JT808_0x8108 value, IJT808Config config) { writer.WriteByte((byte)value.UpgradeType); - writer.WriteString(value.MakerId.PadRight(5, '0')); + if (writer.Version == JT808Version.JTT2019) + { + writer.WriteString(value.MakerId.PadLeft(11, '0')); + } + else + { + writer.WriteString(value.MakerId.PadRight(5, '0')); + } writer.WriteByte((byte)value.VersionNum.Length); writer.WriteString(value.VersionNum); writer.WriteInt32(value.UpgradePackage.Length); diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8204.cs b/src/JT808.Protocol/MessageBody/JT808_0x8204.cs new file mode 100644 index 0000000..2c6cfba --- /dev/null +++ b/src/JT808.Protocol/MessageBody/JT808_0x8204.cs @@ -0,0 +1,17 @@ +using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; +using JT808.Protocol.MessagePack; + +namespace JT808.Protocol.MessageBody +{ + /// + /// 链路检测 + /// 2019版本 + /// + public class JT808_0x8204 : JT808Bodies, IJT808_2019_Version + { + public override ushort MsgId { get; } = 0x8204; + + public override bool SkipSerialization { get; set; } = true; + } +} diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8301.cs b/src/JT808.Protocol/MessageBody/JT808_0x8301.cs index 7be097e..28bc748 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8301.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8301.cs @@ -1,6 +1,8 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using JT808.Protocol.Metadata; +using System; using System.Collections.Generic; namespace JT808.Protocol.MessageBody @@ -9,7 +11,8 @@ namespace JT808.Protocol.MessageBody /// 事件设置 /// 0x8301 /// - public class JT808_0x8301 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x8301 : JT808Bodies, IJT808MessagePackFormatter,IJT808_2019_Version { public override ushort MsgId { get; } = 0x8301; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8302.cs b/src/JT808.Protocol/MessageBody/JT808_0x8302.cs index 158a1a2..9da475d 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8302.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8302.cs @@ -1,4 +1,5 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using System; using System.Collections.Generic; @@ -9,7 +10,8 @@ namespace JT808.Protocol.MessageBody /// 提问下发 /// 0x8302 /// - public class JT808_0x8302 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x8302 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8302; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8303.cs b/src/JT808.Protocol/MessageBody/JT808_0x8303.cs index 6fb81f7..9b7b6ca 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8303.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8303.cs @@ -1,6 +1,8 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; using JT808.Protocol.Metadata; +using System; using System.Collections.Generic; namespace JT808.Protocol.MessageBody @@ -9,7 +11,8 @@ namespace JT808.Protocol.MessageBody /// 信息点播菜单设置 /// 0x8303 /// - public class JT808_0x8303 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x8303 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8303; /// diff --git a/src/JT808.Protocol/MessageBody/JT808_0x8304.cs b/src/JT808.Protocol/MessageBody/JT808_0x8304.cs index ca613ee..5d67744 100644 --- a/src/JT808.Protocol/MessageBody/JT808_0x8304.cs +++ b/src/JT808.Protocol/MessageBody/JT808_0x8304.cs @@ -1,5 +1,7 @@ using JT808.Protocol.Formatters; +using JT808.Protocol.Interfaces; using JT808.Protocol.MessagePack; +using System; namespace JT808.Protocol.MessageBody { @@ -7,7 +9,8 @@ namespace JT808.Protocol.MessageBody /// 信息服务 /// 0x8304 /// - public class JT808_0x8304 : JT808Bodies, IJT808MessagePackFormatter + [Obsolete("2019版本已作删除")] + public class JT808_0x8304 : JT808Bodies, IJT808MessagePackFormatter, IJT808_2019_Version { public override ushort MsgId { get; } = 0x8304; /// diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs index f90012d..05248dd 100644 --- a/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs +++ b/src/JT808.Protocol/MessagePack/JT808MessagePackReader.cs @@ -128,6 +128,10 @@ namespace JT808.Protocol.MessagePack public bool CheckXorCodeVali => _checkXorCodeVali; public byte ReadStart()=> ReadByte(); public byte ReadEnd()=> ReadByte(); + public short ReadInt16() + { + return BinaryPrimitives.ReadInt16BigEndian(GetReadOnlySpan(2)); + } public ushort ReadUInt16() { return BinaryPrimitives.ReadUInt16BigEndian(GetReadOnlySpan(2)); diff --git a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs index 490e7d1..eb8dad6 100644 --- a/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs +++ b/src/JT808.Protocol/MessagePack/JT808MessagePackWriter.cs @@ -70,6 +70,11 @@ namespace JT808.Protocol.MessagePack span[0] = value; writer.Advance(1); } + public void WriteInt16(short value) + { + BinaryPrimitives.WriteInt16BigEndian(writer.Free, value); + writer.Advance(2); + } public void WriteUInt16(ushort value) { BinaryPrimitives.WriteUInt16BigEndian(writer.Free, value);