From fcf53eec8bf9e918684b5508bb236734d4591aad Mon Sep 17 00:00:00 2001 From: xiaochanghai Date: Tue, 10 Jun 2025 16:04:50 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E8=AF=95=E7=AE=A1=E7=90=86=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E4=BA=BA=E5=B7=A5=E9=98=85=E5=8D=B7=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/Tiobon.Core.Base.dll | Bin 176128 -> 176128 bytes Lib/Tiobon.Core.dll | Bin 245760 -> 307200 bytes Lib/Tiobon.Core.xml | 1072 +++++++++++++++-- Tiobon.Core.Common/DB/EntityUtility.cs | 2 +- .../Extensions/AssemblysExtensions.cs | 22 - Tiobon.Core.Common/Extensions/Check.cs | 163 --- .../Extensions/DictionaryExtensions.cs | 16 - .../Extensions/ExpressionCombiner.cs | 56 - .../Extensions/ExpressionExtensions.cs | 211 ---- .../Extensions/ExpressionExtensions_Nacos.cs | 143 --- .../Extensions/Extention.Expression.cs | 383 ------ .../Extensions/GenericTypeExtensions.cs | 373 ------ .../Extensions/HttpRequestExtension.cs | 37 - .../Extensions/IQueryableExtensions.cs | 423 ------- .../Extensions/MethodInfoExtensions.cs | 16 - .../Extensions/TypeExtensions.cs | 92 -- Tiobon.Core.Common/Helper/Base32Helper.cs | 99 -- Tiobon.Core.Common/Helper/Base64Encoder.cs | 232 ---- .../Helper/DynamicLinqFactory.cs | 515 -------- Tiobon.Core.Common/Helper/HtmlHelper.cs | 23 - Tiobon.Core.Common/Helper/HttpHelper.cs | 54 - Tiobon.Core.Common/Helper/IpHelper.cs | 49 - Tiobon.Core.Common/Helper/JsonConfigUtils.cs | 238 ---- Tiobon.Core.Common/Helper/LinqHelper.cs | 29 - Tiobon.Core.Common/Helper/LoggerHelper.cs | 32 - Tiobon.Core.Common/Helper/MD5Hepler.cs | 96 -- Tiobon.Core.Common/Helper/NPOIHelper.cs | 967 --------------- Tiobon.Core.Common/Helper/SM/SM4.cs | 297 ----- Tiobon.Core.Common/Helper/SM/SM4Helper.cs | 93 -- Tiobon.Core.Common/Helper/SM/SM4_Context.cs | 17 - Tiobon.Core.Common/Seed/DBSeed.cs | 4 +- Tiobon.Core.DataAccess/ReportHelper.cs | 7 +- .../EventBusKafka/EventBusKafka.cs | 5 +- .../RabbitMQPersistent/EventBusRabbitMQ.cs | 5 +- Tiobon.Core.Extensions/AOP/CacheAOPbase.cs | 2 +- .../NacosListenConfigurationTask.cs | 2 +- .../NacosConfig/NacosListenNamingTask.cs | 3 +- .../ServiceExtensions/NacosSetup.cs | 3 +- .../Helper/CustomJwtTokenAuthMiddleware.cs | 7 +- Tiobon.Core.Repository/BASE/BaseRepository.cs | 11 +- .../UnitOfWorks/UnitOfWorkManage.cs | 2 +- .../Utility/SerilogRequestUtility.cs | 2 +- Tiobon.Core.Services/TasksLogServices.cs | 4 +- .../QuartzNet/Jobs/Job_URL_Quartz.cs | 2 +- .../Common_Test/DynamicLambdaTest.cs | 8 +- .../Common_Test/HttpHelper_Should.cs | 2 +- 46 files changed, 978 insertions(+), 4841 deletions(-) delete mode 100644 Tiobon.Core.Common/Extensions/AssemblysExtensions.cs delete mode 100644 Tiobon.Core.Common/Extensions/Check.cs delete mode 100644 Tiobon.Core.Common/Extensions/DictionaryExtensions.cs delete mode 100644 Tiobon.Core.Common/Extensions/ExpressionCombiner.cs delete mode 100644 Tiobon.Core.Common/Extensions/ExpressionExtensions.cs delete mode 100644 Tiobon.Core.Common/Extensions/ExpressionExtensions_Nacos.cs delete mode 100644 Tiobon.Core.Common/Extensions/Extention.Expression.cs delete mode 100644 Tiobon.Core.Common/Extensions/GenericTypeExtensions.cs delete mode 100644 Tiobon.Core.Common/Extensions/HttpRequestExtension.cs delete mode 100644 Tiobon.Core.Common/Extensions/IQueryableExtensions.cs delete mode 100644 Tiobon.Core.Common/Extensions/MethodInfoExtensions.cs delete mode 100644 Tiobon.Core.Common/Extensions/TypeExtensions.cs delete mode 100644 Tiobon.Core.Common/Helper/Base32Helper.cs delete mode 100644 Tiobon.Core.Common/Helper/Base64Encoder.cs delete mode 100644 Tiobon.Core.Common/Helper/DynamicLinqFactory.cs delete mode 100644 Tiobon.Core.Common/Helper/HtmlHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/HttpHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/IpHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/JsonConfigUtils.cs delete mode 100644 Tiobon.Core.Common/Helper/LinqHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/LoggerHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/MD5Hepler.cs delete mode 100644 Tiobon.Core.Common/Helper/NPOIHelper.cs delete mode 100644 Tiobon.Core.Common/Helper/SM/SM4.cs delete mode 100644 Tiobon.Core.Common/Helper/SM/SM4Helper.cs delete mode 100644 Tiobon.Core.Common/Helper/SM/SM4_Context.cs diff --git a/Lib/Tiobon.Core.Base.dll b/Lib/Tiobon.Core.Base.dll index 7b4f60cdb988f6a804695ad13a0c68ba19dcf952..b0f785841767122caa696cbb5cb09b5d14ca1318 100644 GIT binary patch delta 20827 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 Ezfg_=VE_OC delta 20778 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 C6X9b3 diff --git a/Lib/Tiobon.Core.dll b/Lib/Tiobon.Core.dll index 9a5b89f999547f30f0a0c9d5f2bbe511727fc196..2c99faeb90c07a14e1e5dc2a176887dae8c0b458 100644 GIT binary patch literal 307200 zcmdSC37i~Nx%XdF-Cf;XJ(HxSC*89o(?iG%MfXfrmPx`ARuLDXB4lCTl!z2m3o65m zBg&$(hyp4iB8vNdUC?`75OEhH?pKWHbw#fi_dWc-&vWW@S5GDw{ol{~e%^dCb)NG( z&w0*sp0l4ib^1wLU+!ca$I0^d=%bEvH?I8KsL#iK%o4ny_R$5-2Z~?b=kBg2etDl0 zpLu?B>y=uO8s z&J(*b&JB0`=2n~9L(a01Qr9ZSc`I6Z2K~?{phut|5>1^&O1nmH0TdNtB)b?$UQ*_uXUz*sP3!9J*j1Ff!*x1qN4v1S*kZxmUJiBf>tuO z{t2TuCC_wOe&8>Uo9M{1GR#~5Uf5BV!uOBz)~bI8b?U6%l+M&xbne+*XJPcFLyVBFRpfJ38g2rl&24?Ha7#x)Vp!f}-1OPpo0h9nBWdkU&-JMztFi~=wPawf* z@ffK7WW=hs`9ujBka)yjWaBFV5LiG7fL;qI0Z_Jp5&(S`Py(PLzoGzXneU@KLe09)zR}*s2kE&y=I+9^b{Dq>SiAXQ89Wd{xx4Tk?MCEFcUou zG&`QjHoT0s^FB zHqF7|?efkR_#A=H<>5_9I`uDTw>j#D)N(I64`>VzHL&f$h>6Gaakm=gO!#X83~y~= z_&fCouL)55f0z6*Vg$y{Zb;YQMcb8g9nTOYrO>4ib`K;QUdaZoRu+krFrum#l3}mg z4e3sjk_wp(G*TRHsOg*rLyzXPoJ~TX2{c}$gEN^fgaH0TZ;&k*fZo#*MN700HAHm2 z7?5(zI4>ffwBkMHQ?f!nrJ}pLJZhKM#0q}MJiruSNtKhatDe@cR2(l9tcLkwbODi! zGDXI=Vm^8{z?v@?I`zppm!l88LXes8;!~-B2$i%=-7^EFL81#0P+h$*=G${2m=s|V zJ7?y%Zo-pNq`WHUOruA@f19M1zgm9JDN3C%(%g{o&>LUtmGZsra5W!BDBJ7Cr^`rj zkqapFV`exuCG?Z_z!NqJoS|1Tt?CkpUEZZUo6i+&RzgC0@P^i-`or$E zGG4; zo0O10EuB&lI3T1MW9cX!!_d<655lZHtr7r37El6Ui3OAZSZVt&`t<~mu=o&LBuQ~KQHT~1hYntX)5Sd4zYQP=o62g5pLiT{Em{wF13 zZu(Q=WT)>HXXXWBf_orcI;U9?HVYEHkca0@Nr2W}Z%Sg-M#3v3U`pcZ>_Vd&K5t6o zm+~R)kQQm?h3~=bLx+sE?D1AZcriS#ju`!0vs*VCaynec4t+m`-q)h(soOl2s% z64qYk3s>(LLMlY9K4_8Bm-Uj1v#(6K+r?Ux~FVQl0r@u^e=?uN`qg2ND zku%o;QRXj|GQUyuUP$bjFM{d}kHysK^K=&Xc6hir+%fG;aa8j0}q=;j1JxZg<^%ZbDKSYmkfkUqFk-<}zrD2};V%OU1-qgP9U$Qr_4 zC*sn#1|gkbgWlp+!u*}JvG^D0=|-=`8|PeV(~(fM?(jFHwA1lszSL>0Ys6Z&!7@54 zAt7C2quzzhV0VfOof;d*O|B#hm32DA_*;K3@A*lNeskO4!QQ|PSHmsBzzCq-{Fm4%?0GP0V z5{R;#D{O!g>)q#7Ig*0t1yjv27Px_T5bNJ_D6}~6H2XC;@-BlrOm(Gz`M&pNwr!*K`ZuW^ZA|So2UB|~_7~F@#`kf< zcan|hT|B0x*|_olkfLczVkytGqH)$BA5ouFVk(lX@v~iKjh`JaWVPC`3^%nr{yjos zUVWHam2Lp>qY{+KbOdSBh>HTgTZ+S5y!NSyq@^t|k?qAR1$vKYtPRUVK2*T>O5_&b z5gmMuqijHR^Qa#`sUt8+Y#t$7I{DJAI2*ptDxqV&v`r@YK{zPm$PymD8=p;lFT}oH z_WCwadD>>BEKjF?sq759O27cX86E zWHRx~Bo|`Z>gI?FfRUD5_X)ZKdA+j{p?8i};~U_)bF@Em=jcHEL8S-1J4c7&9}69R zK(Z>V^Tx9MZ_g~TL=PA8bXGO=o*K3}*^XhdLbwe_j(cGFUd8sNm&x^SImUDJ&5iRvxC~{^Gx%d7=G@EQ3mDr4V zgxbs$h3OOv@oSLbHwF!uR99VHRJTMQl&YMJiCJCgh|T}W`0?vV!RS(#dT@l+gLeU% zdLVw)Zv_2Vv&#;w@?;tBWZfIj!+UI!mt=g|ZJf=-ACUxPfM3*=G2`r_E-QJiMAP4% zgG?FA_arl?V_7LbXA~)!wBq|DLFut1LG6H`_LQQO2YGX9|3Z2TjDp>TIf`_r6p6no z+I+}rQ%J}?siXbIXV7Qle^Z|Y#$r9iIg0jV29p=7T1wJ6it(h~i`vpbeotI2eXMD@ z=`O2zxC(F-ZRj4eqdg1(V37TX znV0dYzsqr!{a?@fg1oUyF38QbOD?nIpRx-B-tW`)v9af|&*)H)`$tClO=_T(4u{%h zX2?`AJOipO15i#z+AdEjq>j?UD{~RC@o~8FZ!bkH%%qkH^ND>pH6G5V)51*nVH&jz zi_$BmHQI})%=zbyYVvZV$;#g6MW(FCo6k7uHH_&6{N4I!vnWUwCGkQGtOG)Ofndgg zycx!f)y3vdw0aJ=rVfdzT5~L2=tvQcO0kU&>ZC-LVt0-%p*WZBR-7XDcq@15KP9(S zBujQH5@XkYU9Ksw`Q>JvZ*(Q&dH7K#yX%>LI>usVXkX_}$$Zv$O7WAhgg^O4;3Ez|#1q0wgKlp>}HL zaNT2M!3ZJ?M)F` z>bjK0r?W5PtUJ-0iBCqh+9A{Y4`tB|WLIzOb!uV1dGX>TFISwHw@?>_AA_$K6ZEq| z+3Un#Y-9R@B@vXXtbV*X!;)Jm!uH=y*jL&SbN@h?Ysxy~ux2*8n|DcMV4uSOD;bb6 zrmerre!w{TU;O`w{#Ur;MK}5cWnWn}pW5cV)AMZkWRkN+;Q+N{;ykGU19NNBTO{kI zHo4I!k!;@KIq}EZ0jcfy<_saelV9iQMc?2lZNpU? zkT?2Wy3f{&FyV5eZ}JS;tY}c$=J0`x8Lq4a_1sj&cPHFR-JM|w@K-Eyb>F_%3BQAP z%rkZu{*gBS_&~zV;YW&+G?jbY_39bbmodN@L!Ziagl8(-cbER3E$JegvUJ!^4 zJv(z_eLXv!qLhK{OSW%!a?+QGK39VC!ZVk-t4Z$)a0Qc zJ6Fd`E^!vv{%$KeVu(OrG0{#&lFHWKYKuQY9wTb_V_d(n(hdJc&8}=;Jv#FKJZCqm z&7Tku{!||HyFQ2XUFnS4x|tPjzVAt#o#8^O{bp&DY>x0YCl8c>iv_$uAIX zdXw_1g6Qw86gwvxRruHZrKs@Vq5}QNuf)Tam1q|}f=gS^IaCPgE9mDIW};t%j^{J- zV&1RQhxOGtRQy{!=9I7N)-%!XglDOH$tNh_@t%w!!rw~_4!Qk7-RO@v6ELg5Wtr$t z_$#;arAydDB`9U=_bK^1!#_)mMBKia9n_=r!Q#M#H2(tEwGw7ohci1ccbc_3Vg0KS zNI7&(pfMGX!b;9J6`d=)9NDWTzvOO5#fqq2w-|D?lDRYbJKUpc0zbZ(77^_ND4D9z zU08Q40t)f-C4jEWUw4rD_2tt;;vZ8#2bwR6_{hf}UtTC^v+v*1A9Vp#j1vn-C89I& zdm76Mm8u3>R^!vwmhcqI*-AM#$pnl&)6y2b&RNk|t8&H*`yzh)?`hJk(Y&;uvLH7Fd51)MW(MR=syo|o}Z<_HkTq0AK zF?Xf_yB?n@LhSNc~umeuz&<5f4pet!HNxXosPyn3ZSFz`aZ6Xp~MeYJVz zssz9`3n&3_iUpLgb|m0b8=wThX%y z8dYXY*6n$R0YT=toTHS3Nq&l}w1dvlbX?s#=r0Y~vx7d1r zjljBou#o3_nlI`r_cLq}DM6W?X#phw&a!|K0B2i334n7fpaj6V7El72uuA{Fog8=wRtW-XuuzzZ#)1i%#* zPy*mZ7El7<#THN^mD-gyK#5eqRW?8gL|knFB>=9mfD!;Nv49eHy3M<&cheHzZGKot ziRm^kbRmVMUEnXZF_l2n%PgP-z_k`o0^m9eC;@Q21(diyNnHfG&3$R*(;_M%MM$EE zaJLn?0iT|pQ6goIm)ig(NbW`pC;{*a3n&5bN((3faFYd;0Jzx#N&wtq0VSki2+>yW zRW@9SlzOkW0ZJh0H5O0;;8qJL0q|N2C;@Pr1(X1IoduKtxZMIu0KDD;N&wtp0VM$5 zU;!ln?zDgs0B^K_5&&-fPb@q5&$2tfD!;7w15%- zAF_ZF03Wu15&(BwKnZ}4SU?GYk6J(pfPc4u5&-{U0VM!FW&tGtK5hXe06t*>C60G> znLaH7+jaVrmPZL9-D3eI06t{_B~rEiUK^kUoS(LU5&-vEKnZ})SU?GY&ssnUfX`V# z34qUAKnZ{^SU?GYFIqqefG=4<34kwKKnZ~REuaLzS1h0ezzz#20q|7|C;{+*1(X2z zngx^q___s@0QiOllmPgq1(X2zmIagm__hU<0QimtlmPfo3n&5bT?;4y@Sp{h0QjB- zlmOUi0VM#wZviC$9;Y60VM!_Y5^qx zer5qBQnm5tHb4nDAGUxJDb8Qm043o3r3I7#_-_j+0q`peC;{+47El7<5eq1hO6}J+ zKnXa1V*w=qero|G0DflyB>;YJ0VM$bU;!ln{%8Ru0RChFB~tqQ*#;<)3iyi+Py!Ku zwSW=;f3tuR0DrfD5&*j_paipkSITTd1iH=TG7At%s&mkqTft!vrXSh;9og0l?OV;ZOpA{S5;s0l+4Q z0h9n>-@*V&00b6L0)QO~!=VHK+Y|;+0)V{=11JH&ZiNAq0ASC-07?L`^MU?0E$N&v70V*n*mres}f0+fK0Wvu~}0ANvT03`re z-x@#(0G6f(Py&EitO1k&ph6o!2>`020hCDT!w#ScPy){VET9BHXaOYvxD3KXQ39ZD z0VMz$7Et0mW~(CI9l7JGE@xWgwj0H`WmST>6BbYcV1)&gNU6Tk1}FjNDhnt9u-XDj zq@u2|0ZPER)&fcZ9AE(@0N5EZxmE&zy;K7z0dTMdlmM8tfD!=fET9CydJ8C#QgDL} zPy)_FET9Cyp%zdA;4lj)0dTkllmOUh0VM#Auz(T(M_ND$fTJv+L`uP^UJjnt|06f_ON&uW-0VM!7SwIPZ zr&vGqgQoMHhb08X`l5&)-JKnZ};Eucgy3uo8>CEz^M0!jd!WdS7s&bELOcI7Ye zla;^3Ocvb2((V}OF?=0rl|U5zh5?iSpg%Hz5&-l^22cWk{>T7I0MH*9KndL|4IJJk zun$;u<&A8f4O1_qFY@bSRo=!Z)xlTUjjv+)E^N|g`J?C&4WI<2OsDBj3%lFAk))=DF)46i zY0JLYW|+G11Lc`yUtch z=|Jj(t8W;lMHb_iNHAJA>8g1@vVfgm2rr^P_A}A7^q9Sj(D=7PiB;o# z2}(>GFBVE{8m|;e>=Hj-D9KyAMJUlPem+!fqIOP`q0QGLjk7NVpAo^~v0xJ=Lo=}X zV|8=Rql^v{)Fb^Ek5}691>L-4VubVSYn0m!8QuK)LB^8_j~Czi#Fq`9Al_7Uzk`NtB-m{NU50{{OEOpF}XV9F_39pq5 zR8ecfmmkhO59nL=)RB${w1-INwTV zbCr;<7tPtSoLpQgU)u#US7XKKiI{0d>=_?RhO`d!a8$5W2ecMx1>jYyRv|ut*6QQA zBXY4%e4@m=F)Q~Yr7XWVW%>1N2sxAAr>wHoTSHU716sd8IQuIrOYJR-aU?s3$8LT`0oxym) z7d>LI1#$NR(V?~w>^BBm6fYM{&lQ(>@AnBB{b+?RR2I3Di<6wt&>Lm1ws>w%yy*7` z*)2N>JU34XJU3$ryj$)PeD^FS0lVij3D`ZeNkA*dbz_BqqYZyHR_KjSGFTbxj|S^Y zTPEMKOdiW<^%>Lfte%hT&W#^!&+5lBDynMhSjYsJ_oV&trxhPaMUxZXZS!|G7Eo{E zFTtj@v3o&wyqGV9%$NN}9)fwYKXVOrxVm{(oSpkd%#{7`DT2Sm;Nt8onL7Ve@CWNh z96+s1{yoUVO8)xsucD+O_22IxBm*kl{nEsn2HD8HIw;&@ovBveL zBt-iQZW&^-?@wg=N{xX+w#h`_AB~vZ`=!wcllT$yct2O&cn=13o2LuHd|PyTx9G-% z+Yk2@+b-wPvmjepl_@q>7iS(I1wF^|Rft{Q%Y~U~ygxcCA>k<8d~Z3{idl@#C6sF@ zkL=Bc=LyMqndliJUKAW}BtD~J+2j0=s;QN&gh!Oc5p|L9Oq_`i?p(krxXK1*;X2+w znCoBryv|I#ry~%ZVPfxU%4TmOd`bMF9OCv}18KG#I( z*zt8~n=(s?9~6qcdf#0fewYqJPokD$Bwv(|vpn_qV;GXt?wwo5^4iXm(^zs<=pppq zw@LxcJ?6SJ$koOpCj7n}4yNDbs8+;!!q>Cc_KMIVM;boH?Kky8y^Dzf_k%ivFE!_* zN=RE#a|C`jMQ^f3 z>rZr{c3WNYX`kia;u=V;)&Rvi1((eo$ z=Sf}He8bY;>DqRHtGJvQel_)-{>rr5vF4?uV-7Np=_RjxB>yG~D|#+?)mUz4r+T-E zde2k!Bt&lWZp?hYljn89!*YXcN{HN8+6YlNsmSJL$%1wV5sMs-+Ri-GDdBdJz^Vrc z5+Zj+HfDa%$@6;QVLb$ogoI3IO)5Rbh{X|o{Upu7X}%3U=}YLfStL@s`949Vr4CXupN(A!*01`6h^sAi^MOqkGb7jqgq z$W2Mw(Z{KfHro4J!E|J*b-r;@Z(cPm7xF4*6w`ucb7dh}5^lvP5)!{AyP9^Q(e-AD7=l?VGWwSAGiY=zBGY^=bM-6jH$gc)Gr0#l{Ipa4T_WFfjS`|= zBgW`5qu^A_Q`UU?)$M*Nno9`0m)YdcF4qFJi-|0~AY%?9th z+t}c$<_)MaE34g#E)OcRvKY{BILuB08xF9TO$#LeUTy&;0B*E^5_U_1fLGW6B>-M& z0VPtL%%)5tO2B!u1(Zl}-eLokfb&%rP$I?2tj)+&0?yZ1K#3IRtu{ajIB8HOsuBRV zSwIPZ*I7UbfZHvgL`wMUZGaMR-eCbH0N!8$B>?WUfD!<2w15%-Z?b?A0C!nH34k|S zKnb&-b-FYG{<&Jh)1pv9iYf^yN+hHtpOBJpLQ0YeDTyVdB-7p#W@c;*s08Y~)dETY zyv+hiT$)Ic(1aAcE%5D@T?yj9!vabGywd_o*aFb~;Kz|?IwZc=3aPXHw4ZUZy^cFw zQa3Z*t!{R@N8QEK+$~1<<%TUhiZ+_~LMn3dy&j#GL-*B^`D@y!$o!4End#rEyLkE$ zbuTx;a$~T_65kwI$ZN^s)-#nwCy$$%?n?C9Wn`J)@E9XYd?{Iy*NrJzi!`n~9VD`P z)y+ATZ8bu-hRy4mTxx{If|{7uTju!W4SB3pcO^rMtoGXIe1_s2v(E|?P; z29{5YM27f`4C)Hqj_%ab+oXTg}BNx`hz*DJ!a9h>D`&dNQm66-;gg=dE+yLX`A%(e3aETm`ch=^!BVhFs$rJrNG-ozz`^$H7!U&1l-b zZEJ;3CNW;!wCal%qLyC7AmEo8%v%`({BEz;4e9i`06wHM=K@V0O*(BqqNDcn(K1Njq39|3lzBUCI$cKE7Q1#WW+6P3r!5YUyH0G_w43`8n`$>Awn+)`YV%r& zt4(G+UscT1(VWvHJ?b{!Bjz%CWB!DjsYAK-9j?ToAN4~zJZ^oAs7ih%dM{6}`2}p_ zM(=};-p?bmTVSRg$QAGZ22b_6tu*J+3U`p4Aazyq3nh0RwfgE&3@zj4n7Wzi{nX7) z@2_rdn*9yJ7f&x&_j1D?(nCrgF22?{kd=3J=Kkf3{4@yb4|C_qP&WD?>hQkD%UuwD z2vWXS@S~@~ll14V?*GxOM6bIEoc;(8(d(n?W~TpL-R$&#sGFPqn7WInKd$cOhCO_m z(Mx>cCwbHlb9v7c(%Kr8T`u1cVuQRx!urpRJ_XN?Pe`YycBkU{{9J?y#Fs5`zYsJ$b~}^tChKgsHqA^^VY6=L`tzr$t^7ETJO@slsJfNu4+xMT+os7% zwlV5*A(CO)k`Cu+KEay@3|kT@0jFsJS?zCf&Wl)IQ>Vq&$C7o<{1bNFJ($CNr? zfL>F?uUzN}DY^yzjkh&&cq_LB+_75rB|xIBd4Mkja0j=lfO4Vb?d{^GjAEr+n!JI0 zdO>Mm>y0IKs+(`@R-%9NjrkDRAGnF;POzrSh zSugX-dTpe>qRHX@($ZjM|~ z1*HZy-xzq*f$kt*TP2mFr&!qhKo7o!Qfs<{LhTS!jrgG*Dn>Ra44l4%0I5U*xvgDWgk{Z7 z1G(%$%7txJhaPs`vZW-r0)_JF@$#?Ctj**fsB59rHm>;Evd%IG18ic>3lj-g9^k#)_W;I`fr? z_5F_hjhlr|d=?z$JkboZW=z<@;NHcArYk&|n!6_f7wnCIEsr5!rX>IqO5I>ho7_{h zjcCc5bllUcO6uI_LP_jNnOC=DJw|R$6=m*p+rN0Vd$#q~lTec1Q%ZL~c1lLT8IK`g zXG_2yN`^*}l+51fde&nk#gCIbRv8;z&wUI52kni3XFP_0BlkwY`HvysAJj6Fg=am6 zfD`vdgJ+8X>R`^ffqrER{mRJCm>c+B?U1ddJdf@|t$%BeTim{lpN9*w#qC?S6rghn z&Bz3j2k|mLj+lcE|7r?kZAFDSFC=r>sIF(y3| z`|)E#3{Z{Knlipc>c9_WC~(6|iCF5(SEB#I?}g97+l}u>`0~+@dG<8Qy_xVQP~|K| zldu5&6lmf{ylUg_VYaiABPQHg(OPOU=*bV9$@?Cc-H(xHm{(s?uLh`BEL4Il%hwl> zrrA@vz<6paD$&o7&ae9w^zNI+6OxN>%%W(=pmfGZNhf_jx1x*>y8IFuqhF&?Y@c%q zFAePIU{W!Q;q!Q!fGeO1xwXZ_Qhg=8lqGlA4ZLQrAL-VXMY~7==K>tL zuCLpzuBAxA4MeQtu2J48i zKk%%&l1`MJtM1oY>b}(IBkd*UoI&+HL)r@qE8kyST1-DWd5AQSqW+9EI}(f69uZ`( zl~uXgZ(R?e+!~8%{r)Y7JW7UZ%gVXloJ+TIa3eNaDSI z{F^oy`9NcZ9J`iTPFM3?C%=u=Ji9xjk~C5;~IrBpnh6`gb@>z+kQ z&=R-1aEyu{?(; zPZHtqJx8c!y!M7@*e&8aqHg@xqaN|EM?EsF{n2SphjNFeLk<&<$#BNxA^sCpqj?X7 zcv*Rs@9d8WRI~X6Y?ohl*-6io!>Mo5>QFk~#Pu*HEex4!thQtu1_$EVi$8R@8Py9JUEQo(% zh=uVl4Y4Txn<0X@yH6CV^~TE$QH~E0f*;{rNT!;Lq$C;18({z?njfir{qb4q4#YF+ z^2vj^I?IT!g_J`y{;Ul7%uuJ;bvGvulmNKL0!jd|!)-W}0JzrzN&v9EZa9Ds0 zO4uzB>oWiClHYOGe{OgK#kw=^%H@Kbr8o0X$0-z?yf7TgJsn8nH|6*wO{h9I0Y%pn zhxf~5+>Tkp@X8*fYwmP?FT$97NMBiUIRKShR(8CbF(+HEA;5f$L_Fyu{vG!$>5sq3 zj7Q!@@?_j>+@u;){tHRd~3S_*P-9LO1()@Tum2IME=_XoyGs3-iV6?{6+q_6lzXB7SL+ zC?YT#mM9;cFG?l5rxeu2uAGt9y%Nn1bI+|}!b1F36!aU*cvaZabeot*kIv(qibs#k zo4Kaj`Yo$@*T_G5Kt(nu!dI%Uq_W~O$8ow!!eO9Yr%|j z6SB@hRwknrmho~OB|Ebp94iJhVTh|9Hd&hc;|c3L_-Ul14knrz4dnX1gXQ|ZqEW1` zm??%0iKJEjcC=`eJ1~>))-`_j?kwrB*c>O)Wy$ZlI?grMIHgq#Wztp-MBjbUx7S%} ze}^EPkR({tqNC~>vKZi%WBgGm(~l{h+LL83G^q>W>(R)kF{^sosCumLaaeW?8%dhB z?zr(6kfK?8@<>|GwCV6jp zfVzvP*Qk5BfkS4&^4?T@A(4~4;=|GXyp)WC6B(20W~SGvyLkE_buTx;;TcAj_>3&u zAFgPwM)WLu+-$Z>eJC)FJp=ji!{p2l*AQyXe=MJ2tzr6-Lm+n1Z_<~nmGD^!3C|=A z!+OHZVV$hs7uExmRYF2KyM%T5%;BA^4+-mm$|@lt^}G=sgum3-l8+9CpsSk13D@zM zIL3IQ^?3T%9-RD2z=8yoDVE>ZKjm{H=C1yDCqp4Q>hSvXQ3pNW%6SKd2G@CobM7C_ zc?aIuIDgM{WfoE&tr3S<126%1*i8v$cqx#+v)-L(G(Sa><^uoBJQw(f8_+%aJUok> z<{^@^Vd|cnH9uHfBmer#%^|I{p}$AmoxbtDK;1IqR>3*#JfmZ*DZ1gIR&YjTMTg<% z^@_Yan-w+rT>@T8=w3^b&^ zJ$whvYvwzo5RWe=jH=&=en9!|A?UyM9Q4yY2mO4{K|kJe&@UutW?l{dn;^Z0cMod* z&z`0JT7qn?*d9+xuHS_b;!Q$fT7Oo|Q9nL2UU2(D+Hs@qhR*}9U*#r8K;o_NE^-V9 zEm1gz#4-K#ag+`3vXbAQ+~I=iMpyGlimKE+if4De;6_J7=;t$q=om=-T>^e8p)k%z z9{Z5sgVgU`gSLJzafS|V*Y87*vgfWd&ef#1o%GCFac+8<=vYaxaTG7x9tYK<3b1}; z%U2I{s2-jw!eXhVi8)ZevzuiRtVSV39EXUB53pm%j~cUglk6CpmZ$>*zwZ!AdtBkL zXW1?F)a931H$B@)j?8<`bEmEDuCtNwXQ8`nb2i3Q30Hr{p?N$B`ExSkMNa^|ODtO2 z>3jU9gwZRX%nPf|(gTc*q@VnM)h@FBKMT9C5f-?c%wqIp*WEObyn=t5eFYyq5oAS< z>dU7H=TkDX1A`e`NT>+U))^XQu3zQ!Oo87GI@dIrN5bzuX(dK^*ur+d~b?( zuvxkGo43)bYsR?^oi0SDY~@6b6sUdHzZ6XMk_pap*+rBo5{q-uYoa%=QYH?}8>thG z)AB~sec=>M+2c}0^F~peABeu9WOrt~C!gq*@RK zAd6D`%WQI^`_RL!?RVhuZms9Q&|P2Gumr~zBH=wF+o&{ix?SO+%l(qde;k&R3d#NLzUZ*ePHWm>RFrh7J_>PC)piAQt( zF+;2Noe2x139H@P35$1NMYF7@O#Z#@jwNutEO^iQINMGzQi_IqWVM;LQ)(*GRZ?_ zRT)ZjHnmd{ZHxkGI;)0~!0OrnN^_54s@khmTGJ1dk@?)I)G7JLy`4y@uHv|smdWa_ zdPcg8jC2{9bxfw6jO{X5d^_@oQu-(KBr`-fMmDekgu86R2M~&c4e!LA{C5r9cHm%! zE<=ltE~C$YE4EJFrqrn`o|Tc#B12~}GIS4y8$M>52L2gK6ouIWcL1_%%LJ zd_2XHtu(r-EiScODl{cPgE*KcX{4iwe}X6yo=TI8OC?|>NvrKKl_b4*Mb!Y+wZswQ zEk@6_5+>UEKdO;MQ`M6nN>I0@ zUUiq7Qm=0EIldKk$&SdD9x#=0YwQVZr8W!av4Cb=ETCtGOTMleL2MfAh+G`oApGF7DVX z@f-X_mzlV?KehHdjKsOW4SUUUx6 zZZA3)r>9Vi@0Rq=li+8xf{XF}^P-P*pl%K)PbKu7y+d<03#(_aG8YR2W zxl{su-e3CBvj~d&E7TX+90s@mM@voDXV;&9JCT+VY2s5m7YD^l*!Aj?!^_yNWNatL zP*16pdm2Z!SHScMi zX;pEWu{AgI14|VSU56Y@GO)?raYJURo(2kRu20Lv?-5rIVkr>7mN1gY7{4KGjX4zZY8=TaW75W=i++N z^LUo~f<8Jr`8U2XdcK5n&k<&hE>pT1F+D|g&=*|}Ay>pq3&64HvNwvoKX*hl1Hdm# zz5pi^%^J@Og{d4}fdkVchAGdlh^6dS-O_v!;n9nEjAi4x7A_tBy5}>{*A{ZFS*u)m zaj-ba;^HKWxSB;=%_6R55m&Q_o62G(s3cijo@B9-$|65&rCD4YR64R)t_Ia0|18a2 zrQF{*2yee;(qsY8m7=}YL&>#j)F1Q@t+{WgJkZ#m@BxhhC6Z0pZyI4w*I6CVrcL~j zUHETrjN}u4E8wQ;<`IYLxb=eQDk=y)79c{5eVn1B9AFkRDSM7(Z_QOrtuQ%wOV?SQHwpwfu^zLrANrnZd!*nCTqF|(L zy7E53K0#oNw2*+SrDn@sczGE|Z-_!%M&+q7~2P`J5F`nS4JHgZ-AKd1TH?=+PT)7a=z) zLyi4=D`oYD*BXws8{TS&gElZdb0*JI*7$ham8}1ipqmVOUJDHXCf6JEiWWK~=yHSJ z-a@Yz2@4GR@fNCz{Ylc^FMhCvenfbGXwbj3P}vNc{E|WYsxpGn$xS?WQn-n}q6M8Z z`DOzh*MgohDF;|6oMqZ!OsZv;nN6lEC1hFezTuCs%NRWShG(&_ql}GbRm#f=Tps=+ z30xk%gko$wtx_HZ9}T~g;G-8rFO`7xNu^>UJqE*A$bh3#$4vNOu#fKL8}Z#~pKTSl z{(XZprysH(1YG1V>&&~BH;-{zdRT~54ZPmR+2TA-OBte^Rl>N)=;p)vVM z?3xc6(aSK4xYyz)#<^(Yw(@wjJkhu$A528o5ir45Efc1(uV}z-(DI641u>=X89%y3 zmRIWZJ6M^Xx0F`}gJRXcEDIK=)pi+wjpP)aV2qyB;^~hZPLQ&B2elp&; zReLAh_6{0wHiAZKpgn8_-Bo{iwSHcf4_2$<jQ4Ysq7AGo$3V7FdN)KP#0 zqwhy*`FyFBn$w#-q z(g9_(qZ;=){rxJ!Qyz<0hub0_?ix7QyepRX|1*^RB~teKF?aL^ z{LdTa=2yVoC9kX<&-bmfZQ8!qS11axQSEQEU! zKv#-h;{ck+D1~I!!Fj3hbC$vRd6vPRPEjZBWhnH_{FKcE8f~(LP@&>)m2XZrwwJ*f zQ&Ed%8SL-A3}zu+4E&o`dpv{E?e@dwl>TepXDhf7W){J(qBK|sCy>e3pd(5y~RjQM5pZf4qU z^dV%i&|a7fsRtwr!G$CLLF0)&OehQeg*tPtm?hQ%oedXQvZiv`v1GNnFw58JMUrZ3 zexIbud_9$lou8*my4<*kwQ{?p`tNihgMm@Fx(!Qk#oiXj+=k|jko7_v)>YR8fy<)eNrqvuf7Lntd_5lH*AX-Vs+@BSe@F0l6@TeD+)4tc!5CsX@CWg;G^pjXf`g+l}7i-S8t=(A7PLX};`|L%;^g7_YpmaGfhjkApmXhqa9LVEjoL zAwEjPiA<)!cVsLs{ct-2dPo<=sBhbdOc5Ey<)@K#5`cD2<1l_PkA!NAPOmNEaDwp- zpFZ58tEcnQD8c(r?{CqArw>9`IA0WfjAZn7rfm2h`*$zy&GtoW5)FVuMj-Xscex|&ywA1aYx9@G__SPpkIoa=*{r9(% z=4GVGC0Uv1ULw`A(Qh#Z%YeCt@)}HmI}OFRq&-{o)`^3VBgRq#osh}i#loOVzE1xp zmJUCS;OIV)PRNf4k=y?tl#tJ)Lk^XzIkLUk_=gho*;J63UaAB$KRTQ`F@@gEzj3BZ z&SXEC(}*tD68#;2^K(QEpC!e40gqCC=85(c;}alud4I7?qq7pyX6?>LpC@i*^}gPe zNNj#Vl=vMbWc<-@Aq&wLK^xr$>eJxdL?b`*q|Q|S+D=76+NqT0P31T3RDKPapOZ=| z_`eAr%ST^Ai=M_ZKIQx}l-v{@{g{yK+FZ7>eQb;`bom{J?}NZ`KO7U^FduvJP9#|> za$Za4Rb5>xS9R&~NZv)scFW~r+g*umPe6OI?W2;RuOKOWw%GPUwQaNmKn*5r&9CB% zy7;Qon-YJ-@IqD|02PA?)ThDu=xbozjbY9SeI1JB#vjtk7qj6*qPiP?gV2fZm{Vs= z&s(Y|x}W1TZZJzb(OuS<^esWtDVTb(Dbc+PfAgD&lJAKc@*xrRBKj79>Mm@}Z{v&l zRd?}6Rn`4FprX4#eHxsP{u7LQHqh?7P<%)o{=g_pALdW|%qUBL(^A&h`5b4-tkpH= zycu0ta|F%r5sCLw(>rmg%HJ0!H~kQfSp5gM%@VygSf4c^GQqph~T$EunvogwblhmGuj_!(Z~4m3SIietf`CGrxkGSXqe|^g9=| z#qFlh|G*YL!edqO-^LyOA&!%u|6q8N${y`*=&BblK zcF*QOM>hXRlv#;4Baf*+S!(9bP?F7&z0IaX&{!s$>itV1WUp-{5oY9Jga~D9r3R}+ ze+6h6>~DA`4jYlT2k|&+_U)eSYLeN}YOAJXrB(f%sIwA(MjlhUEalET3i(eJuSC#T zMrH9PDzho&&u{?GpIBbm@iOYGR^7Iep-WiE4W0h1a4G8)cXJwQCI|ITX(ACcmeEAK zi6-0%>PP$0T1%4*=6nG?3f-OMi`akSY z&~70cEdVy(6s-Td+&12qH;XbxP?qk=dFQ%wgzn#Qw-FnPJ{9XU`l3EeCja=7jXMF% zmuyM^{K5iC0Puaj;ZOpAZ}1JE1i-H>pacLP+8Yif0QkV(07?M-+5$@0c`yNdEpIrL z0N}HE11JH&=ko?o0^s)+Py&FHiH1W7fInJ5iBxKTvH?oK$%m~bsuBQyv49c)?A;m; zB>?_r0VM$bZUH3#I5BCWC;{-O1(X0_#%VZ|0O+!S5&*6Rlt^VEV*`|cGiw1Q0CE;k z0>HC?5`1nrEv)UkmGd@S2_h6MpaekC0!je*7El79WC0}rx-FmtK#v8K09arFB>)y$ zKnZ|F7El6!O#x#!B~n)DwE;@NS+;-@0DTrv!bZJ6d^Xdi@IrY+^0-JI7t14-M^hfp zk;f(SxRghIjWW66)5LSE8(tVDM;@Zpg(s#Nk4`a467I~PFv=Lv z$#`svQ8aL8mM9~$qwwkYTS*_6VibMdnIU1E6^R{;$EO%2JMPTVmW~~aPfRgNmfe}* zmW~~aPi`@?Ud_wBqRtDM_tZ9B$4(pXClJO zFWqwUW@Ik}cm{ybB(OP=y>ZPaQnHzqiO$z0I=5wyh|agXzLChjCA=V!eT$KOOZcpo z>{~X!-s){+=bT@mHybc~Q+X0>;btEGkY=GY(=Vbc(L#FlO84a5aC(JX!%eXC*1C2wPD`Oh*f!^k}b1mXE$N7?+5ag8>FB{x#?!}iTSGaZyv zi|d8w5+LT`l-!xZ!xn5er?N_1Ln$wCiors;c(cI!mc&rO!e9|6mVyQB8L=(Qy@9W2 zn@5b$GLIOcWgd*sHcv5a9v{z;wN(kv66@*4v($QeHlJu;I*1{E$k=WSnH}ENUAXQZ z%7-I};UX%Exd+kMmc1eB)yZTn+`_}3W80^KiEVEY+ukC!y+v$$i`e!SvF$Bl+grr8 zx1?>mU2G*g_}KOgp=YXU+gsGOw;0==Pe5YZvxMiLw(Taht+cn%Cvr0B>DV^$^%U_8T91!s$a+e6mRL_Wo~72)v-#<}+x7*hyeHdcq|VCTU*KMU{_s}c8{S;o zxOs$O+Syi8hc>>|pj#*(H{@Mtqo+7BOSFhP_PO*mhrgnE`=2zbKkel~)zawNn zpuwrV29=P_$r}x;9+$(YSq_{2v>5fltmjwXfZ(gs`e;(9lr<{hBr2JJe@ZLSqNQx2 z!SH;_=8dxXL|Iali&Z+5MNc_jy#@CgtFJMf?_Kv&*1dA{_YkgS)fz2kl8e;bLT%&L zAh(%YKg|J*91ZWM#qbIWiB6Eaznag5ywh|vYd$Gkf||}*xEvHRkLH*$<#K2 z9BvVUEYCS-$OrkSyXR$3KQl$G5ez6JaEE8m&77G%)8y6MM@x1cx3Xq|TPv?B%5R-Y z&&P)$eFE)gptB7W3besM()Yo2h(IT#xZ-nIxHKsW|FZ4i8wI1W1S*s*OefyFm zh$|R`<;>cE4LWaW62#_<1`)DVSn3zn=$KSsISHz9Hr$3G@l;7{nQ_mo?UxY5Tabhy zQh3g+?Qg@*sv3%Un}(41Hcf1MjYL%7p-B)4m>{Vq8M*gKUcTBn$*c^L6~FO#4?8Z< zA=4Xq&GWC=dV6DyhaD~ShF^T=!rL1)4?9}u!T%V#;r2#%66c%uob`p<x4QZD8mdOmR)&u|NUrB1&~QY+*xU%#=y^=`~~ zH;PY9P2ieeR_PbBe68y^^eVhZ|0??-Y~pQ@-GRI|`Tvi-H-V3=sQUiz-0pNIonH~V4OkL0YL$geN|+UZ3HfK11g=40oerEag>qGVNnqjP;dbeL=bTs zmB;OYQE`1-a7R&$@Ar4=-oCdp$)Nw|dH&D;ecyk7K3!G!RMn|dr}k5)s-(_8ySXLT za&5rl4uu;`i$A~g*UdcG9q_tCVbJBZ>EmUxhi^Pyl-}xK?B&v1NV-(G&V^bzKxd|{)Rxa3={H|} zxVtSa(|`EV=iNQU+R~+ z*y_FKa0tA=`N&`b;%-XVZp%G zAyaXr%Ef+n!@-mMgPW z>z>9<3htX)It|RRB>SQy9bSY=jd;096ucKDcV)vKNG#Wc^rEHc3;o2I3{yBZ7RH;5Q7u)u?HmWk={ZRieLc> zJe>5}rahMpP`z-^_i{&P7PrPD>G^20`WonP=l6@Pe#j#mY%Lr^$2}icJ3}|~E}p5b zuy4VmvU8jAyl3+U%7XW7mP4Vt3ayDfo=pfJeVJB~yDd#Vo63jnh!R&JB4#KI^|pe4 z0npL+xV;MMSS09=E=Pkdw`VciJ8jJC;ImHewGH$RfW^_f5ZAv#?`EP3F$fnlPN8>E z;*+9xG0>P^>cGp=t9{?u(0v{B20VJ9>$$lJ2Z!pYZ?e3!U%^uB}nFo-ot}M@I8}M0K09==A(48-n*gA&U_6S zg}QiLRJij%+CSY^0Tgz>$tz_U8W!~8%sdX$;S53yUzyCcWV zziWiz4AufD^sC@Ms9(H#!EaQ~_CkPT;t9E!PU$aR!zFvB^H(8`Nn{QjO zE(me8=XNso2I(IVrJw29wrc|#O52uCf~?uI0#@sVGIDaKhuA=;DW5r&1!kuy!ehFR zKR&)oB4hWvq-pqo@?nfPG`bGlxbfdWjcX_3<7uZQ^w8eD_oT|?zn`AqIkLP#*_O)* zO`9^jy%(C+`IMXOKUi57#y4Ynp}TsiT3-W+edj`YGww`{K6pch71y)>PPWz;TDYYo z_$DErsSE>eO%M)rhb4tXhjru})S7g$YUuNBZON4D9ug*sD5188m*yp@#nRs7`l-xjkdWg z~QHEuY5Z0ftJelB4+%AxZipcj>%j> z{T6po(QnBo;0CIKM&PHRIpEH!^_66!yYX0@j;!D$(GW6&;M=l-rN)ZZLVy6@X~ zy8Zb~h5M-rm0d9!6ZI>*xm3fI*sLVH`O~JklQ(-`mu6DVyAxwVS+p~|4DY&+q_eVz z5(!>~8SaTOep1Zj6OGC3V)9;i3{J==VD3>0U(I)GY4d#e8XRrG-k8lH+9`z!8YzYF zwHWQ(UyKq;{LFci~8+5$c!P|P3qcfgwqHl)&I)#9?MPa0w1F!qz80PZ31F#3( zXLz7sWDV_~lI&_^k3}|G6b45_!EAQ<&7O$t^CJ8F$bN@xoAXL`jSfkwpDABO9dzf* zbCpLKT?SL{U!i_=FXK$e(Ijct&-C6^lgY&Y6L=3I!&48kFZDxq_jt90v{}Q1hwzaJ z4;5>6@I$U);dYqtaDDFVhez0FQ+TAl_w>V~+&3B*T;5U`-p>!Y*@XyA9odei@Mysf z^}{zNu#Q}KjG#yRA@j#LWJj(eA2NMpR-$!Ni{9O`pC2-pNQdHDG@5M`uAupT6ppsr z7_Orwr0&@~rIso^>b;mHcQU*$Cpi&z=p0VU+ z)%{b5Tv&HcJfZ}v_+}QX599HT5a7guo&qgMm;aflA8 zcrm=OM-YzTBt6l;LlxmZS>RoFAe#YshG&5sD{2JO?(;Zy@OF$AU2s5~a_1KI^hPUA z_ucpI_TIT{7E6B4ulT_PLAj9fF_jLxbBonIaYJRz92dEpiMfjjZ@V>Ek9HQ&_%_IJ zMo~78qnP7B)CbQK4V=}L8SkLJ!8F%@KP*i{{Mq9`=@JbdQ01DD4EB%K4@| zI8O1pB@{J<5vW_8<2yh-I3XWRYu!T0=E>9~RRL!X924#Y?coK4F5gCvk}rQy{mQ2S zau>V{RL~02G@*hoNA*?fMvWP_sJ;%6o|LSpARL6h5LDEbg(8Bkybv(cERFQ^4s)hK zz!4vDO1Kw3T$A4&Ttx7Zx&As<6|-y_W028r6o=38O+hKCC*8rt1nv%)43vh;2|N?L z2sRsb{NPe6U-9iM=zBl(W!|NxWb_Yg7hVDit!fXkdqdA&K(g&EqaDp>pNLBf!_iGk z+jEVTc+?U_eJ61O#4e?wQh(&tnT`C|0gwEcGPUM4i@4plwa)2L`YszIZ*nW)(buO4 zALxdnOCySQnvtT;(xxpAOE$cW&?V0F$KO9D{d&ru(IW{eo6|^pEqRa9K0Y&Yj2jZp zK89>^)!PBN@Lgc)4lc(W+1-7$w-`TK^P_Do#*en<(PC*RAEo8^Xavk{Zh(mhe|Xrz zx>3m0T5x-4V7Z{T=Md49Mp-IO_NXWj`C7?Zkz~RvpdbQ>(YGsz>$fv{E6ux2b?i!f zRL8DT;9OOf!-^tq!cb|%sq$Tox9h4{gmdp^W{5*YmS%T&Eq+GdVsPJ{q7O`vie!nW z8FhcbD7c2L(Ydwl<{Jyoy%Gu^TuJodZo|Jpc*KWw{Bigmsu}9b;@5Ul@E1g&{ica` zopO-`Q2Z5yP3I>!{%!?I(rk}tq)-sgINu1gS|N!qJbPl_k>U&YzD@Q76iR+3T&WN# ze0KFlR3EjT{ea5xJtU-Zd@nZTC@U(*;xy%WJ>E$M5*12$>O+DMu=;=N&--)=~A2kNAkUx$<+mFy0bJ-{C~gdDBq z*L|iT*yx+{>r8a8yXuSO;E4RXEgHk@m0!nVFrCZo^Xry0hFP3nw^O|Kb9msy!wq5J zgzFDT#`}I)y*sJ|g$j(5y%;b#=kPM|{f*$GKTX!$$JWFxK0 zgb1CPnuZX);lmB2Gp6J*D`{P++vO>W^d`=~DT0os-y#=67rY%|c2!F5zPa|Xy!ooc*k zU@YH+VDSFLnD-r>T<2+dmr}~R)Im06-uyX~s8IE6H)dqoAThINFGtu{XSRZN&QAEP zyNtp|VLYlb#`pkHWoZKfq9{g29DO6iY&3YpTZqs>OxKupdA)cWDdlkg(sN9NcKH@c zGVzT{orPU);j<&}S{Z#;C&Q5$w^~-ksa7&W zpr~oP6n%C#l&>q9+4?mCD0DgRW@DtO6zc4*mxWgwgf-lPT z6vhULY|LM&ZOmWEPVr|+Ifo_X9Ji#T<`=m|DEtxuqiGjsaKFq~N7Kk`WD~EY@jLcx zwQaGhv$O~aZKtcR8^)1O7w2qUgr!fHmKM9_mKGCbZW5)ViK}q-1MR7nj=Z`!iyOuH zX57nv1scjfRSo(ot_J9D1^wDosNWBC-BjqXpkJQ~-2-U(NO^r@s@ECvvJ@h(ZxUjC zU;2K9wC?vN@yjol5|8&&GCbf{UTyAq?9gb_V(nmm`4)rBw~;Xy{2FLi*W9k)c^s#7 zbrKi16N0~!e=Ua`lySNZw|;_8@V^H5+!S1A z;0O8s2+h>jCG`I_<9T#}+9~u7txetkbwhaG4dG2Q58+Me2G1by|BWF$|35Z_7p4s1 zT%?f<;arABy=vr`t_mOoLwFRl-Xl*p#hE#Dx0r9y9fYlR`2w$GJ0?C& zZ(vK}26m?68a*+dI#V0j^s>PtW<__FL}T(n8k3_bP=1$hYWR&Nx&PC{Z^MN8KRx_% zi{tdeZyKB$e$(L8@S6swhTk-Jy5TqNuSBK{pAEE4H~gmKPe1&&GyJwk!*71Z;Wx|h zo1HTJcG&RCv`lq$n&CH^u%(CJ**5$}GfYM4$TG7`4ZqR6@Bg~tch1~7(eT?jw{x1| zw?6)^jmBT}uNuZ#$*)&1&fd>IJ^muA^Y#PwXbLX*QyKV2HU4G-w$@7{$Ktpi2l7LE z$bDpQ9N%ZjjAlo<{(5xzPG%17wf3HrfBlK~;S^Ap*+dVUvjt}&GB#bET*CK|eS63t zJ57J7U}h_ClW+$NVMjM%_nF#Z8b^Nkt=L)lHm>1J_#Lda(i>0(`YtXm_Zh(AMxUj; z(Y#Pjw2gwzaI`pD`*YE^ZOP>MScIp25Mwd!(Z^9I%1#!MoJ8t5Apf2`);K+*$Lb!u zpK4^V6x&2|oPE7rE^~TDdJSyVZL!W##_kk@xvBlcNN-^a)`w}m1%21`7Tm{{r2W5> z-ongTLT|yc^q<#TICSBhEtpYib?r14gm?HCe)#V&tK01l&2hUagQGe3$~C(n@(p*U zTG{(S&Og#5l#I-sy}ws=aSuYK_ruwJb6Y-a$g$!(w@!T8-zi zzKChrnYL-ocICeSW?# zcF*(k^CGw3Tnv6gU>?HD^##Ajb*!J`Zl%~Yx9*C3xn9Q4HXYlMJ+`Ci*x*l!;P`n8 zwEy?fHqc%tq}RC|Pnx}_NcR))r2lel6AWx_7TcPGML+BEcJpAbpY6A7-aOdn>%noz zzIkw-pB-q6+{G&udvIUBT7u)n>sB3m$Y5^+tk+H^f2O*WWJbC&Ri(=7M1Hn6_$%?}_#FH~ZQfd+v)Z!7d@<)T*j_qfV2*iq zafOp}H04_c<{ZhRQn`USTW4}5>9mU*5nX6;GzBk$nrjN16>>^2K94BqWJIpG^{o+I zosO>27PViI)uyKasW&dQ0@YStJtwgPnq1!U%{V!!Rpiv})|q@gZ{mArjx6P_qW?Pfq#Npdk8`aPv6kz6 zF`5^l1j>Ed3813vP9X1oOq6RM&d^jRt%Z9Kmoq%n z0j)8KZLy=>(b_td*3Q-hOqhd~n?zR7g9wRMX(#_uIP*gX`|9 zgVlrazE=dlyAD^!6DgH~Rrr@-Kcu>H#VLkd+8~={@>dVMeVf@i9#p&9(mmp&8%lIi ze4ccJ=~obZ>36jUsBx_q9Bk_v4%*VJdV~KtSt5|q`5Ix^j_s^8sMIeEP@Xq_a-10-fs1@w0V{P)5+UsH^^Jm75xi&dxG-V~%J9m6woQfG64gmKvMTUA1XTumM5@DAfE#N=Nq@00#; zf6xNg)Q4!UE&Yi{$dj)Mu{iata7T0SyqF<|wy*CsZRonn&9{9!&9i1$$Dbqp|AN=I zDAo~g5>EBEot06|^Lk@B`2OT%ZEzFQx^cAP++_Z(I3{x?P5ORAih~pK2~Y|w1-D?d z=IXHzx7diqbEe{3s}eBJ+qI*J$@SqwZ1K>LBr#fm++l<1vSyRme*aXoze%~L$(wS%>m$5F~A%E z_KX4M0I*jKFb9BF#{hExcufp2M@-F<@*~hVv9~pVr`i4E2SlG{ z(`K^Xi}3F;)oqvX{xWNK_GR_x9TFXz>iznzIejlfU zCX4jh5l+2xFtW)wCke9QmPD)koq}sGO>(}W#mObD&2It|(AsbRKzyFzSDyd8Tjwne zHX)uLewp;Rn#Fyvl#{ZR`W#4iXAFaWn(IiPg(z>zK_1_fH7#OceXEgfJ)S+S9rZKZ z86WjCs>=(&#kxDXH*PAXT<}$rHFeg5RE(-!=AdRA90SY|*9<&PiapHn0B4uU%?Ky4 zWrve+W3-b;)=nf?FdGI2uUBr(cbIELRo(rd1CN@5uugQKOweA3xiNVgX#c!u|A!h5 zi(oDg(Di+@WHr@%EZy6e!LDR6I+&PJ_7d4K9{Hw=N|ociv!Ds@S`I_+jOWeH)SAuC z)>_PNsuj%c$ktlT(Nk+Pd(6dC_0U7)`U*NQ=qsA+cJe1kgT?M_p0A$`yfO!)BOBaC zc)LZA8^NRkzzKn(X(tRzch0Ab?HsD_9Sgm*3DNmUDp!p+O^wdEW@l<$W@l^NW;fM( z%!baQb2Qa@&CyfqGkeS-2yS-->nmU`Y`T1EpUX+_N%3_hZAg5*j0OZ>(f!QA*UPcQ z*WJ~^<`G$Zy#rjTaFhM+9bnbazHQxj7W4XxE)V@gsXYP`@tU1~>`V=<4D4*}b7nWy z9y6OfuuFhPPwlg2kGXid#a+DCSFj2AY!0aU@RaD@Gol-fPSJghtftzvSfYC`(YL~toF8;e+{MAwX*C_r1i(d>rG$lT5wzIN#6#qRg{(D{g>!bMl zDE>ec|IR4B^wq?7hEdfOjxGcz(=3<)hN!!_dV>2dx$nlPYzBg9-(PO?7LLSnsU|y* zL>vC6aDx9M!jBxiR9Q4L{*mP|{)~4tG&5)IWLe7ti@_Vz#1|7aa&C^Z;APww_qy|G zFGdd;_MsvB*dhtP8I6CkziEWa84Q)apP?BP)|Ouf9qXVY zZX<}=t&MDHcBVFLcD7bByQwx}c28~8>@gQSxQComt@IVO2+he=uf7iM%Dz##u5so1 zK3A@&hFZOPt;*Hat7333n9}{sHymwCz+C$z5mfilW3#&dDYLV+Pn+FTd(dp^{%6e5 zQ~QM3V=kVw97LqP0;o&sK2z4t%Kj0Jx8P0Pf4{7z+FC5t{R2c}Tz5Yf(Wo)yBJwzo z_}S52qSDG*X=O(^wxrT3tUr0kK3=Z0INGa@ezcAI{<+faWW0Z_KHg_XxD6NSYpJbt zVm|mG;oDtUQ!-vBvJIO%pU~F=!9mcGb93e>dabi5AAB2v z-IJY7<+m|g2w03N5W|AcRGoiQecFjwnsn@pJxzVu1#qq^bDH|(>JUlqihoi|xZ_yZM!K5u z+O5$mst9ZdPOS(legV^M|B*3(h`$;PXcSq;vK+ZNT-Hmj+;7>ZW|7i>=NbINo3Z@O)A%{gzF<$2$tZYI@{4n)0MYu;5t z?wB9RX0FiPG2*BJm$M7v zqRlst^TbIS1M-;|gM0!+t)=mO8p9yHDO6r7*o1rnL~JE>Jf(nMt~57ao|7bCOp4aU zmL217doK7q8IS<0Z^>qz*?CJgDWAYS2IYQYW`g~|YTs7XSzN2Lb6|GW^8@`+50x)3 zN>a+Dy2^Zc$HXJ5C;9Te2@H|66>+|t^o4m>pgF%Y*FCp+vWJmpekbzhH$my`-)5N5 zjakJ2VVEWfnseU?XYuG{-lt{eDBJa#0P(3+Pxv~r5e=F9<7}!NfT<^R55&%;9-j#h z0)QxLX)Zh%mwRv}pFG;R0U$htU_(w=nLNz1^bwFAY6woFCEL3;ZR_3K&E{khqPug? zqu!Y}x%r@E>RXbJ?~soSyCjd0Jyu`{M&=A9b#KfX39F_8=Nal(Gu%0sO}El65-ao`ViW~cSVzXkyZ+o zs`?!emKzE_sZ_E}gQJ@cnF6VvL}2RZbUn&%RbrQr_8j&C&?%`By0s(AHH5*ZaN;sw zZq2j#s;zG0$?KGPFwNHjoz0ouS(U>fbI@vIc!Zn-i^3x#`zZ6;yaR~{&utV2n~f9U z8{{sAN6X5FZ!to+SYaa=Qi7$GCbqkS-&5sZEmwYg=N}9?h)=%Hyb`FiX7Cv zINM3nQ^u^(?b6FGNG?1PW)H!IMQ~w<=TT1N1*5FHESsx4P7G z(vFT=+>}O!hQSE@Q;m+CTCcdh6|Li*Roy!kkk$aFVKa3*T~<>q#L_(Q4D3i=R1AX*+I9mv_D`sMQSL*b}K zIM`ni4mMJRgN+8^_)COiOgO5-@x>`Po)eB*goCXI;b6x>IM`wk4)zj^j&b1_6ON~* z;P{bnygkB!1Y0;5+=K&Zt8gG}H5?PdQ46x2^!0?HjeYWjDKuA6$0w%1UAe(4=b4)wK^$8eX013Isqxs!wGKL zIDS4+ZLEI>j>+5wn6`!-oRE)Z=q0NBg)!Iw;}`LnigdAj8C97e$R}AZN%C-sAll;S zWlprga?=SLvUOoYHYIGxrWa4yl&~RdLvLDykS!;|2KJlltEB7(!iH>Wf}OPqwo$me z%+O|J&YOFiY))QsMWfe73H)CmFA1)s z_l?CRSHc}@{#W7P$_p{eHGlae&Hw*xafu3iW^u_>-)Y1pssI}impCR+;BL*DmX~C` z)pQ{Ly1e8XQZ!axi(@i(9cCmik1L=5zF>Q24WM^Eh*v&US#V4X`-UruKxl_p#6Nt#U7>U;a|Hxzztt=XB{t!8Iy zx0&5kyWMQkyu%zlwGWs*=Hlswf8|qOZj(Qi<~HK4@+p0SU$`{kR-x8mtnzEK&Cb;3 zn4Og_j`4P`**&#(v&UR;-Oa0{^ySo4Qb}#Aq*CAP5tP#3>@GHZ?`{Pj)Amb8+Y-^1 zw={j}D?v*}`byYY=_?s+t!DQ~zlrZL7d&9bBii)k)ChKnD_MwewKSZ3BF|5MB1%tx zBF!xg?-|EMaV6YUl*S5Shx#L2Jvqt}(^O&I?Mkja48Y?ho{X2cIFo>&XiOu);Hu9k2Oywh zc*!_I^lW$)v89`-4>y;{O26EG{%F2vsBWX)DBNjuD!HSYDSZ+y8ydj59KV%H?QdpJ_jq>_2RP5&0;N5v2BIn4%48Q{~gzl zHhI@E|9>7F(ZyfuP9S;HQQEvjCcT#feU%JWHTM8okla-X<-LnhN-NHT87{tiCZV{d;IBJrY6{IG`{&ORH2fGyyRt3@=S7yX z!;mXKO|s!XNMtm>@Rr$>ZPUVCX{lScaJ2Z7fO+oVI|NA)Q)1uc2g;P18>FT9Fn&7q z&JjB|6MmfZMzSr1Qm*_f!WS|lUC!lZp}F#;pbZGL|8M}=($61h_5(H-N~1Yq7f@3mwt!8ZZlh)vbd;(kuW*<4;!|5(^u-n#zL z+g#qY{?SpI)7M(+nAcj;zHP3*wdD713zVCJWus5T9zIP7y&bmvC$_h}O8$c`LPc@PIr z%(drg58>);ugYT4bw3y_RA+lCZPTFo3?aCJVKVnHjug)xAPQaR=DDUMwhkYBcA8-M zTvhoDIOU&fo81&V!pF$zv(b4WEAHikt`6Xj3SNjDz1#A}T~ZOdI;>9^Y##p{p{#m5 zhGR1KdCbb=f=$RLK-BFvMT>R`30H)vn`mpcBm3bK1n~ng`^bgAMG1bJ*79+bom(q8 zY3BGBglx2TXxt_6B%e_N@^J}BA*S7SJ-f2yaWE9SX3w3SRwGgC;U2#1{P=jo`Gn$l zLuZq2J-W$0=C$a)BS}ox+I2?JzG2qJD)-SGela1L*U%RF&2*JqbG%J!Cr2~nd6eD* zXm-T3ILlp(-^FW&jMh&PrfbgfXX)6u%IZt{>g;SA>FR7-$WbM4EB0JF+m3Lz|Fwh{ z(#aLKsp^VlwjuS^cSK)!5q9}Dh&HNhQ0Mu8g8BCz(L1ewEBE0ke(dj*^jE@{@I;Iu z(0>_XhCt)&*2r!t->H;bphEeNak4{XhnzxK+ep5ArXFkQEdLeX&ZctzW;9g8ZM(Ye z?zMc^++tVPa@4$-ZgzI9>FO?TO*nRS)%95i*VO~M9xHkKj*6fFObIl1c3TG+eg#Th zDD~J;sP4|rcc~SI@1%-#6+4TgMXt2zDK8T-ssJurX)A;70kpGdTyQ!qdjoKL(&DUL zxEvvN$N#!G1lZNt)j5|}7kAW!HgSo>9EFADgN4N9d5+sq?$w5J!_8$;LH^GcYorP@ zn4Q{GxUY=ehr%4xp|Y;fOS^Me?e%2LINp&R&2*RYQ9m^}I(sOdV3e& zK-KAr5eVb4juSMD*JmWdy_YXwnl)H#S=(!Ur$b>?akxJ3d9U5fZInGFfn`Gq$_e#s=W+Q#s?%=C5M5a>;QsM=uuaRdi5w|Ja942nm6ch%u=qOlWwEC$r zyxmX6@R4FB_%)Gt_%>x-zLZMQy8O#H{qh>zZmze5Uw(LY{L$~1@2dNN>B;y*n4TA= z%Z2F~!*sr3s?QBaH}z9f$T@y8g5o*Ux1Fd~d=dY>! zg0k@$_%)Zos<okX+!s4~Pm)~N(>%Q3-Q-!cL zcp6};6p-MQf}hLyJzUU{+0mBX?(WLJ5p1|KXOr)(PV(cfNz-#pf(s)>JL{UW#{$D| z5&DW#I&)j2fbvRwJ9FD?OQ{tiP0gnA(c(ZlAgxEn`DnJ8Pc8EMZ3 zUx%u^D-8GEnQ^!{nc-;{qmllsS#QC4e^9$yN9u0%l(4XM-M7Vv!n7>RuS2P0W)^;@ zG3JIW%&!d)4wZsmU_?tYURAJqgz!M}k`>VQN26`mxbF&3j$%4JvLJW1U?W9m+q*}D zqj|1-Ry|~qY8LU;kKKm-C-7u!*YJRB<-5>!K$H7QO@pm#)pS=A`q0h?4RZ(i3; zHFgWkChI4=vdzIatngEQ!Iy!IjC5wtQg97;kek^*dVuLIkeA)RCHx*FH0_TLoB;Ln z#g|#X+XcN-`(19JP-kmnP!<0dj4$*((VgT^lV~BQiz+gbz?52T63xZ)6mG$WGhVIE zmUiYvjWs;R%t$N_1&CuxBa54(Pwq0X366Ra>#3}J4PhbLhD=cyz*<;#S$7yIWnkjr#dvJ-a40xhEmq^IC1q=uqc}rKZ20;Hkxq2Fv!As1bEU?=ZM$ z1X$aR$7s8!MeD}Atk+I@`c=LU^1*dT<)Vhwulel{47gQXayDp1z;D(=E=oc&GP^Ri z5iJTiQV)3!T|orgq8>5@Bu7!|DIonxgfj))DQ;xt6!78cLXy!4=XFWyL-mj;;G^}B z4GLPCg$iPLxwCaR}4l5dQO)0RQPLLV_ZhNv6xSTF^boeOPxu_e*o&&iKcspTD(|M7YxPx0 zr}R(b&#C%o&H5u8ler&bTKyfIkdK@4sSj(*j0{(P0;s(u;}-5e<)gV}GWWAMN-8iD z3C$^MKgTaSdUUQTN7M}VcVF(TRGpEw0W`Wv+OJ-H-R4lA+Sh+flUQ>XD}$!eQMwjp zjRsCbt);Ge?q)HLC+MBlmEt<#5V8)oCvb{uctk$dAyzlmnXmkUbi!X^#BX=ogWxwt zYvSh8862pw1#wG0yb>EkNaqwlsmUbX;jgA9#(Q!| zYqeIsMOJh$=i@e%rrzf%55aa*TdsCK&g$ zH8>Sjphr^dR@(^a_vlIE$U)r4Sme<xO(<6AQ{;#UQ-JdKx`HB&?Qrt&rR-e0U zf=k?j-&ro)dn~iP?RIzfTc{psjy0dOGNVmdWvl!Y4BO!CStJA7EQw{HIpm+^?-2|U z=xpDFaBBzWm49K7{+ttn7INi30@}e?#2_edVg+~+b#8sTQ6mwiocd<#U zs{2jj3gz2duOsd5BV%*+;rK&x@!_Qw(GOfC-{$y2HOEUMXp2511s(R;jkMHsmTma? zaV0;}Pt-X>7R)?NN>%x*g`ds`C3JQ*%Z0@V-z}8GS$U)C+scFv2hhIJVU&GHeM<^; z-6QcLAz7Rja_jPtHDwJSFVLxCY`>HOWOY0V#&X8;!R`Oa4tM|fW#mVjtY-5P;Fc5& z(=$dko3EK|2mUryJlZ$!HbR?z*^$@yRRswDM$ShE-A4p^2~hbrWY{*ioqYK3z)~?X z?y4jml^agQN`o);!$~4dTtzC8^Gb96Lr_FeM*G#W>7KnNfLA!6yLyNUr3|sb9B1rS zc^_%whl~y1degjM_l&7Nnm2h5CLM** z=6rzcu2gbMYF^i66G+uZ!fY0cn=3G@6Y`L34(`*z3KFD0Z$~fo!opk9|uVTom z9YQ4OsT^i@rgo^=J+*_)9&_HoA4vn92z>?D5Y3gypzarmvX^2I1W2jQPe{pHH!sXFm06PEqCsxX8ZxIdJ_ zlP(mEY03k4!_~`VmC@?gPBlAId$ZX+wNuOz>S*j7PYA zhr0=I?M%br*UDyRY8A74YG;@|=DdSHJKXvT^7Xp22wWPcQdu#UAYHO*n$KA^<;6ZX z#=L^?8JBjm(mu!1@OA2lGV0M;BS?k>@v`7Z=MDK(XC&kMmRbNb zm8RYeqo9xFdF$y*(V(yTJtw-|*xgU)Xvi9Wp3ubyc@6M zd64p#cWEqPHe0*UaQL;0%+AyGf!SluJ77j5-1-Wrc!l8uW4_LTd?sMS>WJey ziDLZ2_0-6A;9Hhas!AG#lB~ zcX73GE#WfK<@0-dj{cmB^SF)dF)EvziRZ#jQD^<9b&k1)ZXnWK@9;Jm_Bu$)`UTZJ zwU@qj0bX2;q2Ajfe ztkMGawOHXjuW#3&2WaIJ^p)lx7Wss~Lot6o!0e{lLbH2no0&c4f(P_~!mTfd`;NH& zJq=5`ZOY>}+kw?4H^dW{k3=)NbaGxwUEsoiIGw)Qczduksw zd&~t3=w(H>zUp+lGMSyi`GCdoYo9PXQ$u})`k0ma3U-rpN34F{Z}ylA9?**lx4u%i z#pgLG+_zdBUwWS4$Vl(gaNl8ekMu(M9&^D0dR5`nR|=>4mCh8-*IOLFcC^`<+8fO7 zsU2nZnDY+kX@yH)4%bq@%2h*L^auOtPqKE$>s;{q!ErQ!40KHP97PMyg$GiXhgZe$ zrc;Aq;<%P$Udtk{a38gu`WMPiCFW&@E_|)LsC({?ws{((G67vM6QiuXosO!CrJLIT zzx4mjD>RIC{D-7c3lHO?clZf^93>vNE`JEeWbQW_@k`J;0$#mfW?B_+stEBT!Gbb69o%xEUD zG-DT|2F%Wr`91v3N&ew=i;fymb$;!$%6;`Sm{2edu(C>HbRG)of|2UO@~$dqxQz6< zqLlQcCPccH+h(qx@-DYB zTVLx}A64=;4O+}4j`}iGe)V%W2NnkBiwl=v)a2(drSZ6Af;W+XrFBFxXr|~|BV=>^ zdC>(u03K6Xw!Q2w?rlsY^7xY;L>#e74Otz3qDi={dCZ1BPxXSaa%qyW#&5x$GW4fx`mkD>` z+pm6w2qr2YZFV0e79j?d*xZDXG?twSJF!a|!EokX)bsgjF-s~}D(SDMlP0}xO}b+H zis%vZd6{yTmVD1pCL?Vb(^<0*(;sQ_4t6Z_D)(jBsmqknQ92`5WL1sN=_%eukKQ$d zquHVE(riOk?iG4=N(oVXDhVj&nJu>VKYY#CECIMAZUcK3;TjTQd$ka~Mh1_J)v-OP2t?${ z(ZrsCIbB=N(tU~AyQXigvrh*X_6BcdAEk%C#_FxHCCiOd-&YC07K6~`*TJ7)KS5?D zB^qUqb{X}nzf`+bo=vn{Z}K{4{X^0!YW`9E6@iKY^JKIlR(u6;F5H1OR6axrstK<6 zB*5}p_^jN4?_l{#oVjqB8rq!(xX}R16Tqzo5Sl2&-3CB~A_hEYfRzd0n+Di10sPDW zI|C^H31_#-#v^opGrv9Jz~Lt#qg%J(G9{nSl}jH+%r#`!8jH71#vFL}KkM#ah`YYB z>wiqc%dh@g%#yx-$c(=*yiw03m3!5jJ)iE)_RNH@qj<{sLHH)+BF;l*^^S_i2Ymi5 zf$2+skJXwRIXEBePw0GbfQs}$48QsZytqK2hl$s$mhd2X9E`ysl;9BT(H;HbV4)^F zesk@Qvc`U=D83)CyeO?dz^@A0=8wsm?AaeYeoqtyB!_`y{XC9F4oo^M7QHhY94?Qp zMsRQhK+dDEcgSf{)`H$V>gTLwE=`^lH*fX^+*<^FmPf`|D7sRyEn3Lzl?UjiA-0#A zG&8ZZ?SGNj@O`8-{u?r4lUy~X$=rRKz;ZDm6Il5K`)a1XABJ6O7#>X~Yk$Xs`_z~0 zR|@?xeFSd=?6i!IQ4N}o`o4`)&usLcp*~9PSP~h%U_H<9Y}M&Nlf^AjGI8RW2+|`6 z%`K-IXMD5L<<85bxh3GJ%6YqO2O$uHinwJV-ptr&OWK$#INQ6`qeyU*s(#ac3rBXleK19 zV_8f!L00|NsR&BeWTmpEC~?+Yr(#GfcDhqZpe|!^e_A=O-lr(R8S>SF7x`+%O7i7b z+xQNTr=0w1yPWMaz0;ckX)WPy4DEX3=%9o-v=F5;+>~y{o=#2SNf-~f6 zHeL|liIvXRT)x9MS-!gDoGD+5PQJQjjm^PSzUcETUxJb^S*d&}N@KnZiN#LmD}m0K zFC`e|Yf0sEng{d%sn4$BdBDMQ;&}j5MRiM>GCDh&r!leBjKQzYBYxu)t?t!d_c}CI zZ>Y@&=4Wf0DAnUwYwCO3yk9i{f}Z>6J~i*r*vu@=LzS8N#|b2blz#7A?<>`Ccv!*G zJ_%EOeknW|m&S%uut(k4q&R*{ZI!ICH)GD_ek;TTrDuO=DCE)ZkI94su~ z=QOOgW?KR7aGnJ}9Y`3;Xh>^EUqj1`X{~=NSJe?|;|Znn!z%R*BAgmL04JR2tO(J~ zt?}%~(y|QE3!O>O_1)^F6L3B#1BHpwdC`w`toEcl1T*P=S3JoC6&F^reI}sZeB<}# zlnVSl*RKxY3IS5mTgZ79!5g4~pl45oZV8kpLu@+O9Grufa{g6jl^S1D;mc(R5f^hm!_Gt;5OA8UO9qFje1*c*#_KWHb|=E7UI- zizx)>X)S7GPA074i6{{Gs>v)e1eMd*z`BW*(^BAt+z_+SV@&OhoyqM0RmO-lH2$qw z@YMieO=*nFc)N@V8RubWettf7G(Q(UI;ZVrjctpm&WT~Fw4Rp=1*LP6HQBRG++Y+1 zBo~0Bb^R9Zh174rr}bWU>v~s0hSkuu1Q!y{RoDcY4=w^4znxm}-g&Lprn!M??hUur z%S-fRf{QJv^$)DT^j| z^36={E0^L5FT*g-6^jEqR^BDhV}wg zm!3sj2MzL|caW9hs$zjhTy0z5$6SqzDn%`iMmVZBgT>GI+?)@PzG2HLjE`n4mbj%# zUy-mr0mrPbzg4{rMBT&xhy45a$G-v&b~Ckqt98E3-Q=gfg$11C#_7IA8I8(nN#$9! zmmPuB+ZKYmE6G}~6Wm>eQv=M^X8YA$6;!&v=0MqEw-{g!04rmFIRNY)1Iz(nj~HMM z0IX^pQgZ;Z!QR~ndr|q`M@Zth zWb)TkKW=R`+XRi+V~;7rAo zZ01-M6u;T*#7d@V>ivFoHPnVzuuB_BI>T#mn@XKO_8$Bi0>3v7>{sRIWTQz8Hv?Ew zX<`#);@EVS*&?}>x~i-eBuZ^jh&QD}AV11@2;;p4v}J3)L4asAQ+||28D39nJjS>N zD|jCU@}$a^+6Nhy_;pF8P54es<2yYQ-ax=nWL7s~m%kvPhJ-!bLU`>@6D=ggCdfT zU#$`^M#Ryt+{9QK(S`_?RJK*9@pLGXJJnUv4?+0Eofv6StlBK8d{};WrTxm~pTT>_ z!Lr^|a88prQ{(SegpZ^n3}>nzKXAoxN$u1F+A^$@mxP6 zo`*J$XN}=`UySF58S!kGFIPVnJKismzSEbCw|?y_W@l<&Hk+%=&F-l^W%ig07BDLn z@Ac*GTbhaYw-}A@k7-;xBaIC_tGD&fzya6RtzWmkCujFDZ|>^f!vtWj7*l7TnKV6u zGhnh<>Xx>GDjzyZk<2}4U_?EUM;jA4nw?o8VU#LG4f0oXQ%Mt`4K&+Zcu^a8jL>Ya zVrF~Q2p-2ZeIua5EE#bLvMIQ}V7Q*F72v7X#Q$&HDFJU3KC^2{Z zGEVkFF-JDZySE({Q|5l;-dyFcFf1=n;QcBt=i^re4ZkL%VKMAxyh?}}?>bpyU&qvp zmp-TT?1v~QzbX%Ays}aYZ^eoh-VT3spWqNww5>mEr~$YIz=+Dt7z?~|(XaTJ^A3Sd-?;VeL16q&xxYvF^o)&j_|M6#U zVI;#;HdAZqtlod{hK%o@pl-wFhp^!LS(W`5C)!*5>ZbtIZp6U-X}NE5?g!<*86(g6 zv)2*0@=cJVh5@J;P`66q(*X2NR`72)Mt3$*yprLrh#FgFEHpleITy_py3x}5gZ-+Y z@M28%WY25j#hW65=G&lYL%z@?b{HZMM4HX|gC-;@k{g~WWVNm_{7B5~UUi>?# z(N+N58_-Xc!e;;&FP_B_@j^+77f;A`&ndzSx`xvF!%%MkDqhH*?AbTwg(AU=?}Mgo z{U%&~?$}|t33Aj1=3ooke>RQ|Xnz_&U04?OM8H}UDdN9t`!WO3b{eCejy@1>9T*pQ$P`z1j5 z^eZg*bO>_8U*q(v&zt!hGk=2_p*t%|0(|NgBt?0GB$glDoy{kp_#g*jm(kW?foZo)h zReyGFh>=X9N4lqLE3B{mYQIvMI_)J7I*Wfd_NehL2glhnIKbVKT5aajueO+3FtZgi z+=JD%&0i#Ww&{!8##C%1&nOzuqvSCqd8SZohgMJ|&$3dJ7exVyCNHt1*|1pjmekZG zf#&0>OEh=Md*>#5nMyS^cX4@JVtHdTFP%3OJjfd>SxV$Mg zdFztpZp|fcQ~=AHpyW+fYBHiIAkkzb&YNMe=q;&vNCM?5L_*sEuvFI(SsXzjaH}2eAAn&E}r!-S@0at$P!H~Zpyi)nwf=|DSf;i@u zW)7QK!VKYv8|jrln-94fDjei*MAq0Srt$}R%b%d+PgZJ}R}_$FHWZhiVX^2fsX;!0 z=A%J=n*1rv`WSzW#`qCRv_6jSU3r$8hf*V|h=uSO-0T*KCkyayrou06ofj`!v6Vt0CL*C$3^q2JK>ewzE}Q}q`uD~MQzQm zyN6Zw3`d6ZYXdNs0>lfY+HNAi*8{-W+Df^LwcW8wd$3WX&#J!Gv=Kxh+2B^1!8%G& z4?AbM+*$PXrifC6-op)xi|sIRpVD2(Ere8}d_4%A9qzAiU3}qOPO0egT`hDlbb^v~ zO0O3JX(PfvFu84?UloUpSKGEirm?P2$`|ccKHjR*qr};o=)=9M+{zWT%@6LRR#MyO z0t*v6VAN|H+OvqP(skG6m1Cd=~cC4hQO2op~tkn(~uRPA+P- zCv{hrG`qo7+fTQJ=J^^pb~CAr63`0j2-)rgHf@!}OV8@XO1~-(Euv(n_J0+RMbrgg zYHM~!QJS062gkMA6KRvVN1!!1J-&l>l_S5Z2zHmIB~-WAdCL^-D@FUkB-E9gn{(P3 zJDXCAqdiwU5-btzT)e)$MulVis-P@!$7HAUGmP+@)6ZDQlhz273{SUXr?H?j@6-tU zr}cIE8nNz*bOsNCQ^)dOh&z(E9YU%N`dJs@4{5aZqwu0kb;yk}J&H2b{eyS-+;TO3Z4(PVwxTD_<-pUF-47ah=dDK<}tF|`8Y(G%aYQQ2ck?_lRa;ar#6a( zDDzd|X=@&BdiI;pO|Pd^Cvy+hiwiYdcX~cQIGNX>*~+mR-HyYkhkj_o&~14;Hya&1 z-&K@b>8ZXPqMGMQ&q$}{9ZRYa?HVPb(i2qGPIjvFjPh(;dL|AuJl&3Q#saGQ;Uu%( zN^b*SS9*!=k;;$jfV_S9r^@g3q?;-~-iF2>#!`OA;YInKfJOP8O8GGnq5K|K`JD(9 zZ7DO~gjrLQj{%BOQ@=2CfeJYVdXg-6fdB=%Tm{N}oaQJG3RG6AKou)ppg(m5Dl#T> zPi$C3j-bih7vyzps!&~wCpV1Img-kr$xhosr|s*S@(^=mr}|yRd)axj?kvEGkFIFx)zhf2v$pk#MS9Gv0lKqhq1%o`DzTTE?PW_jbAW zs};WILadFJ*>F#dID19C?W@(>x>bl`(>TwPxnC~RRNqO4r#|qSCSkaZ?Lu8K~s#s)rXJz;-zbdFQEIU=CibRH0r0p%y#T+f6 zT@JDfF_E(8A}M=L*|#Z%C1eRu#SgB!qwtD_WS88qT^egEq$iHs$Apa9s z>HMFkGO5r0X3oE&EC271?d}92|GO&xXL3CjP~~5CD*uX<@5|;PT40rR0%lVp^D4?+V|J<{&oqqOvQjl&QE1CH=Z!Zb4UNU8Az!FzhslHzaC59X zYBH}5uX0{JZx@2EL0|N5^kZ}<JijUrGA1iEeNe1;`hb+>U5brz43^!VQo90|&aLlLI?W%`hh3%8mCdtF{fheh zu4!(Qo8RqbvvVV*v#EBausK?qxNupt6pa>nuroI%J2g%iF-*RAmvaF~RzO%1`OfwU%WyQ-=&3>b`dBfA~ zxM}%s7~MATjYhZljMBR)>+|^|u-V{@5@!&+NBA$qKU!~G3RfD&yl(vIxv5K6;YD4# z28(ub5cAbLi5GX3*8)z?Cmlvt(|A6~sZ0n5HRC#2?*1L*Z+oaL)gJw-JP^UjN)@GI zA%Z(h#oc3?+C2c+=|P{FD!g6#lj=;v0jk19ZuVNvD#*rv2Fa$n1uDO zC+c*pSMsnPl@W%hqcJ7=d{x4FdBA#EDb_1i!g`}{iy2ryV*+CR%VLjNZ&-}J2G%Fw zxPET}=lE&vraHQaf9kBAGT2ZKd)3QhX9bcO|_%|CKEKf0L}S6EMa9Jrn-R1OCfO@n5kL{u^a8@qfky#Q&GY9`oO@7<~== zPr%dgzYX4MwUOe#GMM6jM)OLK2@(CsTAB#_za5Kyg8myqT8W4Ebw|CXhs zyT#)JeA4D+`D1s;kAv=ope_xlH-Fc^2scdrpas7bQ%t7lOV2*2G^+A|$+A*RR;+}{ zN-LO&$ulOf{tf>G_Vo+wXtN>d)=QRTN>oM%dTbTCfoEf1^Sgg|3!=VSF;hIwdhF^% zef5d3A0D5C1&>dI$DdDC@RI>Y75o&OQ!049DhI3ZoUSVocDVdzS!1VSip#G~s z?TiVCw=au5=B;5d`WkqffE#)Hr%au<4?tYR+a;Cfk>E@`1f;&nvY;3ssMMp0(mVS% zc*~NLzFAuE@Lfvs>YJ$sHU*ZZRlX`6E5CZb++!YNjf|zBZw2eD?M=01A++j!% zEtbx}jszb<&$8l7Aih(zXIb%D0 zQMF3Ibycf+`@a4I^?8~!`=fnW$Afk7fCVc&_&kgvpI^XoJa__EzADYld{sJ|T=^u( z*j2b^=0OFDO-VvLNGVAOJv{iLET_s3570rh1*4$wKvqggLQz2CG&UoBJ40jf8y3R} zI9d$HbJXkB*7N>2=u&IpoTt3AWF_y?awqR!!E$;3GOm18+PnGcO_uks3Nm){M)Q7_ z^8Pd|R^C&}FG5e=zb4D6(vx>)$d-3O$-AtS@{6K?B-Y$DF|MJp_~iXNB;yv#2{_W+ zohI*J0$pAAW#vJ8v!m}Q6z3nzD1Znb4#k_z`w8i7R2ZudEC$#vW zv&yHOeo{ptHaXt+_8$Uv$U)wz+$B8+*y6nodCeZ!V|*_>gYT86YNx|~K4Q4TZeCkz zS-|ICXKkwmnNoiT#tHn%y7#AM&pVy}PQYQKcL(qZRI^(6ri{EZu~E?WP%rklA zz1P+r%6VrVfA@I78|rxndK%YFD148(uURGcab54&vcuc@eRq!^wZOaWqVq0VD#)jdwl`hAJ zx%bSgmU>s5)bwF^a9>GquYv9XiVU>J7^EF4tT- zw6k|q{|Q&E^p+j7Zi_v=_O8DS<-F3#qNMw6i|@#JCsS&Bd%qoj5_kSs(fswJ<-7cP znOmMG%xkWl`~LmBdEK37?Co9k_>*@W=v};e7t(rFw{m(?|2wuk)GOcS-#+Ypq3gyw zhrLTLkogNUKYHVhcOL0IaKN$m<-9KA*u7ng?-=&phHuV$MYmG%%>3Pb%GVWO8}<$| z-y`AM(cYiVy8q7Oyl;K{#Ve2VHu>a>SDxs7@WM+kJkk5!>ttTN_RUwv3%w*I8dhpIC7J@%z@S9+)3C*Mcj`ZSPv7yaAd>E33T%e>Y#RZ_h8fV;<+ zdHY^dy=<9xCy=uD_v?46F7r;gUcNs%Mf@DtRA#H0f1&hq-ok}4KYs8rcjdh6d*u#+ zUpq^scCm_B@Aq5ly|o^HoHd_0XHK0tGjs3UVb_M? zVq%G}_ly>E78RZBAZ9GYI@g5JOcsxhw;tmlhC?qoh~kvbTQ|(%K{*V^mB-N89m5I& z!)1AJe>+8Ev5dlZgRtin91E4j4p=i@_)Nt8aQgncvnz{9h2rLO$-bO-Sz9l3L1WT%O4Q`hfoCcLL&uR6`WSaFuPJa;~@n$3h9w^FZmuOfkCk!)o4Q zd?c1qwFvGT?zF#M8j9^2Fb_k|{us9Fgva%=7+em7uO zAKA6RLjrKW8ViR)9-N{h#^yjj$2 zRb%=FQKA*Du~1lhUus$d(P8PfLHR{=8?5=wF&OrxR?L}+%brUytTGY94z#{tR#x(M z5i@I0#&+Sq8p914gEA_MSs4XaY!{tjO^BE@3XkP}C;N}uEsCwbJA1d7^4ZsG%ZbFe zyR-L;P3y&!m7-xGY+VAhZoeo2%lpMdYUwSC9gv0X9Rh9f5bn@phsE+k%?^2smOXGR z(of*tIB^z+jfP`bz0EX_!=iuUAUM5LKY_DK^~qT0wlx1Fz#iowF2KALAX-*>?=fC{ zd;IR~V`5rnnYB@(RVvOTuM1=Pr-e$7sVsh^y)>4>s}MSfQRx_4VKdGZBcLBni7N}6 zFX|#HWbK03d+TuY3l76HV`$HRPRDpBI%-a~!WvH9jNx9`-yDR`?yTfqVhhY69mKKC z-M4oTGmj^1@esZ+18){{VARgSu{?eHS@Gkh>C?}PeTzP%T^1+HI2^w$?k77OhhNJr z%1XX04(7o%)5|&>|5kiG^3mvTMcETLZ$zBt{Yla}al-)s;o%9@rc8R#%#G zQ!MW5H|CD8ooE2_Km@e(zG&O8=;UN!9LD*<70!kaMZZIR=O&BSFk@5}t9IeG5no_m zsqxc1o`}d8Jkrw-;W7SlB!&@NF#H&cVS3w=ZPP@^UJO%rVHibW*ZH_SDH+3)l&0FD`c$z8+`vAZ@j6OO%c9vCuZ z{myA3GhzMCSE9?*BM^?8dt_%#A^I+;SW^^)Ghj_Iw-1JEU>U9oVzK_ypf?@mMcjiqt&1o<2luG$BeIfvh=oyj#?f%b=^+YkexB7sB*s6_>Lsdg#q-YoDbpsw z*?fJaDK*8I-U})^h#GLb;8l^UJBD->2$ze_&UodOtt})4J%YCoHA-Nd7I{ep3Zg6m zl0aNFk^^1PSw%ZiF8IF#65{S;9?0|)j-sqc1zlQ~mFx#sbM8=zRYbtm6AGT6hl{j1 zyRwoy!&O@iiu<)S#uZ=yN*^(w;x19jI${y& z*ghAa_EXKOfjSF+ahGbXM`Bz!>)HlWKT+J`Bd93BI)-X39#NjxR->Xp z*n?F+L$!hbxQs1|A+?47If-#|SszHrhcIPZ`0fMa;;FoL@Fqaq?)yV`=lh9v@VO<% z6`J^tR9Z^VhfSrY`H2qjds0k!gVY&*$$%+OZh8fIc7x|FS3q1ANPy~4%KT%NkH$Dt zt!5TExl{BJffQH6rN~J?cxyliZMSS;k(2PgPSKgPiPe=-h9+amA@C#^mOg3*YJ`Y4 zb2*F}1#h0ixcKgNF6AbG%=eLLYgKPkXq!$?PiNFNG|E9 zIdI>BC9I{m&%`cLxA7RaK4AtzV z7(|k!-$V*&BGv4Jm_VwU54ZbM%p&!tx(Jz08ZZvyq|6|FL2-HHT2d#fXI{C1)R0Oj zEiaLNIEveO$onJ<#d*nJNT-TmTs8TYG@MGPDL;{ZrMQODsu`MR6jY2^r;|fpqxkws)!mar<3l|c8PK>>B)p4 zpTS-rmx6>iQVBI$uB5orGg0H^I#T#Z)MU9s!;lH5ZbLrnET+rD6qinMvsvH7VamDk zB*hK$KxN3Yq}hj2neqZ@ENOwfO6org;}*#qq+L|{=kiC=2#Q-P;d3eIGaJQikRM6G zmA+r*AhM)3RzTd#o!>7LASVM;E?Tg9fgi|9afu*!SC4cz@c3Jo`4!BjTV+jB<@Kg~ zNEunC{3(}9898;Fv|ENyT*zk_cSuH%8nW6@F1{zsxWN?nl;Ui1oPj;KC+Vxq&f=7u zK`J&DbruD+E=MW90bxDYlD?HIDDEC>CFvUJnp{IEyR5WsI^rTU-VU`R6ocY)P_2^j`eL!Bf2F~QXLq;FXFNfS8b52T`0x~F;lp{gs31MY(zdOlgxS@ipGWvdWbU226CCmkQfWQF(GjJ9i43FG#w5fpb5@`ZU9U-b&x?Sl^}{lpP9mb4l^)r9K_HIAg=vrs>ALZy=6 z3tP}>H6cfyXVoN%`&nb$*J>)o-J#OYtLeEWKncB|hyBDwH7mzq+o5 z7NmTpHj?1Q0-&E&R*vnStF06lS^%FKe4%!b&Xhy_s&a$qDWl>dQaW zKGJPBl-37Gu6a6z51iAFSVy){sK<+Z@}4>i3kVxfg`%k0f*4BlI66cv%tT z8L5RMj?q)7i=Swvl_QR31nq;-+Hk}@(%iGU|4p&lF-Kf4otJX?4tm#5^wIfAuStEi zHAl*Rx*)~Ppz`8%5z;8yuLtO&r1hkMx;W`5X^<{ST1DF>XjhWihQYc_juM7wH;OY` zo2cDM=6*d)d*nztQdgolIL$(>$LOj#;*xZ=97@(TNsFmpQgm(7QPOx_k2IcYHc>aE zJk9n^(M?F#sIRB%W~5?tjLp(5NQX%2I)GG>_PPumM2aGPrb9^ZeoLt5A{|CDkH)1s zoa9ZpEZ32wbn3G&bQI|ZX|0YSU7>oe*X>9zDQ=VQKx#t!^%mWU)UYJ(k$ZF((h^tH z5#5b+t~~0r?m;?9+g;MJq<&CBeR)&&%F%=Obsv&H_1TZQKgsORpY$No9*TRchfpqx zYWA}pK{EU0r5;5x`{h?XhP04+={F6ptcHEpJZ?Yfaip4*i!@S6X1^H5MAA!|Q5=lP zBsXfUlQEUFjp7O$(@7PneWi?yAY~N zEn^9(Al16Iv5eG%;_4X7Nwevgu4k+y#g@TwZ(yv-Q9=u26U7~*(F`!Qkh;-!fyTBR zH48F!kStV}5Mwu`H23*XV=t)%?LA?}ev(CW})*C;O*3dk^#du5_OnL4yp62N5gT~K}@Iq*ji`stJctL7V7F(1pAF5}zqA8bb zHKAH(s~EK}TLb=<%NBbsxX=50WtV`eL^@%-qIz0MXN@B3D6pl}I=`>X#1 zYc|qy5`|wv=q%1<4TZbMS7ALIrT8_Za1$xwn)YyXaOhI8hhv+RpdE#qv`HBSp%m8| zW6JM>i^1~ipt2CQZ~oU-EkffUhpe>~Vg01G-Vg@QstI9&Oi)9MqzFTf-wE+KrCeiEIW%+GveSNELA7Yv5t7P zqEVANqShCIkg~Er)@oLLOn;lg$i}!;KVMw)hd+i(T3{Fk`M8O z=;YrT@|iOh)5IlX_`Yg8Sd+UYF4r1>xjn0jVZkqO&BDg>C;lire-*h&7o}7wi0n+L%B+^RgDM z*$|AeTc~vxX+%!e#5I`|#x%s`qYW^uT?fNHJ{X=1!BE%2o>^5F`@B)hBNe15)UYqC z845Ll{e*IGr}gg|;QF?-{syhDT?@BLr<}J0VEW&iWB96>8|2eBY$&8(?wbVRI~u$8 zw9ky7^s$uwL^Di3fnxu2Zj&H~vdPmR99wHPgswF{gRo1D=}`LYCQD#>x8G{}`ji?Q zVEJ8j40Fal4cGx|PE#+rQXe*<`q-%S6SQAlr2Q(hCH8997MR1fT3ADWKMbGO#_(}d z3`>M#=s|s0jB<#peGt;Oq5cn{HG`;YG5%m365nEx@_8^56u%-IiDsSk7ZK+ci9N@Kl%!q*fE+DqHfR<5*M zmDX>qjU)1^+1Jpk|7q`ytA%NjYhu{A#$`xp?vtl#T!ZB8<9t zZ?B;9#Z8(|a_-w7Y1^b0n6tT`$JNI49w9W(P@aXGVp~RpU})|$fA0-!%YW~UCX~<8 z##oAZT(_gW*PKbrZTHY#dWY7Vv&x=E(MpP(YqHD5IU#3>W_lOuH*;Q!qkX_E>;Jly zIh)-G!qP`kKd+~pbA`Nya-C_60zy8(@^^GRnx*8dkJ-AMt^Q9nOsAePd*0k9&9RH4 z(KkoX9Ir4sg3NiQDD7jnXfFCsbK~(~?Ctbm9LK9PFHNExoP4GWIPZsG_^)Z4d~h_c zRZoVkR@O*^(42KEQavZo2quSO&R^8Qa6I*fS&Abaxmh8f!}ZLo5r4w@{fE^9vF`Ag~#vAhL7O#w+ijy<{7Of%}%GGL}%eXGIvvFF=Q_; z_o6Up-%y=>j=s|?f73Q8%a33S`c=!iC#AJY76F82t=v3^Ns z)gHk&;9XQNg9||pi|L%Tg>sllV_k@HSV}o3(3*NQi&m#SB$}4}X)disu{UTlOT;7T?4p@Qkia$vO%*d5O!+i1L43C*xP$cVE7fZ9cEMr zUBtDFx|GKEA88u9{xjv7j3!NMh}~=aA)K-%vS}UBbO!c$ciM|GDV)`;BjhurSsa87 zXs)o->DM&7hd<7WgT4)p!_amz&c1$O%1~Gnw-&=z6#7%Riq@|gh3mJ{@;+L=Md1wy zVIPabtHDn@N5aVVs)$!X=5^7C_Cw)c5-r;o=cq+ce+-+aW4MmiOr)@KZ@9-5JN98X zh{Cmt<6z$lnLXBCw~?jCLg|Ajyc>hdeJN}TPX=sT zu*E_M=hB>$(iGG0qpkYT^{|=qXLSAc-*dLo5%l-`SK4znuX%2T;nn!rJZqun7nH?t zo6ANB8x+B1hte3{r}gQjas4BTeeH_N7s_sI3eVLnUrQmbIbUT9gdM*)45fSwJPY9; zG@p-w&{>SGfX6JRX_MkX_bDYHbP(mDFF+2?9# zA`F}K#xNlU!{#0s-lW)Sv!6r#%`5GebRMbH2=|KVbmZ3b#n>9buOVljs(;Nt6|1#| ztM@!7FgyUu*?Y1JjJ2~k4zq!?SUvS4Y>UfM;QBTxG3gk#q0o=QQ51R}!u1n&V%U#D zx6Zh1g?X|~%KJ_j-j2ht_cjchjl!^R42Fw$U|0+0+cqg)nOIi4AsDXp-wv-x%DFti zANR4C$$MZu9*O2XNDc92ciF6l*xyw)gF8OB`pWLTHtBhrwMpqh;e?&I+>b)9%)HIA z(>&d0ZRRGb%r4T*MfBeK*Ld|BTMp94P#6T^-|zTZ*R2R^KF};$jOP4@EwFAy!y@3= ztU=)&I4+z;{jpw<^Q{iJJZUV}`Aa%pzS~v1Ss`(Dc>@URtY{3O*KS->ZFdU@&!lyQ zaXGpG`=t9m41HlAYm;(y1BSIGVVDc<4PmYrgyG?Z7=FGV!=v3WT+#}|7r#OgwYi?A5 z=QEe#5%q6XTrR?@KZme= zo-C^KF-YT_|1^Z3mBR1<)oNSGOR&76G}iE38C+iHhRgHH;c~O`-$D4S`~wItikG-1 z-|rCqB6Br&5$E%{Kp0%CDuln3YzX0#GOZxouR22bHeX)|2NxR$VbM|;uF;rVU8kwA zoKfsE2phn9cv5;~7KF}wvAv(QAF8qb+aY#{u?N;yfU^udH#M(sHFyqf%~4oWy(1n? zJqs*>SA+dC_P?)}qM^&F|8t%W;#=6$9K`QY|G8YVR{v9)f98WNy$CJ+Mec#{ZN6_H ztepQFsNv%7SR#gQqHF)V&E3Sz0e5rMd{TY~F|+k72;b3+y>Z4oSbm#|^JLEg4{Q9r zXIu{d2-}v3dJJK{o_}u(*5Nsno8RGeb6oxe%ln;9!@jik2&OD?7(?qI9EI%ORxKRF zkDJZj$OFs&To1qJn2xcr#S6B;`s8VWITvl=0>5D^1z~bN4+!5CtqHMKy7s$E*N125 z?kSqC&05o3WL^Poqw{GVx*qu4$Ez9U_P8d7A1G`_c?MFRfl#0M$*m}CLt#e<>$k&J z%uk*UPttXRWjrpr6m=1u3N(bUd%e(n8$rg zF&E(~-a(j2In*!eTMTQ`4N9*k@z{B5#8G<(z?z9_2rZAG*d(aQ-jz5%oI2U8EN+!X z>!-u|-{A9&{~YeAWFFTU_I%>t9ONLL!0`glTEkHfPc`RXMLn|+(p(hFAl$FkLCzy! zR>ZQl!nnbK7?%Gxb8i8Jqw(NG}-xo`(M&y zxtRZ*9O)mzvYA`XQm(*Ngo8ML;0TY46cviUprh~C9NS`B{&ib(9L+Xj4p^cKydE>V zhQt5uD4Y3Y*U+U7?qh$#eifw6{VH!|7m?zmAnaVq+@rd{a`v7!2$r{4aKC!(gyExN z|J=LOnt|}F^1tq5|6i;(_YnL98~X>#&AGQ^_rt#*+5i2RX7|-UNAq9D(QI}0SQ!3) zjRlTi&h-Co>~hZk|9RoOvA^~9}a9KAs`sRA|Zugw}p*K-gabOtof zgXVJ1HEPW>@9eXrxopN}k11YPm}@XridOlnLmlv(1>cO6_~$i-SxR=w+LW>Zg#S~@ zfd7*6@1=+ShteaVul}k(*6=HMKWcU>+HtH|^S{=c$2;}_mh#W7aOU|dPX{rfCtmIU zJ!d@E|CQ#S`I}c|*l%r$<7YTM3t(?tE)n~0`^3x#`w&z9vv2<@#k_w0-=u+G)AXEH z?cb&B3Ex0v*ZiAqxbF?8eeC~@a{o8=$C>1>y5asDPe<0^9LF*qn@`7Yhk0AASr1|M zOfsk8Un7WPl$~Y_Y@3}X=Ny9bQg)h@9BIzCh=lJ(g@DfyM|2Tz?`f)7&815vd@Dsd zC8E|$@>gOhYfh_Zsl`Fo>>)Pzy@7&nZ84YEZM(qhlk%9NTntf)WaeTKtyq`~+>Nj> z7YDK1+|F^_$S&~4^uw%-vD=+;3H(kRN`O4?SaXS6ydBmox2Ob99Kf##1m>AXbYo$j zdBk~An&W23Gq3p86xA%Rc*H3&mwdt%zBA6w#YytYozSeT1d)N#iW(i{&i>mr;*BU6-%vxp>_y;M+4Vqq?Y#3~l%Qb;@_ zWs2EDsuU_LQYv7cnPN-AH2)$Z2A*~@dkH?j5S>Zs#p*4c1AA6qQl_ZYDFZZ}-@!cjTlUtSC~<=Fm6wDb^T zSUrzegol{OD!c2Pe?>8a<-O|?Xg;gfh-mmXPfJ$X!CN2sR}s%yQCnYv-m$u^_#M9f|C5!lLI-#WM^EZO$3x?y zWmREiT^wf-RYh?Yw!vGtv9Jx^qB1LaZy5X{r6z0E-gHYf(U8@XFRtnU!rf`I(6yc|bj>eX90X0Q;Qktkaz6xj>>$}4>18RwN zq)gFpT>XIB!W-V8fcrJ>J#|EPQks~v&_AG#fFEqaUz&K8Zi8RPBvdgq-4g{rx}mt& zheHGEiYcs~5jIgzIK#W&aW9y+wpBnq5z49)-vN|H!hHfhqZUU=sp4x(Xg~vT&x~_i zJJ$yPDdiFCz+5ZnC2Kas`HJ6Iiy_WeC~vBZW4|^wcupn{E3u6gRETv2+R#XpWZi)W zmKq6n)~$-CJR1uy)`N;Y0ve0jrl_7xL=#e`Si7QsKogO|x<52IpqVhLVd^=qhk+mc39Ox-)m%i8V`#M&+eeZQ|(UxTH zpM6AEQ;x0EqGcb^o7FGP0>6q%$dR(INa46Y+u7hZQd3w??X946R^JXb(N8R7jp|?p ztu#gZS%0yC<30=s6aB?@mSteNrN20kBW1ie%W=-#ZSc#u%PiOK@S7^}9qX5AHZef_ z!1{BV74(etV!TZZ6mM9+jkkh6v3e}Fi9y0r8+$3uF=4S4l;0H9GeNj;oCR8&AWE|m zyH1k{!h=<75XO1ix67)UAX?aE6+=X8PT6)+fxw}nBdhnMBA{4%N+}XWJjWe5Vgn_z zzCL0Fjb-hv>SP%vCb5oHjVm%t%wjn}e-0O!EY|_)mf_-a*14)-@awd-tXoynEhFGt zAZk0ccBD9EmsN}ukL*gcj1tc9gKwN8Yr#m55%pNhR+S1&5`FASv?L4ofjFgHwyIoU zig;vK<-qZxF-)kK%d%B<11E~scKHRSiQaZK51b;#*cBQ$O=Q^BE^vmpXIHntS;DKH zndh%35-oGYAiL@Y&J`2v@(aumpV`$sFjH(~bsTGhU&=irrHYO5iIxT8V|~msRm@u@ z;kT1D8&C<3*t?5F0~Yq~BGKFw^x%NN#iF-eiI!zzhAH82(khmVpX^GstPt)E%~}sn zv5GImIJ*)ptHc3T)9qHVMqITk(Xv)J`kLD{-JTe@UikWDSToSlfRBw{4tiVIUt7*25 z1|AoY&9XHh@T`DWW58dUSkm));Md|uyS@*+D9SX?j(ZY#MRc<3W#G4BlU?rvZwRA> znexhs0fDzfC%e86yeoFv^(64V$mfqKQ^k~?Ht|5b2r#!>NU9!as)8-i@<7CrQbjqN z4SvJAp5qGIte_JdR{-K3iF`rkcDRQ;5`##YqEwO$g5S5=l_%(l$grz$(9a?=7`Mw5 znY!a<)z?J$&i=9020Dbo?p zD^dorPNvlhk}}dv>G*KiRc9sJvfd7RU{SIg3FmpM&@#)e#zBTWNXisvXV`*6+tw zITVwQ5oVsh9~%)=T>7#`5Ao6^Wfbe_n6W{n%^H^n9zS4`7=GfUQTKdX4rs#a+ zD;Jn4Mc&M9kn)sW6(E<#ET_yl{(drlTeIy>nO?zuvNEg3L7(78vKg!E!G^(2WT)(u zG0V3wfG#8?Fod2_08~$N~zjmi_#n$9J7fanTO?n z%nB-Gib@EUrAV3L*rt%+U>Rmtba04l(%$TsKEpEn!{lmGn&apNHqlaMu_i3Af_Agk zdDuj_Jj~kSVFjIL{aC>UZ>ze%dR75`=OeGPR&}R`5ZZv^~?Qs!m#_q4%(S}DXD<7owzV$I)agZ~8J&iZ_(6;#y} z^-GMb&2fFboGdZYkCosRS0qNlB|ZF^^Gh2UPI{PoQFOFyBipdn!v8R7BfIi;zaHrt z+*bBxDO(><0xPIZ;9py&Wqa%GlJ6V;XyiW2Ut3H(1NuFelfbu%auUTnOUT66&Yd4hFMc!c@hw{3} zpG;Aob(PpFaF^`VrCONyOYzmxEq@7nshd3|_EIwZZT3Yp~)|;TNN_0jofAPk0|& zGnQ*|Y`I=C)D*R-w`|REr4J7Y?kzjAsvb@P#j;|$PY&)Q<5_*Wr-O!>qFnmQu^eaZ z0e3xe63ev*-1W#=tnF>!u199FPQqPzKlwT9BDB4~T+6x*ZSOC)vaB=V&PMKKm7EE8 zHu5NI)mXT*k!M(2$HJYByljeUHc;N=xG~+~K1beXO^5rVf%0jNl!N4Jj>9n;B!6e& z7!8s}r@zK1LFQxO7$wLeEF7c3(v^i{G+27DaEyjXZx)Wx5LuU1AbCmfP}!K}n!FMe z#JW^ueQ=_TWZf&W1=QXYwQrd0&T;*!?hYO%`?5w8n&YbEJrg`!j%PK= zdjT|^H7f77!6W26)~vj@KucIV5`PFDDOa&hCH@S`VhxCWA3RF#VkO7^0Xl4o>N#5e z#Bo^qX!#2ZOCK%Yv-ak-gupBQI-7m{b>0G?+^pa7SVEGdGpiuPCCL&jtl3yuj)gTF zE32@uX35frg*8i-zNV;V<75KIIi!~e87D`w3Z}b*QgftCkyAM?4$e6#GMzOD&N(S^ z5o`GXn@E)_Sz88JK^s|%;0PEmcd*vL5injJWNnB2bAmjMbq0?9sj?~S1|0oUWeDqOxJ^uxQLJCXt)Px9 z>u4Li%cCc&#Aquho>l(14c`2c$nrXF1&w7nzHq@}BQ1l&rg7BXKtv7V>Y1G%tV zk5miEl%-kTN9utpvc8M9iO*y;){|%}s2=O*;n8w|Y{Ggs+yd{;31;1gS!$td#d-#_ z)I!;T)v<^T-i^|O)vE}++eG$f6{ubxjFkt*XqjA-y&a6vGP#B2H>Ydx=W-9L)to*c8*6-jn^-QtWG(6spDf5r ztYv#`VuifH+Pv2ay3g9t#U@tDC#+*#tf1GdH*j6|h5Vf*;kw`pX>>Ek=se5?t7Jab zU6>12$s(*3(1z90m9-h#uv&Vsj=|Wjk>0EeFt%%CT~@qzwUD*4F>8!>Jx~zq!;EOT zPDZjUGc97BY|lz?v5EDvJ8Png71WP)V@b1+4RQ$U*^)5O7}mM?o?@e%z3+J;vvL6fQvpo|3;T+Z)=d-cQ8=d*os1`Fr2eR4jl zdNrHaFPF0Xs#!s6SU8^@kegXJpB<2USU8^@lt)-NpB96&rZld7S3lUWF!mctdp`G3+JqpvO5ds zx>K?*3+K91atO-`Z9gqXvs|I=r{x5eFVyo(Ih_>>_54z1u=2ndosmnjw}UY{BUiI< zK07PnMSrvx;Cyyg?q&tRG5wW1%<2fo^jGpU3+K9X@&XIzx^wb63+KA8(0v$ES&2uNY&G<3(j>HWL_4|br)qJ7S44SWhvGQXx}C2&e{y^yCkc! zj={KJmbF$;?h4a~UxylsH8aL!7j>Dt>hTO@* zqyL6H#KNN=-fYFfqyMHnZ;EpHPJYXAvtw=IJ9&q-BGwA}i4_WQx8yIZP7rrXzGv-# zxZChptT{%fAnvxz%?g9k??`7>Cn)`nEWyg`WfOO0Io76LR!|jIJZyJQ`mmBK#0?BPdevkuMuF0K2BUpIP z^`jie!h5bCnC}D6(+c{ARj-3hyq33FEjn014_QCJT<}IdXT5;A z;EjC8Isv2ktNfF71xE8%>DbHc&;Cg^@m5+{Ba^J4;;gQ4et0L{SOekw@J?1{-9BK0 z_rBF+JvspIHjxck$#Adsn{3XS0rzUZ$uLvYyB}mU$N7$59`ZqUVug+00E)|z@^?9a z<2u3p*za-}D-rI;ewXk{VE9XOER+&0Kgu*#=@g6jDB+dk6n6mH@JW8g`U=|cNiJvM zdHN5zj)mvxKjbzRUNihD_p$Jr;ZJ#tbt?tF+)!s(&r{MZLS12fIvg#f`i|uUPv%JV zBg+~SCX{-{a*av1DD^7~ua~s?#KP+(tsHurZNM4RQ2ALnW5R!tXPrM5Cg498v+f>C zx4{3!W5th$C%{y7);Rb_-43cg3uoF~swoR++FUAxRUJN|b5v0*Klp^sQFUZFY!8EX zefDG(-=1#Ct>RhTU>x$OL{@(ohdgR5YwYl@!Fkmr*3993K(kmSc61HSr!rYyJNke= zXW{j(lUmEd>s=?c)fDYZ`PE*I!?`uTvaxV(&9Ba|aBeN2F0pWKEue0)@N+(^y3fMT z`K;p!nw7OD$T;VwXpJF;oMqS zRb%1YT13@l;oMq8H8Dl4bx}baw;GeH*+bQq5ptYfGpM7Phv8TFSy+Dydepu$M}z&8Dc< zrPP-k=MQ&FrPM`M4BRc1Qa4zmj@g8(`kplnu8>^S6BhPaY4wVQeO6liZi-4MqjX<$ z9Q@-?d6rRmSuycF0?MeuEG(g{D#gMQ%Bl)1EWu4xWnl?!s*Witp`2>Oak!tAQvod8 z&&sI?mQVHF!R1w3R)gwCK;2l_OYW)<3wz034Q65QR#2l@*t-?fcox>oLrr60%{KEbIv{CHt9UggsGJZ#kTaobOY)K?E! zGq;}uJ!eJ3Ij(_v%Zi0_Tm$td3&*IT%GKW-F&v|Y%F4nq@>RuHI7Yt8jfHcFpQ^;d zImA!ZWZ|6ENHt*LoYhD*XW^XHScS51&T6cpSvc-ZR3{dWdlMDM!f|h^2C#74o2ua~ z9QS4_nT6xtOigCtxHng`Svc;^)dChC0WH*W79IgD)Ou6Y^ZsfZ$5nzep1<11stsp6 ze|3z7XV?IBmW5~70Ck0hXY@ez9ShIsf$B#VUX=u?XDqxb2~xkZ@Y9N5^@)X_Rs<`D zcyo;KiX}wlXWo}qFj6IQ9Db(}3I9LPYy*C$5veAz z@Ees@Y9s#2`hhpnIr ztXmbkh<2(f>p{h(vYo2Kir(2pv{#K-U3V^(?NtydQ*7FNC8UFjv+GVsN0q?(_f+>;*!EcUgoSO7Rj*mt_Bi!B z3)>#2jDcpq+^X0UeuN*a}Zsy}acCC`VD zerhP|VV>=d{Zta`e%^zQ{nbR)Z+UfSe>IbZ`%Ao<&%*sBUM(|4B@9rfIc_G*L<7_X z)98VC1ygOxiAdwz)WVqwn@QMFl5q34GxKh`_w`JpO+6}>Z0 zXrc;db=`T)F;TTM1vM)iI!qlVWjeO(RW5Y2I%&pEr@M%Dt z6iLc)Ftv!b(sKCL(Kksx(B}FQ+ZhL_P}?1st{|P2Ykn;O0w{|l8MTl<+m8V z<5OO&kj3yFpQ_Djv_D#=DL+>5ev3#`0j8+6lU2A~R(Mx)CsL+(;!!VjikdSNYnCYr zv}qbTLtPwhD&DBJjGcI(onljeZ!jXeO zBU4Phj~fO`Nj0@;8EWEql-cu()fy81>c%D(tIe!EBdwr4tg~ZnVu?D!x(wg&FHv8z z^6!h5OVveIv3(Y?RNXK|ZC|Fo=eVl9Y+{*u%&G&Qd@WP2SeVP_>H`aN`CRD+%BlZb_A5VJ<6_I}3AJp{kmqx~x>SId0k7Q=Ti8A8W(f9sw&= z04rfDeAA@DS);bXH%+RoDavJ)>dJA;){Y5XrFyeAtPOy-T_>;-wx)!xRwG%XwoU`3 znxb6RsHq%hz}3YXmCniwR~Kv4B31_U{93h=wFG*8t=h;c44)vcQ#)90@Coudb&z#D z4!(s_Cs^m=;9Ds5HESG<^ak|}YYL3?26e|2)oi1B$Z^*?+r&ooob^*@E9f1o0bILn zQh&07;o5DJa-2vb<~SIxrLvTjH5sm@vQ%+a0&KTgxv|np&FJ>+VJ!37N2H!%dH>}O@?f*{oiFE;H(_P9k$!z;=m`!)7{HCac-O7vO ziVlPCq*N_d*DI>>o0f&Jx-3Yvm>KFoa@z8yHDy0Rw1uMEzpk)~ugeA;wI-C{LN z#qBOmrR`+l)YGA7RLf~*F55?63jIpOu#S(u3F>A_&ODjV>6|Jx9aE->nJ0e?J*T2c z4`s2Qzl46RHk-=*?F{$^N9`u1iu5qB6OMaGGG>_d z`~=s+=d*js347u%VcY)_w%slZw%sl#vjof$pOZ7|k}b2=EDN^QzMTcz_m{8-FJ#xn zf<0)L6ZYVx>^LXvLAxy2hRZ6ES_Hpf=<+`FvUL=FV=+%~c>OE`im`-8et9G-@?TVi27xtst$V#f{mj9vJ$@(}eG3=2##0ri} z411zZvEtSyhCNfaS=~U-)f<*S=!MEV+bm&KN@Cb6RhYGARASg0<;vO$ac`9eYahhD zSJhazKp#{+)(y}{)s$qO$No@ZB-mee_=!K%2{TS~_x|1Tr;1L;(o;opI(#s!Cy@Br zdOe$D<|6e1PI-Sv?gCPOG~+}Y?_VuSSD$C*^7)QQVOkF)nYkD`iIgcEI?pX&Xd7$5 zwrOD&T`$9I`%j-|gyqtmSYr8Ncoq9dR`BwSu-tkHt2e~u(R)c|&GKp+$2s;|8J1T+ zpKs>5V8}ZopDvJ@Eidh)tFfjGerM#@k#>3M0y=>eH}suh)fp^*+vYH5eUP;Y@+_!t z+vTMT=}-3UymVph@tIj(Gbo{m4z$ZlyXfAmR|)ToqIwEzT9J1~F}>a%=cSA5%dB9i zO9}njE_gy;7g}JJ&>l)CrEA&crCoJ2%Ms#A>tS|z=`wmgYbnH))w}KT(r)@&)(WUg zIsMKqFI`?2TWFSN>%1q-UGG?gGJC#)K0wNJT(Rb0SOtBIHFC|DpmV0gpo&*P35(5K z_Ro3{=AjoX;XI??gjLclmYOOw*3z=7UP4M2g~nQ2dg}(Cn{gZA_ZBsEDC>))axHyy zAC?$?N^=xD;1ea? znU#A7e4?a#v7#WZp&rQU1aS@Z2-dNr<}H2oIM%mG;h-t3Nl6`A`sq2WjHGU$g{*e1 z!$c#!f)(33-O@;JVEq~1yJcg&os~OcFzA3OI{!7%$N#2tq!S|7APN7?;=L)j2THdz z(RtQj`^-C{rn(dcwQQz4v5tZQbosToU8eXYra{ES>dr*7ZdNa(B^F)|=&>gykA=Tfir0_Kl%hVr@8J)El7VS*;^6VjQ;IFq&q2yq)~OMfTMp9j&rIPjQ;hex*>bRcPlEs4>2a^+ z5WRDY8TVwmbQr3wTTyA^>pb^bChBvfbTN0|)0V@u?=~~#(di4+a2;)zlfwx8h?Fk! zjdKezy?<+&q_cLT%vvYwy`%|Z(c+_?$=Yq-UvcBK7b#O%2deOKI*}C_ zhdRjGH0yz7oHq93cA27g;sZ;H4r9$+{J@f`=drq#^>H4rZLD=geVixgpabT1$)$aq zC+b*Mn<6XqB)yj<+*azzI`6^1YBp6DCS{5lqYH*l)j?mHxnztk9X?a20hf(_4ox)+b1rBE84&-k9wq0^P}Z{y@i!9-y-(wy{yk> zgoy*%##%8W-Eu&mVg2A8CJyRLtQYW0rGxq=YeVV};fM5n)}GX#K~GuZvwjFatY5RH zXZ;NNXo}|YBigwAS8I>xd@OA35nY6Zt+i=a7Pi)=Jy_V#}eVx^OI6P6O@3F#$!xMG-G3#z6c%n|fWId_`Pt@rTtOje~i8`(B zm}3;M2A-(Xd08(!og&WbLag6B3xP_pHl&t_xS-uxds5v&RZUS3UevWY?nN7TzE1nG zKEStZ7j*z@_J}ZXNr$sOACYdkq}#Frqr${x-IWy+m2SDL`>;w33=>y$0?Tt?y5))< zWr|9_s;6)qj^9;1hlS&JRWD?v!yVr@dIf74{HFdJy@7?}_pRQ}!twi7A7J75UDL-| zIDXgkITnuJb$ykE<9A)(X5skV&<|KRemC@U7LMOd{g#E}cT@k#8nPRnsMERbnq!o* z8=k1sRu+!!EnSR-V|z=xu^PbG-qw{^IJUQSP1Xy~Y7uvI1J-YzwL#5IQ4ikLq1h>6 z{O;=3EF8bPx)aNN0z6-*V_En+jeB|ktMQRA@x30#3ObT*`CccRq7v@wG?IDty|4F^ zGDVvrz7hBJX}f%!f6zBrj-`Dge$+4Q@^OBk)jjN&Od;HSBOdDFcKJB}q^qzTiuy)8 z(#`Dhael0$S@R&zC%V5~KF&||Sk|wuz7fxKhFw0+KkGHDOJ#i{p6f$)`8fZgFOt$l z(<03yUTDwn1^lIpr)8T*ywnp}FI_?-Ug>+Royootul23_X3ERSts~y(dOw;vmfShw zoz8e*$_3i+LAyURbqi|tyS~a=W$PXBQTzVHakhkrPkICEjmM~nKlFCH#zhEYKdVT^ zQ4z{GXVwFIYb$PKt0eKG-!QBClaQ;(Csl6p`O>wrfU&vr(FL?!=^s z!iFcS{GfReMU82!rDYdKlr&bec7RG5Hr6_jt8tTc7*yJL%i8U-Jfe(I@UdC?IZ#={ zn{^cAW(2aXfyx=NtP^?W_?I^>u;!LUJz{NiLCGg(p0$dginHJ!nS*MuZqatZtmzcj zopqmb8O8e96}L-gouTd4lkkdVbwqjNl3g1k+>MWw< z`dS41w=vd9+nop>;~YyKeGpO05I>u_%p6*!NNuAYYx&SBh3Xh%StTH@t}%yI8RF_0 zM_D6>K8vVtoM*iq@+_i(@g2)?=*x(P#v@i5yxGgwsQ%n6@At)TBm9iLto>OkvZ>MM z7c*{umQ!Riqu2{mN8Ej!n;W%Q=iQ4%wlJbu%e!Q>Y+>wVi3(Sp1B{QX-GhBV@WKZ8 z%M`l@UpE4cHg+ux3Nn)H%4ivEh*#MuOGSnnb67P-m5Xd?xW6{zZdR!r8DWfkgEFs8 zBa9T1IoCxPGf0`@Z7Uz=2t)j8Zr2a)<|BBKSgn(MBV&wiZ~rR2tt8vX6+(yE&=)UM1{-HkDJU2fIGm|$1I zsGi0QR?CR@p|Qq~thsaEhxRfWzBg-qsCApDK1PsTeWLmrZR{Ew)!&G->$9kV#xT2f zMGY|~+jT8!gt6GJPf=ryZFW^`J<&L4S4`^}#v8jPx1Mj5`YpRIhgyGb__O*Cc-MM^ z(Vi6-|E~2$BY~7I>csxhdXw?-L-rV1qqB^>zoSweODrrJz1b+ls)g!z^ zz-hz!r@7te@S)LXj3%s=;bWt}G7?zT!zV?5ZER)fq?yqdjQ6ad@Xw+z8Da4DM?Csn zIeren)WTwP9dZ3yjkI(KaCcwFFd-%NJ}5qjw8Ke zv}FqG@z(el!(uIN=5n#Z;24X=omJQ)J|>T43G2nN(J^@~i6zXGvm(aFI9UppG<9y! zj2NpWjg%%XR?3JeXj#JQ2`X&4#i~?kX^e|yQz_goO~h1M8&k|OvNVZ~fRdK$q*PJ3 z|BjfFmQrQR5_0$7A5+TGgp?*)x$m*KT1u5QbMXh2wq%;3T*_E>{!Q0NnU1?hYzru3 zdC00V z^{R7aOG%FN>H5G@+2a2Hu=g%-QI*^O|FdUi?`O|&5fnv~k`cV1csGw0+Mw3aq`aYm z0uCXThIdRkq0R(qq*fG_CgzNyW@6qjQ?Uj?tCMxK=;Fz0NbO|V#j*=!^;>K01x&Yd zI^Xa2_x*kU|JRq-Yu5YuthM&@JbORS-m~|fVUH0L@9cZvhVCjne22F6B6xrAu1;X} z)k=M0f;x>AJ^`tRy1Pl;IHITecTy|#u2bO~t?K)%`oVYhdZ{0?`e7b?qgDNqRm6Pw zMyq9SV&z2m7geJ#YWl=u6DI|z^Ao2usSn2o zO`6)IuIUy%DZ5FH>v`>@+nbbm{4JC2Xi_&$zjhLQ4U1a{hSiQ;iZ^_8i$D7pm zHIq`kO)BoeoYe9rl|FG{>b3y2JoU){Ri3)DNsa6IVk&&Wk6Sm7Ka;w*N!>X8#nj3s z6%4Vbn-p$c_>vnhhuagroYSOMPI|UUeK`Kh)T64UGwu&=y#!|DF*TT#x7eI^Ol?i- z11rwf*$tTqmRydRE)LK?J zlTWK{yBe7|liyJbSm8{rSF2dzOg^t(VTCjKf|?j_EQd4s6ZL^6b$;R{^>bD@d%jW^ zcf-sTVq7;{+P7*QsSgyKOW&&z-HlpsF8!n~CbdFbDTz-rYtOLi+&M8#YOVw$6ZZg{ zww4v{0U_E+c&az9E$#tf+J~%g4``(o^)X_-j?S9YMoWO-K)_5Kv9{VkQf~3m!SQKP zn&@xDa1Xdj8`z{4PO@vIq}<}|gHzKwYcT^b(=BqIosrf}d*V;Va=71i*Xmf|Ebpbk zW8tYi+>85ZvsmH2GEiI23ip+P+5@a`Um2v8ky;^MIW#xzTI~$Sa9Tp!XNYB(_ZZKjv(zCVHCbe+VeC;h##z-&Hrv2Gi4oCVf?cxYyIoyj2w1|vZ2I>?KxKCdY+j4wDt-s^LYQ{gW5Z+ zZk&E%a+P+GRWQV!)4pfrKlttBqgqHZ_Qg1YJ+HMU^@zYH06woJu)^o;y`W8E)dxOZ zeNmgn>az*9DKBaRZ*H#TWz9j#_ze1GE!R-=8T8BAQc}ie(64A~NIgPN$a_UwN6L6Y z-YZ(U5ff*RwVd)dZSF0`HrtXFH|3;O$;xzV-zl$ZDPxRS?vm@L)M=HhIygs8c~cuR z)`%@$GIq*aTG%8*#ly4B-_@>aQcI`2r*&;o%cuCYCt0b-*Gzd|JJ6&`r<~Q!vf6sI zY|1(93aeJ-o2H!CB2tYOzTf=hlz(VLSiLm0a>_?qDysuipPzD3bFqrbe|gF$+P71T z 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�H*iJAz8=OY?l$iohrKY5*j%$&Gx$&fj_25mw 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 O{sJQXEyDj#1AhX6+RSqR literal 245760 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 diff --git a/Lib/Tiobon.Core.xml b/Lib/Tiobon.Core.xml index dab351fa..2846047d 100644 --- a/Lib/Tiobon.Core.xml +++ b/Lib/Tiobon.Core.xml @@ -1253,106 +1253,472 @@ 删除模式 - + - 获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包 + S盒 + + + + 组合继承属性选择表达式树,无拓展参数 + TResult将继承TBase的所有属性 + + 原数据类型 + 返回类型 + 拓展表达式 - + - 权限变量配置 + 组合继承属性选择表达式树,1个拓展参数 + TResult将继承TBase的所有属性 + 原数据类型 + 拓展类型1 + 返回类型 + 拓展表达式 + - + - 测试网关授权 - 可以使用Tiobon.Core项目中的test用户 - 账号:test - 密码:test + 组合继承属性选择表达式树,2个拓展参数 + TResult将继承TBase的所有属性 + 原数据类型 + 拓展类型1 + 拓展类型2 + 返回类型 + 拓展表达式 + - - - + - 路由变量前缀配置 + 组合继承属性选择表达式树,3个拓展参数 + TResult将继承TBase的所有属性 + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 返回类型 + 拓展表达式 + - + - 前缀名 - 如果不需要,尽量留空,不要修改 - 除非一定要在所有的 api 前统一加上特定前缀 - 前缀在appsettings.json中配置 + 组合继承属性选择表达式树,4个拓展参数 + TResult将继承TBase的所有属性 + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 拓展类型4 + 返回类型 + 拓展表达式 + - + - RedisMqKey + 组合继承属性选择表达式树,5个拓展参数 + TResult将继承TBase的所有属性 + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 拓展类型4 + 拓展类型5 + 返回类型 + 拓展表达式 + - + - appsettings.json操作类 + 组合继承属性选择表达式树,6个拓展参数 + TResult将继承TBase的所有属性 + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 拓展类型4 + 拓展类型5 + 拓展类型6 + 返回类型 + 拓展表达式 + - + - 封装要操作的字符 + 组合继承属性选择表达式树,7个拓展参数 + TResult将继承TBase的所有属性 - 节点配置 + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 拓展类型4 + 拓展类型5 + 拓展类型6 + 拓展类型7 + 返回类型 + 拓展表达式 - + - 递归获取配置信息数组 + 组合继承属性选择表达式树,8个拓展参数 + TResult将继承TBase的所有属性 + + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 拓展类型4 + 拓展类型5 + 拓展类型6 + 拓展类型7 + 拓展类型8 + 返回类型 + 拓展表达式 + + + + + 组合继承属性选择表达式树,9个拓展参数 + TResult将继承TBase的所有属性 + + 原数据类型 + 拓展类型1 + 拓展类型2 + 拓展类型3 + 拓展类型4 + 拓展类型5 + 拓展类型6 + 拓展类型7 + 拓展类型8 + 拓展类型9 + 返回类型 + 拓展表达式 + + + + + 连接表达式与运算 + + 参数 + 原表达式 + 新的表达式 + + + + + 连接表达式或运算 + + 参数 + 原表达式 + 新表达式 + + + + + 获取表达式中的固定值 + + 表达式 + + + + + 继承ExpressionVisitor类,实现参数替换统一 + + + + + 判断类型是否实现某个泛型 + + 类型 + 泛型类型 + bool + + + + 复制 的副本 + + + + + + + + + + 将 的值复制到 , + 仅复制同名的属性或字段 + + + + + + + + + + 为对象的指定属性或字段赋值 - + 对象 + 属性或字段名称 + 值 + 当前对象 + + + + 为对象的指定属性或字段赋值 + + + + 对象 + 选择了某个属性或字段的表达式 + 值 + 当前对象 + + + + 是否为NULL + + + - + - 根据路径 configuration["App:Name"]; + 获取 类型的值 - + + + - + - 在控制台输出 + 获取object类型值 - 文本 - 前颜色 + + + + - + - 打印错误信息 + 获取string类型值 - 待打印的字符串 - 想要打印的颜色 + + + + - + - 打印警告信息 + 获取JObject类型值 - 待打印的字符串 - 想要打印的颜色 + + + + - + - 打印正常信息 + 获取int类型值 - 待打印的字符串 - 想要打印的颜色 + + + + - + - 打印成功的信息 + 获取double类型值 + + + + + + + + + 获取DateTime类型值 + + + + + + + + + 获取DateTime?类型值 + + + + + + + + + 判断是否为DateTime类型 + + + + + + + + + 判断是否为数值类型 + + + + + + + + + 赋值 + + + + + + + + + 是否包含该字段 + + + + + + + + + IQueryable数据写入文件(Excel) + + + + + + + + + + + + + 列名按照前端显示顺序导出 + + + + + + + + 对象字段描述 + + + + + 获取字段的描述(描述 - 列名) + + + + + + + 获取项目程序集,排除所有的系统程序集(Microsoft.***、System.***等)、Nuget下载包 + + + + + + Linq扩展 + + + + + 返回请求上下文 + + + + + + + + + + + + 调用内部方法 + + + + + 获取内部成员 + + + + + 转Lambda + + + + + + || + + + + + Contains + + + + + > + + + + + >= + + + + + + + == + + + + + != + + + + + Linq扩展 + + + + + Base64编码类。 + 将byte[]类型转换成Base64编码的string类型。 + + + + + Base64解码类 + 将Base64编码的string类型转换成byte[]类型 - 待打印的字符串 - 想要打印的颜色 @@ -1544,129 +1910,323 @@ 格式化object类型为字符串类型,如:2020-05 - - + + + + + + 毫秒转天时分秒 + + + + + + + 动态linq工厂 + + + + + + 组合条件判断表达式 + + 左边的表达式 + + + + + + + 将运算枚举符号转成具体使用方法 + + + + tokenizer pattern: Optional-SpaceS...Token...Optional-Spaces + + + + 将运算枚举符号转成具体使用方法 + + + + + 动态linq帮助类 + + + + + 是否是合并 用于括号 + + + + + 再有括号时候使用 + + + + + 连接符枚举(将来可能会包含 括号 ) + + + + + + 取后缀名 + + 文件名 + .gif|.html格式 + + + + 根据文件大小获取指定前缀的可用文件名 + + 文件夹 + 文件前缀 + 文件大小(1m) + 文件后缀(.log) + 可用文件名 + + + + 写文件 + + 文件路径 + 文件内容 + + + + 写文件 + + 文件路径 + 文件内容 + + + + 写文件 + + 文件路径 + 文件内容 + 编码格式 + + + + 读文件 + + 文件路径 + + + + + 读文件 + + 文件路径 + 编码格式 + + + + + 追加文件 + + 文件路径 + 内容 + + + + 拷贝文件 + + 原始文件 + 新文件路径 + + + + 删除文件 + + 路径 + + + + 移动文件 + + 原始路径 + 新路径 + + + + 在当前目录下创建目录 + + 当前目录 + 新目录 + + + + 递归删除文件夹目录及文件 + + + + + + + 指定文件夹下面的所有内容copy到目标文件夹下面 + + 原始路径 + 目标文件夹 + + + + 获取文件根目录 + + + + + + 创建文件夹 + + + + + + 去除富文本中的HTML标签 + + + + + + + + httpclinet请求方式,请尽量使用IHttpClientFactory方式 + + + + + 获取当前IP地址 + + + + + + + Json 配置文件通用类 + + + + + 锁 + + + + + 读取配置文件的信息 + + + 要读取json的名称 + 要读取的json节点名称 + + + + + 配置文件名称常量 + + + + + 根据环境变量定向配置文件名称 + + + + + + 获取Nacos配置 + + + + + 获取Nacos配置 + - + - 毫秒转天时分秒 + 获取Nacos配置 - - - + - 取后缀名 + 获取Nacos配置 - 文件名 - .gif|.html格式 - + - 根据文件大小获取指定前缀的可用文件名 + 获取Nacos配置 - 文件夹 - 文件前缀 - 文件大小(1m) - 文件后缀(.log) - 可用文件名 - + - 写文件 + 获取Nacos配置 - 文件路径 - 文件内容 - + - 写文件 + 获取Nacos配置 - 文件路径 - 文件内容 - + - 写文件 + 获取Nacos配置 - 文件路径 - 文件内容 - 编码格式 - + - 读文件 + 获取Nacos配置 - 文件路径 - - + - 读文件 + Nacos配置实体 - 文件路径 - 编码格式 - - + - 追加文件 + 服务IP地址 - 文件路径 - 内容 - + - 拷贝文件 + 默认超时时间 - 原始文件 - 新文件路径 - + - 删除文件 + 监听间隔 - 路径 - + - 移动文件 + 服务命名空间 - 原始路径 - 新路径 - + - 在当前目录下创建目录 + 服务名称 - 当前目录 - 新目录 - + - 递归删除文件夹目录及文件 + IP地址 - - - + - 指定文件夹下面的所有内容copy到目标文件夹下面 + 端口 - 原始路径 - 目标文件夹 - + - 获取文件根目录 + 服务命名空间 - - + - 创建文件夹 + 其他配置 - @@ -1742,6 +2302,130 @@ 【-1 取值结束】【0 未开始】【1 无引号开始】【2 单引号开始】【3 双引号开始】 + + + Linq操作帮助类 + + + + + 创建初始条件为True的表达式 + + + + + + + 创建初始条件为False的表达式 + + + + + + + 日志操作 + + + + + console日志 + + + + + + 正常日志 + + + + + + 错误日志 + + + + + + 16位MD5加密 + + + + + + + 32位MD5加密 + + + + + + + 64位MD5加密 + + + + + + + Sha1加密 + + 要加密的字符串 + 加密后的十六进制的哈希散列(字符串) + + + + Sha256加密 + + 要加密的字符串 + 加密后的十六进制的哈希散列(字符串) + + + + DataTable 导出到 Excel 的 MemoryStream + + 源 DataTable + 表头文本 空值未不要表头标题 + + + + + DaataTable 导出到 Excel 文件 + + 源 DataaTable + 表头文本 + 保存位置(文件名及路径) + + + + 读取 excel,默认第一行为标头 + + excel 文档路径 + + + + + 获取单元格类型 + + + + + + + DataSet 导出到 Excel 的 MemoryStream + + 源 DataSet + 表头文本 空值未不要表头标题(多个表对应多个表头以英文逗号(,)分开,个数应与表相同) + + + + + DataTable 导出到 Excel 的 MemoryStream + + 源 workbook + 源 DataTable + 表头文本 空值未不要表头标题(多个表对应多个表头以英文逗号(,)分开,个数应与表相同) + + @@ -1997,6 +2681,101 @@ + + + 权限变量配置 + + + + + 测试网关授权 + 可以使用Tiobon.Core项目中的test用户 + 账号:test + 密码:test + + + + + + + 路由变量前缀配置 + + + + + 前缀名 + 如果不需要,尽量留空,不要修改 + 除非一定要在所有的 api 前统一加上特定前缀 + 前缀在appsettings.json中配置 + + + + + RedisMqKey + + + + + appsettings.json操作类 + + + + + 封装要操作的字符 + + 节点配置 + + + + + 递归获取配置信息数组 + + + + + + + + 根据路径 configuration["App:Name"]; + + + + + + + 在控制台输出 + + 文本 + 前颜色 + + + + 打印错误信息 + + 待打印的字符串 + 想要打印的颜色 + + + + 打印警告信息 + + 待打印的字符串 + 想要打印的颜色 + + + + 打印正常信息 + + 待打印的字符串 + 想要打印的颜色 + + + + 打印成功的信息 + + 待打印的字符串 + 想要打印的颜色 + 序列化 @@ -2590,6 +3369,40 @@ 用户ID + + + Determines whether an instance of this type can be assigned to + an instance of the . + + Internally uses . + + Target type (as reverse). + + + + Determines whether an instance of this type can be assigned to + an instance of the . + + Internally uses (as reverse). + + this type + Target type + + + + Gets all base classes of this type. + + The type to get its base classes. + True, to include the standard type in the returned array. + + + + Gets all base classes of this type. + + The type to get its base classes. + A type to stop going to the deeper base classes. This type will be be included in the returned array + True, to include the standard type in the returned array. + 列显示格式信息 @@ -2892,5 +3705,18 @@ 边角字符串 + + + Converts an array of bytes to a Base32-k string. + + + + + Converts a Base32-k string into an array of bytes. + + + Input string s contains invalid Base32-k characters. + + diff --git a/Tiobon.Core.Common/DB/EntityUtility.cs b/Tiobon.Core.Common/DB/EntityUtility.cs index d76e6d6a..755ff4b2 100644 --- a/Tiobon.Core.Common/DB/EntityUtility.cs +++ b/Tiobon.Core.Common/DB/EntityUtility.cs @@ -1,7 +1,7 @@ using SqlSugar; using System.Diagnostics; using System.Reflection; -using Tiobon.Core.Common.Extensions; +using Tiobon.Core.Extensions; using Tiobon.Core.DB; using Tiobon.Core.Model; diff --git a/Tiobon.Core.Common/Extensions/AssemblysExtensions.cs b/Tiobon.Core.Common/Extensions/AssemblysExtensions.cs deleted file mode 100644 index be4b25d0..00000000 --- a/Tiobon.Core.Common/Extensions/AssemblysExtensions.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.Extensions.DependencyModel; -using System.Reflection; -using System.Runtime.Loader; - -namespace Tiobon.Core.Common.Extensions; - -public static class AssemblysExtensions -{ - public static List GetAllAssemblies() - { - var list = new List(); - var deps = DependencyContext.Default; - var libs = deps.CompileLibraries.Where(lib => !lib.Serviceable && lib.Type != "package" ); - foreach (var lib in libs) - { - var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name)); - list.Add(assembly); - } - - return list; - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/Check.cs b/Tiobon.Core.Common/Extensions/Check.cs deleted file mode 100644 index 6f5df4f0..00000000 --- a/Tiobon.Core.Common/Extensions/Check.cs +++ /dev/null @@ -1,163 +0,0 @@ -using JetBrains.Annotations; -using System.Diagnostics; - -namespace Tiobon.Core.Common; - -[DebuggerStepThrough] -public static class Check -{ - [ContractAnnotation("value:null => halt")] - public static T NotNull( - T value, - [InvokerParameterName][NotNull] string parameterName) - { - if (value == null) - { - throw new ArgumentNullException(parameterName); - } - - return value; - } - - [ContractAnnotation("value:null => halt")] - public static T NotNull( - T value, - [InvokerParameterName][NotNull] string parameterName, - string message) - { - if (value == null) - { - throw new ArgumentNullException(parameterName, message); - } - - return value; - } - - [ContractAnnotation("value:null => halt")] - public static string NotNull( - string value, - [InvokerParameterName][NotNull] string parameterName, - int maxLength = int.MaxValue, - int minLength = 0) - { - if (value == null) - { - throw new ArgumentException($"{parameterName} can not be null!", parameterName); - } - - if (value.Length > maxLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); - } - - if (minLength > 0 && value.Length < minLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); - } - - return value; - } - - [ContractAnnotation("value:null => halt")] - public static string NotNullOrWhiteSpace( - string value, - [InvokerParameterName][NotNull] string parameterName, - int maxLength = int.MaxValue, - int minLength = 0) - { - if (string.IsNullOrWhiteSpace(value)) - { - throw new ArgumentException($"{parameterName} can not be null, empty or white space!", parameterName); - } - - if (value.Length > maxLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); - } - - if (minLength > 0 && value.Length < minLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); - } - - return value; - } - - [ContractAnnotation("value:null => halt")] - public static string NotNullOrEmpty( - string value, - [InvokerParameterName][NotNull] string parameterName, - int maxLength = int.MaxValue, - int minLength = 0) - { - if (value.IsNullOrEmpty()) - { - throw new ArgumentException($"{parameterName} can not be null or empty!", parameterName); - } - - if (value.Length > maxLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); - } - - if (minLength > 0 && value.Length < minLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); - } - - return value; - } - - [ContractAnnotation("value:null => halt")] - public static ICollection NotNullOrEmpty(ICollection value, [InvokerParameterName][NotNull] string parameterName) - { - if (value == null || value.Count <= 0) - { - throw new ArgumentException(parameterName + " can not be null or empty!", parameterName); - } - - return value; - } - - [ContractAnnotation("type:null => halt")] - public static Type AssignableTo( - Type type, - [InvokerParameterName][NotNull] string parameterName) - { - NotNull(type, parameterName); - - if (!type.IsAssignableTo()) - { - throw new ArgumentException($"{parameterName} (type of {type.AssemblyQualifiedName}) should be assignable to the {typeof(TBaseType).GetFullNameWithAssemblyName()}!"); - } - - return type; - } - - public static string Length( - [CanBeNull] string value, - [InvokerParameterName][NotNull] string parameterName, - int maxLength, - int minLength = 0) - { - if (minLength > 0) - { - if (string.IsNullOrEmpty(value)) - { - throw new ArgumentException(parameterName + " can not be null or empty!", parameterName); - } - - if (value.Length < minLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); - } - } - - if (value != null && value.Length > maxLength) - { - throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); - } - - return value; - } -} diff --git a/Tiobon.Core.Common/Extensions/DictionaryExtensions.cs b/Tiobon.Core.Common/Extensions/DictionaryExtensions.cs deleted file mode 100644 index 4b92c87c..00000000 --- a/Tiobon.Core.Common/Extensions/DictionaryExtensions.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Tiobon.Core.Common.Extensions; - -public static class DictionaryExtensions -{ - public static void TryAdd(this IDictionary> dic, TKey key, TValue value) - { - if (dic.TryGetValue(key, out var old)) - { - old.Add(value); - } - else - { - dic.Add(key, new List {value}); - } - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/ExpressionCombiner.cs b/Tiobon.Core.Common/Extensions/ExpressionCombiner.cs deleted file mode 100644 index c5eab14f..00000000 --- a/Tiobon.Core.Common/Extensions/ExpressionCombiner.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Linq.Expressions; - -namespace Tiobon.Core.Common.Helper; - -public static class ExpressionCombiner -{ - public static Expression> Combine(Expression> expression1, Expression> expression2) - { - if (expression1 == null && expression2 == null) - { - return null; - } - - if (expression1 == null) - { - return expression2; - } - - if (expression2 == null) - { - return expression1; - } - - var parameter = Expression.Parameter(typeof(T)); - - var leftVisitor = new ReplaceExpressionVisitor(expression1.Parameters[0], parameter); - var left = leftVisitor.Visit(expression1.Body); - - var rightVisitor = new ReplaceExpressionVisitor(expression2.Parameters[0], parameter); - var right = rightVisitor.Visit(expression2.Body); - - return Expression.Lambda>(Expression.AndAlso(left, right), parameter); - } - - class ReplaceExpressionVisitor : ExpressionVisitor - { - private readonly Expression _oldValue; - private readonly Expression _newValue; - - public ReplaceExpressionVisitor(Expression oldValue, Expression newValue) - { - _oldValue = oldValue; - _newValue = newValue; - } - - public override Expression Visit(Expression node) - { - if (node == _oldValue) - { - return _newValue; - } - - return base.Visit(node); - } - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/ExpressionExtensions.cs b/Tiobon.Core.Common/Extensions/ExpressionExtensions.cs deleted file mode 100644 index fe00f4e4..00000000 --- a/Tiobon.Core.Common/Extensions/ExpressionExtensions.cs +++ /dev/null @@ -1,211 +0,0 @@ -using Microsoft.AspNetCore.Http; -using System.Linq.Expressions; -using Tiobon.Core.Caches; - -namespace Tiobon.Core.Common.Helper; - -/// -/// Linq扩展 -/// -public static class ExpressionExtensions -{ - #region HttpContext - - /// - /// 返回请求上下文 - /// - /// - /// - /// - /// - /// - public static async Task Cof_SendResponse(this HttpContext context, System.Net.HttpStatusCode code, string message, - string ContentType = "text/html;charset=utf-8") - { - context.Response.StatusCode = (int) code; - context.Response.ContentType = ContentType; - await context.Response.WriteAsync(message); - } - - #endregion - - #region ICaching - - /// - /// 从缓存里取数据,如果不存在则执行查询方法, - /// - /// 类型 - /// ICaching - /// 键值 - /// 查询方法 - /// 有效期 单位分钟/param> - /// - public static T Cof_GetICaching(this ICaching cache, string key, Func GetFun, int timeSpanMin) where T : class - { - var obj = cache.Get(key); - if (obj == null) - { - obj = GetFun(); - cache.Set(key, obj, TimeSpan.FromMinutes(timeSpanMin)); - } - - return obj; - } - - /// - /// 异步从缓存里取数据,如果不存在则执行查询方法 - /// - /// 类型 - /// ICaching - /// 键值 - /// 查询方法 - /// 有效期 单位分钟/param> - /// - public static async Task Cof_AsyncGetICaching(this ICaching cache, string key, Func> GetFun, int timeSpanMin) where T : class - { - var obj = await cache.GetAsync(key); - if (obj == null) - { - obj = await GetFun(); - cache.Set(key, obj, TimeSpan.FromMinutes(timeSpanMin)); - } - - return obj; - } - - #endregion - - #region 常用扩展方法 - - public static bool Cof_CheckAvailable(this IEnumerable Tlist) - { - return Tlist != null && Tlist.Count() > 0; - } - - /// - /// 调用内部方法 - /// - public static Expression Call(this Expression instance, string methodName, params Expression[] arguments) - { - if (instance.Type == typeof(string)) - return Expression.Call(instance, instance.Type.GetMethod(methodName, new Type[] {typeof(string)}), - arguments); //修复string contains 出现的问题 Ambiguous match found. - else - return Expression.Call(instance, instance.Type.GetMethod(methodName), arguments); - } - - /// - /// 获取内部成员 - /// - public static Expression Property(this Expression expression, string propertyName) - { - // Todo:左边条件如果是dynamic, - // 则Expression.Property无法获取子内容 - // 报错在这里,由于expression内的对象为Object,所以无法解析到 - // var x = (expression as IQueryable).ElementType; - var exp = Expression.Property(expression, propertyName); - if (exp.Type.IsGenericType && exp.Type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - return Expression.Convert(exp, exp.Type.GetGenericArguments()[0]); - } - - return exp; - } - - /// - /// 转Lambda - /// - public static Expression ToLambda(this Expression body, - params ParameterExpression[] parameters) - { - return Expression.Lambda(body, parameters); - } - - #endregion - - #region 常用运算符 [ > , >= , == , < , <= , != , || , && ] - - /// - /// && - /// - public static Expression AndAlso(this Expression left, Expression right) - { - return Expression.AndAlso(left, right); - } - - /// - /// || - /// - public static Expression OrElse(this Expression left, Expression right) - { - return Expression.OrElse(left, right); - } - - /// - /// Contains - /// - public static Expression Contains(this Expression left, Expression right) - { - return left.Call("Contains", right); - } - - public static Expression StartContains(this Expression left, Expression right) - { - return left.Call("StartsWith", right); - } - - public static Expression EndContains(this Expression left, Expression right) - { - return left.Call("EndsWith", right); - } - - /// - /// > - /// - public static Expression GreaterThan(this Expression left, Expression right) - { - return Expression.GreaterThan(left, right); - } - - /// - /// >= - /// - public static Expression GreaterThanOrEqual(this Expression left, Expression right) - { - return Expression.GreaterThanOrEqual(left, right); - } - - /// - /// < - /// - public static Expression LessThan(this Expression left, Expression right) - { - return Expression.LessThan(left, right); - } - - /// - /// <= - /// - public static Expression LessThanOrEqual(this Expression left, Expression right) - { - return Expression.LessThanOrEqual(left, right); - } - - /// - /// == - /// - public static Expression Equal(this Expression left, Expression right) - { - return Expression.Equal(left, right); - } - - /// - /// != - /// - public static Expression NotEqual(this Expression left, Expression right) - { - return Expression.NotEqual(left, right); - } - - #endregion -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/ExpressionExtensions_Nacos.cs b/Tiobon.Core.Common/Extensions/ExpressionExtensions_Nacos.cs deleted file mode 100644 index 492fa81d..00000000 --- a/Tiobon.Core.Common/Extensions/ExpressionExtensions_Nacos.cs +++ /dev/null @@ -1,143 +0,0 @@ -namespace Tiobon.Core.Common.Helper; - -/// -/// Linq扩展 -/// -public static class ExpressionExtensions_Nacos -{ - //#region Nacos NamingService - - //private static string GetServiceUrl(Nacos.V2.INacosNamingService serv, string ServiceName, string Group, - // string apiurl) - //{ - // try - // { - // var instance = serv.SelectOneHealthyInstance(ServiceName, Group).GetAwaiter().GetResult(); - // var host = $"{instance.Ip}:{instance.Port}"; - // if (instance.Metadata.ContainsKey("endpoint")) host = instance.Metadata["endpoint"]; - - - // var baseUrl = instance.Metadata.TryGetValue("secure", out _) - // ? $"https://{host}" - // : $"http://{host}"; - - // if (string.IsNullOrWhiteSpace(baseUrl)) - // { - // return ""; - // } - - // return $"{baseUrl}{apiurl}"; - // } - // catch (Exception e) - // { - // Console.WriteLine(e.Message); - // } - - // return ""; - //} - - //public static async Task Cof_NaoceGet(this Nacos.V2.INacosNamingService serv, string ServiceName, - // string Group, string apiurl, Dictionary Parameters = null) - //{ - // try - // { - // var url = GetServiceUrl(serv, ServiceName, Group, apiurl); - // if (string.IsNullOrEmpty(url)) return ""; - // if (Parameters != null && Parameters.Any()) - // { - // StringBuilder sb = new StringBuilder(); - // foreach (var pitem in Parameters) - // { - // sb.Append($"{pitem.Key}={pitem.Value}&"); - // } - - // url = $"{url}?{sb.ToString().Trim('&')}"; - // } - - // HttpHelper.Httpclient.DefaultRequestHeaders.Accept.Add( - // new MediaTypeWithQualityHeaderValue("application/json")); - // var result = await HttpHelper.Httpclient.GetAsync(url); - // return await result.Content.ReadAsStringAsync(); - // } - // catch (Exception e) - // { - // Console.WriteLine(e.Message); - // } - - // return ""; - //} - - //public static async Task Cof_NaocePostForm(this Nacos.V2.INacosNamingService serv, string ServiceName, - // string Group, string apiurl, Dictionary Parameters) - //{ - // try - // { - // var url = GetServiceUrl(serv, ServiceName, Group, apiurl); - // if (string.IsNullOrEmpty(url)) return ""; - - // var content = (Parameters != null && Parameters.Any()) ? new FormUrlEncodedContent(Parameters) : null; - // HttpHelper.Httpclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - // var result = await HttpHelper.Httpclient.PostAsync(url, content); - // return await result.Content.ReadAsStringAsync(); //.GetAwaiter().GetResult(); - // } - // catch (Exception e) - // { - // Console.WriteLine(e.Message); - // } - - // return ""; - //} - - //public static async Task Cof_NaocePostJson(this Nacos.V2.INacosNamingService serv, string ServiceName, - // string Group, string apiurl, string jSonData) - //{ - // try - // { - // var url = GetServiceUrl(serv, ServiceName, Group, apiurl); - // if (string.IsNullOrEmpty(url)) return ""; - // HttpHelper.Httpclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - // var result = - // await HttpHelper.Httpclient.PostAsync(url, new StringContent(jSonData, Encoding.UTF8, "application/json")); - // return await result.Content.ReadAsStringAsync(); //.GetAwaiter().GetResult(); - - // //httpClient.BaseAddress = new Uri("https://www.testapi.com"); - // //httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - // //httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); - // } - // catch (Exception e) - // { - // Console.WriteLine(e.Message); - // } - - // return ""; - //} - - //public static async Task Cof_NaocePostFile(this Nacos.V2.INacosNamingService serv, string ServiceName, - // string Group, string apiurl, Dictionary Parameters) - //{ - // try - // { - // var url = GetServiceUrl(serv, ServiceName, Group, apiurl); - // if (string.IsNullOrEmpty(url)) return ""; - - // var content = new MultipartFormDataContent(); - // foreach (var pitem in Parameters) - // { - // content.Add(new ByteArrayContent(pitem.Value), "files", pitem.Key); - // } - - // HttpHelper.Httpclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - // var result = await HttpHelper.Httpclient.PostAsync(url, content); - // return await result.Content.ReadAsStringAsync(); //.GetAwaiter().GetResult(); - // } - // catch (Exception e) - // { - // //InfluxdbHelper.GetInstance().AddLog("Cof_NaocePostFile.Err", ee); - // Console.WriteLine(e.Message); - // } - - // return ""; - //} - - //#endregion -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/Extention.Expression.cs b/Tiobon.Core.Common/Extensions/Extention.Expression.cs deleted file mode 100644 index 9329bbd4..00000000 --- a/Tiobon.Core.Common/Extensions/Extention.Expression.cs +++ /dev/null @@ -1,383 +0,0 @@ -using System.Linq.Expressions; -using System.Reflection; - -namespace Tiobon.Core.Common.Extensions; - -public static partial class Extention -{ - #region 拓展BuildExtendSelectExpre方法 - - /// - /// 组合继承属性选择表达式树,无拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,1个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,2个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,3个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,4个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 拓展类型4 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,5个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 拓展类型4 - /// 拓展类型5 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,6个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 拓展类型4 - /// 拓展类型5 - /// 拓展类型6 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,7个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 拓展类型4 - /// 拓展类型5 - /// 拓展类型6 - /// 拓展类型7 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,8个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 拓展类型4 - /// 拓展类型5 - /// 拓展类型6 - /// 拓展类型7 - /// 拓展类型8 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - /// - /// 组合继承属性选择表达式树,9个拓展参数 - /// TResult将继承TBase的所有属性 - /// - /// 原数据类型 - /// 拓展类型1 - /// 拓展类型2 - /// 拓展类型3 - /// 拓展类型4 - /// 拓展类型5 - /// 拓展类型6 - /// 拓展类型7 - /// 拓展类型8 - /// 拓展类型9 - /// 返回类型 - /// 拓展表达式 - /// - public static Expression> BuildExtendSelectExpre(this Expression> expression) where TResult : TBase - { - return GetExtendSelectExpre>(expression); - } - - #endregion - - #region 拓展And和Or方法 - - /// - /// 连接表达式与运算 - /// - /// 参数 - /// 原表达式 - /// 新的表达式 - /// - public static Expression> And(this Expression> one, Expression> another) - { - //创建新参数 - var newParameter = Expression.Parameter(typeof(T), "parameter"); - - var parameterReplacer = new ParameterReplaceVisitor(newParameter); - var left = parameterReplacer.Visit(one.Body); - var right = parameterReplacer.Visit(another.Body); - var body = Expression.AndAlso(left, right); - - return Expression.Lambda>(body, newParameter); - } - - /// - /// 连接表达式或运算 - /// - /// 参数 - /// 原表达式 - /// 新表达式 - /// - public static Expression> Or(this Expression> one, Expression> another) - { - //创建新参数 - var newParameter = Expression.Parameter(typeof(T), "parameter"); - - var parameterReplacer = new ParameterReplaceVisitor(newParameter); - var left = parameterReplacer.Visit(one.Body); - var right = parameterReplacer.Visit(another.Body); - var body = Expression.Or(left, right); - - return Expression.Lambda>(body, newParameter); - } - - #endregion - - #region 拓展Expression的Invoke方法 - - public static TResult Invoke(this Expression> expression) - { - return expression.Compile().Invoke(); - } - - public static TResult Invoke(this Expression> expression, T1 arg1) - { - return expression.Compile().Invoke(arg1); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2) - { - return expression.Compile().Invoke(arg1, arg2); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3) - { - return expression.Compile().Invoke(arg1, arg2, arg3); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); - } - - public static TResult Invoke(this Expression> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10) - { - return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10); - } - - #endregion - - /// - /// 获取表达式中的固定值 - /// - /// 表达式 - /// - public static object GetConstantValue(this Expression expression) - { - var visitor = new GetConstantValueVisitor(); - visitor.Visit(expression); - return visitor.ConstantValue; - } - - public static object GetMemberValue(this Expression expression) - { - var visitor = new GetMemberValueVisitor(); - visitor.Visit(expression); - return visitor.Value; - } - - #region 私有成员 - - private static Expression GetExtendSelectExpre(Expression expression) - { - NewExpression newBody = Expression.New(typeof(TResult)); - MemberInitExpression oldExpression = (MemberInitExpression)expression.Body; - - ParameterExpression[] oldParamters = expression.Parameters.ToArray(); - List existsProperties = new List(); - foreach (var aBinding in oldExpression.Bindings) - { - existsProperties.Add(aBinding.Member.Name); - } - - List newBindings = new List(); - - var ls = typeof(TResult).GetProperties().Where(x => !existsProperties.Contains(x.Name)); - foreach (var aProperty in ls) - { - if (typeof(TBase).GetMembers().Any(x => x.Name == aProperty.Name)) - { - MemberInfo newMember = typeof(TBase).GetMember(aProperty.Name)[0]; - MemberBinding newMemberBinding = Expression.Bind(newMember, Expression.Property(oldParamters[0], aProperty.Name)); - newBindings.Add(newMemberBinding); - } - } - newBindings.AddRange(oldExpression.Bindings); - - var body = Expression.MemberInit(newBody, newBindings.ToArray()); - var resExpression = Expression.Lambda(body, oldParamters); - - return resExpression; - } - - #endregion -} - -/// -/// 继承ExpressionVisitor类,实现参数替换统一 -/// -class ParameterReplaceVisitor : ExpressionVisitor -{ - public ParameterReplaceVisitor(ParameterExpression paramExpr) - { - _parameter = paramExpr; - } - - //新的表达式参数 - private ParameterExpression _parameter { get; set; } - - protected override Expression VisitParameter(ParameterExpression p) - { - if (p.Type == _parameter.Type) - return _parameter; - else - return p; - } -} - -class GetConstantValueVisitor : ExpressionVisitor -{ - public object ConstantValue { get; set; } - protected override Expression VisitConstant(ConstantExpression node) - { - ConstantValue = node.Value; - - return base.VisitConstant(node); - } -} - -class GetMemberValueVisitor : ExpressionVisitor -{ - public object Value { get; set; } - -} diff --git a/Tiobon.Core.Common/Extensions/GenericTypeExtensions.cs b/Tiobon.Core.Common/Extensions/GenericTypeExtensions.cs deleted file mode 100644 index 0aeee096..00000000 --- a/Tiobon.Core.Common/Extensions/GenericTypeExtensions.cs +++ /dev/null @@ -1,373 +0,0 @@ -using Newtonsoft.Json.Linq; -using System.Linq.Expressions; -using System.Reflection; - -namespace Tiobon.Core.Common.Extensions; - -public static class GenericTypeExtensions -{ - public static string GetGenericTypeName(this Type type) - { - var typeName = string.Empty; - - if (type.IsGenericType) - { - var genericTypes = string.Join(",", type.GetGenericArguments().Select(t => t.Name).ToArray()); - typeName = $"{type.Name.Remove(type.Name.IndexOf('`'))}<{genericTypes}>"; - } - else - { - typeName = type.Name; - } - - return typeName; - } - - public static string GetGenericTypeName(this object @object) - { - return @object.GetType().GetGenericTypeName(); - } - - /// - /// 判断类型是否实现某个泛型 - /// - /// 类型 - /// 泛型类型 - /// bool - public static bool HasImplementedRawGeneric(this Type type, Type generic) - { - // 检查接口类型 - var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType); - if (isTheRawGenericType) return true; - - // 检查类型 - while (type != null && type != typeof(object)) - { - isTheRawGenericType = IsTheRawGenericType(type); - if (isTheRawGenericType) return true; - type = type.BaseType; - } - - return false; - - // 判断逻辑 - bool IsTheRawGenericType(Type t) => generic == (t.IsGenericType ? t.GetGenericTypeDefinition() : t); - } - - /// - /// 复制 的副本 - /// - /// - /// - /// - /// - /// - public static T Clone(T source) - where T : class - { - var text = System.Text.Json.JsonSerializer.Serialize(source, typeof(T)); - return System.Text.Json.JsonSerializer.Deserialize(text); - } - - public static TTarget CloneTo(this object source, params object[] args) - where TTarget : class - { - var target = (TTarget)Activator.CreateInstance(typeof(TTarget), args); - - return target.CopyFrom(source); - } - - /// - /// 将 的值复制到 , - /// 仅复制同名的属性或字段 - /// - /// - /// - /// - /// - /// - public static TTarget CopyFrom(this TTarget target, TSource source) - where TTarget : class - where TSource : class - { - foreach (var member in source.GetType().GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) - { - switch (member) - { - case PropertyInfo property: - target.PrivateSet(member.Name, property.GetValue(source)); - break; - case FieldInfo field: - target.PrivateSet(member.Name, field.GetValue(source)); - break; - default: - break; - } - } - return target; - } - - /// - /// 为对象的指定属性或字段赋值 - /// - /// - /// 对象 - /// 属性或字段名称 - /// 值 - /// 当前对象 - public static T PrivateSet(this T source, string name, object value) where T : class - { - if (source != null && !string.IsNullOrEmpty(name)) - { - Type t = typeof(T); - var members = t.GetMember(name, MemberTypes.Property | MemberTypes.Field, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); - foreach (var member in members) - { - switch (member) - { - case PropertyInfo property: - property.SetValue(source, value); - break; - case FieldInfo field: - field.SetValue(source, value); - break; - default: - break; - } - } - } - return source; - } - - /// - /// 为对象的指定属性或字段赋值 - /// - /// - /// - /// 对象 - /// 选择了某个属性或字段的表达式 - /// 值 - /// 当前对象 - public static T PrivateSet(this T source, Expression> expression, TKey value) where T : class - { - if (source != null && expression != null) - { - if (expression.Body is MemberExpression m && m.Member != null) - { - switch (m.Member) - { - case PropertyInfo property: - property.SetValue(source, value); - break; - case FieldInfo field: - field.SetValue(source, value); - break; - default: - break; - } - } - } - return source; - } - - /// - /// 是否为NULL - /// - /// - /// - /// - public static bool IsNull(this T entity) where T : class - { - return entity == null; - } - - /// - /// 获取 类型的值 - /// - /// - /// - /// - /// - public static TKey GetValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return default; - return (TKey)entity.GetType().GetProperty(field).GetValue(entity); - } - - /// - /// 获取object类型值 - /// - /// - /// - /// - /// - public static object GetValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return null; - return typeof(T).GetProperties().FirstOrDefault(p => p.Name == field)?.GetValue(entity, null); - } - - /// - /// 获取string类型值 - /// - /// - /// - /// - /// - public static string GetStringValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return null; - var value = entity.GetValueFromField(field); - return value == null ? string.Empty : value.ToString(); - } - - /// - /// 获取JObject类型值 - /// - /// - /// - /// - /// - public static JObject GetJsonValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return null; - var value = entity.GetValueFromField(field); - return value == null ? null : Newtonsoft.Json.JsonConvert.DeserializeObject(value.ToString()); - } - - /// - /// 获取int类型值 - /// - /// - /// - /// - /// - public static int GetIntValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return 0; - var value = entity.GetValueFromField(field); - return value == null ? 0 : int.Parse(value.ToString()); - } - - /// - /// 获取double类型值 - /// - /// - /// - /// - /// - public static double GetDoubleValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return 0; - var value = entity.GetValueFromField(field); - return value == null ? 0 : double.Parse(value.ToString()); - } - - /// - /// 获取DateTime类型值 - /// - /// - /// - /// - /// - public static DateTime GetDateTimeValueFromFieldNotNull(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - return DateTime.MaxValue; - var value = entity.GetValueFromField(field); - if (value == null || string.IsNullOrEmpty(value.ToString())) - return DateTime.MaxValue; - return DateTime.Parse(value.ToString()); - } - - /// - /// 获取DateTime?类型值 - /// - /// - /// - /// - /// - public static DateTime? GetDateTimeValueFromField(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - { - return null; - } - var value = entity.GetValueFromField(field); - if (value == null || string.IsNullOrEmpty(value.ToString())) - return null; - return DateTime.Parse(value.ToString()); - } - - /// - /// 判断是否为DateTime类型 - /// - /// - /// - /// - /// - public static bool FieldTypeIsDateTime(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - { - return false; - } - var t = typeof(T).GetProperties().FirstOrDefault(p => p.Name == field).PropertyType; - return t == typeof(DateTime) || t == typeof(DateTime?); - } - - /// - /// 判断是否为数值类型 - /// - /// - /// - /// - /// - public static bool FieldTypeIsNumber(this T entity, string field) where T : class - { - if (!entity.HasField(field)) - { - return false; - } - var t = typeof(T).GetProperties().FirstOrDefault(p => p.Name == field).PropertyType; - return t == typeof(int) || t == typeof(int?) - || t == typeof(double) || t == typeof(double?) - || t == typeof(decimal) || t == typeof(decimal?) - || t == typeof(long) || t == typeof(long?) - || t == typeof(float) || t == typeof(float?); - } - - /// - /// 赋值 - /// - /// - /// - /// - /// - public static void SetValueForField(this T entity, string field, object value) where T : class - { - if (!entity.HasField(field)) - { - return; - } - typeof(T).GetProperties().FirstOrDefault(p => p.Name == field).SetValue(entity, value); - } - - /// - /// 是否包含该字段 - /// - /// - /// - /// - /// - public static bool HasField(this T entity, string field) where T : class - { - return typeof(T).GetProperties().Any(p => p.Name == field); - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/HttpRequestExtension.cs b/Tiobon.Core.Common/Extensions/HttpRequestExtension.cs deleted file mode 100644 index 8a09b0b8..00000000 --- a/Tiobon.Core.Common/Extensions/HttpRequestExtension.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.AspNetCore.Http; -using System.Text; - -namespace Tiobon.Core.Common.Extensions; - -public static class HttpRequestExtension -{ - public static string GetRequestBody(this HttpRequest request) - { - if (!request.Body.CanRead) - { - return default; - } - - if (!request.Body.CanSeek) - { - return default; - } - - if (request.Body.Length < 1) - { - return default; - } - - var bodyStr = ""; - // 启用倒带功能,就可以让 Request.Body 可以再次读取 - request.Body.Seek(0, SeekOrigin.Begin); - using (StreamReader reader - = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true)) - { - bodyStr = reader.ReadToEnd(); - } - - request.Body.Position = 0; - return bodyStr; - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/IQueryableExtensions.cs b/Tiobon.Core.Common/Extensions/IQueryableExtensions.cs deleted file mode 100644 index 6c8c3e7c..00000000 --- a/Tiobon.Core.Common/Extensions/IQueryableExtensions.cs +++ /dev/null @@ -1,423 +0,0 @@ -using OfficeOpenXml; -using OfficeOpenXml.Style; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Reflection; -using Tiobon.Core.Common.Helper; - -namespace Tiobon.Core.Common.Extensions; - -public static class IQueryableExtensions -{ - static int EXPORT_FILE_PAGESIZE = 10000; - /// - /// IQueryable数据写入文件(Excel) - /// - /// - /// - /// - /// - /// - /// - /// - /// - public static void IntoFileFromLinqExcel(this IQueryable db, string fname, string splitstr, List exportFields, Dictionary exportDicFields = null, List exportFieldsWidth = null, string headText = "", string totalText = "", bool isNeedItemNo = false) where T : class - { - if (db.IsNull()) - return; - //查询文件状态 - if (File.Exists(fname)) - { - LoggerHelper.SendLog("文件已生成 " + fname); - return; - } - LoggerHelper.SendLog("正在生成文件 " + fname); - DateTime dt_start = DateTime.Now; - if (!File.Exists(fname)) - File.Create(fname).Close(); - //获取需要导出的字段 - Dictionary fieldDescs = GetFieldDesc(); - - fieldDescs = exportDicFields; - int dbCount = db.Count(); - ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.Commercial; - //列名排序,返回有序列表 - var (fields, colunms) = Sort(fieldDescs, exportFields); - using (FileStream stream = File.Create(fname)) - { - using (ExcelPackage package = new ExcelPackage(stream)) - { - ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet1"); - - - var colunmsCount = colunms.Count; - - var startCol = 0; - var startRow = 1; // 初始行数 - if (isNeedItemNo) - startCol = 1; - - - if (!string.IsNullOrEmpty(headText)) - { - worksheet.Cells[startRow, 1].Value = headText; - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Merge = true; - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.Font.Bold = true; - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; // Alignment is center - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.Font.Size = 14; - startRow++; - } - - if (isNeedItemNo) - { - worksheet.Cells[startRow, 1].Value = "序号"; - worksheet.Cells[startRow, 1, startRow, 1].Style.Font.Bold = true; - worksheet.Cells[startRow, 1, startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[startRow, 1, startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - - //写入列名 - for (int i = 0; i < fields.Count; ++i) - { - worksheet.Cells[startRow, i + 1 + startCol].Value = fields[i]; - worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.Font.Bold = true; - worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - - startRow++; - - //查看数据是否过大,需要分页 - int totalPageNum = (dbCount + EXPORT_FILE_PAGESIZE - 1) / EXPORT_FILE_PAGESIZE; - //遍历每一页 - for (int pageNum = 0; pageNum < totalPageNum; ++pageNum) - { - var list = db.Skip(pageNum * EXPORT_FILE_PAGESIZE).Take(EXPORT_FILE_PAGESIZE).ToList(); - //遍历每行 - for (int row = 0; row < list.Count; ++row) - { - if (isNeedItemNo) - { - worksheet.Cells[row + startRow, 1].Value = row + 1; - worksheet.Cells[row + startRow, 1, row + startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[row + startRow, 1, row + startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - //遍历需要写入文件的字段 - for (int i = 0; i < colunms.Count; ++i) - { - worksheet.Cells[row + startRow, i + 1 + startCol].Value = ConvertData2String(list[row], colunms[i]); - worksheet.Cells[row + startRow, i + 1 + startCol, row + startRow, i + 1 + startCol].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[row + startRow, i + 1 + startCol, row + startRow, i + 1 + startCol].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - } - } - - if (!string.IsNullOrEmpty(totalText)) - { - worksheet.Cells[dbCount + startRow, 1].Value = "总计:"; - worksheet.Cells[dbCount + startRow, 1, dbCount + startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[dbCount + startRow, 1, dbCount + startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - - worksheet.Cells[dbCount + startRow, 2, dbCount + startRow, colunms.Count + startCol].Value = totalText; - worksheet.Cells[dbCount + startRow, 2, dbCount + startRow, colunms.Count + startCol].Merge = true; - startRow++; - } - - using (ExcelRange r = worksheet.Cells[1, 1, dbCount + startRow - 1, fields.Count + startCol]) - { - r.Style.Border.Top.Style = ExcelBorderStyle.Thin; - r.Style.Border.Left.Style = ExcelBorderStyle.Thin; - r.Style.Border.Right.Style = ExcelBorderStyle.Thin; - r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; - - r.Style.Border.Top.Color.SetColor(Color.Black); - r.Style.Border.Left.Color.SetColor(Color.Black); - r.Style.Border.Right.Color.SetColor(Color.Black); - r.Style.Border.Bottom.Color.SetColor(Color.Black); - } - if (isNeedItemNo) - { - worksheet.Column(1).Width = 20;//设置列宽为默认值 - } - //设置列宽 - if (exportFieldsWidth == null || exportFieldsWidth.Count < fields.Count) - { - for (int i = 0; i < fields.Count; ++i) - { - worksheet.Column(i + 1 + startCol).Width = 20;//设置列宽为默认值 - } - } - else - { - for (int i = 0; i < fields.Count; ++i) - { - worksheet.Column(i + 1 + startCol).Width = exportFieldsWidth[i];//设置列宽为前段配置的值 - } - } - - package.Workbook.Properties.Title = "数据导出"; - package.Workbook.Properties.Author = "SUZHOUEU"; - package.Workbook.Properties.Comments = "苏州一优信息技术有限公司提供技术支持!"; - - package.Workbook.Properties.Company = "苏州一优信息技术有限公司"; - - package.Workbook.Properties.SetCustomPropertyValue("Checked by", "SimonHsiao"); - package.Workbook.Properties.SetCustomPropertyValue("AssemblyName", "SUZHOUEU"); - - package.Save(); - - } - } - LoggerHelper.SendLog("生成文件 " + fname + " 完毕 " + dbCount + " 耗时 " + (int)(DateTime.Now - dt_start).TotalSeconds); - } - public static void IntoFileFromLinqExcel(this DataTable db, string fname, string splitstr, Dictionary fieldDescs, List exportFieldsWidth, string headText = "", string totalText = "", bool isNeedItemNo = false) - { - if (db.IsNull()) - return; - //查询文件状态 - if (File.Exists(fname)) - { - LoggerHelper.SendLog("文件已生成 " + fname); - return; - } - LoggerHelper.SendLog("正在生成文件 " + fname); - DateTime dt_start = DateTime.Now; - if (!File.Exists(fname)) - File.Create(fname).Close(); - //获取需要导出的字段 - int dbCount = db.Rows.Count; - - //列名排序,返回有序列表 - var (fields, colunms) = Sort(fieldDescs, null); - using (FileStream stream = File.Create(fname)) - { - using (ExcelPackage package = new ExcelPackage(stream)) - { - ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet1"); - - - var colunmsCount = colunms.Count; - - var startCol = 0; - var startRow = 1; // 初始行数 - if (isNeedItemNo) - startCol = 1; - - - if (!string.IsNullOrEmpty(headText)) - { - worksheet.Cells[startRow, 1].Value = headText; - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Merge = true; - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.Font.Bold = true; - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; // Alignment is center - worksheet.Cells[startRow, 1, 1, colunmsCount + startCol].Style.Font.Size = 14; - startRow++; - } - - if (isNeedItemNo) - { - worksheet.Cells[startRow, 1].Value = "序号"; - worksheet.Cells[startRow, 1, startRow, 1].Style.Font.Bold = true; - worksheet.Cells[startRow, 1, startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[startRow, 1, startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - - //写入列名 - for (int i = 0; i < fields.Count; ++i) - { - worksheet.Cells[startRow, i + 1 + startCol].Value = fields[i]; - worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.Font.Bold = true; - worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[startRow, i + 1 + startCol, startRow, i + 1 + startCol].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - startRow++; - - for (int row = 0; row < dbCount; ++row) - { - if (isNeedItemNo) - { - worksheet.Cells[row + startRow, 1].Value = row + 1; - worksheet.Cells[row + startRow, 1, row + startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[row + startRow, 1, row + startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - //遍历需要写入文件的字段 - for (int i = 0; i < colunms.Count; ++i) - { - worksheet.Cells[row + startRow, i + 1 + startCol].Value = db.Rows[row][colunms[i]].ToString(); - worksheet.Cells[row + startRow, i + 1 + startCol, row + startRow, i + 1 + startCol].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[row + startRow, i + 1 + startCol, row + startRow, i + 1 + startCol].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - } - } - - if (!string.IsNullOrEmpty(totalText)) - { - worksheet.Cells[dbCount + startRow, 1].Value = "总计:"; - worksheet.Cells[dbCount + startRow, 1, dbCount + startRow, 1].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; - worksheet.Cells[dbCount + startRow, 1, dbCount + startRow, 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; - - worksheet.Cells[dbCount + startRow, 2, dbCount + startRow, colunms.Count + startCol].Value = totalText; - worksheet.Cells[dbCount + startRow, 2, dbCount + startRow, colunms.Count + startCol].Merge = true; - startRow++; - } - - using (ExcelRange r = worksheet.Cells[1, 1, dbCount + startRow - 1, fields.Count + startCol]) - { - r.Style.Border.Top.Style = ExcelBorderStyle.Thin; - r.Style.Border.Left.Style = ExcelBorderStyle.Thin; - r.Style.Border.Right.Style = ExcelBorderStyle.Thin; - r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin; - - r.Style.Border.Top.Color.SetColor(Color.Black); - r.Style.Border.Left.Color.SetColor(Color.Black); - r.Style.Border.Right.Color.SetColor(Color.Black); - r.Style.Border.Bottom.Color.SetColor(Color.Black); - } - if (isNeedItemNo) - { - worksheet.Column(1).Width = 20;//设置列宽为默认值 - } - //设置列宽 - if (exportFieldsWidth == null || exportFieldsWidth.Count < fields.Count) - { - for (int i = 0; i < fields.Count; ++i) - { - worksheet.Column(i + 1 + startCol).Width = 20;//设置列宽为默认值 - } - } - else - { - for (int i = 0; i < fields.Count; ++i) - { - worksheet.Column(i + 1 + startCol).Width = exportFieldsWidth[i];//设置列宽为前段配置的值 - } - } - - package.Workbook.Properties.Title = "数据导出"; - package.Workbook.Properties.Author = "SUZHOUEU"; - package.Workbook.Properties.Comments = "苏州一优信息技术有限公司提供技术支持!"; - - package.Workbook.Properties.Company = "苏州一优信息技术有限公司"; - - package.Workbook.Properties.SetCustomPropertyValue("Checked by", "SimonHsiao"); - package.Workbook.Properties.SetCustomPropertyValue("AssemblyName", "SUZHOUEU"); - - package.Save(); - - } - } - LoggerHelper.SendLog("生成文件 " + fname + " 完毕 " + dbCount + " 耗时 " + (int)(DateTime.Now - dt_start).TotalSeconds); - } - private static string ConvertData2String(T t, string field) where T : class - { - if (t.FieldTypeIsDateTime(field)) - { - DateTime? time = t.GetDateTimeValueFromField(field); - if (time != null) - { - if (time.Value.ToString("HH:mm:ss") == "00:00:00") - { - return time.Value.ToString("yyyy-MM-dd"); - } - else - { - return time.Value.ToString("yyyy-MM-dd HH:mm:ss"); - } - } - else - { - return string.Empty; - } - } - else - { - return t.GetStringValueFromField(field); - } - } - /// - /// 列名按照前端显示顺序导出 - /// - /// - /// - /// - public static (List, List) Sort(Dictionary columns, List ExportFields) - { - List fields = new List(); - List colunms = new List(); - if (ExportFields == null || ExportFields.Count == 0) - { - return (columns.Keys.ToList(), columns.Values.ToList()); - } - - foreach (var field in ExportFields) - { - foreach (var item in columns) - { - if (item.Key == field) - { - fields.Add(item.Key); - colunms.Add(item.Value); - } - } - } - - return (fields, colunms); - } - - - #region 获取字段描述 - /// - /// 对象字段描述 - /// - private static Dictionary> m_FieldDesc = new Dictionary>(); - - /// - /// 获取字段的描述(描述 - 列名) - /// - /// - /// - public static Dictionary GetFieldDesc() - { - var type = typeof(T).ToString(); - lock (m_FieldDesc) - { - if (m_FieldDesc.ContainsKey(type)) - return m_FieldDesc[type]; - } - Dictionary dic = new Dictionary(); - try - { - PropertyInfo[] peroperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); - if (peroperties != null) - { - foreach (PropertyInfo property in peroperties) - { - object[] objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true); - if (objs.Length > 0) - { - var desc = ((DescriptionAttribute)objs[0]).Description.Trim(); - if (!dic.ContainsKey(desc)) - { - dic.Add(desc, property.Name); - } - else - { - dic[desc] = property.Name; - } - } - } - } - } - catch //(Exception ex) - { - } - lock (m_FieldDesc) - { - if (!m_FieldDesc.ContainsKey(type)) - m_FieldDesc.Add(type, dic); - } - return dic; - } - #endregion - -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/MethodInfoExtensions.cs b/Tiobon.Core.Common/Extensions/MethodInfoExtensions.cs deleted file mode 100644 index cdc9c537..00000000 --- a/Tiobon.Core.Common/Extensions/MethodInfoExtensions.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Reflection; - -namespace Tiobon.Core.Common.Extensions; - -public static class MethodInfoExtensions -{ - public static string GetFullName(this MethodInfo method) - { - if (method.DeclaringType == null) - { - return $@"{method.Name}"; - } - - return $"{method.DeclaringType.FullName}.{method.Name}"; - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Extensions/TypeExtensions.cs b/Tiobon.Core.Common/Extensions/TypeExtensions.cs deleted file mode 100644 index c83222a5..00000000 --- a/Tiobon.Core.Common/Extensions/TypeExtensions.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Tiobon.Core.Common; -using JetBrains.Annotations; - - -namespace System; - -public static class TypeExtensions -{ - public static string GetFullNameWithAssemblyName(this Type type) - { - return type.FullName + ", " + type.Assembly.GetName().Name; - } - - /// - /// Determines whether an instance of this type can be assigned to - /// an instance of the . - /// - /// Internally uses . - /// - /// Target type (as reverse). - public static bool IsAssignableTo([NotNull] this Type type) - { - Check.NotNull(type, nameof(type)); - - return type.IsAssignableTo(typeof(TTarget)); - } - - /// - /// Determines whether an instance of this type can be assigned to - /// an instance of the . - /// - /// Internally uses (as reverse). - /// - /// this type - /// Target type - public static bool IsAssignableTo([NotNull] this Type type, [NotNull] Type targetType) - { - Check.NotNull(type, nameof(type)); - Check.NotNull(targetType, nameof(targetType)); - - return targetType.IsAssignableFrom(type); - } - - /// - /// Gets all base classes of this type. - /// - /// The type to get its base classes. - /// True, to include the standard type in the returned array. - public static Type[] GetBaseClasses([NotNull] this Type type, bool includeObject = true) - { - Check.NotNull(type, nameof(type)); - - var types = new List(); - AddTypeAndBaseTypesRecursively(types, type.BaseType, includeObject); - return types.ToArray(); - } - - /// - /// Gets all base classes of this type. - /// - /// The type to get its base classes. - /// A type to stop going to the deeper base classes. This type will be be included in the returned array - /// True, to include the standard type in the returned array. - public static Type[] GetBaseClasses([NotNull] this Type type, Type stoppingType, bool includeObject = true) - { - Check.NotNull(type, nameof(type)); - - var types = new List(); - AddTypeAndBaseTypesRecursively(types, type.BaseType, includeObject, stoppingType); - return types.ToArray(); - } - - private static void AddTypeAndBaseTypesRecursively( - [NotNull] List types, - [CanBeNull] Type type, - bool includeObject, - [CanBeNull] Type stoppingType = null) - { - if (type == null || type == stoppingType) - { - return; - } - - if (!includeObject && type == typeof(object)) - { - return; - } - - AddTypeAndBaseTypesRecursively(types, type.BaseType, includeObject, stoppingType); - types.Add(type); - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Helper/Base32Helper.cs b/Tiobon.Core.Common/Helper/Base32Helper.cs deleted file mode 100644 index 90e4602e..00000000 --- a/Tiobon.Core.Common/Helper/Base32Helper.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System.Text; - -namespace DPE.Core.Common.Helper; - -public sealed class Base32Helper -{ - - // the valid chars for the encoding - private static string ValidChars = "QAZ2WSX3" + "EDC4RFV5" + "TGB6YHN7" + "UJM8K9LP"; - - /// - /// Converts an array of bytes to a Base32-k string. - /// - public static string ToString(byte[] bytes) - { - StringBuilder sb = new StringBuilder(); // holds the base32 chars - byte index; - int hi = 5; - int currentByte = 0; - - while (currentByte < bytes.Length) - { - // do we need to use the next byte? - if (hi > 8) - { - // get the last piece from the current byte, shift it to the right - // and increment the byte counter - index = (byte)(bytes[currentByte++] >> (hi - 5)); - if (currentByte != bytes.Length) - { - // if we are not at the end, get the first piece from - // the next byte, clear it and shift it to the left - index = (byte)(((byte)(bytes[currentByte] << (16 - hi)) >> 3) | index); - } - - hi -= 3; - } - else if (hi == 8) - { - index = (byte)(bytes[currentByte++] >> 3); - hi -= 3; - } - else - { - - // simply get the stuff from the current byte - index = (byte)((byte)(bytes[currentByte] << (8 - hi)) >> 3); - hi += 5; - } - - sb.Append(ValidChars[index]); - } - - return sb.ToString(); - } - - - /// - /// Converts a Base32-k string into an array of bytes. - /// - /// - /// Input string s contains invalid Base32-k characters. - /// - public static byte[] FromBase32String(string str) - { - int numBytes = str.Length * 5 / 8; - byte[] bytes = new Byte[numBytes]; - - // all UPPERCASE chars - str = str.ToUpper(); - - int bit_buffer; - int currentCharIndex; - int bits_in_buffer; - - if (str.Length < 3) - { - bytes[0] = (byte)(ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5); - return bytes; - } - - bit_buffer = (ValidChars.IndexOf(str[0]) | ValidChars.IndexOf(str[1]) << 5); - bits_in_buffer = 10; - currentCharIndex = 2; - for (int i = 0; i < bytes.Length; i++) - { - bytes[i] = (byte)bit_buffer; - bit_buffer >>= 8; - bits_in_buffer -= 8; - while (bits_in_buffer < 8 && currentCharIndex < str.Length) - { - bit_buffer |= ValidChars.IndexOf(str[currentCharIndex++]) << bits_in_buffer; - bits_in_buffer += 5; - } - } - - return bytes; - } -} diff --git a/Tiobon.Core.Common/Helper/Base64Encoder.cs b/Tiobon.Core.Common/Helper/Base64Encoder.cs deleted file mode 100644 index 391c3b63..00000000 --- a/Tiobon.Core.Common/Helper/Base64Encoder.cs +++ /dev/null @@ -1,232 +0,0 @@ -namespace Tiobon.Core.Common.Helper; - -/// -/// Base64编码类。 -/// 将byte[]类型转换成Base64编码的string类型。 -/// -public class Base64Encoder -{ - byte[] source; - int length, length2; - int blockCount; - int paddingCount; - public static Base64Encoder Encoder = new Base64Encoder(); - - public Base64Encoder() - { - } - - private void init(byte[] input) - { - source = input; - length = input.Length; - if ((length % 3) == 0) - { - paddingCount = 0; - blockCount = length / 3; - } - else - { - paddingCount = 3 - (length % 3); - blockCount = (length + paddingCount) / 3; - } - length2 = length + paddingCount; - } - - public string GetEncoded(byte[] input) - { - //初始化 - init(input); - - byte[] source2; - source2 = new byte[length2]; - - for (int x = 0; x < length2; x++) - { - if (x < length) - { - source2[x] = source[x]; - } - else - { - source2[x] = 0; - } - } - - byte b1, b2, b3; - byte temp, temp1, temp2, temp3, temp4; - byte[] buffer = new byte[blockCount * 4]; - char[] result = new char[blockCount * 4]; - for (int x = 0; x < blockCount; x++) - { - b1 = source2[x * 3]; - b2 = source2[x * 3 + 1]; - b3 = source2[x * 3 + 2]; - - temp1 = (byte)((b1 & 252) >> 2); - - temp = (byte)((b1 & 3) << 4); - temp2 = (byte)((b2 & 240) >> 4); - temp2 += temp; - - temp = (byte)((b2 & 15) << 2); - temp3 = (byte)((b3 & 192) >> 6); - temp3 += temp; - - temp4 = (byte)(b3 & 63); - - buffer[x * 4] = temp1; - buffer[x * 4 + 1] = temp2; - buffer[x * 4 + 2] = temp3; - buffer[x * 4 + 3] = temp4; - - } - - for (int x = 0; x < blockCount * 4; x++) - { - result[x] = sixbit2char(buffer[x]); - } - - - switch (paddingCount) - { - case 0: break; - case 1: result[blockCount * 4 - 1] = '='; break; - case 2: - result[blockCount * 4 - 1] = '='; - result[blockCount * 4 - 2] = '='; - break; - default: break; - } - return new string(result); - } - private char sixbit2char(byte b) - { - char[] lookupTable = new char[64]{ - 'A','B','C','D','E','F','G','H','I','J','K','L','M', - 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', - 'a','b','c','d','e','f','g','h','i','j','k','l','m', - 'n','o','p','q','r','s','t','u','v','w','x','y','z', - '0','1','2','3','4','5','6','7','8','9','+','/'}; - - if ((b >= 0) && (b <= 63)) - { - return lookupTable[(int)b]; - } - else - { - - return ' '; - } - } - -} - - -/// -/// Base64解码类 -/// 将Base64编码的string类型转换成byte[]类型 -/// -public class Base64Decoder -{ - char[] source; - int length, length2, length3; - int blockCount; - int paddingCount; - public static Base64Decoder Decoder = new Base64Decoder(); - - public Base64Decoder() - { - } - - private void init(char[] input) - { - int temp = 0; - source = input; - length = input.Length; - - for (int x = 0; x < 2; x++) - { - if (input[length - x - 1] == '=') - temp++; - } - paddingCount = temp; - - blockCount = length / 4; - length2 = blockCount * 3; - } - - public byte[] GetDecoded(string strInput) - { - //初始化 - init(strInput.ToCharArray()); - - byte[] buffer = new byte[length]; - byte[] buffer2 = new byte[length2]; - - for (int x = 0; x < length; x++) - { - buffer[x] = char2sixbit(source[x]); - } - - byte b, b1, b2, b3; - byte temp1, temp2, temp3, temp4; - - for (int x = 0; x < blockCount; x++) - { - temp1 = buffer[x * 4]; - temp2 = buffer[x * 4 + 1]; - temp3 = buffer[x * 4 + 2]; - temp4 = buffer[x * 4 + 3]; - - b = (byte)(temp1 << 2); - b1 = (byte)((temp2 & 48) >> 4); - b1 += b; - - b = (byte)((temp2 & 15) << 4); - b2 = (byte)((temp3 & 60) >> 2); - b2 += b; - - b = (byte)((temp3 & 3) << 6); - b3 = temp4; - b3 += b; - - buffer2[x * 3] = b1; - buffer2[x * 3 + 1] = b2; - buffer2[x * 3 + 2] = b3; - } - - length3 = length2 - paddingCount; - byte[] result = new byte[length3]; - - for (int x = 0; x < length3; x++) - { - result[x] = buffer2[x]; - } - - return result; - } - - private byte char2sixbit(char c) - { - char[] lookupTable = new char[64]{ - 'A','B','C','D','E','F','G','H','I','J','K','L','M','N', - 'O','P','Q','R','S','T','U','V','W','X','Y', 'Z', - 'a','b','c','d','e','f','g','h','i','j','k','l','m','n', - 'o','p','q','r','s','t','u','v','w','x','y','z', - '0','1','2','3','4','5','6','7','8','9','+','/'}; - if (c == '=') - return 0; - else - { - for (int x = 0; x < 64; x++) - { - if (lookupTable[x] == c) - return (byte)x; - } - - return 0; - } - - } -} diff --git a/Tiobon.Core.Common/Helper/DynamicLinqFactory.cs b/Tiobon.Core.Common/Helper/DynamicLinqFactory.cs deleted file mode 100644 index 2f55e422..00000000 --- a/Tiobon.Core.Common/Helper/DynamicLinqFactory.cs +++ /dev/null @@ -1,515 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Linq.Expressions; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using Mapster; -using Tiobon.Core.Common.Extensions; - -namespace Tiobon.Core.Common.Helper; - -#region 动态linq帮助类,连接符号,运算符号 - -/// -/// 动态linq工厂 -/// -public static class DynamicLinqFactory -{ - private static readonly Dictionary _operatingSystems = new Dictionary(); - public static Dictionary OperatingSystems => GetOperationSymbol(); - - private static readonly Dictionary _linkSymbols = new Dictionary(); - public static Dictionary LinkSymbols => GetLinkSymbol(); - - /// - /// 生成lambd表达式(如:CompanyID != 1 & CompanyID == 1) - /// - /// - /// - /// - public static Expression> CreateLambda(string propertyStr) - { - // 设置自定义lanbd - // 定义 lanbd 种子(p=> xxxxxx)中的 p - if (string.IsNullOrWhiteSpace(propertyStr)) - return LinqHelper.True(); //为空就返回空的表达式 - - var parameter = Expression.Parameter(typeof(TSource), "p"); - var strArr = SplitOperationSymbol(propertyStr); - - - // 第一个判断条件,固定一个判断条件作为最左边 - Expression mainExpressin = ExpressionStudio(null, strArr[0], parameter); - // 将需要放置在最左边的判断条件从列表中去除,因为已经合成到表达式最左边了 - strArr.RemoveAt(0); - - foreach (var x in strArr) - { - mainExpressin = ExpressionStudio(mainExpressin, x, parameter); - } - - return mainExpressin.ToLambda>(parameter); - } - - /// - /// 组合条件判断表达式 - /// - /// 左边的表达式 - /// - /// - /// - public static Expression ExpressionStudio(Expression left, DynamicLinqHelper dynamicLinq, ParameterExpression key) - { - Expression mainExpression = key; - - if (!dynamicLinq.Left.IsNullOrEmpty()) - { - var properties = dynamicLinq.Left.Split('.'); - - int index = 0; - foreach (var t in properties) - { - if (mainExpression.Type.HasImplementedRawGeneric(typeof(IEnumerable<>))) - { - return ExpressionStudioEnumerable(left, mainExpression, dynamicLinq.Adapt(), - properties.Skip(index).ToArray()); - } - - mainExpression = mainExpression.Property(t); - index++; - } - } - - Expression right = null; - if (dynamicLinq.IsMerge && dynamicLinq.Child.Any()) - { - right = ExpressionStudio(null, dynamicLinq.Child[0], key); - for (var i = 1; i < dynamicLinq.Child.Count; i++) - { - right = ChangeLinkSymbol(dynamicLinq.Child[i].LinkSymbol, right, ExpressionStudio(null, dynamicLinq.Child[i], key)); - } - } - else - { - right = ChangeOperationSymbol(dynamicLinq.OperationSymbol, mainExpression, dynamicLinq.Right); - } - - left = left == null - // 如果左边表达式为空,则当前的表达式就为最左边 - ? right - // 如果不为空,则将当前的表达式连接到左边 - : ChangeLinkSymbol(dynamicLinq.LinkSymbol, left, right); - return left; - } - - public static Expression ExpressionStudioEnumerable(Expression left, Expression property, DynamicLinqHelper dynamicLinq, string[] properties) - { - var realType = property.Type.GenericTypeArguments[0]; - - var parameter = Expression.Parameter(realType, "z"); - Expression mainExpression = property; - if (!properties.Any()) - { - throw new ApplicationException("条件表达式错误,属性为集合时,需要明确具体属性"); - } - - dynamicLinq.Left = string.Join(".", properties); - mainExpression = ExpressionStudio(null, dynamicLinq, parameter); - - var lambda = Expression.Lambda(mainExpression, parameter); - - mainExpression = Expression.Call(typeof(Enumerable), "Any", new[] { realType }, property, lambda); - - left = left == null - ? mainExpression - : ChangeLinkSymbol(dynamicLinq.LinkSymbol, left, mainExpression); - - return left; - } - - - public static List SplitOperationSymbol(string str) - { - var outList = new List(); - var tokens = Regex.Matches(FormatString(str), _pattern, RegexOptions.Compiled) - .Select(m => m.Groups[1].Value.Trim()) - .ToList(); - SplitOperationSymbol(tokens, outList); - return outList; - } - - private static void SplitOperationSymbol(List tokens, List outList, int start = 0, int end = 0) - { - var dys = new Stack(); - var dynamicLinqHelper = new DynamicLinqHelper(); - if (end == 0) - { - end = tokens.Count - 1; - } - - for (int i = start; i <= end; i++) - { - var token = tokens[i]; - - if (LinkSymbols.TryGetValue(token, out var symbol)) - { - if (dys.Count > 0) - { - var linqHelper = dys.Peek(); - linqHelper.Child.Add(dynamicLinqHelper); - } - else - { - outList.Add(dynamicLinqHelper); - } - - dynamicLinqHelper = new DynamicLinqHelper() - { - LinkSymbol = symbol, - }; - continue; - } - - if (OperatingSystems.TryGetValue(token.ToLower(), out var system)) - { - dynamicLinqHelper!.OperationSymbol = system; - continue; - } - - - if (dynamicLinqHelper!.OperationSymbol != OperationSymbol.In) - { - if (string.Equals(token.Trim(), "(")) - { - dynamicLinqHelper!.IsMerge = true; - dynamicLinqHelper.Child = new List(); - dys.Push(dynamicLinqHelper); - dynamicLinqHelper = new DynamicLinqHelper(); - continue; - } - - if (string.Equals(token.Trim(), ")")) - { - if (dys.Count > 1) - { - var dya = dys.Pop(); - dya.Child.Add(dynamicLinqHelper); - - dynamicLinqHelper = dya; - continue; - } - else - { - var dya = dys.Pop(); - dya.Child.Add(dynamicLinqHelper); - outList.Add(dya); - dynamicLinqHelper = null; - continue; - } - } - } - - - if (dynamicLinqHelper!.OperationSymbol is null) - { - dynamicLinqHelper.Left += token; - } - else - { - dynamicLinqHelper.Right += FormatValue(token); - } - - if (i == end) - { - outList.Add(dynamicLinqHelper); - dynamicLinqHelper = null; - } - } - } - - public static string FormatValue(string str) - { - return str.TrimStart('"').TrimEnd('"'); - // return str.TrimStart('"').TrimEnd('"').Replace(@"\""", @""""); - } - - - /// - /// 将运算枚举符号转成具体使用方法 - /// - public static Expression ChangeLinkSymbol(LinkSymbol symbol, Expression left, Expression right) - { - switch (symbol) - { - case LinkSymbol.OrElse: - return left.OrElse(right); - case LinkSymbol.AndAlso: - return left.AndAlso(right); - default: - return left; - } - } - - public static Dictionary GetOperationSymbol() - { - if (_operatingSystems.Any()) return _operatingSystems; - - var fielding = typeof(OperationSymbol).GetFields(); - foreach (var item in fielding) - { - if (item.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute attr && !attr.Name.IsNullOrEmpty()) - { - foreach (var name in attr.Name.Split(';')) - { - _operatingSystems.Add(name.ToLower(), (OperationSymbol)item.GetValue(null)); - } - } - } - - return _operatingSystems; - } - - public static Dictionary GetLinkSymbol() - { - if (_linkSymbols.Any()) return _linkSymbols; - - var fielding = typeof(LinkSymbol).GetFields(); - foreach (var item in fielding) - { - if (item.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute attr && !attr.Name.IsNullOrEmpty()) - { - foreach (var name in attr.Name.Split(';')) - { - _linkSymbols.Add(name, (LinkSymbol)item.GetValue(null)); - } - } - } - - return _linkSymbols; - } - - - public static string FormatString(string str) - { - var sb = new StringBuilder(); - var firstIndex = -1; - var lastIndex = -1; - for (var i = 0; i < str.Length; i++) - { - var character = str[i]; - - if (firstIndex == -1) - { - if (character.IsNullOrEmpty() && i < str.Length - 2) - if ('"'.Equals(str[i + 1])) - firstIndex = i + 1; - } - else - { - if ('\"'.Equals(character)) - { - var andIndex = str.IndexOf("\" &", firstIndex); - var orIndex = str.IndexOf("\" |", firstIndex); - var andOrIndex = Math.Min(andIndex, orIndex); - andOrIndex = andOrIndex == -1 ? Math.Max(andOrIndex, orIndex) : andOrIndex; - - if (andOrIndex != -1) - { - lastIndex = andOrIndex; - } - else - { - if (i == firstIndex) continue; - if (i == str.Length - 1 || str[i + 1].IsNullOrEmpty()) lastIndex = i; - } - } - - if (lastIndex != -1) - { - var temp = str.Substring(firstIndex + 1, lastIndex - firstIndex - 1).Replace(@"""", @"\"""); - sb.Append($" \"{temp}\" "); - - i = lastIndex; - firstIndex = -1; - lastIndex = -1; - continue; - } - } - - if (firstIndex != -1) continue; - - sb.Append(character); - } - - return sb.ToString(); - } - - /// tokenizer pattern: Optional-SpaceS...Token...Optional-Spaces - public static readonly string _pattern = @"\s*(" + string.Join("|", new string[] - { - // operators and punctuation that are longer than one char: longest first - string.Join("|", new[] - { - "||", "&&", "==", "!=", "<=", ">=", - "in", - "like", "contains", "%=", - "startslike", "StartsLike", "startscontains", "StartsContains", "%>", - "endlike", "EndLike", "endcontains", "EndContains", "%<", - }.Select(Regex.Escape)), - @"""(?:\\.|[^""])*""", // string - @"\d+(?:\.\d+)?", // number with optional decimal part - @"\w+", // word - @"\S", // other 1-char tokens (or eat up one character in case of an error) - }) + @")\s*"; - - - /// - /// 将运算枚举符号转成具体使用方法 - /// - public static Expression ChangeOperationSymbol(OperationSymbol? symbol, Expression key, object right) - { - // 将右边数据类型强行转换成左边一样的类型 - // 两者如果Type不匹配则无法接下去的运算操作,抛出异常 - object newTypeRight; - if (right == null || string.IsNullOrEmpty(right.ToString()) || right.ToString() == "null") - { - newTypeRight = null; - } - else - { - if (symbol == OperationSymbol.In) - { - newTypeRight = right.ChangeTypeList(key.Type); - } - else - { - newTypeRight = right.ChangeType(key.Type); - } - } - - - // 根据当前枚举类别判断使用那种比较方法 - switch (symbol) - { - case OperationSymbol.Equal: - return key.Equal(Expression.Constant(newTypeRight)); - case OperationSymbol.GreaterThan: - { - if (key.Type == typeof(string)) - return key.Contains(Expression.Constant(newTypeRight)); //对string 特殊处理 由于string - return key.GreaterThan(Expression.Constant((newTypeRight))); - } - case OperationSymbol.GreaterThanOrEqual: - { - if (key.Type == typeof(string)) - return key.Contains(Expression.Constant(newTypeRight, typeof(string))); - return key.GreaterThanOrEqual(Expression.Constant(newTypeRight)); - } - - case OperationSymbol.LessThan: - { - if (key.Type == typeof(string)) - return key.Contains(Expression.Constant(newTypeRight, typeof(string))); - return key.LessThan(Expression.Constant((newTypeRight))); - } - case OperationSymbol.LessThanOrEqual: - { - if (key.Type == typeof(string)) - return key.Contains(Expression.Constant(newTypeRight, typeof(string))); - return key.LessThanOrEqual(Expression.Constant((newTypeRight))); - } - case OperationSymbol.NotEqual: - return key.NotEqual(Expression.Constant(newTypeRight)); - case OperationSymbol.Contains: - return key.Contains(Expression.Constant(newTypeRight)); - case OperationSymbol.StartsContains: - return key.StartContains(Expression.Constant(newTypeRight)); - case OperationSymbol.EndContains: - return key.EndContains(Expression.Constant(newTypeRight)); - case OperationSymbol.In: - return Expression.Constant(newTypeRight).Contains(key); - default: - throw new ArgumentException("OperationSymbol IS NULL"); - } - } -} - -/// -/// 动态linq帮助类 -/// -public class DynamicLinqHelper -{ - [Display(Name = "左")] - public string Left { get; set; } - - [Display(Name = "右")] - public string Right { get; set; } - - [Display(Name = "运算符")] - public OperationSymbol? OperationSymbol { get; set; } - - [Display(Name = "连接符")] - public LinkSymbol LinkSymbol { get; set; } - - /// - /// 是否是合并 用于括号 - /// - public bool IsMerge { get; set; } = false; - - /// - /// 再有括号时候使用 - /// - public List Child { get; set; } -} - -/// -/// 连接符枚举(将来可能会包含 括号 ) -/// -public enum LinkSymbol -{ - [Display(Name = "&&;&")] - AndAlso, - - [Display(Name = "||;|")] - OrElse, - - Empty -} - -/// -/// 常用比较运算符 > , >= , == , < , <= , != ,Contains -/// -public enum OperationSymbol -{ - [Display(Name = "in")] - In, - - [Display(Name = "like;contains;%=")] - Contains, - - [Display(Name = "StartsLike;StartsContains;%>")] - StartsContains, - - [Display(Name = "EndLike;EndContains;%<")] - EndContains, - - [Display(Name = ">")] - GreaterThan, - - [Display(Name = ">=")] - GreaterThanOrEqual, - - [Display(Name = "<")] - LessThan, - - [Display(Name = "<=")] - LessThanOrEqual, - - [Display(Name = "==;=")] - Equal, - - [Display(Name = "!=")] - NotEqual -} - -#endregion diff --git a/Tiobon.Core.Common/Helper/HtmlHelper.cs b/Tiobon.Core.Common/Helper/HtmlHelper.cs deleted file mode 100644 index f63eb2f1..00000000 --- a/Tiobon.Core.Common/Helper/HtmlHelper.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace Tiobon.Core.Common.Helper; - -public static class HtmlHelper -{ - #region 去除富文本中的HTML标签 - /// - /// 去除富文本中的HTML标签 - /// - /// - /// - /// - public static string ReplaceHtmlTag(string html, int length = 0) - { - string strText = System.Text.RegularExpressions.Regex.Replace(html, "<[^>]+>", ""); - strText = System.Text.RegularExpressions.Regex.Replace(strText, "&[^;]+;", ""); - - if (length > 0 && strText.Length > length) - return strText.Substring(0, length); - - return strText; - } - #endregion -} diff --git a/Tiobon.Core.Common/Helper/HttpHelper.cs b/Tiobon.Core.Common/Helper/HttpHelper.cs deleted file mode 100644 index 5806a1ef..00000000 --- a/Tiobon.Core.Common/Helper/HttpHelper.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System.Net.Http.Headers; - -namespace Tiobon.Core.Common.Helper; - -/// -/// httpclinet请求方式,请尽量使用IHttpClientFactory方式 -/// -public class HttpHelper -{ - public static readonly HttpClient Httpclient = new HttpClient(); - - public static async Task GetAsync(string serviceAddress) - { - try - { - string result = string.Empty; - Uri getUrl = new Uri(serviceAddress); - //Httpclient.Timeout = new TimeSpan(0, 0, 60); - result = await Httpclient.GetAsync(serviceAddress).Result.Content.ReadAsStringAsync(); - return result; - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - - return null; - } - - public static async Task PostAsync(string serviceAddress, string requestJson = null) - { - try - { - string result = string.Empty; - Uri postUrl = new Uri(serviceAddress); - - using (HttpContent httpContent = new StringContent(requestJson)) - { - httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); - - Httpclient.Timeout = new TimeSpan(0, 0, 60); - result = await Httpclient.PostAsync(serviceAddress, httpContent).Result.Content.ReadAsStringAsync(); - } - - return result; - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - - return null; - } -} \ No newline at end of file diff --git a/Tiobon.Core.Common/Helper/IpHelper.cs b/Tiobon.Core.Common/Helper/IpHelper.cs deleted file mode 100644 index 20ac2514..00000000 --- a/Tiobon.Core.Common/Helper/IpHelper.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; - -namespace Tiobon.Core.Common.Helper; - -public class IpHelper -{ - /// - /// 获取当前IP地址 - /// - /// - /// - public static string GetCurrentIp(string preferredNetworks) - { - var instanceIp = "127.0.0.1"; - - try - { - // 获取可用网卡 - var nics = NetworkInterface.GetAllNetworkInterfaces()?.Where(network => network.OperationalStatus == OperationalStatus.Up); - - // 获取所有可用网卡IP信息 - var ipCollection = nics?.Select(x => x.GetIPProperties())?.SelectMany(x => x.UnicastAddresses); - - foreach (var ipadd in ipCollection) - { - if (!IPAddress.IsLoopback(ipadd.Address) && ipadd.Address.AddressFamily == AddressFamily.InterNetwork) - { - if (string.IsNullOrEmpty(preferredNetworks)) - { - instanceIp = ipadd.Address.ToString(); - break; - } - - if (!ipadd.Address.ToString().StartsWith(preferredNetworks)) continue; - instanceIp = ipadd.Address.ToString(); - break; - } - } - } - catch - { - // ignored - } - - return instanceIp; - } -} diff --git a/Tiobon.Core.Common/Helper/JsonConfigUtils.cs b/Tiobon.Core.Common/Helper/JsonConfigUtils.cs deleted file mode 100644 index a2c7e6ae..00000000 --- a/Tiobon.Core.Common/Helper/JsonConfigUtils.cs +++ /dev/null @@ -1,238 +0,0 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Configuration.Json; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace Tiobon.Core.Common.Helper; - -/// -/// Json 配置文件通用类 -/// -public static class JsonConfigUtils -{ - #region 变量 - - /// - /// 锁 - /// - private static object __Lock__ = new object(); - - #endregion - - /// - /// 读取配置文件的信息 - /// - /// - /// 要读取json的名称 - /// 要读取的json节点名称 - /// - public static T GetAppSettings(IConfiguration config, string AppSettingsFileName, string key) where T : class, new() - { - lock (__Lock__) - { - if (config == null) - { - config = new ConfigurationBuilder() - .Add(new JsonConfigurationSource - { - Path = AppSettingsFileName, - Optional = false, - ReloadOnChange = true - }) - .Build(); - } - var appconfig = new ServiceCollection() - .AddOptions() - .Configure(config.GetSection(key)) - .BuildServiceProvider() - .GetService>() - .Value; - - return appconfig; - } - } - - - public static string GetJson(string jsonPath, string key) - { - IConfiguration config = new ConfigurationBuilder().AddJsonFile(jsonPath).Build(); //json文件地址 - string s = config.GetSection(key).Value; //json某个对象 - return s; - } -} - -#region Nacos 配置清单 -public class JsonConfigSettings -{ - // 从nacos 读取到的系统配置信息 - public static IConfiguration Configuration { get; set; } - - - /// - /// 配置文件名称常量 - /// - private static string AppSettingsFileName = $"appsettings{ GetAppSettingsConfigName() }json"; - - /// - /// 根据环境变量定向配置文件名称 - /// - /// - private static string GetAppSettingsConfigName() - { - if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != null - && Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != "") - { - return $".{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}."; - } - else - { - return "."; - } - } - /// - /// 获取Nacos配置 - /// - public static List NacosServerAddresses - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").ServerAddresses; - } - } - - /// - /// 获取Nacos配置 - /// - public static int NacosDefaultTimeOut - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").DefaultTimeOut; - } - } - - /// - /// 获取Nacos配置 - /// - public static string NacosNamespace - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").Namespace; - } - } - /// - /// 获取Nacos配置 - /// - public static string NacosServiceName - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").ServiceName; - } - } - - /// - /// 获取Nacos配置 - /// - public static int ListenInterval - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").ListenInterval; - } - } - - /// - /// 获取Nacos配置 - /// - public static string NacosIp - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").Ip; - - } - } - /// - /// 获取Nacos配置 - /// - public static int NacosPort - { - get - { - return int.Parse(JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").Port); - } - } - /// - /// 获取Nacos配置 - /// - public static bool NacosRegisterEnabled - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").RegisterEnabled; - } - } - - /// - /// 获取Nacos配置 - /// - public static Dictionary NacosMetadata - { - get - { - return JsonConfigUtils.GetAppSettings(Configuration, AppSettingsFileName, "nacos").Metadata; - } - } - - #endregion - - #region Nacos配置 - - /// - /// Nacos配置实体 - /// - public class NacosConfigDTO - { - /// - /// 服务IP地址 - /// - public List ServerAddresses { get; set; } - /// - /// 默认超时时间 - /// - public int DefaultTimeOut { get; set; } - /// - /// 监听间隔 - /// - public int ListenInterval { get; set; } - /// - /// 服务命名空间 - /// - public string Namespace { get; set; } - /// - /// 服务名称 - /// - public string ServiceName { get; set; } - /// - /// IP地址 - /// - public string Ip { get; set; } - /// - /// 端口 - /// - public string Port { get; set; } - /// - /// 服务命名空间 - /// - public bool RegisterEnabled { get; set; } - /// - /// 其他配置 - /// - public Dictionary Metadata { get; set; } - } - - #endregion - -} diff --git a/Tiobon.Core.Common/Helper/LinqHelper.cs b/Tiobon.Core.Common/Helper/LinqHelper.cs deleted file mode 100644 index f337de32..00000000 --- a/Tiobon.Core.Common/Helper/LinqHelper.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Linq.Expressions; - -namespace Tiobon.Core.Common.Helper; - -/// -/// Linq操作帮助类 -/// -public static class LinqHelper -{ - /// - /// 创建初始条件为True的表达式 - /// - /// - /// - public static Expression> True() - { - return x => true; - } - - /// - /// 创建初始条件为False的表达式 - /// - /// - /// - public static Expression> False() - { - return x => false; - } -} diff --git a/Tiobon.Core.Common/Helper/LoggerHelper.cs b/Tiobon.Core.Common/Helper/LoggerHelper.cs deleted file mode 100644 index dbd0813f..00000000 --- a/Tiobon.Core.Common/Helper/LoggerHelper.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace Tiobon.Core.Common.Helper; - -/// -/// 日志操作 -/// -public static class LoggerHelper -{ - /// - /// console日志 - /// - /// - public static void Info(string msg) - { - Console.WriteLine($"{DateTime.Now:HH:mm:ss} {msg}"); - } - /// - /// 正常日志 - /// - /// - public static void SendLog(string msg) - { - Console.WriteLine($"{DateTime.Now:HH:mm:ss} {msg}"); - } - /// - /// 错误日志 - /// - /// - public static void SendLogError(string msg) - { - Console.WriteLine($"{DateTime.Now:HH:mm:ss} {msg}"); - } -} diff --git a/Tiobon.Core.Common/Helper/MD5Hepler.cs b/Tiobon.Core.Common/Helper/MD5Hepler.cs deleted file mode 100644 index aa476885..00000000 --- a/Tiobon.Core.Common/Helper/MD5Hepler.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.Security.Cryptography; -using System.Text; - -namespace Tiobon.Core.Common.Helper; - -public class MD5Helper -{ - /// - /// 16位MD5加密 - /// - /// - /// - public static string MD5Encrypt16(string password) - { - var md5 = MD5.Create(); - string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8); - t2 = t2.Replace("-", string.Empty); - return t2; - } - - /// - /// 32位MD5加密 - /// - /// - /// - public static string MD5Encrypt32(string password = "") - { - string pwd = string.Empty; - try - { - if (!string.IsNullOrEmpty(password) && !string.IsNullOrWhiteSpace(password)) - { - MD5 md5 = MD5.Create(); //实例化一个md5对像 - // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  - byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); - // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 - foreach (var item in s) - { - // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 - pwd = string.Concat(pwd, item.ToString("X2")); - } - } - } - catch - { - throw new Exception($"错误的 password 字符串:【{password}】"); - } - return pwd; - } - - /// - /// 64位MD5加密 - /// - /// - /// - public static string MD5Encrypt64(string password) - { - // 实例化一个md5对像 - // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择  - MD5 md5 = MD5.Create(); - byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password)); - return Convert.ToBase64String(s); - } - /// - /// Sha1加密 - /// - /// 要加密的字符串 - /// 加密后的十六进制的哈希散列(字符串) - public static string Sha1(string str, string format = "x2") - { - var buffer = Encoding.UTF8.GetBytes(str); - var data = SHA1.Create().ComputeHash(buffer); - var sb = new StringBuilder(); - foreach (var t in data) - { - sb.Append(t.ToString(format)); - } - return sb.ToString(); - } - /// - /// Sha256加密 - /// - /// 要加密的字符串 - /// 加密后的十六进制的哈希散列(字符串) - public static string Sha256(string str, string format = "x2") - { - var buffer = Encoding.UTF8.GetBytes(str); - var data = SHA256.Create().ComputeHash(buffer); - var sb = new StringBuilder(); - foreach (var t in data) - { - sb.Append(t.ToString(format)); - } - return sb.ToString(); - } -} diff --git a/Tiobon.Core.Common/Helper/NPOIHelper.cs b/Tiobon.Core.Common/Helper/NPOIHelper.cs deleted file mode 100644 index edd853ad..00000000 --- a/Tiobon.Core.Common/Helper/NPOIHelper.cs +++ /dev/null @@ -1,967 +0,0 @@ -using NPOI.HPSF; -using NPOI.HSSF.UserModel; -using NPOI.SS.UserModel; -using NPOI.XSSF.UserModel; -using System.Data; -using System.Text; - -namespace Tiobon.Core.Common.Helper; - -public class NPOIHelper -{ - #region DataTable 导出到 Excel 的 MemoryStream - /// - /// DataTable 导出到 Excel 的 MemoryStream - /// - /// 源 DataTable - /// 表头文本 空值未不要表头标题 - /// - public static MemoryStream GenerateExportExcel(DataTable dtSource, string strHeaderText, string sheetName, string strFileName = null) - { - IWorkbook workbook = new XSSFWorkbook(); - ISheet sheet; - if (!File.Exists(strFileName)) - { - sheet = workbook.CreateSheet(sheetName); - } - else - { - using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) - { - //hssfworkbook = new HSSFWorkbook(file); - //hssfworkbook = new XSSFWorkbook(file); - workbook = WorkbookFactory.Create(file); - } - if (workbook == null) throw new Exception("未能加载excel"); - - sheet = workbook.CreateSheet(sheetName); - } - - - #region 文件属性 - DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); - dsi.Company = "EUCloud"; - //workbook.DocumentSummaryInformation = dsi; - SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); - si.Author = "EUCloud"; - si.ApplicationName = "EUCloud"; - si.LastAuthor = "EUCloud"; - si.Comments = ""; - si.Title = ""; - si.Subject = ""; - si.CreateDateTime = DateTime.Now; - //workbook.SummaryInformation = si; - #endregion - ICellStyle dateStyle = workbook.CreateCellStyle(); - IDataFormat format = workbook.CreateDataFormat(); - dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); - ICellStyle datetimeStyle = workbook.CreateCellStyle(); - datetimeStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm"); - ICellStyle datetimesStyle = workbook.CreateCellStyle(); - datetimesStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm:ss"); - int[] arrColWidth = new int[dtSource.Columns.Count]; - foreach (DataColumn item in dtSource.Columns) - { - arrColWidth[item.Ordinal] = Encoding.GetEncoding("utf-8").GetBytes(item.ColumnName.ToString()).Length; - } - for (int i = 0; i < dtSource.Rows.Count; i++) - { - for (int j = 0; j < dtSource.Columns.Count; j++) - { - int intTemp = Encoding.GetEncoding("utf-8").GetBytes(dtSource.Rows[i][j].ToString()).Length; - if (intTemp > arrColWidth[j]) - { - arrColWidth[j] = intTemp; - } - } - } - int rowIndex = 0; - int intTop = 0; - int HeightInPoints = 40; - foreach (DataRow row in dtSource.Rows) - { - #region 新建表、填充表头、填充列头,样式 - if (rowIndex == 655350 || rowIndex == 0) - { - if (rowIndex != 0) - { - sheet = workbook.CreateSheet(); - } - intTop = 0; - - #region 表头及样式 - { - if (!string.IsNullOrWhiteSpace(strHeaderText) && strHeaderText.Length > 0) - { - - #region 标题单元格样式 - - ICellStyle titleStyle = workbook.CreateCellStyle(); - titleStyle.Alignment = HorizontalAlignment.Center; //居中 - titleStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中 - titleStyle.WrapText = true;//自动换行 - // 边框 - titleStyle.BorderBottom = BorderStyle.Thin; - titleStyle.BorderLeft = BorderStyle.None; - titleStyle.BorderRight = BorderStyle.None; - titleStyle.BorderTop = BorderStyle.None; - - IFont font = workbook.CreateFont(); - font.FontHeightInPoints = (short)14; - font.FontName = "宋体"; - font.IsBold = true; - titleStyle.SetFont(font); - #endregion - - IRow headerRow = sheet.CreateRow(intTop); - intTop += 1; - headerRow.HeightInPoints = 25; - headerRow.CreateCell(0).SetCellValue(strHeaderText); - //ICellStyle headStyle = workbook.CreateCellStyle(); - //headStyle.Alignment = HorizontalAlignment.Center; - //IFont font = workbook.CreateFont(); - //font.FontHeightInPoints = 20; - //font.IsBold = true; - //headStyle.SetFont(font); - headerRow.GetCell(0).CellStyle = titleStyle; - // 设置行高 - headerRow.HeightInPoints = 30; - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); - - } - } - #endregion - - #region 年度人力配置 - { - if (sheetName == "年度人力配置") - { - HeightInPoints = 15; - #region 标题单元格样式 - - ICellStyle titleStyle = workbook.CreateCellStyle(); - titleStyle.Alignment = HorizontalAlignment.Center; //居中 - titleStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中 - titleStyle.WrapText = true;//自动换行 - // 边框 - titleStyle.BorderBottom = BorderStyle.Thin; - titleStyle.BorderLeft = BorderStyle.Thin; - titleStyle.BorderRight = BorderStyle.Thin; - titleStyle.BorderTop = BorderStyle.Thin; - - IFont font = workbook.CreateFont(); - font.FontHeightInPoints = (short)10; - font.FontName = "宋体"; - font.IsBold = true; - titleStyle.SetFont(font); - #endregion - - IRow headerRow = sheet.CreateRow(intTop); - headerRow.HeightInPoints = HeightInPoints; - - for (int i = 0; i < 5; i++) - { - headerRow.CreateCell(i).SetCellValue(dtSource.Columns[i].ColumnName); - headerRow.GetCell(i).CellStyle = titleStyle; - } - for (int i = 5; i < 17; i++) - { - headerRow.CreateCell(i).SetCellValue("预算编制数"); - headerRow.GetCell(i).CellStyle = titleStyle; - - } - - //headerRow.CreateCell(5).SetCellValue("预算编制数"); - //headerRow.GetCell(5).CellStyle = titleStyle; - headerRow.CreateCell(17).SetCellValue("备注"); - headerRow.GetCell(17).CellStyle = titleStyle; - - for (int i = 0; i < 5; i++) - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 1 + intTop, i, i)); - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 1 + intTop, 17, 17)); - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 0 + intTop, 5, 16)); - - intTop += 1; - } - } - #endregion - - #region 培训计划【牛尾】 - if (sheetName == "培训计划【牛尾】") - { - HeightInPoints = 15; - #region 标题单元格样式 - - ICellStyle titleStyle = workbook.CreateCellStyle(); - titleStyle.Alignment = HorizontalAlignment.Center; //居中 - titleStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中 - titleStyle.WrapText = true;//自动换行 - // 边框 - titleStyle.BorderBottom = BorderStyle.Thin; - titleStyle.BorderLeft = BorderStyle.Thin; - titleStyle.BorderRight = BorderStyle.Thin; - titleStyle.BorderTop = BorderStyle.Thin; - - IFont font = workbook.CreateFont(); - font.FontHeightInPoints = (short)10; - font.FontName = "宋体"; - font.IsBold = true; - titleStyle.SetFont(font); - #endregion - - IRow headerRow = sheet.CreateRow(intTop); - headerRow.HeightInPoints = HeightInPoints; - - for (int i = 0; i < 13; i++) - { - headerRow.CreateCell(i).SetCellValue(dtSource.Columns[i].ColumnName); - headerRow.GetCell(i).CellStyle = titleStyle; - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 1 + intTop, i, i)); - } - - for (int i = 13; i < 36; i = i + 2) - { - string month = dtSource.Columns[i].ColumnName.Replace("实际合计人天_M", "") + "月"; - //month = month.Replace("进展率_M", ""); - headerRow.CreateCell(i).SetCellValue(month); - headerRow.GetCell(i).CellStyle = titleStyle; - headerRow.CreateCell(i + 1).SetCellValue(month); - headerRow.GetCell(i + 1).CellStyle = titleStyle; - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(intTop, intTop, i, i + 1)); - - } - - for (int i = 37; i < 42; i++) - { - headerRow.CreateCell(i).SetCellValue(dtSource.Columns[i].ColumnName); - headerRow.GetCell(i).CellStyle = titleStyle; - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 1 + intTop, i, i)); - } - - //for (int i = 5; i < 17; i++) - //{ - // headerRow.CreateCell(i).SetCellValue("预算编制数"); - // headerRow.GetCell(i).CellStyle = titleStyle; - - //} - - ////headerRow.CreateCell(5).SetCellValue("预算编制数"); - ////headerRow.GetCell(5).CellStyle = titleStyle; - //headerRow.CreateCell(17).SetCellValue("备注"); - //headerRow.GetCell(17).CellStyle = titleStyle; - - - //for (int i = 36; i < 41; i++) - //sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 1 + intTop, 17, 17)); - //sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0 + intTop, 0 + intTop, 5, 16)); - - intTop += 1; - - } - #endregion - - #region 列头及样式 - { - IRow headerRow = sheet.CreateRow(intTop); - headerRow.HeightInPoints = HeightInPoints; - intTop += 1; - - ICellStyle headStyle = workbook.CreateCellStyle(); - headStyle.Alignment = HorizontalAlignment.Center; //居中 - headStyle.VerticalAlignment = VerticalAlignment.Center;//垂直居中 - headStyle.WrapText = true;//自动换行 - // 边框 - headStyle.BorderBottom = BorderStyle.Thin; - headStyle.BorderLeft = BorderStyle.Thin; - headStyle.BorderRight = BorderStyle.Thin; - headStyle.BorderTop = BorderStyle.Thin; - // 字体 - IFont font = workbook.CreateFont(); - font.FontHeightInPoints = (short)10; - font.IsBold = true; - font.FontName = "宋体"; - headStyle.SetFont(font); - - //ICellStyle headStyle = workbook.CreateCellStyle(); - //headStyle.Alignment = HorizontalAlignment.Center; - //headStyle.BorderBottom = BorderStyle.Medium; - //headStyle.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.LightGreen.Index; - //headStyle.FillPattern = FillPattern.NoFill; - //IFont font = workbook.CreateFont(); - //font.Boldweight = 700; - //headStyle.SetFont(font); - foreach (DataColumn column in dtSource.Columns) - { - var name = column.ColumnName; - - if (name.IndexOf("实际合计人天") > -1) - name = "实际合计人天"; - if (name.IndexOf("进展率") > -1) - name = "进展率"; - - headerRow.CreateCell(column.Ordinal).SetCellValue(name); - headerRow.GetCell(column.Ordinal).CellStyle = headStyle; - //设置列宽 - //sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); - if (arrColWidth[column.Ordinal] > 255) - { - arrColWidth[column.Ordinal] = 254; - } - else - { - sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); - } - } - - - } - #endregion - rowIndex = intTop; - } - #endregion - #region 填充内容 - IRow dataRow = sheet.CreateRow(rowIndex); - dataRow.HeightInPoints = 25; - - ICellStyle style = workbook.CreateCellStyle(); - style.Alignment = HorizontalAlignment.Center; //居中 - style.VerticalAlignment = VerticalAlignment.Center;//垂直居中 - style.WrapText = true;//自动换行 - // 边框 - style.BorderBottom = BorderStyle.Thin; - style.BorderLeft = BorderStyle.Thin; - style.BorderRight = BorderStyle.Thin; - style.BorderTop = BorderStyle.Thin; - // 字体 - var font1 = workbook.CreateFont(); - font1.FontHeightInPoints = (short)10; - font1.FontName = "宋体"; - style.SetFont(font1); - - foreach (DataColumn column in dtSource.Columns) - { - ICell newCell = dataRow.CreateCell(column.Ordinal); - - newCell.CellStyle = style; - string drValue = row[column].ToString(); - switch (column.DataType.ToString()) - { - case "System.String"://字符串类型 - newCell.SetCellValue(drValue); - break; - case "System.DateTime"://日期类型 - DateTime dateV; - if (!string.IsNullOrEmpty(drValue)) - { - DateTime.TryParse(drValue, out dateV); - //dateV = DateTimeHelper.ConvertToSecondString(dateV); - newCell.SetCellValue(ConvertToSecondString(dateV)); - //if (column.Caption == "renderDateTime") - //{ - // newCell.CellStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm"); - //} - //else if (column.Caption == "renderDate") - //{ - // newCell.CellStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); - //} - //else - //{ - // - //} - - //try - //{ - // Convert.ToDateTime(drValue); newCell.CellStyle.DataFormat = format.GetFormat("yyyy-mm-dd hh:mm:ss"); - //} - //catch (Exception) - //{ - - //} - } - break; - case "System.Boolean"://布尔型 - bool boolV = false; - bool.TryParse(drValue, out boolV); - newCell.SetCellValue(boolV); - break; - case "System.Int16": - case "System.Int32": - case "System.Int64": - case "System.Byte": - int intV = 0; - int.TryParse(drValue, out intV); - newCell.SetCellValue(intV); - break; - case "System.Decimal": - case "System.Double": - double doubV = 0; - double.TryParse(drValue, out doubV); - newCell.SetCellValue(doubV); - break; - case "System.DBNull"://空值处理 - newCell.SetCellValue(""); - break; - default: - newCell.SetCellValue(""); - break; - } - } - #endregion - - foreach (DataColumn column in dtSource.Columns) - { - //设置列宽 - //sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); - if (arrColWidth[column.Ordinal] > 255) - { - arrColWidth[column.Ordinal] = 254; - } - else - { - sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); - } - } - - rowIndex++; - } - - //获取当前列的宽度,然后对比本列的长度,取最大值 - if (true) - for (int columnNum = 0; columnNum <= dtSource.Columns.Count; columnNum++) - { - sheet.AutoSizeColumn(columnNum);//先来个常规自适应 - - var columnWidth = sheet.GetColumnWidth(columnNum) / 256; - for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++) - { - IRow currentRow; - //当前行未被使用过 - if (sheet.GetRow(rowNum) == null) - { - currentRow = sheet.CreateRow(rowNum); - } - else - { - currentRow = sheet.GetRow(rowNum); - } - if (currentRow.GetCell(columnNum) != null) - { - ICell currentCell = currentRow.GetCell(columnNum); - int length = Encoding.Default.GetBytes(currentCell.ToString()).Length; - if (columnWidth < length) - { - columnWidth = length; - if (columnWidth > 30) columnWidth = 30; - } - } - } - try - { - sheet.SetColumnWidth(columnNum, columnWidth * 300); // 256 - } - catch (Exception e) - { - - } - - } - for (int rowNum = 2; rowNum <= sheet.LastRowNum; rowNum++) - { - IRow currentRow = sheet.GetRow(rowNum); - - int length = 25; - foreach (var item in currentRow.Cells) - { - if (item != null) - length = Encoding.UTF8.GetBytes(item.ToString()).Length > length ? Encoding.UTF8.GetBytes(item.ToString()).Length : length; - } - currentRow.HeightInPoints = 35 * (length / 150 + 1); - } - using (MemoryStream ms = new MemoryStream()) - { - workbook.Write(ms); - ms.Flush(); - workbook.Dispose(); - //ms.Position = 0; - return ms; - } - } - #endregion - - public static string ConvertToSecondString(DateTime? dateTime) - { - if (dateTime is null) - return ""; - - return dateTime.Value.ToString(@"yyyy\-MM\-dd HH:mm:ss"); - } - - #region DaataTable 导出到 Excel 文件 - /// - /// DaataTable 导出到 Excel 文件 - /// - /// 源 DataaTable - /// 表头文本 - /// 保存位置(文件名及路径) - public static void ExportExcel(DataTable dtSource, string strHeaderText, string sheetName = null, string strFileName = null) - { - using (MemoryStream ms = GenerateExportExcel(dtSource, strHeaderText, sheetName, strFileName)) - { - using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) - { - byte[] data = ms.ToArray(); - fs.Write(data, 0, data.Length); - fs.Flush(); - } - } - } - #endregion - - #region 读取 excel,默认第一行为标头 - /// - /// 读取 excel,默认第一行为标头 - /// - /// excel 文档路径 - /// - public static DataTable ImportExcel(string strFileName, string sheetName = "") - { - DataTable dt = new DataTable(); - //HSSFWorkbook hssfworkbook; - IWorkbook hssfworkbook; - ISheet sheet; - using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) - { - //hssfworkbook = new HSSFWorkbook(file); - //hssfworkbook = new XSSFWorkbook(file); - hssfworkbook = NPOI.SS.UserModel.WorkbookFactory.Create(file); - } - if (hssfworkbook == null) throw new Exception("未能加载excel"); - int sheetCount = hssfworkbook.NumberOfSheets; - if (sheetCount == 0) throw new Exception("未能加载excel"); - if (string.IsNullOrEmpty(sheetName)) - { - sheet = hssfworkbook.GetSheetAt(0); - } - else - { - int sheetIndex = hssfworkbook.GetSheetIndex(sheetName); - if (sheetIndex >= 0) - { - sheet = hssfworkbook.GetSheetAt(sheetIndex); - } - else - { - throw new Exception($"未能找到{sheetName}这个sheet页"); - } - } - System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); - IRow headerRow = sheet.GetRow(0); - int cellCount = headerRow.LastCellNum; - for (int j = 0; j < cellCount; j++) - { - ICell cell = headerRow.GetCell(j); - if (!string.IsNullOrWhiteSpace(cell.ToString())) - dt.Columns.Add(cell.ToString()); - } - for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) - { - IRow row = sheet.GetRow(i); - - if (row is null) - continue; - //if (row.GetCell(row.FirstCellNum) != null && row.GetCell(row.FirstCellNum).ToString().Length > 0) - //if (row.GetCell(row.FirstCellNum) != null) - { - DataRow dataRow = dt.NewRow(); - for (int j = row.FirstCellNum; j < cellCount; j++) - { - if (j < 0) - continue; - if (row.GetCell(j) != null) - { - DateTime dateV = DateTime.MinValue; - try - { - dataRow[j] = GetCellValue(row.GetCell(j)); - //if (row.GetCell(j).IsDate()) - //{ - // dateV = row.GetCell(j).DateCellValue; - // dataRow[j] = DateTimeHelper.ConvertToSecondString(dateV); - //} - //else - //{ - // dataRow[j] = row.GetCell(j).ToString(); - //} - } - catch { } - //if (dateV == DateTime.MinValue) - //{ - // dataRow[j] = row.GetCell(j).ToString(); - //} - //else - //{ - // dataRow[j] = DateTimeHelper.ConvertToSecondString(dateV); - //} - - } - } - dt.Rows.Add(dataRow); - } - } - return dt; - - } - #endregion - - /// - /// 获取单元格类型 - /// - /// - /// - private static string GetCellValue(ICell cell) - { - if (cell == null) - return null; - switch (cell.CellType) - { - case CellType.Blank: //BLANK: - return null; - case CellType.Boolean: //BOOLEAN: - return Convert.ToString(cell.BooleanCellValue); - case CellType.Numeric: //NUMERIC: - if (DateUtil.IsCellDateFormatted(cell)) - { - return ConvertToSecondString(cell.DateCellValue); - } - else - { - return Convert.ToString(cell); - } - case CellType.String: //STRING: - return cell.StringCellValue; - case CellType.Error: //ERROR: - return Convert.ToString(cell.ErrorCellValue); - case CellType.Formula: //FORMULA: - default: - return "=" + cell.CellFormula; - } - } - - /// - /// DataSet 导出到 Excel 的 MemoryStream - /// - /// 源 DataSet - /// 表头文本 空值未不要表头标题(多个表对应多个表头以英文逗号(,)分开,个数应与表相同) - /// - public static MemoryStream ExportExcel(DataSet dsSource, string strHeaderText) - { - - HSSFWorkbook workbook = new HSSFWorkbook(); - - #region 文件属性 - DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); - dsi.Company = "517best.com"; - workbook.DocumentSummaryInformation = dsi; - SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); - si.Author = "517best.com"; - si.ApplicationName = "517best.com"; - si.LastAuthor = "517best.com"; - si.Comments = ""; - si.Title = ""; - si.Subject = ""; - si.CreateDateTime = DateTime.Now; - workbook.SummaryInformation = si; - #endregion - - #region 注释 - - - //ICellStyle dateStyle = workbook.CreateCellStyle(); - //IDataFormat format = workbook.CreateDataFormat(); - //dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); - - //ISheet sheet = workbook.CreateSheet(); - //int[] arrColWidth = new int[dtSource.Columns.Count]; - //foreach (DataColumn item in dtSource.Columns) - //{ - // arrColWidth[item.Ordinal] = Encoding.GetEncoding("gb2312").GetBytes(item.ColumnName.ToString()).Length; - //} - //for (int i = 0; i < dtSource.Rows.Count; i++) - //{ - // for (int j = 0; j < dtSource.Columns.Count; j++) - // { - // int intTemp = Encoding.GetEncoding("gb2312").GetBytes(dtSource.Rows[i][j].ToString()).Length; - // if (intTemp > arrColWidth[j]) - // { - // arrColWidth[j] = intTemp; - // } - // } - //} - //int rowIndex = 0; - //int intTop = 0; - //foreach (DataRow row in dtSource.Rows) - //{ - // #region 新建表、填充表头、填充列头,样式 - // if (rowIndex == 65535 || rowIndex == 0) - // { - // if (rowIndex != 0) - // { - // sheet = workbook.CreateSheet(); - // } - // intTop = 0; - // #region 表头及样式 - // { - // if (strHeaderText.Length > 0) - // { - // IRow headerRow = sheet.CreateRow(intTop); - // intTop += 1; - // headerRow.HeightInPoints = 25; - // headerRow.CreateCell(0).SetCellValue(strHeaderText); - // ICellStyle headStyle = workbook.CreateCellStyle(); - // headStyle.Alignment = HorizontalAlignment.CENTER; - // IFont font = workbook.CreateFont(); - // font.FontHeightInPoints = 20; - // font.Boldweight = 700; - // headStyle.SetFont(font); - // headerRow.GetCell(0).CellStyle = headStyle; - // sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); - - // } - // } - // #endregion - // #region 列头及样式 - // { - // IRow headerRow = sheet.CreateRow(intTop); - // intTop += 1; - // ICellStyle headStyle = workbook.CreateCellStyle(); - // headStyle.Alignment = HorizontalAlignment.CENTER; - // IFont font = workbook.CreateFont(); - // font.Boldweight = 700; - // headStyle.SetFont(font); - // foreach (DataColumn column in dtSource.Columns) - // { - // headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); - // headerRow.GetCell(column.Ordinal).CellStyle = headStyle; - // //设置列宽 - // sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); - // } - - - // } - // #endregion - // rowIndex = intTop; - // } - // #endregion - // #region 填充内容 - // IRow dataRow = sheet.CreateRow(rowIndex); - // foreach (DataColumn column in dtSource.Columns) - // { - // ICell newCell = dataRow.CreateCell(column.Ordinal); - // string drValue = row[column].ToString(); - // switch (column.DataType.ToString()) - // { - // case "System.String"://字符串类型 - // newCell.SetCellValue(drValue); - // break; - // case "System.DateTime"://日期类型 - // DateTime dateV; - // DateTime.TryParse(drValue, out dateV); - // newCell.SetCellValue(dateV); - // newCell.CellStyle = dateStyle;//格式化显示 - // break; - // case "System.Boolean"://布尔型 - // bool boolV = false; - // bool.TryParse(drValue, out boolV); - // newCell.SetCellValue(boolV); - // break; - // case "System.Int16": - // case "System.Int32": - // case "System.Int64": - // case "System.Byte": - // int intV = 0; - // int.TryParse(drValue, out intV); - // newCell.SetCellValue(intV); - // break; - // case "System.Decimal": - // case "System.Double": - // double doubV = 0; - // double.TryParse(drValue, out doubV); - // newCell.SetCellValue(doubV); - // break; - // case "System.DBNull"://空值处理 - // newCell.SetCellValue(""); - // break; - // default: - // newCell.SetCellValue(""); - // break; - // } - // } - // #endregion - // rowIndex++; - //} - #endregion - - string[] strNewText = strHeaderText.Split(Convert.ToChar(",")); - if (dsSource.Tables.Count == strNewText.Length) - { - for (int i = 0; i < dsSource.Tables.Count; i++) - { - ExportFromDSExcel(workbook, dsSource.Tables[i], strNewText[i]); - } - } - - using (MemoryStream ms = new MemoryStream()) - { - workbook.Write(ms); - ms.Flush(); - ms.Position = 0; - return ms; - } - } - /// - /// DataTable 导出到 Excel 的 MemoryStream - /// - /// 源 workbook - /// 源 DataTable - /// 表头文本 空值未不要表头标题(多个表对应多个表头以英文逗号(,)分开,个数应与表相同) - /// - public static void ExportFromDSExcel(HSSFWorkbook workbook, DataTable dtSource, string strHeaderText) - { - ICellStyle dateStyle = workbook.CreateCellStyle(); - IDataFormat format = workbook.CreateDataFormat(); - dateStyle.DataFormat = format.GetFormat("yyyy-MM-dd HH:mm:ss"); - ISheet sheet = workbook.CreateSheet(strHeaderText); - - int[] arrColWidth = new int[dtSource.Columns.Count]; - foreach (DataColumn item in dtSource.Columns) - { - arrColWidth[item.Ordinal] = Encoding.GetEncoding("utf-8").GetBytes(item.ColumnName.ToString()).Length; - } - for (int i = 0; i < dtSource.Rows.Count; i++) - { - for (int j = 0; j < dtSource.Columns.Count; j++) - { - int intTemp = Encoding.GetEncoding("utf-8").GetBytes(dtSource.Rows[i][j].ToString()).Length; - if (intTemp > arrColWidth[j]) - { - arrColWidth[j] = intTemp; - } - } - } - int rowIndex = 0; - int intTop = 0; - foreach (DataRow row in dtSource.Rows) - { - #region 新建表、填充表头、填充列头,样式 - if (rowIndex == 65535 || rowIndex == 0) - { - if (rowIndex != 0) - { - sheet = workbook.CreateSheet(); - } - intTop = 0; - #region 表头及样式 - { - if (strHeaderText.Length > 0) - { - IRow headerRow = sheet.CreateRow(intTop); - intTop += 1; - headerRow.HeightInPoints = 25; - headerRow.CreateCell(0).SetCellValue(strHeaderText); - ICellStyle headStyle = workbook.CreateCellStyle(); - headStyle.Alignment = HorizontalAlignment.Center; - IFont font = workbook.CreateFont(); - font.FontHeightInPoints = 20; - font.Boldweight = 700; - headStyle.SetFont(font); - headerRow.GetCell(0).CellStyle = headStyle; - sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); - - } - } - #endregion - #region 列头及样式 - { - IRow headerRow = sheet.CreateRow(intTop); - intTop += 1; - ICellStyle headStyle = workbook.CreateCellStyle(); - headStyle.Alignment = HorizontalAlignment.Center; - IFont font = workbook.CreateFont(); - font.Boldweight = 700; - headStyle.SetFont(font); - foreach (DataColumn column in dtSource.Columns) - { - headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); - headerRow.GetCell(column.Ordinal).CellStyle = headStyle; - //设置列宽 - // sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); // 设置设置列宽 太长会报错 修改2014 年9月22日 - int dd = (arrColWidth[column.Ordinal] + 1) * 256; - - if (dd > 200 * 256) - { - dd = 100 * 256; - } - - - sheet.SetColumnWidth(column.Ordinal, dd); - } - - - } - #endregion - rowIndex = intTop; - } - #endregion - #region 填充内容 - IRow dataRow = sheet.CreateRow(rowIndex); - foreach (DataColumn column in dtSource.Columns) - { - ICell newCell = dataRow.CreateCell(column.Ordinal); - string drValue = row[column].ToString(); - switch (column.DataType.ToString()) - { - case "System.String"://字符串类型 - newCell.SetCellValue(drValue); - break; - case "System.DateTime"://日期类型 - if (drValue.Length > 0) - { - DateTime dateV; - DateTime.TryParse(drValue, out dateV); - newCell.SetCellValue(dateV); - newCell.CellStyle = dateStyle;//格式化显示 - } - else { newCell.SetCellValue(drValue); } - break; - case "System.Boolean"://布尔型 - bool boolV = false; - bool.TryParse(drValue, out boolV); - newCell.SetCellValue(boolV); - break; - case "System.Int16": - case "System.Int32": - case "System.Int64": - case "System.Byte": - int intV = 0; - int.TryParse(drValue, out intV); - newCell.SetCellValue(intV); - break; - case "System.Decimal": - case "System.Double": - double doubV = 0; - double.TryParse(drValue, out doubV); - newCell.SetCellValue(doubV); - break; - case "System.DBNull"://空值处理 - newCell.SetCellValue(""); - break; - default: - newCell.SetCellValue(""); - break; - } - } - #endregion - rowIndex++; - } - } -} diff --git a/Tiobon.Core.Common/Helper/SM/SM4.cs b/Tiobon.Core.Common/Helper/SM/SM4.cs deleted file mode 100644 index b43ebe52..00000000 --- a/Tiobon.Core.Common/Helper/SM/SM4.cs +++ /dev/null @@ -1,297 +0,0 @@ -namespace Tiobon.Core.Common.Helper.SM; - -public class SM4 -{ - public const int SM4_ENCRYPT = 1; - public const int SM4_DECRYPT = 0; - - private long GET_ULONG_BE(SByte[] b, int i) - { -#pragma warning disable CS0675 // 对进行了带符号扩展的操作数使用了按位或运算符 - long n2 = (b[i] & 0xFF) << 24 | (b[(i + 1)] & 0xFF) << 16 | (b[(i + 2)] & 0xFF) << 8 | b[(i + 3)] & 0xFF & 0xFFFFFFFF; -#pragma warning restore CS0675 // 对进行了带符号扩展的操作数使用了按位或运算符 - return n2; - } - - private void PUT_ULONG_BE(long n, SByte[] b, int i) - { - b[i] = (SByte)(int)(0xFF & n >> 24); - b[i + 1] = (SByte)(int)(0xFF & n >> 16); - b[i + 2] = (SByte)(int)(0xFF & n >> 8); - b[i + 3] = (SByte)(int)(0xFF & n); - } - - private long SHL(long x, int n) - { - return (x & 0xFFFFFFFF) << n; - } - - private long ROTL(long x, int n) - { - return SHL(x, n) | x >> (32 - n); - } - - private void SWAP(long[] sk, int i) - { - long t = sk[i]; - sk[i] = sk[(31 - i)]; - sk[(31 - i)] = t; - } - - /// - /// S盒 - /// - //public SByte[] SboxTable = new SByte[] { - // 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, - // 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, - // 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, - // 0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6, - // 0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8, - // 0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35, - // 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87, - // 0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e, - // 0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1, - // 0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3, - // 0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f, - // 0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51, - // 0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8, - // 0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0, - // 0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84, - // 0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48 - //}; - - public SByte[] SboxTable = { -42, -112, -23, -2, -52, -31, 61, -73, 22, -74, 20, -62, 40, -5, 44, 5, 43, 103, -102, 118, 42, -66, 4, -61, -86, 68, 19, 38, 73, -122, 6, -103, -100, 66, 80, -12, -111, -17, -104, 122, 51, 84, 11, 67, -19, -49, -84, 98, -28, -77, 28, -87, -55, 8, -24, -107, -128, -33, -108, -6, 117, -113, 63, -90, 71, 7, -89, -4, -13, 115, 23, -70, -125, 89, 60, 25, -26, -123, 79, -88, 104, 107, -127, -78, 113, 100, -38, -117, -8, -21, 15, 75, 112, 86, -99, 53, 30, 36, 14, 94, 99, 88, -47, -94, 37, 34, 124, 59, 1, 33, 120, -121, -44, 0, 70, 87, -97, -45, 39, 82, 76, 54, 2, -25, -96, -60, -56, -98, -22, -65, -118, -46, 64, -57, 56, -75, -93, -9, -14, -50, -7, 97, 21, -95, -32, -82, 93, -92, -101, 52, 26, 85, -83, -109, 50, 48, -11, -116, -79, -29, 29, -10, -30, 46, -126, 102, -54, 96, -64, 41, 35, -85, 13, 83, 78, 111, -43, -37, 55, 69, -34, -3, -114, 47, 3, -1, 106, 114, 109, 108, 91, 81, -115, 27, -81, -110, -69, -35, -68, 127, 17, -39, 92, 65, 31, 16, 90, -40, 10, -63, 49, -120, -91, -51, 123, -67, 45, 116, -48, 18, -72, -27, -76, -80, -119, 105, -105, 74, 12, -106, 119, 126, 101, -71, -15, 9, -59, 110, -58, -124, 24, -16, 125, -20, 58, -36, 77, 32, 121, -18, 95, 62, -41, -53, 57, 72 }; - public int[] FK = { -1548633402, 1453994832, 1736282519, -1301273892 }; - public int[] CK = { 462357, 472066609, 943670861, 1415275113, 1886879365, -1936483679, -1464879427, -993275175, -521670923, -66909679, 404694573, 876298825, 1347903077, 1819507329, -2003855715, -1532251463, -1060647211, -589042959, -117504499, 337322537, 808926789, 1280531041, 1752135293, -2071227751, -1599623499, -1128019247, -656414995, -184876535, 269950501, 741554753, 1213159005, 1684763257 }; - - private SByte sm4Sbox(SByte inch) - { - int i = inch & 0xFF; - SByte retVal = SboxTable[i]; - return retVal; - } - - private long sm4Lt(long ka) - { - long bb = 0L; - long c = 0L; - SByte[] a = new SByte[4]; - SByte[] b = new SByte[4]; - PUT_ULONG_BE(ka, a, 0); - b[0] = sm4Sbox(a[0]); - b[1] = sm4Sbox(a[1]); - b[2] = sm4Sbox(a[2]); - b[3] = sm4Sbox(a[3]); - bb = GET_ULONG_BE(b, 0); - c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24); - return c; - } - - private long sm4F(long x0, long x1, long x2, long x3, long rk) - { - return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk); - } - - private long sm4CalciRK(long ka) - { - long bb = 0L; - long rk = 0L; - SByte[] a = new SByte[4]; - SByte[] b = new SByte[4]; - PUT_ULONG_BE(ka, a, 0); - b[0] = sm4Sbox(a[0]); - b[1] = sm4Sbox(a[1]); - b[2] = sm4Sbox(a[2]); - b[3] = sm4Sbox(a[3]); - bb = GET_ULONG_BE(b, 0); - rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23); - return rk; - } - - private void sm4_setkey(long[] SK, SByte[] key) - { - long[] MK = new long[4]; - long[] k = new long[36]; - int i = 0; - MK[0] = GET_ULONG_BE(key, 0); - MK[1] = GET_ULONG_BE(key, 4); - MK[2] = GET_ULONG_BE(key, 8); - MK[3] = GET_ULONG_BE(key, 12); - MK[0] ^= FK[0]; - MK[1] ^= FK[1]; - MK[2] ^= FK[2]; - MK[3] ^= FK[3]; - for (; i < 32; i++) - { - k[(i + 4)] = (k[i] ^ sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i])); - SK[i] = k[(i + 4)]; - } - } - - private void sm4_one_round(long[] sk, SByte[] input, SByte[] output) - { - int i = 0; - long[] ulbuf = new long[36]; - ulbuf[0] = GET_ULONG_BE(input, 0); - ulbuf[1] = GET_ULONG_BE(input, 4); - ulbuf[2] = GET_ULONG_BE(input, 8); - ulbuf[3] = GET_ULONG_BE(input, 12); - while (i < 32) - { - ulbuf[(i + 4)] = sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]); - i++; - } - PUT_ULONG_BE(ulbuf[35], output, 0); - PUT_ULONG_BE(ulbuf[34], output, 4); - PUT_ULONG_BE(ulbuf[33], output, 8); - PUT_ULONG_BE(ulbuf[32], output, 12); - } - - private SByte[] padding(SByte[] input, int mode) - { - if (input == null) - { - return null; - } - - SByte[] ret = (SByte[])null; - if (mode == SM4_ENCRYPT) - { - int p = 16 - input.Length % 16; - ret = new SByte[input.Length + p]; - Array.Copy(input, 0, ret, 0, input.Length); - for (int i = 0; i < p; i++) - { - ret[input.Length + i] = (SByte)p; - } - } - else - { - int p = input[input.Length - 1]; - ret = new SByte[input.Length - p]; - Array.Copy(input, 0, ret, 0, input.Length - p); - } - return ret; - } - - public void sm4_setkey_enc(SM4_Context ctx, SByte[] key) - { - ctx.mode = SM4_ENCRYPT; - sm4_setkey(ctx.sk, key); - } - - public void sm4_setkey_dec(SM4_Context ctx, SByte[] key) - { - int i = 0; - ctx.mode = SM4_DECRYPT; - sm4_setkey(ctx.sk, key); - for (i = 0; i < 16; i++) - { - SWAP(ctx.sk, i); - } - } - - public SByte[] sm4_crypt_ecb(SM4_Context ctx, SByte[] input) - { - if (input == null) - { - throw new Exception("input is null!"); - } - - if ((ctx.isPadding) && (ctx.mode == SM4_ENCRYPT)) - { - input = padding(input, SM4_ENCRYPT); - } - - int length = input.Length; - SByte[] bins = new SByte[length]; - SByte[] bous = new SByte[length]; - - Array.Copy(input, 0, bins, 0, length); - - for (int i = 0; length > 0; length -= 16, i++) - { - SByte[] inBytes = new SByte[16]; - SByte[] outBytes = new SByte[16]; - Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length); - sm4_one_round(ctx.sk, inBytes, outBytes); - Array.Copy(outBytes, 0, bous, i * 16, length > 16 ? 16 : length); - } - - if (ctx.isPadding && ctx.mode == SM4_DECRYPT) - { - bous = padding(bous, SM4_DECRYPT); - } - return bous; - } - - public SByte[] sm4_crypt_cbc(SM4_Context ctx, SByte[] iv, SByte[] input) - { - if (ctx.isPadding && ctx.mode == SM4_ENCRYPT) - { - input = padding(input, SM4_ENCRYPT); - } - - int i = 0; - int length = input.Length; - SByte[] bins = new SByte[length]; - Array.Copy(input, 0, bins, 0, length); - SByte[] bous = null; - List bousList = new List(); - if (ctx.mode == SM4_ENCRYPT) - { - for (int j = 0; length > 0; length -= 16, j++) - { - SByte[] inBytes = new SByte[16]; - SByte[] outBytes = new SByte[16]; - SByte[] out1 = new SByte[16]; - - Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length); - for (i = 0; i < 16; i++) - { - outBytes[i] = ((SByte)(inBytes[i] ^ iv[i])); - } - sm4_one_round(ctx.sk, outBytes, out1); - Array.Copy(out1, 0, iv, 0, 16); - for (int k = 0; k < 16; k++) - { - bousList.Add(out1[k]); - } - } - } - else - { - SByte[] temp = new SByte[16]; - for (int j = 0; length > 0; length -= 16, j++) - { - SByte[] inBytes = new SByte[16]; - SByte[] outBytes = new SByte[16]; - SByte[] out1 = new SByte[16]; - - Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length); - Array.Copy(inBytes, 0, temp, 0, 16); - sm4_one_round(ctx.sk, inBytes, outBytes); - for (i = 0; i < 16; i++) - { - out1[i] = ((SByte)(outBytes[i] ^ iv[i])); - } - Array.Copy(temp, 0, iv, 0, 16); - for (int k = 0; k < 16; k++) - { - bousList.Add(out1[k]); - } - } - - } - - if (ctx.isPadding && ctx.mode == SM4_DECRYPT) - { - bous = padding(bousList.ToArray(), SM4_DECRYPT); - return bous; - } - else - { - return bousList.ToArray(); - } - } -} diff --git a/Tiobon.Core.Common/Helper/SM/SM4Helper.cs b/Tiobon.Core.Common/Helper/SM/SM4Helper.cs deleted file mode 100644 index 88b24d92..00000000 --- a/Tiobon.Core.Common/Helper/SM/SM4Helper.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Text; -using System.Text.RegularExpressions; - -namespace Tiobon.Core.Common.Helper.SM; - -public class SM4Helper -{ - public String secretKey = "1234567890123456";// 16位 - public String iv = ""; - public bool hexString = false; - - private SByte[] Byte2SByte(byte[] myByte) - { - sbyte[] mySByte = new sbyte[myByte.Length]; - - for (int i = 0; i < myByte.Length; i++) - { - if (myByte[i] > 127) - mySByte[i] = (sbyte)(myByte[i] - 256); - else - mySByte[i] = (sbyte)myByte[i]; - } - - return mySByte; - } - private byte[] SByte2Byte(sbyte[] orig) - { - byte[] arr = new byte[orig.Length]; - Buffer.BlockCopy(orig, 0, arr, 0, orig.Length); - - return arr; - } - - public String Encrypt_ECB(String plainText) - { - SM4_Context ctx = new SM4_Context(); - ctx.isPadding = true; - ctx.mode = SM4.SM4_ENCRYPT; - - SByte[] keyBytes; - if (hexString) - { - keyBytes = null;// Hex.Decode(secretKey); - } - else - { - - keyBytes = Byte2SByte(Encoding.UTF8.GetBytes(secretKey)); - } - - SM4 sm4 = new SM4(); - sm4.sm4_setkey_enc(ctx, keyBytes); - SByte[] bytes = Byte2SByte(Encoding.UTF8.GetBytes(plainText)); - SByte[] encrypted = sm4.sm4_crypt_ecb(ctx, bytes); - - //String cipherText = Encoding.UTF8.GetString(Hex.Encode(SByte2Byte(encrypted))); - String cipherText = new Base64Encoder().GetEncoded(SByte2Byte(encrypted)); - - if ((cipherText != null) && (cipherText.Trim().Length > 0)) - { - var matchCol = Regex.Matches(cipherText, "\\s*|\t|\r|\n", RegexOptions.Multiline); - for (int i = matchCol.Count - 1; i >= 0; i--) - { - Match item = matchCol[i]; - cipherText.Remove(item.Index, item.Length); - } - } - return cipherText; - } - - public String Decrypt_ECB(String cipherText) - { - SM4_Context ctx = new SM4_Context(); - ctx.isPadding = true; - ctx.mode = SM4.SM4_DECRYPT; - - SByte[] keyBytes; - if (hexString) - { - keyBytes = null;// Hex.Decode(secretKey); - } - else - { - keyBytes = Byte2SByte(Encoding.UTF8.GetBytes(secretKey)); - } - - SM4 sm4 = new SM4(); - sm4.sm4_setkey_dec(ctx, keyBytes); - SByte[] decrypted = sm4.sm4_crypt_ecb(ctx, Byte2SByte(new Base64Decoder().GetDecoded(cipherText))); - return Encoding.UTF8.GetString(SByte2Byte(decrypted)); - } - -} diff --git a/Tiobon.Core.Common/Helper/SM/SM4_Context.cs b/Tiobon.Core.Common/Helper/SM/SM4_Context.cs deleted file mode 100644 index 88f356c9..00000000 --- a/Tiobon.Core.Common/Helper/SM/SM4_Context.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Tiobon.Core.Common.Helper.SM; - -public class SM4_Context -{ - public int mode; - - public long[] sk; - - public bool isPadding; - - public SM4_Context() - { - this.mode = 1; - this.isPadding = true; - this.sk = new long[32]; - } -} diff --git a/Tiobon.Core.Common/Seed/DBSeed.cs b/Tiobon.Core.Common/Seed/DBSeed.cs index a84e8449..5141343d 100644 --- a/Tiobon.Core.Common/Seed/DBSeed.cs +++ b/Tiobon.Core.Common/Seed/DBSeed.cs @@ -4,7 +4,7 @@ using System.Diagnostics; using System.Reflection; using System.Text; using Tiobon.Core.Common.DB; -using Tiobon.Core.Common.Extensions; +using Tiobon.Core.Extensions; using Tiobon.Core.Const; using Tiobon.Core.DB; using Tiobon.Core.Helper; @@ -106,7 +106,7 @@ public class DBSeed ConsoleHelper.WriteSuccessLine($"Tables created successfully!"); Console.WriteLine(); - if (AppSettings.app(new string[] {"AppSettings", "SeedDBDataEnabled"}).ObjToBool()) + if (AppSettings.app(new string[] { "AppSettings", "SeedDBDataEnabled" }).ObjToBool()) { JsonSerializerSettings setting = new JsonSerializerSettings(); JsonConvert.DefaultSettings = new Func(() => diff --git a/Tiobon.Core.DataAccess/ReportHelper.cs b/Tiobon.Core.DataAccess/ReportHelper.cs index b4cf81c5..488ec201 100644 --- a/Tiobon.Core.DataAccess/ReportHelper.cs +++ b/Tiobon.Core.DataAccess/ReportHelper.cs @@ -2,11 +2,8 @@ using Microsoft.AspNetCore.Http; using NPOI.HSSF.UserModel; using NPOI.OpenXmlFormats.Spreadsheet; -using NPOI.POIFS.NIO; -using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using NPOI.SS.Util; -using NPOI.Util.Collections; using NPOI.XSSF.UserModel; using SqlSugar; using System; @@ -18,9 +15,7 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using Tiobon.Core.Common; -using Tiobon.Core.Common.Extensions; -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Extensions; using Tiobon.Core.Helper; using Tiobon.Core.Model.Entity; using Tiobon.Core.Model.Models; diff --git a/Tiobon.Core.EventBus/EventBusKafka/EventBusKafka.cs b/Tiobon.Core.EventBus/EventBusKafka/EventBusKafka.cs index 1d97c2f2..7d593c7c 100644 --- a/Tiobon.Core.EventBus/EventBusKafka/EventBusKafka.cs +++ b/Tiobon.Core.EventBus/EventBusKafka/EventBusKafka.cs @@ -1,9 +1,8 @@ -using Tiobon.Core.Common.Extensions; -using Confluent.Kafka; +using Confluent.Kafka; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using System; +using Tiobon.Core.Extensions; namespace Tiobon.Core.EventBus { diff --git a/Tiobon.Core.EventBus/RabbitMQPersistent/EventBusRabbitMQ.cs b/Tiobon.Core.EventBus/RabbitMQPersistent/EventBusRabbitMQ.cs index 0d52fbc1..1b3cbf57 100644 --- a/Tiobon.Core.EventBus/RabbitMQPersistent/EventBusRabbitMQ.cs +++ b/Tiobon.Core.EventBus/RabbitMQPersistent/EventBusRabbitMQ.cs @@ -1,6 +1,4 @@ using Autofac; -using Tiobon.Core.Common.Extensions; -using Tiobon.Core.Common; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -9,10 +7,9 @@ using Polly.Retry; using RabbitMQ.Client; using RabbitMQ.Client.Events; using RabbitMQ.Client.Exceptions; -using System; using System.Net.Sockets; using System.Text; -using System.Threading.Tasks; +using Tiobon.Core.Extensions; namespace Tiobon.Core.EventBus { diff --git a/Tiobon.Core.Extensions/AOP/CacheAOPbase.cs b/Tiobon.Core.Extensions/AOP/CacheAOPbase.cs index a27fefa5..2c10b330 100644 --- a/Tiobon.Core.Extensions/AOP/CacheAOPbase.cs +++ b/Tiobon.Core.Extensions/AOP/CacheAOPbase.cs @@ -2,7 +2,7 @@ using Newtonsoft.Json; using SqlSugar; using System.Linq.Expressions; -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; namespace Tiobon.Core.AOP; diff --git a/Tiobon.Core.Extensions/NacosConfig/NacosListenConfigurationTask.cs b/Tiobon.Core.Extensions/NacosConfig/NacosListenConfigurationTask.cs index d10f69bf..f59c818e 100644 --- a/Tiobon.Core.Extensions/NacosConfig/NacosListenConfigurationTask.cs +++ b/Tiobon.Core.Extensions/NacosConfig/NacosListenConfigurationTask.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Nacos.V2; -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; namespace Tiobon.Core.Extensions.NacosConfig; diff --git a/Tiobon.Core.Extensions/NacosConfig/NacosListenNamingTask.cs b/Tiobon.Core.Extensions/NacosConfig/NacosListenNamingTask.cs index b67c438c..b0df4031 100644 --- a/Tiobon.Core.Extensions/NacosConfig/NacosListenNamingTask.cs +++ b/Tiobon.Core.Extensions/NacosConfig/NacosListenNamingTask.cs @@ -1,7 +1,6 @@ using Microsoft.Extensions.Hosting; using Nacos.V2; -using Tiobon.Core.Common; -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; namespace Tiobon.Core.Extensions.NacosConfig; diff --git a/Tiobon.Core.Extensions/ServiceExtensions/NacosSetup.cs b/Tiobon.Core.Extensions/ServiceExtensions/NacosSetup.cs index 1e8c5049..2b9bb58f 100644 --- a/Tiobon.Core.Extensions/ServiceExtensions/NacosSetup.cs +++ b/Tiobon.Core.Extensions/ServiceExtensions/NacosSetup.cs @@ -1,9 +1,8 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Nacos.V2.DependencyInjection; -using Tiobon.Core.Common; -using Tiobon.Core.Common.Helper; using Tiobon.Core.Extensions.NacosConfig; +using Tiobon.Core.Helper; namespace Tiobon.Core.Extensions; diff --git a/Tiobon.Core.Gateway/Helper/CustomJwtTokenAuthMiddleware.cs b/Tiobon.Core.Gateway/Helper/CustomJwtTokenAuthMiddleware.cs index 4608939d..b3dbab09 100644 --- a/Tiobon.Core.Gateway/Helper/CustomJwtTokenAuthMiddleware.cs +++ b/Tiobon.Core.Gateway/Helper/CustomJwtTokenAuthMiddleware.cs @@ -1,9 +1,8 @@ -using System.Net; +using Microsoft.AspNetCore.Authentication; +using System.Net; using System.Text.RegularExpressions; -using Microsoft.AspNetCore.Authentication; -using Tiobon.Core.Common; using Tiobon.Core.Caches; -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; namespace Tiobon.Core.AuthHelper { diff --git a/Tiobon.Core.Repository/BASE/BaseRepository.cs b/Tiobon.Core.Repository/BASE/BaseRepository.cs index 251a3719..c20135f8 100644 --- a/Tiobon.Core.Repository/BASE/BaseRepository.cs +++ b/Tiobon.Core.Repository/BASE/BaseRepository.cs @@ -1,10 +1,9 @@ -using System.Data; -using System.Linq.Expressions; -using System.Reflection; -using Newtonsoft.Json; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; -using Tiobon.Core.Common; +using System.Data; +using System.Linq.Expressions; +using System.Reflection; using Tiobon.Core.Common.DB; using Tiobon.Core.IRepository.Base; using Tiobon.Core.Model; @@ -757,7 +756,7 @@ public class BaseRepository : IBaseRepository where TEntity : protected Expression> CombineExpressions( Expression> expression1, Expression> expression2) { - return Common.Helper.ExpressionCombiner.Combine(expression1, expression2); + return Helper.ExpressionCombiner.Combine(expression1, expression2); } #endregion diff --git a/Tiobon.Core.Repository/UnitOfWorks/UnitOfWorkManage.cs b/Tiobon.Core.Repository/UnitOfWorks/UnitOfWorkManage.cs index 827010a0..b83c87c1 100644 --- a/Tiobon.Core.Repository/UnitOfWorks/UnitOfWorkManage.cs +++ b/Tiobon.Core.Repository/UnitOfWorks/UnitOfWorkManage.cs @@ -2,7 +2,7 @@ using SqlSugar; using System.Collections.Concurrent; using System.Reflection; -using Tiobon.Core.Common.Extensions; +using Tiobon.Core.Extensions; namespace Tiobon.Core.Repository.UnitOfWorks; diff --git a/Tiobon.Core.Serilog/Utility/SerilogRequestUtility.cs b/Tiobon.Core.Serilog/Utility/SerilogRequestUtility.cs index 7d22d4de..e14c11f6 100644 --- a/Tiobon.Core.Serilog/Utility/SerilogRequestUtility.cs +++ b/Tiobon.Core.Serilog/Utility/SerilogRequestUtility.cs @@ -1,4 +1,4 @@ -using Tiobon.Core.Common.Extensions; +using Tiobon.Core.Extensions; using Tiobon.Core.Common.Https; using Microsoft.AspNetCore.Http; using Serilog; diff --git a/Tiobon.Core.Services/TasksLogServices.cs b/Tiobon.Core.Services/TasksLogServices.cs index dd14d08f..1954d946 100644 --- a/Tiobon.Core.Services/TasksLogServices.cs +++ b/Tiobon.Core.Services/TasksLogServices.cs @@ -1,4 +1,6 @@ -namespace Tiobon.Core.Services; +using Tiobon.Core.Extensions; + +namespace Tiobon.Core.Services; public partial class TasksLogServices : BaseServices, ITasksLogServices { diff --git a/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_URL_Quartz.cs b/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_URL_Quartz.cs index 7790f2ae..2f7a30ff 100644 --- a/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_URL_Quartz.cs +++ b/Tiobon.Core.Tasks/QuartzNet/Jobs/Job_URL_Quartz.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.Logging; -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; /// /// 这里要注意下,命名空间和程序集是一样的,不然反射不到(任务类要去JobSetup添加注入) diff --git a/Tiobon.Core.Tests/Common_Test/DynamicLambdaTest.cs b/Tiobon.Core.Tests/Common_Test/DynamicLambdaTest.cs index 96ed7cf5..43c003a1 100644 --- a/Tiobon.Core.Tests/Common_Test/DynamicLambdaTest.cs +++ b/Tiobon.Core.Tests/Common_Test/DynamicLambdaTest.cs @@ -1,10 +1,8 @@ -using System; -using System.Threading.Tasks; -using Autofac; -using Tiobon.Core.Common.Helper; +using Autofac; +using SqlSugar; +using Tiobon.Core.Helper; using Tiobon.Core.IRepository.Base; using Tiobon.Core.Model.Models; -using SqlSugar; using Xunit; using Xunit.Abstractions; diff --git a/Tiobon.Core.Tests/Common_Test/HttpHelper_Should.cs b/Tiobon.Core.Tests/Common_Test/HttpHelper_Should.cs index 6d58281a..d947a4b8 100644 --- a/Tiobon.Core.Tests/Common_Test/HttpHelper_Should.cs +++ b/Tiobon.Core.Tests/Common_Test/HttpHelper_Should.cs @@ -1,4 +1,4 @@ -using Tiobon.Core.Common.Helper; +using Tiobon.Core.Helper; using Xunit; namespace Tiobon.Core.Tests.Common_Test