From 316f7f45e3cf05ae2cede808c1904cf6cf57516f Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Thu, 25 Sep 2025 10:38:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E6=B3=95=E8=AE=B0=E5=BD=95=E4=BB=AA?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zhgd/xmgl/base/QuadConsumer.java | 6 ++ .../com/zhgd/xmgl/base/TreeEntityAware.java | 17 ++++ .../constant/DictionaryConstant.java | 5 + .../java/com/zhgd/xmgl/util/DictUtils.java | 52 ++++++++++ .../java/com/zhgd/xmgl/util/ExcelUtils.java | 11 +++ .../java/com/zhgd/xmgl/util/HikVideoUtil.java | 3 +- .../com/zhgd/xmgl/util/TreeEntityUtil.java | 91 ++++++++++++++++++ .../resources/excel/执法记录仪导入模板.xlsx | Bin 0 -> 13178 bytes 8 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/zhgd/xmgl/base/QuadConsumer.java create mode 100644 src/main/java/com/zhgd/xmgl/base/TreeEntityAware.java create mode 100644 src/main/java/com/zhgd/xmgl/util/DictUtils.java create mode 100644 src/main/java/com/zhgd/xmgl/util/TreeEntityUtil.java create mode 100644 src/main/resources/excel/执法记录仪导入模板.xlsx diff --git a/src/main/java/com/zhgd/xmgl/base/QuadConsumer.java b/src/main/java/com/zhgd/xmgl/base/QuadConsumer.java new file mode 100644 index 000000000..af59e926a --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/base/QuadConsumer.java @@ -0,0 +1,6 @@ +package com.zhgd.xmgl.base; + +@FunctionalInterface +public interface QuadConsumer { + void accept(T t, U u, V v, W w); +} diff --git a/src/main/java/com/zhgd/xmgl/base/TreeEntityAware.java b/src/main/java/com/zhgd/xmgl/base/TreeEntityAware.java new file mode 100644 index 000000000..0606f1c89 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/base/TreeEntityAware.java @@ -0,0 +1,17 @@ +package com.zhgd.xmgl.base; + +public interface TreeEntityAware { + + public Long getId(); + + public void setId(Long id); + + public Long getParentId(); + + public void setParentId(Long parentId); + + public String getAncestors(); + + public void setAncestors(String ancestors); + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java index b96af7111..533eeaf60 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/constant/DictionaryConstant.java @@ -33,4 +33,9 @@ public interface DictionaryConstant { * 安全的责任专业 */ String XZ_SECURITY_QUALITY_INSPECTION_RECORD_DUTY_MAJOR = "xz_security_quality_inspection_record_duty_major"; + /** + * 危大工程模块:专项施工方案、专家论证、方案交底、安全技术交底等 + */ + String BIG_DANGER_MODULE = "big_danger_module"; + } diff --git a/src/main/java/com/zhgd/xmgl/util/DictUtils.java b/src/main/java/com/zhgd/xmgl/util/DictUtils.java new file mode 100644 index 000000000..557faf37e --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/DictUtils.java @@ -0,0 +1,52 @@ +package com.zhgd.xmgl.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.zhgd.jeecg.common.util.SpringContextUtils; +import com.zhgd.xmgl.modules.basicdata.entity.DictionaryItem; +import com.zhgd.xmgl.modules.basicdata.service.IDictionaryItemService; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Function; + +/** + * 字典工具类 + */ +public class DictUtils { + + /** + * 批量设置列表中文字典名称 + * + * @param 对象类型 + * @param 字典key类型 + * @param list 对象列表 + * @param dictCode 字典编码 + * @param keyGetter 从对象中获取字典key的方法引用 + * @param nameSetter 给对象设置字典名称的方法引用 + * @param projectSn + */ + public static void batchSetDictName(Collection list, + String dictCode, + Function keyGetter, + BiConsumer nameSetter, + @Nullable String projectSn) { + if (CollUtil.isEmpty(list)) { + return; + } + + // 获取字典映射 + Map dictMap = SpringContextUtils.getBean(IDictionaryItemService.class).getDictDataMapByProjectSn(dictCode, projectSn); + + for (T item : list) { + String dictKey = Convert.toStr(keyGetter.apply(item)); + String dictName = Optional.ofNullable(dictMap.get(dictKey)) + .map(DictionaryItem::getName) + .orElse(null); + nameSetter.accept(item, dictName); + } + } +} diff --git a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java index 8357a88af..fadf4ea68 100644 --- a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java @@ -248,6 +248,17 @@ public class ExcelUtils { } } + public static void exportBigDangerInspectTableLibraryExcel(HttpServletResponse response) { + try { + ClassPathResource classPathResource = new ClassPathResource("excel/bigdanger/检查表导入模板.xlsx"); + InputStream inputStream = classPathResource.getInputStream(); + XSSFWorkbook workbook = new XSSFWorkbook(inputStream); + downLoadExcel("检查表导入模板.xlsx", response, workbook); + } catch (IOException e) { + log.error("error:", e); + } + } + public static void exporExcelWorkerTemplate(HttpServletResponse response, List teamList, List departmentList, List groupV2s) { try { XSSFWorkbook workbook = getExcelWorkerTemplateWorkbook(teamList, departmentList, groupV2s); diff --git a/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java b/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java index 81487918e..f77eb6051 100644 --- a/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java @@ -1,6 +1,7 @@ package com.zhgd.xmgl.util; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -486,7 +487,7 @@ public class HikVideoUtil { Map paramMap = new HashMap();// post请求Form表单参数 paramMap.put("cameraIndexCode", cameraIndexCode); paramMap.put("recordLocation", recordLocation); - paramMap.put("protocol", "rtsp"); + paramMap.put("protocol", StrUtil.isNotBlank(protocol) ? protocol : "rtsp"); paramMap.put("transmode", 0); paramMap.put("beginTime", DateUtils.getISO8601StrWithMs(beginTime)); paramMap.put("endTime", DateUtils.getISO8601StrWithMs(endTime)); diff --git a/src/main/java/com/zhgd/xmgl/util/TreeEntityUtil.java b/src/main/java/com/zhgd/xmgl/util/TreeEntityUtil.java new file mode 100644 index 000000000..35e99287c --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/TreeEntityUtil.java @@ -0,0 +1,91 @@ +package com.zhgd.xmgl.util; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhgd.jeecg.common.execption.OpenAlertException; +import com.zhgd.xmgl.base.QuadConsumer; +import com.zhgd.xmgl.base.TreeEntityAware; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +public class TreeEntityUtil { + /** + * 更新tree接口 + * + * @param entity + * @param mapper + * @param sn + * @param getChildrenFunction + * @param updateAncestorsFunction + * @param + * @param + */ + public static > void updateTreeStructure( + T entity, + M mapper, + String sn, + Function> getChildrenFunction, + QuadConsumer updateAncestorsFunction) { + + T oldPo = mapper.selectById(entity.getId()); + if (oldPo == null) { + throw new OpenAlertException("数据不存在"); + } + + if (!Objects.equals(oldPo.getParentId(), entity.getParentId())) { + if (Objects.equals(entity.getId(), entity.getParentId())) { + throw new OpenAlertException("不能移动到其自身"); + } + + List children = getChildrenFunction.apply(entity.getId()); + for (T child : children) { + if (child.getId().equals(entity.getParentId())) { + throw new OpenAlertException("不能移动到其自身下级"); + } + } + + T pOrg = mapper.selectById(entity.getParentId()); + boolean top = entity.getParentId() == null || entity.getParentId() == 0; + + if (top) { + entity.setParentId(0L); + entity.setAncestors("0"); + } else { + if (pOrg == null) { + throw new OpenAlertException("上级不存在"); + } + entity.setAncestors(pOrg.getAncestors() + "," + pOrg.getId()); + } + + updateAncestorsFunction.accept( + oldPo.getAncestors(), + entity.getAncestors(), + sn, + entity.getId() + ); + } else { + entity.setAncestors(null); + } + } + + /** + * 添加tree接口 + * + * @param entity + * @param baseMapper + * @param + */ + public static void addTreeStructure(T entity, BaseMapper baseMapper) { + boolean top = entity.getParentId() == null || entity.getParentId() == 0; + if (top) { + entity.setParentId(0L); + entity.setAncestors("0"); + } else { + T pOrg = baseMapper.selectById(entity.getParentId()); + if (pOrg != null) { + entity.setAncestors(pOrg.getAncestors() + "," + pOrg.getId()); + } + } + } +} diff --git a/src/main/resources/excel/执法记录仪导入模板.xlsx b/src/main/resources/excel/执法记录仪导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a04b2b5db7e375b6eac5ac0fd134b77f82398d82 GIT binary patch literal 13178 zcmeHuWl&vBwn!QI`1ySsbvg9U;G4G9|Df?IG8?!h4hcejD$esAP`?^k!K zW^PSQ-TtxJr}vWX_3X1w_v!~l8E^<#kf#@y5j7SkcMe!I@F|@7#KzbfVBJuOJO^qNJE#F zM}`1hK4_h0*|SFSNjfvj&S^Ls0+Fj8{v~ylCe?20i0UUD2j`Vaq^W- z#{fpEB$|Yd%1nBivf@^85Cnvm_hZ5xsA6%jdmYR!>_r<(BOKFmMI=J2-WW$^ex|aP%I*LHQLNV|ypl zCv<${ zxWkBJ<&F#n+7S+@HSRc;1P$sJ+S*D{2>L-L6b^_Rou&okRr>`Rbw)lN>Mu!!KbJ!c zKvcnV3bt;CTf_jGB-Do+EI+Eo|I^-H(ImB=kuW3#=+ne*hA2=IQ?HtOk5HU(87a~~?zVF)HtZ_o#4Qh3f- zpd70Q`1O}s76njmwH?bjyd@x3>e)UH_$d;s?xbA-Oi{u~GDZE^QsbSUzoI5q7+TK0 zr_j}iy*YY7>*23I&GwKt!jW)cBS1!aSv=%>OIm6FI|Au!DYrC_2%tP7fc6^#uFfv@ zwoe%3z7~?{V8RML2z(%3e@h`ZXNPawGiOIc0GQCt&Dm17h>Ob^C%$)Q{R%+RJH0$= z=H*?wFdNX|ei_76Gffj_C`g1Hu~Vbbh{w-oH-ZPYgEPqyq)rkhVYpIR*V4ZqO%USP zT>gnPVQ6Ks-Z7wJ!$(mp4JzicgS+c^EWq3Cu9`6YT z)P;sg(N*7PJHnXkY5GcqOB9!}Gh4)^?YhF9W8tLmELe|ePLKlx1nY0I-&L5O!0MWpvnQ1T?LOi` zU24;$mDl3gdt*XDrWL(&S3VXIu<>Qhg<@*Pu52M?&;bkvl(I7boDk$aUz;z=p{bkO zinii{8;jZ*qgyC=D);)v=Js~aq^-bI&dqJSMv>`(Y4rmA_L*2K7T$&Tq?evP{nRky zwZL8Y{iRZCt#$vIT7B{Kq}YRN^^U*O)!jkH(&Rj5V_Kn=mtW}FewP0@TUynM17~Z2 z`i7mNePOl#dc$IAfA>R!FaHZhbKjmDW(&c7G=Aot`%$Z_y6sp5W$IT}Bh`h`iS4w5|bZ)d5qUDuL)0uHBr4 zwnIatmEjBT@dd4u*&25>-8Z!Z;u8az^rfk3k@su&&3APzRg(bLQ|JlCgv0Q9|%yAYYn){N?o zw>&8>k49kg5QRzMd3f<6n0wxBteH!LPlUlhI4%1c{Oh|u#R-SA1i>altV%c zn??N0h?pUP>Vayh6<^{G4h8ua*^@gS;Rj&|(OvdJAY!ZpOA9-xA;?j`)@RLtZ;HS z?>O?3ZS&MF ze&NVeZ`8f|f@IC}C40_p$2Ryz8`>h{wvFxn4J^Yoqo4IEK^zdMIt_ z{(8RkZX1e_kNf6Z-__wt+le9Gw+9@>n9sKxcF>m{jCMO;C6;cF$|UUl9yae732EMA zXIu>%(C`Cc99-yZLjwOp6)m`j-7D+}h_Tpv8#o+Ih|9lF@Ld}WjoZMXyVbx}>n zi>|K< zmZzeBJ-pq$wCemYAKf}$c&t%Mh;+MIvD09;?|)R=_wj_kB=vEjqheRMH{LaT!C3Fr zczB`eTDBf}pSQ>{?=<>x`qKgB_yXNtGY`^*pYA=>@2g%k95}JG$5k)eRwi(!pX!mCdxM^hONal!?;6J0H76pQ}_))I$2olf0g*+FuK6OpC7D_W%XSc+Fb3-v=T9oK;@W;-2@@v-C77 zk~?njLbM7Rz15JGG=_El2pk+=mybdh^HURvPV{f)-0@mo+VZTT`DW^7s=f-|ysa})1gRRg@q2)Y1nKCeER$FVB20Y8!rrh7LQ^cFl{@IJ%* z-v*TRe*pde3sAQI0rdZQK>vBO`&6!b+zq=}nA)2DQLbx`1r5J{1_IKH|Dzu9m)LjV z?_1nGEd_gAF+eNn5x%&$y)mU5j)ZIBOog_^xOj#3#F_`+xjbuQRVp^+5kj>D+2iV2 zC$`Q}P%u}0RheJz9dyJ**{8IWg)@0xyL41RL1&BRs@99I%}Y0|{^#4(Ysv3LNXRy% zSU>2MLIBB#3CB#n!0(?ozTp5PLzfRtJ_=?FqJG_0UE;n}AHk_6Y7{8Q|2nM>TU0tX zjh2=r*pQC#B!TSEu2U=uoj2mBUvZgq1h*=2Qrgs)yqgV1G0<4i+ngC61=~BlaM&Lu=17{PYuKcn{Er%x}GPSCPr>W{T@m^)`rT211n(5n}K&Sq9~--??y*EDZ0BlNEBIA6Z7 zZd}lFKYV6#^!Q;vvD<5?3sU(xe?R9qB*VkcAiR91adHQXA1#uRem!mB!a|x1_3DCk@$GnP{Jok;+6&7fpp(c*opnx_yEzyysBmja1Eb;@K>Ms7nTb zFe6yI3Fcp=@K&g|!ZrIm81ttrM&>aBv3&b@}wcEkicH7@2v4+Vj<8_Wf`)x~y!r*<;G$0Lv&>&PqKO;$RZ)wJ{ zAU94aAdpFLg4q;f-JL8sD!kZC7EG$_Pmt5Z-eS}#nc>|PVbr=5T3zt7@7we2td%4byVmpAZ+3f z_9~v(87G8wiLR8vD1EJVC2JQk5?P0TGgF*8vq8()*XpfS z+`3L%lnFAgt{ffpG=|KG60608#ttZ~;~c!W!&peBBdk!o7b9>Mt29!W+-B;nR%D)} zIRWRbmRiU_BqZcof+J1NTpLRzGh11uVuk3i$)0}6v`eLK6!=@S%5-#V+*p!_WOQUJ z&W|Q+B=2dU8ribyt75b$*U`j88F2{SgQfv};a8yKs|7@8R@&PEAN^j=vk%pHZk$gQ zk0%^_g#Y}?I7ysqC+XUaqKpfU^Dd{njW=-+e5t7hck}Z>MCoOuQ*L_q1FOcV69^}? zwFrIyGJ`v$c!P2(C??J7NXQs4R2OuoWeY!+-a!PeEWoGEh~ojy>BB=UySZy}WoXd5 zxqM?XDmqFU)ZkqqZI)U0&`PVCQ_Vy=6%&?1lTz7|S#T#wP5p~ct_wln0HMM(ySQr5 zAf62WeP?x{po+!pgq@)+lddsK>*a&Rx*4Nq`SN?@F85z=F)1*LZfwq~j>UQPNe5ni z!>rO(rZ0mvKeA@4ELa=~HpN&TdtuEpmEKcy_Js?$+SJ3OxofUm2PJ$>sQK^#I^|C9 zJ>~@eQrKd|@=4GJl90Oom@Wc~B&Xz!HOLJCk43yxQRRdg58=>@7ES#_@#^FY!0cS5 z>8h`MWu#mJPlie)rj%QEc}F$Awj{ggxl4Ha2$eus@~31Z-3@yspF2 z2P4a{W*+ob8Uw-}XErOs?St_2jmR9BR{W5MzI4`Kt}UQE=1oeb8|s|$G>^@xwA(!d zOc&#aD-&jeR;|I$o+T8lO{*j^L#}7Y^J1~|)t~*bk#XSfKxlp3$N(WhK%UOL9)B*K zEexGZO;lW*EbYvlpO#3IszdU)%*ZXIXZY&;>NIY>gzt2nsru_tPeBK}$!PcH+T0Yk z!quTaAWI=b$JV_RB+LH_hlf;$T}L@q-c!i@e0FC#b+l(*AhE#V;ZmBD!PQ-tv$S20 z{&^j?&E!q>l)+uchZBLaW@h{>!~A%%_Ql$7@6JFfn9AITU2dj=Wv{J%>It3rhT_d|uB z$C>ZYbini<&uZ2nKtPawo&y-!+gpEM4yz8>jSB)6NRN=FcH@s|ZBe@lRw*zNQww2< zL(rXe9eE4)D$FRj(1pQZgc=RS1VCWIfnp(@rD`kY$5j4pGxB2q*nTTs_s`tU2lehc z^VlH)r(jBnhIOrPRQ)u_P39eJGgUW)dDPyz!ot~;QrgGbi*iF@LZ zfytmgpVw%D2al92sz}0>$mDs2MbaYa@dYtdOd1CzfMKAjrk-%29IpgR6?4-pkcT@E ztx(OevVfZ;07wqZEmp!Fn}VRxC zN?TMQ$_A{9PRtUepllW7FbxO^FGa&DxH|*5N-Qd24SY=ph|$v~G6}?C8l&^IsoP%5 z#F6egErD#iiD4>x?xM7VXGV&Dm~*3^46?@25)-D?&ZQb~ayvIYzq|dqI)8fY<8lxs}w`=+*DEBh*F`BXpRC=$jR-Uc9i>w%o6go+{cnj8Yb} zXXhD6L97sgAthjZP8NJcbUA}B-6%&|^w3eXeEw1KyjMdL*rGKRfDd!n zbk?)(R$$T}{P#^ajB6Av@NtE2s|*5y@E^&?#nZ<0N7m8Vi<5Fe4l>?qJK|%~#*c4u6z0%3uL*3~9ykLYDE-WG#79daQ_@y8L$t3{Xanf<` zj#aMVCfq;3+{|W}wU5j3johwFZa3pe)5BX&GhSnRU7l^vep^bc2EW#V$1Gd8dOGjd zvq#7_d9e7AW4n+Ae$TJx{I+FWH74V|m+eiF{wz*t&s*oU5l3N2&C@WsGbVVbwA`_B z-*2b8D{B7Brz`T)NM3Hx`E5d$T+n!ptYo5mWjSvKCY6WXZfMrZXRXZ*$Etz|qo3j0 zwsMw>xG$Z3IZQrQPSo>0ISXnboVg+R;00ha`s~2f(Xd$q?*Glbqv%uNx_hJDe9EX| zQ4-i@jZD+HVr}hp_S;FgFzI>1vyMC~iZ=ka%`-%u3Dpqng=3y~-Siu{{fYK^^~x=| zP2#Wo%L9g6?x%W@^ydu(K6cgGQCm@Cgj{Wp`(TgyxB7G>sc7H^D zJyEnleRByJa8qr463v!>HB2SbjOm$&l5zo^KO%t~SgkP)asDF;S2;q(anxY~RH`CLiU9ebI&q%>ROtmSw_FKKrW`RvN zUZA~X$S(KY{rvn02*O1gPg!03(z${S;(*G7J@VER)f44}W`M(Mcf7uW;mjqwJf{;Y-`a-nlGE z%w3yU&qM_FoH{rpG_xTSmzApwO3STGuad-88dR4DqF(URVN8Af5G)pibATG$TgEMv6ePTLX@BUPS7X*DVG;Xl_>DO!+Ws- zt3q%{aMau9+17TgYk1sDVjsqo3}CiW)ygcHKd4w$13imkC#~3VXybCV4{LF>rfJvh z*(+a6@)cD-eoC4wERmmDlsBH`in=CC6_E+{CJ~3xWtnBvFJZ@tZcs0o-a!~2QDy(w!BeuuU`^t-y` z{R6hy^S)rqy%s_j17`VfjAVoN#4R<=8{7-XW*!0F4w8N%{(@h<{jl1PC(qS;s*!G6 z_Sy`?9Z{$a(UCBAQ>{Fp;p~p8)-A4k-vFdVCCNxhAt%EM<6naSV$PD3XR=3PFjPOG z8ZAPWbVOmyhRidRLv!k;&@1J*xg1MaxlTzEM?ks_MQEBV(1}fX1c0*O^>}>a#&@5P zF-Vma!>X$iS`8$LBN!s9;;S-CvNjVdW63mUXRHxPvhkrNw}wU$t3f6Sj3O2VyfGxz zf7WY7n$>GYO44gVn&qK}%X1H110eH=a)`l_Zg>;IR^`S(_FA(cmZGQx?pTbWr_vxX zv9#Z0zfg>OOcv$Xw_-^6#Ph3o2+Fq2{81Bb4v}A38bCXK_mFEliypHaJCv>`UKf8I znE+2BtoTzUTDb%f%N9nsm}&$cmPZeULw?gNHuSPNj|xP)_KglB`;W`SK1;~je9?N)}ddAZmcE&ShVyN@etS(ZXJ5#36)EU76yk3dDx3hb#A%*opjdrv#>5z zWlFv1=X`GBrlx!4TL%2*@-X_+XQ_q>?uGVk>; zrDYT;w!&exJ((CH(^j#PLP}zuPdU-UlEL^L@wl!|KN=t@EfYKcbn{B=jC`BnY!ySY zc;f{?vbhct)qL0s(7QTC5H;|40XSyYRYO_B^gx#IQLT#aSLX*$f0>2lec@B4W3i{p zz1@$w6239o&j*{h3|>c|QpHWA9Thgzo$D`#Ta0-558yl6h zXpXs-NC!^tbuDku!3-<~jTQXcexNu_K;9Acp$Gs!uguMe;3w+dV>^sRTacDv*p zk~}{bzDdZ7kCFc@aPKQCM5si9T5vN=;1AX>x6g}_I|>z+UPICag_aKzr^z2DMqHfD zW`&{@*O>}Lk;AD0LZ^zyiF$k@wF}22C9%Lk3BNQrct2Eke-(7p41sTg0;UDw{31M^ zm5BR__caL#7)3Hm+_*q9uWxcJF!|-|+hCL9zKlLX!svqsH=l$3^=wAe7buuaQ1K%y zy~878)X$Mv2BXM6#`~ws?%z^kNNf%OMI#E1vdyKuQBau-V}V%yZmAzJN8ibeI{0no zGrr}Qk`$%;rc4*rdU?Bh;10UBMu{{maDTXqndvmsK0hZMn=4iPrZvxo%6S&38NmFZ zQ`MOn7eycxATZfwBP!cQC7%`DnNG&&ilTX#*Ay&NsDaAiLiHK6qlJbw!=*rP#U`&m z5#auGvkbjaMI5$9rylnT>I)H5>?-RdZF)3NOC(}ewakHo#0i1gNu{}c7TC+4+nZ=W zzNLkLQgujNrO^g!PHKd~fh|3g;}uec@)~a5irhxIIj$U(b6GKMY*A?y9SBpzx$bQT zZIcJ6D$rc95gklb9?bhLZ7uyeZ5#dbv)iEPI1-Ij^p~3J=msI!lFU!N;+-~P|8h^O zy#7N&`+e`mi8|I?*!p;&%bEvE4U~^-dMV#=ds^R6UVluh+>&X)H;Ix(7yBDx(^1u{ zBi!{82CRILZbQAxZe+doKz&m{o!nVQbH)o}_u(_iUpYH#heZ zaV^H$#gN|E1138H%dcH6u9|iUIJ@3a<#IZ#oM8k$D9pg9=!Dj`GIlkW_6f?lH-fh3 z0_<6AvMp%!cLM)8C+o4w45II3YV#-6%A3or>EZF&(&IJ@?k^dJC&`kyVd+jLg_P(f8lYlQuD+%%`It1~E)eN4=e=qQ zbX5uzwC{CmQ9AVT&|C!Uov62?OvZ#lZ9 zswkMr!!DN3EnrL<#L;Z0XxD!%-knLHD978iNCWh4eCEg%(sX5SU%2ymnJ*<pV!^a&f&W~Nf53wh%+rRd$-=o`{AZPWR>>08sG}w}~mt#rwx{5l)M*9M!o!|jk zn-&$8Ld9~W zxYmk7F%UQFM}`*x(PpjTg$<-Dy71H=k{dOssf)@d0W*lv2Y{*S)Ml65T^F|r@_sIO z&ar4dqWU91m`(uCIwR3o%SqpZ_k7j|R-dZb0uMeD)2kp*exYI$|1cPuVlj4N3;~$iZMd9 za6>; z-ycd`l5b}MgdNEFgyq(n(Y|BuW~w_J&W!^iDbBOjlvm3s2zhu9!zK$NCwFwFk!ySV zExF6r77OU8nzBKKg^W_~P~c+(B#EPY#Z_J$Is5dGoC?z_;UG|JgH^69A7=^Zz4!zy zWY43!SX^{|#S$iMU_@u}qA#i_IA5D{MZLEm8RWqAd94o4p3u$AG`7u%f3WPJG$9}T zx1;_}p>R4cP1|BEYP6}OkjL`bl}-`9bQ1-cD)za7o@NsXLiYvgc48*zPJ;$cG%Y}s zbmcbkgJcjbsl;c^b+QCJ`PppC%Hmi-?5YUySiyx#Fm&w*h)uXlH~!wFZXxGOGjUf} z<5l?Pf>c&_oFw9}qL*3g$#78HLp)xj73}yW;P08B4%HrM!1j8HzQ$#Ix0S(FaKR&_ zCJKb;hYou+1cE?ruv<2}Ys0~h>^AOmY-c&BA^ZV^ub{V13-WxY=Sf`siR<1=91MbA zmGqnm9MxS}BN6zq1U(*Ffr0_PSKNNE%>RVy5iJl<5TeKHD&0Q<_rt(HACEmHrXTHz zu+C2NGfn;O^v^`~r1Qh6)?Yf`zgYjy+0!@oM|*Pi)P5n-|L*TkD*co24}X-us{IGC z{?8Eo$@TuJ-TC;A|K;>w%gh_n!;Be_HsnKJ(K; zAmI-Se^qP#U9f(id)Z?q`s+~kPmh0|-v0DB^{d*?v)n%o{8`@oY2Y01yWd~K_U{J$ z#Haqzo)B*Tf$(qa>fcfOlVAO$`vbN8zv=#DTmL!yKY2wzt?)h$=rL@+jNrSK?<}ML tx)p@S$^3(r@6?w6x|PMpf3^4rE8qDPiZYPj)6Y|Kn|+*lB*W7j{ujqDCdU8( literal 0 HcmV?d00001