From 81e6b86b675f4bdf260b48b5505894cb52845bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E7=90=A6=E6=B6=9B?= Date: Fri, 2 Aug 2024 19:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=B9=E6=8E=A5iam?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/bamboocloud_Codec-0.0.3.jar | Bin 0 -> 75070 bytes laws-modules-docking/pom.xml | 9 +- .../docking/iam/chery/EncryptTest.java | 24 + .../iam/chery/entity/AttributeEntity.java | 40 ++ .../iam/chery/service/BamboocloudUtils.java | 87 ++++ .../docking/iam/client/TestClient.java | 16 - .../controller/SyncIamByCheryController.java | 451 ++++++++++++++++++ .../docking/iam/dto/IamCommonAcceptDto.java | 5 +- .../docking/iam/dto/IamOrgAcceptDto.java | 55 --- .../docking/iam/dto/IamUserAcceptDto.java | 73 +-- .../dto/response/IamOrgCreateResponse.java | 2 +- .../docking/iam/service/SyncIamService.java | 246 +++------- .../src/main/resources/application-dev.yml | 6 +- 13 files changed, 699 insertions(+), 315 deletions(-) create mode 100644 laws-modules-docking/lib/bamboocloud_Codec-0.0.3.jar create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/EncryptTest.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/entity/AttributeEntity.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/service/BamboocloudUtils.java create mode 100644 laws-modules-docking/src/main/java/com/jero/modules/docking/iam/controller/SyncIamByCheryController.java diff --git a/laws-modules-docking/lib/bamboocloud_Codec-0.0.3.jar b/laws-modules-docking/lib/bamboocloud_Codec-0.0.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..3d57fc3038437523c38373fa107b9eaa922b820b GIT binary patch literal 75070 zcmbTd1C(t~lIUHxY@4@i+qP}nw(Y80wr$(CZQZi%s_%AB&%Eyco9TJ$JL{aCXPpy~ z5ql-}FC#MLB!Pe-0si)~_Iy|P`ir>|x?D z3=c!zu0y`|lauNJdLL#g+O5s44d6e$`{VFmZUXp^cZRms|KHO6P^#4ZZk5AUNHje+K^;b){|3=I3FBbo*OZ>m; z8kpPYJGlQF^Z$DlM&_o*j!yrk3ex}83oCsaQ)his<9|~L!T(x`jq$&8;(yn7v}XDz z`?7y&aJWDA|7#Rj>$@1+{2O7`|6BM^L(>@OTmNU*qWODg`R8AB|Jr^2>Vf$G|4RSK z@L$Y;|9zw&MoRTwf&u`vzyJXJcMbj@uJH>i3Yy!Q89UGzTIoAFMyskDVlAP3Ra3hg z8SeuVbx!U&ZcxX^A=pXni9DuB=DGBWqD3>Kfh12sQP}-r0f8kjI2Ov06&>t3OK1W zm{@aKt|w_R=^sB>InkwwqYriJDC{Dw`sj3&3QJF=M`mYp*O=mfSObct+eTXkzeSh| z=$)7SerW4kyg3b@8;hg&m$Mks8z#qC){2sV*r4D{Ka?^z5r)%?M&? z8vYaZzyyS~D!j5qeTbTk0Dc$$)?JkJ`8*?w4hb$GwBkf0)=%OxDx3Orn%rAw_oazG zDe^(bP%^}p<~1y$AZ-4U!40rupdh=bKD#Or+LTA)P;Dhq=~B@ix@GQ?-E*{-DFGjD zW>8yi)zHt|Iac$kUb#zXRv33caS+n9qw30ibd$x#<0G=DVz%*C zIDNI;tdLF+|AGvU)--=LP7!;FKJUUgA<>@F3DOe ztBh3_v`mvG89b35v#1&EugFgiBgl6iCLW{DWfH8(4$Rh|3^nSOe;^k}G*Tz*$*bdF zE--3MG*m`pX0Rw}B(d!9>-^weXamJ^bX9A4h(B7jp~eE7vs4{F)2`fuauPH#s8r_SE-Q?WUT zNfHo@W$^@)G5fAF;(G7h=Gvj`#3pAIOJ}5M4&DILr`L9YSz{RW1DsdohRsvSk&z<% z*B)fOL%falaex~%5Tp-*-Gs)hIj7>-5!e)aM$Kz~`G;j&uh_O-Qts%a!x-d6M>?fi z|6vkInXcKr1+4|) zJs7$*lx;1j^2sqLhJxn6)9=v0j4nlqOQFzf+8mgyVFmNJuy>^@Ums?DI%ME>+tcS7 zPyt@5s$I6iSjU|cH|{v9`Pd+$zRv^#Ic*f2uU3v|u6k%WFm0C$jy|GETh+To}q=`yuXFp=kCt{K??p231S-nXDT$8eGm<9222 zQOVv0q9HzS#`vUzql*w&p~STS>YWDHjW&;{7EW9ubT(Lj)Bjz|!nLD2nz?icbI}0C zBGh8>iC)4~+d}&s;*dBmx6^(J{4+s=Cq|F}1(JqeHh7x05BvO*B!{AV!x0Dfx+-75 zBV}R2&5Gj=#Anpg#tuQ2CaUUaS@U?A;9AM8e7Gv3O&pMUb72W zZ-yv2#pm<9ikRkN=M_2jO{4_Oytbn%7Q>O|*;LS0eITgD{&Tgd<-!IuZCV}NTrZU6 z*g#Py1O*ec*jFR*SPL|WZvl+z)4B}d+$3=tY0V)4Q0Ebi_2pukSidu6S_|t(D9Q? z3Yrnvl39ToSy*s_Y6aQX+V8W$L>2Yn{$eg?s+V84TFetqzkj=`9sk=45Q|CNB?3WKv}pskPzb%*DI$ zr@b_|65a_m+dAr&>xrG}&Q~BH^Bj9%m&>{oY>QmkfP{$^xB2sVcx7I`MDKtYu*%L> zTg#de>lfMbXf6@r>fmYt}lXzRw=+=2Z%VkzB-5|!zuYtje!i%W+1f=$t- zoOX|&>M*t+SOwFfUU2VxX&O^|LxG@3yDXjrI)fTzG3nc5BYDrgKn=Hn2{4PuPHTXa zG<|%X6OA#{1vIsccU_@P9hslATSLGjAm#7PvRcDg$PON+%@7zs<$;i`LuC44^z-o- z2kMkcmnhrC8`Mqw+&K}?{)ns#W;}*W24@g>fvx}!fjxAobQLz1{1V0xoGZH>Ow3ub zS|S_ll?Dh-S`;;;@nZ!Om@S)rZODEo@FUQ2ea2?+Qijw_>)OS00ajKe)>Yh}Wf>?| zx@MFqbkd2{tb0$%0EY|C7bU^0h2<*!nhy$oSA|hyP=Jr)rE3?5Z2|4zbHED}To4E4@ zl_tnrkgdvC5)jkZ@-|A{#B-soR9OevGw4$rOxW?uO!Zj_)lvptu~Nr$6>61I>hKr} zcxuIjo57Bc=VB*mQ6Zl8cn3r{?PbZWci%PdHHLCjo}V|IzQZSvdx zU}GSd4j_OTHto{m7-qKz=po1_!0k~n^d>}1gYc&0o}BNTaITQR6Br2*GQA_r(1t-+ z(TadLc^MSnJHvCV@y)}=mJVSq1Utl=ZPSYMgvJ>v@gPy^;u~V|{1y?$I4$!GvufSa zE6LWdmCLhQyztr|G3U+MJIN@4zfb3t1X#^q5^qDS4EwU z7)P`YHzvqZE>Oy{Ss1L?pa7AFnO8#YLT4-8=sb0@r__^RX7?{J@sh~a367W(Eb`=3D3laI z&g=p~ZtJRDvi)ji_JYSFz;KJF&tT9lzw&8&BE;mO$Y^2}lq=jlz~u37aI(~t$pp-s z)k|A4HiDeKMaH3mp$G7nwRl11nQC8EkzL1Twsw><(81Cu)Fw5DAH{PN@nVD+Zf3k- zL2(YFfG`<3!q!futwRv}IJ6)(kCGHNA*M%BYr5H;DuN8X4nZXBkSs8_j=RxXyfN-1 zJC#gxEVGMYY`;@?e^P;Mv(=wJC&Q4efr_Veu{BX8QW9AMKQeP^R#tY$*z^+F180T8KRA)qB zou@Dnzm+2L!{{W~IBk(Uk%v~Y@KPOkzVSXPD^U=Mm$GPgkJY@W5Ke!|3&9&pu2@gz z#OSSfDGSI!ej4mQVg8T`DJ(1`i%SG~YYSo3kB-n~xSTu+i_o3uOAgC?uL=>Z4Pjnc z7@+!&U?3*7vC(z7@(a+weL_$Nj<0BUs~kJv8`?>&@H{4v=~7|AVSGxDrDyy&BU&K{kS`U&M!5Op)hSG&VfQnOe3TxgT;*MvoIfA$ruh6Pq$;a~J|uZ9j(I?_Vx%*fR89boguyxXAy zwT@y;{-T)A?pY3w)C6|U>KN57W+`p*oaq$QmaXma{1~#VP<~YGu7Vg-C@#Ar0 zy;KI;!d?2tR47SU+_-!Bzho1Wc857)YZn$Bv!m%@gB128?s#8~LuDqdUi&|T;tD-- zUEq;?K)R5dISmE%4%>h#VJH^Er8NbLuA zL&U0W(0P6h_h8Y=4{Y&Oq+*NBN?@Co4qOn9j8!7Z%$;dV4&_%Fs?V@%Q;ZhQKUC0d z)xgGQtzB9hyzC!Y+GNyfYM=&@sw6 zT0^d2k=|yBf9N6d+L#g1>qNRiHT3LS&1z=Sg!u~F2MTWQARixL?tr3V04p9QR~Zya zw(7GwRIoTCxWKO$6i!(j&%nuOz2NxFv`A2V`m5jf)DW%U;RI0OAASwSg<7`k&0vpp zehEmo+)2MqpO?L!7sYpT($`#jM0h`6$1IyNf)c+%63H+as z%0Gh^=cDZk4=5-o5-6?lhgIcL!jwbvf z76_a`P=tYeDhBHLJ~9S6?cKf#Di#h9gg~AaIu7#2KYkhK?FIgVr6C`mlx!JBo*P64 z!~|?aGytzLl=1M9HxU=9)-|x9APfuxRe{m!do2?mxo?5D@`k$$>|p>Zvr7?G4I@nvFCgsojhCL<{Pep2P~o z2sa$iz{wNkl4k{=$f=8F+Y`BGiAb5H-#!|pOi)oBwA}!EMCn!=8FeN1BJ zDo>q=Muhy)asYc5_scn@9CP9-fVXO5&0L;f9}9DNPT$HEPj@7RG6MxlP(tRKgpga&!~V#MHNd}+ibdisi5ck{aH#ajwxkWgU?13puYF(!-FGB4pf5HpV(C+BbD`^3gHiEoQtTJ+=@dqX)g5QIv zh^yp|32|iQJc3J678iNjvk4M5nv=+ICiMdo=H!~A@WencDAV26m0p4+TvWU7@MQs~ zc6)Y}0-8!z0YJZiz2I)8vz!RGrBjdiL`|(lP|EV7dFriD2+bNC{NqF*eiDS?ivS1y zLZqAcnHt%o!X%%exuaJCY&L2Gd67XczcoFkZk+xB^M&VDjHzr)zcux15@J+8TW|&D zUb)#on3Y!()Z%wg!94!;B~%;~wc?M%C2z z_8#3HghXlut3mN3&zQvTJ`Jwm688_QfeiwM(Nl)QYYZ;QI}M-9RCy-LR=0j*V|roN zA$C|W7D1*GkYK|@;zdpl!snX;vW*dl5S~y zk!ewx#gGwB*KNgnHH|>iPA-^*Y$LJ;xpA! zHN{>-H&u2f7mcK{Z=F5*zhX+w?q#G}t-P%Xaf0Rgwy*A8jT=X`3d!5qPOZk)qp16wht~oEw$1oI{S^E@Q%lTRhd~ zy~c6}_MWBJfzHS)*3TkoriBu+u2K!KB4MInh>S7_8&8%NkUSb0che(-l48t05*NSrZl?DPQOyNy5AwX_=a^= z6nG~CrP$lm-V&SvNw#*lW4JoLKuZfsqs`r6zyj0i*-kKMlK|12O$opZly$OrqdVOr4O#9`CH1T$j}@cvbYXWpKRTXd_AU8r~k zuigejyHBSxjD!A@l5lVwe|-68h}m+KrZ}emM7+FT z7AKyZ#Bp~|awuvdnmnPi^Q(oR&A;8Mq+bf@2d(99MPQ8Esd zNwA7>EJ?i&!0EiA+KvYd49ZEhtzrw(YFtV>U7*Q?!dMl9*evjLa2=y7;IC@JcE3u% z#HqVP9}oi;h&j$6_|sytnK|x+L?4Z*tUwV64(a^SNdySa!OKQsC4Zj5uw~LyAQ{l_ zS`h{Hxd*)!fgjr%1+R&#%VHB*wV@TI@d{eb&d6s@>#H6Q+ipkjYe zlw*;I|W(H_>TtA}NL^1kzNukT=mFCJZD-#d(6H zPC+FuX*WIsSQ0b1PsbHQ!y*JC1Y!gNrvvgHAMYIoxTEI;0!uwI+65e^W3U4fCjrI% z3!z>U1v)|e*)ZVrC-471rwj%EmMBzqGPn9qGKF$eJjC#kO*kq%jngR%w!=sXe-I&r zmfwI4f?TDct_-e64dIlQ+2BhLN(gGIjr@sJGAX?kGGsmK1jR5HK~uG>w&i_ww7JEe zC3tj&#!9oRGz}4rY+Jbok z3(Ebaw|H&=?ZF&dF;^2Za8Ah616>icPkrXHbf^l{Rn5Gm$s{WjP}PTaBb+QztEA*2 zRtrfFMnxv~3oavwpoKQKN#wnQ**k0fa)l_dJrH+kC-01>PR2@u(7U@fi2dq5Rh~Al zQ#F$6`8~P{B~aQwtoXSU_pG$kE~jqh=Zb1Nr@Taa@_9SQ$x|@lqWtXDIZSC>sZ8A) z6td;0fu;uSfdK^Cv7SpVG6-yTQ%+zC|4+6=f0L>vaB$v!nAwv$uU z*;@Hiyqb!9nv0J?$F~1kDy3meP&`$BK+8TN1Vd9}`KJ;+yP&YA&@+ff8GnBfy;a%X$7)UL5Pf8Xl*n3ClwOaV}F|l2#uBq*=zsAfPNgvk#7?21=^D_ zX}+YMd0aq?K7C!Wb!7Qhtz1r(R&BCDcmO4Eh47=t&>IDavtECd{thhTpfrdZXY!a@ z`j6wMK0BdvRXgV71WI%io>bG9fa<0P?tXAH3*RoBXvD+?&)6Qf^PAHVmmFLiXFXz- z3AH3(fnvV^%eg_SpuuEby1pkPHBO^WLULPp6E0X}t3SKct{!}}x_gF@Q)>HMZq(cHveJk7DzkqnyhezIN3tpisSlgO|Z1A8$dcOdv5DZsVi$s z3d*f9Xp|J$OTmdELl^2nj?T8enVf~{K_eCH{Z@NvX{TwYW2vKv5HrtIPRaj^tlc$(;fLiI+AnIJF z(Z=KI>yR0)Vkl(w&$Bo!b0bhqjNsDZCj2Qt6y*!y;uyiC$cWa78CN`(Q*q)X^PW*0 z84k%51>z9dwXYQ8=5qauRz3wb~Ie1rp=53#jm~t8dnIY1B#G7L=pqVFuy3Nntk$jOI|R5NI_pH7#E3AlCT(O zP%?YuZk+b3-J)epF$44YhlB#(P)6LVqK;F?!$GUV-adrVP6%cwUtnbDZ#R^El{6Oy z-gT3x3Xam37JQ+*FqB9_!cgRpI76S!i$&2O^Tzo2*xn48u;)(J!>j)7rYV&L!#2tJ zN=LgB9HP?^hP-LEw-7^UHiRkShWWa3M-9hF_9=6xUb+$EQhAWgD-2Uu8mhSXxX6^j zS==0x_~%{dw!v3jvFirZV3c?#o1Vieqk3R#ITgU><@`#IZGXfYksCxWbZ#Z1iGA&j%^6xd z;f6CX&9O#4a{I;6v4A^L-5!9>kp%(~-sKEiLKp*=vW-2`jjv@*Rr+EG-FRz5?{o0t zRyTz;@@1fEPhC|?S?PirvrqFQ2p!uwLNWXxch;jO2Q0}NPo3B!F)ous;3N5N% zDsa<8-5|10{jxE64VrJLT;!GydxYhpPTZKKWXW%dJa3f()gDL*%pULRc*?Lmk@V2< zBt3UNO$*+@g`_8}EPZ@&QlE-)Rvg{=_P_>7<>u^~q;TCnt98|}s6W(Z8-{zaT;3KA zcX#STf4)1Y3OW)`R{jeEcnw0(Ev;@maJn#<3+}A z%G|7}7u0TPUATI$?A&gF^>o?o>soKFkvoLhra6|nXYFkKT+N{p^8~+Y_pfJ#W8a+4 zBM9DI2*5$tUixXfH6u3|B3tq9AUA9&#IH= zXc;t6>8oG3jvK#5N&$a*fy3;-PRyHzT>_!QpLjJlcp&%S_CXokH}W4b#_S+PIX_{_ zQ;&q%w2+&jj@G9$vCBjHGL$9J)V zcParucBFo6d3E?Z?uzKlJu@V+>Lb_;Gi(a1UJ2s$P=MND8QYEoN^KJUW)J@aC97cu zokjnO=)njypY$UQB@=;hJCZ*@_`sn>NK{^Yg}YNPQy%6OZ&J*Gpz8RM?{Jq9pTCl( zmG2ALYZY+moJePQz_dt1m^`^N@r&qIQmAs8=!To$17!jtz`mHF#0Zz#XK3`b!WQsf z`C7MdIrb0`0KgaI-=))~jhO$!)zOL@DhqtbTMM9o#9@aDHh=+tt^tsc$nuo6US<fPNP}U^qNk6Q!9m(<;FV#2K4!fzZ znM+Wy*NsDNA9|8VF*GJr0ZH~xD=3-)cU+*x#x|-^o#>e^t!#-<2~YTIVpeS*RrNvN zW@ly<;Q7y(;0wu?!+dyA`hJEuZ4!>1HC?80+O#Q9xcmIPJFh-GglO|I2v^YatoGMm zib5O$)BMr0ZT-HPFS0d~8Y3Ulmf^h6b<$>BU;ovq4S(3HrD#H0n^o@*hFsqe0BBjRLIsbgv;7KF4i$KMvxGV^(#0-Pl+c_~j=f4ixm9CKqV7VH`j2 zk&Lhv?kLYCvxF!XnQKJ3`z12h4lHb>x=taB(+C#L0+hzfBxX^Rl{?A~B3AR}{>dYE zR+2tC2>$7gP)>eedU{8QgvUXU2-CULFqF%wi17048sQyTYz2d)4N}T!7V5uG z@kx*cS#j}YnzP^&g8u9a>w^3InO+N9Tp&6U)fiac3T$He#-orp$<|-bD53iV9cNsn zOBf8Hz~=qq9#Qt2s4=6H{_Z)xl*dV*43t2cMW-DwTv-T`~T> zBECsC{=D3{B_*!1OlDC8@k)!mhyK@|B@o04Sbe!1t?yrk%4=g8UdW%JviN61^Z&f_ zMA4e@{~9V23P}9O+*v`;K|iF#03+apdOP)$Zj{wjAV4YrB7Z`;WQikT9wCr2BHMfv zxAKn%SdFC;l7DH;MPmGwli^onv!fL zFNzbXSj~2y#NV>WNVjD1={rj9PW5~9C~I}=q3q`Oo@q!6(BxZ(H;UFe6VkodrY zWh}|~ioA%h`Xl)+Doow1EMiwh(;Yu3GnJ*9!RWTYivBJ}pv!m_-vurMvLslb&@88X zLJ26Zn)OP;S6tVCwFR9nCf%KWXQ8QhgV89{W-sGVvXYI_J85m@_zilZcn|&?Qju9n ziR3wW7W6vCrC^fns8`X?A6d&zZe{vWD%=viY$Rr+fxn_7Wd+pqDn0zQY&%?H$~HfB zQnT{|%->3T9h?9eoERl~IfM`JZ>*HCfhtb$apj%U?@YxV0UhHKrK4-nv-NmLz65rV zP3lAjmmI0Ia@RN13BC#=1V9P~owWOihTILv<$x6P0wjVQ%5uYw^8iuEsUgNA8i~Hm z%0xAE^oW=1kvUT*tDbCLSQn0U@8)|{^_S0g{&m_9n&{X6{u5G}0s40#1VwA6f6nX$ zD^A$_ne(|5TJ6O$MYHb6Y7lj#1tVG2e@6T=^HUZ>^Opz%!Q?C$Ou7uefC%fMz@qRU z1iO(B!r9s8{Qg^Vk>d_86DDxWJ}IZ?6j=C`Xk_ z#J~jNMI3NHiFjdl1?tm-D;xkK;iLX_gE zVC>7n*tE$ge`uB)O4yyOAgD7$sy{o#yWrzzS+9t4h9oMDVU|sjz1uX3?{~g0UnLg? zIRd$N4+>YvT@>kMu(IQL-bF^U!1a^LIWUu7B_qV1{tTg9 zggwjL!iS6?AZkXEkpvb-RaDgl{MkGlm8JvNW@Y@{w=ho|idN9ixEDTsLkV8e!CVTB z4(;U~W-}_MCy*=)k1$$ArF`Bb)q5V}Pa?3$3e{~bUx4ketE)`Odd?Q}R?JEX^%`%i zMTYEplwekeeoN4`;w93|)U(!`W4X@^{t-`G35<8EzN3nhhiy47*57}b4WH5h2c-Y( zS%*Ob0HFVG0(1X)y29}9=Oq4d)K=4j?~7OL7+VM5kYbr-Al0#styf?8l?Wf~*d>(flL zL8WEfQ-xCxanp^yh31?Xvc=NpPFkKE3!wc^u2y(iJ+Qu(D;zY6)#1z&kfwpPeqa=eJx+m48|X%wPVV zN-w+MXJkiMF_-Je<(gSqU-HUjUw7xreQc6zEo$p%>S{7nb!st~g!s73%JTGVw>iK? zbko>yxr}LU6kf_kdvIytMzprR95nSts=@bk`X|7bZ61fE4ChscB*4~gNWHB1+QJME4$F;$b6dkMR;H<4H2?2cm zK_;B0!Tcs~S;O*T4>x|&@gzjCO;67OKO;2dZv}pp zknnx7j%&MVsJ#-61NY&;hw8X)Z4X#hcjL=C;#d}FWH?0oMbqI z5yMepjd|ukYfF@bmU``K1eT6FplL`i@F=%Ed;iQ*-m2rn46y5rF{ymI z(?XRY8*?0%k$GPwe*Fx^w*$|!R(7{ILeN=-XH9im-$c4Ez~Jk00I4j_E$Ylb5Sz8-f^o)|h&1n~GIalh99eP{v7mbXg+h57))Z z8w2118=`Be$Ff^1uf|WixoYkldEzqvC}-$4uQ^jFuOh5D=k-Cbey9Z?lCk4)wwhe72`e9n zx+C!Pde@ri_I(EAe+pbh=YJAhp`l%-++5G+dlNrTL_8^PsumR2ej}SVEpvC42O=f+ z1$x$HVp9UV%Ce1ubn4!o+UhT{*0KBqqA6D4 zS5cR&KhMjSmhqGPi&RT{92&ZZ<^|&0CP}2B%JwL^^bHZ3>QdL8gtO{+YMJHmlDVqAQ?#oGL>C$-dCOjJBNAEpG&rt$6xV&xa+&Sse# zFJPvu)m`{;idm-!(90op2d1IU2F<0*leNdYRGsc5&VGm)8*#l*XS>8H+ohF!vmAH@ zo9d9vR5~YUyhFd~E=7dCvrHuTcV07}yZEr#IAFJrkxy61zvCW-cux#>GHT&}Vm@_$ z;j4D58&yH!EMpL#bVfEF(9G|2MK<2FZOK*xCC>!eHqJW^o=NfCUa9_}3B;cu=Qq>pT_o-Bf-detT&ExZ*uf9t1@|CV; zJ+9dO9&r5#C=`lydkm9}eR&is!zEuJJoJAOVOofSV} z_42<PoJL}_N`eHv?OI@rgLGIY%Gn@60KLT(hl1`AzC&t9 zu3FRpwoe!gmdp|%&q$OP4PxsZ^oUnJ|R2E1R zj$S0POMq$CWkadO=?XJa9EfPf8W8iPPnhZ|)l2duDp4{qM8=Ap;*fsncjk9Y0J~=M z;^uhmVXfowHSJ&gq1=`_B<1Y4;&~;5_ucdIl+Z!z^)B$B7LCBPnNr7gO`qZ*L3Q0+ zG%e627Q&5nu}AX(wX^DLJk>d&`i|zs{1xqdhubmsenEnl3;W&I?Geb(vMT5^ltMT% zr#VotzngltFLov(!j<|9Q7RlQR-9Z$5+gg#Au|r(IOV4fDo_t$S+c5`-amcG=$tJJ#ouvAhT7H!=ma+s?bwbYYHPYyL;&bC3t6w${ zlCf5aIu1C=(hfpb2?Y*4QHaGv1crBhQsQM?;xIE34PJ2?-BcTg#B0R9eAcSQEuBMn ztGw~tcZO?}*J2%=lsI?YPUEyik_$#XDg^SEI;YDjqx@Ck9*x#_Va=i*O*HI*vg4@SN16RMUJuR3+bWN}A z%x4GwPgTID#SAtc!9)I0;O>r?D27I65G)_ zv!3so+@vZ7$*TjrqIY_26`BFBcR{+pnALiR*@iH3L7@&QNTDMothHa4SS%V|Dt$IW zhuBFHMxt@|@Stk7lP}}uu?0%WhIhVzxLPx=73CIN0`lHyGiNbfBo9K|A7~NekJ9hG zwKxSyU(F{sSBj_f6pyBz|T1dd>wB+&has7xf4 zCtXk@%n>f&imdg5%{XMQZLJlZ*6W$9WzICVWD9Nef+)BHjG0hfg`GZdf2Gh#OtF*K zF~NGl+)j*ii@dRJ3+hRpcnR0)n>jpx;WM!p^pWMdgM@mDSleGBUub6DO{HnZ;T0*m{ z=>-%^t8ra8j1!D;V9K?X7lF^@y0uWvda7w!$E<|&1!`~kXN9!Uk`O!H8F==A-R!IeOV>Ba|^&GmC9hTw9ve2J^FXDNVv`oTP&B^4N7az3r;Og!Y(v z15BaDohkjpsqZ)MWJYJ%=x^dq9^d(5ANt!u;F(+`GH3Y zcd*Ah#-jsX6pZ>ZJu$<+U(O(c7Iz_wJNjXGZ=Lx3%>CJ2hGg8P7)%dwc@J8)Ln$@; zl=p(CkuA2?pK5xM4ihjhLZ3!$eZ|h_39u!mP&!_}CL^|#eN)`ED9II0D9D@+OBDBP zL5IGVzCr(Wb)SHm9k}=>plb*X0KoG9yf*v$arD0*pZdoFO+`{pQ5F45Mu#;BN~cUu zzOfV;zbq(44KkldU@iawd=Z(V3j#q9zYf2YEh`2JZOf%NE2etg=0u8>f^nz}`iZ`Y zQMu!!Sdw!=cqj5IQ^xW=E5ovNShR_H@^|KS<~?usHSf20cjx0AgP#euydF|%Y*F#2 zJU51Pk%3~_nmzBW69xN#Js0l1D3Ulg_c0v0pd1ak9k^M-8~qk<5h>|M-iZ-cvivUM z4fm?*@>q7OkU7XzDAS1qCMfj!lIu@w45%k3*eGXMXeSY1E5g1_kDrKF8tQQ1Y(Sm^ zhL3;-HGJ~FY#2Ql7%OF`hA)x%Qo%5ZYSVJ%0Yf3uiR?0R)d8n~H;7A__#=Tkq-zBO z6aira_|w1)J2ngz!;J_Q@bzlSaE^+R>j3~|%gOvir<=>kf+$Rz{u~nRR(&Lizx`}j zm~-Q(6fM~YB05oN$&IPK@Z^CYAYhY5v*D=PYgerEONx9kQYA3WiGY1h zg_CLwSP8h!G+62;EIYeRnw3nrTl7je5QF>4A;;&T`Q%`jSf%zE&pma8dqnW)CNn~Z z+^lcU$zpv}z+coR==bms!i=9os&sau6~^Iiv$3@i_%|ddCJOO_ywzo{m3p<*3xmQ$=R?Gug%w#2S zdsT;iO2}WlA5e!Y&dl zxh6=TKE!y&8a7@7Dz3|HLWeENz}fWF=uQ!;3KKe7qHsq&9Wh;3{-UpWkgN0`t=C=kR0c*yw?g zY;t&$R9_eMNqf)-;(aDJwf0*OdOS(;gnr)Z%YmlLVw-iBte~?Wa;EkQV>{Kb^27dW zN*_yxAySpv9L&KS%#JRl84A|b-k#;&bF7wt1)_`Mz@Qel%j(=I#i|DC8yEKMOmwOLg~&CTD8+mZn37rp@z`vuh&eHpZQ4 zO%wZm^<+!#4Bd7ab6Z~or9c`@PVuai^HJobQ81AsEP3bieAqmL&ALZ@@8F}|mRP=K zZsR`cljr>n=;@rD!W&n)wO0sjcG?|orC*InjLEdY;B4Lo1_h7#H@P5~4v{rhM@v$R zJY+3|ru$R`c|f5WWKpjVRC)jl{+FL(Wz*-hw0QfiZi3AlTp_RV#f;b+q`4OHsU?wj zR$&jp-^!%Ip8t=xcMj4$TGlknwr$(CZQHhO+qP|USJf`twriK|>V5A$w|nmC= zI(ISjaLHi2VLP2NYtpFBp7vZsEzzX5n1 zd%zwI5gwy15!DbsE3OuDodc1}iTH_zII%Z_EXb(3cM}L+p^&ON@TNcoQ(M9CI7jt4 zj$>CC!7s52fzAd6s(LvDrWl~MFW60Sbb}ho53PfNT76v|bc(2YHmNLlN}QuwD9Q(N zAAN}QPOR6r5gl>Nt8CPJTrJA_fWTpsll6-IU+ctr!swrgzjfm9FHA=Fuht0(Q;+|s z53y?6%75#FE_XY!Pyld*T3usnmP0f|5t@jkKq+XYKm%p%6A5QXFk#{NfKd6NOW8Ac z3v=)53g3D--fAh=xiq>vB{O8lz4ln?( z#{3=v1er7Ren_J1k<+-09VP0C7hyW>Z6;Ilen=|oJ@tO{NfTIl0H6I9!yqPcHe5XU z$#hBW0P$QKyO@X}jQKHD{lG^Oc$kcOF(M-<6`0ecu~RLH?MGcGkB`(C_&IB*;;^3~O{X@5L6_9zx~tFXo9T!9gy9inUoYTOQQdw$Zbm=i}7BJYd5?S-9CvN@=x!;l{*; zh*2<`u7O=mW@rKq1TeRoNPCa#Xnf|L-qZ*Tm)Mfj$74oMFv1ez$L)87(FJbQmdum? z{ya;2+oH^r9fAx5mRF9Z(Zqy$Iw%oXlpr%MixzLfHt!=VlR&vvXSv z|Mj?{p~KQl88~9V(jx5)*)a?K97=Dn21uRFl#V*Z8OcB~cSlp57fm8Bc05j)>11*f zd-~N85N#vJt?onFK;Q8Ju{oTWQ`~uJ+)gz1&Dgy8L5`FpOUIOTX(Hd)p4Ss$k+J0n z9$mpFLqN7^sFjw1U2b}W%YWdZUa&PY4h4JiFajlwPttc8_wvaRpziUDqK~6#JLh0~ z$54*)Xo!`BrNJAk-Bn_YE@cZ=eitX22H7{y5GCAg8G$|e%cM)Q70_=&PlTTT)?d~5;|d~1%QI(?Va&v|lBl=Cx2#o>umCxIVQ zxBn)N`^mVmL;5Cac>DcMW2@MG^dM^oIokUPxv}GV-ka0vT{2GZ3uTn)i$y%&&VgnX z8RyF@$v8CcK%+7nr}}YyjlSYDQWIy6^O~G^kAcSnSC=EGItQC0%BmIEM6G$8eyV(L zal0#QgBBtls;z?f`v7bSQDeeb+;LTKMpvpWPOLuv zPxlX9A#T*h!xG?}g9})tb75LA3DbnuhyrBA3*13X7-!eKE2anxv6P5FB3`ZoWew%W zV~TV9qig~plqG@RY9l!oBa$tSCqzcf8=TI?!R1wZJ`q}X5U5yOp=SZ_&)4?{&UWrn z)_+`marc>H<8B-@HW~x-JY;XMyZY`L@9tOcu!1u*Yc5lU1QI8$i z7!d8Wg;lERXpT;8mutN-4_o*7D;;LKc5#A2*K&|175D;c_1>5qP5F;$Q8)_#YhSG2oT&|envsjKW#F3(Cog(kh1 zo>uCcx9MZ{ipyfttN06V51Uur&{Y0NL~4KI|JSO(oNVXV@V6RZ|LqU{pF2B3|9)%` zG5xnb&p+IW{s(i-_wUU0)ju=W1pMs$^%xT6C1iiNO;1SCRJ%%oJVY;HXkuW1G$TzT z-#H^a&)>f#H7mzSFJWwAV5(kY1F?RM{YnEe1H{Cdm&=-$i-FOpLmjUKCCwBVzJ%F| zf$in5q2OGmWd^sXL5K=|60ig9ic1W{jL;0+F#~xI$PEM@I|RAc2w*`+ zcmP^DITvY}z%6OuRQ2FZk+F$^iGi7bAQ*u&rltnK z_v?W?Xav)MzjXxIkb&9%X`u~e{XxI}W|;UlQmG^!wpS!nyan`8`TZ_HAUIsx(%sC> z&3^M|l^wwNQP?9Su|+foDp`x#d6ULyB$O3(H8kli)ymrQi)6WJWhLYm5bu63M@+&Rd9TnUk_VR@JgNQi!3Y@1cIYQj75Bx+8+2IWmB zrE6GUxZiIMb)V-ge;Kl{xkpu%l&So46qzt z*)2!F-s2@`uK6{ONDeVOF4F_V<`%AB)7)^JGGs$^-r|Nc`^P`Y2BEh4JpW&uz#sfy zxper4bDhY)8`%BZl!Eg=KB%&;^1m?#(4lDvd?JD%pm)HFMIZ_)Aczy;1*KG?Df^b$ z*DV8VhFL1d%jWrCxUWFCne*=cDTmu6L@B>4@S4`UUvj*kx3cs5`+UJ2;O&bmj4>E5 zlk$$$R@!2VbjQzI=-1PPt>rMhW~QJ=mrr|-TdmP@DTrXMv_E-Qqqiph&^KuhI$&az z%S^hIV_vkratWKn-9lZ=mlOfU!q`$SBArW7Qcqa(XrsX3Qf}@IyXvtW^FfGh1)Vd* zlzywPk_ap7b@+uCsz`q=XE;ulrRK+c5Q<}@Hl1IeQ4czL=)ERLf}T3?MZtybFfXX+ z2w)2{r)ss~q-%#o6h#-F+P5x89cPg?-p(Uz)>&#pb2K6AsBxAr7B|dtx%CE*4Its&xl(gjt zDr+DDZN;a^c&SRnD1A_DLe6VAoiQYY@^Eyr-ki-!tG6>BDLqV-rxYDRD$nEe)8wpl z(R6vq90q3VEa&EQ`i%i=n1k(z`haiJDTl$|N!_HBy%X z+h{S-)`tJq8fFR$qhQ5*RJ?%xwfGpfAXlC`zmc#eeo5`SBv|NPjD9KX3{U`~rEL*A zUIxBLqqs7^kyugW%kCO56I;luvo)HEk4Gj{VK*vJA&T^y?}*X;%|eINv#Bh~ zxoZZmUEXXSuk2=?NtBR;kyZE_ploAv5d=+x)3SnxBuuO7BG61tUf+tp$ zF==f`gZAPLQQruoe1h+LfN+PMRctR@Rc7^I)%q3~&kw8_&@ZSb$=nt^V~xPRyjtSg zxH2saztEC9g;Dr^&{AoiWf%)fUzTes7TwU!2f~%uHw(Mo>Mmbsdo1T-r25v{2hNq) zxeD8QpG9A2%V3Ey^XY{BzgBY33=ofhUCaL$MeJYD@{_>-jh3tY|DomBZ;o2u|FV|< zBh&v$%VnkiYPm16v66ACR;9b(0KA3Q?aD&*lJcX{xo@-XfmD+=o8+CnClb#q@TcMd zNmNkYR$!(lv;9tA`%AhyK>AtuErhUTGzThKtJ+DM-bf6zwN#xn>0zd2RW`3wYgG#? zq0itzutqcoI$3l-dWb<$Y+YH%faSe#hPqs~jZYiFt2zy;A+WZt4H3a3lI@bMZpp-U zB#U~8pHb-;`rtX3KkV0qUV4b)J%6>akhyE|gpx_^J-&R1g`G9|a;se*<|i5k8#)J2 zF;|8rhi2nz|S|SlHW{lKj(uB~xct8<+pQ zUDj3BQb*Ahk0bI>JVYnaI*e@t@)JOkT_{)yVMzmvjih9|dfW$KmwM&W*pWjV* zE~NLgFvntEoOuL4VmIa5{%``WNY9L0O!t0%TeGfhe&K?-`F?w_2e9_I5YHEAGf+kL zG(DlMR%px`2AQr-TQ6v|KtVz^P0Ok>A-UF^_8DGdwNd46k}=+2`fQxHP_yAL`E};} zB*YmR8UA)EHh^}!dU0G;^+SO$?&b!6>9tO?ZOi9vwxkRMsM;9YRcRA^Q00}$I+f&0 zLcjzB{H)m7n1IsZD%Tsr-=N4g`JDDk?6HR+Q$tRm>|6oBMG;mI26TTY0}S>MsLz7t zbhPAG$_s5U#9nbwmpQRPio{hJHhPy>uG|)MTKf(c z=SFiHb2T%UJ);Q9b@8X;F6+GG0nwnDr%qnbVG> z?-iW*s;v|86B=1AJ(}Saoyp$e<5V?z&ivC2{K4p39s#2yEC5GD1gw!lNHb~Zb8z{@ z$bg0jniCQFi0BC8nC=&T;$ua@=Nm)%UE}sETr;yLz>hPm0Otk>*D4rppQ;WKBUsN} z5Pu$1AKYaGIK^d>Ay5owu5;y%Zq5%pg_vKo#g^aiI5m}{+JXKCbJ;G|gUuigjYZ21w8O*;; z4&62}3azwg*vrjm^XhjlbFPCxIKY{qI~pX_wV!G;cYTUN~Ctd12)Mmw8%}q{0`mA&I2uZFbo^j zt9|>cI+)uo8Ez1*KQYn-w`*?+XllU+jV*dL(|b=mwy`#i3^eJA$d z$M!UJN*aUtPY=4=@<`9>aX2|~7BE~&!tPjq_y5RU5P0tZZvt)ob3rW^>u;=?UK-R`vU5^D~`yb!T}0{N#O@ zd7Mms;FA?;UU2&<$uzIJ+T?VxE%db&8|!M1mYr03?5xf2z;0|c*;#3q_fPUm8BD zuCAl6gkT1x2I~+#oidf87#Yly@Rrvtu~m+iywgxnQPS&e3Zz7!tEZ@}`fEIdw!Flo zSsiZ7&{b4fR#{cqWT~jEsciXo5ALh%;i>2dsVpbiQEB3-JYH0m6jhcKR(3BcdyFc3 ztSWmKDY)Mb+m+qthHpK1ZK{(K(k;{a5QLTHG@SiZ-_X8l3f5$ioueot&-s!0wLx! z(7+3#WT8YTL6l4ul#995!KZLimP?Ex z0|jzeY*+|eCMZya^F19x)W1`~rdP%yQZkjPeyhZ)khN(j3V?J1&Vh6_s|Cpg>T4TJ)8D-$l`RMLpy3WKM7 zB1KxOE#QU(IYHh^Ypck{U&zAlsXx~k-U#21>Jwq6+TACBt^m4FlZ3gsw0Er_sx?v3TS2>q(Z%P9@BX@o4{)4ktUTdJBUTMwO;7s zHbz1AnOWJZEAG{FEpILERqA5j3;~yiJ?xw<9ob~5y?KD0yR90ruRDlEdNnFFfKOtrk0nMiwV1w z03S|)ILW>5Si=)9w#m0KpjVDxoP-DyO6yaLORKnv=>3u5oe?rGW3xz(92%VOIsUzyUjqJ?uM|8>W^-`vADr-S27iGE@Ox7{OCObMoivSu)*AQ z5EH5PN~=p$dH2^N(PD~y+8p0=t|-|T7U>wmol}w0k&9Rt5%zv)UCzpN&U0K|P8_n6 zm)w=jcqA5UoL<2$)Lzdc>up8zy?fAtfL5{bRb+59jClCc$~7TUN=^^u0vk`0KQ7D< zp#b=Kyi9Wca@GhB3NoKBj!ZnOnM6)6UP1qy{xC9;&VwTTnY(J6rPaXZTUX6O7-Vv}&^xTKJ@3>=g#1E=Pswyjf@oq-9Am=l3< z*BmODIaFxOx&q`jCxO<&9g!v7;?|Fb5~Ii5k>p;4FS&7kQ!3f%PzH5$wDg>+0s9b{ zd}0^UUPokkOvBA z?<<~a=J!sQs(|3j5k*c%4z(Bc~UdRog1Lb4ViiBLXCD5DK?VlFAr zvv3*?jpG$79+42cw1dEF^566$ckQvROW}E?%Z4BbaTxL#ToEGWps$YuXNrunI<95` zvq??lj9Sker@7;&0-48T{_;VfQ!}VhQ+)C+aOxR8fLO2#9T1LKdYvT@ZUU(#gA8+~ zYn?SEJqt(FC91kX4P8p@RCDgCEu^;->d~cbOsrq|T2hw_)H}&K{c7w56Hi9@_eE66 z?a^CUb#^efvULjZ#Ikk+28cojY;#s~xk3Y{K7FlEOfrh=D+Jqb0&v{OGy+UF5@P z1s}&o(ci$gzLLHkm{a#P+aaWWfo85PFX?W`z4RBs#b`;NT5G^7e$ZM_iQnQzRS;({ zOjx7~926e`-+IrW!+tTk0uOj-2}Kf@LOQDrh=oMqDRJ zo4Wg2&4EpkcH`qv^C9GeMVeN`9YNfvU9t z@reJ3Br-&=&489a^Hv#H^uqU7uH zimS;ZuSOrc2yOC8tkJ7cPrq0;^?Fk3?E=bo9H6?@$TR68sX)YQ9W0jfkU_(H%MuSf zX@sK2x|uKIM9WWZ$t+VslP$!_lB>4Ff_lyDkevB7eJA0SXf|&z5Wh%mfbMyU%!)Wo zEQwpx@!7kSa?>AA1neU|h${kZ_?vUBP@*1Q#C(y@;qaM6G4ndw)*%|^372d!YG~DecD`61uRC`%f6Ul9WRb_R;*Q9<&b+K0yOmA>tNf@?y>lp_a{g01pwveExlztwIt9FL*}=IJYhIlK^0}0%0Kby-8C7daTNSEHY*neAs{CqIt4pp` zA+`#(t@`OAoGapXNnKgCD*bkqUFqhM+(zYf>82|Gb|GGo?uENcIhTZcHM>RoJNA_# z{zC5sa@QQNbx+EZX1^Oh^}imHRoB zCsbbHS)jjH^J@&GxAs_})*I+3Cj7SVIXlv06lU@Sg2{=H#GxcHBjPREFL6sGgoY(h zBlOR}Um1Rav&N(P7tGP;ps=~JY%XQtc*RS$DYpQjwBvMeZGth8^chA0@(X#xzulNgba`ih65wqJZ+RoEdkMbaN2gH?Vps40>uWM zVV6fA2qeWQpixJ6U*@^JXmGG6Ax%AlZ_ck1Z+X%D8w%nNOJ0n(vt!Mg`ClpV+U6;0 zWVDv$!%b+vNI`~u2I!4s)Gf=z@Oh~x`xmw`HS=%>*AZ@Ow&d=-kWX|oj2cIc@`q3O z;;=~=bxXvNY2;cwQt)6yn-~_GI6yxnN5?WKe2tDX_*!@-L`i_d=h4bFa|+R8=89yK z5pA+jYg#>O@Fd#Fjq5{vdF-;MRDzbl%wapOtg;|J%;q3wN_Aj@XBN)@^W@?IoAUQEADQqa z?H_Es^81DH?-U<7r84O~>6mAY`DagI_`;e2)tfsaq&*PR9U18lhjl`cMj`R_@SyQq zE^h@V;qY6)2FW4I<;5m`GoF9f2-UmW;05XH(QW{Knz5u+fXX2#%QkozIYhB7E1d^b z#?8$$$oo*QUsIKHd8B5pAgH_E}V3Vl*qRU4Iy)xmLDf*<7qRpe!wEW7gp9|<5#$YiU7Ur{pYi;mJ zhkzD%jxdDHxZl%(q$A{uNbHIkD>RuqaRFB%0k|{E4lenkyesMlZ;~)$;2@t4kEMo#3MJ2sbZTW=))h2( z_|Z70kLYki!|{W`tx~##=xLZZHo}2TRmUD%60EqLuHgjaq#OhGg*d$`W&KW9#M2i9 z{S*!vN@dBeFJk&;9Nf3k8qh{WS|z~oI_KzHDRoOO{?CxMtx!jhNEdizyyuQ8=@+X< zSHel?SRvJ4hr`C|1exm?Jr}p_(qbYY=ZCWQ?yO0#L4mjG4l?j^aN<{goR`UE91!I) zbjoRk-OSBQ4nFrfi2$;+7;-Fym0aF9DK<4j2-8K(38?fEgUHa^Gh>&cUl*QyaqLhJ z@XF*Mg<8_TXf#MgBeFDDhNFVTl>D{K6|Jth1z~T89LYP4ceMkF1ve@UPKIlJch_ai z@PKVAl3NjM)OS+o2*BAga?rZ*6iWykKaG}Oz-bZ+!?1%baL63djgyUIFYHyPQG(9}B2f4wQTj7KpqLe#9 zu)8AnMr7Fso$7cy;M)5PYDc)&hh8@v>do-FyxfBxch5KAGJhW1hu?Pu-T{XnBEm1j z`3*7ecRWx7J}}Eq4*Ns04;lY(`kh~2RQ^e=PeA)avkx-=sP`+n4?chVa{uoM^o9e` zsrOd6L(O>rm%Yyb;8SoM4t|61#+H(er?bB&`n?QFPraLt%aE2?%lVLTv#MQgFhIIp zt~CjFJP*k%91uCv)6qHXfo|J5#7_hunW;a^C$zhadqIeGn%d1g?FvyT5P1fI4pGBb z8$ZfTJzbmZ9o{Z!H)vSEF0pQZ#v<_AmYWQ+oKtGH03lMBIVxzcVdNm>pjIvq>2M)R zwW3@i@-Jv8cCV2pkMFr^@2fdf{Nyb^!2>SvDbs&M7GGxtl2^|x{Bq;=`+-z;3yj}n zFHYJW?mV;U4*C~MKjAlKZWQ?YrQz@U&p`d+^#()FOuxrM*}!pIIL`{E1;K6My5`6N z4@S#8dn+r`+`X!nvU}kcb^zj`n=>_gQCvPsR^8^a)`)df(3rmyph&S@S?<(L3=i)* z8f4X?ggRPe74@>}KIt;extL~MO!Cghcos>U(_yG}O?v6T5`6Sg2+kAuNZHSEmOE?8m7kdCtC4+uz^x<}{g~)EVbF{MMJDIA zfZsX_P^WqmK}WL)eQGXxv+iadcb!usXblf|Kj?*>tf*U984x^94 zMsz4ax`4qNb+3|eLLD8Y%9L7#Ql(UE8Hy#`N)?->%GFv4^WHa6@<$czdSJcdG_LeR z6|T2xWZv2es5hGX>B9=iws7;M}w`sCFT-?|;Ppo&oj^s-(R$$+ji=h|Y^;4#qG5t(IM&pQKs7pgA~n zQ9%-^y@k)24g-sz3M6TT(pYbZk}76tr4v?l+QNL*AnAjS_(^BnlrwJTX_v`!GC8d= z;$-OEvqqFbkvccsWyp>Sq`KgunY}~hOaM)wAddHL>+8q6jEL0IuRSb%>n**?_5B6& z3O3i2ii`a~Rh0@Xi!!T{bt~3s<U$_RD2+2WxgPqeRGaO&8ce z4@?uGuB(d_%TnVPB3weP^D3>0W)*H!O1J^Za#eu3kX=%)^LJI*L{;G{)yiigt(kNR zEx9WFx^Mv&0?+d;79pZH6vFf@auUPqHjNJf?NwtzRI5N@ zb>X89>%h4nS>D{hrm)w`rGWBw0AGCf9 zZp6-EGYf^^4ZeAkE#go2N*^;n9mDcxFjIIsljK~jKK7St<<5>-EbzkuT`Q8ISh}!& zwsdDvvb+L-PXwUL!YM^~VthP69^NTsm7@vp@yd`Em}g8+&RlA|lH`@;2HRf^*NZN3 zTme2FX>@9{^QIT*4bKlQ>0Se-$J=qK?%ZlSR~nu#1yQtiGVf;ya*EgoFC1atbp#}3 zm+9)d>x|s1zXkr_iR>G>AD7ueQS+6SpTN>xAf$^rm5A=bporcKL*Rg$1_l3llzg^M zE2s4vIXI>9(=*QAM1GG+ImGrMBftpC*ZK@%>kiHMP95%_XP2Bc4F7;k0h84)^KeC& z|Dw7*dtuS~3cO#&cWn8DZ1aar{Nf_|s8=c9DFJ&zvsLmhR$kt8!8;2rNU!K$WWB)M zo8u1@zA0MrjK@>CStPyy_R{f{kgt;0`ChwuHSRx*|BB;(?*2q9=$K!pC>)K6pH1T0 z=PQ@vuo(Tys<8#GXD@t*8Vx}{<^z1_F}b^O*)m%j`-&Q_zlh`b&{e&JCEPp4K48J; zq?kKp%s7A%g$xsv3=3a?r5}K2nPsS4izq&f4Uk@CjjOZ9(Ou=}s&hQ&3i6R8)VE@} ze&#G44tIOn<|`r4!iw(U`r!HkkNz>av+l}~O?GAiM=z5(9aM?->LG~m{;9uAhu<)R zTO7gNt#D&nk|mwQkgXiSkYZjau;Nn1z*Mm{S&$;m-iX0b2VJm zdfs(`4b-%sn{5KwuhqqcFaZkt&(B{!T~0i1$>^%wTM|Rw1zkz3A{!OhQ z_WPZWxoi=u83fdO+a$-9@9Uw8@NyKj(&2w^Z@jzrXJO9ww z>}TtMp5|L>)T;9pyj-L~ZZ@Cz`#~e>?-Pqqj=YN1C$lL^%4XMv#gDjlC^87sPglY! z%l#D$R2C_UkoBr_7;`YiP*rL}#*>xv8iKrHq0-y5ab4OtuI(L5p=SBY#h=QgZt@rw2OUlh!?= zvvV5-ebBH{z4s9Wv0~MhAjI`sI6F9;*&oJC zr`XsCQrWxtPP)JLE`OiUg0#~gn?8R}UVe##9Wt4$UJ1h#^arraxG}ocEa|K#pFNJ8NQshgurnUg?etIE4#KBBK|0 zN_`+cdBW*y*zCq_A~H@Vttj=(*CP~6&x@MEz24XX*w0LM?xI>v&GJpimg992LvesO zm-q1im$=!NQS^-b#EZrLyQ&yq_b_j4n;qdW#_%cKqo(H~y`i7!6=di1F{L+%y_t`= zfr`RxhdSQP&u6mPNsXDSJ2eBzCzy7lAB~5=6};E(xE&ckxK{CPq1m?KUacdP6=n}9gBJcj4nNCl{HhMiIv;_uR)vKB6LrinN~MCAlZMC z4t+kgUuu0@{uYjWhZ^C5K-4E?JdcKGT~vdE=#2Yc!xphrH6TqN+Pj|ia@!+KAMHeN ztz>AMi@-KG(+rOM9vk6J_ScxUKnZ)x*r*sL7ttx_{}k&)($an}mPz00&~lzP^TyDz z>v=KO=VviftZx!;*_Kv*U>jdn6FBvZo2%l+3q7HfeVAX5SQl>bpGQ>tI{4+UP@tsB zaMVyc;d1x|46g{F1EVZ6uOU#e@{Vl2Va?~pS@u5rQF)0Bh{E%vo_c=zR%g3v*|2xUnvvCOXg=PR%IDl(@Nq=DZMh;5z96QKcN4$QQtV7 zH&X@;06>NMuMnaC9U}Vg_|QLyPz`7om0`^9lbz1)?CEJ`wgyj3f|~>o1Y%IZK`aRt zco`ueLFnvhGEEt`p=&T8CBXuUr`lHu1qg}Qc#2m7#oN%@6|3rHD{XoC>J_W_@)fmB zt9YU-{+FFCU8G-&$Y!Vc{@-t>ANUWun0maPkDLI`w;`xVLo)IO-7U*k_OKv4x`8`w zN?7jTpM)2iJ$Vas?fu28+xxV&cVXMSxq$tvP&0qe%)L9cvS}-=bx&S{Y8n_(Gj-L3 zIFE1KRG&sDCJi<4Hn(n}7)jN{8!nk|ESq>RuS0)AGq^FJUNJAXuldkvYo8YaROhEc z`TFU55(H=HEsXYz7T_=?sSXhAhd5!RJVjNv?=cuSR5T2m4VfaLnW4^S17#miEy`6UHbJ-d5yRc*aG zptz-`2%xKaEHsQt)fc~v5?#pj&#{%0@%l99?Z~#~PRxF{{dkfVhfXMOAa5IPrunf%UPN zUWk)^MW z@Y+>p)5vx)t{1hN5>seQEGn%N$tfYcTlAWTFwh|`)%9;(AW!>088%Yi=L>q=4qsGY z4dIVot502`o-QJz0`+YuVu}tug$)T0epDty7zDzRQG`&Zh2+7BnT~SBKF;I9 zA>27Qq;JfWe+$oNO3YY8Jc9A=kn$-$98T*>g;2?mHZZY*;v~K9%!R8V;bYdeWApl| zR;WwH@hLxM3lyUrCc6UAj(k6$ngs4{6RF~E32I;+Evjwb0@q~ z63~)PhXaA~4G~CMfThFAV^wz8j#DNT>ntJw0BULsu>e-g#; z4Jwx&zwjBT6+ZS`I^0!Y=UfG+4RMJTeq7yh4#}FuLNXLCdWb9P-A^Ozh!wH&xJxCN zER~mx6~KHyIfJO|6^qFoMArNFAdf6przuMM3-L}RN!?s4i3plpZifN{n?=yV==^5s zdGLf{&3vnF6*O-ANqU0jn2QF@2jyX|4rb^n%KkPPl%;xzcPm&#{XD_+!V~TCqiOuU zvW$;p%QaG?UAQV%k`9a2QtMQ##rY`bd0e89E?#0mmX_%ETsvuM%|gudfp*1Lb5wJ_XwT zr4FD>kAm%N5=-ELj&GsDW?=gTbWL7gZs}I`i9znzLvGLoY*8xu7fB8Lr_rGKNb zVQOnqwKc+A8g#lOXNFs^1L=&S8KQebtu~uG0((QUH>x{8dxN((y*OfjAat+mJA!|} zxHsF+(Q7gga5jodjrJ-5K1($>$Y%wAEr@auEFbb!f`XS)JM_1p2`_;05ZDd`|0P;z zwqpz}+3^y=ZYx|6!b=Qs(%|+PEm7np#P3QTiNs3MZ&M!8^3ryO6sh7zOYHArV0frE zZ+mc}5ARWWC{Fjto%r;UW=ALQjXq`ShNzu*^-{C%vbMtX$Nt<(bH=bAS>IB7a_^+L zAJD#W_0aCdxgUMpVZRZ6s`=sc7c+g-ebV^JlRm@WTfY{6a_yx1$HE`Q-;uu|e`&w)9qcb~fZ^G!yUVr12IsVY#!8e2av`ia|ZzlOxc7yXz=6v0>f%*yH zd?Tkx^`BUH?biVNiOQ{(u&F{CEu*Zo>0*jKrr@NJ=gdE*cGfIxikMc=sS&9(E}ej~ zQQm0KJumr|V$<%%(W%o1h?xv5Xqz7np&OF|*lY~GXA-X*fj?LNJL9VqXYGiq%W^_( zx+a=3NcMpC8BvFUHnM zip=DZhml@}=__#JHaSBjg-`7cg^vb49+$N%caAqA)zZxT{J_`@*%dl-h~+|!Nob*9 z@rqWGJF|6!&mBR!kWZWL@Z38wQO>=X6nu|DYIVY9grLR;BF7Aur^zu&LzrC3>|vZ6 zohVRlMWsxC=H%>MhG3m6!3H>@z>e4+3cCEjEedk=*RTLzpiEnYV#9CXnE;P;Kt^?e ztzc)?h#pz+&XaC|E{LOHkR~8W8_2Te35tYHvN0WGlR8MIRS-^Jo-rC=5?*!K1o-*C zkLabH5j-rMucUT|wVz+-D5cafi#2%X9jHX~eW)~Sq^7GPuVDdcN292T8>G)0H|hcR zD6HB6(J=z1X9P$)z?)V8=$HWH$sKZ6QewGCr6V6aQAVbB1$O6&5jh%-r&H#yyIZgWA-B6^QEF07-}fAOAy>v|^-vh%4~oB#GRPf`%DYN)bJ% z2t`{a1dX=>1zL=KO&peIb%-%y?FD5%2OnzZk<(YJi1+sat>HsO+57@HL{dG0$9Hy? zbSrK}-y+~VPQCqB#aWzTpA#Ii=8^1lw}~N1ecwaOspw@ErnCF_pMM%3aPdWvBmQeF z(DiqGfcsxZbd^laEbUB9lkIgD%QI0C3Zymqb%4XiJ3# zZLwe}Km|l`_aO~q#@wl=a=IuW9?haFtxZq9!CCn zjNTYrygtg=%eIOT990B_8H9 z2gUxcvXqoiDht8tUv{f=Ftq zE3Ka;CmB7@F*0`y$~;5}QL^Q{*VnYo6vP2uVcd0pK|4w4KSswnob2WtVWr3?ks5B) zz28@9uMDB4*XLpbtdvhk8=zcy`sn>xsRWp~5|R>7E?=WT@2NQs(>{uVFu6eL#y<+`Uv~rL-Sc^Ee0}im{S~RFoo{M9m zy4+oz(#57n6`C) z9P6#Qj)e#QbcisUqcw;9x&P%n2MdR#$Pg97j)fc=v|rLnWC)d;$HG2`3VKMxSaJ$G zeSny)zz}JzQru%W-QC{vR$5#S&0@Rk+4tL)-Wci$=dCQL{gzGif+vKo8N=*Cxua5G zh~_GRVQ2!f1*zZGl6vUL`NSDYPdH5Y6lE${W2x)eE9!aFO~$j}tm&R;00QTg+~t1E zT9kFj1Bc8C&`apiGvS7&>j3`#Sm>`i8S0s? z^bgd%*G}^#i zB>r4m%-PD=qR4R!dS%MjZIXB_W85o-@X>gmlM$vk@&z-_rog(eQvgiRQEPNoSYp=1 z4j+;~H(*^%fj6<7H)Ip2WvSO0rjP*)Wno+W-tjP$%NnuEVsK2FE>!}OT+!s_--)QE zN#ymz$p6OJI|gSOwQJhxBu{KR9otUFwr#6p+qP}nwr$(C-N|I;oBHbA^Jnj>yXyYG zYSqPa9p@GdkD#4YvG70GDR{XSs3&*99Y&e&csU>82c&79;w`?U#E!tzSl1Q_3CW{P zw9asT0p1(oFt6>plTWU!y9X4RQXbo;SeFW*0n}dl`ECRY4SdsevaQ8-|2%LA02(sy zJ_b$wQ$XAG5KZ6?SwFtqHE(6VP5Ca{9^)`8#6!$%FQ>stV4DEVceeB$MhTGBDt-ybv+sMX}L_v#vg|+u0KcULir^SH#0-u~=@R zKED?MLL`G)y5%oRUH`hc6M}KtTi^0WhO95hr>_#TUenbWy1C#QTO3`*3@!nrom~7K zg>G~TjvalBorFX($1|?{cAkerxWqTr!(%=7Gs^+t&0$;#kxcq~6!csdDzsBggsVft zzGC&m#>@beYR!WAU=j$(DWu|7)jE;Law&hQj=#$g_7V8pfSP5O{}=u>rZ!54@bd;& z@(0fR-#=^q|EDhhCFmxpXgX-BqJA|y(l)!}=qivz(EvyS7uy$;aYrb`Eo@Q9oG;j| zjX6U3whYf!RR|>oI4zKAX;OSYKwR^<3XS!~NhS*uHE<^j=?7pyYNf(%(AIs9|+=x=oHOant!ezln;jEbf`1@>y#_|-l#pGPIkwL!fW zVNz%9lq;Fb%faaGpJQb2=y-W39zA@-#gUFfGI|XH>Z$tE0ACzOsaG^w)If$}7Ta%^ zEB)vuHQoHYSl9+7O^W&h0G!ju;Xw+0*$B7rBItlb6bC52T||%&1eDon&WkK&Sd7^p z-5^HJteq?Pf;Ax+Av@u1thP*5+R~WCQm6P}-|14K<9DH-*D2a*Hcet>+xvUHvNnB6 zL~>zaCR0R&Nz?C>Y=&66%1Slmio}D%xxTH+t7akNZbdeGl_A<#S=_pq#8}n)VnrZG zm@`+Y-NBIx_hDL;zhKdZYI^#&M8pk()*i(5E*9ZkDy4OkO^9z8Ny=CW%A6Fra5~b$ z=peTTh~iHNVD7V2Y?-XKBG#u>>dx&|ukY^xaV8vj5I8nRYgRc-b6dr5o+`Vao$4$r zG#lk27EcmIYPI)>9XNL~VXd)o0yGMg8*%p%gWc+Ngh&=*03J&a$v@aL69G{v%~P9B3j1X;HLcl~Ny-z?r4k&QII9Pv zX=W171I8c^uIXIIh1XUT?xw=Ot@M6jI-|EGA1ft>z5ivU!))3uMv67Ay{|W3t=C#! z*0Ckay4*aY+IB6Ht6H-r4o22!m|AO761}nT2r5F70{NJuAsWL}>qo?WY>Ns-C~}}Gu)EUAHa2d=AyyFU(0U*-LsF#jK%>MGzTDxf9G2sVS`yq z?3K3V8z&o;bsOwfxF+ABWOe4m0$7|sbr5&|b>dsZ(6}6qop#jRfd^!|*wB+VT9!j)_8&Xmky)%^ zP(vvQ+tBW(=S7|CzSZCjGXb;puVb8-&<=n&nL7uT-F`}e{0Til4`C<7NEXK|;s+p_ z)i$4-IzopEu6pnK!IorL9R7gOWxQ*v4s6))U6UO(g6;Oqs+8v#Na;`yGX zR*OmL7W)Kz2c)c?f$FoQl+^W2%s1Me>TFYxS@R7OtW-C0#5dTUbY{yvT(4zo~_HhA7N@-ZR%Qos-oF9hs7@%tp0M5NqT24jNw#WVr!FxCNdvN%#}p zz~#5;!TmhxNtWA5A+a|C+F+0P76wds3O9|Br0la?du+dKD*hv7+luqlB{jLCkyfGBS7FVymHnO7O6or6QvSHu{ftfGGma0g_T1v&LXyoL%cx6Izr%-gp8+0Gyq z!CCssT7E{hL6&dq9#A=g$*Un@w{FoW-S7vLqLg=VyU;l1a1L9yJu!g@HwUQ*H=IKs zgxMsa8|d)?`Xf-Kb-MdX9cC>WgGKHPZ-+@Ih^yzHS{}IGEhS7g)-!L$8bt^qVD6+3 zvVq<3L_$%tJ07qgnxm#IweeS)e|Oh=Nvm!0H~Fq`+wib9OqQ3fb08i~qrd$zzSieW zh@{a(OV27DoQS#5avU|LU+~@s`DqvLKH*eI)1k2SMjBtXb|4;K;N{aiZe9=RKIHZp2OM z!#zvy^X}}#F;$c7X!c@0$}}yuc6wJxbw&*9T;;lopr(hDa__kV{lihbb>;GMqlDx- zio$Z^At{mhmGSODK>aoLxBtF;*9O_L&h<)eaC`ZggM6E~-Z0*N-wJ%uoq5KrT!Ewf zrl)-E5Pzko_++O;nS@T#-NQ-_ioVEC*fIGD_mRnXt7b@bdry4+Sl^r!1W+>{!3!V{ zN?&YQco-(Co)Pk;onlO#+U{L=se#2#TPO9^0U<$d7qN=LjyX|l2FTS@Eq`+=`&=^1 zt^Qw6(oYIa`RpIkMI0Cq5Xb+#yZOHv_CH`3S&6z1$jTVQISE@vg7vecMMY`~^0}6* z<{*IbRDT0%Ea|?qX7=$V69+T&gss*!N_=0sJXPBxX}Vjma(4F;CU2OUPaqvPey?fk zU=>X#dM1wVofog|9gpd+`^ye|Agw`Z5DGtN>)DDX+#Xy|Yqr(PMfMxOm#>#-dsFp6 zjSc5TeKV5fJFc4z&3!uvNPF+8_K5@8cFmUMPLefotooxTT{~s2`jIBEdjPHdtnH`} z7N%cZ^2r2tMprY8YL>Gq6pE(bg`*8eUdi!*F!%Z`7;uWlx1fgh?xsI}K^4&(tt+oRi>=y}*^!R%@1tD4b$B zMq2?r%N6+mG90$}yfE`l>eweR8ce(DNUS5-#12)d&TvKGH*&R$7voi1utM9#cknt> zlqt+#1MOR8tf*#I2tnaT-3Ocb&cEiA)X0O>6kD(@1WZt9x%>vG;tssqFCPs*!ODT# zqFqj+VTx`PM$4b@gT(x4-Yn3TUnGQ(mx^-v9Tpb}+#sb}*Xn9mM9_Qky z&)snxs6Z#FonTK3KMShE&E3*rol?{f$od`ISb=COQXOi7nPn-sTHZ;X2qFwjtncY1 z=8u@moY)3@!$+!jw?eQ8#hsFrriyj{FP7pfyMGL%&3E%D7-h-Ve+kvqI%*>9yw3Ng zYl_OiN9QjO3rfg6wU#7gZ8fG&H6o5Cnb`H@Wzq;K$@9Y@C-1eV@A8)Pn0f%wJA(lK zu253bx7P;ri2?O>e-+8b77B0RmD8eeBQkTQ36`jtH)ihDL&bx&gVDnwIFUG3IRvn2 zNCEcb_kcE2yKH|2m?AwWFnMa8LTEs%nQHft0F*P!b+i1=JND9&+WOcb^FR-3N|Bhj zN~iAN22K%1h^mv=yJ)sb*`oM*>1SkPa}mAj>yF65cRnjKpPr=V z?1juef@W^8TaKHAVbeo|_(NZ6!g?4xOx;TYH8OdsWc8ob@+4$tA9!IAM7F?RFE9~m355O& zUIZ9jelFQRa1bOXP|eija?pAGkbuebdClX>X?ff9&-drch8IwY{$B`)!G>oIN<%fw zjp^end)lEJmJQ0gtc0~hk}M^6DH@hW=*-RSkM+aVvb;WiUQ+T{Py5MCMdqp`NJ%eL zmOy6=dfF|ZUo;&SD3bGtp)y;{*4Sm8`cipyPL~>IiKhpuJd1ayoH^v7X(==w3m8L!GF{3`P3s3VS0Wx;D=oYRhs3Oagh5G&eBlS=o_ zT@GVrp97Yxd5PChL&T0diB;l$(j2#ooiJAteX2ozZnB-IOp5RBJkufavdX+*w?gFE z`fgN5@VlAop8(q}R~gY!@zmIqc>o@?-yV(7w!pKBVyg6Q{`7=hI2U)Lo7)KF0ZcGU zC$VimEW_2JzcM8{l=EC%n+DA}ic@562oUvIBXv?FsGAk$^IlPceN#Hlk^2K}*6u^5_DXQY%ea+BQ_X-eIc ziOqP~eDpknSqjpTEkS;kiE^VfmUvN;>9v6i;rc)5eBL`IUoX#V6L$JYXBb9D(2utwk85_{08gq?L7qia5y0#9wyy*+ z_HDipaLns6LXq^~x@W92R{+r? z=Xo`tCQnqpwTy7AXO4h!OxLb+AIvJ#IrzE(w7We_y>OcP2Z%~0mV-^=?t z9;M(Z5G&jEz~R#UdohJJA{AW4)Na*u?hG2C6q;Thc~>C5@vou@q3`prTDS2T2{2J#EG&0F&IX7tMAi~Os% zXawm{~9D2%6p;IA%K9&5dJ4X z+5a6R<^MBCs%qLQuApj*#*?UPZS?=fBSp~Z6vu8wFLY^~XWR07Q6n^DNlPaVb ziBu!jPmL>}u|M+{)I0gt4l^H@lu!4MJJ@WSm0;>u({=FNX zHD59xOd+@Kq~W6wBXt^PSENKHXJ6RTP|{P@R$fI~~9U!d+$6s0FAh0Y|V>-`;k7m0vLb@N;x<;-CuLK9hZd6NKiF|w9 z@!T5%i^ZBR)vI1piQ_jt-X{RTm8*}+T=oEf)hvw8iW^O+!U~t8R^4Du%uV%k96}b6 zHDR=ndb*f{6a^?Ml1?RRM7usc9GQrDGDN$$(*mT7c@)WIHuwwu8TwM2pFOS6JQA0HTG8GFP?853 zxHqA~pB>yA+&gceFbbW2A{8LCei&gW#pZ;rQAJ-hZ=6c&xXt!k`8WcYvoH_336#Zz z8oK;7F&j^8mJ(M|MjXP~fl)ZV;E)A7q_^9cu~`Z(#oA4c(hKXIKr#7g*(TFC3x3}Y z9S?ccI&Cl^&QFLlL4u?N!kVY9jh-1MFBnb@e@le3DyBi;f}W77F`XuBTt{RwP-CtM zDW!PrG= zf*Vbnmbu`+LIWIbVeO!HdfzWrA9+~a{xz&pAE}T`ByAQSI+Nfl)eDT_N`NI+DlwKC ziH%W`3`krnF$$b*DYHcpb|>8(Aql0mJa^4}5y|4qYdA?PQ>~RA{xaW6wBfF-6ir-a zAc>)R3ydc#Y|6IzmsszuVVS{~$L*X9dFQ z5X=+$58?pGf_(>jHj=e57rP2$_nduQT`a~R9yXhwjCS{T_5eZWc%4U@hK+o8#K0@! z$1`WN0bJKB$NMdn%+Su<06zJ5;K(gJSG14A>{fp*0uE{rJE?@NR%O9vzkWRknGk5Z zD~5a>ez4gPyWKDEeeb9wc|TmwkEc%wv$igvZkidXvc!V|+)EweM6gZv)Pn8Dh1M0~{r@G{(0l`&i3NIC^9Kps$`S*KIu%q+r z1E)%#-A~{VbTjWc`)=9`K8_TsH8M-OFO(|zl|Tv-P>-|iv`od4rl(8bKN~CB7P3cZlu%3+kyAltM{pniQPkI~sD)c)t7>ojuL|-?gT2HT-TH_r zWwxES%N%8 z<`2VHL7Ys;F;UukJQbu{Fh9?T6`u^lbLr-3RMJ}-%U&0Zv5dtJS|Ya$$c}NP9>Lok zL!zz;`fbAo&m3txRHD~kGPQ5Sg19(QFvKIVc^LK$Ywa9xR@6a^LvpEj9ExWJUlWMaQ#ailW+>Zo!R3S(1#Cz)zOsSEhWOQ35n5T z1~hGxB{YvkYmNHc7w!TyAz$*2r?$UQ_GUu!eLbXMN=x%88hV(SkoExs~2=m44E)2d0p8VF~9aCUv511j6fkQ(3g?P%N5R$BQfy z)9kK7pG+z2>C#I=+b?`wybd!C$Kjt~s?z@b#L`h6jyhM|gR$0loQwMhBro0mOdUFs z7BMmgrfa4BDLrv~|NZN~7AeamW8Y{$i)nwP{|P_p{}d@sHjc(da`xudj`}}*yZ4s!VEn&%YXyU^SQnU#XD%^X(g^%Q2;zLE z;(Jo}%L**-`NUKX9aC@Wcdih4<72Ef1Pa>>{Uq!Uh`*d zBw_?|)m$+)PIF-y&E{%4HqmbZU}rE$_6-f}0cqfC+&NcjL?*1){Q7diUVt(Y25%l>JMU%vE4=YlGo53h`s z{ky$Rr?GFArcB<4^k)Jy5Cqmt?@8|})fGPq*q2O`aBQf3$RBNGjE4>-3CKefw2>-l zic5}+8^?%TZsHg5sD=H5Lhms|6jENABET_IYzWrI6Cwim14y0%f?6QdSe#v;6o6<* z_ZoYwR`ZGM=cFQvE3b{TP^iQ9Far>+WlNl$)v^{&v*hZ_Uq`#?%SC1{L19}c|9v(s%>)0c9?hEQL5o@nLmce~e4z=7JuQ{59hm^8uk%e($ zl*^42rH`IWw}A=pdzB|hB1iJb6gyRkH@UO!3V zJH{f9p!-efVr*TV@^8x}DrWn|sAwn&l_Te$SoAzocDL9I=hzD}^oyBet7` zEnCDEL{n46+Lx0p(}{ihSf(5(Dfa*+z{VgqN_hUvUZXrPo^K>)A0piGS+YSWoQP!F z%$qa=HDdbJ6C2`F&E}$9-})9`#kaq7<))+Xaz)8B!^xQXer=aDcV;uT8fVb;^nN!a zj3*Mg9r*ys^fgtn)v|vMD;Q-YdRI|#sH+ivEp2`5D6U>=zbLNAnbqWy zxvAmd1!liEe52JBe9fM*1RRo>#+Yi)S-syoEJ`5M|6}q@E;e5K(^}rve(c0{6m=YV zm~j*CZ(5sqLoe~Xp<6`9WYJrVy5xA4u7Y*Nwg6u6!$okF<=CAJ>ExvB>y0{O)?47T zrvRQ?0}@;Yq$q{&<{!#RWyD+4I{~zl;b&R>)`aJ;ZBXx5$dHc7tk+KE5`~4Lm()|} zw-aQYayep4QXpMgeLOyZw~;lH@Mb*HD+7U;^c&kMs(h*(5^j@io9m59ju2}vg;9RJ zukl<&))(Jh5w*_rzWo!ZPKLV6@iUo3tAS*g$q+S)u^Wmp8q`{Rh6)^D20A5d_Yy>b zS166GkZ~)S5d>adLN6n&CiY5uto5fhhAs|(^?q%`-G4#+DVCHEp_tmQ#H@;u) z*=@$HJGqZ;SRbj_x~=~C47$CS|DlZ5GqoQxbn_5D1a9I~;`F%igaAAEg;RGks4y3* zfViJiPtO`kYKhb#PxqV~c7<6XeD6u9Rn`L8INX@ErL1OV@v#iD&J#ay50it?w6JZH|bAUz$ors7k_ng;g8^z^68?5h~MRulght|2Oj&)nyIt^my*+F41N39gl;Yh6rvF5%JD&#;cd6oZh&cFVh-Y|= zl_8&bfrEj~8}JA9&o=34vBnz@(2|fnKyN-`e2P+U+($Dy4!@gVpy=ZWkpXjh-ZEKY zG+6S;*BrL}u{xZ{Bw#*H6>%H3rMcVIQ0jE67_N1>{LaHNg0R=Tlzt!)aA0SBhA~)n zpy^<4buO~GLVCm0W^`L>AWsdS{d>VgSdnq|FfH3f*b9t^XXdA}%-D9VR~}6<1#S#+(M`%;uoF$P#K$u)(@)3d zMu&$dhwC(F))RP^dR2PmI+w550^R>{ z!r9#`9L!ghUDNb>6K%|BMOi~I17ug48xY|8`c~8~U)>d}{m@;&X_0IBt^*L`D^qSW zN2Sr3t>qK2F`d?ow@Kks7ZpZWS{jU}Sc{%m5Q(a=Ed^PYSfET`X4WzYm0FO-N{SCl z52o2<1z^JV4;Nx^*^w-Uy|Q&m7CMwKq5?Onz_G%GnRFK)xL2eVDHzXz;JHvW?{O^3 zQwvI~Ic7mUMV*Kt@-Qf-U!hELI;|X%QO}8BtL{8_fRd9)=yMW${medRpt~v_6ARPA zlD>@1dgcYe5uw^(+x3^{O4(q|bYvU+TWb9(+Y6P!S@*5ZPVwt+=Q1O{A@Msp{B5l< zGsuwgXkaa~q%V^VS8PFUCQ0A1SL@EZcx5_n*brnX!cZTN2_?weBE9Ab8+B!1aXKZZ z|B$r)@(0EtBQF5mBmTuH{GtN3VT<*rO!5GOD8mj$-+x$K>Y!4}$Ol=E3i0j{QGu}y z2kfjYfGevHk#j}72M=e6e&|(g*x1{hD>zO$tt2C@A>>e{phITW$P7eaQuZI34i57c?n-7`f}@C60TGbn zs$~;#%V5-_eJUKa3fx!WGNLaqG#kT^RUN-9Xyuf>@F9&;Mp#(tDyI#51PLT2iYDHC zR$G=L3FpPom{m8C5#Z+e)ROm9CG=<-awOP?N0x@rZ~)~8A!?n};i_XDN2@QTgspi| zFejI%-~oKAKYm@{pVn|)Ti6$~?ijkeKi0c8n}Z;pK_Rai^XyBN&x%<1O=gz^_>TKv z49F!8Y-eQ&20H}_Y!I4gyyEd*C?{NQ5{S#-t3q=jVZ!|PDxja(ATejUV8g)Q`J%!$ zfycknQH4Es#XrMe&lM_Z*B}?o8}0wKB{Bc&PV#!(^7*e}+Q<3dSoe>b;n$BH3fq6H zYWUw_TG8>RBR2g%F#VtZ|26Q?j+ue_C66-PGeCdPV{|~!N&#(5A}^s1)74`!qRK4z9{JOZVT*`qEpT7yHN7Ov&MmN5reBf{qG3J=i&8SkRd4jZ$ClaHdo zkr&OTD;*X@2@;^PMUaQH{#f{UiSSq8<0f?bFF)e%!?!dXPV(H*LsJy`6rWaqRa2UU zC$j%~BySqC^GH9F0*;?a0sa5zNR$<%{v&H;slGWVu3&PjCO;azVM6<@`uig%ug3Su z1*pRmHd}`GLN_r~6GXWsXIuGEkIf^m1_FtT3CzzjGi#f%CKQpHC#3UP7EcnNNtrS( z;J?!~E_~-+HD-+w7oG5MPuwevT$vSqT;FGTbU%2#bjbR=zS!^rYH@SOYau}i$NJ87 zXy!7cME1ul8`J;w84(V!mW!4nx65y>ZR5n_0-S%%P+Ud+LS(<#D-HR3b(sbk5~rH`-rC4H|}}*6HS!=HI9K zYM-mY_$5(}@5_!xmHycf64uzy)ZG-?9Nbwlk{UbH}no0jr@wfar6w0#yGk|K2W0V$R6DvIC{DO zob@KY!%9UyoMdwwBh(nQJRLoU=5a@rK~<7Mu+Dn8j0qQAO_@Qp4H-6x3=72){Wim) z&d6yXG;gJ3VO>mfSRD~6H#>`9W=JbeIxN%J1)TX&cmUO%Q7@%Dko}Z!z@_x(8 z6Ko%|lOHV4U6a?)uO!vG#f&qjC=!V%f6MJh106Ck{?!@x_|zJX>>6oVphy|mpQMkD zhpvVvlR39vXT~9@WgQ&*%c%gG%=p|=nJ*u8VLrV(5LwJ3+>S!`m6GEDA5kOTAS<*L>W zB2);;xEsY)0yPHA-Diln_z@>?#&JN-Oj}7e15>4dMl2@qOlfPRDIj@1PoztBVmNA6 zX--RrVMb*B)a?v?D#4Y1C}Mt7`T>nQVeTEXLXus4dn!VHJ@6wheBm@vmN#BDOkL*0 zx)4)FQ*i!pBz{5|z?+xZFveBm5>;L0aK5-;df&Ed&(SL*Mn*#~JWnh=vY3X31-V1KBlLO3TXyAnnpJ|R4T!&Fb6 z4JyN6D2;NbtP*7wlxh1Dzvd{!i;#dWbGGPJD{LJU0-+1~2S-jW66qn04MtaN5y-|CIEV(HuJ*ESFTOL_ECIhctgz&zM?$^O3Gl$itBXld|2+C0Z)s`?|uT|FW1R- z*SCx8zstD;d&i5*xh)*yorW}!`m4Hi8Wrr?b^GQPv0R9YHxFN8zb!{Y{4v&BC@6j0 z4JaKHP41QwW$4O(&6mUV0Lh;}5hV&sZ*0WpdLRRNgQP)JZjHkFQ`P zc(<>BKKzcL^b4_bBgz$i0N&%u;=0%Kiu~ut#Jv^MZi8&@GpEY?W%j*1dA43vmqhdx z=0G&%j0n%`Idk>2Yv{4nQ< zL-qDYsAk@lk=0t|ngpX*mB0mYlLo7!m`7!1B6I6&H=|+_6vg4V9_fPk@@HDjk}wDF z`dj-rJRp_wp(yLqi1l^Xo>Es(S&pb%AWiM~9cjZdG2;aPGDDXtFOe9ijctLt8GUTw zGj2yGj~?Ez>>2;a!P*(S`*g?#&zLT~ak?QgA>aKT9Oj{u4PqI6gmlzE!D4!w*q02W zKjT1~yT4pB^4!3^lSiLiW6%s&12Rw^yxiY^fxP@R@EqMZB9icm*lXi|yFr2Yil=Dc zf%PFxc?^j7?FgS0kQknDrM&*B^>183Nhy5@=IHo%)OFx9cCdBw^IBJY+} z>+tvH7=OV4XpE)QP8^JOY;r1kR52YHRD<6TvS#y2$~@qB>)3j0y*(V%*9(qbSUdBn zy9Bmv^Y^}5_VS_uao+nzbN#M40PZb>WbbuTCszTlg26n819cN&L}tIhO&dgBFeOoy z{}MXjbr|S5q{4`L$fzn_m6T$vnBvr9A~E{qlK!Dfz4{&B_Dv!q0nww3p`B^jfu=D0$3ViN$)cJuKhRk6NOzy)yMwXBlzgEnmXS`B$yfDQ=#rEz787my4(bc;-%1{se@;OT2hoS1ijNua%CIrU z&EAsrjV#%nL-zLtva2Dmjfc-z4&)|t!Jnc7(rygC#n=yL`yD?8`3O`4vhUHWe$u)S z(<(S=%aR4I%ombK-8y231rV@lbrqBI_i-F;^g|yfv~T#4qSc4H?_Q)BA=0mp{;UJ zXsnTAmTs%+_J{wljC)tFk`er4v#$;e1oZVIrv2}|25p>;?VZhyU1-f5tt^cd^ljGZ z5&q#(eD4KQS|x}9H~uA2kv2#)Kch^A&|Zom3zX-4e!?jd&Fj0 zU5WoPf$)*T?jIn==_3QjcvKCT(eZ_DozAIG- z!P4^KEU^=y#`S`GxXcL5SW&57MB^flGaXAxg35h$0fnefSYX8&@t`Apqq( z9{VLSc+|LC^)`Nk75vyon3))&`)!*>7@Bt95~_O6&k*<8N*xBC92sh>g@(Lrr0$r^86qDuFQO(%dNtdQw*b`3{AHW?$Byb8 z?iJ$>2^oaK(e<U}^ZF>5T8!F@Rq0kB1E{g^S1QdkvKe?d}R?KvY(oFv! zx28z#2W?@R)RSXci79UQk&sYFGiLE%O+8_cRAO;XY<)p2v$YPX$5wV>97kQ&>`&d6 zoViMqQA|o8ry=1=OGBdx6rY$7|tKYB>)CbuUa*>jV5jCka38X zfBik#%l{FVeO%h#g1Vd(-N6YB)5wBpXZ2|1n(OPf3*&6!aNeVMSad!iAS}*OL(WT= zCvEgvQp)7Dg^8Te^>?93ZmL*!124l~WJfba9Nzq>jXaUt?`HO73W)ad8)@@a)Kiy7 zpnvas*L&B=d)DxJI_7gw8Wf{q#}42N3397V*<>DW_D#Z5jUrd4xYtf#D|gWqi<~fh zw7_5ppTT*9p&{#~Te+tfksS1jwMUNHspkaurwoY0}(k_ubm;%opq12yzOK! z>W%?_)tcZv5ypZJ`!XrQ6>dc-_+t+TAf2gReRkNBfa4PSV$>0`U9bSHPOl8%jk3RI z&Xzcn515@@D|KT}Xj^=8qeVuuR!(F#qKUosKSh?QnhM&W-+g`ptH%+HBk1DQ5G}yb6q2R7@y$ORLb^Zl=&Rhkq z!?iVXtEH!;DwVDB^2Z?@P4+&^R<0lWN-t-@A?q-qnF&LUJ!~71C z3<*uAS(c2lCVdJ39<1(3dAw3lgaT*=kOcF#GCMQ|^B>j85uW;fPF&CyI1Q)J!s^yS z!yV8~b?T{1#I?N%tG>u)xGBVp6_?v!zQ^L>^%i#0uN|v7c~iXvEY}#}ku{F&F;510 zM=c@*(|sAP-Ka1j%A~O<${gnuTpkhp+S6a}xxZ~#bFiHnjZ(G?9m~fL)#kdHb%4ju zJ;Btz#<$3ELt~m zOF)|r$wW6q?-kn)r5NSOO%|@k#?rzJy1A1urP0FyGID=VFY=fUP3@QS9hCf+6_Lw8 zcjS&3lOU&Onb5LII3kPgxzn@=HKX}ag&!U>`E`*R&ynI3Lrn& zM`~=mI`Dwg_s$UzEnF(-EK`#KoDTvLDLiC>-nGjirr&fm5Cc?juN< zgonedcd;E!oB$6gl+6Cca=4INYzgW#!IF!&278`F=cjQmn#*#pGplh1oOEv|ho3`o zaRfGNY!Bzi5fR(G39Ib-u1mk3=E9aZ$QYjq&l)8ZLKk5m`aQsPiBGGF)SDb)g3F z6DJm#IN7ME?w}>)!HGGC7a;C|i)F6m);rAq5qWVkXYXH+BY@_I`=$1#+ebr&-Q%sa zhn2YW#5@1ce{~d{XV-VR7|oW^#pxNHE^%kwOJee zvrS-5;l@yx%5bY8xV8GexEV|zgTRYsVa?B?%zC(nlcFqlrn%O@SH1+S1JtU5Mlf@A zm{6ALz$}sSiu~HJrItc2fbtiG(xzVZ;PGfJ#bAvmW4<7@Ii%(MjRE&YDlOcoGksNN z6XE@;S9$o*l)794BXwZ(bTqkLg<%F9f8H zLrNQ*N=DPhs)Dk|FdG2lG$tz$EG9DT<}r7w?b@wM?uUr%cZA5%7S)oA-H;3YBW(KZ zD5_=ue@JnL{qE*5vNog61s0efe5o;IV|qEFp<#)M2LtyJSgjasrn*NNEC!72~2LC z-LyM_@0bX}RS6^(@X4>_p1h4-x4aozEU*z83D5%8N~9uH#4;OEVw>Wf`JMep&ei>t zM>t!gu6sze0g-MGM1{BUH>Jtyl5%Kz)vk8E6{r*ZGFMslfWU+ukT{JyMrcJ@NZ_l)wEjwaieSb9ss|Y9*<>g!`IXAHEi}LHE4I71sFe>|G;dCa& zq^8RM*`E}kcMqE`i`L?LM7{RI0N*5?o1U!`R5|I1#lT#eYr-Vk$LILF!2{nCe5MD_ zhuCi22w-$UQ-0!3e$%Gz(x#q5AYF1Nj(A{AoiKdX8QLh7?X}vIl^m%{P>s0PzBniS zp&6yr{Yav>Op72|NNO`w>x(8Q1K_vm6mX8j7q<*3Mg-g*?H|@k%ec{lkYLfsJ2O1uSuvNb(RYe2?{raCNKV+y%&Zv4Hfg9j{f-=09;+Je26yj3kFLQsqyElP@3+ zJ?TXt9qrxViS}DX`#1UR?(seB5%F`SjQ1_&&CtauYW|<^Vze%KwCzOtuRYXj_A4|q zhen)jMM2n5y3&-6O3cFGzt4P>3c{gsu{s=zY!Zdrvr93K{nI+q-lWr2)~9tp^z)^< ztMewq4-!r=C9RyHA#U(LNw((;rLZ%(teLw0CQ$*yd`sRn0)|BVow9lAK_@!k(&hfg zq@N~T=OBLe!%(9l-d4~$m2WArhB+0Fp{skN@zZUaES)*m4);G}GE_Db{M)dTLdz`Z$pl*L-fusdr(7%z{n1c+Xga_lg1D6_{;)O@KFu`c($~ zR?D2T7r5|ohgoWO2-mw;;u5<2skiU_gW%y@3c2Wa*yM+KL`Htpi}F)?eO z!|$p4TOV!qX-=2|`)D=9Y*D6CD_-&LxDZ$3?n>N^xVtNHCq~@eT{xSOXJ&Zjo#8##_x(G4vDlK` zclD~SuCCQxU6u0<+!K@h8DXn6T=E>_HGDD6FAMs7><_9{aX<%VM7iPga` zSCKgWu~w1N_uwK)@e?SQhiIKSnUxZ+GbO8)b#kjwWsVC2h_iL?Mi3QrRIxW1G-W_f z7o@cjLjX707oricE>ScoPo6?@1qdDziTEM{jh;RXSQXo#_ytVoIKL&C%>40n&(}3i zuHRgDd&E^`kJjX#+ijoG$EH5LTspkl!+9Rgs1HU<=9AL3w3r>6ntmLgMi#o8ce%mw zY*M;C49l89kL^Si7%+!oVegKTW#umsiDt{n)DBO8zZ&~iKqnFZqAk)8V07LJ(ui|@ zjeo^TQ4Kr}qgDudH5c=CDA8@gr&&Ot?Awm|!%eE7+XGP=wYNQ~uO2Eba*2K?>t6nx zB6st3KI1b_9&P`^!P?cv<)uh~J!ZIO{~-R6aT>^AME=v+kFKak>r15vfXyX5f}ei8 zv|{-!f3iA+hqB5IFZ*d*@}Lo9kPk5UYr!JII79+*2|*ZE!f1X$22sf&ARiVb3a3|= z!HOur)V`usgtX8Yl|HyM^Dsk;kHswqL`TjiuyHhpUS1E6&p!9<_Ny(oY3@U`a+!Q} z4I#ncQ&8Liln3gHDly7h%IaDwDvCNPx+(rnA}YqTjWfEj%9@M}lnn-1>Cz%^I!yHy z6kQdzzvdln+`q(fi6Aw_fsbKvyI#%sro9oN5>hCc#L!YzR{yB0taHk)Cjr(HfmzZr zNUVsGp{Z5JQBl4J($oEU&e+y41Rnh`3y?oyeYr3?(w=7$Ajo zhQq|}2$=UvvG(CjA4{7S<`tHYd0dwUMan3q2;B1qf)DUkS236jzLF4ER5p$j={W2| zZ#FxovSHuyw(h>)+(*~(T;h0HXyC&phcm&>HI%LpHqH4>#En~|M7|-Ac_!dUn8LCDjB^oXvRUX@m5&h|K z2*+$UeAiFZ{hIh69wN@CJG#5!PA2jTW1`cThLWPw`Fbd{>EUKL1<&ut%sXbPR%M*rG12bPSf}qSidigI<2a zw`CpHK3*Zh1&G=EarEYN?V76yYWvpWoxM3bf}{-R!|M2HuXQ7rkb zG^O}qNU;>Q>>#|lL`zu)z4N?!=)jG`x}>;b+E+zaM~e?4u_R1VYM5&GfRlhTU>^`p zb01v8uyFQUm8t#5nJ@R$TD6H^x+E23WF}){i_J&qceg&ivPsrcI;ZM^n!)W&RH*hdqwN<9u*;n-uFF_Ku` zC^xRtral}VHcYP#If>r3EhLhYVz)aqM~t80y@zjx8DeZIe@RIxPMNn|l)Rnaw-$l& zGESsxjc-~e9 zi@R<&GSaUU@9Pzmh9r9!<~^@|`($=`(Uk5jo>Uu6s|tE&*sfq?6=T$ucVVp{ z*qKArm6u_zVDK*#72Z~FU`=;Lv;3Aodt4DF29Ldwo=7J8-gmxzqSqrK2h!vQ8sXK$ z&VX^aB-7K>fwUYr=SN@%URnaiy`$6A-oc3AffS6DB0=ZdZ?aX+>twgs0y4iv8d7lP*)Z^Oe5()I+!ouLw0Zev*q^J7< zD5;R}(l`ug%ws-D5i7o6mNSxui&i7w|IWlfR$j_Mcz|n!2IpH{B z+B#`oP&h(VfynLI7*bEccFx|cq38gm4N3VlwSp!MpaT`Yr)0=n1(w}S=(N8_*8}zf zdlRJz3gb$2=1~qlw&t-W-44eQHV!jlS6?&saMuyQZcgh!(HMg8FJH3=NIWkQ9Cpo{ zfaaxfAVolG4t0jn9@X?OU-yF69`-`l7^H{M9_WBB+aSt5Tp)G;wL#Mu9SHbxCM0O# z8aTnVLghfbO5}iyfTA&;?r*(gCWw6}kR8z~Yl@73*c|W(wLHWJv)n%iwLBIDx!gtW zf3jtoJ^F-@-EwD`P5V{Vlvm3{??*SpmscqlZa|8C_0O?*oxRsyOgsSBFRqDZd#! ztkTHoXa;gPIBaoB{Yy&LBX~&|_t3xqPnn(waV&k<>=;qT2&T94%~e5wtQ}_I`*~IG zz$2I~%vzh$$&yax15pK%-(tzs?#L(Br2yPu&8n|ajhEiU8)AzoS=MdU(B^3^nWwy4 z61}e{H*G$);+newMV;^2f8$Prx)?Nde>2E3${R2igs_q9F&D*QALY&7s5;a}(jFtq z)?z)4VC5D}J>fHDR{J5UqJC`+b&pUtS;$jikRn1#)pmfiox;A}nt@)YY6jgHOcQ>& z8cc(Fak6nZv0#7~gK2MuIV`WM@i=(W#j^twi-l^+e@!@05qu;t+XTaSO89GW_tqv8 zM?UuZs94H;QnwK&7S2F!9fyTki;D>+lS8&lGfkiRP3fhAr72T*A@{Np+@0-gI@9ZX z_;^WN%@GD#mL3)!?0nMXl5D^QWp!5zKW2-w$TWpC9a*4**0$AEp87bq=Lz~Aer77^VVVHwW$rson`cbF$%5t=dmPIV^w||?DWJOJ|NYNNB9tsls z?G*R}!U<&CrlF%|@bQ`ewRjX^VSyv~rBEdL4WS|4J`96ylppoEi>#C{&h{V#Z;0xUYqGP0w>ltLmdy9(X|6ia!3EJOx4SDK$9vy0CcLsr z?`^TQ)pl{a(;IGIjWIyC?HzDA79~z_!xep#wwlzXOE(l(ox1N<<>hhF9i>4J&Y>p>F$M$u?@5LreZLZ#rQ z!je%;nM&8WigkQ#JA!AA;Hn+;5+ISfAc4EF{zx1?;mCPFv}{k(aP4(n&=#%VwjUA`*9^r42-Z zkB}0SxFbt?_3fM2>qZrZ1KgL2BHi#Wq)A)(!4t;8quap`io(y(!k(Bp?Kld$K1I4A z#ZAQlhcD5GFY+@|f(n^s%kf3%fjJrYp$`EL3Z0IuFg(IbbdN8=gI^83ghS0>t6xXl zy*ei#pA46)wCDEJqciKo20NDUvNPFa_^>mGg>qh;lOQ`^GI-- zr>QCIq)JiU5}nW)Sq0Pde&17{n@Jh6MRqap4eEvjwfTg_SHUsJvPvaovqIy$!a)7c zc6s!OM=Y%yw1VHWjfa^`H?`^?Y7ASP zLJKV@o7XxOWjM_iaG+;ve3Xy9)oW?Qw>SlUwI`qO#1-l8xnW#tYwKPiT_X`910q9=3w(mCM2>PBVL$iiwC*_T{IG+9G{wWqk|E>j-R2*oo zq);w_q29(#%|8Rukx_JDiZxP38 zdz2-|_Zy`r9w*Y|wRZMQDQK6AqCz3>yy7CI$W65>Hi-(ovOe3{c7kO{_$SdUQHC~5 zQ{`)QD7u)KHeZH6V@X9Wdc3corAl#0nfF z9bs~vh-jYD3;KYc7sD)imZ0o(h?hZezisBEU3LE%xOtgoW7wP8ukw>4sdC>Yj)ZhQ zKYIXy4y^Y;-JL;s+@-lqp>yELqgeKs$Hu&JrOm{NjvntZU7K>dA)^`*x$AG;*DFG$Zb33^L z(%8V)_f-r68f!lUWyX$(S(Y+Yv}NvU@n#}!y6#jb75(rjdhTNJcA{oD;xyNW+jGR? zI2&Ej5*XX6ub<4W&)sSs2T!KTb(F_JxViP9j&<%)c?N4TD(QGU_zV3!=!aaqD{eZC z!szqqcwYioC4CkR%=m2SlpLCrY)j?PT^MDKSqgIPaxI65P(boS3ynfGu`3VHm2w0T z2TzKeLqB&R8ywAw{otDc;9D-L(L9uJcfS?k>+pWh3)-t1!h>`LPrJ@py?1kaCaQbX z8L0c5BDht~M|IOayyTQ<7O%)wvYp3eg8JXjVR=7nKC(D^%e*u zZc!>+7;(puyH{?uf~RCNZ%<&9PlgC{l2~A@@E^CW<4qr)B@IH|Y5U+xo^BSc(u1hO z-ExtZ$P#zy_4jYpxu?hK9=b<4F721W)iUU1`|Q-QF1boa%xf9<>$jX`NDJu_qlE^&)z2`ARmga>^3pIR&&H7tZA z`~>_$@tzGj!+3o(HQBSq=H~M77?dBs#Sz0lSKL^D;zIrtg~}zz+8ZU;E=Jj$tj`Z! z6o&}PI%MO$iFrb&&V3l z4J-M&+H$-b^=5@jvc+XtpC>5gQWKP^VTEABO0nW7GE82BH_p%+t6@l94rSP$TNFYK zaiDppxZ5F8;t>s&&Hgm5G2q`XK5C+1M|O>PTQNI5Y>*j|^khaR=JYwdwuGvBoGNz3 z_kBPOHpYl|`M1zS8`?E9)5nz+cYB{}bZg8#1}7IBHPfmQ(XgmtRs`*GE~;fgw4YF78^sF{TUm+dGSqlz3n_U zq}YUi=FciO(0#_9{V($eA$&Ry!36zRc}hl85EN2TJZ*5qR3F#Dvz>uey0N zv5?4mkTRuUEa^`jW-;wOEVNJH?u0&g2KXQOcFVlBE5@uqh38t#K|QWN&S+k;9-tYC zVbttSN4`_AB|nKJxSY^_@uteI)q4VlCJ&zihjON_Gz`VHXO!#babRUzWW}q%i@c(0 zM8CvLmzzBtiK7*Fe2aT#isc!>U21z_3TNVk7)AnB^d|8~5NgX_`O`Ct*OCWhnaFtt%~%(r zZY@`{c*`|)1&g%$>fngv{;ZCY{Zp@0DW^}0_$JClOI`T8{pKog+HQ`Znw#oR@9L)A z%a7ZxGJ8NXwZGc%w$FXrZ#jK(cR5@1Ddbp1J-ZVcHII5(=p%M2c=7`YmxQWeu4?Rrp6Y>2E+&5YzRc*s` zNs^~p7dQ(ew(nP|^e>B5NKv1&KBIl8!j3_OZudd!PgnM^pI}vr&QS0izj$W^B0lnQ{#t6Ys!8v9R6{`=T#j+b8t+b-{VxTbWtsqBhOsme+|W z(sY|LPsJL`0jZ^X1fbZdbMbV@lg^CD!ra^~>XhXM0 zEa!YJCd^#XkDu01;J{Zpi!6=5DR# zA5Rc!*1Y6!R>vHQRar+jl>)}#DL70iBqM~o-+ZD~=Lil`J&lofa^GUqPu70d{jRQ> z?45mp|I=Xd`iE3?6_qapEpw|Pc^l{AUDB(guU0(9UnOaOT;KCxuamfSah`E+4nOq| z@9~eaRw`*gwUI26e!Fl;zA9N(y<_N>fEy7>Iu_a>0v1j`q72-yjtfRUa1gEV`L63u zOSdeg>4W6f17&N;8jpfzywhd?ce7`U%TnlcPAvk%XwqYHXbY;}xfWxT-WIezTNJ&X z>|?Y_ONmG+BbX3|tWr%w1ZnO@{jBAlI>{~=7;%!Uvo@>@JBC>#1K^R}t09@mtds!- zN=fmZl`;`Pf>6N zUQ@qxGNm6_NH>qp<>=4{6eWbncq!USSUwEXvLQuG%FF~xU>WA^vDDD&^K9Z7j;)|X zinbnL<+i1!>}d}50>_ADE?5TI$B;G?MOF*T8GT(qI=4n2#XWTndkJ$+zMN)Ae>_>6 zR$S@pz>LJ~NpeM#4PptWPZwFi?CDj71yyey+o)e?98Uscrxi~z-3n)5Dl~5 zCf0|Th&mv@eMd!4`qWo>06JsDNIF*!n_ZsGvis(sFTZLJXGq6KktuvQwkF}XJ$5MWoT$_rQw+lF%oDi{;Y8%KL|3CoA; z7-5O`i<5|=@t6VP*I@KWzO+a62-l;@?3jW+7Vuu#TS4%&j&Q^DD4n%a&$AR z?O)Ph|Twi%O_y9|DtE6ibd@DS=M-qY}(`v%x)}=hp>{9^yoJU=yTo%-IqS5x1*a)(3J)a?$0G%b(|E z!lD>IWfGLiVfDT-oat{TVf2)^ze?^^tC}O((GkQiG-TA=xhwL%MCTmJ-;LNQN|7M^ zT+QIym}k_F^f5jmrkB*%5GN4@1RY8OHLmlUeo8h;@xeO1{A@l+rv5|SR47}FsdeT! zGI*w$Ad`50w2_iHrO`0~6jb%s{@Zm<@Y<*|Ub$-c=u&j3HA0Y^*MkSd{?GnLkX>Ao z)jGyKcHw9`CLcO{(p{MI>&+zWYV*u%NjQ%&KYtqHAA6RtgO;(YPnL|`XHE!y^pBki zZj?wh>>BSj{<6(+r*f6hlb-I^Xn>NKnM@j?LK>JE#ZTnlQA|(i^u!go$`-HF_qBIu zbwDb*soEinuzfGeAcnbWZ`=?a>5^u|P{xiq*4#3PKEyL1X5#cR)h&e@JlVDoxry{=8nQvhs>AUz}R3j?2rN>lp)I#+^^K=z=?rPgNaG zo=@&|cJKLiA1|KnPt(bAs8+U!BFx^p=d`raPE99@*A5_q;%?ua$X;D-E+bjdpPrUe z*+}$n&{Z?vI}4YG#t#tlq;DTCIteeuNw;rDptG{sG`E^9_ffMknQ0!1nbIE4!Hl-$ z@!%bXkbY!Z2n}UtUO23(4PuxOgSV5k@Qu>iG8!@sy%wH>cW4lKOd+;9r%=kGoWu*U ziM;CDS|Z^3SOnH)luLte919Uf)?)B1Eh6KU{w6HBwJO8NKF3;>DbzJGr+=f&ajnuM zD>VdLz--!`h0uK~mveGHEX-M?FYMv@Z`aWcC0FCa zYjvy0rb>iu6(Dm4bFM=&N^(30o9x5E3eZ?7X`RJlwYMFsWGyj|!*6K&i*=xtK7~mp zRS#fqLP4!TNY^;&`UGh(Nh{W|nk$mg>gVfq4pICvT- zov$45pA;+yd8CmCcGXyBmX{bcWOJ3a{Luz7DeUObYUmi_X&-C5w7GHz1NX*c2HVx- z$m?;{1<=JO8B;%f5tD*?m+DXWF`T(yW;l86JvF0|rO7fs%?i@-r6OpVox-MR`X?k_ z4H+5f@)DwRpS|Ye;OzG-Y;-2nre&Y&A}Q6b7G5?+br$&{rC!PGh*y}cyfYVIAw?#J z_J-?UD)6DZnM5-W(0+tie27@@$~hOS$SUJ)j;9k+6LE9T<*8I#aQW&PXk;o$`@X5N z0WL%RiW8^qzDOIqlSi{sO4lj9FelB zAYg_6>;O-aKf|TAka;2Bworkq9A)}Cgz8{Gf7*{h;=$CrygR%X2m|WC&miRDx|*|J zgn0QZBi%b7G~K!xTHQmKaSrwgUi@Xr27%ta1kf0lZx}(6_iLm~S5mwWOr9cUpW3OXOn?L3LJ}$- z_TU#0I4s2q+v~2rpu-$FM);>I%3Og~FFPQXsw$5qYqD0jz4!*yIbIK| zmd0D1-c0g1&~JrbI|w^VCe5#V2a{V5AeeO{A0tUyBd({v9_HfvwwDXBM>wKXMSb79 zf+QiDcZfaZ_^LF^!lLcKPhKXZM2XISO%3lboHSs7;{$iJ!icuwOV<@HK5jmj8E)Jc zL+Q9{)B)#ZM1K551Ux(+8`H0_qpitT~<+Uj-+VV@HH znPS_@yyam=k=IS5fSb#xIyJ*M$0ft6c>B?Z5+E`4O;r3g z$#1};VTg4S%Vld&ZWOb=;S^Sa&T=c3u2<*9U4wV7!u6{Lr4z0$pMM}LN|WMeXcyU2=q;Xf_j zYu2#r@Ni{hO5irIHb5<)`+~f`v|VtUt0!^UuHs+f~%UQ0FMz^ zY$EP;sq3rG<+Ok?=)F`w-VAXYs4KD9W9`J5Qy=|QSj*e}{Nx4FOeEaRCo4%IVo^If zW@u)PkQMfnAXH7o;rVD*{brpt?c$SEmW**0NrQz>W>2lofXeuktiULU6^!Ezm?XfX z<&}Z6aSnn?G!(i#5W&b2(lVY8@u7-|ZXPk2tC+8;+w`}ZP6K^&wxrk2s3>y4Eps?i zryHEo%ruUH@F;bj>7dKO#P(SqsVSwpd8E+Fz%ed7cn3ZI z>x07{b#VDIEs!oV#`G5D>&vpwF^x)FC9Njv#?yP=4|&}8-B*3+G=9U&qpPL{v(WNj z+?E%=OsCA&EFKGob$x(KFiq{cw3HbxUiJx5%mS1YuFh~sVr$-(lPGoW&ZTUI#3?%e zKrWn)C!8j9n~fCwVKJB5(C+5!^SOR~c+UPAF?Op&?kBrw0gGZB!!tSp_LsQ02z1@d zXl>VJgy$Ef$hWB-Ir+0E6_#d>ce}NtP!{U>|NNZ?Tr9h*4+&5w`ZH z?VeA{Eo>Scy)JdIb3I+|5b|>-FHrGMI_*I8@ly zyEBfTb3r_lb-TkSZZ>7kB{*vyU$z73DrILm>drcLzFVSz8x*t}7g$CjA}?2}#6+Z- z9%}%0rv^2KMFF?#OHk&6Vv&99IC0@-YDY|)B~zQkHqF$Gk*oO$>6Eq>bs%h*#%(X) zU2y_lxpzjd`axD3h%v;ZkayZH1)SUG(KljvP8k6SJZkRi7~^yS(e(@Lw#1G z`kEm;G_8CB>tAByYWI>@x~CY7Cvlr$#sSH+;h8AmHP~t5Dmfe|J%l|-aaX5Nq5{mp zGN9fjb|*NzrD9M6nZT?^n5>Q|niRUik_zU6+l^ar>_0+QlgF`g&C+R7-$$;^sdEUX z18C*$Cj0eoEzHUF_s>GLE4<>V5c{zL58YVj?PvQvJ@i5FF%1sUL}H&`FvVKIbRX9~ zHxOdn2#o3~w)$T`!|LSC3MhaL*VU$TNoZL`_K`9VzEC!41AWV>+0qRJf3=rG8VE$M z$62+PUr#D#3Rvq=!^@e+vPEs^;S?e8>O;I1%u)1v-khP|>YU}G1+mlnxWXdg<#^GpmjsB z^Jfa6YYdJLu%$Q<1LS(81M7Nzc6q+ALX!3QT$&C*c8H?%{FWh>_rV<N1fd=dFZ5G^DL%CU%rm1O8r&uu$5BfwSb^~%F> z^(CgSVc7wHhQ9q7h=)VR2nP=vvmz=qyaGGM$FG#J1vi%z7F7SPahC%y=k30i#Lw}< zQpjwdvY`>cW_TO>g*`#{aKpTWaJ`b|6G;Mj9+~4CHa3q*hP&#s{S=(XF(vq_;W{*z-7OWc5f%GgJv#{#yvmP zJs%tEiogkcRIi?zM;C{;jl^ixQ~V3h0@mG$gxiMn=MND>=Tw2z`eVfe$__(yHH(Cz zj!E%6q4Fu%@v&wNRKUvo-{yT=?FqonVXM~(*4G7xHi%NXNm*KNVCh^Cid-8YR`m@ z&ddg9`&3|{3g0UalFEJAGDT4Ip%4H*X9hCpy|ef60)q|$-(U6V%}Gtm&5a||6{ph? zB~vl~_zSg9D1m!+qK(xNcPU_<7HwTD;IOUs-Z2DgwiC=hRBkf&FX zZWVp4ufX9P{o$<@`se@}r~mM49$MM=d&xNxu>?dXtWpU%7oZh>4|8#;?DAYTd6p}} zgw_Ri9^<>CXpZ!Gb0~p}@?ou!XtJUdI;-*{Zl6Zvo!OM>*WL|qV=F9}6>&$fD#~X=qF?)6?SJVhU_p*V;p*-4;WbcWq$|jXkmLnDE>h{R~H{ z&2^xHs{~Du{@E;MtRfG_@KAS>duLKQXpr_Dk(NOTRF}bUPty&&F|+r(iIWNr=>->B zkKn285~1jsurD69b~nb;HiAvKkAZs)0t4;Ti#8Pt7T9BLHg~mso5fu?=RmP1Dv0;y zF3YmPtziWhtY_^OpZqIwIX!qrH_ZA})s-T=|ja`p)SL2mt)>;t}D+RXj*xn|b*{nu5ur{=RBE)PV$J4il@kf_dY z80YW(8`K9+Q@2E^??L0<3`o9wCJ8Ftijt{bmVB`fmG-KQ|%UW`M#onkR=RB8MNqx9f-Y)P#?U&RCgf z1M%X4dS?#-=EA4g3A{M$JSFggwcO)8nOphweS2!gj{6>Gd(_ItK^jk_NB75YLU(Ap}v z9tXTKx1VepGFnrq-YFK`jhtqDSvk<12>*thHv+xSaV7}54mi#WZ1O&8@tUd`=bp?{ z%4?6@u?VP#61c854$y0gE>9qF?K3Tm3*IYenw=V5eL=?8{BZH>!W<^KohQQ9%-Kvr zpNx4?q9tepL9ChSc!r`O3kt@BBX!b3eTfXvAZSd8I3WT8IowAmBflYEJfppPz{T0W zjXu_vs;5;lCG|3<2y_TWz(%A`Ya(4jD6jBSC#A;Zsdp3lYOo@Vv&fFdjK{n z1y38Hl@jHl!39Ymf*SNU$Hbxh*(vgsPeNiGs5z2Xp?CI&KUs2tAW}AuP z)5XOb-ojzvM3;U$soY9GQM@l`)xIs7lXw|!m;dEzJO2#jS=69^UW&<)I0o*^rE7E7 zL%KQ1MZJ|7he@!BxBDECyQ$fU0_+5V4c2&dU}F7ihIybwEJ|%n5loG^zW2-ujfY1@ zc2x#q8v4c-oPH=6vvK{T6vwoYsiIC`VA4k$>TG@b*k z$i#NX!4R=Wb*b-`pgUUQr)q~gH@DFojgy{?F`mrUL^}kem>a7xoz2#Uq}cir3?%iM z)2#a`K1m$~S4x8AgUzcDRO@Cto)SvB`%-JlU3_J>o7C5HIVdI3Rh*g)g-F{fj@7yo zLFLaSX^;$x6d9wG#bI*^#Q9jPoi7j%i>={T9{0v38vXM*)V%NX%=$WWzM;H!Sd7?` zK(a;}nfY>j;kA5nVitJWM~zx)%Ft8lx(_hLx7hoZMB4pQGw1XOCPi3|b}6!laQ3JZ zSesiY1z|Jii@>+z#*_!?-d23{V57!3N><4|Nl{9Ue(wc{#FaspwM_;0If*r#{4=wm za!P4*oMI2h2ofXi%owcCX;ckdbBjZOatdZjS;#aVBxyg%o%95fJcyyxL6Xv#wG5Uo z1L3cL;x_^FdJr?Lk?GCr_%Dnq7cGPI9p@%2mdz9`i+=RQn{Br|&&BPhHSw;uZR-vs zfX^RRnU@i)PBRHi&&0vp-L`8Mcw^?o-)ah0!NO97UmV{!I4q$ZbU*Ct#CdL+x|G(8 z<62=U?KFJ?^!PYfg3EtinQ2$YO-l%HjK&mucw@~V$T0qSh9mraZu5p6Ci=h)Bl;e1 zWdrnV``8NA=Bfgd9)(HPi<(QcDuUfKBsVfiwmC%C7@_c2p2Wv!SRHa!=YyNM0NVxc zf`068Ab;Ile-B!WUJqDJaS7wgpCbtjEwDmU0UV7wwdDv2M0$6=XC-n z69qrsdeVB%>ut?@dfG~RnnLj;;A7{jzz{FYBRhonh+@2x-;(F+B60*v6AlZa9%3Bw zz!~DY|L`KA{%Mf(2-Y$jw)if>2dndQXClZuMy4XOI|5kWd4sYL%HGeN+Zr)x8uGDF zEaB-ssWAdk6sc<|-r%oxKcbNqHXH8%m7xlrN8^3w%{s)yO!7%W#h?l2$FF9#1#(T} z$AgL90WrWMNDc8p2l^`$1Y`%A>i(BZ_$3tK?@Wk@mVxf(hYipzc6t(P^~-@A>rX#y zeyw%&>ezvT)=|`)I%D*EAVP!UoL~Yv!3&Uko!H@P2k=UM-A=-h_~ju6hU_}38e8=ALHzH0Lbl1I>!@C7b?>q7KoK-P=pgmSU1ML_s>^n0 z`qw)vyQz}EBJUyYcyYD`VyrDOsk$W?S#m#dnCbwca`Yp0MQxHVYyv*QO7MKyD++_PrERl_;^ zo)p0x`8VO|N zq9TU5T-o#D;m+mDxUjG9hjG-wV9*=S$o2OwZH>Ft{^Qf6PS%IdQkU~z{>S_^7E8b;N+q+#T$)HgA*)nj+R2($(&>OTm06Q5i`S zi(TSAb22mhF+{dCKc@JZg2Bk=GwMl?V!l85X}tqP&S5z&h5YWPwFkIV0kSJ2qAWlw zAuCF6rSD{HO>bypMQ5OIWng1tXldhUME7gd%s+jj`^z`<|NV_Epr);zjjgergPF0t zmBOTX4*`lN{T04HFME+hIOP>#$U6s1PqT$MhVUwFF=Qbun8!zLP(Q1y?G2vYjLoKI zx9T?BYa`7Wk8D-X2A;+1I37@^_dHxpND}sKu20@M6M@ zq{AX&RxIHs(<%FX$?6@b=D9QLRu%F4>CBSr%J;SX80Iv=7n~CQ7wV%Vw%$8$hOjDhO^!pPe>_1yy37@9|^^J=Yr|bTKf42 z!nu-$jsV8+DT>-inzAyj?=Z>?%i4Q_D36XB{Do!RVjgQVZ44=C^cL>O&9U9H zLd#+_vvA>X%o=<78J{z1457uzLJR#lCpS3~5AupbTXs=8%e8am*aZgPn;55WxR3o0 zRr|fGxIHRMCji~F0SMA9|NnJYxma1Y#VOdNG9V6QewsOr-p0kAs?{cr`e+tMR=1ev zG`m7(*wQ;Q51UHzc*C6= zZGk0av>Ei%@gZ(T?km#i%Nhz(bZlz(XSX&{z)9aUQi)Knugfb!79xh9%5qaeCQP=w z1Fy>TXC!iU8Ex$(tEyV1`UQdrGTt!+CR?8E+M04|9R_8EUJqMVKC{q-w zSi>q6Z0`|^FMQZB`Hc9~(8WI8KS(}=<1ZHPu0pS4wd*zns5AvqZ8lPiZ11P?-ox1mBMqx#=FNW2sr@HaFvW-~2!jGc(&Dh6J zGLtGymFO4Trx3MQer|G^>R> z!bOHqIG;We(`bUZOa&|8xJ-Ww&Mm65dy3W}N$C_?={sxnR;|})Mk=;?CK<-buOXBW zrt!m0QBtOp5&Z)J@b@1G15C-^%6GzjfcJo@ znEsz?0CIW$smAVaH4OBvf1kYnQu}+HWF(uM_=0wEz%& z@3-e}>4frsqFZ{vP=L*YcfX%>P{(z_6dP zTmOlO#P2kI;b8FpJ(2%5j{hJF`OC*Fl3mqW$ zwEw~U-cUb)&ing@3jXo@@K4ZETmr2^fCi@n8vIviZ-DFCze0=Z8|oVw|GKd9BQHuW z8_oIwtrZ8f`g?+a-%FkkJpMmG3;y=hqhw}ct?%Gy_dlSYlK4450j3WJ00;isc|-*N z6S|P4zCGZy+V4(wKQ>r5?@QD+V2F8v{n&ZdRR0sCj1lXDM z;@^whLiE7l5P-%eKrrb3Lc>DzCuxWqyZk*ibDZ`2N&qG{fa~8E9)B-+K0ea_hAsF@ z!~e1j`6GL{&}{Di9^PB#=ivXc!1p8ks!FeGHlWEMfYyJHCjEQK^YN1XH~4>Sx4w)Q z*fRhv1_1m$fz|IN&&N#eCxJy=42^9a%xtXxp7Dg5s*`*GG53P_QE(dN|Bb?Lc7X6N z=D?qhSpCQz*Q8f2f6pE%<$t5`k9^0zf3NWZ;K_fphgIb#f&Ya)X4Y2?GyvUl2GHVv zHZJpg0^a@`h5y(z!Zwb8+^sUk4*IsHHrB=@KYUg+ws*Ar?S$Zutm7O3ftLd)^kCj! zGsgZQ0EC+VxAgyB5UNHq#tHz_C>3C4`l|*Ra{FmY|GCG%r{Um#`y(n0U&=5|D|(3e*8Bw-_2jaf6(WQ#huXVkU&76 z5P#I?t!Y1lt?&=nKV~}qokMv(`uRVF{XgbC{&9r-nB(scN|WV3L+QUW{{2Yd$MjTx zP;jaJ847=!tm;Q1KPG(ogGgB2&k*@*`lmmm|6RI+KhO^WiMM_)(KXIh*@?%=#aJe~eG~2k_DOPXYfPt?)i-`QqM(~ep`EgVA4|oW$ zpM(ELOW?=-%0J*?!2eh9LO<+Y{`o%sZgc4mLIaThXN>6mePBi+s>_bqn?{{#LU#oE zv-Hh?g-mA@X*$FY{Rw)+u!j~*>=QSUw}6&u$~7sTC5oYfDNP@ J{J;h|0|1PRizfg8 literal 0 HcmV?d00001 diff --git a/laws-modules-docking/pom.xml b/laws-modules-docking/pom.xml index 5b9c98b5..b8c1be62 100644 --- a/laws-modules-docking/pom.xml +++ b/laws-modules-docking/pom.xml @@ -34,6 +34,13 @@ org.springframework spring-webflux + + com.banboocloud.codec + bamboocloud_Codec + 0.0.3 + system + ${project.basedir}/lib/bamboocloud_Codec-0.0.3.jar + - \ No newline at end of file + diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/EncryptTest.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/EncryptTest.java new file mode 100644 index 00000000..e329a3a5 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/EncryptTest.java @@ -0,0 +1,24 @@ +package com.jero.modules.docking.iam.chery; + +import com.banboocloud.Codec.Sm3Signature; +import com.banboocloud.Codec.Sm4Cipher; +public class EncryptTest { + public static void main(String[] args) { + //sm3签名 + String originalStr = "userId=1"; + Sm3Signature signature = new Sm3Signature(); + String signatureStr = signature.signature(originalStr); + + //sm4加解密 + String key = "JLB6L6MJVIT5Z7IL"; + Sm4Cipher sm4Cipher = new Sm4Cipher(); + String source = "{\"userId\":1,\"signature\":\"" + signatureStr + "\"}"; + String target = sm4Cipher.encrypt(source, key); + String sourceNew = sm4Cipher.decrypt(target,key); + + //输出密文 + System.out.println("target:" + target); + //输出明文 + System.out.println("sourceNew:" + sourceNew); + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/entity/AttributeEntity.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/entity/AttributeEntity.java new file mode 100644 index 00000000..a9d24207 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/entity/AttributeEntity.java @@ -0,0 +1,40 @@ +package com.jero.modules.docking.iam.chery.entity; + +public class AttributeEntity { + private String name; + private String type; + private boolean isRequired; + private boolean isMultivalued; + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isRequired() { + return this.isRequired; + } + + public void setRequired(boolean isRequired) { + this.isRequired = isRequired; + } + + public boolean isMultivalued() { + return this.isMultivalued; + } + + public void setMultivalued(boolean isMultivalued) { + this.isMultivalued = isMultivalued; + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/service/BamboocloudUtils.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/service/BamboocloudUtils.java new file mode 100644 index 00000000..f7127207 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/chery/service/BamboocloudUtils.java @@ -0,0 +1,87 @@ +package com.jero.modules.docking.iam.chery.service; + +import com.banboocloud.Codec.BamboocloudFacade; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +public abstract class BamboocloudUtils { + private static Properties properties = new Properties(); + private static InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties"); + + static { + try { + properties.load(in); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static String getProperty(String property) { + return properties.getProperty(property); + } + + public static void checkUsernamePassword(String username, String password) { + System.out.println("username --->" + username + " password --- >" + password + " ----ok"); + } + + public static String getPlaintext(String ciphertext, String key, String type) { + return BamboocloudFacade.decrypt(ciphertext, key, type); + } + + public static Boolean verify(Map reqmap, String type) { + Map verifymap = new TreeMap(); + StringBuffer sb = new StringBuffer(); + Iterator it = reqmap.keySet().iterator(); + while (it.hasNext()) { + String key = (String) it.next(); + verifymap.put(key, reqmap.get(key)); + } + Iterator ittree = verifymap.keySet().iterator(); + while (ittree.hasNext()) { + String key = (String) ittree.next(); + if (!"signature".equals(key)) { + sb.append(key).append("=").append(verifymap.get(key)).append("&"); + } + } + sb.deleteCharAt(sb.length() - 1); + System.out.println(reqmap.get("signature") + " now " + sb.toString()); + return BamboocloudFacade.verify(reqmap.get("signature").toString(), sb.toString(), type); + } + + public static String getRequestBody(HttpServletRequest request) { + BufferedReader br = null; + StringBuilder sb = new StringBuilder(); + String str = ""; + try { + br = request.getReader(); + while ((str = br.readLine()) != null) { + sb.append(str); + } + br.close(); + } catch (IOException e) { + e.printStackTrace(); + if (br != null) + try { + br.close(); + } catch (IOException eo) { + eo.printStackTrace(); + } + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return sb.toString(); + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/client/TestClient.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/client/TestClient.java index c6676aa9..ea029e99 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/client/TestClient.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/client/TestClient.java @@ -115,22 +115,13 @@ public class TestClient { private void sendUserCreate(int i) throws JsonProcessingException { // 封装 IamUserAcceptDto 为用户数据层 IamUserAcceptDto iamUserAcceptDto = new IamUserAcceptDto(); - iamUserAcceptDto.setSrmsCompanyCode("123"); iamUserAcceptDto.setSrmsOrgCode("123/321"); iamUserAcceptDto.setSrmsTypeId("001"); iamUserAcceptDto.setSrmsUsername((108088 + i) +""); iamUserAcceptDto.setSrmsRealname("测试" + i); - iamUserAcceptDto.setSrmsPassword("1qaz@WSX"); iamUserAcceptDto.setSrmsSex("1"); // 男 - iamUserAcceptDto.setSrmsPost("主任"); - iamUserAcceptDto.setSrmsDutyLevelId("4"); // 主管级,srms不解析,直接存 - iamUserAcceptDto.setSrmsDirectLeadership("1706939999105900545"); // 直接上级,不清楚应该存什么,暂时存为id(fcc-test) - iamUserAcceptDto.setSrmsPostStatus("1"); // 在岗,srms不解析,直接存 - iamUserAcceptDto.setSrmsStatus("1"); // 1在册,0离职 - iamUserAcceptDto.setSrmsOfficePhone("022-87648762"); iamUserAcceptDto.setSrmsPhone("13811112232"); iamUserAcceptDto.setSrmsEmail("test@sinotruk.com"); - iamUserAcceptDto.setSrmsCreateTime("2023-10-15 10:35:20"); iamUserAcceptDto.setBimRequestId(UUIDUtils.randomUUID20()); iamUserAcceptDto.setBimRemoteUser("srmsIam"); @@ -159,8 +150,6 @@ public class TestClient { // 封装 IamUserAcceptDto 为用户数据层 IamUserAcceptDto iamUserAcceptDto = new IamUserAcceptDto(); iamUserAcceptDto.setBimUid("1709786346053017601"); // 数据库中取到的ID - iamUserAcceptDto.setSrmsPost("科长"); - iamUserAcceptDto.setSrmsUpdateTime("2023-10-15 10:35:20"); // 测试不发送UpdateTime的情况 iamUserAcceptDto.setBimRequestId(UUIDUtils.randomUUID20()); iamUserAcceptDto.setBimRemoteUser("srmsIam"); @@ -191,11 +180,6 @@ public class TestClient { iamOrgAcceptDto.setSrmsOrgCode("IA00102"); iamOrgAcceptDto.setSrmsDepartName("测试IAM部门"); iamOrgAcceptDto.setSrmsParentCode(""); - iamOrgAcceptDto.setSrmsCompany("测试公司"); - iamOrgAcceptDto.setSrmsStatus("1"); - iamOrgAcceptDto.setSrmsCreateTime("2023-10-12 10:35:20"); - iamOrgAcceptDto.setSrmsType("002"); - iamOrgAcceptDto.setSrmsOrgCategory("2"); iamOrgAcceptDto.setBimRequestId(UUIDUtils.randomUUID20()); iamOrgAcceptDto.setBimRemoteUser("srmsIam"); diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/controller/SyncIamByCheryController.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/controller/SyncIamByCheryController.java new file mode 100644 index 00000000..6b7d8c88 --- /dev/null +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/controller/SyncIamByCheryController.java @@ -0,0 +1,451 @@ +package com.jero.modules.docking.iam.controller; + +import cn.hutool.core.text.CharSequenceUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.aliyun.oss.ServiceException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.jero.common.constant.CacheConstant; +import com.jero.modules.base.service.BaseCommonService; +import com.jero.modules.docking.iam.dto.IamCommonAcceptDto; +import com.jero.modules.docking.iam.dto.IamOrgAcceptDto; +import com.jero.modules.docking.iam.dto.IamUserAcceptDto; +import com.jero.modules.docking.iam.dto.bpmc.*; +import com.jero.modules.docking.iam.dto.response.*; +import com.jero.modules.docking.iam.exception.IamGlobalException; +import com.jero.modules.docking.iam.po.MessageHeader; +import com.jero.modules.docking.iam.po.decrypt.AcceptDecryptPo; +import com.jero.modules.docking.iam.po.encrypt.SendPoEncryptPo; +import com.jero.modules.docking.iam.service.SyncIamService; +import com.jero.modules.docking.utils.DockingConstant; +import com.jero.modules.docking.utils.SHA256Util; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * IAM同步的控制器,提供用户、组织、菜单和权限的同步 + */ +@RestController +@RequestMapping("/sync/iam/chery") +@Slf4j +public class SyncIamByCheryController { + + @Value("${iam.bpmcAppkey}") + private String bpmcAppkey; + + @Resource + private SyncIamService syncIamService; + + + @Resource + private BaseCommonService baseCommonService; + + @PostMapping({"/SchemaService"}) + public String schemaService(HttpServletRequest req) { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamCommonAcceptDto commonAcceptDto = JSONObject.parseObject(reqMap, IamCommonAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(commonAcceptDto); + // 处理业务逻辑,封装字段 + IamSchemaResponse iamSchemaResponse = this.syncIamService.getSchemaInfo(commonAcceptDto); + return this.syncIamService.strEncrypt(JSON.toJSONString(iamSchemaResponse)); + } + + @PostMapping({"/UserCreateService"}) + public String userCreateService(HttpServletRequest req) { + log.info("进入账号创建"); + IamUserAcceptDto userAcceptDto; + IamUserCreateResponse iamUserCreateResponse = new IamUserCreateResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + userAcceptDto = JSONObject.parseObject(reqMap, IamUserAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(userAcceptDto); + iamUserCreateResponse.setBimRequestId(userAcceptDto.getBimRequestId()); + // 处理业务逻辑,存储用户,返回用户id + iamUserCreateResponse = this.syncIamService.userCreateService(userAcceptDto); + } catch (ServiceException e) { + iamUserCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + String message = e.getErrorMessage(); + iamUserCreateResponse.setMessage(message); + log.error(iamUserCreateResponse.getMessage()); + }catch (Exception e){ + iamUserCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamUserCreateResponse.setMessage("操作失败" + e.getMessage()); + log.error(iamUserCreateResponse.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamUserCreateResponse)); + } + + @PostMapping({"/UserUpdateService"}) + public String userUpdateService(HttpServletRequest req){ + IamUserCreateResponse iamUserCreateResponse = new IamUserCreateResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamUserAcceptDto userAcceptDto = JSONObject.parseObject(reqMap, IamUserAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(userAcceptDto); + // 处理业务逻辑,存储用户,返回用户id + iamUserCreateResponse = this.syncIamService.userUpdateService(userAcceptDto); + }catch (IamGlobalException e){ + iamUserCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + String message = e.getMessage(); + iamUserCreateResponse.setMessage(message); + log.error(iamUserCreateResponse.getMessage()); + }catch (Exception e){ + iamUserCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamUserCreateResponse.setMessage("操作失败" + e.getMessage()); + log.error(iamUserCreateResponse.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamUserCreateResponse)); + } + + @PostMapping({"/UserDeleteService"}) + public String userDeleteService(HttpServletRequest req) { + IamCommonResponseDto iamCommonResponseDto = new IamCommonResponseDto(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamUserAcceptDto userAcceptDto = JSONObject.parseObject(reqMap, IamUserAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(userAcceptDto); + // 处理业务逻辑,存储用户,返回用户id + iamCommonResponseDto = this.syncIamService.userDeleteService(userAcceptDto); + iamCommonResponseDto.setBimRequestId(userAcceptDto.getBimRequestId()); + }catch (IamGlobalException e){ + iamCommonResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + String message = e.getMessage(); + iamCommonResponseDto.setMessage(message); + log.error(iamCommonResponseDto.getMessage()); + }catch (Exception e){ + iamCommonResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamCommonResponseDto.setMessage("操作失败" + e.getMessage()); + log.error(iamCommonResponseDto.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamCommonResponseDto)); + } + + /** + * 组织创建和更新移除缓存 + * @param req + * @return + * @throws JsonProcessingException + */ + @PostMapping({"/OrgCreateService"}) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public String orgCreateService(HttpServletRequest req) { + IamOrgAcceptDto orgAcceptDto = null; + IamOrgCreateResponse iamOrgCreateResponse = new IamOrgCreateResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + orgAcceptDto = JSONObject.parseObject(reqMap, IamOrgAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(orgAcceptDto); + // 处理业务逻辑,存储组织,返回组织id + iamOrgCreateResponse = this.syncIamService.orgCreateService(orgAcceptDto); + } catch (DuplicateKeyException duplicateKeyException) { + log.error("数据库值重复:{}", duplicateKeyException.getMessage()); + if (orgAcceptDto != null) { + iamOrgCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamOrgCreateResponse.setMessage("操作失败" + "数据库值重复,请检查组织编号【" + orgAcceptDto.getSrmsOrgCode() + "】是否异常"); + } else { + iamOrgCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamOrgCreateResponse.setMessage("未知异常,请联系管理员"); + } + }catch (Exception e){ + iamOrgCreateResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamOrgCreateResponse.setMessage("操作失败" + e.getMessage()); + log.error(iamOrgCreateResponse.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamOrgCreateResponse)); + } + + /** + * 组织创建和更新移除缓存 + * @param req + * @return + * @throws JsonProcessingException + */ + @PostMapping({"/OrgUpdateService"}) + @CacheEvict(value= {CacheConstant.SYS_DEPARTS_CACHE,CacheConstant.SYS_DEPART_IDS_CACHE}, allEntries=true) + public String orgUpdateService(HttpServletRequest req) { + IamCommonResponseDto iamCommonResponseDto = new IamCommonResponseDto(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamOrgAcceptDto orgAcceptDto = JSONObject.parseObject(reqMap, IamOrgAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(orgAcceptDto); + // 处理业务逻辑,更新组织 + iamCommonResponseDto = this.syncIamService.orgUpdateService(orgAcceptDto); + }catch (Exception e){ + iamCommonResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamCommonResponseDto.setMessage("操作失败" + e.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamCommonResponseDto)); + } + + @PostMapping({"/OrgDeleteService"}) + public String orgDeleteService(HttpServletRequest req) { + IamCommonResponseDto iamCommonResponseDto = new IamCommonResponseDto(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamOrgAcceptDto orgAcceptDto = JSONObject.parseObject(reqMap, IamOrgAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(orgAcceptDto); + // 处理业务逻辑,更新组织 + iamCommonResponseDto = this.syncIamService.orgDeleteService(orgAcceptDto); + }catch (Exception e){ + iamCommonResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamCommonResponseDto.setMessage("操作失败" + e.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamCommonResponseDto)); + } + + /** + * 对接统一权限服务平台。 + * 该接口包含角色创建、菜单创建、角色菜单关联、用户角色关联等4个接口 + * 通过type字段来区分 + */ + @PostMapping({"/bpmcCreate"}) + public SendPoEncryptPo bpmcCreate(@RequestBody AcceptDecryptPo acceptDecryptPo) throws JsonProcessingException { + if (acceptDecryptPo == null + || acceptDecryptPo.getMessageDecryptTabels() == null + || acceptDecryptPo.getMessageDecryptTabels().getHeader() == null){ + throw new IamGlobalException(null, "参数传递错误,未收到参数"); + } + + log.info("统一权限服务平台请求数据:{}", acceptDecryptPo.toString()); + ObjectMapper objectMapper = new ObjectMapper(); + BpmcAcceptDto bpmcAcceptDto = objectMapper.readValue(acceptDecryptPo.getMessageDecryptTabels().getHeader().getData(), BpmcAcceptDto.class); + + MessageHeader messageHeader = acceptDecryptPo.getMessageHeader(); + BpmcResponseDto bpmcResponseDto = BpmcResponseDto.success(); + SendPoEncryptPo sendPoEncryptPo = new SendPoEncryptPo(); + + if (CharSequenceUtil.isEmpty(bpmcAcceptDto.getType())){ + bpmcResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + bpmcResponseDto.setMessage("接口类型(type)未传参,请检查"); + log.error(bpmcResponseDto.getMessage()); + sendPoEncryptPo = this.syncIamService.handlerGloablEncryptResponse(messageHeader, bpmcResponseDto); + sendPoEncryptPo.getReturns().setData(JSON.toJSONString(bpmcResponseDto)); + return sendPoEncryptPo; + } + + if (CharSequenceUtil.isEmpty(bpmcAcceptDto.getEntity())){ + bpmcResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + bpmcResponseDto.setMessage("数据实体(entity)未传参,请检查"); + log.error(bpmcResponseDto.getMessage()); + sendPoEncryptPo = this.syncIamService.handlerGloablEncryptResponse(messageHeader, bpmcResponseDto); + sendPoEncryptPo.getReturns().setData(JSON.toJSONString(bpmcResponseDto)); + return sendPoEncryptPo; + } + + if (CharSequenceUtil.isEmpty(bpmcAcceptDto.getAction())){ + bpmcResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + bpmcResponseDto.setMessage("操作方式(action)未传参,请检查"); + log.error(bpmcResponseDto.getMessage()); + sendPoEncryptPo = this.syncIamService.handlerGloablEncryptResponse(messageHeader, bpmcResponseDto); + sendPoEncryptPo.getReturns().setData(JSON.toJSONString(bpmcResponseDto)); + return sendPoEncryptPo; + } + + if (CharSequenceUtil.isEmpty(bpmcAcceptDto.getSignature())){ + bpmcResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + bpmcResponseDto.setMessage("签名(signature)未传参,请检查"); + log.error(bpmcResponseDto.getMessage()); + sendPoEncryptPo = this.syncIamService.handlerGloablEncryptResponse(messageHeader, bpmcResponseDto); + sendPoEncryptPo.getReturns().setData(JSON.toJSONString(bpmcResponseDto)); + return sendPoEncryptPo; + } + + // 验证签名 + String validateSign = SHA256Util.getSHA256StrJava(bpmcAcceptDto.getEntity() + bpmcAppkey + bpmcAcceptDto.getTimestamp()); + if (!bpmcAcceptDto.getSignature().equals(validateSign)){ + bpmcResponseDto.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + bpmcResponseDto.setMessage("签名校验不通过,请检查"); + log.error(bpmcResponseDto.getMessage()); + sendPoEncryptPo = this.syncIamService.handlerGloablEncryptResponse(messageHeader, bpmcResponseDto); + sendPoEncryptPo.getReturns().setData(JSON.toJSONString(bpmcResponseDto)); + return sendPoEncryptPo; + } + + try { + switch (bpmcAcceptDto.getType()){ + // 角色 + case DockingConstant.BPMC_TYPE_ROLE: + bpmcResponseDto = bpmcTypeRole(objectMapper, bpmcAcceptDto, bpmcResponseDto); + break; + + // 菜单 + case DockingConstant.BPMC_TYPE_RESOURCE: + bpmcResponseDto = bpmcTypeResource(objectMapper, bpmcAcceptDto, bpmcResponseDto); + break; + + // 用户角色关联 + case DockingConstant.BPMC_TYPE_USER_ROLE: + bpmcResponseDto = bpmcTypeUserRole(objectMapper, bpmcAcceptDto, bpmcResponseDto); + break; + + // 角色菜单关联 + case DockingConstant.BPMC_TYPE_ROLE_RESOURCE: + bpmcResponseDto = bpmcTypeRoleResource(objectMapper, bpmcAcceptDto, bpmcResponseDto); + break; + + default: + bpmcResponseDto = BpmcResponseDto.error("接口类型(type)未找到,请检查"); + break; + } + }catch (Exception e){ + e.printStackTrace(); + log.error(e.getMessage()); + bpmcResponseDto = BpmcResponseDto.error(e.getMessage()); + } + log.info(bpmcResponseDto.getMessage()); + sendPoEncryptPo = this.syncIamService.handlerGloablEncryptResponse(messageHeader, bpmcResponseDto); + sendPoEncryptPo.getReturns().setData(JSON.toJSONString(bpmcResponseDto)); + return sendPoEncryptPo; + } + + private BpmcResponseDto bpmcTypeRoleResource(ObjectMapper objectMapper, BpmcAcceptDto bpmcAcceptDto, BpmcResponseDto bpmcResponseDto) throws JsonProcessingException { + List roleResourceDtoList = objectMapper.readValue(bpmcAcceptDto.getEntity(), new TypeReference>() {}); + // 根据新增/删除调用不同的业务处理代码 + if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_ADD)){ + bpmcResponseDto = this.syncIamService.roleResourceCreateService(roleResourceDtoList); + } else if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_DELETE)) { + bpmcResponseDto = this.syncIamService.roleResourceDeleteService(roleResourceDtoList); + } + return bpmcResponseDto; + } + + private BpmcResponseDto bpmcTypeUserRole(ObjectMapper objectMapper, BpmcAcceptDto bpmcAcceptDto, BpmcResponseDto bpmcResponseDto) throws JsonProcessingException { + List userRoleDtoList = objectMapper.readValue(bpmcAcceptDto.getEntity(), new TypeReference>() {}); + // 根据新增/删除调用不同的业务处理代码 + if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_ADD)){ + bpmcResponseDto = this.syncIamService.userRoleCreateService(userRoleDtoList); + } else if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_DELETE)) { + bpmcResponseDto = this.syncIamService.userRoleDeleteService(userRoleDtoList); + } + return bpmcResponseDto; + } + + private BpmcResponseDto bpmcTypeResource(ObjectMapper objectMapper, BpmcAcceptDto bpmcAcceptDto, BpmcResponseDto bpmcResponseDto) throws JsonProcessingException { + ResourceDto resourceDto = objectMapper.readValue(bpmcAcceptDto.getEntity(), ResourceDto.class); + // 根据新增/编辑/删除调用不同的业务处理代码 + if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_ADD)){ + bpmcResponseDto = this.syncIamService.resourceCreateService(resourceDto); + } else if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_UPDATE)) { + bpmcResponseDto = this.syncIamService.resourceUpdateService(resourceDto); + } else if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_DELETE)) { + bpmcResponseDto = this.syncIamService.resourceDeleteService(resourceDto); + } + return bpmcResponseDto; + } + + private BpmcResponseDto bpmcTypeRole(ObjectMapper objectMapper, BpmcAcceptDto bpmcAcceptDto, BpmcResponseDto bpmcResponseDto) throws JsonProcessingException { + RoleDto roleDto = objectMapper.readValue(bpmcAcceptDto.getEntity(), RoleDto.class); + // 根据新增/编辑/删除调用不同的业务处理代码 + if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_ADD)){ + bpmcResponseDto = this.syncIamService.roleCreateService(roleDto); + } else if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_UPDATE)) { + bpmcResponseDto = this.syncIamService.roleUpdateService(roleDto); + } else if (bpmcAcceptDto.getAction().equals(DockingConstant.BPMC_ACTION_DELETE)) { + bpmcResponseDto = this.syncIamService.roleDeleteService(roleDto); + } + return bpmcResponseDto; + } + + /** + * 查询全部用户id + * @param req + * @return + * @throws JsonProcessingException + */ + @PostMapping({"/QueryAllUserIdsService"}) + public String QueryAllUserIdsService(HttpServletRequest req) { + IamUserIdListResponse userIdListResponse = new IamUserIdListResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamCommonAcceptDto commonAcceptDto = JSONObject.parseObject(reqMap, IamCommonAcceptDto.class); + + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(commonAcceptDto); + + // 处理业务逻辑,封装字段 + userIdListResponse = this.syncIamService.getAllUserIds(commonAcceptDto); + }catch (Exception e){ + userIdListResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + userIdListResponse.setMessage("操作失败" + e.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(userIdListResponse)); + } + + /** + * 查询全部组织id + * @param req + * @return + * @throws JsonProcessingException + */ + @PostMapping({"/QueryAllOrgIdsService"}) + public String QueryAllOrgIdsService(HttpServletRequest req) { + IamOrgIdListResponse orgIdListResponse = new IamOrgIdListResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamCommonAcceptDto commonAcceptDto = JSONObject.parseObject(reqMap, IamCommonAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(commonAcceptDto); + // 处理业务逻辑,封装字段 + orgIdListResponse = this.syncIamService.getAllOrgIds(commonAcceptDto); + }catch (Exception e){ + orgIdListResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + orgIdListResponse.setMessage("操作失败" + e.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(orgIdListResponse)); + } + + @PostMapping({"/QueryUserByIdService"}) + public String QueryUserByIdService(HttpServletRequest req) { + IamUserInfoResponse iamUserInfoResponse = new IamUserInfoResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamUserAcceptDto userAcceptDto = JSONObject.parseObject(reqMap, IamUserAcceptDto.class); + + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(userAcceptDto); + + // 处理业务逻辑,存储用户,返回用户id + iamUserInfoResponse = this.syncIamService.getUserInfoById(userAcceptDto); + }catch (Exception e){ + iamUserInfoResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamUserInfoResponse.setMessage("操作失败" + e.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamUserInfoResponse)); + } + + @PostMapping({"/QueryOrgByIdService"}) + public String QueryOrgByIdService(HttpServletRequest req) { + IamOrgInfoResponse iamOrgInfoResponse = new IamOrgInfoResponse(); + try { + String reqMap = this.syncIamService.getStringObjectMap(req); + IamOrgAcceptDto orgAcceptDto = JSONObject.parseObject(reqMap, IamOrgAcceptDto.class); + // 校验身份认证,确保接口正确 必须调用! + this.syncIamService.validateUserAndPwd(orgAcceptDto); + // 处理业务逻辑,存储用户,返回用户id + iamOrgInfoResponse = this.syncIamService.getOrgInfoById(orgAcceptDto); + }catch (Exception e){ + iamOrgInfoResponse.setResultCode(DockingConstant.IAM_ERROR_RESULT_CODE); + iamOrgInfoResponse.setMessage("操作失败" + e.getMessage()); + } + return this.syncIamService.strEncrypt(JSON.toJSONString(iamOrgInfoResponse)); + } +} diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamCommonAcceptDto.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamCommonAcceptDto.java index a318a0c0..48238d6a 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamCommonAcceptDto.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamCommonAcceptDto.java @@ -22,10 +22,13 @@ public class IamCommonAcceptDto { */ private String bimRemoteUser ; - /** * BIM调用三方应用接口的密码,由应用分配给BIM系统 */ private String bimRemotePwd; + /** + * BIM每次调用生成的签名,应用系统需对签名进行验证 + */ + private String signature; } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamOrgAcceptDto.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamOrgAcceptDto.java index 233fa565..2ad206a2 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamOrgAcceptDto.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamOrgAcceptDto.java @@ -33,59 +33,4 @@ public class IamOrgAcceptDto extends IamCommonAcceptDto { */ @IamProperty(required = true, multivalued = false) private String srmsParentCode; - - /** - * 所属单位,10位HR机构编号 - */ - @IamProperty(required = true, multivalued = false) - private String srmsCompany; - - /** - * 机构状态 - */ - @IamProperty(required = true, multivalued = false) - private String srmsStatus; - - /** - * 机构类型。001内部机构 002 外部机构 003 虚拟机构 - */ - @IamProperty(required = true, multivalued = false) - private String srmsType; - - /** - * 组织类型。1.单位 2.部门。单位下可以有单位,但是部门下不能有单位 - */ - @IamProperty(required = true, multivalued = false) - private String srmsOrgCategory; - - /** - * 创建时间 - */ - @IamProperty(required = true, multivalued = false) - private String srmsCreateTime; - - /** - * 更新时间 - */ - @IamProperty(required = true, multivalued = false) - private String srmsUpdateTime; - - /** - * 部门负责人 - */ - @IamProperty(required = false, multivalued = false) - private String srmsHeadOfDepartment; - - /** - * 分管领导 - */ - @IamProperty(required = false, multivalued = false) - private String srmsLeadersInCharge; - - /** - * 副职领导 - */ - @IamProperty(required = false, multivalued = false) - private String srmsDeputyLeader; - } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamUserAcceptDto.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamUserAcceptDto.java index 33a9c927..2afdfb58 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamUserAcceptDto.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/IamUserAcceptDto.java @@ -12,21 +12,11 @@ import lombok.ToString; public class IamUserAcceptDto extends IamCommonAcceptDto { - /** - * 飞书id - */ - private String id; /** * 用户的id,在删除或编辑的接口会传递 */ private String bimUid; - /** - * 单位编码 - */ - @IamProperty(required = true, multivalued = false) - private String srmsCompanyCode; - /** * 部门编码,用于做人员和组织的关联 */ @@ -40,10 +30,15 @@ public class IamUserAcceptDto extends IamCommonAcceptDto { private String srmsTypeId; /** - * 工号 + * 用户账户工号 00063002 */ @IamProperty(required = true, multivalued = false) private String srmsUsername; + /** + * 工号 63002 + */ + @IamProperty(required = true, multivalued = false) + private String employeeNo; /** * 姓名 @@ -51,60 +46,19 @@ public class IamUserAcceptDto extends IamCommonAcceptDto { @IamProperty(required = true, multivalued = false) private String srmsRealname; - /** - * 密码 - */ - @IamProperty(required = false, multivalued = false) - private String srmsPassword; - /** * 性别 */ @IamProperty(required = true, multivalued = false) private String srmsSex; - /** - * 岗位 - */ - @IamProperty(required = true, multivalued = false) - private String srmsPost; - - /** - * 职务级别 - */ - @IamProperty(required = true, multivalued = false) - private String srmsDutyLevelId; - - /** - * 直接上级 - */ - @IamProperty(required = true, multivalued = false) - private String srmsDirectLeadership; - - /** - * 岗位状态 - */ - @IamProperty(required = true, multivalued = false) - private String srmsPostStatus; - - /** - * 是否在册 - */ - @IamProperty(required = true, multivalued = false) - private String srmsStatus; - - /** - * 办公电话 - */ - @IamProperty(required = true, multivalued = false) - private String srmsOfficePhone; - /** * 移动电话 */ @IamProperty(required = true, multivalued = false) private String srmsPhone; + /** * 电子邮件 */ @@ -112,15 +66,20 @@ public class IamUserAcceptDto extends IamCommonAcceptDto { private String srmsEmail; /** - * 创建时间 + * 生日 */ @IamProperty(required = true, multivalued = false) - private String srmsCreateTime; + private String birthday; /** - * 更新时间 + * 入职时间 */ @IamProperty(required = true, multivalued = false) - private String srmsUpdateTime; + private String entryTime; + /** + * 离职时间 + */ + @IamProperty(required = true, multivalued = false) + private String resignationTime; } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/response/IamOrgCreateResponse.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/response/IamOrgCreateResponse.java index be5c641b..59983e55 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/response/IamOrgCreateResponse.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/dto/response/IamOrgCreateResponse.java @@ -11,6 +11,6 @@ public class IamOrgCreateResponse extends IamCommonResponseDto{ /** * 用户创建后生成的id */ - private String orgId; + private String uid; } diff --git a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/service/SyncIamService.java b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/service/SyncIamService.java index 80f65c6e..da63bc6a 100644 --- a/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/service/SyncIamService.java +++ b/laws-modules-docking/src/main/java/com/jero/modules/docking/iam/service/SyncIamService.java @@ -1,13 +1,13 @@ package com.jero.modules.docking.iam.service; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.bamboocloud.codec.BamboocloudFacade; +import com.banboocloud.Codec.BamboocloudFacade; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.jero.common.constant.CommonConstant; @@ -28,6 +28,7 @@ import com.jero.modules.docking.iam.exception.IamGlobalException; import com.jero.modules.docking.iam.po.MessageHeader; import com.jero.modules.docking.iam.po.encrypt.SendEncryptReturnsPo; import com.jero.modules.docking.iam.po.encrypt.SendPoEncryptPo; +import com.jero.modules.docking.iam.chery.service.BamboocloudUtils; import com.jero.modules.docking.utils.DockingConstant; import com.jero.modules.system.entity.*; import com.jero.modules.system.service.*; @@ -40,8 +41,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; -import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -85,6 +86,46 @@ public class SyncIamService { private String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public final String PARAM_NOT_GET_ERROR = "参数传递错误,未收到参数"; + + //SM4 + @Value("${iam.sm4.key}") + private String key; + + @Value("${iam.sm4.type}") + private String type; + + @Value("${iam.sm4.signType}") + private String signType; + + /** + * 签名验证,返回参数 + * @param req + * @return + */ + public String getStringObjectMap(HttpServletRequest req) { + String bodyparam = BamboocloudUtils.getRequestBody(req); + System.out.println("first--param-->" + bodyparam); + //报文解密 + bodyparam = BamboocloudUtils.getPlaintext(bodyparam, key, type); + System.out.println("json--param-->" + bodyparam); + Map reqMap = (Map) JSON.parse(bodyparam); + //验证签名 + if (!BamboocloudUtils.verify(reqMap, signType)) { + throw new IamGlobalException(reqMap.getOrDefault("bimRequestId","").toString(), PARAM_NOT_GET_ERROR); + } + return JSON.toJSONString(reqMap); + } + + /** + * 签名验证,返回参数 + * @param str + * @return + */ + public String strEncrypt(String str) { + return BamboocloudFacade.encrypt(str, key, type); + } + /** * 校验IAM调用时的账号密码是否正确 * 校验通过了正常走后续,不通过直接返回 @@ -179,37 +220,15 @@ public class SyncIamService { sysUser.setEmail(userAcceptDto.getSrmsEmail()); sysUser.setPhone(userAcceptDto.getSrmsPhone()); - if ("1".equals(userAcceptDto.getSrmsStatus())){ - sysUser.setStatus(CommonConstant.USER_UNFREEZE); - sysUser.setDelFlag(CommonConstant.DEL_FLAG_0); - } else { - sysUser.setStatus(CommonConstant.USER_FREEZE); - sysUser.setDelFlag(CommonConstant.DEL_FLAG_1); - } - - sysUser.setTelephone(userAcceptDto.getSrmsOfficePhone()); + sysUser.setTelephone(userAcceptDto.getSrmsPhone()); sysUser.setCreateBy(DockingConstant.IAM_SYSTEM_NAME); sysUser.setUpdateBy(DockingConstant.IAM_SYSTEM_NAME); - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsCreateTime())){ - Date createTime = DateUtils.str2Date(userAcceptDto.getSrmsCreateTime(), new SimpleDateFormat(DATE_FORMAT)); - sysUser.setCreateTime(createTime); - } - - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsUpdateTime())){ - Date updateTime = DateUtils.str2Date(userAcceptDto.getSrmsUpdateTime(), new SimpleDateFormat(DATE_FORMAT)); - sysUser.setCreateTime(updateTime); - } - sysUser.setActivitiSync(0); sysUser.setUserIdentity(0); // 设置飞书id, IAM村的id就是飞书id - sysUser.setFeishuId(userAcceptDto.getId()); + sysUser.setFeishuId(userAcceptDto.getEmployeeNo()); sysUser.setTypeId(userAcceptDto.getSrmsTypeId()); - sysUser.setPost(userAcceptDto.getSrmsPost()); - sysUser.setDutyLevelId(userAcceptDto.getSrmsDutyLevelId()); - sysUser.setDirectLeadership(userAcceptDto.getSrmsDirectLeadership()); - sysUser.setPostStatus(userAcceptDto.getSrmsPostStatus()); // 获取组织机构(多个逗号分隔) String orgCode = userAcceptDto.getSrmsOrgCode(); @@ -229,10 +248,10 @@ public class SyncIamService { * @param userAcceptDto * @return */ - public IamCommonResponseDto userUpdateService(IamUserAcceptDto userAcceptDto){ + public IamUserCreateResponse userUpdateService(IamUserAcceptDto userAcceptDto){ log.info("用户更新收到的解密后数据:{}", userAcceptDto.toString()); - if (userAcceptDto == null || CharSequenceUtil.isEmpty(userAcceptDto.getBimUid())){ + if (CharSequenceUtil.isEmpty(userAcceptDto.getBimUid())){ throw new IamGlobalException(userAcceptDto.getBimRequestId(), "用户id(bimUid)为空,无法进行用户信息更新"); } @@ -254,54 +273,17 @@ public class SyncIamService { sysUser.setSex(Integer.valueOf(userAcceptDto.getSrmsSex())); } - // 手机号 和 邮箱有加密,需要单独处理 sysUser.setEmail(userAcceptDto.getSrmsEmail()); sysUser.setPhone(userAcceptDto.getSrmsPhone()); - - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsStatus())){ - if ("1".equals(userAcceptDto.getSrmsStatus())){ - sysUser.setStatus(CommonConstant.USER_UNFREEZE); - sysUser.setDelFlag(CommonConstant.DEL_FLAG_0); - } else { - sysUser.setStatus(CommonConstant.USER_FREEZE); - sysUser.setDelFlag(CommonConstant.DEL_FLAG_1); - } - } - - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsOfficePhone())){ - sysUser.setTelephone(userAcceptDto.getSrmsOfficePhone()); - } - sysUser.setUpdateBy(DockingConstant.IAM_SYSTEM_NAME); - - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsUpdateTime())){ - Date updateTime = DateUtils.str2Date(userAcceptDto.getSrmsUpdateTime(), new SimpleDateFormat(DATE_FORMAT)); - sysUser.setCreateTime(updateTime); - } - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsTypeId())){ sysUser.setTypeId(userAcceptDto.getSrmsTypeId()); } - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsPost())){ - sysUser.setPost(userAcceptDto.getSrmsPost()); - } - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsDutyLevelId())){ - sysUser.setDutyLevelId(userAcceptDto.getSrmsDutyLevelId()); - } - - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsDirectLeadership())){ - sysUser.setDirectLeadership(userAcceptDto.getSrmsDirectLeadership()); - } - - - if (CharSequenceUtil.isNotEmpty(userAcceptDto.getSrmsPostStatus())){ - sysUser.setPostStatus(userAcceptDto.getSrmsPostStatus()); - } // 设置飞书id, IAM村的id就是飞书id - sysUser.setFeishuId(userAcceptDto.getId()); + sysUser.setFeishuId(userAcceptDto.getEmployeeNo()); // 获取组织机构(多个逗号分隔) String orgCode = userAcceptDto.getSrmsOrgCode(); String selectedDeparts = null; @@ -318,12 +300,12 @@ public class SyncIamService { // 编辑存储到用户表中,角色是系统自己处理的,更新不会影响角色,所以不传 this.sysUserService.editUser(sysUser, null, selectedDeparts); - IamCommonResponseDto iamCommonResponseDto = new IamCommonResponseDto(); - iamCommonResponseDto.setBimRequestId(userAcceptDto.getBimRequestId()); - iamCommonResponseDto.setResultCode(DockingConstant.IAM_SUCCESS_RESULT_CODE); - iamCommonResponseDto.setMessage(DockingConstant.IAM_SUCCESS_MESSAGE); - - return iamCommonResponseDto; + IamUserCreateResponse iamUserCreateResponse = new IamUserCreateResponse(); + iamUserCreateResponse.setBimRequestId(userAcceptDto.getBimRequestId()); + iamUserCreateResponse.setResultCode(DockingConstant.IAM_SUCCESS_RESULT_CODE); + iamUserCreateResponse.setMessage(DockingConstant.IAM_SUCCESS_MESSAGE); + iamUserCreateResponse.setUid(userAcceptDto.getBimUid()); + return iamUserCreateResponse; } /** @@ -343,7 +325,11 @@ public class SyncIamService { log.info("用户删除收到的解密后数据:{}", userAcceptDto.toString()); - this.sysUserService.deleteUser(userAcceptDto.getBimUid()); + LambdaUpdateWrapper updateSysUser = new LambdaUpdateWrapper<>(); + updateSysUser.eq(SysUser::getId,userAcceptDto.getBimUid()); + updateSysUser.set(SysUser::getStatus,"2"); + updateSysUser.set(SysUser::getUpdateTime,new Date()); + this.sysUserService.update(updateSysUser); IamCommonResponseDto iamCommonResponseDto = new IamCommonResponseDto(); iamCommonResponseDto.setBimRequestId(userAcceptDto.getBimRequestId()); @@ -387,46 +373,9 @@ public class SyncIamService { sysDepart.setDepartName(orgAcceptDto.getSrmsDepartName()); sysDepart.setDepartOrder(100); // 接入数据无排序,都设置为100 - // 1为单位,2为部门,转映射到 本系统内的数据 1公司,2组织机构,映射关系一致。如下代码是为了后续修改方便 - if ("1".equals(orgAcceptDto.getSrmsOrgCategory())){ - sysDepart.setOrgCategory("1"); - } else { - sysDepart.setOrgCategory("2"); - } - - sysDepart.setOrgType(orgAcceptDto.getSrmsType()); - sysDepart.setOrgCode(orgAcceptDto.getSrmsOrgCode()); - - if ("1".equals(orgAcceptDto.getSrmsStatus())){ - sysDepart.setStatus(CommonConstant.STATUS_1); - sysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0)); - } else { - sysDepart.setStatus(CommonConstant.STATUS_0); - sysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_1)); - } - - sysDepart.setCreateBy(DockingConstant.IAM_SYSTEM_NAME); - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsCreateTime())){ - Date createTime = DateUtils.str2Date(orgAcceptDto.getSrmsCreateTime(), new SimpleDateFormat(DATE_FORMAT)); - sysDepart.setCreateTime(createTime); - } - - sysDepart.setUpdateBy(DockingConstant.IAM_SYSTEM_NAME); - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsUpdateTime())){ - Date updateTime = DateUtils.str2Date(orgAcceptDto.getSrmsUpdateTime(), new SimpleDateFormat(DATE_FORMAT)); - sysDepart.setCreateTime(updateTime); - } - - sysDepart.setCompany(orgAcceptDto.getSrmsCompany()); - sysDepart.setHeadOfDepartment(orgAcceptDto.getSrmsHeadOfDepartment()); - sysDepart.setLeadersInCharge(orgAcceptDto.getSrmsLeadersInCharge()); - sysDepart.setDeputyLeader(orgAcceptDto.getSrmsDeputyLeader()); - // 存储到组织机构表中 this.sysDepartService.save(sysDepart); - iamOrgCreateResponse.setOrgId(sysDepart.getId()); - return iamOrgCreateResponse; } @@ -461,55 +410,6 @@ public class SyncIamService { sysDepart.setDepartName(orgAcceptDto.getSrmsDepartName()); } - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsOrgCategory())){ - // 1为单位,2为部门,转映射到 本系统内的数据 1公司,2组织机构,映射关系一致。如下代码是为了后续修改方便 - if ("1".equals(orgAcceptDto.getSrmsOrgCategory())){ - sysDepart.setOrgCategory("1"); - } else { - sysDepart.setOrgCategory("2"); - } - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsType())){ - sysDepart.setOrgType(orgAcceptDto.getSrmsType()); - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsOrgCode())){ - sysDepart.setOrgCode(orgAcceptDto.getSrmsOrgCode()); - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsStatus())){ - if ("1".equals(orgAcceptDto.getSrmsStatus())){ - sysDepart.setStatus(CommonConstant.STATUS_1); - sysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_0)); - } else { - sysDepart.setStatus(CommonConstant.STATUS_0); - sysDepart.setDelFlag(String.valueOf(CommonConstant.DEL_FLAG_1)); - } - } - - sysDepart.setUpdateBy(DockingConstant.IAM_SYSTEM_NAME); - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsUpdateTime())){ - Date updateTime = DateUtils.str2Date(orgAcceptDto.getSrmsUpdateTime(), new SimpleDateFormat(DATE_FORMAT)); - sysDepart.setCreateTime(updateTime); - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsCompany())){ - sysDepart.setCompany(orgAcceptDto.getSrmsCompany()); - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsHeadOfDepartment())){ - sysDepart.setHeadOfDepartment(orgAcceptDto.getSrmsHeadOfDepartment()); - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsLeadersInCharge())){ - sysDepart.setLeadersInCharge(orgAcceptDto.getSrmsLeadersInCharge()); - } - - if (CharSequenceUtil.isNotEmpty(orgAcceptDto.getSrmsDeputyLeader())){ - sysDepart.setDeputyLeader(orgAcceptDto.getSrmsDeputyLeader()); - } - // 存储到组织机构表中 this.sysDepartService.updateById(sysDepart); @@ -980,20 +880,9 @@ public class SyncIamService { if (!Objects.isNull(userInfo.getSex())){ userAcceptDto.setSrmsSex(String.valueOf(userInfo.getSex())); } - userAcceptDto.setSrmsEmail(userInfo.getEmail()); - userAcceptDto.setSrmsPhone(userInfo.getPhone()); - userAcceptDto.setSrmsOfficePhone(userInfo.getTelephone()); - if (!Objects.isNull(userInfo.getCreateTime())){ - userAcceptDto.setSrmsCreateTime(new SimpleDateFormat(DATE_FORMAT).format(userInfo.getCreateTime())); - } - if (!Objects.isNull(sysUser.getUpdateTime())){ - userAcceptDto.setSrmsUpdateTime(new SimpleDateFormat(DATE_FORMAT).format(sysUser.getUpdateTime())); - } + userAcceptDto.setSrmsEmail(PasswordUtil.decrypt(userInfo.getEmail())); + userAcceptDto.setSrmsPhone(PasswordUtil.decrypt(userInfo.getPhone())); userAcceptDto.setSrmsTypeId(sysUser.getTypeId()); - userAcceptDto.setSrmsPost(sysUser.getPost()); - userAcceptDto.setSrmsDutyLevelId(sysUser.getDutyLevelId()); - userAcceptDto.setSrmsDirectLeadership(sysUser.getDirectLeadership()); - userAcceptDto.setSrmsPostStatus(sysUser.getPostStatus()); IamUserInfoResponse iamUserInfoResponse = new IamUserInfoResponse(); iamUserInfoResponse.setAccount(userAcceptDto); @@ -1020,15 +909,6 @@ public class SyncIamService { orgAcceptDto.setSrmsOrgCode(sysDepart.getOrgCode()); orgAcceptDto.setSrmsDepartName(sysDepart.getDepartName()); orgAcceptDto.setSrmsParentCode(sysDepart.getParentId()); - orgAcceptDto.setSrmsCompany(sysDepart.getCompany()); - orgAcceptDto.setSrmsStatus(sysDepart.getStatus()); - orgAcceptDto.setSrmsType(sysDepart.getOrgType()); - orgAcceptDto.setSrmsOrgCategory(sysDepart.getOrgCategory()); - orgAcceptDto.setSrmsCreateTime(DateUtil.format(sysDepart.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN)); - orgAcceptDto.setSrmsUpdateTime(DateUtil.format(sysDepart.getUpdateTime(), DatePattern.NORM_DATETIME_PATTERN)); - orgAcceptDto.setSrmsHeadOfDepartment(sysDepart.getHeadOfDepartment()); - orgAcceptDto.setSrmsLeadersInCharge(sysDepart.getLeadersInCharge()); - orgAcceptDto.setSrmsDeputyLeader(sysDepart.getDeputyLeader()); IamOrgInfoResponse iamOrgInfoResponse = new IamOrgInfoResponse(); diff --git a/laws-single-startup/src/main/resources/application-dev.yml b/laws-single-startup/src/main/resources/application-dev.yml index c71f4a49..3ad2f140 100644 --- a/laws-single-startup/src/main/resources/application-dev.yml +++ b/laws-single-startup/src/main/resources/application-dev.yml @@ -376,7 +376,11 @@ iam: bpmcAppkey: test # 创建用户默认角色 defaultRoleIds: 817f7f818bb3506e018bb3506ef70000 - + # 对接验证参数 + sm4: + key: JLB6L6MJVIT5Z7IL + type: SM4 + signType: SM3 # Hiwork集成 hiwork: ip: http://10.2.5.218:8088/