From 96bec309667abe36de18796d395824ed8d07b3d7 Mon Sep 17 00:00:00 2001 From: iioter <535915157@qq.com> Date: Tue, 17 May 2022 13:45:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E5=8C=96=E4=B8=8A=E4=BC=A0=E3=80=81?= =?UTF-8?q?=E8=BE=BE=E5=88=B0=E5=BC=BA=E5=88=B6=E5=BD=92=E6=A1=A3=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=9C=AA=E5=8F=98=E5=8C=96=E4=B9=9F=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/IoTGateway/DesignTimeBuild/.dtbcache.v2 | Bin 582186 -> 582186 bytes .vs/IoTGateway/v17/.futdcache.v1 | Bin 8648 -> 8648 bytes .vs/IoTGateway/v17/.suo | Bin 404992 -> 422400 bytes .vs/IoTGateway/v17/fileList.bin | Bin 143176 -> 143277 bytes .../20220517053158_changepublish.Designer.cs | 853 ++++++++++++++++++ .../20220517053158_changepublish.cs | 37 + .../Migrations/DataContextModelSnapshot.cs | 6 + IoTGateway.Model/Device.cs | 11 +- .../BasicData/DeviceVMs/CopyVM.cs | 2 + .../BasicData/DeviceVMs/DeviceListVM.cs | 10 +- .../BasicData/Views/Device/Create.cshtml | 20 +- .../Areas/BasicData/Views/Device/Edit.cshtml | 2 + IoTGateway/iotgateway.db | Bin 311296 -> 311296 bytes Plugins/Plugin/MyMqttClient.cs | 94 +- iotgateway.db | Bin 311296 -> 311296 bytes 15 files changed, 997 insertions(+), 38 deletions(-) create mode 100644 IoTGateway.DataAccess/Migrations/20220517053158_changepublish.Designer.cs create mode 100644 IoTGateway.DataAccess/Migrations/20220517053158_changepublish.cs diff --git a/.vs/IoTGateway/DesignTimeBuild/.dtbcache.v2 b/.vs/IoTGateway/DesignTimeBuild/.dtbcache.v2 index cf75876489c7be399c5b2668acc5e63663b817c6..115715d3ffd8eaef42f424a2e3b4ee0ba30061c0 100644 GIT binary patch delta 9409 zcmcIp378bsweGI2rK@1rnT>52RuN~atGl|om1SnwWFHn$A_CQ2RX74Ogc*&R$Y55p zvLw&@-ir|s6BSfIkwTQ!Eui9tFNOpRW)VfrT-#mI_us1OS-|A;y?mMP`|F&0DY z{`Z_yw`;aMK4{D1gTh1Cg=bdjnh}qysuj-~PBvp?v)Opsi5W)1Oqp>l6E|(!&=Z!H zRI{2L*DO;rQ%T!aEyIi_94C46+V8CmKeU$X_stsBj2Y>qVQN|uBidRvZJMf+Hl37Z z#A2#un@LO6Q(DqU>e-l+u;XS*O&ca27q_!^EVP!Go4MrA$97ZP%5QOZPph)xiG&XK zbRwpjmYRrJiHwawQ<=1(s-~`HGqI!=k2#JJGg8TUPj+?WSafTJE{PX^y?j8P`zXWY*Q&)|gS19ouXiI4zpoIN^Fbdu@}MXWLwp(cP+DL+m5}`uFtZ&zoMhJh{|(TF#}H z9xASwF=6hwhLv{piWMX0*()1C(&+23=#W@lf5W)i%R&;Oa0N&UjRoyvxzH%GZYigc z=a+Fx&rsJH_BWak#tlwW#gxW|`jEKmH1}tYY@ za?C_%1Pk`QWX*eAC-=4-H$PGnOC{_qvN3C=GwGPAXAJlnY67JqX{)h##<9|x9=CPf zP%X_&q|%mZ>)0>EY8D9;8tD(YFB~aw7k|h-*tsTdn^p#83NBV6fyHFANi!ZZ9cGBx zww6gHWD4d`ook^07eIsRLV`-#|+oM;c zHd>RiVyc~qrEMo0OD1BvVa8CQ6RD)B#?AZN6Vn_kn^tXAMIkh` zI4Zc7O6b`%>NsL49%>|~>bXf|Lj%{Fv`mTga+PtB4KjJDUt~C`T?!i98@K`Csh*cO z{krUe(52+ma&Ek@4=3h=$iQ2tMtJwRX_1fl8a z*GL*u)Y92xHlt?Dv>A_E4ni`eCzER0wnG<^9lgUPq;__svs*bk@>qFu@ug&Z@Bq&;56_C@Fu_pJOjK1 zybZhq{2gckDDWkrBgR=qIAgs-ypS2^9UD0Nf=ApBR3Xp7)>>d$18%qMBK>JC^Xe&TJJl`9j z6B=ygogv$=z5s1DaDL@qb=BuS{9G1fJeN(n`5(BG+fNa)OE8(PkZgtBAemoJ z*t$dS0rUiV0lk4jpa}RU@l^T`1FG09zA3WivT%ue_luFkx?GBZ*q`m*80F<~xRNx_ z7AxEbWPU7PFh#1OQ-L&BMe$l&#TSzxb zg+CLWS1Zw35*%CP_2Kn&wp0z!ITEfdo#|Yur3<}GqVuF2>*(Inqorp{FM7FD(^5#M zh*0Pi60UHaFSV4?uSxVuxLz)i?I(ra+yaTvJ$$)))u~9YVMTp{RZLGKfI*+a+8vyB%zH4@mSu%x+sSyPe+b2D-a$;TH}s>Kn}N7#fF+3_V4pYyl1S~dkv_$b1?I=w%um4lBsp;d ze-ZbT;%`CD;efg$K6PaLDn3>4dl-%f%>98eH=yeueXdUU;-tH6 z6~9a_+$&9Mn`Mq3^qL1q>=wQ#`GnU9CgO$3I{K=(iksh({4oAqd3%cgDt*+eMO+_R%OY?c{hK%RJP`_gUBVSZpJqe9A<;K6G&=gV z^luq}FzkW7avDL;JP z!_>P*=~~#=wg|Y;QmDV6^ZbnH7M(Bz3!vSjUV`-S#gCac-2wM?v}bgDj+TgIMTszh zY&wBz(W6u-??$ilMg)m#TcWtQ1&{D`#U-m(_Y3lZcG$FDsDEG1wPFeBo8L&2(sVa*hsl*M7ne;>2OBG0eUBKH--U zy*SEZJeXq;$HSwnkd;U2@F=~2T@fZDq6oGNqjV&eFr5741fLicUevyU{_BAofE$5t0^b5| z0#*Udz-r)TfQ9e3eU1w!`8oO>pVjaB;(PAW{=#cQ`S(4(CW-X>QTl@@uHfqy#@7#{ z^he<9`%&+m8vZe9*~1TV?;b3?R9sXREc2=k%lt{ZWfuQ5NY0u{etnE^4JZ5u^jrNfB2drG(Emi=e*tWX{~avxm;Rz|^Tn@xaXZ;< z373^`VA;3<&)&$CjZii*WfPP;m~uzd-LzFW9(IpT6)QORxpLu}u)fC2+FUdAo zn_b=!Gi8pxfU>F8aZA*jecll(VUE6lat9py`*mY$6s@+p0iAhb#iy1D*A^8G4EE9K zu#fk)+s6U-1^d|UL~uVw+!k#q!;$U?SzIa%$!{k|x4TD8p^+1IV1FL)wy@&CFWJJK z=z9p*1-QU&fNkf)!FKNPH}DZ(JnDZkma|1H#xaZdjB1K|#hqW@hW z2fPQo4}1W82z&&5415B73NQjc^9d|E>r?i*FTU_aNOm8+MK~-B49o2Gb2duDGUa4k z!AC>}AG}NjIY+}})($~)U-_A^rMP%du(pmbVo@d=XNi4C%S(LMf8}*7N-|C*vUmP2 zm!WrL0VfsobpqJxI?Mk1xIp$!8C`tQ)fe4-@&9@sclQV>kZE_B_Fz{K(vuO=OQyX+ zNOwlazw3RBZ-lFl;8#nbM`;P!englyxJdSoV8t>EI`3>#f{B#Mv`=8^E0g-Cg%Qnz zg7)Ax&mr&}D$`+sCE0eE9}dd}G93|EE^NDJBrF%nR1batw7bW^(Jv*@it|US#68Wb zOk?MpG??NtO`LDhVM)r=INy?jB`wp7&$nCx%P5(S4lIpgD=A}|VHzvbs`E|Nu++$O z-1(OAuuPEY#PcnaV7XMLlLJdT7N)>5Ri@LdabQ^@vqF6KPWIEh(%ti{us0%JjeM!| zbBeo0_I}fnS6>jOk;)fQghom3{1=5)VeK^B-T>YN&H!%#Zv*cDe+OCs3cL%j^vn6_ zS2*84PrT_uJZ0a4GDS28m9^UGGN#0C9l>M&_bd1*(1W=AvcWjRD*qqd{ImK(X zjy}DkwbpBPZykD0U?ycJg(1xgJKme|n!zULsN*$*oyGCLqw^528RWNj7Fka}lB)sw zv5YH<)h9AOn0zYJ&kzyl$bT?7>(#aSA}u~E)6Zpkmid0c3R_5_VI@b;vclGjUq?B` z|77yUN#V@U(h2y&#Qt8J+Wr_DQ9ddp>P?a2!Rsimuvf?e5egL)TrseyU|>n1Q4Gv0 z?g&vV<2YF%2agK<+`6c^pBtzssOG>kVio;0e!Kn#xC`ivzIz}G$mCAq*upMob_Kct z-GLrJe~ujKBs!BvLca*804f0$hyfZ92NHk|Bmo0aYe1%eG;lGK=(_}Rlsmn%IJ0En zXeIw6Ym7oiW9s>16?FX3(eBq*h&P1Y+c!lvEACG#_(QTga#v)9*i7hHWjs8pylb_0 zt?{noylbJztmC2Mhi~wqV1n|c9||V;{ITx@6BRlMvp`S&JAwa8dx4*Imnz=7Z?ZCh z6+t>hA;b1Z-gK+RiBAdAXk{`ctdNa2^C@!Wm0}+<496Q+_k2FtJ{C7$a!R)Kh zG(2g#LT8+BnF&j+LT8V{&T&~b70?Yh1%h%X*u2krPz;soc zX(3FD6uLODw5#nVEE&c7La?6B7pHnfKS#gAKCWa*Q>{2GY?0e)#s1CH6jpRvGjnFg z=IoBmd0sP^c8-3{YX)=8(S=?!m|u>XUb8i+e}u0Uw_@9;1K9WJ0IgQKPsfGUpjo5P zaS-Fklv(1Kq9MW2iMzOc8rfvSEb+o{mOMR6G^aViy4$_JmtfsjE41!>%QdhpRp_$7 z((YBT9F}@={cJJGH7I1@jePG2U7?U?o)t<8zK&?W9SOGqSV`WQEtV2|w;4{tM}}8^H2#yW$<_$kEG1sm~5SvLEopgT7$LxwD-}^*FJg zw39{mPKBt)gi7fl)_6!EH&5hK<-1s87btjLgz~zWqox-*Z;$eh*e~Yj3n+V99giyB9_AgfpUlx0P#%F}v;V93ImO%L zyeBrCdHMp%qpd?euXsU_cSJxiM_)kM+v@m&;sr_G5dp&-eF0@(;Mkm_FDhOXzl>-e|RL4Rq#t(A~a7 Z+!+08FTx>xe(=H?5s=&$)T0w?IW>_4SVc&-8>e?C+h5-HFe0urHTURC?Tgg@3ROje=!PWD&rg~0Z&1N(&r={~bBdr;h zWo6M7n(0i=Ff*R+Sh=j8wF?>6t5&c)%PCt)a_c$suCW~zf8sr#x3ZU>J@Cm zR6S2Gs~Jg_AKu+`{r&5ZttDX&EQ)*bYYLI%XzQFpzZG(yeq( zGn{+L|fXTygoxbf!kFNtX$c zEiZ|e8RJLQ&$-6E`kHzpV~_%GC;LC(hWalZ;W%M@UbP^h2i=L)u!%j+&WcMEpGz{HuZuG(qSv`tMnZ8n-h+3@B*#kG90J=wpQOZi_P z=XSKOQ{B8}nVN;7RrS1+Q&F?FW_wvLYdWrxPOG}-I+|hI8NP%huhTkxl0chMI95J(sr(H)mrJXVFYM zs^g~f1;cbSO)t~Ps*cG){`Wg3pXA4zTF$Y|Y(cZr8gkaz%EwqCuAR5Etfd*Qm(4gv zA+Or1r`ncdd#wCy9m_y1sBvMetxR_GAFfEAFOB!CwB~47)|!@*-1$ZCY{`5 zUw_f8X`?I+Yz}%BMO;9EAXPPE8aienpH;JNF5_Xx^jMvGHq_3jnBa8QQ#Bg{ zDjP;}^~nML3v-gsSKsxUM8-ewhGcz$j61|#K(4(hImZ9w#^hTZshyczOrEOWY;@Y=h+4XM&|A#)>6+7u( zM%FD$RwUjgTW?ABZuk@W`7`hr;IF{P0K4}g;BUZT;1l5Qz^4F*F&u$y1d{M6Y}`(u zeH3kGo1!@DoAt-~VEoUb_UEwBq@nB}oMQk>=nLRIfL-(@z&bk)dUi<*^-dsWU zuR1L?HYH@aS~^7}=blPcR!k8lHZ?WTsbXNJg=V^cxKpZ&Ja>jjXNm|n%BvHr=`3*^ zK+hF%Y-~@@6B|3w*&;n(Y+@%mHFj?7(s(+ZBi1!m&?y2OI#N==Wh{ilUi}EO2(U@rD8k2NB>9jP}!+)bLHJ|6}#ag<6 zjO&!Dyhb1s9v6q~+G&P8OOe6;mBnKuQCwH)>FOsX?NDkzl5XsK- zg-X(Et}sboL!T6em06e*BpHw z(HF$VK1g{KD}sUCi=uB%NKH@peHv05IsTUr@K>RxFGZTZj8m_OB(WkjDvN4}rL|1vvDN zB90LEJtpq^BK-hk{zD}0hmp8aB<_9HEyevPsE))+vgzro#_sHHoAoxon;FwT7f{2lldI07^R6gUbr z0iOY%1IK_bfG>gLz*oT6zzN_aa0*~6?we4_ZgayGS0)83E)g0|n&^M;vD8+cj2z6j zGyf8(7G)BtmXz4Snk&$xL{k!uP>q+Mnjle8YQl+NVR4c~>Tgf=^$)J*w{}a&Ymd0CR)p(lWGaKYoc}V@ne2y$b-Fv8h`&(zDvSCbR|-+KBIU|KM4bBz6L(K z24h@)oWDW#`>fzC0g49t_W$Sf9RTqLhWZZr7JUcf+>l7$p`pIRLMexbW<+Re{&{^z z2Ko+@=tzmG>#`WSSM(g_zq}{UA38GHm zALR`wW(J~;vA#uAn+Xbx0?q_R17`tafU!U=Fb=4b$eDflH+WXu{~m~6F)3Wa*N1Z7 z5SknPCDr_geDzI%f|CS#lSG$FI6}djnS!@Sv;hj<6s^-`(K_8UnE!3J%Jxy73tHv5 zyk(xn}`_2OUj@Avo(3I0ED=Eq@~ z-43^O8Q+0(KLJ>#cZQj+40Br*n$@AXi#&M=Kc{*PTe52~fV-JS3Z{--j#H`jh|F`S~R6zt0{f3<&^e*D4Nn1Pwn;SeS^fF+9zHiIlQ{X zGt1G3{nuRn8jgPile96I#}S*pWga)<+!l5ocof(MusPix&gqVD7I%hbS7>$zb1Lp( z6SqeqV_r#C`5Sid2NV9V%2Z9fBd-r;vh~w^Z!nWPB)V6kkFg_W@^LnkzC@ouE_>U| zWc8k+?oUd%TeF(*nVJ~D`#(*sU_0{Vm6aVL9s9J>@#igcoIupKlRWw8HhxgN4@4Ee z52^nm+ykD1TUzl?dAe&AW)IpBHV1>i;Cm%y)pmn5?9$NWRV9zX*XE02b{HHGH0 z(0nfWPu9U;n>OqAmi{R#;mYbnY*tNAV666N8On@LAUi+gPyd%asXLP8uku~Fb~1UritkQ#y~bEE>1N||ojz#6-lBsoge`MP!sr&ukkR-GI1R$B4^8VQrpNmh)kC0lqfPao}>{?bQ(g_WjZ4Y&5T3%utnrtnVuI#Op$#4IzL_r zzNt18Kdcph-vR!qB)tgc$cD|BZC*fe~S_5ugWUFzQej=4D8Vj;LLN5}!$O)yE zZpOzgN2ZhuW9yP=rT`ug01@bgw*(1R1{9zj&>lDq=m3-h9f3|jXN5daE_hWIt{IN@ z2%rWS39z>f6*le9=qSwWUacwdhge3Tn$rBhhmRjl`MW;luTS_39!{=T{O#BCSIcX+ zr)K&0juoyJ&e4?#AQ{2Y431WCw1Z=Xz@l0Bw7Woi;Nx-)tq&K=C?$Bbof(?Z{>rn3 z-GZnoli4lF&Ug9Q{=L(MNkYR}O86j%%8dQ%G6usOtI*oEk#Q^mg^q6P8~3kY&x^%<61W-v~HdgG@~(NQw*BXK(Ta!W;8@B z9WrZDQ!^c)CXA_23&v8Y4Pz^`LYR&}1xCJ=w7PYUYMdL@vc@k^*b})Y zIW|WqPXsA+V}FKCo_%4IeT(PmJY;{7Lg%-Q)FZM$p%+Jyi<v<}JHN z4)wW4sHJxUYXJh>12_s8Eyy11D&HY;T1l+-}NFAzFkxP_hB0_nCgXDggXne!-| zZOqvQXFGGY!`Z={9dLFsXD6Ip%-IEJH*b(S+u~3lXh3I1;_7TV} zuF&`Vc|n=QyDqJ7-CP(nqq&W~B=;)pHFKdr_bT);1xIX*k1N<1eT6=O`|ef3|HYnE z*mhe@hI_&-)sGZ6q@OF0r+Gtyj~`QP(MSAm`)(}q_9;-VnFpWoHj-x-3#Y0#6=}av zplLG=KBGbA4}OxG*LQP~_ml#;n|bgVZ!?*Hsc@=cOOf`p63jvTU5fc&w9vrWS|mQB z1alMk-rX7ij}6I;fP^Kc)>X(uP`eSSf9AL(CgqP{@HpOb7Q%iZ1W8U;4Z-zx@meQujv~!EJ^DH{Mly+`Rn^UA+V9^U> zT0H-BPRyHM7@Va>WV9%x`hTPJSqBw>es7Iy3KPo|(UH8uWiZ4i&bY{Ey3M Sa)XH2IX`m}HL`(4+VW4Xck@iZ7_FoOY!;mXykS7ojO`Uj{NC=z9fNUcbd z>9b_s#a=m|*RWb%?$M-N`kggSvxco#~pzwQsMM?0@` zk&bm71ue)lN{^hd@fvL zow}^8cJ0vxg|k5NVfk5v>zU3<@_w4$ecV!K6+aZsaTfP?<{6QmZ@xxZ0BA0#J=fmu zH2jHRGv68Pd7AC;4(2Rc+x)9;T4R84U5Og2Kw6G9STl2>4#Wgrq_1;XBn8KEU(My2YD>c~9# zk&Dl=fTx#i1E3*Hl`y}~Une}#rR%(aDkhKofQ zYxA_LmyzG7eLW{q3w?2;>)j|?+^X2^FVHftVt@w2&MPChr&iqs)9iPO(Oc_8dfgb+ zm(1H#v9q9Plb2SVYO=kMp$o9TnbwVCp%E5mt!QUD5KT$j>J6mvNE1N)K%e2hKc@@hSf0MgjX@q|jc1|W zlHEN~T7aDKNM&!dVmzC_Wxmgj;X|0{1@)k1jo3xY28*zrVQb#*U4N1B+M3WOLiY+S z)V7f?VJ&OnbK7Wb$N`gPo4ayLqifw*7D~Y}x^fb(tMRIJt$3$$wEU4ngFX4OQ-g&_ zW#rUqGEb_$^?1k)Lu;NBmqJt$Oj~P-)HYeV(W_7Mq%B8%w^Z>~ES}oTVpV4`eZ7iD z?hO6#in23ge-IP*wi<|LJFt>c#|polexH2Eu6yY%O?kDeY-*JXm8~sUb(hO1u<2AM z?VD8#S)w*~^^!K@P?QU1S|)ODdxtFcS-biGj)A-xY7fn0?+mET@@6)zbJkt`63}IP zyv7!g53c7Tbwe5i`U2Papr=5WK!ZTp$bSxLFYQQHu~9Cj$>=-|v>v&!D77Lz1?qrn zEh{^?GsDF@$moMK7<2~LleBxX16h&wRCeFU7(BcTdA|n9i5IBT5hN#Fe&TU`6lI=B zPh;U3JXCy=BY%b+*8-&yE>CV8Y4X z>nAK78u8le_thx}=*?{AO$XmpeAph19T`~vH0!8s8InX+Kh>lide=l3JzQK_iZ)_> z&#jGLDU9us)wH7LI@0!!n5*6ICHA4E-o&}9V{nj5*NZHH9jB$4teBcY)P&KoQtukf zFjt~+6>CT^Ookah%}@x#VydAOR>WLGk)hmBW|)KA2$an+yteYo1&8W_*5xlX$9DW( zyAQUVe)tQItr355o8(nHo4Q2ig-0M zkl!@Xn~u*EZuG#N!lTW&6LRqxXmhy;qyu*fKeA?GT_2n-d_A)xisvMN_bm*Xbx1L@ zIysT7UZ2kD3$Q3I_%ql0(DfQn^D5SCACI6kFCOIv4J(CC_VGfNI*)QD@fb3H1;NoJ zqW)Wj(F@tamjY~RsNL$q8{5}eSuh1Z&4a~*t(sJaLou9mm^x1`lO~aHt(E1i>-0vQ z(@w4PlGHG;ht{>O5Qz#GoQ=RWrlZx23r&x>uIerbN!-EEhBV85^X@(noH%lY}2t30l5joJVA*ZS6e_K9u#_Pu&T?MDxGJf5FhR=P~i1qD^90rr3(eqOEr zit+j|&Ub&o@|mv`;(Q2m9%zD7sAV46zGN%wBk+PjMIzar{0&>hqW894>oLqTdi!%P zAIrJp%8+}zmTz%+**506jGB`xj_2%_mPd;|kyigM20dco=+DS`eH{7}{4^8ez*6n( zr^fn3E^57l?bs$xvwABRR5VfeYyKBYXp70kW~4d4ANufLR^REj!o1v_&TNhO;&Pqu z^!4Qvk1h^uH~dVz{;s~Sqo-q_H$ZaaC!8tun8-rNI+gp-g-GGw;q6^d4D9!U{gW^1QejGS(J{b+INmhMB99rb# z$Hxa6-xUR+LwfZ|-tC(|dgv_ss^!NfZXDtEhj3SvDp#Nps{JD`D^R=;HZLaSU)>FHL|3Nf&34fq| z3U^&%hOM&`Gujy z?PV}5gp)ZN>Bo4^8xH1HwEYjH55fuin?L+r)H?z&Mj|gG1N3x>;k7_?f{eS32Ez-e zco1m;(not>S4BskB9+EyVz8rL6Vd>b$Mk|^U|`=M?TPaIPz(%%o{zLE($B*Th8K~a z0n|oX3+KY&)gv7ZQyL1<(8*#j82J)|VFmDru^8$3Sd0<{{UPo5Bi)QtZo+*NfHvQ$p*tX)SqgFSB$h`5C#s;+>i7G z>b1?lI$DB?#=+;#^+);&(q%|L0LQWmVTa(p45@6V0jct_VxX%8OCWp-GtpumqaY-+&Dl0CfPiwfT zT|ZNdv&Gf2Ml8Lzocp`vr_C-cw9#XOxTRf`$#6o)cipuWj1Jls7h&J+{tXyakWIJ%j+d++SBsk5Q0XI9L~k1|I^nPV;S z=GbUUY{KN?X@wP2ODpFVm6y$#=6shZQ?$j=My;a_*$n4> z`|%iiBeEH> zJ*;j%_fF}J`D_Dn1+@hY!2C-E;EwBq=*$D@9;AN|*m1?ROl)Hv;@{-=pjuicgWSBz{m zJit96$`t36n$}{zD4hp%GRx21i!8TR@HYI5g6C#7nQtg|-G5N*>Q-~?fUEdBFuexx z?(Q)$W>bu_AzEDt7~X2*jn2aFN+${nP*~d=O|0YZD0L;=N{?Ssx_^(XE-2ym-dI*M zZ$egw|J!7>z6#b#C11*jFaNcclpE~UJxU|1--~xG+M^oDxK}Zb zDMyuJR4hZ43Oo{F7>t|>&}_Xq*|co7xke%K7Z{TC#$^rZsr^%jWLYmdcfV0%S$IT_ zD~VESSYX!(gjovFUKV;UG?V~6PB!#`CNt2$9m+lAzF&zY>pn#&%n(|)Q}L!{5yG1q z8WrEP>)pa6G*GDzJQ;2}%o=?1uUD%qGd(e1U*6{Mp+jdv?&y(AN)KJCqpq(SED>dc zZoWszl9b}&(m8XkZ%?~e7vSpjt_<4I4FO$YcQ`-6jiYdd?O#XU6&jey`e>&g^@V%p z^%9GOp^^mGwgT~{3XFRm{=02Bx^a>ToO;35dr6BG;z0m+7XBMk-h0fmA3 zf=r-rPz1;flJ%mT=|D~+A7YXHkd^AplErDbP6rJFWq<~QhJs{SrZde#dWZhFpUY@m zuXHrEwt9&~g4+TK#xOwF{Mrvz)>m_(dx9|zPq21Xngkht07q))#F69_0(Rk-7=Ki? zfAI)+#hkN6x$a zeA6obd;N?SAW-6YtMPaQqm?GUV5Z&c3+};o@8@3$>9rr?ZQ9756RpmkVfq?w+*?BG(;kP*W@Y=l zdJLnuHah#lle|hen?B9u#ksM{-?_c%58RX4%`=pj8Lc_Tz3j)|?U&-xWxyo^d#|V#^$!m&IX0Lmnle*PwoWf~yjsmsY#Qp7M7x=4f$tzEJ#nCi1 zy0LKkxl{Z+qYhv2fcoPcjpZww8KI}i_L1N4xs1@$19q=Tz$xsnoaO`Aclw`f+?}k1 z$I!X6ywU#GucZBX@NYcLZmd*ZZfiexp8tl~&&Mm7Zq&m=*(S5cF#EZSd;+ttNK>Bj zr8nCv|B%@W6#K|ZWhDwdlzV`LOjPdLU868gYm$VIy-Tg~zl`3kQT*-x+m-iG%Trm% z?OO|!Rd zUq^rL$CX~hri%mI1}En?N`Nr}n@J(mV-A+qSZz zzW-5#UFjyVNgrkeCX9a_vIP)-vH-xcHy*+`EV-y!3Z0z|&0T`4a)U=}g*^u{e|-kc z$QII%ji7_!E&+5TTg20enW8NnyHfxY*{g)mD|?kmGUnh*9cF@a(+(>esK-9VYPZf3 zR!)VuWQ*uvCpK{FfLRLPeN3rl+77D^MV5+ZwpyzMqs@(qb!+trfNkd*!I8y#l}-`> zoLh(8ld=veHfqWSCg}ECrHcdGyTwS&ZV@lYPCJz7uSbf38{Ys;Y;`+sg z7njCGhsRi=ioz3OqGQ7gOXFkBB}Ik(;)~&69A@c>X8hfi5|uG1K4y?5JT*QhI^1GO zH;1PTvZREY%_-)ze&&pfjI`*x7bRtv%_)Yol+HF8&PjS7!RNQ(M9f*G@Hw&L=#(h8eoBHK)V{8s5JQL^qXG4%K|teyLJ>qP#(`BkIh zGcuym<6^_jsi`U9F==uA!uzGC$A?E-EGaP=QI^;k%b>d#>AaNxI@65HO1~}b`Xfp<{>a1=&y|X}TJbTpc92+S>s?0+;E)0%!){8UB3*tYzHk*5*Zu@t(xB zpB(ppqsH;_xZW#enb$C>LN^6BOOQ*BdB_<7)9o-s!^4vs}|8LvnZqhRTyd6Ln4DV zdBRwFOo#yTeqBu@>paz{4Y&Jfm61U(wKN*B0&QIM79QHeiNlcdYZ_UiX3~g{n8ZH= z*E4Ysd)Cp@8XGs0N3a^9N=#r1t<6&h(+NMAYUXyrg?81e$#m9Rq}D#_2aJ9%Uf+dM z{=|Mw&)mgwDZmXz+!j}{hz`YyTxvg4bfgMb5yK9VSE3k1m3iRI%0w1X*C1S24bJST z3n+0obHgycq@|riI5qVYQS?Xy>xkwN(=e>06d}gb!}&~NvEkICgV;(>juy#e?jeHc zq=y(yF~ig_GS5>pw90J~xve3u_Toia7l~SDUBR0%{ee$=w8snJ$uP>XfN7O)G3aqa zG!5vCLu8xivytKs$)r&Kww2yf)uFUzg~+0UE^ri5(^0);wy3(B5Gr$};?z0CZ?8IpRnpA9m#s4=RT3B9e=r3?^yNB%@-H!Yo><0bLg-+e_%(%LoM?V7eVZ@FQq$kzud1|mwHQFwz9Iq^ za)&4}f_+Hm{KXh*>aO}}P1RL+;0(PHFZNMUXXZoJA}$bYl}HL2rlrp-ovE@GvuNF+ z)O44gXa$_tW+^|2I!08MX#^G4DuEI-ZF@bK=-Lb>l69wI_2`Jeq&yIgN4grkHA|eg z?sb#72rKuKEMcJ)31XbRF%C0Ho{3@z4SbV%LzX>o+$~llQ1@(6fl>dkdwZ46k5XgE z6eptCY=>st6t8;F$xfK1%2C4It@$1LFfzWXn!Y2Dd$KsRd=h4*Kq}}=dKQBKV@_b? z4Tf|&xKA0#%MDuradWM~>Pvq6VLnLcm|iXwX>{Qr;uqbgVKp=#jk$qm+|L0uuv95V zLG)NT{sFsaFSUAj-E`4dcL>M@ju?F6zyj!O6663kU&s4a710+Taf2WKueoIRyVu4++BKD>OiT^{IsGxPLu@p|q zMSWxh^QYr!*cnEx5cg|GkNM&0srJn&qC2DD4p8JRy1ym`_0JELyOP`?&suRSGQ~zV zjYcM`W9i~B;Umj;5q|*9>wDycGJHA2f!Dr7YeUuSR=zA9ny3b8O>45y<9&2>u-HbT zP@P6it3)b2J6I&vf2i>8(S{go1^K|x3jrccZ&^6o!6Bigtn5VY8R84+{2fUwGUg*4X@IBMvNR&8Mpf}ak?#y`bY^j zpX&4zpb!C-dd+>lbq4m&^SHZ_=VaB}u`5^6(h=b8=zL5H?2mk!Gy+=)baF+@k}rs@WM#jzXVxQSTs+uatlva<~6|j(oQdnjwNganWf}QR%Va zu^IhR!(-y&E#z(ECaOo+k8GEfsJ;~rPHphq3=U^!hQ_pxgL!3-+dHOCu&R*R(s>?h;r(9&)}QGdw%q=2JI~s zfqEp1-U$g6>i+P}KpXHL;a&g25sjHYfMDdZTZmBPQq2hQ^v`wU z=h2GS0pm8NGEd+#<6(wPX~Fh_fH6;g5SW!7$w3?-L}J&@D8sQafO`;_*u{WLc>(^c z9t~(NbsWMdfXsoNP30jpYOKg$x30ki@*D^BafQSWCy@UNW&+T4+&~_QfSw12>u|F> zEqO>}I#Ksh345)sn<#1|pPprJ(ZOPoLi;C(Is{J~(Vd=%x8zL_K|tdj8F^v~+kFk( zUolDbzc zS8bRotSl7h)UUO$HMx{H6`*5d8+9RxBK3Y+Q!LE1rbtv_Oy?2+*UB)Cmh@#XR$wNv zgX%qGz8~m!(NRD&)(}yt`E8c*k9{&m_MAQaUIBdk{d|OeDlM3v(0hSFw!}Dq%!Y9j zqk@%)&!h$dRyTJ95;i80OJwgu874|0&uAb$#~%=rXh|&~>v0cYZuwYYBai;7yHPB>F7k!x&H|QCt5%~= zfbUrj5dAY683ws(4p&7`O*aW6_5@()KahB0_*iI1#lyZ#h6F3fsBD0M&(N z_eHA}Z!rX`0@MJEk3FqkrN&(hKi%Q@evU&H^soG#e2}>zTYjH+v4mL1Q$;sSgd9{$ zjMJUI@l*XAsN;0)@n?L%+ck7BOdU_pJ^}%|E;{E)36F>XtP4F_0WoqR|3EcF#?iLR zKx8g?7;%fqs$#435MNy|R@CQRj6zc(6#CuHgYk2|q;U2jQ=E@jO09A*n>9nbj zT0uoCg|&HIrOK@U2r>eeb$y`cv7Y85REAJ#s2W5y6D64FDzWt52oj9zt6q=@_&SLq zXVJ>1*f=nxA4P^kSPC?nAOGC2mXQ)kkMIFJ%nXph5yk&7bEb@s0j5j z$Jq6+@5-#_HOr%WG;c+?TS{Pq?#dk|AHO}Z7h6;`O)@h)I}WmPI`8h8lbs8BiG*q z8Ffk_YZSuQqxV775MuT5iojRoY&fM@4ypVYwD&s6^wUBzWmK#aEzL#jvT2T*RM%gP zqVxUKJ zB0EVhC#!e2a5F-W%ivVG{MxmQ8gCw;J}QKWIs{4@-s%CUNy!$ZNm zH{|OTh_D_BcJp9Hbo03EMh{8oLgP)t($yGNkWm;0|MO zD`fa%ENz*M@W<^v^Y)&3d(Zq=_RLT!GKna40~VC?w1qrcfR*E?pW?{u#pG|7 ztwUEq*adWj+(@+pv7uFth0*qTj8va@U_ZX_KD!f5a~cq=Zu?K($`yQrjb3OkIx|?- zudCs@uDhJ88lmI#(^q%8uyQ(+uhtPC4Ev${a_Ue66nL8823Y?m@j1H$E_X+&_J?If!M$w!xmYpM!{0YX{2o3 z)R8B564;#%*95ywFl$c}JL2rw_B&zp=(ghC_3&*jY=mW;IvAGoCVx!QZ7b@w74-|W zqULGSbENV%ktbyxj_|Egqq0TBN)lF6Pmkxt&wq&U(_4pC5j@Q2W?eO$&_BC)OtB;-ex?F9i$}icK(ppb^ z*>6(?%$l2cx!(05E}R;Us7dr*FYZpO%2k(}f8SC%WLEL3O<^t<6biM$_xq`@PX2Q4 z<(eRz<+MuIJOYQdajXm=Y{Mwb!LM38q)P47=h8WP8V1%z2mj%0naLC(0@PWU6dWyX zIqZGxT^3R|4=&=Cxqt%n6Tm=5qG<74?3Hyb6FQ0kU(AK8+!`jr55E|k?&C*Sn8bl9 z9LJP_oGg+M!X|tP^Pq`u(@f*Msk|PuiDPxijyBdTfIU*<7#@y6N6@qTR98Nm*{^I> zD}eF!b|64j+P@XZi4)^1prexkY^{0*+{Y<)%gQZjQVmaHE+Hd5CR?njN!qQW$X zf2|*_^$o|jBnLZA2IA;#9PQW!Kxo}Fz!sWM=zG(AF&V63y%0@QRYb|G0Wr@s3?M(m=JXNMKupUJ}2SNXAb7liWjAAGYkO7=sj@F zi=KmPZkvc#YkC%Wv;EX+&HA-mLX#=wUNPNq05HtLCL!y2dj6pLki#-+KG<9&UHL3> z@5YDFl}1b(OshQ-iEVHgjm`A{hcF!Le?r1GT`2z$USXx=^$h*H0(eRJbJM=M^?m%X zx?AE4LvRKZZ>PgsSS~lmw1Vki6xFRCr1@8sqOU28Fh)9S^YC-}Eenot+w98)s~ zJ;u_;44Jx`nvwRrCX@afFYlhX{Sxpwpb5|o zkFJ{ZFGYCpa1`G_RVE-GFb3eq^msKxq@k$Ss$t?aS!h(PVRAaRqC*xcN&pj3K7p&G zxPDe`^fNc6d>287cP6MrCVxIaa6MuBdg|Huo_tC#I(=yNCF z2h&b})hn!>QqkzxPN~n_luE^7e<-DHnT*Caq?G=4*Fjz!`)1J0*L%I*=K z0*X<79}s}Dz;!L)alm2#M_qqFFO&!1D)C%Ec@jYGN;0nFJ@t|}+W>O`R{%MvPXhE{ zrWK|^D9Ba+4G$!eKultXr!4Q~&xQN$X!B=W63-AH{`M63PW7rBb#>3I5_zJKLFctS-0VLwvJl8nXOXTv`fU>)E_3AXwb9q0s zQ~h9+-}Bs?(dHJw%ua1(`_FMddkFsA2?zyL1MULU0Azz&T;~Di0~P@401E;2On<9e ztgoEUkHQeT!$0~!wEr2V)?&(V0# zg8J*(Vle6?TQFvtYOsYwBH2Q2T{~OIEtI<>xA8`7k%niI1>|l@wvgN0zH<_vWDBz% zaDR`D4zWV=fvl9jb~cdZb~cb@`TL=4;0t`;#RgL_u}*9-!a#2D0UrEaY*6^~s6c)o zD)=mGs^oPnnif{_6|6t~RbHZKVHKaCw={(7R_;fw+nHcoUlJU5AlmN?YY7X|9l_Xn zzbj0&nQW#My)W;j+k1)wISJ2o*Bx~hm*oXsz*w=qWMRI3jN3FR(a9!#slVkwbk3PB zOqOo3Nk3xme>khAPd5^a&4sOb4b^52)Kw6#8 z=4z2py+cg&Wj&k-BCmSHwN41gM-}x_`?YCw# z1(rz%73yrQ2crJKg)5r#aOQO%Mqb}(bgEPMSpC?X1aC}Lk{&s{}jCPD; zVHB3bEBzmC8~$lgZE&wc7ZXy7gNA?UYD@+98Jk1r(zvmB>to_apt-C{^gQ|%?uVe93`hZdg8P1e zbd+y5=@;s!c#TKV&0LFOf~Ml83{VcJ089huYZfim9SdSyF;m#-;Z3!?VEFrARQ&6L zSL0{yQ7Q^n{i^@j`a@lcE;p~(7g}w9_We>l1tS>KkW(3jm4^jfyEoA=iQ2T2e>@@X^Ibw*K%=*^0X?NE_)ZCqYnNcT zzMo;1?Go&RO}$=%(`n;S-iun_XPPVYIraxz%QO5N5={w<)p%F@C3Z?VXyK(SWHRKg z6fgx)0+72?k1N&1@%7Fa&YNsJqv=I8no1+JB-a)zPh#{~9=FhMZ)IK^9o=2sFSAb+ zjMEg(|Hk}XUxf26>|iQC+lf=Dr9^~MbBr48vTMApThnK()Ju-^Fh+7!e#W*jYFRH* zsc48A<|+>6d)bYe@U<-16&%VhD9*`@JCiu4l>@YJS9m0UPrYtPXDsK=kI^a~*ATQk z6{W_|bMw?-S4ILq%H$#Miq7C?m@}Dk|6)u;%0*X`x9O+2()K=DB>nP$2)m_X{_Kir z)m0O3T~L}+RX=-r)kIGXU8(1B-4jzRw&Z2G71ax>Hh4Prqk?+wAC+A*w{Ct-b#>MJ z>w8{%(zJ+Mx+f%C5p7xB>Usn!natog>=dvqe}gsQrU z71ax?41)TlCR?m-tkRH@8)48hETEn4r5)|>s^`{jDecX_ISElzy>KQDbf}VCe!BaO z^><5e=9~=X$gbn*S}GP~wUK=>x7($;F8LuEFuJCAR7G9YqKYM@6K7W~T2MM+R>l0P z%F?oeiX}A*>*A*`m{oUIb$1xe^6G~kCgy4b7UnGF!n@O2#{HA9sim3ot14XfrM!)8 z=8mi(Xf9pWsI;`iAt~0%$~fC}+w{1kiliBF71L8w;)bNz5-KVarX?h&pe?os|HYZC zo_}%7M9(e|z3JUt*4JNp6xh$qK@S|sd+N;Y6SQFfPw4AW?WTX3zUA}9eT*jfQ{^cv z2a!L?5D`+}CmEwK(_xmAZpFX5ZMhgdA=`HSS(Gy*ZRC)&gpt|ViJAJ?2P4$V^ir#} zX&JYNEGQjcJKaMmlnQEQmX4lVS+$t3TQM%jGVWl`8QjaclJkRW_`NL1YQ1NfP0~Km zO)5CsCX%EI^k4ys*>g*czYjE;tvx09^q#53l>8d<28~;ra}&e*yIJJWKIhd*Yc@%96{!nO|h` zZ!>ew2j*|FGw*jE@fG{ z|J&5n!PER0>&oPrDYasURZotWxWCK)CCE8BT4k{nMW++H$6*u41aY&F#&WxxqZY!S zIjR4%UqAhvUyy$8v7W9MkMp6-u!zFk7LoH5=hEgN*c{t=NQbxJ`ZR<4GUuC6hNpQQ z_xM__rDynRwkgNcJnI|HyD=9#%dax$ZkRSF(eWJrn~;{*?|GLl2QP3tj}OD_z%K?I zjXRh>_=(Lg-}Pi_7OG6oKG1gW>n-kbW5O-{T3cLmU+0@xQ#RCdOsI02HNDR5@iJs6 zQMCVl01Bn)BERT5_8IqQ&bK&s1x!}nV6Gis@C30lpjbi0RAmQq)%91(%oH$D@wDA} z{&IU`l8x#76|TExu}R7)3Yexexn{>GG|tufYvtEncAgJZIL)&wYg~8UqkN+In{G2z zz@>xdVG0MN>lJ4rXx9fy94kUGh-%jI0BVlZ)Po1*MBcnzx$5J521_}grR?OcrL&aP z0j{Fu%CA-DAz(h5En=wrI4gA37l?I?PWDrSAA}`^L%R19ynoXZd{qeC6XVxT+#*vo zf&(*6`nJ!bsO@}rN z_fk{6X*N#tMeycIO+$6tUwZP@oQ@nRy0~SvA99JS; z_Vco1-w#-jbXWfAxDxAXJ1pK{RGt8{zWZy+F!m6&9akpow7;*g5p^Jcg{jUUVufi5 z$kUlD-y~cawoA6D!KT%@ooLsJ4;03_%)u(*U1*4j;51wB8cA3VPU8mNdd#PI4U2ercz_3=B3XL3&hzU3OXN^PSi+hj8f-N zZ6Gw*w4UrgrTYuqx}UpszelC#D#%TextnH@lZdD41`$Y4+e88-OpdLOOAbyj>kS&t*`96nUcrBBmD9gR;DEtC_f=E`McHLYbKXgwATzlJI-Vhs6i z$Il>GI8q}DYEiAmry(4;gA3u67OCTRfng7ZT)5p0YmsX7w zyXn+gu(SV2QOA~3gGC*ych8FlrF+sRqr^_Kj=_ZO`Qjo4HAuEc@E8v#(^FP;IGvjU zA$YDtnCZhf%^y^f3HN*om?{$K<3bTekM36OIOS9ENTzwG7$nlW^pP2+5MtxRgKlPc zK=*qxlCBhC@t}Sz6>Shx$XX=A-M9YPAmYlgcu@B^{+O4jd35p#)uK<`7DUU7(F>DH zcTXq&Rn?caPZ05xFhMP*6JIfJ`fU*l1Y=1EN+rzYE#2#bR(U|jGx$+XS zPr|l+I!aDpD-e8~fp}B%M3F;5!!^+85HsteizFL5C^KA*BZs$E0lcPZa$TdTYc&tS z!w7097NaOBLXD-9C1BL;W;L9BOt;=Hen<01q1Jq>n#z)?VvN>{ijsw;sX$FaS_t`2 zdTN3?hQ-zH z6BDQiWx3?M4zchezuQzlc7o3nWTk zYD?f|-RzW_L#AN&xrg-ssg(XvqJYi~N33}F28dCRp1J;Ux{$!;ka+`m4ANqZQ!Po2 zO{j|;hN$4w zBGX^rvrtAjFhJPT$$W_U>uYyg&~&{#-&fG7aCI8xgsU5v(}S*`I)gQL@LVdjCaF)5#)L-7ImHZDF(bz{VwO0@sK;wcAT?fO1(adq zgSaV=?y;y#sQDv`|4=FHaO6h1y*rjcQyaiz zFa1eLm#*D;dgl#AlWFDa-Zbhp#Vnn> zHbygF1OAM9H8cc!WqOEJ8nbPWl*_B(ju}3m^vMRcJI&wg;SoH%2I)%Cr6gD%hLSq@ zH4BA_iLHm36-%`-YCWBbR@Qwh$Ka>E0IeG-P)rzx_-i!n^%dx3WicD2^OT*Dlty#iX zVv2=ad_u4u?=;jO%_+xxn^VvM`ZS$R4uJw)ldJ~P{2}Udbg4$2ODES0Z)w;>daRVb zd_27psfPO_HDPM(#4=6+$8%GmHj6@%)JS%;HXK0T-wyN z!$pn%l~N6j@sWv&(u9Q!DSPQwE)Ui@^yfO5@jY&1^0k~PQl!Vw@ia9F$D46b8LA{~ z1S=+U6<8Xk%PRUZ3v!1eaWl9b65aElw>ayguS}2n-xlHgQPLh0WXk`^jgHIzLFdXa z+Jk=-X9}Bt)9tzG_S|%PaM0Xzdv3Zt|AXD0DbVFNy^()VZ)6`iEHGnl;9>k7UIXkg zPFF{3nPiqO=C>KmE*Q;q?Ekp2%;Kcqy6A^l#)0>XiTWeEgCR+c9+TL=FP}>GOf?h% z!l!zwx6=l@8jBp4VFDv?l1k07h!mfE0D+=-yQ;YoGSq48`Z!woDa566`x_CmA(S~4 z;WP7abuRpD>Gw*XFq)QUOYb2;Eo!Pz{ix489!TLMQ3W?*8Li4z_qoFbaNZ}%sL~Aj zG*?~T5vui*AricLovY^1qlq%oFjC}`B^Ta9)JS!+j6Upwi^5)Di0b^F&A}2mYsyEs z+i19Lv^q?NW;3WQPo2e9%fQT`SSR9>u(mr>-& z>K>@qlEBAEwaE36hUnzITi z7sOcR)8$HpaX`2N`IfS8dkiv>9-gk=gAj`m;6E9rrDA}Sl2kw{L(_|MnM~^Z%^ej6 zqeRlhOo)W{ECf=-Zpn%}SrMfV;ARjm0n3wtk(so8uZk$(tmWw2L=oLOXMZSmwwiz; z!GyE*flo+YvARbzax>@Vz>(+q?!YJ9d_N{JKY}f(cT>oSp&A6Kxr1q-@Bl^^>)_|N z#_(_;8$;cy)vJ=zGURrL())L+G0X^LkD}T;RWsaIgm4!Up9hZ|9Pp5osVREsN6F~j zo1PpGiZ(6=dn0=k7#+l(9G6E!%$1>~v+U$d|z|tngK=aIajUj))?LO!5T@tSJadICmkS z5hjxxd&rW+Yq8|hCc2m}naT;C%a;fTQn?cWG(_YOt;>d}o1I7qwTDL5(9>2tXkHBN zK+5WARwx7Cv-RDdA$wJZXi}-nV}av5`}t+5q0Poq=4!+u&Bf3*m;VYbjcniCHi>#a zMeacq5UG&m?r09EmP7Ho5jxzy8)1n}Qe>)VZ;TpBA3Y9n1E&X(`2ocE{H$uu&eCU9 zWZPuG9?{f7dZi75>n7VyHUp%cL=Ahe7tH}s7Z*lrL24anC$u{x8n=r8Hvqv|gy$u8;RiDvrN;>C^{lY9gA0R*{@ zAXjE&VeHA;a%!E;ywMLzT;?(^{!t{!NPm$2o1;=i$hY=4%hbxPWG~drG*{*(%3sAs zuT1ldKo7kF9%^CQK6mijlVk~^buWSxMlwi7DUqqMP>ZJRVrz^f6-g1g zmloi!bf=0OzR=QOhZ&NAqNsT^;)qsXO~};1Hg~An81eZe42IOXS^bI3XkxGmYPdrk zLLJ*k8xj#GMn3Uc*xrg}E2ZS_q34seFt94}DEGNfdjDh)ZM(aoH4P6rwqXMO{|u)g zt9j>5+vKKga?>{Xudz+MX=N_5x@%IkW_fZMhJs=2NAvMG35II>V7(*N{52I1)#kEg z9hSV2-ATo}r{u_k{fY!$0Ua+x7SL}vl*ThMIRCSbY<8&H2U>Nt%x9F*I~g#?VFlz< ztxVi+8LtMjQM4lj2VC25t*9f{8&B&;YF28_(Hv4`h3org9fY#_zhFfXog1nZQ*{nL znR+iv3t{jrjMt6)Ekfv}FBXFi4^n1=nk_Rg32Fuoil))Q{WYDRi1!`jt56_+B-wnmu@qK|vl$j( zI@Jz?x!ychv%0Ol6?C>l1ZgFhA6~8BxQvI>)E$6`Z2mc1OTsQE${#U delta 55 zcmZ2`pX0 +using System; +using IoTGateway.DataAccess; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace IoTGateway.DataAccess.Migrations +{ + [DbContext(typeof(DataContext))] + [Migration("20220517053158_changepublish")] + partial class changepublish + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.1"); + + modelBuilder.Entity("IoTGateway.Model.Device", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AutoStart") + .HasColumnType("INTEGER"); + + b.Property("CgUpload") + .HasColumnType("INTEGER"); + + b.Property("CreateBy") + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceName") + .HasColumnType("TEXT"); + + b.Property("DeviceTypeEnum") + .HasColumnType("INTEGER"); + + b.Property("DriverId") + .HasColumnType("TEXT"); + + b.Property("EnforcePeriod") + .HasColumnType("INTEGER"); + + b.Property("Index") + .HasColumnType("INTEGER"); + + b.Property("ParentId") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DriverId"); + + b.HasIndex("ParentId"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceConfig", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("DataSide") + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceConfigName") + .HasColumnType("TEXT"); + + b.Property("DeviceId") + .HasColumnType("TEXT"); + + b.Property("EnumInfo") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DeviceId"); + + b.ToTable("DeviceConfigs"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceVariable", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DataType") + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceAddress") + .HasColumnType("TEXT"); + + b.Property("DeviceId") + .HasColumnType("TEXT"); + + b.Property("Expressions") + .HasColumnType("TEXT"); + + b.Property("Method") + .HasColumnType("TEXT"); + + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("ProtectType") + .HasColumnType("INTEGER"); + + b.HasKey("ID"); + + b.HasIndex("DeviceId"); + + b.ToTable("DeviceVariables"); + }); + + modelBuilder.Entity("IoTGateway.Model.Driver", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AssembleName") + .HasColumnType("TEXT"); + + b.Property("AuthorizesNum") + .HasColumnType("INTEGER"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("DriverName") + .HasColumnType("TEXT"); + + b.Property("FileName") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("Drivers"); + }); + + modelBuilder.Entity("IoTGateway.Model.RpcLog", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DeviceId") + .HasColumnType("TEXT"); + + b.Property("EndTime") + .HasColumnType("TEXT"); + + b.Property("IsSuccess") + .HasColumnType("INTEGER"); + + b.Property("Method") + .HasColumnType("TEXT"); + + b.Property("Params") + .HasColumnType("TEXT"); + + b.Property("RpcSide") + .HasColumnType("INTEGER"); + + b.Property("StartTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("DeviceId"); + + b.ToTable("RpcLogs"); + }); + + modelBuilder.Entity("IoTGateway.Model.SystemConfig", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("GatewayName") + .HasColumnType("TEXT"); + + b.Property("IoTPlatformType") + .HasColumnType("INTEGER"); + + b.Property("MqttIp") + .HasColumnType("TEXT"); + + b.Property("MqttPort") + .HasColumnType("INTEGER"); + + b.Property("MqttUName") + .HasColumnType("TEXT"); + + b.Property("MqttUPwd") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("SystemConfig"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.ActionLog", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ActionName") + .HasMaxLength(255) + .HasColumnType("TEXT"); + + b.Property("ActionTime") + .HasColumnType("TEXT"); + + b.Property("ActionUrl") + .HasMaxLength(250) + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Duration") + .HasColumnType("REAL"); + + b.Property("IP") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("ITCode") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("LogType") + .HasColumnType("INTEGER"); + + b.Property("ModuleName") + .HasMaxLength(255) + .HasColumnType("TEXT"); + + b.Property("Remark") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("ActionLogs"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.DataPrivilege", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Domain") + .HasColumnType("TEXT"); + + b.Property("GroupCode") + .HasColumnType("TEXT"); + + b.Property("RelateId") + .HasColumnType("TEXT"); + + b.Property("TableName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("UserCode") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("DataPrivileges"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FileAttachment", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ExtraInfo") + .HasColumnType("TEXT"); + + b.Property("FileData") + .HasColumnType("BLOB"); + + b.Property("FileExt") + .IsRequired() + .HasMaxLength(10) + .HasColumnType("TEXT"); + + b.Property("FileName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("HandlerInfo") + .HasColumnType("TEXT"); + + b.Property("Length") + .HasColumnType("INTEGER"); + + b.Property("Path") + .HasColumnType("TEXT"); + + b.Property("SaveMode") + .HasColumnType("TEXT"); + + b.Property("UploadTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FileAttachments"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("GroupCode") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("GroupName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("GroupRemark") + .HasColumnType("TEXT"); + + b.Property("TenantCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkGroups"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkMenu", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("ActionName") + .HasColumnType("TEXT"); + + b.Property("ClassName") + .HasColumnType("TEXT"); + + b.Property("DisplayOrder") + .IsRequired() + .HasColumnType("INTEGER"); + + b.Property("Domain") + .HasColumnType("TEXT"); + + b.Property("FolderOnly") + .HasColumnType("INTEGER"); + + b.Property("Icon") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("IsInherit") + .HasColumnType("INTEGER"); + + b.Property("IsInside") + .IsRequired() + .HasColumnType("INTEGER"); + + b.Property("IsPublic") + .HasColumnType("INTEGER"); + + b.Property("MethodName") + .HasColumnType("TEXT"); + + b.Property("ModuleName") + .HasColumnType("TEXT"); + + b.Property("PageName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("ParentId") + .HasColumnType("TEXT"); + + b.Property("ShowOnMenu") + .HasColumnType("INTEGER"); + + b.Property("Url") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("ParentId"); + + b.ToTable("FrameworkMenus"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkRole", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("RoleCode") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("RoleRemark") + .HasColumnType("TEXT"); + + b.Property("TenantCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkRoles"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUser", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Address") + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.Property("CellPhone") + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("Email") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Gender") + .HasColumnType("INTEGER"); + + b.Property("HomePhone") + .HasMaxLength(30) + .HasColumnType("TEXT"); + + b.Property("ITCode") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("IsValid") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("TEXT"); + + b.Property("PhotoId") + .HasColumnType("TEXT"); + + b.Property("TenantCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("ZipCode") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("PhotoId"); + + b.ToTable("FrameworkUsers"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUserGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("GroupCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("UserCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkUserGroups"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUserRole", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("RoleCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.Property("UserCode") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("FrameworkUserRoles"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FunctionPrivilege", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("Allowed") + .IsRequired() + .HasColumnType("INTEGER"); + + b.Property("CreateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("CreateTime") + .HasColumnType("TEXT"); + + b.Property("MenuItemId") + .HasColumnType("TEXT"); + + b.Property("RoleCode") + .HasColumnType("TEXT"); + + b.Property("UpdateBy") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UpdateTime") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.HasIndex("MenuItemId"); + + b.ToTable("FunctionPrivileges"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.PersistedGrant", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CreationTime") + .HasColumnType("TEXT"); + + b.Property("Expiration") + .HasColumnType("TEXT"); + + b.Property("RefreshToken") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Type") + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("UserCode") + .HasColumnType("TEXT"); + + b.HasKey("ID"); + + b.ToTable("PersistedGrants"); + }); + + modelBuilder.Entity("IoTGateway.Model.Device", b => + { + b.HasOne("IoTGateway.Model.Driver", "Driver") + .WithMany() + .HasForeignKey("DriverId"); + + b.HasOne("IoTGateway.Model.Device", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Driver"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceConfig", b => + { + b.HasOne("IoTGateway.Model.Device", "Device") + .WithMany("DeviceConfigs") + .HasForeignKey("DeviceId"); + + b.Navigation("Device"); + }); + + modelBuilder.Entity("IoTGateway.Model.DeviceVariable", b => + { + b.HasOne("IoTGateway.Model.Device", "Device") + .WithMany("DeviceVariables") + .HasForeignKey("DeviceId"); + + b.Navigation("Device"); + }); + + modelBuilder.Entity("IoTGateway.Model.RpcLog", b => + { + b.HasOne("IoTGateway.Model.Device", "Device") + .WithMany() + .HasForeignKey("DeviceId"); + + b.Navigation("Device"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkMenu", b => + { + b.HasOne("WalkingTec.Mvvm.Core.FrameworkMenu", "Parent") + .WithMany("Children") + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkUser", b => + { + b.HasOne("WalkingTec.Mvvm.Core.FileAttachment", "Photo") + .WithMany() + .HasForeignKey("PhotoId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Photo"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FunctionPrivilege", b => + { + b.HasOne("WalkingTec.Mvvm.Core.FrameworkMenu", "MenuItem") + .WithMany("Privileges") + .HasForeignKey("MenuItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("MenuItem"); + }); + + modelBuilder.Entity("IoTGateway.Model.Device", b => + { + b.Navigation("Children"); + + b.Navigation("DeviceConfigs"); + + b.Navigation("DeviceVariables"); + }); + + modelBuilder.Entity("WalkingTec.Mvvm.Core.FrameworkMenu", b => + { + b.Navigation("Children"); + + b.Navigation("Privileges"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/IoTGateway.DataAccess/Migrations/20220517053158_changepublish.cs b/IoTGateway.DataAccess/Migrations/20220517053158_changepublish.cs new file mode 100644 index 0000000..eef5400 --- /dev/null +++ b/IoTGateway.DataAccess/Migrations/20220517053158_changepublish.cs @@ -0,0 +1,37 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace IoTGateway.DataAccess.Migrations +{ + public partial class changepublish : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CgUpload", + table: "Devices", + type: "INTEGER", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn( + name: "EnforcePeriod", + table: "Devices", + type: "INTEGER", + nullable: false, + defaultValue: 0u); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CgUpload", + table: "Devices"); + + migrationBuilder.DropColumn( + name: "EnforcePeriod", + table: "Devices"); + } + } +} diff --git a/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs b/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs index 3f6f2b9..38d417e 100644 --- a/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs +++ b/IoTGateway.DataAccess/Migrations/DataContextModelSnapshot.cs @@ -26,6 +26,9 @@ namespace IoTGateway.DataAccess.Migrations b.Property("AutoStart") .HasColumnType("INTEGER"); + b.Property("CgUpload") + .HasColumnType("INTEGER"); + b.Property("CreateBy") .HasColumnType("TEXT"); @@ -44,6 +47,9 @@ namespace IoTGateway.DataAccess.Migrations b.Property("DriverId") .HasColumnType("TEXT"); + b.Property("EnforcePeriod") + .HasColumnType("INTEGER"); + b.Property("Index") .HasColumnType("INTEGER"); diff --git a/IoTGateway.Model/Device.cs b/IoTGateway.Model/Device.cs index 911303e..7a5cb7d 100644 --- a/IoTGateway.Model/Device.cs +++ b/IoTGateway.Model/Device.cs @@ -1,9 +1,6 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using WalkingTec.Mvvm.Core; namespace IoTGateway.Model @@ -23,9 +20,15 @@ namespace IoTGateway.Model [Display(Name = "驱动")] public Guid? DriverId { get; set; } - [Display(Name = "自启动")] + [Display(Name = "启动")] public bool AutoStart { get; set; } + [Display(Name = "变化上传")] + public bool CgUpload { get; set; } + + [Display(Name = "归档周期ms")] + public uint EnforcePeriod { get; set; } + [Display(Name = "类型")] public DeviceTypeEnum DeviceTypeEnum { get; set; } diff --git a/IoTGateway.ViewModel/BasicData/DeviceVMs/CopyVM.cs b/IoTGateway.ViewModel/BasicData/DeviceVMs/CopyVM.cs index e8e121c..8bcd0f8 100644 --- a/IoTGateway.ViewModel/BasicData/DeviceVMs/CopyVM.cs +++ b/IoTGateway.ViewModel/BasicData/DeviceVMs/CopyVM.cs @@ -38,6 +38,8 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs ID = Guid.NewGuid(), DeviceName = $"{device.DeviceName}-Copy{i}", AutoStart = false, + CgUpload = device.CgUpload, + EnforcePeriod = device.EnforcePeriod, ParentId = device.ParentId, CreateBy = this.Wtm.LoginUserInfo.Name, CreateTime = DateTime.Now, diff --git a/IoTGateway.ViewModel/BasicData/DeviceVMs/DeviceListVM.cs b/IoTGateway.ViewModel/BasicData/DeviceVMs/DeviceListVM.cs index 84315e4..d1135fc 100644 --- a/IoTGateway.ViewModel/BasicData/DeviceVMs/DeviceListVM.cs +++ b/IoTGateway.ViewModel/BasicData/DeviceVMs/DeviceListVM.cs @@ -37,11 +37,13 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs return new List>{ this.MakeGridHeader(x => x.DeviceName), this.MakeGridHeader(x => x.Index), - this.MakeGridHeader(x => x.Description), + //this.MakeGridHeader(x => x.Description), this.MakeGridHeader(x => x.DriverName_view), this.MakeGridHeader(x => x.AutoStart), + this.MakeGridHeader(x => x.CgUpload), + this.MakeGridHeader(x => x.EnforcePeriod), this.MakeGridHeader(x => x.DeviceTypeEnum), - this.MakeGridHeader(x => x.DeviceName_view), + //this.MakeGridHeader(x => x.DeviceName_view), this.MakeGridHeader(x=>"copy").SetHide().SetFormat((a,b)=>{ if(a.DeviceTypeEnum== DeviceTypeEnum.Device) return "true"; @@ -52,7 +54,7 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs return "true"; return "false"; }), - this.MakeGridHeaderAction(width: 280) + this.MakeGridHeaderAction(width: 300) }; } @@ -96,6 +98,8 @@ namespace IoTGateway.ViewModel.BasicData.DeviceVMs Index = y.Index, DeviceName = "    " + y.DeviceName, AutoStart = y.AutoStart, + CgUpload = y.CgUpload, + EnforcePeriod = y.EnforcePeriod, Description = y.Description, DeviceTypeEnum = y.DeviceTypeEnum, DriverName_view = y.Driver?.DriverName, diff --git a/IoTGateway/Areas/BasicData/Views/Device/Create.cshtml b/IoTGateway/Areas/BasicData/Views/Device/Create.cshtml index 4d8abe3..6aafbc2 100644 --- a/IoTGateway/Areas/BasicData/Views/Device/Create.cshtml +++ b/IoTGateway/Areas/BasicData/Views/Device/Create.cshtml @@ -2,15 +2,17 @@ @inject IStringLocalizer Localizer; - - - - - - - - - + + + + + + + + + + + diff --git a/IoTGateway/Areas/BasicData/Views/Device/Edit.cshtml b/IoTGateway/Areas/BasicData/Views/Device/Edit.cshtml index e89dc3e..915603c 100644 --- a/IoTGateway/Areas/BasicData/Views/Device/Edit.cshtml +++ b/IoTGateway/Areas/BasicData/Views/Device/Edit.cshtml @@ -13,6 +13,8 @@ + + } } diff --git a/IoTGateway/iotgateway.db b/IoTGateway/iotgateway.db index 17446f0f73a810aecc29b086d9a6be90c5388ec3..5900ba87c412ca6d8b4134d3718c1980670e5f3c 100644 GIT binary patch delta 386 zcmZo@5N>D?o**r#%D}+j1H|4y%m&0N6LpLkRW~Lq;TK}(mtf$3!heu|0e>BTEWaJU z#AZbWCVn*)c4k*`BLgEN15-nD15;x|Q;YcIjKsY3)PmBaoXp}3Gd%-6!^w8?$ACuI zFz~hL&=4D-5o-L33e2vI_)K7Lj@92DtIxPXK%U_v1OH*Zd_E1Hn>tfR2KaYhGG@QF3ZPYEfoBM09$cEtAZ2Sue(`%Uv89+1bn`*u=e6Cp)rBY!~om z{FcHN#lXLWH)=c221Y+#p+;vW{!mE{-cU|XM{#HIP)_FQg~CiK(V*wlX%iGPTe%GBLI^GdG>Sdmp1FGsCNdc7=V6K+FWh%-a?Au{>Y|0BMnEod5s; delta 273 zcmZo@5N>D?o**r#!oa}b1H|4y%m&0t6LpLkRW>Fp;TK@zw`1Uc!heu|0e>BTEWh1m zK?5!R$#(L`fHJWR{IB@W@NeLs%wNtQ3zYHXZ;sX99;?r|LO`C;g@OMtUp}7(&rO~w z+*#b(j4oWCI9xbHSuI)qF#X=FsGz{O{F5^yJ6Ef=B)hn@G-H?U_TLVSTNo#QU=f|( z=gi1CUBQ|05}UaMo4B{?WJh+1?E>D6-%{A(8Tgm*#&74@!05+2F@RN|(T<5XRFZ=? zl#|m@+*v$ydZ93r%Jd0)8GR%Sbq$SljSLiwjI9h!tc(rxEX<7zj7`m^@7~9#)vmaY Q5r~<9n0dS6K9>880DRO(WdHyG diff --git a/Plugins/Plugin/MyMqttClient.cs b/Plugins/Plugin/MyMqttClient.cs index 462d7c2..9e43c3c 100644 --- a/Plugins/Plugin/MyMqttClient.cs +++ b/Plugins/Plugin/MyMqttClient.cs @@ -329,6 +329,7 @@ namespace Plugin var toSend = new Dictionary { { _devicename, obj } }; return Client.PublishAsync("gateway/attributes", JsonConvert.SerializeObject(toSend)); } + public void ResponseRpc(RpcResponse rpcResponse) { try @@ -418,34 +419,83 @@ namespace Plugin return Task.CompletedTask; } + private Dictionary> LastTelemetrys = new(0); + + /// + /// 判断是否推送遥测数据 + /// + /// 设备 + /// 遥测 + /// + private bool CanPubTelemetry(Device device, Dictionary> SendModel) + { + bool canPub = false; + try + { + //第一次上传 + if (!LastTelemetrys.ContainsKey(device.DeviceName)) + canPub = true; + else + { + //变化上传 + if (device.CgUpload) + { + //是否超过归档周期 + if (SendModel[device.DeviceName][0].TS - LastTelemetrys[device.DeviceName][0].TS > device.EnforcePeriod) + canPub = true; + //是否变化 + else + { + if (JsonConvert.SerializeObject(SendModel[device.DeviceName]) != JsonConvert.SerializeObject(LastTelemetrys[device.DeviceName])) + canPub = true; + + } + } + //非变化上传 + else + canPub = true; + } + } + catch (Exception e) + { + canPub = true; + Console.WriteLine(e); + } + LastTelemetrys[device.DeviceName] = SendModel[device.DeviceName]; + return canPub; + } public void PublishTelemetry(Device device, Dictionary> SendModel) { try { - switch (_systemConfig.IoTPlatformType) + if (CanPubTelemetry(device, SendModel)) { - case IoTPlatformType.ThingsBoard: - Client.PublishAsync("v1/gateway/telemetry", JsonConvert.SerializeObject(SendModel)); - break; - case IoTPlatformType.IoTSharp: - foreach (var payload in SendModel[device.DeviceName]) - { - UploadISTelemetryDataAsync(device.DeviceName, payload.Values); - } - break; - case IoTPlatformType.ThingsCloud: - foreach (var payload in SendModel[device.DeviceName]) - { - UploadTCTelemetryDataAsync(device.DeviceName, payload.Values); - } - break; - case IoTPlatformType.AliCloudIoT: - case IoTPlatformType.TencentIoTHub: - case IoTPlatformType.BaiduIoTCore: - case IoTPlatformType.OneNET: - default: - break; + switch (_systemConfig.IoTPlatformType) + { + case IoTPlatformType.ThingsBoard: + Client.PublishAsync("v1/gateway/telemetry", JsonConvert.SerializeObject(SendModel)); + break; + case IoTPlatformType.IoTSharp: + foreach (var payload in SendModel[device.DeviceName]) + { + UploadISTelemetryDataAsync(device.DeviceName, payload.Values); + } + break; + case IoTPlatformType.ThingsCloud: + foreach (var payload in SendModel[device.DeviceName]) + { + UploadTCTelemetryDataAsync(device.DeviceName, payload.Values); + } + break; + case IoTPlatformType.AliCloudIoT: + case IoTPlatformType.TencentIoTHub: + case IoTPlatformType.BaiduIoTCore: + case IoTPlatformType.OneNET: + default: + break; + } } + foreach (var payload in SendModel[device.DeviceName]) { foreach (var kv in payload.Values) diff --git a/iotgateway.db b/iotgateway.db index 17446f0f73a810aecc29b086d9a6be90c5388ec3..5900ba87c412ca6d8b4134d3718c1980670e5f3c 100644 GIT binary patch delta 386 zcmZo@5N>D?o**r#%D}+j1H|4y%m&0N6LpLkRW~Lq;TK}(mtf$3!heu|0e>BTEWaJU z#AZbWCVn*)c4k*`BLgEN15-nD15;x|Q;YcIjKsY3)PmBaoXp}3Gd%-6!^w8?$ACuI zFz~hL&=4D-5o-L33e2vI_)K7Lj@92DtIxPXK%U_v1OH*Zd_E1Hn>tfR2KaYhGG@QF3ZPYEfoBM09$cEtAZ2Sue(`%Uv89+1bn`*u=e6Cp)rBY!~om z{FcHN#lXLWH)=c221Y+#p+;vW{!mE{-cU|XM{#HIP)_FQg~CiK(V*wlX%iGPTe%GBLI^GdG>Sdmp1FGsCNdc7=V6K+FWh%-a?Au{>Y|0BMnEod5s; delta 273 zcmZo@5N>D?o**r#!oa}b1H|4y%m&0t6LpLkRW>Fp;TK@zw`1Uc!heu|0e>BTEWh1m zK?5!R$#(L`fHJWR{IB@W@NeLs%wNtQ3zYHXZ;sX99;?r|LO`C;g@OMtUp}7(&rO~w z+*#b(j4oWCI9xbHSuI)qF#X=FsGz{O{F5^yJ6Ef=B)hn@G-H?U_TLVSTNo#QU=f|( z=gi1CUBQ|05}UaMo4B{?WJh+1?E>D6-%{A(8Tgm*#&74@!05+2F@RN|(T<5XRFZ=? zl#|m@+*v$ydZ93r%Jd0)8GR%Sbq$SljSLiwjI9h!tc(rxEX<7zj7`m^@7~9#)vmaY Q5r~<9n0dS6K9>880DRO(WdHyG