From 4324ab811eac10b12ae7552da05a21e7e9622407 Mon Sep 17 00:00:00 2001 From: "MSI\\2Fi" Date: Mon, 3 Jun 2024 18:44:26 +0800 Subject: [PATCH] Add susidiary to P&L Report and Financial Status Report --- .../modules/report/service/ReportService.kt | 113 ++++++++++-------- .../report/AR07_Project P&L Report v02.xlsx | Bin 12688 -> 12815 bytes .../report/EX01_Financial Status Report.xlsx | Bin 12993 -> 13158 bytes 3 files changed, 66 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt b/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt index 5b27922..748735a 100644 --- a/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt +++ b/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt @@ -107,6 +107,7 @@ open class ReportService( "code" to item.getValue("code"), "description" to item.getValue("description"), "client" to item.getValue("client"), + "subsidiary" to item.getValue("subsidiary"), "teamLead" to item.getValue("teamLead"), "planStart" to item.getValue("planStart"), "planEnd" to item.getValue("planEnd"), @@ -317,8 +318,9 @@ open class ReportService( //Set Column 2, 3, 4 to auto width sheet.setColumnWidth(2, 20 * 256) - sheet.setColumnWidth(3, 45 * 256) - sheet.setColumnWidth(4, 15 * 256) + sheet.setColumnWidth(3, 20 * 256) + sheet.setColumnWidth(4, 45 * 256) + sheet.setColumnWidth(5, 15 * 256) val boldFont = sheet.workbook.createFont() boldFont.bold = true @@ -378,29 +380,35 @@ open class ReportService( } CellUtil.setAlignment(clientCell, HorizontalAlignment.CENTER) - val teamLeadCell = row.createCell(3) + val subsidiaryCell = row.createCell(3) + subsidiaryCell.apply { + setCellValue(if (item["subsidiary"] != null) item.getValue("subsidiary").toString() else "N/A") + } + CellUtil.setAlignment(subsidiaryCell, HorizontalAlignment.CENTER) + + val teamLeadCell = row.createCell(4) teamLeadCell.setCellValue(if (item["teamLead"] != null) item.getValue("teamLead").toString() else "N/A") - val startDateCell = row.createCell(4) + val startDateCell = row.createCell(5) startDateCell.setCellValue(if (item["planStart"] != null) item.getValue("planStart").toString() else "N/A") - val endDateCell = row.createCell(5) + val endDateCell = row.createCell(6) endDateCell.setCellValue(if (item["planEnd"] != null) item.getValue("planEnd").toString() else "N/A") - val totalFeeCell = row.createCell(6) + val totalFeeCell = row.createCell(7) val totalFee = item["expectedTotalFee"]?.let { it as Double } ?: 0.0 totalFeeCell.apply { setCellValue(totalFee) cellStyle.dataFormat = accountingStyle } - val budgetCell = row.createCell(7) + val budgetCell = row.createCell(8) budgetCell.apply { cellFormula = "G${rowNum} * 80%" cellStyle.dataFormat = accountingStyle } - val cumExpenditureCell = row.createCell(8) + val cumExpenditureCell = row.createCell(9) val normalConsumed = item["normalConsumed"]?.let { it as BigDecimal } ?: BigDecimal(0) val otConsumed = item["otConsumed"]?.let { it as BigDecimal } ?: BigDecimal(0) val cumExpenditure = normalConsumed.add(otConsumed) @@ -409,21 +417,21 @@ open class ReportService( cellStyle.dataFormat = accountingStyle } - val budgetVCell = row.createCell(9) + val budgetVCell = row.createCell(10) budgetVCell.apply { cellFormula = "H${rowNum} - I${rowNum}" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } - val issuedCell = row.createCell(10) + val issuedCell = row.createCell(11) val issuedAmount = item["issuedAmount"]?.let { it as BigDecimal } ?: BigDecimal(0) issuedCell.apply { setCellValue(issuedAmount.toDouble()) cellStyle.dataFormat = accountingStyle } - val uninvoiceCell = row.createCell(11) + val uninvoiceCell = row.createCell(12) uninvoiceCell.apply { cellFormula = " IF(H${rowNum}<=I${rowNum}, H${rowNum}-K${rowNum}, IF(AND(H${rowNum}>I${rowNum}, I${rowNum}I${rowNum}, I${rowNum}>=K${rowNum}), I${rowNum}-K${rowNum}, 0))) " @@ -431,19 +439,19 @@ open class ReportService( cellStyle.dataFormat = accountingStyle } - val cpiCell = row.createCell(12) + val cpiCell = row.createCell(13) cpiCell.apply { cellFormula = "IF(K${rowNum} = 0, 0, K${rowNum}/I${rowNum})" } - val receivedAmountCell = row.createCell(13) + val receivedAmountCell = row.createCell(14) val paidAmount = item["paidAmount"]?.let { it as BigDecimal } ?: BigDecimal(0) receivedAmountCell.apply { setCellValue(paidAmount.toDouble()) cellStyle.dataFormat = accountingStyle } - val unsettledAmountCell = row.createCell(14) + val unsettledAmountCell = row.createCell(15) unsettledAmountCell.apply { cellFormula = "K${rowNum}-N${rowNum}" cellStyle = boldFontCellStyle @@ -454,13 +462,13 @@ open class ReportService( val lastRowNum = rowNum + 1 val row: Row = sheet.createRow(rowNum) - for (i in 0..4) { + for (i in 0..5) { val cell = row.createCell(i) CellUtil.setCellStyleProperty(cell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(cell, "borderBottom", BorderStyle.DOUBLE) } - val subTotalCell = row.createCell(5) + val subTotalCell = row.createCell(6) subTotalCell.apply { setCellValue("Sub-total:") } @@ -468,71 +476,71 @@ open class ReportService( CellUtil.setCellStyleProperty(subTotalCell, "borderBottom", BorderStyle.DOUBLE) - val sumTotalFeeCell = row.createCell(6) + val sumTotalFeeCell = row.createCell(7) sumTotalFeeCell.apply { - cellFormula = "SUM(G15:G${rowNum})" + cellFormula = "SUM(H15:H${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumTotalFeeCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumTotalFeeCell, "borderBottom", BorderStyle.DOUBLE) - val sumBudgetCell = row.createCell(7) + val sumBudgetCell = row.createCell(8) sumBudgetCell.apply { - cellFormula = "SUM(H15:H${rowNum})" + cellFormula = "SUM(I15:I${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumBudgetCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumBudgetCell, "borderBottom", BorderStyle.DOUBLE) - val sumCumExpenditureCell = row.createCell(8) + val sumCumExpenditureCell = row.createCell(9) sumCumExpenditureCell.apply { - cellFormula = "SUM(I15:I${rowNum})" + cellFormula = "SUM(J15:J${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumCumExpenditureCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumCumExpenditureCell, "borderBottom", BorderStyle.DOUBLE) - val sumBudgetVCell = row.createCell(9) + val sumBudgetVCell = row.createCell(10) sumBudgetVCell.apply { - cellFormula = "SUM(J15:J${rowNum})" + cellFormula = "SUM(K15:K${rowNum})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumBudgetVCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumBudgetVCell, "borderBottom", BorderStyle.DOUBLE) - val sumIInvoiceCell = row.createCell(10) + val sumIInvoiceCell = row.createCell(11) sumIInvoiceCell.apply { - cellFormula = "SUM(K15:K${rowNum})" + cellFormula = "SUM(L15:L${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumIInvoiceCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumIInvoiceCell, "borderBottom", BorderStyle.DOUBLE) - val sumUInvoiceCell = row.createCell(11) + val sumUInvoiceCell = row.createCell(12) sumUInvoiceCell.apply { - cellFormula = "SUM(L15:L${rowNum})" + cellFormula = "SUM(M15:M${rowNum})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumUInvoiceCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumUInvoiceCell, "borderBottom", BorderStyle.DOUBLE) - val lastCpiCell = row.createCell(12) + val lastCpiCell = row.createCell(13) CellUtil.setCellStyleProperty(lastCpiCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(lastCpiCell, "borderBottom", BorderStyle.DOUBLE) - val sumRAmountCell = row.createCell(13) + val sumRAmountCell = row.createCell(14) sumRAmountCell.apply { - cellFormula = "SUM(N15:N${rowNum})" + cellFormula = "SUM(O15:O${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumRAmountCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumRAmountCell, "borderBottom", BorderStyle.DOUBLE) - val sumUnSettleCell = row.createCell(14) + val sumUnSettleCell = row.createCell(15) sumUnSettleCell.apply { - cellFormula = "SUM(O15:O${rowNum})" + cellFormula = "SUM(P15:P${rowNum})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } @@ -552,7 +560,7 @@ open class ReportService( row2Cell.setCellValue("All") } else { row2Cell.apply { - cellFormula = "D15" + cellFormula = "E15" } } @@ -565,7 +573,7 @@ open class ReportService( val row5: Row = sheet.getRow(rowNum) val cell1 = row5.createCell(2) cell1.apply { - cellFormula = "H${lastRowNum}" + cellFormula = "I${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -573,7 +581,7 @@ open class ReportService( val row6: Row = sheet.getRow(rowNum) val cell2 = row6.createCell(2) cell2.apply { - cellFormula = "I${lastRowNum}" + cellFormula = "J${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -581,7 +589,7 @@ open class ReportService( val row7: Row = sheet.getRow(rowNum) val cell3 = row7.createCell(2) cell3.apply { - cellFormula = "J${lastRowNum}" + cellFormula = "K${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -589,7 +597,7 @@ open class ReportService( val row8: Row = sheet.getRow(rowNum) val cell4 = row8.createCell(2) cell4.apply { - cellFormula = "K${lastRowNum}" + cellFormula = "L${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -597,7 +605,7 @@ open class ReportService( val row9: Row = sheet.getRow(rowNum) val cell5 = row9.createCell(2) cell5.apply { - cellFormula = "L${lastRowNum}" + cellFormula = "N${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -605,7 +613,7 @@ open class ReportService( val row10: Row = sheet.getRow(rowNum) val cell6 = row10.createCell(2) cell6.apply { - cellFormula = "N${lastRowNum}" + cellFormula = "O${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -613,7 +621,7 @@ open class ReportService( val row11: Row = sheet.getRow(rowNum) val cell7 = row11.createCell(2) cell7.apply { - cellFormula = "O${lastRowNum}" + cellFormula = "P${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -1664,12 +1672,14 @@ open class ReportService( + " left join project p on p.code = i.projectCode" + " group by p.code" + " )" - + " select p.code, p.description, c.name as client, concat(t.code, \' - \', t.name) as teamLead, p.planStart , p.planEnd , p.expectedTotalFee," + + " select p.code, p.description, c.name as client, IFNULL(s2.name, \"N/A\") as subsidiary, concat(t.code, \' - \', t.name) as teamLead, p.planStart , p.planEnd , p.expectedTotalFee," + " IFNULL(cte_ts.normalConsumed, 0) as normalConsumed, IFNULL(cte_ts.otConsumed, 0) as otConsumed," + " IFNULL(cte_ts.hourlyRate, 0) as hourlyRate, IFNULL(cte_i.sumIssuedAmount, 0) as sumIssuedAmount, IFNULL(cte_i.sumPaidAmount, 0) as sumPaidAmount" + " from project p" + " left join cte_timesheet cte_ts on p.code = cte_ts.code" + " left join customer c on c.id = p.customerId" + + " left join customer_subsidiary cs on cs.id = p.customerSubsidiaryId" + + " left join subsidiary s2 on s2.id = cs.subsidiaryId " + " left join tsmsdb.team t on t.teamLead = p.teamLead" + " left join cte_invoice cte_i on cte_i.code = p.code" + " where p.status = \'On-going\'" @@ -1877,7 +1887,7 @@ open class ReportService( + " left join project p on p.code = i.projectCode" + " group by p.code" + " )" - + " select p.code, p.description, c.name as client, concat(t.code, \" - \", t.name) as teamLead," + + " select p.code, p.description, c.name as client, IFNULL(s2.name, \"N/A\") as subsidiary, concat(t.code, \" - \", t.name) as teamLead," + " IFNULL(cte_ts.normalConsumed, 0) as normalConsumed, IFNULL(cte_ts.otConsumed, 0) as otConsumed, DATE_FORMAT(cte_ts.recordDate, '%Y-%m') as recordDate, " + " IFNULL(cte_ts.salaryPoint, 0) as salaryPoint, " + " IFNULL(cte_ts.hourlyRate, 0) as hourlyRate, IFNULL(cte_i.sumIssuedAmount, 0) as sumIssuedAmount, IFNULL(cte_i.sumPaidAmount, 0) as sumPaidAmount," @@ -1890,6 +1900,8 @@ open class ReportService( + " left join staff s on s.id = cte_ts.staffId" + " left join grade g on g.id = s.gradeId" + " left join team t2 on t2.id = s.teamId" + + " left join customer_subsidiary cs on cs.id = p.customerSubsidiaryId " + + " left join subsidiary s2 on s2.id = cs.subsidiaryId " + " where p.deleted = false" + " and (DATE_FORMAT(cte_ts.recordDate, \'%Y-%m\') >= :startMonth and DATE_FORMAT(cte_ts.recordDate, \'%Y-%m\') <= :endMonth)" + " and p.id = :projectId" @@ -1941,6 +1953,9 @@ open class ReportService( if (info["code"] == item["code"] && "paidAmount" !in info) { info["paidAmount"] = item.getValue("sumPaidAmount") } + if (info["code"] == item["code"] && "subsidiary" !in info) { + info["subsidiary"] = item.getValue("subsidiary") + } if (info["description"] != item.getValue("description")) { info["description"] = item.getValue("description") } @@ -2040,6 +2055,7 @@ open class ReportService( val accountingStyle = workbook.createDataFormat().getFormat("_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)") + val monthFormat = DateTimeFormatter.ofPattern("MMM yyyy", Locale.ENGLISH) val startDate = YearMonth.parse(startMonth, DateTimeFormatter.ofPattern("yyyy-MM")) val convertStartMonth = YearMonth.of(startDate.year, startDate.month) val endDate = YearMonth.parse(endMonth, DateTimeFormatter.ofPattern("yyyy-MM")) @@ -2050,15 +2066,13 @@ open class ReportService( while (!currentDate.isAfter(endDate)) { monthRange.add( mapOf( - "display" to currentDate.month.name.substring(0, 3), + "display" to YearMonth.of(currentDate.year, currentDate.month).format(monthFormat), "date" to currentDate ) ) currentDate = currentDate.plusMonths(1) } - val monthFormat = DateTimeFormatter.ofPattern("MMM yyyy", Locale.ENGLISH) - val info: Map = manhoursSpent.first() { it.containsKey("info") }["info"] as Map val staffInfoList: List> = manhoursSpent.first() { it.containsKey("staffInfoList") }["staffInfoList"] as List> @@ -2129,7 +2143,12 @@ open class ReportService( rowNum = 6 val row6: Row = sheet.getRow(rowNum) val row6Cell = row6.getCell(1) - row6Cell.setCellValue(info.getValue("client").toString()) + val clientSubsidiary = if(info.getValue("subsidiary").toString() != "N/A"){ + info.getValue("subsidiary").toString() + }else{ + info.getValue("client").toString() + } + row6Cell.setCellValue(clientSubsidiary) rowNum = 9 val row9: Row = sheet.getRow(rowNum) diff --git a/src/main/resources/templates/report/AR07_Project P&L Report v02.xlsx b/src/main/resources/templates/report/AR07_Project P&L Report v02.xlsx index 111482b2c004552590c5eb303cd4f4e84a504884..8acd339b417e0be160ca7ad10007451065686150 100644 GIT binary patch delta 4673 zcmZ8lXH*l~vJNc*5)8crr1usC=~X(?rAQ4ZNK1%R>7hv#1OiHpfb=dk0)`TbbQF*# zU5W^VA_}N*Ip?l*&V6rw>>qo+S+my6?3r&*>ci*G_47a!PPPY|Kmq`)kploX002NB zT;d7R$MXRa=_wwFfLB}CBiH2U!(i?g8X0jxcj@9n)5O?`xaRd;Vgwh)^mQ}64b~B~ zu81;|B&rJ0k2G2Tt;Zo(7MS8_K!s+f=Z}7m!)1!8WU3u-oX3MT)!$ z^zcYJXaL4Dh-3x3s~f)NJv@2XN9Mq=@`LfLA7$Ak5uxf+;N70@_|>^8ou-=)R&_n1 z#eZ=ICniCi$;_~GN5>8{t$NBpR7RBIj>S#}eN$VG8&z5D>yt(w-S>JAaeL9J}& zSiSVLoM_MY1KG{I@~)7w$kL81$#FLL0C$Xqet`t%0qQjGJ!iG-s)U>?JI`BPlOHFg z;za$#-!V0H(i-S6<7`$wfn{1GDUZp=&t^@cSosB~sCCIdM>3+B>%LG`eRk87gbo~< z&16?g77q9Aeg9|+3rEF{s9iLMtvYCIn-U7SxwUV=Uh|&h1Cp!# zl)j51*-~o4)2V90Q@`UKn9tn5gp;^xg6UEqnFMrg;kD9hEGpJHYlzmUJgn1PTECU+ z<^8tH!mpoj?r|rF0R!9GH#Z97`hQ?7Se7G#i#Unv9NOMIwPW_0pALCZ!Deut@&uLj zE4pETO^`=*D%Rv$&U{y>hR~d;{^}dQcbHt60&Rr}) zV^F_y%!WZQZbK_#oBb>_|8|&i@8tm3oTcvPMa3MKl&3c2<>c6! zO+V!xTIUvD@>3kY;?e80Ns>f|M6+RyumRR&;_)MN(^i}yi}CO8x|Z#o;afBeb9*!N zRY3iFFZ~r${B!qRZ=k;|_NoLSg>PX56!w4BU5*|wc1Ubz_kUf?j$I$0?E5Zcu#h{r zwyL5$6DY^dhd-%!I_359JGzjB9u1M8ZhS?_M@*Ug zQX=XrDF8r9jUKzIB75XKls=Xqu&1ht6G%AL0~Zq8v@97+&wI`Edv|%TxwZ(^yI+P4 z#HtAtQ(AE6^{Ryb#;FXf=jOY0Sd~h@L?qO6a6fN0x9qUb+&*)cWac)8e6%c16BGG> zarcut`|aM5xuaFbB6SmNV_(!PxhP03Z7-$XB%%1J$3QF-#R*iI7M{p|Q0$YWNvG+Q zMHY3y$WG4V57PK_yKL9;W3pq7yc)e{Jkg)vQN_hc(sw|C_~1D|5@D@t@q9?^oTA_n zDf?obO~v~LqGiQA@Xj9nZ|=agaENU98}y2~o|xx4iM*T}t_en}rM8{m_w`bk%80nn z;jP#T3qzOziq^=udYdXqm3-I;8e-?sv}%!XG2%M8D{l0>LnDZ`E$9vUyM?OOCcrawok2gTtW_FfP4Q}U+Dk~GJ{~^MuSbv;ROB0QZ4~0DBts(LOqn;<@}=z~ zS?;L=D;ZZ%v9T{!pp)8m%he^osqUyI_Gvq#WBG&IbJCB*b6<7b`bNv3V$>t5Z>oA? z@6~w=X9JnYIF~oTVjvd3Y)gggh*LK-RPL8F5TOqU6kbRvY00^_SmmzuS>qyUjt9dt zkC2KG6s4i;yskI>%GgP7g!Mo~p!3RZI+5Z#e8i3-uopv=7$;4gsUJZoH%fF9|Ok1yL zC|IjCsv`pI5JZv6y4$j#Mt}Q{n;BUSs->M^z?OShlfjSL_JNNvhuBfK<2d{kTl|BR zLbV3;`Gi?j=KrV}=awV}JS_QmCMstBJ^u@$HR$ZapNW%@p>c2f0Hxi?0Sk{B?qJFC zHl=AjhyJp*XYJP;{B=VqSgE9ez-S#Rj3)RV1ujLpdc92vpE*<<3Or&Q9M9Z9X|>rr zB|v^IF_a-p1eus=NK3z4zg?R#WC2dn8;GSRJ&15)TeU}U+G&BYAFEs2Z&B4!U~OV# zW|}-V>+7ix8#=m^aKIt^Rt;@4oW2Up`DFyz@67n4esI- zS8bt{1^@v4cbfb91;Jf>|C;5y_lLa}wCNX_wpGE>CcIkiDw;#Z+=C2!bmXZ(^*v&H zQmCMZAn49mIX=y>gxsV+EzPh^IPpTG{e4lA*SW0T{Dl@_B%b?^iRi)!x0)>DmOtU` zmda*I`!5%ayFffcRyqpfMX+g$)x9H-We{?1rIWV$&8GX|tpq836JuD>on->*w`uFj zFcte4c#SolQ_J|3w+bQaQQC;fO{R9g6!Plgj19>+uH2lyyuv`Uc#WV(3NNN*j+yD~ z^|rqZ%G^21QnnpQj@dlUT9+Jy!t|}%UI^sJ-MeG0GzRc+Z}&zOWd`KR+YAcx`TU5& zun9b4l-_9PoGErsr1PWkas)ogn@U$Z8s(kCxXZi3CFVeUZ}~L@?qiJ!PX@W4`#88! z*n_F}?Tp<$Hdc$v+Qsbe8L@n%nD7fF+(T?N=CgawG^7wz!T7SDl?i1YYiJ~6hAMPw z`~vs+$Jt@n;x6jRXy#bBY)P@@BJc(2Wxi_+CS6xlNa=x9r>)YA(HhkwI2TVLiwkQU zmPpAbwpZRvap}+R^SWhN=dXOG0m zc7O_UFyd_~gx7_P^u}0&e}G&n`-7t8r+0d2cxb4arhk6$p?;%Vuvzgq{a5X*vdiJe zfR28md&0X<1~Lo_`YnTmq^l~zWi^DZt+QapdL_zyPZdk^G}w2Z2*_c~XkEEKRMOez z#iWC#->qM$U;^C2bwU zg?7?osva@&OBvAl#uj%C#o7Ux{HU?#8?pVzR#EdQ=}!Ds$mFHM5> z?z~VEYD=d)<6Q-IQrw)Nt)FCYu3CcZ-iTwPFU9Ju?!%=yUFV;lXjLV&yeaEETW{}# zU07yP#uptDyRxBAMuX0XKxV=A_WGZ!9o?L8pm%9Vd3+%aHUxnOA(ol34vv~Hkf7Zz z4(+k+r@IET>c`b;n zXY)KQIvm3FL2NJX0c`jd_UKtUdgq2_8BX!RwPmtEO583U5I`5Q(o_@aYO6if0LLQ+ zaI3Ah7@D9KDUbHmNTwjr?h52s?G%TPpOBRc2gH;|eb`Zh*Y;D8~A7 zpyW~l@E0kfE}Iw+_9g-V-V*}=^Z>Lvlo1tU)~%0M1HZd|fv^7=;Mph4m!R7#>;^(S zWjw5ZRJNzz0C^(t;9^NA`6cOLiz0FrZYbaeM89_kr{5*^%7Z^Gddw(~fvLb_P`C&!RgoPW+oB~XEt!{bHB*#!gAL>a5Hm%aOt3Aih6Zv8t3L%NWS_m5>@;$ z2bmdgt=c4W(o51`W{PZC(ba;Wf=CUkp82-4FXmUjG#SX6mk%?%C@MDkDRjL$PvHFo zq%0&#OhIFKKOvg972YxPqaDf5QCQL;4o#JnFAV=?EkGrN5RxE5 zAr_}50ty0|zX64%Cz-rLgjUkp5%)T1W4^2L1Blrw5~QSOJ(SCa$oCZNe}PoL z1v!g7TD5@;=D~76Ud)%ykS+=?U(s%qWH%e09SYaxR^TS%NE;oSQdWCRbz9eDY)vll z(0C>??Z-Gt*e&;=A$Hcw(%1VLVyEDgy>~VJ4;ETXbAPZdsrD19%3fYnIF+j z%WVL&CQE0np)44T+S+$vz2<<_cnaC0t)_>Eo|B zpM=Di-p14sjawq?5LVb^OsLB}s;linuY){J6589od^ix76flZgB~ zs1)5f#Sv9kvE*ya7U3a6(Mf`13A!E88zim$xlxtEf%XzL1q$TpX zk^FFZSc(0C$q~DAcqv8|okY*g+my;;eQI|EdXPtvHVS0T7vM#OnC+ypCTEm3llvn; zcBH;D5jx&>^a8{!}p6UKlOeI z4w4hCXCWgK?)@pMJN16cD|h%n zUf2YSLSA~Sf;DO{t-h^=>+3@%DgKjhzgl0Z;(lKQOOSolsJSsvvp$P6o5V#%;rquN zS2$NwAG>@|4~I$k^`HR816|7a2*s5=7*p9Z{@-aA?-?ch=wPrnp7C6(blc%n-+#ky zjA_s{FQ?T%udTk!K&}bfxy8iMa4>H8yrwg6%KSt5gDi+gZ_=<R$pHs7XR z3%~~7R?eoExITYU&fm8lR;7wI6i=i0XQzVR5;r1^q6A!Jladu(4h2L0{kH)C%vS{M zUui~%OK1^Ip?f6+`2Qb^`xlgTWplNm`7ftKr-{=;{%`a97kT9qtp-&mmf=9J+~m9R zEle!OiJpSWv;FfxuiE7mP5d8uEQA)4{IARZ0I2hu AmjD0& delta 4530 zcmY*dcTf|~x($RDnnXhHH57pW3M5o15hDbG)F2>LkSZ3cgdUL^LNC%msZs?(Q&5V4 zAo8O`dRID9M1;qkH}Bs2zCU($cE8=(IkVr{vnSCh$?@$p4X(eRu=f%O04&h~09OD2 zfWL>FpSQ2OgSWT4tiPv6r5VP%NQEUt)9nJdXg?>Bp{3tkTEP-tZBqa8>pc=wubg)Y zVn^|~$<3tdsB?!?`>U6E*}Y?92gk(UXG4R^M=NDE1fDOZ`ky`%Vq|&8^2HV;r3G%S z=6&wr&WJW`#u+>szJpM(dwpHg=K0B%@8^$WSqD%c00mc2EGZvp66<#jTcNIT1*I`@ zP@BUbiA|MMAKwg0nCW?u62{&!45I4w=svU#N$09?!kZ^O zo~OU|>c@a^+iQTskZ-9ixAB;SzW-lK->?aIbGuGQEsk~fXSV=+qFQp#bFEmr+NDS`=0nX067}#!MYo~a?PwR7L>M8mj=u?3Yu0!WTakG`Li}GYFF7xLh{nOaU&Aq z2wkPfl9Jhu3r^u(t;k&FH5BJ=2;ZERtk<3*&WUC}Z=2zmTRSoEiWpcZ@C1<%EYNb> zNlzVOJ*&cR86oIXX%A_3RoE)(N$d<$EEKq!;GVigtS-1!O3S4oKeSt2F9@x)3M}3m zpVCa*#c73|{TL;?e4yUOWftcg$$$c@VQW z`|T?O{EG8&XIePgsQi}rLFJsqw7ZmvCE3b3n-;}cMUcK5?HHwf0lAzod5$x0REqq? zi`XB>JjPl70C|^BH^*!7-FG4b9UtW??Y~pK7XDa)BYHbal!>s!{1mp1p3xuwm2XIs zLs*LgK3KOJZdkMCkNm*xuRf9GU#ohEi*Qqm56)G3t{HjJD>;>-KWU?uG`6xST`jO{?zJXe!cZ?kZT-Plz-;S?oq60%h7yG{%B{((y$@Y7N0g`@a zIhg5q{%H03RNzJYyJ_z`hTbF|mx^}lRW5a0oX)Y&h9AS#A3yT-Tm8_#Hs$+Fa&osp9T)y?;_1S7M_7d3%?>zZMs5)Ut0TA}PBmWcwS#QmoNi ziKP9YHT!|Zxu5Q@a9`RORzNV>+%h7h(Ix(&Th90JB}=cS_&ZeIfLbTEu^sl8yl9#) z6cU5I4v;N$!vz z>tbe`flA^wb1gBnu{)6^&J$~^5?gqgc-jgX%I&gSo}fzYdU)CIn-es-PoXv8@3k_7Rg%---1vwZ`}_AQ zdySBOKQ?DZ{afU+Hd4_Q5(-}q&YIhvPJ!-|}J3>mUCyFXG$aHlV$~SX1 zuhDUPo>95@+^K8;9MaH3Mj7cH#M%PN` zP@E@M7)LLL1^)n1t(YtV^yqEwTR{MQn-E>IRU)20_k=R9|FskbGe z317p_Ug%0wp#jc%i8i$k^yb!_sfqd(K>aA)6zzE`V-u2@WGR*&ZLr4r6;$~r=>?iD z2QUz0JD7S?ejLp<*bglpV_t<^9R-E4YQeWGax?1g`rEF(_tg!e0#ZUlv4n@T6;gAa zQq!{=4|1yWyw?)_w&i$GKVR+`EAi9uP({!_lSZpu&xr+37hhc_opVhaHhqKAa_eXw ze9g1W)6l+~2wtx~uQhOVHIS#YQ5Xc@Y3EYheMk~xJtoLrT*1|^vvktZjp=Z|yR2>^ zv4)c!H}jH=gmlRL;)`TQnUs$wiq$Mn&SIOW!=8X?r zkj)}xM{&x^i|(YMA>V!&3RNrl#h|yY)g?i{KpNDpHhW7yVN$N51UwcTqmoI8+igrK zaS!+&q#-AvQ_q-h-W2OlRYw{el`@wm)KC0c7IkSTmeizb5jVVhb?K)MP!Wdtu1|^U zKPEZ_m9E^YYj-$KSlT*#G~u#VDQ^D%yLTkIeB z>h`q`BtM;w_u-RU$UZ)G!6_*rC;c=}kvZ@JEo-+11e9O}ey>Gt%d1Lf38uzP zH2lRa45CLmsWHIJavb0>*@)|(ZE>5#N9J+BWd-M8OQP&gg`qC^K63n$xM4J9Fq=8%{Hp25UQZ> zn>6BB_Siz4g{`$lN4-)B>EpaJfMKA|+9%4Vs*m=$k;OZ~7~s#a|6E|HscGvaJV zr5jGEUtqCL9HQv9&(){CNg60)3O*?cuhkOt*y&G4nkiYl22GD)3|W!&2t;z1I0lh| zMoFxsqv(Pau4<<_$>9d~aZ>76VdA;b2CdI;G1@3ew26wUHB(>7kz>%v!$L>ib!ef# z%hNZZ5?NLHpKjNxhy6XMwlNbvI%H*J zH3uhQ#acvlx0j$80R1!43ZKqD`L%Ftv~zKCa*Rh-8ykOSLNx6pl%_2to^|;|Y=7en zAdb*&jvOG1U}{-ZCe;nL&up}`Om5_+Zz?o5lgewJ-U89!pelM5ae1Da%)eIu(&i+Y zFCSpr=;Z-(Yk5+0wS|V5eUMSSZ$?9N;}0+?MP5+bVT8>=UZWL5Yi&(Rigb z=?A2~Y-Y=KxGUK>N}};YMx*PLLQC6=N--a-v*R=Ia*iDGSzPK{N1GzwK}a_9K+t!A^}#AVPo1z1xHyNO~b{|bbhV!&I~*^ z>1t%o?n-&)SZut#iA9+f9pF7_jp+mfx0m)F`-1-Hq; zGu&1*QR;n=3$%Jwx#5$(L2CX z=5S`x4d2!R2?Z-X!n5^)?r?F>FXaZkSm)bGmLgMQiA|&5to)|qmyOO&bxmxyvAqcW zDH^-|-<9)>ZJ^XcaPN|0)GhY%WsbCarCQvj$GQZ)=*zS!Qj5odN|QW>x0G`)@p zp{Z>zN3DtoA#Xw~iQ3FJ>auewpdU?Bbl=e&WL?`f6Z&{P)xC)CTEFG^v~$v8yP)^Y zV;yU^?7Cz=SpgOZn_^r752e}2kk^yDJaeh#RHxE(hnY^P3&Pb?znFde~`37Uh z`%J6GZ&}=GJc?yjRe>za#4ESV zI!(EDM*XN-D;j~=^(^@xJq*#1?tnCG-Zp%B479)z2W1JMe|r~17dbRl1pTFG%BSZh zLgiU_|MN!z05~so?th|*kvPi8P2_}0QRae)yI?k=6$~u)f1(Qv05JV0_p)byx%$!* zdHf{6!b)cP0AjABBi_$F)FbiF6Y8bw+$LutDZSXs?4OuSvf8#A$`_mTU==<(5r#g+83`?y3?5r5u}jIq)fvRPg@%@{vt= zkeQR+uk+N2;*}X+LPd@+*MKda3)0QnnGf|_`NEbk0lP=|RKP4HOEd4QsTH8EnI~vP zQC+_uNxRaj@-RV+op~+7?%YNYybHmz94N|`ZV54{K=O3F*rbrI@odJFUzvjkD~GilRwIhafy zqTYO%VU#Ct?9-s3=48sp?7M&%b^Rj4j1-yY_$?ZS6d#R{KuztTWkrW%-8iTvME9+?R=9KW7&f=J|c-3_4rE)2^OUxtTqR z&f9q1M=H<0&j;PK1?J!QxT;6d-7T2-^=OOO-|p(|GP;my&RYbeMm6?Ex-IW|_5Dq8 zk=d0CE4Xi-&7Q?8Ihx6IKEM+Gf?%5|g5Yqwo<)8(e7VS?bt8SW(=O(B_jfDQYsGaX zCXygqQZMV0gk7KH6}Cbkd!O`y;1?vMUO>pzDWL4tOimzlR?|;Scu>PeOnM>#zmQ3x z1L`trc_#qUVrS=_iZu~IH4@|(D z!CYL(9{hR{SbHbsyes)f%_!ZO%35{CU>LTHRY74iKxNHQWjpM7%}d#D_Y++Ba}*OA z^%ZtxYpz%s<%Y>NLxRYyG$%fWczP@yb@z1!-)^Ki}@rmow)HqR* zn1JXz%B`3%9YWk^uhqpIKl&`;k8sC8P7;!ljb(c%1MRn@(babHaI{i2qYH(vvKop5 z9dX4bBG(=|!`a;i|B#d2*^=UwlFg<|$um#4%oUt?{RPg<8P14^UD_Yo!1e!@zc zsrivf$-rkWk+Y6rSgo$*z(~G%2gRlV@L4a^-oVv?G?P%LTIzA5?+Kg0UtdjruOZ5C zy9z3)G@o8fON>V(oeLNG<`%rbA-Yk9hvE@>Ra$MyKj$plNxH|k-Lao|l&MfQFvHMa zz+wr(b_}xlpl+_Le6&&chl>PfL0F0%EdArB;G?cj9?8ETWK$)H-|{)!uTqX?zJ-*w zDTWYWz4Biu+GcctLL@kLI|WkiMv%2;kS*TTC|F6_v2}Mw>nvq6VIe)XG z+O>U{TQN^Ubg_QBO7+yTDe9Et&#Q5J`|l|^ZBKhuf>zC{aF778J*ktdZc5+xgM~d$ zIOT%CLWam27u;8$`TD>(_qR&1zyPLtl}zobX`XFo#0|y}eU06$8hs9ab&FUuyWG(i ztC`qw!)W!k^VcFyjI?Az>#Qc6SSMlX(p8&$ z0A|E*o^jl}QuKScwv&Nh)vi*4(kfp9i3r`<3teM-m08({Q*w&0d2;bI8- zZ~XYf|KN2AB%ZiAlv^MKT54T&5$2#{97sqU3g?Wg><#~!bMhGw=ru-Oro_!gTLz`& ziCO0r?@r)(^a}+#x5=*N*~GVeaTjPAr6gzELV54>D`}rQeVQb~Usw^l8M|O2-6<8; zHAMR)n&n8!HHvxJSbIe(YQ$h&AbWfCDI4inxb5WMJ2p_A6B-Ac3&^Vp_H*RO&0#~{ zjUMB|#!6Q3h0XDW&?ZB*(-o-wZn%oYuA*S^XE5}Gz#08+w`n2od&s3|(mYNm*c9z) z-Tc0wU`2kefROF8wg&AL|9XdXla{RO8m^EPVsrqbX0@OZB4OB*T<^$GC}iC{@o+7= ze&D!xtB8NhfexkPKuJ6PR&rPXa}TMdv5>Z9m(BLh&((~12ShxZdOoXXRDn;#p*OTnOAO{mK!K;x@W^yK7oG zLU)>A<@%;pn*N*^HFOFir20eJLw5iGs{fN%9-e*(xX0fD>$|ZIavlt9rLj8fw#;cgDR) zEP#u+W%X-^<2BE6tF@g6w4X=oAUGIIN-Qn)ppNr+Cvhj25dzI3Rx+aqKuGee4@nBZw=8sV-?Ln=rV6YO2$9 znBvsG%qABW*_wo=tG(aUR2GTfAsyg83k1u&$k5_>6AkGJ6o+q_GBmO$kijP;h)N>& z)KJxivv?kLVJVtxyBXP(eXoB=FJEzD3pB!P>!=$Y!6Sl}8u$av8Z|*v?&7nSRcw5I z{3`awpLGrz21F_DXFEw^=&1M2wH>!d^7S5{n_IxNx2EXEJ^c@0&Ih%v3Qo8h?E^*H zZu|4WSo>EiXynUeMTu$La-R9wudSekT~xzJKtT>o~*vm!{NHpU!m>~3r5%tB7AiIPIr z9eA%4)?+6c>o4g2U?9`6jS9;5Vhfx?LtMVD8RE6wp}Vwq7QjIIHy|>bT(NAOAFvoT zd>Nfcw7F0Bwq*Q|hE*f*dwrWmg#rYjOvCWgJQFRic_B>*Xzb9J`$iVib@0}m+N)%q zec9oeMsl30h|lya86Qij$K#DVsFDhJu#J>5Q5ZR`FZ~C7_xd-HQn{k)j{c$rK^W1a zX3p9t!ZJkKRCLK7T4Ek^Ivtf%mEz4-Iig$LV2x~rzR#poIk#w6Aq;SyC@%e2OWw4v zrI$q=h}1H*DMvX*FAZfwo{m=L(}FR>)o8vqGt)42*|;wc<-`UYQ^a~KP?2Ey+1Ll= zPh5D%=bkLRcp#xyZOlqJ|I_s7=&x_d`{dz_c+Uj8?{(bms^{i7$*5>kdE!)EgsFA# z4X{rN zUvK-9=p~R6Yn6Vs!d%qj%?Re2rG#qTT}m`7a)B~83xM#%A8Ih1H^jdeLwRKwXk zbn_~FDc9x%ahtcyMv2JB*0QMQ`;AxmLvd7>%TIqf>w||WfCrYS+x;0DA zd!|dfBUM-E^7%vTVaDOKD{CJpB52G@Y=;vh_+`?6E|vf<|HVwg&?q`yp60aS_aGqr zv0&^=Aw`q6-OaKM)V*=iF{zFk<5OUcp17Ll$;`3skqtgZgmrTK_ruZURkoXYrf#J{ zy@Om?2ss;ppaUp7J}`glyn~?<$3odvv~GNzmXeuf_Px13p4;KnxiY2LRlb{{SG;>lxhD5U^<6Oy)j4}j z@pN2?QCnRI@fTKV(iqrxYDl#7lGdI?d})f@xuN)5?4p9f?15!?06^s*XZlC#{_RRV z9Bka-b}&zOM;H5lGv{mAQ{){<+BTje4)sT!p^)b*d9QrRYMeQhOFu}jhe1A{@k*K| zG6t~n-LfC>x7u~bt+uow+x&nJ0x6oyUY+gNhV;k1e)Z5s zh#Cdz(K@{}pyN@gC^U`}^9T@wPn&rPYX`GfkZj39rv0=ge|u8N4x$x*X~QwjWr zZO0ACqAZA_;cJFKjhEq+iqES`c{u1`0%^=W-qEh@V-%99Fi<%pG|_tW&Y;il+=H~5Ifd)UUNjU9>sECf3_sBg!Sue?MMr}E5AW+mb2ByZPQP1IIVf# z%1RCsdaUSVpZfE+b6dJ-0?fx+VPlL>o!anzhSf%3;+CwbtpVgD$vYDlTW(2c9I*05 zsD}hE(BU{SsZs$GtlvM?IrQ6g2CYZWfPODYTMOhACMU}`snC1+=Ugpo9}9Eip`cH@ zB|uRJVYhi}i~P2W7=+ zHy>>Zn@rr4)c7Im#P6qyW=$lRvJsx$W$9ibiW^=;EBm?+rOFI+U!^bO)bgTF_X+4! zmz+13f;AT>ucF;!<08J+z8zMP5?N(owwj6v^z_NW9PCC>`AJ`-y*EGoTF2X%JnWF6 z9V4JL5s-5mv%>Os!;r-~sAzutQ&|4mVNotTRHw_I&WJjA(h|NNu(}W?4D_?et23bC z5ocY3IgdcTJ~N&wvTm8_sFSPX;r?R_r#S{&sYQd9 zEMQjNR2$gE;3#u_W`JdsKD4aUKl(1tc4cFGokBM8ku`64ESw@uxQ(A2#`Vt9mckMB z4xX0M+s7bS?8X;31xjGFM4Ec?YR9iUTY57-W1JHa&c(r6Y<6ii^=;?Py#?`eE&`EX zU_vKp-J3#xr02=NgRkN~%;i8^y_Zcy+gj3fMv=hP=i<`FS#aB#5G}zT7}S!-QzbJz zR%1X+tFdI@aq95K!v@&sK9@~2>_`lyO7KR?5DVrFLa2Nw3BJBKJ6;|-sKgcaU+V63 zyX`>0l?HPU)|Nh3-v>czT%UcGwv!BU_(8kH(XkHtY!7lJ$r@_@U}w}DIz=pMMmx@5 zod^mnu%EtW{dt9Ig&aEr8ppc0{O!LNd)`UC!6)Ug4>V7Xmr?z6Y)UN;0j}|Qu_Nm+ z0|+XY$Wz-fkG$rX`Q=>$Kd_MHUB9{f44@84#SJ?6UJ}_qzi()egf?LiIRJppB4r7 xpTvbGl9FZlr#17Gp8 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 sbr@PB6i4>p5J@Bjb+