From d705f8d1216079be90e08ad6495176023727b6c5 Mon Sep 17 00:00:00 2001 From: ngabsi Date: Thu, 22 Jan 2026 09:22:38 +0100 Subject: [PATCH 1/6] [19.0][ADD] project_budget_threshold_alert : Notify project followers and project manager about budget exceeding based on a set threshold --- project_budget_threshold_alert/README.rst | 215 +++++++ project_budget_threshold_alert/__init__.py | 1 + .../__manifest__.py | 19 + project_budget_threshold_alert/data/cron.xml | 13 + .../data/mail_template.xml | 46 ++ .../models/__init__.py | 2 + .../models/project_project.py | 36 ++ .../models/res_users.py | 11 + project_budget_threshold_alert/pyproject.toml | 3 + .../readme/CONFIGURE.md | 10 + .../readme/CONTEXT.md | 16 + .../readme/CONTRIBUTORS.md | 2 + .../readme/CREDITS.md | 7 + .../readme/DESCRIPTION.md | 7 + .../readme/HISTORY.md | 22 + .../readme/INSTALL.md | 7 + .../readme/ROADMAP.md | 5 + .../readme/USAGE.md | 21 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 561 ++++++++++++++++++ .../views/project_project.xml | 27 + .../views/res_users.xml | 14 + 22 files changed, 1045 insertions(+) create mode 100644 project_budget_threshold_alert/README.rst create mode 100644 project_budget_threshold_alert/__init__.py create mode 100644 project_budget_threshold_alert/__manifest__.py create mode 100644 project_budget_threshold_alert/data/cron.xml create mode 100644 project_budget_threshold_alert/data/mail_template.xml create mode 100644 project_budget_threshold_alert/models/__init__.py create mode 100644 project_budget_threshold_alert/models/project_project.py create mode 100644 project_budget_threshold_alert/models/res_users.py create mode 100644 project_budget_threshold_alert/pyproject.toml create mode 100644 project_budget_threshold_alert/readme/CONFIGURE.md create mode 100644 project_budget_threshold_alert/readme/CONTEXT.md create mode 100644 project_budget_threshold_alert/readme/CONTRIBUTORS.md create mode 100644 project_budget_threshold_alert/readme/CREDITS.md create mode 100644 project_budget_threshold_alert/readme/DESCRIPTION.md create mode 100644 project_budget_threshold_alert/readme/HISTORY.md create mode 100644 project_budget_threshold_alert/readme/INSTALL.md create mode 100644 project_budget_threshold_alert/readme/ROADMAP.md create mode 100644 project_budget_threshold_alert/readme/USAGE.md create mode 100644 project_budget_threshold_alert/static/description/icon.png create mode 100644 project_budget_threshold_alert/static/description/index.html create mode 100644 project_budget_threshold_alert/views/project_project.xml create mode 100644 project_budget_threshold_alert/views/res_users.xml diff --git a/project_budget_threshold_alert/README.rst b/project_budget_threshold_alert/README.rst new file mode 100644 index 0000000000..55207abf60 --- /dev/null +++ b/project_budget_threshold_alert/README.rst @@ -0,0 +1,215 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +============================== +Project Budget Threshold Alert +============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4c63603caa206ac1496ddecbe6881c78356e0909339c8cb1775ef4d6c347b7e7 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github + :target: https://github.com/OCA/project/tree/19.0/project_budget_threshold_alert + :alt: OCA/project +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-19-0/project-19-0-project_budget_threshold_alert + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +[ This file must be max 2-3 paragraphs, and is required. + +The goal of this document is to explain quickly the features of this +module: “what” this module does and “what” it is for. ] + +Example: + +This module extends the functionality of ... to support ... and to allow +users to ... + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +[ This file is optional but strongly suggested to allow end-users to +evaluate the module's usefulness in their context. ] + +BUSINESS NEED: It should explain the “why” of the module: + +- what is the business requirement that generated the need to develop + this module +- in which context or use cases this module can be useful (practical + examples are welcome!). + +APPROACH: It could also explain the approach to address the mentioned +need. + +USEFUL INFORMATION: It can also inform on related modules: + +- modules it depends on and their features +- other modules that can work well together with this one +- suggested setups where the module is useful (eg: multicompany, + multi-website) + +Installation +============ + +[ This file must only be present if there are very specific installation +instructions, such as installing non-python dependencies. The audience +is systems administrators. ] + +To install this module, you need to: + +1. Do this ... + +Configuration +============= + +[ This file is not always required; it should explain **how to configure +the module before using it**; it is aimed at users with administration +privileges. + +Please be detailed on the path to configuration (eg: do you need to +activate developer mode?), describe step by step configurations and the +use of screenshots is strongly recommended.] + +To configure this module, you need to: + +- Go to *App* > Menu > Menu item +- Activate boolean… > save +- … + +Usage +===== + +[ This file is required and contains the instructions on **“how”** to +use the module for end-users. + +If the module does not have a visible impact on the user interface, just +add the following sentence: + + This module does not impact the user interface. + +If that’s not the case, please make sure that every usage step is +covered and remember that images speak more than words!] + +To use this module, you need to: + +- Go to *App* > Menu > Menu item + + *insert screenshot!* + +- In “Contact” form, add a value to field *xyz* > save + + *insert screenshot!* + +- The value of *xyz* is now displayed in the list view. + + *insert screenshot!* + +Known issues / Roadmap +====================== + +[ Enumerate known caveats and future potential improvements. It is +mostly intended for end-users, and can also help potential new +contributors discovering new features to implement. ] + +- ... + +Changelog +========= + +[ The change log. The goal of this file is to help readers understand +changes between version. The primary audience is end users and +integrators. Purely technical changes such as code refactoring must not +be mentioned here. + +This file may contain ONE level of section titles, underlined with the ~ +(tilde) character. Other section markers are forbidden and will likely +break the structure of the README.rst or other documents where this +fragment is included. ] + +11.0.x.y.z (YYYY-MM-DD) +----------------------- + +- [BREAKING] Breaking changes come first. + (`#70 `__) +- [ADD] New feature. (`#74 `__) +- [FIX] Correct this. (`#71 `__) + +11.0.x.y.z (YYYY-MM-DD) +----------------------- + +- ... + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ACSONE SA/NV + +Contributors +------------ + +- Firstname Lastname email.address@example.org (optional company website + url) +- Second Person second.person@example.org (optional company website url) + +Other credits +------------- + +[ This file is optional and contains additional credits, other than +authors, contributors, and maintainers. ] + +The development of this module has been financially supported by: + +- Company 1 name +- Company 2 name + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/project `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_budget_threshold_alert/__init__.py b/project_budget_threshold_alert/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/project_budget_threshold_alert/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/project_budget_threshold_alert/__manifest__.py b/project_budget_threshold_alert/__manifest__.py new file mode 100644 index 0000000000..8adc14e38c --- /dev/null +++ b/project_budget_threshold_alert/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Project Budget Threshold Alert", + "summary": """Send notification when project budget threshold is exceeded""", + "version": "19.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/project", + "depends": ["project", "project_account_budget"], + "data": [ + "views/res_users.xml", + "views/project_project.xml", + "data/cron.xml", + "data/mail_template.xml", + ], + "demo": [], +} diff --git a/project_budget_threshold_alert/data/cron.xml b/project_budget_threshold_alert/data/cron.xml new file mode 100644 index 0000000000..cd51cc9298 --- /dev/null +++ b/project_budget_threshold_alert/data/cron.xml @@ -0,0 +1,13 @@ + + + + + Project: Find Budget threshold exceeded + + code + model._cron_find_budget_threshold_exceeded() + 1 + days + + diff --git a/project_budget_threshold_alert/data/mail_template.xml b/project_budget_threshold_alert/data/mail_template.xml new file mode 100644 index 0000000000..3dd5bea91a --- /dev/null +++ b/project_budget_threshold_alert/data/mail_template.xml @@ -0,0 +1,46 @@ + + + + + Project: Budget threashold exceeded + + {{ object.name }}: Budget Threashold Exceeded + Automated notification sent to the project subscribers to inform about project budget + threshold exceeding + + +

Hello,

+
+

+ This is an automated notification to inform you that the budget threshold for the project + + + has been exceeded. +

+
    +
  • + Budget: + +
  • +
  • + Threshold reached: + % +
  • +
+ +

+ Please review the project budget and take any necessary actions. +

+ +

+ Best regards, +
+ +

+
+ {{ object.user_id.lang }} +
+
diff --git a/project_budget_threshold_alert/models/__init__.py b/project_budget_threshold_alert/models/__init__.py new file mode 100644 index 0000000000..4990c4758f --- /dev/null +++ b/project_budget_threshold_alert/models/__init__.py @@ -0,0 +1,2 @@ +from . import project_project +from . import res_users diff --git a/project_budget_threshold_alert/models/project_project.py b/project_budget_threshold_alert/models/project_project.py new file mode 100644 index 0000000000..e6b040d097 --- /dev/null +++ b/project_budget_threshold_alert/models/project_project.py @@ -0,0 +1,36 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ProjectProject(models.Model): + _inherit = "project.project" + + budget_threshold = fields.Float() + total_budget_amount_threshold = fields.Monetary( + compute="_compute_budget_amount_threshold" + ) + is_budget_exceeded = fields.Boolean(default=False) + force_notification_send = fields.Boolean(default=False) + create_activity_for_project_manager = fields.Boolean(default=False) + + @api.depends("total_budget_amount", "budget_threshold") + def _compute_budget_amount_threshold(self): + for rec in self: + rec.total_budget_amount_threshold = ( + rec.total_budget_amount * rec.budget_threshold + ) + + def _cron_find_budget_threshold_exceeded(self): + exceeded_projects = self.env["project.project"].search( + [("budget_threshold", "<=", "total_budget_progress")] + ) + for project in exceeded_projects: + project.write({"is_budget_exceeded": True}) + if project.user_id.partner_id.id not in project.message_partner_ids.ids: + project.message_partner_ids += project.user_id.partner_id + template = ( + "project_budget_threshold_alert.project_budget_exceeded_email_template" + ) + project.message_post_with_source(source_ref=template) diff --git a/project_budget_threshold_alert/models/res_users.py b/project_budget_threshold_alert/models/res_users.py new file mode 100644 index 0000000000..3ea88a86aa --- /dev/null +++ b/project_budget_threshold_alert/models/res_users.py @@ -0,0 +1,11 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + receive_budget_threshold_notification = fields.Boolean( + string="Notify me if the project budget exceeds the threshold", default=True + ) diff --git a/project_budget_threshold_alert/pyproject.toml b/project_budget_threshold_alert/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/project_budget_threshold_alert/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/project_budget_threshold_alert/readme/CONFIGURE.md b/project_budget_threshold_alert/readme/CONFIGURE.md new file mode 100644 index 0000000000..2fdb0e64a6 --- /dev/null +++ b/project_budget_threshold_alert/readme/CONFIGURE.md @@ -0,0 +1,10 @@ +[ This file is not always required; it should explain **how to configure the module before using it**; it is aimed at users with administration privileges. + +Please be detailed on the path to configuration (eg: do you need to activate developer mode?), describe step by step configurations and the use of screenshots is strongly recommended.] + + +To configure this module, you need to: + +- Go to *App* > Menu > Menu item +- Activate boolean… > save +- … diff --git a/project_budget_threshold_alert/readme/CONTEXT.md b/project_budget_threshold_alert/readme/CONTEXT.md new file mode 100644 index 0000000000..096235a2f3 --- /dev/null +++ b/project_budget_threshold_alert/readme/CONTEXT.md @@ -0,0 +1,16 @@ +[ This file is optional but strongly suggested to allow end-users to evaluate the +module's usefulness in their context. ] + +BUSINESS NEED: +It should explain the “why” of the module: +- what is the business requirement that generated the need to develop this module +- in which context or use cases this module can be useful (practical examples are welcome!). + +APPROACH: +It could also explain the approach to address the mentioned need. + +USEFUL INFORMATION: +It can also inform on related modules: +- modules it depends on and their features +- other modules that can work well together with this one +- suggested setups where the module is useful (eg: multicompany, multi-website) diff --git a/project_budget_threshold_alert/readme/CONTRIBUTORS.md b/project_budget_threshold_alert/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..7be72fb967 --- /dev/null +++ b/project_budget_threshold_alert/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- Firstname Lastname (optional company website url) +- Second Person (optional company website url) diff --git a/project_budget_threshold_alert/readme/CREDITS.md b/project_budget_threshold_alert/readme/CREDITS.md new file mode 100644 index 0000000000..9c2b025b50 --- /dev/null +++ b/project_budget_threshold_alert/readme/CREDITS.md @@ -0,0 +1,7 @@ +[ This file is optional and contains additional credits, other than + authors, contributors, and maintainers. ] + +The development of this module has been financially supported by: + +- Company 1 name +- Company 2 name diff --git a/project_budget_threshold_alert/readme/DESCRIPTION.md b/project_budget_threshold_alert/readme/DESCRIPTION.md new file mode 100644 index 0000000000..2371a1464a --- /dev/null +++ b/project_budget_threshold_alert/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +[ This file must be max 2-3 paragraphs, and is required. + +The goal of this document is to explain quickly the features of this module: “what” this module does and “what” it is for. ] + +Example: + +This module extends the functionality of ... to support ... and to allow users to ... diff --git a/project_budget_threshold_alert/readme/HISTORY.md b/project_budget_threshold_alert/readme/HISTORY.md new file mode 100644 index 0000000000..a6daf58cc9 --- /dev/null +++ b/project_budget_threshold_alert/readme/HISTORY.md @@ -0,0 +1,22 @@ +[ The change log. The goal of this file is to help readers + understand changes between version. The primary audience is + end users and integrators. Purely technical changes such as + code refactoring must not be mentioned here. + + This file may contain ONE level of section titles, underlined + with the ~ (tilde) character. Other section markers are + forbidden and will likely break the structure of the README.rst + or other documents where this fragment is included. ] + +## 11.0.x.y.z (YYYY-MM-DD) + +- [BREAKING] Breaking changes come first. + ([#70](https://github.com/OCA/repo/issues/70)) +- [ADD] New feature. + ([#74](https://github.com/OCA/repo/issues/74)) +- [FIX] Correct this. + ([#71](https://github.com/OCA/repo/issues/71)) + +## 11.0.x.y.z (YYYY-MM-DD) + +- ... diff --git a/project_budget_threshold_alert/readme/INSTALL.md b/project_budget_threshold_alert/readme/INSTALL.md new file mode 100644 index 0000000000..77b98e7aa2 --- /dev/null +++ b/project_budget_threshold_alert/readme/INSTALL.md @@ -0,0 +1,7 @@ +[ This file must only be present if there are very specific + installation instructions, such as installing non-python + dependencies. The audience is systems administrators. ] + +To install this module, you need to: + +1. Do this ... diff --git a/project_budget_threshold_alert/readme/ROADMAP.md b/project_budget_threshold_alert/readme/ROADMAP.md new file mode 100644 index 0000000000..446840cfb9 --- /dev/null +++ b/project_budget_threshold_alert/readme/ROADMAP.md @@ -0,0 +1,5 @@ +[ Enumerate known caveats and future potential improvements. + It is mostly intended for end-users, and can also help + potential new contributors discovering new features to implement. ] + +- ... diff --git a/project_budget_threshold_alert/readme/USAGE.md b/project_budget_threshold_alert/readme/USAGE.md new file mode 100644 index 0000000000..2cf127584b --- /dev/null +++ b/project_budget_threshold_alert/readme/USAGE.md @@ -0,0 +1,21 @@ +[ This file is required and contains the instructions on **“how”** to use the module for end-users. + +If the module does not have a visible impact on the user interface, just add the following sentence: + +> This module does not impact the user interface. + +If that’s not the case, please make sure that every usage step is covered and remember that images speak more than words!] + +To use this module, you need to: + +- Go to *App* > Menu > Menu item + + *insert screenshot!* + +- In “Contact” form, add a value to field *xyz* > save + + *insert screenshot!* + +- The value of *xyz* is now displayed in the list view. + + *insert screenshot!* diff --git a/project_budget_threshold_alert/static/description/icon.png b/project_budget_threshold_alert/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/project_budget_threshold_alert/static/description/index.html b/project_budget_threshold_alert/static/description/index.html new file mode 100644 index 0000000000..476a2520f2 --- /dev/null +++ b/project_budget_threshold_alert/static/description/index.html @@ -0,0 +1,561 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Project Budget Threshold Alert

+ +

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

+

[ This file must be max 2-3 paragraphs, and is required.

+

The goal of this document is to explain quickly the features of this +module: “what” this module does and “what” it is for. ]

+

Example:

+

This module extends the functionality of … to support … and to allow +users to …

+

Table of contents

+ +
+

Use Cases / Context

+

[ This file is optional but strongly suggested to allow end-users to +evaluate the module’s usefulness in their context. ]

+

BUSINESS NEED: It should explain the “why” of the module:

+
    +
  • what is the business requirement that generated the need to develop +this module
  • +
  • in which context or use cases this module can be useful (practical +examples are welcome!).
  • +
+

APPROACH: It could also explain the approach to address the mentioned +need.

+

USEFUL INFORMATION: It can also inform on related modules:

+
    +
  • modules it depends on and their features
  • +
  • other modules that can work well together with this one
  • +
  • suggested setups where the module is useful (eg: multicompany, +multi-website)
  • +
+
+
+

Installation

+

[ This file must only be present if there are very specific installation +instructions, such as installing non-python dependencies. The audience +is systems administrators. ]

+

To install this module, you need to:

+
    +
  1. Do this …
  2. +
+
+
+

Configuration

+

[ This file is not always required; it should explain how to configure +the module before using it; it is aimed at users with administration +privileges.

+

Please be detailed on the path to configuration (eg: do you need to +activate developer mode?), describe step by step configurations and the +use of screenshots is strongly recommended.]

+

To configure this module, you need to:

+
    +
  • Go to App > Menu > Menu item
  • +
  • Activate boolean… > save
  • +
  • +
+
+
+

Usage

+

[ This file is required and contains the instructions on “how” to +use the module for end-users.

+

If the module does not have a visible impact on the user interface, just +add the following sentence:

+
+This module does not impact the user interface.
+

If that’s not the case, please make sure that every usage step is +covered and remember that images speak more than words!]

+

To use this module, you need to:

+
    +
  • Go to App > Menu > Menu item

    +

    insert screenshot!

    +
  • +
  • In “Contact” form, add a value to field xyz > save

    +

    insert screenshot!

    +
  • +
  • The value of xyz is now displayed in the list view.

    +

    insert screenshot!

    +
  • +
+
+
+

Known issues / Roadmap

+

[ Enumerate known caveats and future potential improvements. It is +mostly intended for end-users, and can also help potential new +contributors discovering new features to implement. ]

+
    +
  • +
+
+
+

Changelog

+

[ The change log. The goal of this file is to help readers understand +changes between version. The primary audience is end users and +integrators. Purely technical changes such as code refactoring must not +be mentioned here.

+

This file may contain ONE level of section titles, underlined with the ~ +(tilde) character. Other section markers are forbidden and will likely +break the structure of the README.rst or other documents where this +fragment is included. ]

+
+

11.0.x.y.z (YYYY-MM-DD)

+
    +
  • [BREAKING] Breaking changes come first. +(#70)
  • +
  • [ADD] New feature. (#74)
  • +
  • [FIX] Correct this. (#71)
  • +
+
+ +
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

[ This file is optional and contains additional credits, other than +authors, contributors, and maintainers. ]

+

The development of this module has been financially supported by:

+
    +
  • Company 1 name
  • +
  • Company 2 name
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/project project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/project_budget_threshold_alert/views/project_project.xml b/project_budget_threshold_alert/views/project_project.xml new file mode 100644 index 0000000000..ca422e384c --- /dev/null +++ b/project_budget_threshold_alert/views/project_project.xml @@ -0,0 +1,27 @@ + + + + + project.project + + + + + + + + + + + + + + + + + diff --git a/project_budget_threshold_alert/views/res_users.xml b/project_budget_threshold_alert/views/res_users.xml new file mode 100644 index 0000000000..dcb16b898a --- /dev/null +++ b/project_budget_threshold_alert/views/res_users.xml @@ -0,0 +1,14 @@ + + + + + res.users + + + + + + + + From 1653c408ce30cb5d97c69a1ab86c295bbd29968a Mon Sep 17 00:00:00 2001 From: ngabsi Date: Wed, 28 Jan 2026 08:18:14 +0100 Subject: [PATCH 2/6] [19.0][IMP] project_profitability_threshold_alert : - Rename module to be more generic - Add costs vs revenues threshold --- project_budget_threshold_alert/README.rst | 215 ------------------ .../models/__init__.py | 2 - .../models/project_project.py | 36 --- .../models/res_users.py | 11 - .../readme/CONFIGURE.md | 10 - .../readme/CONTEXT.md | 16 -- .../readme/CONTRIBUTORS.md | 2 - .../readme/CREDITS.md | 7 - .../readme/DESCRIPTION.md | 7 - .../readme/HISTORY.md | 22 -- .../readme/INSTALL.md | 7 - .../readme/ROADMAP.md | 5 - .../readme/USAGE.md | 21 -- .../README.rst | 134 +++++++++++ .../__init__.py | 0 .../__manifest__.py | 7 +- .../data/cron.xml | 6 +- .../data/mail_template.xml | 26 +-- .../i18n/fr.po | 201 ++++++++++++++++ .../i18n/fr.pot | 176 ++++++++++++++ .../models/__init__.py | 4 + .../models/project_project.py | 116 ++++++++++ .../models/res_company.py | 12 + .../models/res_config_settings.py | 22 ++ .../models/res_users.py | 13 ++ .../pyproject.toml | 0 .../readme/CONFIGURE.md | 23 ++ .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 9 + .../static/description/icon.png | Bin .../static/description/index.html | 192 +++++----------- .../static/description/screenshot.png | Bin 0 -> 57099 bytes .../static/description/screenshot1.png | Bin 0 -> 93793 bytes .../static/description/screenshot2.png | Bin 0 -> 49592 bytes .../tests/__init__.py | 1 + .../tests/test_project_profitability_alert.py | 12 + .../views/project_project.xml | 15 +- .../views/res_config_settings.xml | 37 +++ .../views/res_users.xml | 5 +- 39 files changed, 840 insertions(+), 533 deletions(-) delete mode 100644 project_budget_threshold_alert/README.rst delete mode 100644 project_budget_threshold_alert/models/__init__.py delete mode 100644 project_budget_threshold_alert/models/project_project.py delete mode 100644 project_budget_threshold_alert/models/res_users.py delete mode 100644 project_budget_threshold_alert/readme/CONFIGURE.md delete mode 100644 project_budget_threshold_alert/readme/CONTEXT.md delete mode 100644 project_budget_threshold_alert/readme/CONTRIBUTORS.md delete mode 100644 project_budget_threshold_alert/readme/CREDITS.md delete mode 100644 project_budget_threshold_alert/readme/DESCRIPTION.md delete mode 100644 project_budget_threshold_alert/readme/HISTORY.md delete mode 100644 project_budget_threshold_alert/readme/INSTALL.md delete mode 100644 project_budget_threshold_alert/readme/ROADMAP.md delete mode 100644 project_budget_threshold_alert/readme/USAGE.md create mode 100644 project_profitability_threshold_alert/README.rst rename {project_budget_threshold_alert => project_profitability_threshold_alert}/__init__.py (100%) rename {project_budget_threshold_alert => project_profitability_threshold_alert}/__manifest__.py (67%) rename {project_budget_threshold_alert => project_profitability_threshold_alert}/data/cron.xml (62%) rename {project_budget_threshold_alert => project_profitability_threshold_alert}/data/mail_template.xml (56%) create mode 100644 project_profitability_threshold_alert/i18n/fr.po create mode 100644 project_profitability_threshold_alert/i18n/fr.pot create mode 100644 project_profitability_threshold_alert/models/__init__.py create mode 100644 project_profitability_threshold_alert/models/project_project.py create mode 100644 project_profitability_threshold_alert/models/res_company.py create mode 100644 project_profitability_threshold_alert/models/res_config_settings.py create mode 100644 project_profitability_threshold_alert/models/res_users.py rename {project_budget_threshold_alert => project_profitability_threshold_alert}/pyproject.toml (100%) create mode 100644 project_profitability_threshold_alert/readme/CONFIGURE.md create mode 100644 project_profitability_threshold_alert/readme/CONTRIBUTORS.md create mode 100644 project_profitability_threshold_alert/readme/DESCRIPTION.md rename {project_budget_threshold_alert => project_profitability_threshold_alert}/static/description/icon.png (100%) rename {project_budget_threshold_alert => project_profitability_threshold_alert}/static/description/index.html (58%) create mode 100644 project_profitability_threshold_alert/static/description/screenshot.png create mode 100644 project_profitability_threshold_alert/static/description/screenshot1.png create mode 100644 project_profitability_threshold_alert/static/description/screenshot2.png create mode 100644 project_profitability_threshold_alert/tests/__init__.py create mode 100644 project_profitability_threshold_alert/tests/test_project_profitability_alert.py rename {project_budget_threshold_alert => project_profitability_threshold_alert}/views/project_project.xml (60%) create mode 100644 project_profitability_threshold_alert/views/res_config_settings.xml rename {project_budget_threshold_alert => project_profitability_threshold_alert}/views/res_users.xml (77%) diff --git a/project_budget_threshold_alert/README.rst b/project_budget_threshold_alert/README.rst deleted file mode 100644 index 55207abf60..0000000000 --- a/project_budget_threshold_alert/README.rst +++ /dev/null @@ -1,215 +0,0 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - -============================== -Project Budget Threshold Alert -============================== - -.. - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! This file is generated by oca-gen-addon-readme !! - !! changes will be overwritten. !! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:4c63603caa206ac1496ddecbe6881c78356e0909339c8cb1775ef4d6c347b7e7 - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png - :target: https://odoo-community.org/page/development-status - :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github - :target: https://github.com/OCA/project/tree/19.0/project_budget_threshold_alert - :alt: OCA/project -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/project-19-0/project-19-0-project_budget_threshold_alert - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=19.0 - :alt: Try me on Runboat - -|badge1| |badge2| |badge3| |badge4| |badge5| - -[ This file must be max 2-3 paragraphs, and is required. - -The goal of this document is to explain quickly the features of this -module: “what” this module does and “what” it is for. ] - -Example: - -This module extends the functionality of ... to support ... and to allow -users to ... - -**Table of contents** - -.. contents:: - :local: - -Use Cases / Context -=================== - -[ This file is optional but strongly suggested to allow end-users to -evaluate the module's usefulness in their context. ] - -BUSINESS NEED: It should explain the “why” of the module: - -- what is the business requirement that generated the need to develop - this module -- in which context or use cases this module can be useful (practical - examples are welcome!). - -APPROACH: It could also explain the approach to address the mentioned -need. - -USEFUL INFORMATION: It can also inform on related modules: - -- modules it depends on and their features -- other modules that can work well together with this one -- suggested setups where the module is useful (eg: multicompany, - multi-website) - -Installation -============ - -[ This file must only be present if there are very specific installation -instructions, such as installing non-python dependencies. The audience -is systems administrators. ] - -To install this module, you need to: - -1. Do this ... - -Configuration -============= - -[ This file is not always required; it should explain **how to configure -the module before using it**; it is aimed at users with administration -privileges. - -Please be detailed on the path to configuration (eg: do you need to -activate developer mode?), describe step by step configurations and the -use of screenshots is strongly recommended.] - -To configure this module, you need to: - -- Go to *App* > Menu > Menu item -- Activate boolean… > save -- … - -Usage -===== - -[ This file is required and contains the instructions on **“how”** to -use the module for end-users. - -If the module does not have a visible impact on the user interface, just -add the following sentence: - - This module does not impact the user interface. - -If that’s not the case, please make sure that every usage step is -covered and remember that images speak more than words!] - -To use this module, you need to: - -- Go to *App* > Menu > Menu item - - *insert screenshot!* - -- In “Contact” form, add a value to field *xyz* > save - - *insert screenshot!* - -- The value of *xyz* is now displayed in the list view. - - *insert screenshot!* - -Known issues / Roadmap -====================== - -[ Enumerate known caveats and future potential improvements. It is -mostly intended for end-users, and can also help potential new -contributors discovering new features to implement. ] - -- ... - -Changelog -========= - -[ The change log. The goal of this file is to help readers understand -changes between version. The primary audience is end users and -integrators. Purely technical changes such as code refactoring must not -be mentioned here. - -This file may contain ONE level of section titles, underlined with the ~ -(tilde) character. Other section markers are forbidden and will likely -break the structure of the README.rst or other documents where this -fragment is included. ] - -11.0.x.y.z (YYYY-MM-DD) ------------------------ - -- [BREAKING] Breaking changes come first. - (`#70 `__) -- [ADD] New feature. (`#74 `__) -- [FIX] Correct this. (`#71 `__) - -11.0.x.y.z (YYYY-MM-DD) ------------------------ - -- ... - -Bug Tracker -=========== - -Bugs are tracked on `GitHub Issues `_. -In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. - -Do not contact contributors directly about support or help with technical issues. - -Credits -======= - -Authors -------- - -* ACSONE SA/NV - -Contributors ------------- - -- Firstname Lastname email.address@example.org (optional company website - url) -- Second Person second.person@example.org (optional company website url) - -Other credits -------------- - -[ This file is optional and contains additional credits, other than -authors, contributors, and maintainers. ] - -The development of this module has been financially supported by: - -- Company 1 name -- Company 2 name - -Maintainers ------------ - -This module is maintained by the OCA. - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. - -This module is part of the `OCA/project `_ project on GitHub. - -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_budget_threshold_alert/models/__init__.py b/project_budget_threshold_alert/models/__init__.py deleted file mode 100644 index 4990c4758f..0000000000 --- a/project_budget_threshold_alert/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import project_project -from . import res_users diff --git a/project_budget_threshold_alert/models/project_project.py b/project_budget_threshold_alert/models/project_project.py deleted file mode 100644 index e6b040d097..0000000000 --- a/project_budget_threshold_alert/models/project_project.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2026 ACSONE SA/NV -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -from odoo import api, fields, models - - -class ProjectProject(models.Model): - _inherit = "project.project" - - budget_threshold = fields.Float() - total_budget_amount_threshold = fields.Monetary( - compute="_compute_budget_amount_threshold" - ) - is_budget_exceeded = fields.Boolean(default=False) - force_notification_send = fields.Boolean(default=False) - create_activity_for_project_manager = fields.Boolean(default=False) - - @api.depends("total_budget_amount", "budget_threshold") - def _compute_budget_amount_threshold(self): - for rec in self: - rec.total_budget_amount_threshold = ( - rec.total_budget_amount * rec.budget_threshold - ) - - def _cron_find_budget_threshold_exceeded(self): - exceeded_projects = self.env["project.project"].search( - [("budget_threshold", "<=", "total_budget_progress")] - ) - for project in exceeded_projects: - project.write({"is_budget_exceeded": True}) - if project.user_id.partner_id.id not in project.message_partner_ids.ids: - project.message_partner_ids += project.user_id.partner_id - template = ( - "project_budget_threshold_alert.project_budget_exceeded_email_template" - ) - project.message_post_with_source(source_ref=template) diff --git a/project_budget_threshold_alert/models/res_users.py b/project_budget_threshold_alert/models/res_users.py deleted file mode 100644 index 3ea88a86aa..0000000000 --- a/project_budget_threshold_alert/models/res_users.py +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright 2026 ACSONE SA/NV -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - -from odoo import fields, models - - -class ResUsers(models.Model): - _inherit = "res.users" - receive_budget_threshold_notification = fields.Boolean( - string="Notify me if the project budget exceeds the threshold", default=True - ) diff --git a/project_budget_threshold_alert/readme/CONFIGURE.md b/project_budget_threshold_alert/readme/CONFIGURE.md deleted file mode 100644 index 2fdb0e64a6..0000000000 --- a/project_budget_threshold_alert/readme/CONFIGURE.md +++ /dev/null @@ -1,10 +0,0 @@ -[ This file is not always required; it should explain **how to configure the module before using it**; it is aimed at users with administration privileges. - -Please be detailed on the path to configuration (eg: do you need to activate developer mode?), describe step by step configurations and the use of screenshots is strongly recommended.] - - -To configure this module, you need to: - -- Go to *App* > Menu > Menu item -- Activate boolean… > save -- … diff --git a/project_budget_threshold_alert/readme/CONTEXT.md b/project_budget_threshold_alert/readme/CONTEXT.md deleted file mode 100644 index 096235a2f3..0000000000 --- a/project_budget_threshold_alert/readme/CONTEXT.md +++ /dev/null @@ -1,16 +0,0 @@ -[ This file is optional but strongly suggested to allow end-users to evaluate the -module's usefulness in their context. ] - -BUSINESS NEED: -It should explain the “why” of the module: -- what is the business requirement that generated the need to develop this module -- in which context or use cases this module can be useful (practical examples are welcome!). - -APPROACH: -It could also explain the approach to address the mentioned need. - -USEFUL INFORMATION: -It can also inform on related modules: -- modules it depends on and their features -- other modules that can work well together with this one -- suggested setups where the module is useful (eg: multicompany, multi-website) diff --git a/project_budget_threshold_alert/readme/CONTRIBUTORS.md b/project_budget_threshold_alert/readme/CONTRIBUTORS.md deleted file mode 100644 index 7be72fb967..0000000000 --- a/project_budget_threshold_alert/readme/CONTRIBUTORS.md +++ /dev/null @@ -1,2 +0,0 @@ -- Firstname Lastname (optional company website url) -- Second Person (optional company website url) diff --git a/project_budget_threshold_alert/readme/CREDITS.md b/project_budget_threshold_alert/readme/CREDITS.md deleted file mode 100644 index 9c2b025b50..0000000000 --- a/project_budget_threshold_alert/readme/CREDITS.md +++ /dev/null @@ -1,7 +0,0 @@ -[ This file is optional and contains additional credits, other than - authors, contributors, and maintainers. ] - -The development of this module has been financially supported by: - -- Company 1 name -- Company 2 name diff --git a/project_budget_threshold_alert/readme/DESCRIPTION.md b/project_budget_threshold_alert/readme/DESCRIPTION.md deleted file mode 100644 index 2371a1464a..0000000000 --- a/project_budget_threshold_alert/readme/DESCRIPTION.md +++ /dev/null @@ -1,7 +0,0 @@ -[ This file must be max 2-3 paragraphs, and is required. - -The goal of this document is to explain quickly the features of this module: “what” this module does and “what” it is for. ] - -Example: - -This module extends the functionality of ... to support ... and to allow users to ... diff --git a/project_budget_threshold_alert/readme/HISTORY.md b/project_budget_threshold_alert/readme/HISTORY.md deleted file mode 100644 index a6daf58cc9..0000000000 --- a/project_budget_threshold_alert/readme/HISTORY.md +++ /dev/null @@ -1,22 +0,0 @@ -[ The change log. The goal of this file is to help readers - understand changes between version. The primary audience is - end users and integrators. Purely technical changes such as - code refactoring must not be mentioned here. - - This file may contain ONE level of section titles, underlined - with the ~ (tilde) character. Other section markers are - forbidden and will likely break the structure of the README.rst - or other documents where this fragment is included. ] - -## 11.0.x.y.z (YYYY-MM-DD) - -- [BREAKING] Breaking changes come first. - ([#70](https://github.com/OCA/repo/issues/70)) -- [ADD] New feature. - ([#74](https://github.com/OCA/repo/issues/74)) -- [FIX] Correct this. - ([#71](https://github.com/OCA/repo/issues/71)) - -## 11.0.x.y.z (YYYY-MM-DD) - -- ... diff --git a/project_budget_threshold_alert/readme/INSTALL.md b/project_budget_threshold_alert/readme/INSTALL.md deleted file mode 100644 index 77b98e7aa2..0000000000 --- a/project_budget_threshold_alert/readme/INSTALL.md +++ /dev/null @@ -1,7 +0,0 @@ -[ This file must only be present if there are very specific - installation instructions, such as installing non-python - dependencies. The audience is systems administrators. ] - -To install this module, you need to: - -1. Do this ... diff --git a/project_budget_threshold_alert/readme/ROADMAP.md b/project_budget_threshold_alert/readme/ROADMAP.md deleted file mode 100644 index 446840cfb9..0000000000 --- a/project_budget_threshold_alert/readme/ROADMAP.md +++ /dev/null @@ -1,5 +0,0 @@ -[ Enumerate known caveats and future potential improvements. - It is mostly intended for end-users, and can also help - potential new contributors discovering new features to implement. ] - -- ... diff --git a/project_budget_threshold_alert/readme/USAGE.md b/project_budget_threshold_alert/readme/USAGE.md deleted file mode 100644 index 2cf127584b..0000000000 --- a/project_budget_threshold_alert/readme/USAGE.md +++ /dev/null @@ -1,21 +0,0 @@ -[ This file is required and contains the instructions on **“how”** to use the module for end-users. - -If the module does not have a visible impact on the user interface, just add the following sentence: - -> This module does not impact the user interface. - -If that’s not the case, please make sure that every usage step is covered and remember that images speak more than words!] - -To use this module, you need to: - -- Go to *App* > Menu > Menu item - - *insert screenshot!* - -- In “Contact” form, add a value to field *xyz* > save - - *insert screenshot!* - -- The value of *xyz* is now displayed in the list view. - - *insert screenshot!* diff --git a/project_profitability_threshold_alert/README.rst b/project_profitability_threshold_alert/README.rst new file mode 100644 index 0000000000..ef8937b96f --- /dev/null +++ b/project_profitability_threshold_alert/README.rst @@ -0,0 +1,134 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================================== +Project Profitability Threshold Alert +===================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4c63603caa206ac1496ddecbe6881c78356e0909339c8cb1775ef4d6c347b7e7 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github + :target: https://github.com/OCA/project/tree/19.0/project_profitability_threshold_alert + :alt: OCA/project +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-19-0/project-19-0-project_profitability_threshold_alert + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends the Odoo Project application to support automatic +profitability threshold alerts. It allows companies to define a default +profitability limit (for example when project costs exceed a given +percentage of revenues) and to apply it to projects that do not have a +specific alert configuration. Each project can also define its own +threshold. + +When the threshold is reached or exceeded, the system sends +notifications to the project manager and to internal subscribers of the +project. The notification method follows the user’s notification +preferences, with an option to force the sending of an email even if the +user is configured to receive only in-app notifications. This module +helps project managers anticipate financial risks and improves internal +communication around project profitability. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +**1. Configure the default profitability threshold** + +- Go to Settings > Project > Set the default threshold percentage + |screenshot.png| + +**2. Configure a project-specific threshold (optional)** + +- Go to Project > Open a project > Manage notifications section > Define + a specific threshold for this project. If no value is defined, the + system will automatically use the global default threshold. (see + screenshot below) + +**3. Manage notification recipients** + +- Define a Project Manager and followers (subscribers) for the project + These users will receive notifications when the threshold is reached. + +**4. User notification preferences** + +- Go to Settings > Open a user > Configure the user’s notification + preferences. |screenshot1.png| + +**5. Project notification preferences** + +When project costs exceed the configured percentage of revenues, the +system automatically sends (via a cron) + +- An email to manager and internal user followers if the Force Email + Notification option is enabled from the project. +- An activity of type To-Do for the project manager if the Create + Activity option is enabled from the project. + +|screenshot2.png| + +.. |screenshot.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_profitability_threshold_alert/static/description/screenshot.png +.. |screenshot1.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_profitability_threshold_alert/static/description/screenshot1.png +.. |screenshot2.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_profitability_threshold_alert/static/description/screenshot2.png + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ACSONE SA/NV + +Contributors +------------ + +- Nihel GABSI nihel.gabsi@acsone.eu (https://www.acsone.eu/) + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/project `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_budget_threshold_alert/__init__.py b/project_profitability_threshold_alert/__init__.py similarity index 100% rename from project_budget_threshold_alert/__init__.py rename to project_profitability_threshold_alert/__init__.py diff --git a/project_budget_threshold_alert/__manifest__.py b/project_profitability_threshold_alert/__manifest__.py similarity index 67% rename from project_budget_threshold_alert/__manifest__.py rename to project_profitability_threshold_alert/__manifest__.py index 8adc14e38c..a341093b14 100644 --- a/project_budget_threshold_alert/__manifest__.py +++ b/project_profitability_threshold_alert/__manifest__.py @@ -2,14 +2,15 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { - "name": "Project Budget Threshold Alert", - "summary": """Send notification when project budget threshold is exceeded""", + "name": "Project Profitability Threshold Alert", + "summary": """Send notification when project costs threshold is exceeded""", "version": "19.0.1.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/project", - "depends": ["project", "project_account_budget"], + "depends": ["project"], "data": [ + "views/res_config_settings.xml", "views/res_users.xml", "views/project_project.xml", "data/cron.xml", diff --git a/project_budget_threshold_alert/data/cron.xml b/project_profitability_threshold_alert/data/cron.xml similarity index 62% rename from project_budget_threshold_alert/data/cron.xml rename to project_profitability_threshold_alert/data/cron.xml index cd51cc9298..26bcf4f220 100644 --- a/project_budget_threshold_alert/data/cron.xml +++ b/project_profitability_threshold_alert/data/cron.xml @@ -2,11 +2,11 @@ - - Project: Find Budget threshold exceeded + + Project: Find Costs threshold exceeded code - model._cron_find_budget_threshold_exceeded() + model._cron_find_costs_threshold_exceeded() 1 days diff --git a/project_budget_threshold_alert/data/mail_template.xml b/project_profitability_threshold_alert/data/mail_template.xml similarity index 56% rename from project_budget_threshold_alert/data/mail_template.xml rename to project_profitability_threshold_alert/data/mail_template.xml index 3dd5bea91a..b4a65e69a0 100644 --- a/project_budget_threshold_alert/data/mail_template.xml +++ b/project_profitability_threshold_alert/data/mail_template.xml @@ -2,39 +2,29 @@ - - Project: Budget threashold exceeded + + Project: Costs threashold exceeded - {{ object.name }}: Budget Threashold Exceeded + {{ object.name }}: Costs Threashold Exceeded Automated notification sent to the project subscribers to inform about project budget + >Automated notification sent to the project subscribers to inform about project Costs vs Revenues threshold exceeding

Hello,


- This is an automated notification to inform you that the budget threshold for the project + This is an automated notification to inform you that the costs threshold for the project has been exceeded.

-
    -
  • - Budget: - -
  • -
  • - Threshold reached: - % -
  • -
-

- Please review the project budget and take any necessary actions. + Please review the project and take any necessary actions.

- +
+

Best regards,
diff --git a/project_profitability_threshold_alert/i18n/fr.po b/project_profitability_threshold_alert/i18n/fr.po new file mode 100644 index 0000000000..0aa4acce34 --- /dev/null +++ b/project_profitability_threshold_alert/i18n/fr.po @@ -0,0 +1,201 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_profitability_threshold_alert +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-28 12:03+0000\n" +"PO-Revision-Date: 2026-01-28 12:03+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_profitability_threshold_alert +#: model:mail.template,body_html:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "" +"

Hello,

\n" +"
\n" +"

\n" +" This is an automated notification to inform you that the costs threshold for the project\n" +" \n" +" \n" +" has been exceeded.\n" +"

\n" +"

\n" +" Please review the project and take any necessary actions.\n" +"

\n" +"
\n" +"
\n" +"

\n" +" Best regards,\n" +"
\n" +" \n" +"

\n" +" " +msgstr "" +"

Bonjour,

\n" +"
\n" +"

\n" +" Ceci est une notification automatique pour vous informer que le seuil des coûts du projet\n" +" \n" +" \n" +" a été dépassé.\n" +"

\n" +"

\n" +" Veuillez examiner le projet et prendre les mesures nécessaires.\n" +"

\n" +"
\n" +"
\n" +"

\n" +" Cordialement,\n" +"
\n" +" \n" +"

\n" +" " + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.res_config_settings_view_form_inherit +msgid "" +"" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_users__receive_project_threshold_notification +msgid "Activate notifications for projects" +msgstr "Activer les notifications pour les projets" + +#. module: project_profitability_threshold_alert +#: model:mail.template,description:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "" +"Automated notification sent to the project subscribers to inform about project Costs vs Revenues\n" +" threshold exceeding\n" +" " +msgstr "" +"Notification automatique envoyée aux abonnés du projet pour les informer du dépassement du seuil des coûts par rapport aux revenus" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de configuration" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__costs_threshold +msgid "Costs Threshold" +msgstr "Seuil des coûts" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__create_activity +msgid "Create Activity" +msgstr "Créer une activité" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__display_name +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_company__display_name +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_users__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__force_notification_send_cost_threshold +msgid "Force mail notification send" +msgstr "Forcer l'envoi d'une notification par mail" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__id +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_company__id +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_config_settings__id +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_users__id +msgid "ID" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__is_cost_exceeded_cost_threshold +msgid "Is Cost Exceeded" +msgstr "Coût est dépassé" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__is_notfication_sent_cost_threshold +msgid "Is Notfication Sent" +msgstr "Notification envoyée" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.edit_project_inherit +msgid "Manage notifications" +msgstr "Gérer les notfications" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.edit_project_inherit +msgid "Notifications" +msgstr "Notifications" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.res_config_settings_view_form_inherit +msgid "Notifications Management" +msgstr "Gestion des notifications" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,help:project_profitability_threshold_alert.field_res_users__receive_project_threshold_notification +msgid "Notify user about project costs threshold exceeding" +msgstr "Notifier l'utilisateur lorsque le seuil des coûts du projet est dépassé." + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.res_config_settings_view_form_inherit +msgid "" +"Percentage of project costs compared to project revenues that\n" +" triggers an alert. For example, a value of 50 means an alert will be sent when project costs\n" +" reach\n" +" 50% of the project revenues." +msgstr "" +"Pourcentage des coûts du projet par rapport aux revenus du projet qui\n" +" déclenche une alerte. Par exemple, une valeur de 50 signifie qu’une alerte sera envoyée lorsque les coûts du projet\n" +" atteignent\n" +" 50 % des revenus du projet." + + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_project_project +msgid "Project" +msgstr "Projet" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_company__project_costs_threshold +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_config_settings__project_costs_threshold +msgid "Project Cost vs Revenue Alert Threshold" +msgstr "Seuil d'alerte Coût du projet vs Revenus" + +#. module: project_profitability_threshold_alert +#: model:mail.template,name:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "Project: Costs threashold exceeded" +msgstr "Projet : Le seuil de coûts dépassé" + +#. module: project_profitability_threshold_alert +#: model:ir.actions.server,name:project_profitability_threshold_alert.ir_cron_project_costs_exceeded_ir_actions_server +msgid "Project: Find Costs threshold exceeded" +msgstr "Projet : Trouver les seuils des coûts dépassés " + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.edit_project_inherit +msgid "Thresholds" +msgstr "Seuils" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_res_users +msgid "User" +msgstr "Utilisateur" + +#. module: project_profitability_threshold_alert +#: model:mail.template,subject:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "{{ object.name }}: Costs Threashold Exceeded" +msgstr "{{ object.name }} : Seuil des coûts dépassé" diff --git a/project_profitability_threshold_alert/i18n/fr.pot b/project_profitability_threshold_alert/i18n/fr.pot new file mode 100644 index 0000000000..4247fc87a1 --- /dev/null +++ b/project_profitability_threshold_alert/i18n/fr.pot @@ -0,0 +1,176 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_profitability_threshold_alert +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-01-28 12:02+0000\n" +"PO-Revision-Date: 2026-01-28 12:02+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_profitability_threshold_alert +#: model:mail.template,body_html:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "" +"

Hello,

\n" +"
\n" +"

\n" +" This is an automated notification to inform you that the costs threshold for the project\n" +" \n" +" \n" +" has been exceeded.\n" +"

\n" +"

\n" +" Please review the project and take any necessary actions.\n" +"

\n" +"
\n" +"
\n" +"

\n" +" Best regards,\n" +"
\n" +" \n" +"

\n" +" " +msgstr "" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.res_config_settings_view_form_inherit +msgid "" +"" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_users__receive_project_threshold_notification +msgid "Activate notifications for projects" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:mail.template,description:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "" +"Automated notification sent to the project subscribers to inform about project Costs vs Revenues\n" +" threshold exceeding\n" +" " +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_res_company +msgid "Companies" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__costs_threshold +msgid "Costs Threshold" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__create_activity +msgid "Create Activity" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__display_name +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_company__display_name +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_config_settings__display_name +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_users__display_name +msgid "Display Name" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__force_notification_send_cost_threshold +msgid "Force mail notification send" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__id +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_company__id +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_config_settings__id +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_users__id +msgid "ID" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__is_cost_exceeded_cost_threshold +msgid "Is Cost Exceeded" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_project_project__is_notfication_sent_cost_threshold +msgid "Is Notfication Sent" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.edit_project_inherit +msgid "Manage notifications" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.edit_project_inherit +msgid "Notifications" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.res_config_settings_view_form_inherit +msgid "Notifications Management" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,help:project_profitability_threshold_alert.field_res_users__receive_project_threshold_notification +msgid "Notify user about project costs threshold exceeding" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.res_config_settings_view_form_inherit +msgid "" +"Percentage of project costs compared to project revenues that\n" +" triggers an alert. For example, a value of 50 means an alert will be sent when project costs\n" +" reach\n" +" 50% of the project revenues." +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_project_project +msgid "Project" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_company__project_costs_threshold +#: model:ir.model.fields,field_description:project_profitability_threshold_alert.field_res_config_settings__project_costs_threshold +msgid "Project Cost vs Revenue Alert Threshold" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:mail.template,name:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "Project: Costs threashold exceeded" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.actions.server,name:project_profitability_threshold_alert.ir_cron_project_costs_exceeded_ir_actions_server +msgid "Project: Find Costs threshold exceeded" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model_terms:ir.ui.view,arch_db:project_profitability_threshold_alert.edit_project_inherit +msgid "Thresholds" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:ir.model,name:project_profitability_threshold_alert.model_res_users +msgid "User" +msgstr "" + +#. module: project_profitability_threshold_alert +#: model:mail.template,subject:project_profitability_threshold_alert.project_costs_exceeded_template +msgid "{{ object.name }}: Costs Threashold Exceeded" +msgstr "" diff --git a/project_profitability_threshold_alert/models/__init__.py b/project_profitability_threshold_alert/models/__init__.py new file mode 100644 index 0000000000..6c43ef9538 --- /dev/null +++ b/project_profitability_threshold_alert/models/__init__.py @@ -0,0 +1,4 @@ +from . import project_project +from . import res_users +from . import res_config_settings +from . import res_company diff --git a/project_profitability_threshold_alert/models/project_project.py b/project_profitability_threshold_alert/models/project_project.py new file mode 100644 index 0000000000..335149eec4 --- /dev/null +++ b/project_profitability_threshold_alert/models/project_project.py @@ -0,0 +1,116 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ProjectProject(models.Model): + _inherit = "project.project" + + costs_threshold = fields.Float( + help="Percentage of project costs compared to project revenues " + "that triggers an alert", + compute="_compute_costs_threshold", + store=True, + readonly=False, + ) + is_cost_exceeded_cost_threshold = fields.Boolean( + compute="_compute_is_cost_exceeded_cost_threshold", default=False, store=True + ) + is_notfication_sent_cost_threshold = fields.Boolean(default=False) + force_notification_send_cost_threshold = fields.Boolean( + string="Force mail notification send", default=False + ) + create_activity = fields.Boolean(default=False) + + @api.depends("company_id") + def _compute_costs_threshold(self): + for project in self: + project.costs_threshold = project.company_id.project_costs_threshold + + def _cron_find_costs_threshold_exceeded(self): + projects = self.env["project.project"].search([()]) + for project in projects: + project._compute_is_cost_exceeded_cost_threshold() + if ( + project.is_cost_exceeded_cost_threshold + and not project.is_notfication_sent_cost_threshold + ): + users_to_notify = project._get_internal_users() + project._send_notifications(users_to_notify) + project._send_notifications(users_to_notify) + + if project.force_notification_send_cost_threshold: + project._post_message_to_partners(users_to_notify.partner_id) + + if project.create_activity: + project._create_activity_for_manager(project.user_id) + project.is_notfication_sent_cost_threshold = True + + def _send_notifications(self, users_to_notify): + self.message_notify( + partner_ids=users_to_notify.filtered( + lambda u: u.receive_project_threshold_notification + ).partner_id.ids, + body=f"Cost threshold exceeded for project {self.name}!", + subject="Project Cost Threshold Exceeded", + email_layout_xmlid=None, + ) + + @api.depends("costs_threshold", "company_id.project_costs_threshold") + def _compute_is_cost_exceeded_cost_threshold(self): + for project in self: + profitability_items = project._get_profitability_items(with_action=False) + + total_costs_billed = profitability_items["costs"]["total"]["billed"] + total_costs_to_bill = profitability_items["costs"]["total"]["to_bill"] + total_costs_expected = total_costs_billed + total_costs_to_bill + + total_revenues_invoiced = profitability_items["revenues"]["total"][ + "invoiced" + ] + total_revenues_to_invoice = profitability_items["revenues"]["total"][ + "to_invoice" + ] + total_revenues_expected = ( + total_revenues_invoiced + total_revenues_to_invoice + ) + + costs_threshold = ( + project.costs_threshold or project.company_id.project_costs_threshold + ) + costs_exceeded = (total_costs_expected * -1) > ( + total_revenues_expected * costs_threshold + ) + project.is_cost_exceeded_cost_threshold = costs_exceeded + + def _post_message_to_partners(self, partners): + template = ( + "project_profitability_threshold_alert.project_costs_exceeded_template" + ) + self.message_post_with_source(source_ref=template, partner_ids=partners.ids) + + def _create_activity_for_manager(self, manager): + if manager: + self.env["mail.activity"].create( + { + "res_model_id": self.env["ir.model"]._get_id("project.project"), + "res_id": self.id, + "user_id": manager.id, + "activity_type_id": self.env.ref("mail.mail_activity_data_todo").id, + "summary": "Project Cost Threshold Exceeded", + } + ) + + def _get_internal_users(self): + manager = self.user_id + internal_user_followers = self.message_partner_ids.user_ids.filtered( + lambda x: not x.share + ) + if manager and manager not in internal_user_followers: + internal_user_followers += manager + return internal_user_followers + + @api.onchange("costs_threshold") + def _reset_is_notfication_sent_cost_threshold(self): + self._origin.is_notfication_sent_cost_threshold = False diff --git a/project_profitability_threshold_alert/models/res_company.py b/project_profitability_threshold_alert/models/res_company.py new file mode 100644 index 0000000000..2951a62b6d --- /dev/null +++ b/project_profitability_threshold_alert/models/res_company.py @@ -0,0 +1,12 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + project_costs_threshold = fields.Float( + string="Project Cost vs Revenue Alert Threshold" + ) diff --git a/project_profitability_threshold_alert/models/res_config_settings.py b/project_profitability_threshold_alert/models/res_config_settings.py new file mode 100644 index 0000000000..eedb63b9d7 --- /dev/null +++ b/project_profitability_threshold_alert/models/res_config_settings.py @@ -0,0 +1,22 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + project_costs_threshold = fields.Float( + related="company_id.project_costs_threshold", readonly=False + ) + + @api.onchange("project_costs_threshold") + def _reset_is_notfication_sent_cost_threshold(self): + related_projects = self.env["project.project"].search( + [ + ("costs_threshold", "=", False), + ("is_notfication_sent_cost_threshold", "=", True), + ] + ) + related_projects.write({"is_notfication_sent_cost_threshold": False}) diff --git a/project_profitability_threshold_alert/models/res_users.py b/project_profitability_threshold_alert/models/res_users.py new file mode 100644 index 0000000000..afdaab66b7 --- /dev/null +++ b/project_profitability_threshold_alert/models/res_users.py @@ -0,0 +1,13 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + receive_project_threshold_notification = fields.Boolean( + string="Activate notifications for projects", + help="Notify user about project costs threshold exceeding", + default=True, + ) diff --git a/project_budget_threshold_alert/pyproject.toml b/project_profitability_threshold_alert/pyproject.toml similarity index 100% rename from project_budget_threshold_alert/pyproject.toml rename to project_profitability_threshold_alert/pyproject.toml diff --git a/project_profitability_threshold_alert/readme/CONFIGURE.md b/project_profitability_threshold_alert/readme/CONFIGURE.md new file mode 100644 index 0000000000..2a9ed46ac0 --- /dev/null +++ b/project_profitability_threshold_alert/readme/CONFIGURE.md @@ -0,0 +1,23 @@ +**1. Configure the default profitability threshold** +- Go to Settings > Project > Set the default threshold percentage +![screenshot.png](../static/description/screenshot.png) + +**2. Configure a project-specific threshold (optional)** +- Go to Project > Open a project > Manage notifications section > Define a specific threshold for this project. +If no value is defined, the system will automatically use the global default threshold. (see screenshot below) + +**3. Manage notification recipients** +- Define a Project Manager and followers (subscribers) for the project +These users will receive notifications when the threshold is reached. + +**4. User notification preferences** +- Go to Settings > Open a user > Configure the user’s notification preferences. +![screenshot1.png](../static/description/screenshot1.png) + +**5. Project notification preferences** + +When project costs exceed the configured percentage of revenues, the system automatically sends (via a cron) +- An email to manager and internal user followers if the Force Email Notification option is enabled from the project. +- An activity of type To-Do for the project manager if the Create Activity option is enabled from the project. + +![screenshot2.png](../static/description/screenshot2.png) diff --git a/project_profitability_threshold_alert/readme/CONTRIBUTORS.md b/project_profitability_threshold_alert/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..b8773baf79 --- /dev/null +++ b/project_profitability_threshold_alert/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Nihel GABSI (https://www.acsone.eu/) diff --git a/project_profitability_threshold_alert/readme/DESCRIPTION.md b/project_profitability_threshold_alert/readme/DESCRIPTION.md new file mode 100644 index 0000000000..64e121a975 --- /dev/null +++ b/project_profitability_threshold_alert/readme/DESCRIPTION.md @@ -0,0 +1,9 @@ +This module extends the Odoo Project application to support automatic profitability threshold alerts. +It allows companies to define a default profitability limit (for example when project costs exceed a given percentage of +revenues) and to apply it to projects that do not have a specific alert configuration. Each project can also define its +own threshold. + +When the threshold is reached or exceeded, the system sends notifications to the project manager and to internal subscribers +of the project. The notification method follows the user’s notification preferences, with an option to force the sending +of an email even if the user is configured to receive only in-app notifications. This module helps project managers anticipate +financial risks and improves internal communication around project profitability. diff --git a/project_budget_threshold_alert/static/description/icon.png b/project_profitability_threshold_alert/static/description/icon.png similarity index 100% rename from project_budget_threshold_alert/static/description/icon.png rename to project_profitability_threshold_alert/static/description/icon.png diff --git a/project_budget_threshold_alert/static/description/index.html b/project_profitability_threshold_alert/static/description/index.html similarity index 58% rename from project_budget_threshold_alert/static/description/index.html rename to project_profitability_threshold_alert/static/description/index.html index 476a2520f2..c046f4d79c 100644 --- a/project_budget_threshold_alert/static/description/index.html +++ b/project_profitability_threshold_alert/static/description/index.html @@ -366,184 +366,100 @@ Odoo Community Association -
-

Project Budget Threshold Alert

+
+

Project Profitability Threshold Alert

-

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

-

[ This file must be max 2-3 paragraphs, and is required.

-

The goal of this document is to explain quickly the features of this -module: “what” this module does and “what” it is for. ]

-

Example:

-

This module extends the functionality of … to support … and to allow -users to …

+

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

+

This module extends the Odoo Project application to support automatic +profitability threshold alerts. It allows companies to define a default +profitability limit (for example when project costs exceed a given +percentage of revenues) and to apply it to projects that do not have a +specific alert configuration. Each project can also define its own +threshold.

+

When the threshold is reached or exceeded, the system sends +notifications to the project manager and to internal subscribers of the +project. The notification method follows the user’s notification +preferences, with an option to force the sending of an email even if the +user is configured to receive only in-app notifications. This module +helps project managers anticipate financial risks and improves internal +communication around project profitability.

Table of contents

-
-

Use Cases / Context

-

[ This file is optional but strongly suggested to allow end-users to -evaluate the module’s usefulness in their context. ]

-

BUSINESS NEED: It should explain the “why” of the module:

-
    -
  • what is the business requirement that generated the need to develop -this module
  • -
  • in which context or use cases this module can be useful (practical -examples are welcome!).
  • -
-

APPROACH: It could also explain the approach to address the mentioned -need.

-

USEFUL INFORMATION: It can also inform on related modules:

-
    -
  • modules it depends on and their features
  • -
  • other modules that can work well together with this one
  • -
  • suggested setups where the module is useful (eg: multicompany, -multi-website)
  • -
-
-
-

Installation

-

[ This file must only be present if there are very specific installation -instructions, such as installing non-python dependencies. The audience -is systems administrators. ]

-

To install this module, you need to:

-
    -
  1. Do this …
  2. -
-

Configuration

-

[ This file is not always required; it should explain how to configure -the module before using it; it is aimed at users with administration -privileges.

-

Please be detailed on the path to configuration (eg: do you need to -activate developer mode?), describe step by step configurations and the -use of screenshots is strongly recommended.]

-

To configure this module, you need to:

+

Configuration

+

1. Configure the default profitability threshold

    -
  • Go to App > Menu > Menu item
  • -
  • Activate boolean… > save
  • -
  • +
  • Go to Settings > Project > Set the default threshold percentage +screenshot.png
-
-
-

Usage

-

[ This file is required and contains the instructions on “how” to -use the module for end-users.

-

If the module does not have a visible impact on the user interface, just -add the following sentence:

-
-This module does not impact the user interface.
-

If that’s not the case, please make sure that every usage step is -covered and remember that images speak more than words!]

-

To use this module, you need to:

-
    -
  • Go to App > Menu > Menu item

    -

    insert screenshot!

    -
  • -
  • In “Contact” form, add a value to field xyz > save

    -

    insert screenshot!

    -
  • -
  • The value of xyz is now displayed in the list view.

    -

    insert screenshot!

    -
  • +

    2. Configure a project-specific threshold (optional)

    +
      +
    • Go to Project > Open a project > Manage notifications section > Define +a specific threshold for this project. If no value is defined, the +system will automatically use the global default threshold. (see +screenshot below)
    -
-
-

Known issues / Roadmap

-

[ Enumerate known caveats and future potential improvements. It is -mostly intended for end-users, and can also help potential new -contributors discovering new features to implement. ]

+

3. Manage notification recipients

    -
  • +
  • Define a Project Manager and followers (subscribers) for the project +These users will receive notifications when the threshold is reached.
-
-
-

Changelog

-

[ The change log. The goal of this file is to help readers understand -changes between version. The primary audience is end users and -integrators. Purely technical changes such as code refactoring must not -be mentioned here.

-

This file may contain ONE level of section titles, underlined with the ~ -(tilde) character. Other section markers are forbidden and will likely -break the structure of the README.rst or other documents where this -fragment is included. ]

-
-

11.0.x.y.z (YYYY-MM-DD)

+

4. User notification preferences

    -
  • [BREAKING] Breaking changes come first. -(#70)
  • -
  • [ADD] New feature. (#74)
  • -
  • [FIX] Correct this. (#71)
  • +
  • Go to Settings > Open a user > Configure the user’s notification +preferences. screenshot1.png
-
-
-

11.0.x.y.z (YYYY-MM-DD)

+

5. Project notification preferences

+

When project costs exceed the configured percentage of revenues, the +system automatically sends (via a cron)

    -
  • +
  • An email to manager and internal user followers if the Force Email +Notification option is enabled from the project.
  • +
  • An activity of type To-Do for the project manager if the Create +Activity option is enabled from the project.
-
+

screenshot2.png

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Contributors

- -
-
-

Other credits

-

[ This file is optional and contains additional credits, other than -authors, contributors, and maintainers. ]

-

The development of this module has been financially supported by:

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -551,7 +467,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/project project on GitHub.

+

This module is part of the OCA/project project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/project_profitability_threshold_alert/static/description/screenshot.png b/project_profitability_threshold_alert/static/description/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f027b9fb1aa74f34f8a9e50ef26e579440612832 GIT binary patch literal 57099 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 literal 0 HcmV?d00001 diff --git a/project_profitability_threshold_alert/static/description/screenshot1.png b/project_profitability_threshold_alert/static/description/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e3cd5caf2d832096a8bd6549e887b9057ef7710 GIT binary patch literal 93793 zcmce-cTkgC*EViJiu8`sq<0XMCIX5HO*+y`6a)kmr1wM+X`%Oy1`v=g(n|zEx)kXx zbV3a!v_O(C=l9N><9VL<_viP`K!&-qhrRZ7uX?SuBlUFDC~w}rdF9F#N)2^@!IdjF zFjuZzb08%qJQ?!R*7-4zYM<7d9sJ2`&7&x{tz8&7BE1LvvqX}Oa^g-W80GDJ$W zQv5=RI%qPk6Gar$jOg;fBIvbe>tN*(#m@nc^=S1*o{QWjx&ICJ5%%~-WE9Pf`@%n( z98h19va=tgJbTOn+YZV-<}G<3&3t*VhcIjYJrYUJMERhr9X_bYUBIkb&9^v5^Wv$ z#uvH$KC@Y#uvG_^uowUQe9jMp!FR`Yr=jry%r7o{5Y6iL>*yjYfHI%*zc*o*X26y^ zoXTF%9DS#2skv}wZXd|L<;Xmu+dK3xX|&WRfsk#XVt=~vJd|fb|3F5PH!U{#@=u8= zet3@Qp__+Nwn3dq7Rv6lgjFg3KdV?bg6kK$tX$i6xl=OkN$hfCgwAjMd4{mf;_1n^ z-+}J^-F8;q+7&{5W zr-2|(u=R+gnkI?;gQC3ul#gP?F4UH}!b;AkHT+b@Iud;FP60mk!4-aCeSRTJqe99R z`u9g?!2c{grBA^UR#rFN;Yk1c%l~hgK_3|l{_1fIh2{Ngqs{MnX!?K2#?BH2{?~(o z>rY1hy}9ReK@8a+#|e$6q5vxY`G96L_!Cm#Uwc2e`yaxnlZ5?W5@vu?1&umeq%VWK zrrgW(kafxRRkWwfh!r_1x+}nCvYJxcv(}h2+rz6hlrfdu|Mlto=ZDTAD-Lxl8|c?- zGG_Gpx$;+kOLf~i{cMntVzP70SNvtySXj&^P48pnL6U3sm5$T(Tpd5o{l^L8fB!-m zqd74LcP32A+qLN{JQ79*dZ9irc;Tw6Hk!P*QuR`i&qMTQQR;KgzPnnQtZ(idAK!us zZQ5GC1Y2ZeKe(B+lh&uDCDcCtL!$d0b!BHeClwOz{>L6P?&fD!QMfddw(lj_-|>dr z=QWy=@<9};yo_8T{MQ}zy(x4>J37COq^B;qd_i!Xw=!b=dn*UW%G^xxXEm5gjz3>g zwmaAahR?D(ZrFg}m$*M>B(b81@GrH7Xb;N1s)?KfKilbiuj*`9k5UJ`ioeyaIht=M zDeRYCwx5wGIRQi~@WM-bT*b;Yz;D(;lFY{-a5-L>?hoDR5nA!#!6=`jye&-(mbgC= zHgM&GKS2kGpBLH1q~%<~;vi1zats0#DlL3eOI)-Oq%o>5Ux_C27$oV16Afa_a}%%BR712)~Hwnz8#m5pgf*% zO?#|A85!r=1S&5!;p|>C&CjOjl_+S7_6UJAwUjZ?k80|%fq7~u@n&l?EfI8Y zu(A(pAX$?4pbxm87qOZbe_y5dt=5o4SFVK5HXOF<`L^NevBLI|UwQZkgq{7D z2O=ZtdAXDx(i%f4M_yD{g#tP_GD1d#e(2>&au|+w*TrAjIras_`wRUPo}`W(Qq!=Z z<)2ckOW$Em1OX%tE#l%Ye^{)Z^t+BhfW0LJpNNmX291;$3V7bEcyxSAsGC(^0TK0U zS>F5b@krtW>{TkN$ro;IaVxdiZ@NRo;5_VY^|u*ix}CRQTfBP%&rehR+q=3yKn}z3 zYbg>9>d06oqf97b%`>R|zNIu$>KTP_8bo&}hZl%Njx7o52m^w}n5QQ^3xEPVLZe~6 z(Bi7d$DXDP+)sFDIBXm>0k0a|&5~Pm*yuT3fHr`K2C&3<4qG+v*AEU?YV^|M!>I zZ1b~|{WQB+pd+TxU;@g4o14-q0Pwau#Xc$P3TxQso$4@5p3I7tdkV{5jk_5G^nJ^# za&1tZwEhLahW7Jks3TaiUHSI!(eA!zZI0M$&UJy6A=>R#VZi*m;zb(h(nLhFBX})H z(?#ffysXq;6>o&i8IEWgPw64s57vFh&RDwrt3_j{bzG2|=2{L6A8kJ=oP72`spy^& zTGpjp#V?98Fi=}C(;^0Q?|A2rXyo~P1cK~-pDz8f2`Yyo)$eNS83-vcNGCTFFKD9K zvHh)iSG0uY{9sxgs*~Vu9f64$CQX0;gNBJAD*oehA`)V*9)^fV4q8|F`L1TBXI79K z#8OgG7`rfs3@_^WDW}rh>v+-?@+j1jqRQNchLg7FVJ>B_ex$k)hr&G>cE1BNmh5;a zSLFMhG90zK`cKDV!z9+HKu-!>nNbuFuQK^WUlNWUHBK;&8>dg&z7^nvuS(0Xxe8_S>p~d^5n}>Uf8&MjJ!;u;-z{`-&giiYn z)cPGEC_Z?8MYkZ~75eXoU&mCw?k@U7oMK-DFab6-Ph|Xv`TC$}=~=&i6fU+sLmWdr zX*X6|8beBHcBHZZ?%8eOzS;pdovb zet4D|{}%88$gS$9WDI3ISUOOTR@ck5O|&HKiO>MnNndYtGyAFrzoW$b{*9mDw>4S2 zc=wD3aanN-c^Sh-?FR<=1_^8#(V?VVM{lY!S5l^E1e#9m*xV74T@w5kKvEJIVf5$7fy4zb-@jQ`|AEq?q*^|av*r&0lk&$n|vZ@ z(6o2Hiz97d_O;RbUh|Q#+YCK4vQNdeH)i%%q|?gw>wj@u0D(PlcG z-;4Lzy^vyB^Hl>F#Ws{j$eT7=smqCS!DIvt__=vCRmX^dVX6vrOg!|A zOdaGC31zj%8F0Dp-yp(|^PD5M@VKp~-jJ)S;+K3aG z)p^BN{p8WF07KW=)=#vvd%qmb<&a~1Bv7BNIDJRJ{HQ_tYBgBUtZA^eY2&%rde;LK z6o#O5h)254g?*U*)g3SSDX_IUCD(gZiy3<}#)1h}T;v;@^CDw`irnd+Xey9EC4}(_ z+>eCHDI4-UIP20Kah2e93IIs!S_jtc3{X?vOmIgie+NYxj%BeKfFw|@kqlTHe}sHH zCj*iJ8~jPL!@NKPO%nbzV~^%UUlUgNJnkl~yOOb{zoZc-kN?r&K?Egzib||TV6|k$ zc;ccKjNxq1@I00mP$1|Q5g0zEo1*+-%ykc8QgpgPbL%z_Gess5{BW*oJ6;<2ITaO0 zgI{X54c*&doV^T3`Y>Wt4=fK$r>!qO;Yw$z z?tkU$>D4Ww=~Mp15x;(sNKTR!clztm2#VGr7U?==O4e_dIRuK-U0Pnj zEBR@X(EO3evquuZnN*%|a|#HZW0qEg1%R|r4rae;93nqVoAvYX*3$e|d9-cUD!lXI zY!b9!K2`#$%~RI%JSQQR?FZ-VQ+w$kOAWCqWu^3(*v&x66wdrkuFJw5YG{%p*To>2 zRO}Xe_)Z%8g;Z>B(3{TVWnal!iO&~nt8IsJHVKdWu+Pa=-v4-67(ZqEi1AVtdS~kv zl?sx)7Xf($L8B0$KCsYb${G14ilA|WTIt_bE!5l|SLP za^=Fe^`%GaKcw$^rruy=jdS<{r>(7b`b8Cg@Z>yfrBOnF0n70=ECRgivni@tQ%A7qDflKyfkk*-kh+k$WL@ViRQdRs~ zI&hiYP5fp=ghr5?*0c0@O!co4?5j``wFhf$#q0WOZTY#~uR;i?lL_5f&P0Nna8PM0n02ICPLG*7Sgth~U-MF^8}wkmOAow{fF zfzD`8ri+;`F7J^SIS@{geG3M6+rBn6n^olc7~QZfpc8GuQYZ>=q;&sV!Pwnh!afA^V7tVqSZjB8e_ z-dVJak5tJ?zm9gxuT^@Vl6*154UU3#mwb94Z+zgwcpf`8Y2`uM<%NXQH0V7dQJqf` zdulp6{R{Z2&kI4-G+dx>_so!lG*9{XwcF~=7OteYHMc`MR74tJb#g^ zGJ?A55P~#O!aIu%BG}zjBc_t&8_sJiTJjY+bxHmxIMtg+xq$dGuHROjn9Tu3DLeNl zIP4=Ep~fSGa?(gz8M7fCqHo@YR$Nsd-ZI-*sJn2rW;wa5u!mTZx^Ybso^e~x`x;Bs zD?;PfsoW}*1HLmLk%z9iCzE5Ba=&d3+HZM10Z9f`ij&?~>j~&aaY@Clut|XcITOrY z52>nAzDk&lUB75v2po*f9EIntNWt5{Rl=x);f6ph4MrHkDro3H1I%^S%}HeV1cF2^}Wf(fiKH%El`ioR`vMQfbrBXFv(n8SJjZ~%8{Fzt)f%vGZ=3dkuqpwW5Uc2!o4e)`7HQ@ zbKNKFZ0+S>f}6JppP?+RI{W2UoNgVJ7}&g0baVC_=h_nSYYR9_ zis93EdS@r4g-L3rHNA20+{-+P$-La+mYx&c{pPIUJIt_4 z01zTFqK%bRv)~*HWO{eo>+zl8M#06*b=xfN4{gH7>6Z2T9bua0P~a*2tQ3E6o{|*;F;bICX7+pA>!QlZb5<+siVWG{5m0?Wj~{XP;n~wHPPm)e(P?Q?<2C8r zz?}PIuIBH!ch`Tpj5ZeK9UWNEVi&-v*r!##{W4|EwWR!B`b8;cF_v>%8+(z+Nsbl$ zKv6-fXS01i@Bhx!SI<5omD_v7aV=6>eQfVPMZS+`aC~B_C#a=EwwpfZ(}$(uIxRQY z5m22@pi2tA?<`}GGF5KYhuG{}6N(_$O}09L?Wt;YDez;uR+~##l``B?@B&O&Y%>(+ zJxER&`wI0`wr-pePo>|=CBLP^p2FAGip%5L_dsg8G9e9-J_LW;q99nx8%LMl0P0SZ=L)v5%n)e>hYQbT2L z@7x$R4L33z*SsaIw4d~QaZNC9D|?HI=Gq+fnzQHW3&C&&1sCN7w+omj`DOO+38&7G z-~(r4ed~+F#LqPxFMpl9mxdFq*^EA%{nD%pVwm5s=UVZE;@;0zJ(}P6q)TS(xSc{Z zX*=$#yy3k6WYg*WP!Hv?v+#4rYSK|Nov$0w;zkRnbPR=psOI2zr_azA=z8H(qu84p zKE)~vMJ0~y-=$+w+P~D-4vIwbut@HW)6eHD{n1YKqu2%j{4j^cA&a56yX?_<0p02p zdT4~2?o*{Ur+e7#ImUTsLz4x3}_T1KNZqb#bWw{ zKAt5dYHaHDOF}xBWEwG7z|~{O4Q5UwTgqe0;TO2*vaehEq)$re9fA9JN0Jd?;2S{K zdf!#Ve-r#Q9}-Brd&FF6!FlZED2o`^Jt$2CMS=NRB{nJHNGbte z>qBUS1~}glm&A>cwi)5&Eo{)6orTmf9?8^yreUq#b*aq-@?`iJa}_~XlpYjG+-Is> zhyqtCU|9779CT_JjI5uY8=U?giV4^r`3SjYE}5+md9>V#kdA*-C7e zpu6$oUer4BgNw7%Z5fkKU-hiC_Vv*9UlA%R6;97Szq$c-F#Rb3h*`P~ zwO%`d(qxeMYc-fr6C)=Pm$R|+deXxk2w6Gl>d|+$eUPEoHWPEjm6Cd`YW1z+gtn}7 zuStChu+P~%z9Q+ItE{N6YF6eD?Bw2M_mivik2f)!$#s z)Mr*z-AxM(3u^+v^@b;G+7Cood~ah{Sbz{#uS}4|G|%Vr+N4YE5V(V`8)_SGYLrWk{;v9Tjep}Paa>(o!aO{FYRj{E$wMv%26|YpR1UZ1 z>TtdfWt?b~uE?uN&B?Tetla~(Jc>#pBe!?eY5T#);gLx&oCn`UN#^@ta zy^`jccx>(0sy{$v(?bW`8tGORFDEja@C1aZK6=eBB9kW_9?J9cwHGPQw0zM=3q{^o z`FYqH_Oc**Z|JGGim}brQF{01^>%mUf5j3xb1&Ph(6X{Z)6-c1YHIxeAh1#U<;#~) z003~G@8LsBRZ*s5IXW&aYD zb)$6~aJfl`ow=v{;D>){vm#M4kL=KUqw;#km7p@vNQ+u1;;hcDzMvHdKg-Vi^=u!g zVG%(7N~U)2rHu9dK43Y(J(_8kgLO~j>)-64N=rBl@gqXp2gr%L-?+vJFS3%jHwL4PHDc#aHSlZ9$~&yYJ&u62qfcMGN=} zdHA>(HOPbrRvtQN|6Xh%?Ck99b7y2{S8c?&(;M3AM;}#18D24ye}fX|ic-B|CYu97 z>>oRiNN|6v{rIsD+`4K~bbbs2Nt_3qZpBP}6r`wL?;G?1TIo8H_bSuTC$=zSZRxEF z+w^DB2q~sv$~m!Ajde}0%MjhO-7%}yrZKY%+dF=&()1%%(V_K=yiquIXx0fSatzM4 zZJyFpzL>%mR+dvDeB#CC%DdK8(9m>cDQRW;TT?MAqr!NaMa(>#f249gbP`$XG(s@y zwQ*PfxlnH|z`0ICfSCV`71|m9##2?t`B*cAc<`2}OPg!1dZ2EsWBY=a;N+W7?Z06i zE%wOv5}vz) zUMx3vp2WLK0Iav}tQM^C^yfmg0%S&aGt_H}e&i-bB{L`(BpSX%~6*V%Z_$&JuI^{ zSd&vCN5JmuT7xd?HF4}#EQZy{yDt8mz(3uc6^fx`x;i{%Ak1ol&we<9s4Agj@`LY{ zK6}_9B2OWNF^MrLY`Kw=<%ufsK3Hv7cD~cA8;6|Kbj-V~lbs&lySO6^rQoacjs38N zyP*ob?IK48gS#a7*F7b;q1R8)&O^@+#M*`5qe=wm5J|S?!+QB<&)@p2Q~VvdB2Ec- z(^MbqHK6HUb{25+-kp-~;{4FCPgKxZ&<`fmw?|1(J7#!(93(Vx$=w}(r`EJrZ?%Z( zv9%NJ;V3bWZ22QiTsGSBWzohR5k=OFO*2iY_=Mb8&xCLH3*>pgleltzY3W)a@8(vZ zK{oW-R>-?1!H?oZ-|AQvH#4r~ic+xTNH6MKmL7s6Fyq?b`AD$WJ?q*c5GnqtKPcpC z5Xqe?IN4*Y*4^V{wMU5Hsx11uQsBG%g~<&O1eD8HIoUx4gc|G4%%x!CKIuih!8CnK;*V=@)}Zank*eyP zpkE9lmDs&ASZ7kq^V%Ss)to0vcH+gS2j`H~!<@k1i!3|@JyyV=vYaB-wm<&m0%d+eX?E56CF!_ZWW%@u;#zI8$jOPFS!F}fsGjz z$Q5Q7{0=bE>Sb}+dM~q$vQeYb8@-yjp&rA;QeHKFg?knnsrNE^`rK777c`}SQc^Fa z0An|cM!ecszQplbHqXN|zE$Jl$^bp=X)k@ZiyJ=WNgQuG*I zFL$qT!$1ZKxjTPy?GxLc=hn5S#Agt@sWY2~OS>xtRbiLR}C1XvFR>dSIbCD_f=`GYHRknIE zDsJ0@#v#5K1rjjbm}meCM1MpU{lo03HxnozeigLt0Gn9A`Hv^u1RD1JSp+XHu!w6s zlMe_96Qj-`JMYnY2IgNA?tQH4E;DKy`4gF!&mGR2u7dj)}b&&qWUjm8+7)qwL29 zrFj_H5Ln(HV-dSIf$+znt9hx0QOgDG5fm{1fI5SXm<%sqI)N>V3kWf{lo@>^udb_? zSbUk2TmonmmuD{#a#XJ+*RSBMT_bMXgY|jssy1&Cx426_g5UWF#T`ZuXfc<#@}9=X zoJeP`PoAD_D_qWNfN6aa@c;l^KS=j?Sc}seUDSfX;l(L?M8U9J<5gG3LsI5XuE{6y zm%HK^Rwum@m(}SahEj9-y1$~9Mfo$@gC~BawZbt|-bM35c?v(kMUOd~1z`BMK}YBY znv-1by8NrsHRJbgK4`x`Z`Gy8>MImJ%YYpoUqB1Bf62k{v~-b=fRL9Iltr70kIx78 zjFl&K_OqI(D6QKnZSX`%7);9PH&r~7qwKEH!jIAJ`4$c_2J9b9sH2G>=D0U2B;&^K zyZmp64DtX{01w@Q&RDnA1`y#i31FT4H9?MbzIE6^3zsl zB7LQ2w!hUIUK|1o0-5Qo@44lDwqSW>en$`3X1LB88H8PJGu~q*1N(R>`uDny4WUX_ zU7w<%NCC|Jn@$m4ICA}Td!8hcYvS{u&#?+ZaF_3V)(VX(R|QrX(h(=u3n^KUZuMxI zJf00v9TV$wiyGCb8jz+dWArQM ziZE>=2ds@#wWSLpY^Z#UwS}v+f929tpx-z1Mq8CG)%P0{OeD_LcYyPvCXLkjlaox# z0Yz;^VaLFj;?~~_X#WStq8%M#7+X(0wBbK9KLu8wkg`3Des+RYYj=c2Z!Wd#S4BDE z2z^V9k-XTK&bJd+Qg{U+0y8NEcjSAgL3zm$okVKUU*4dTP)=jpV^d>-_4KDpE^Y+f z8n$`yh}mb7fK>V7qz7!!R@VKhyieA#cVTNs`&lpVe4}>xp;BwFUQk2E=VP4zYu_uFP?d@Q!AH-~5}d#N zs%{D`>;6oB;tMLb*WaBf>)V+!LOYQ!d4Cq%8TrDib3UK?Qt-I&N}LDje%)%l{1kbNNYWK(>cYJl_=&R035mL z`X$@#r@;3pmC2}11aquoM-$|$GO?LV!hz7zIVkAB?BsPD zCmiiQVDXh|){`1h^|U{Wj%*TaV zs+79aynv#blv4qaAH@Dy&rpSp6Pdd~SruA;Na|mmA8J92H0}JQ$!glCyIh>rOd1ksMib6jQU2rnXr`GSw#aeg@xfT&?h%FM$N1(>$%SE zLE@U2;Y{f&%or6TaAlhLpGua)21-xO!Q@G_%uB>2O>scZ{7%K;E?u7`>~fDa;h$vzqTk&f;5^H1wX3IUW}|rtplhduHQqz_VtW9ARNde zD#y0Or5_>H&CNd-H6w@yGD_)O3me&x? zh|FA!lVc}3+ra)HWdg8gT@3ICy%LzSad9vR1oGUSVN{gZ3qJe!Dmt1oG*T#6`!GP{ z-0DM{Tj(l$>;YjGk?)@u9~$o+4pT-{pYIKXIHsrGyZV95uPW4(hUxWVfa!f$M?Nk4 zt@r7I-J#8O{AxM=CbAhug>}|@&RwQ# zV{l+aGn!!uA~shvY(ag26$qDG(%FH&5;z@?;;5dksDr{S>RlQZJH(NrYuuK;`pjp? zTkk^`O$n`n*wL428-KY^kFO8T*;5qX|A$l*1ULOxo4AaR_*1*h)_n9^XnwBhZtJA0 zRH@DZl+3$zakAep|5echfnlZnSo`6MG^Xoa9TPFSn?M1!j07PeCa$Fr@RsvrRFKzu zE6GL)ZX$Rwa&x>!z~9qHXWwTtq=MP&@enjgmv@=~ z>y5pg^INTBz+8_wv9NbVjXS6>XafyC-J35QKuwg31pZRy zglt`!ptr}_KSU-7YQ(8Mf+(Z6M#v?DmspbSjsdr}S7KIuQqK35h5!34;sW(&?@=0l z?au$6%2RYm$o|tuWwY3`dbebA$Gr~-DhYg;aFGj;z!MOY{BDJ=|BaYHKET>JeH$_% z4U#5=_C9PbL8_FCwl>YCB^Xq^!*An!vC<*$J-I{!&8-nG)4P6mty{cqR&eH!dn{gA zlWC=4eAO;!kpP{Vv=4;UeC>X;we7*3boqxNa)rhlc5zyxK?$I+sK;x9gDf!vQ}>C8 zGVjCSeqRU_`1qjxhgBbwrz_$%U*~g3m6Kp8hqonfe($c-#Q}pMWV~C=&__TwN zP`u8o{73vJf6zQ(@nxdH(4ss?G2KmXPwXLS;KIRTrP z%oZJ~WJWCjBsPxq?OG#7>{PiyB50$M%JLPrXNQ&)2$%Wca%U6yM#NeNxf||$W94Dq z(W1wKAJV=3oD{ts`AK8x>|*t??{-E1L05jt8MsUPY-h>Y?P660@FBARNqtP+QPprQ znjWU?*Xfw{pSWEG!VS@BQ_vUCh#%jtKthQW0PqLnl{o}6pFg&bA`mb})0ND}0^GaD zHVam0cWX|giS7Kf(>>lcOmp#~zO%1oXIrI2(}OM?(5mU<(=>9or4P*N?T{1sjm0u$ zpPzZS(OdIPmhZCDY32--h_X-_!L1@L9rd~c?Z4D2e@q(H=%4m@HPi$O+6+E!Xi(E7 zqQ3u0P=>^o9$JXxgkqY1MzCh_O13m(1U{j=HP)5bq*bNx8Np2PQfqD6wWFut3?<^0FqlDm| zI$Q#K&-)M~SA!&l1gP+BEi9Gdg57mMlYSwbRlog8somt$5%|UdYjR$Ssc#o)r&=g1 z{O~g5x>irzulNoyi~;*Yr}V#!8Alileo5#?Q)sY-zVcwWrgc>t24Xcj46vA7i9t^4 zZaVY96+Ts_9F<1~1fl5=>Z{v!U}qJO)+V%=pq*1FZh?~=!wcqYYEDj0`C9xWL0bHg zGNcQE!J!Eqi7`i{M5GQU~P2UE)-b_ zxg-v({zgY_Y#Fus>Yl&Vs9F?mr}$a41`9WkFgjOcc$n77goHQ!5lm=C_w>*k0`7#Asv~@|_Y(E?Y3Gs@+oL_Rr`2L5%M1 z_*nrL0CvS=f9cW2S};%G4u}l z9usEObW;Bde1az((36@Ufo+k6YrvN^PGYk%A?RDini2<}JlvG9qxrVkq zC`7p!z)L^~p_30|X^o55%(^|=Z)~hw9tFMK^V?Xigj}%x!W@D2A$UaIeo+lhln-JG zw`NJ8i=5?OwVfYKs@iRLE|@~#$1KMr@>b%{B64|SEgYwzT)TX1mYeY1JlGMNSiJJwQ!r9rrc6c&4&^1^(7BS5yA$ZyVMH6Y28U)o|Gm-TLAyG6-LIOf z;p^R73i)YC9Cz8(R6l)o`cR1kq%6rCV7w6J znrrrsQ)UhtBrzXX>th1DBSs6xVuVoj%5;Oq(Geo?^Ovv=HHi}fi53@iWPSKYDN4{e zog0L+QH_9-`)?n(*q%@qM>2XTEc zGvuNqYfr}Lq#-J(bx}6)!oS4zer;t6#=N?+a)}m;QQ7OK^vqGb*vR$a_@&e>SuN3Y z0t8480XHtb!za6{K2SVzvyro>s9wo4B(?>vnYPp|N(G*M7oD!gdyP|mb--_bnKsym zG!7(GX4^m}S3If$&STCny;=JBvGTK%&GV_|lf0?Z<)Eq4LvA+TUD}-hJ2II$2v5}4 z9i;N}cY*Mg4jaAKgRV7M2#a2nh8K*kdqR*tAp^?P*r169B#LpVI1#KIUI{q^m z#48FRbare2mu@6rfv7FDbply*^I(pFp;N9~)6DW4Z0F7C6DapKYJZ>YkdI1=@ibCb zp3sY>8)ZiYNU%oLdI&6GAs{{x-!>~Hl7PGxjgvj7P!QK~*V^7HF1N^~OSTmCeL))k zy=?>a_(%WgO1DYc;`i;RBl{RBHs2M=o%seLR?e1NU5$<`NR)(fDRNklB66^6is%%E zVC_XYO28BT%T@`F5+8N>*C>7W{wlYrm?U9fVX<@DU+d~V^}gC$y*qR;QI@QE1zb24CiluxO<9<32D$9U`Y(Q_{?nkqug-6ciFjc08xKvzXOst z(b-ui-8?xqZBMX!g2evC#jK6U(dcb$v*}!DS!E-z~ z9^iM`F3%yjFl8?sE6)3*@v8@Zxx#7@qM>X0{(@`hc8J@p>ISD`_9Fr2#gWpdRk(Ex z-<4mRQ~r3PL+RbXu|~f=+g~n0+HIo|*m>Q7u1OJ>pSdaZAHm~qzNT(86EyO48~-7U z@^tAtgrh^(RrJS@tC-r#I^&t&k>(}(*G)G6ZL-U=pSDx@8H4*RCxUIWXEY1u{v@i* z_6p1n*Jx>P$F^6Sea(Z+k*R~#1n>vC|7om@1TSUR;G`%2voP&DM^5zB>+Du20XieJ zh01$LCFL7g%)dHwzpy3`q|)yp9=g%DS$L73C@OF&mt6>eeV1JB3r^SLKxgZX5S#9# z`cLb@nq^JLQgdEig$*t{cakY}p17H_jg~J}nTOEW-+mX2y?m>IvPRDLOO8tr!D%iG zwm@S>H-p}cIptPpHhHy@&IdJjRI2$9ogIgC!6lZTkZ|97z`|pgudgIWR-`{ktYiiF?i&1=q??=fp0`?bYu`qmpJaq`?`Q{u&ZOmB42e`?3n44tAxtYpvZ=6x^0l+$`INI-@07&xv$a;Ev-A0)0;F;= zGj^PMsdbI~?k72FF0OV`ikl(w_bF~v-(pG98&mm9ZFLJO!vEm7LuuTF&woI{X7h%3 zDU+nS@62Wf2VcdBFE7kS)LaEP1ipQKN9xVU)Z2^uV~XaR#U*BL6Vad z@Rkc+aFFYb*s+T5OFntuhg?Ow>LqZjv#E&SNn8-SG2#I`wBlCy>}Mw1iNeP8hf}c$ z88Qshwh3u8!O^DocJ#T_DX3Ljriq+iy}QhKP6luX+}TNJ?}?y#TrnQqPPW97a63jr zUS>d4=f|9zUqex#V5-%Ti`Ur~yY#Zl7mOa&K3&>}r;4{r z@P+A9X*PJ(9e>LRY*w{H*F&=|9{v-!ABHOMVgPY4@9~$i?sedpnU}-UP-#gQ;nola zW%zMJ@Xc?wMVJ}-lxU(tPurK5^szy>n^jiwdsrhm z%!$);~(qfee*-$b!THjEL zZ1QqO7XOQRF}vb6+uIA6$&|B2oY~pS-rC}T0)v|usN5DZO5OQr&b+o87b$tmD8>Gb z=RPS@4^N2$8(+(`y;Ysq?}_nn?U?M(`Hc}-e-U>WNKjLniy@qqOF^?wj;#{}9~N-% z+cF&B5+f*v}<=#m|v)=eOwmjkl}$wQ`qB=9hKjT<4Gr)V=a3999MG8c52i zjFr%0H41$Tz4f@gos^OisH1gTb^4~Hc=eP>FM=cI67$bw9Rbwdb!tLm+A`N9EaBu6 zDK%MI;sOG}$=}*=%5C$+nqZ}SwoA2kXXpezH-`uhahXr&(N3QLJ2%VCIIWBee zL2pAHvC`yKr;Q40oj9d6dFd8UPVig}P%2%H*kWA22q5S@8@hpOMd5 zZnO~RC3muUBv-crR8!Iin}{nP;%W@g_;2SzY;-XE8!k-gaFye&6F9+tA{vOiocFpI zZK1TcXk(vqVSaSPGbTkPp0&HfAkokPS)G9Y&4vCN5KIp_*yK}>u4-p^?nE-;+VP!` z=~Y4?1G!36_#oV4w$cDHwfe?{OQ&Ze_%;5;ZJ&3pPQk9uZaZ10Z#{?X*`|;AW5-&< ze&n@;g6b=Pw!4O3G3!Ozaf`zuP`Aaki?xjF%B0icGWCq~$1o|ih%*O#EGjo6&NZ*? z$;m3D2IC!Av*kSoedxt{5+R3AorJD*dg6W`v5zajOz@2gcJ*xx7#jn8SAbnNF3!dr z^z1-z=t*|%@L65)idpav3*)7T_zR1?l%xxrgq10o@VRb*ZMWCmDmbc ze&pm&RKKzFEEB)Tep3t`meslNI^2Hp_e2a~ra*u-3KysrG(@-}m!7D|LAVx2N<|Td zC!07WB7WeH!D3FHIBIZNTlvYx2A#mNpZg?SU?Oot-(Yw}AxzfcJk#1&u~-cV7uLtA z0GBA&V(pa)Kw!GzK88ZMe|~kc@ILqO%hRFM;imd7D4 zz9;=5)+Fsuqn%;@9}@Bhx~2CoN@j_RiP;VHrV{{{6M3YCb|~auo(3Mheb%$L%T1h! z$U&yL_--^Y#t6;U{2Z>89w{vehFKh zBv?{?J;#qqS24n`c$b89-13GjN4sto$Io^X&W<>|A1R5o1$O|N`i(z>a%&rd^5ny? zJVaR{Jw|06Z{AD?AFt?G!Yjq_a6W|Qb1Df4ptJ1S2!!5xv|RoYvS?^!n8bO1=?E%` zZ|c{3D9Ac7#S)q!MsQe3%K7=Q_!N6J;Pk7qphc#@<3paawfPjP5eWqhX9D4#HzoA$ z#@A}~uU+y0NW-m?5e=5xX&b>v=0t=M0kW1v2*5KISNil%9or>z5co|5GYH-1VNB&VWUU z&?@I7VZRV==0b+-!;y$%rdYCReAjm0knG#nr>t^K7hY`B2U1k6c(%3@KRN|#%aAui z^KrY*sO}93@t^fsU-o}D>n_!o4=wkc)W!x8Df#~7Iz&Kz>Ng${yy`GB!BV}|RJAr( zTZn!1xBa(do%KY|?lVgO!#1^8ENI`(A>K!TWYqZ*t&%~hsEzkQmzmC5Bol@v~ zJaR6FUUz3JE=h!eUjMw9e@eYPkx{7rROiv#S1h8mOjEXWlJ~{yDMug#m5M-GQpEKo z{8@{~ClQAF@4?zO`mTlVaAw{om3*P^&JB{-Z;gS|89u+`0=E}#^F5YaJff6q3bHz4 zXpzx|;q3@G9M$E2*=RmxPka5hhSX`@w#Lt|`WG-1TU=(h@=dBPX+|=W)%t8)Q+0RRn z2X>VCUlqusk;=a=Vx=d`GnI_=5-ySE>Y2dPx0o4~2wZ^e&sDmXqn-al)_X_8-9}x* zi0HldUL%Z7h)xhhMD#Mc2r@*kBYG!9ixvclUZO=AMvX2+4Wdu9(T8DX-nrlPt@pX_ z=UeOd$NW22IcJ}J_SqNY9iZA-C2XY>BV#rL61rUBLE9Z<1t@}7g9K4CHU)#plqt)H8C){0?|IV`-`ZGnE2J%K21 zw%^~MkObEYAjo;9aIT${!jWF&%Ap(F;~y0m{tD~HHxF@fD^qwkN=$wYml#}sc;n2& z-lW1OtxtmS?k8zDD_*c4_CYwTi%>cOFE!fX$g$_Sg{kS{Qaq(R=`@+~JZ+_zIbF0d z4-$+bzU{dt=?p-{_iJC66*;i5K8IA}rXa`u?T#TxpBOI3>@k*QgSvM|*iIB`$jb*= z{Lr?*A0}QQPwCFtaqs$d86B#$+7>W??N3`SVGKl5kAf(*W419@O45g+_uv@U`@2&e zPe;SJM+gb$$NPaXX2qjC=pah%i zhE2|j^=B~WmGzFlF0*p8tYVp853NPztYM76Fkx(~xB20T0WjWE@HO&aq2%#T%6W@l zujFeW8UG5=rPyX^ahGI=1jzd>x5M}hOr-&m)QgaQaUs(2*$}wxTJdKCY)v}Xy`7tZ z6<&a65@9(_VA9ltgmCUV2pEeSn;9tAeMp~B2& zb7qt}>yi2iAwI!avHIEYfF`e$46~X3!@kiNxedXYS#V@2Fva}0{5L=Ho)D1CRaXlh z5Q3KP33V3s_b`v7To8lqnvkCEI|ewcmRg+-*vS3qv#KAm!6vRC`b_WDZ;kB^P@NB{ z4+p-KJ{}k2Od_WoAM9J;=u5o6V0Snj8Xavx#m<`IZgAmV<+bX5WoJSydE`z)Ly;Ht$`3r zQUOR*U)ekJx1BNHfvNtlxDIE`%wZ7Pd0oE+hhFxbPM}fy{ zj{?!_a@bN5(_6B@F^G(jv)li|P1LN(^(4qf{eto}H_|X|TZOq4b5dv4@apq}8C}hA zQ>-Yc*NF>m@(!*W85OlNl|D_S&t?)mWowZLEXbezUJIW|41d%O;KRh7?KOhdha1B< zH!G2rT{hi#nZwySUjf0_T9>K0%Z$c%-ligwFO0=~pHqkxKW1qIg70UqhVk0kq5&S@ zAmJV`-0kk_2WjtQO0U>Xqd!VJX#Dk`^PGan^$80?LGIUCGc##L{qHG@`!{N*Hrfyi ze{w{p{_G)4w<;$LH>MRuyibkIbgsXLzMN($;-o-)F88G5i*mB z=EBHKaUt7ybZMr*jrP#Cz2>)SY+KRXsTDh!s?LVq^?S%-8p|AWelkE>ycO}}3+LLU zLbd@FDNb`k%`Sd0l2Y!|ZqM7rsIZxvn#mKHy-&Vqg}J}mVO#SLUZ%G8Z?7;HD%|#d zco9vL4+#CJ3Fh6Of2bPN_*S2j(|3Q4xbSg>d^+LLo5F~t?i?7O!Qf4^K0 z-6NOzl6)Bx7GCS0YjLx7Wa@|JU)Vge+H*F_tJ`>6CKX&_UILPuYsVAlBv_520mVe z3Om47w&J3Qy`0GKErpk$It|pC!b`x{i0(AXhYPP|hgMri%5e)fSgj&QJF6RB4>~-| zHNkVAdNzR-Dc+kmkm(a_#WP`bH)^Y2fdGO=FiX$NCZX?vM29Ks zRbs>Hl@sBzVts7@rTF^!wWRX4ms~1}-MSZ)iBnLa13TvKMHQ0_$f_3j=&dl))ud+l z&0ci(;US|j`o#q>_IBRQJtVw;>K3ff$5Q;nBOeq8^5B2X!UkSgdmU5XQED-+nC5P@ zx>i>1a?< zPGg6ci^{_c2NR|a^V@mT^K-j+z)S;|>PO=G+s$8k%v^rAH!?}QrE_7@@6&Q6oU6P^ zpuZ@lLm7pYLL>-ZjnHQh1{o_?HSxS>+lac}EBZ1{q3s^@_`7>XjOQ#DXgs2eoBa$) zH?oAN-i$D7OwZBMFl7S!F1%#Fk@J)jYPwCjs67E9T_qQr$XJEHZ zj`D3xiMfZeG1g5h5y|NhQnt3X_i)RqD*`%y(PEx;; z7?JAmi63~K+;XKGXPpsQw6A&blK)esBt?@MfE!FNawtL|1m@OUbhY4nP9xSzh>X&N z2qEa{@1XAU&@X}joYf9o*eG@BmtEIVh{%@2TIJ1#O%>p?urf^lOg#h|_N}`sE}QZA zRbtn>T_QP68x_1bnRV|O70;h9$3J>R#so8%b2%lTJ;d&EP?H%LGe#6l-FW<7`?&G@ z+oS?-#COF>VUb%ipqjoL;YXSn&%I{9)b?HA&HW}|qGW*kt2^U+rg34^W^2j2oAT|o zKO;Uiz3mYtpA4?aGW<>W6P2U|DVB*1tL8yghuSOoGSzhVytrr<#O;xZ)>B9bkK`iy zf8QpYJOOR!G*)vN`odNN^>>=Ny1yK?*yyOjEGzK_1B1cr?gH6gy>@dv(+u;lY{93W zK?FM^BW$nlt8vDMTZAb%)i-myk5Kp9E;yHUijms*F~c@=wbS_Mm0EtlzCPQhM=90Y zmR9l*DD42IjTuske(GF&h%T#yJqjk#m@%gM2{4?=N#cwRyy zaFI9S`hJfvaiP+KdVqlOX%TKY^fEg}-IhaO`_Z;Dv`HNQtUy%^srVvvnhinK@;=}> zQ{a8!qDtzZbEdl~cz^enq8I9u62)RznpU%`x+@f4Klf8o!q%m@t~MvF--VrcILR*T zW3MHc0| zxD68ytaV}2^R86i`A^Ih$ojK`FRJHrN)JB<0h8EFXFwIH_SKb5~x> zlEH|-AM!8igT9Dqea3E5{o!APR z_E+5=7<1R_G4LE}WZ(oDuxK2hT$)H^3;S z$5ThcwX}*G!CoTI4!;fJ-u}9_M@f3vb`ZJeO!iBPkdC*B53w0*T{|vpI?}-hwFt7YeLpkOH|CW_3g6m818NNRKd*X?;zzc3|-+(Nmvtb zW>ipegm6!`Xee_a7AS_a0NptvpWn`tyy5&d&OKxJKM@%lIly#$NR{`VJ_DhkCj2Lv zWbLXhn?2y%0gSb;pPz)S`TpMn`_vBN7sb}G(kq;Hn^q0i5VzU(+T^bH%H$c@tKPx<4#BC49fk3oR)?}cT#H3StW)~gefCg z^<|}!n%_R}%gXCZ{w2m=y2|QZMuo7LDtyDPL~#6B4kh+vx7L|1R`72%%D=0x`fV1i zRNGrbVON{@Rs+PdbILyuRHQLr!-(I3A_6T$wWDU=v~w({(ss%^tTV8B0Ncn~*8$K` zEuY4bpJYDc$@U)d0>(bUY?%Ki^$s|Z}7#-M3nZLWg+jKkMUtRxsl9;TJOWM?y5mtC6Skh7@E%`jxT@) ztg@9+>88KPbp6>LxBf-69NSxEh4co)w- zN7k2#51(<%-A2ebt~76kgX3qVkdsLy73KN z;V(vruWc16;A6vH@ZW0f#Y+hLXU&K7o6()>$L)thDO)Ok&Zr5k?Y)o3cKTO>TEa5w zMV6aU9pmuz$aup#5o_(71`nN!q5gBi2GH2+8q^!*?8*H5q{h5V`h{d+8$}I$G*_Po zU=o(oOpjPF^Gw`Me6eXvG1SlyfwR16*V?oXwVBtMbX_ligtUuxq^!P1kJThT`O)N{ z9ZRaEa0O^99G5g3J*W0GF*z^Kn!hB5{kk*q&3>}EOcHYl?HWn8VMtEL4icL@6TA-+F#&^rT}xtCg)uiz&-X2%|y$H%WG?m10Pn17qon zxBa?~uWb|RlY4s5f>Pd_n)Z+016-Myxi0ER*FGcFY%e|_>fk`!sreRXLY|XW($3jLpZCTCI34}klQ89iQ} z-)W;^;Y><4J!x=;$#?J_-Y zvb|T>(?FbTkXDf`pwQTgT7my3JPq9Z@5>;vsl^NC?-8>xx79SDEq3Jasc*4rz!OoL=vj z{zvJ*WfIZ_sh{!%r_(q4Z|9qJJ#VZ2M9tV-({Ue*H2}}q1q|lQ;*Z~DqA3_WkJO;^ zh_r^(1h`?0$>jNhC1=7(UPU$oBU*OeR43>yGu-E1AU#C>?;EP(C@#P@fvH##snRMj zQ|;HKfYk0tNWDUFQW&?#=H^<1scx4|#%t`^_~65Rk$LL@30)7vHoCm(W(5ofTIu!P z?|4%OAppFvXsLpn`aRlDQYq_vK;0v_N}ab-ilqJ*;`}GRQR`fQ1+1by z@>_8Kft>GVe&cS2pKbpr9{(V0JfL3$U1w!}rX8`87Fc+=DuUbz3PT-QNpWnY_XjgQ z%a43t_QWTz*0KfN_~jY?o%?6AR>aix>0O}yyi@|G@0NC#!TDC^(b<78(G#<0I4?MD zB0Cbe1@x)fTt)qZ5!LBePy42v!&L0oA^SkKZ%j@&k+rPV9(!d>(tmDW6hRi(un=_X zud#RU8=2R5pfZ_F+y@-1y|bCxjc&U%p_QN|kz26A4-7=@g7&{hcp**`BM9Y#plU7` z9U3|EAI>{;{Gegdmw6t48%_g!|JAti>dB=NP;g*m1jn$Bee3AW;^)p%809wYc@Lwl z8RVolanPrO&9y0?*xjTA6B1|kTci}p>^`^^w1Klvqcmg8#&dOG7LUFV%&~W~ht|iK zoQl-%^!G)3bCQH}cWnamwLaW-+lL|PGm1U?2}l-=@7JtSx$8Q4$g{f)JrQR(mbeXD zjKEiPmF2Q?cEMXH%s1K(x-XLk`r~)P{^9of#`t%GhCF3X(&4=G9|0zVJ+EJCq4(7P zlb`TUtu#t8yh~85LL(%}Z_%SM8?cZYmbMhjkgMRyQlVcM=>~lvGh1nh39K-PYiy*x ztH;QHfq`>aBg~8fPEkC1VqY!FzrRjH)=$LIA3rcbCMI|U2?$B475r{(+w1{-QmZL| zLokh9F=@j~Vd1pU)`pjz&pX)6M&W(isJQNZ`oDtbw`12m4DzF` za+cF`bDPkxi(CmNnUBuWImZtVQ80;*p{$~!jg>ut*7T=SS`gXr-)>2Qa;eL27kpjdx(&l(w4L%Xa|u>2PggUo{|3^-h*S{lX8R~pN(P^D#=VFx@QTe52MG2 ziEON>0)PL{9a5u$DDWW(b-_Q@MUeD*tj#;(avzC#HF%j=n9s`J&kRdB4kc4&yGR*O z!~EIm38_)5&?fFa(tK0VKFzT1wFiMFGwXs!dGUYH{6?La^otXjV`uFZ`l(z5p5)5RGWm=fh=Ws^vn?k!4H+7K_{)Vth^}Py z8s9A8G3n<+37J0(+YMXEui(q-J#2KCVKbj7O1NpBXn0i@(@>D`HFGf<8n*CB!hy~d z03>PC6N^s@j{G(eg(hGStM8(bwh zZIhKMX1`=2{F#Rwu9rDu!IXB@W&UkPllSa2>~OuA_K8$-2h26>ZUOKyX|Iy9WPXpO zs=K~q^j4uNZ1wrw35oUmqQlL=BXjvhhY7$r@30@uh{)Ctz8Z)HKWe>(x$RX(Au zrILdxJ>eX_{goD{oO7Ki5w_ReTv74(BKvBau5jTO*vv2di&n8Z z(1zz5vX9NB(*?}$z6>M0N8IF+4fL_=tb|+uw5qpPOR+@3|M*RN>fpV(+(phGnY+J= zxmlKKG!917+B--lR+4@qy-dSK+a($5cZST!AdyEM+9>-iej(bzHf zV=i=HV7pmDhQ6&?Tuvi>B|%LK@>qrFh&k<#6NE${b~dm+RLN$Ql23*9u-SDY^60zF zV&@oc9717JaIf1-$&XG>tSELkMepR?OQWG)ktgc$`;$9rNyo_Nxooj#$wDt(ArX84 zhI-P?8S{d8xgFtGbvk`3W2!}gsJj#>)|Ip1qG6gtx^%!}-$`TpYuy+afBex}>{c;pbH9*c8Tsr|C^rF?&i~BX4}T4;LIgU59!8@C21dW4;Qhx zo#Z8P>5qNY7p@;aI_!?;h5m?E2Cu6?U0n`+xP4rv)JKkru@H+l5#6OKcKsfZh^{NZ z(Og%F8h$hEeSWCs(PovROM4k&wUf*uL$cDk+&?u;y2SirWGwI<^tb#627yfz-3L`; zQbvdeq~s=#0*y11=D&yf_Dl}n#^U+PF{sa*<2=&SP~L_H=QVujo}|sVXAwpa%=aVR zWLWKL|Gv}C`}7>;xGuhz=CP&n`(lTtfStXv@`B#v>;*Ntw1HN(OLy3WC48*6QOKghK_{j~%;^wxhPY(?Z#3)?H|<1im$(0g9&$d>+{&(hTA z5KjW9Uq8~j6QgSG?mO{Qr!y+WVO{^d>PmzXdg6{)d-k%B*iiW(Y~FUne~{;KdobCc zZW@m z_Katd^~QT@+MJ5g!XVpA*#h?UhgKV3v0k{?E&u&MU{=cHPp5A?!*BaAvWg@iY(Nt0 zdPZ_O_|;L{?omJycKlbSG5FLv`a64+^dKR7g6%7;w>*dkUZ#ZP=9%Ic?klhEfSElT zRaD&uKNu~#dyrAAsq$ag4I$)1x`M6GR;+5``mL=BTGmsvE3K*ayxEt~i04daIK<&^ z+C$Jptu?@yoAX^L6pF{NyPNAQp%;H2tl~ajgKN>yOF~UKwPEm)b6d-hFg~2aUa1QB zspRBQL1 z1SoM(Iw1pCvpJ>R*6@L3Ow4wsm~?IrrzKC-faEzd4BB}UiQNgcbXXZ5FWkJoo)oe!mz=0_Nnq-M0U3PyOR$;GQBqj z)aG`EcmzghD-GEO(}q(wf0ie;2cF`+vGLQgjt4A{y=Xs#e;w5f@Vg>xg6O@72ryZK z2|e5VbqA8;Dz-{lD6IU7x^BmF zT*G%DnESYiG_}@z*b4D*UZS6;P|XP~cqZ|~u(bF;NjQEz3Q`N>6uMM7`~hd#VsSQr{ z@GSd`Vo^rG$23M;#uHf-H6!v&O;aWRgPAEuYBqFFhomFvCVRI#^CXq+5zSal4$rn5 z&i3k2dVs9zn&o|IQbg-l9i4abjiMo#R%`QY;RiQKH+yG8>gb*_1y++K37sSoRo$oZ zYuN(#^sg2qmWpv-lEOu{+7EMbqBU$e-kA}v$zMc?l2sUPW#XnSFvrc54gWbyP!iI; z(l*p!`Cd)SU7bkVnig3jgm1HimfvsZcrsggvJaN!uCJ>Tqc~bh&9yURTkIqyyn;t1 zjTyGTy`gzVJf;-lzct#CIg(6sWs#Fqw6E`LR#BEu47Obba+zK(>~5`AdwgRQI7r4d0#%^`9-X z@*S`5?YiZK`i&L!EnlX?1pkLl{s$f*wn4&3715i8zBjv;@{{XCa+Uo;VQ4DQChA1? zFSX??-boJ^oxa1ENGZ2S(zfX9stiuo0|#y&lWfKbG3Sw(z^EFrLB>-a1h4VsHXh#rnp!WI2?&lHyfCbbPU; zaR$+2g8e3==p1NA{DPIR_17DkZ+{t@2VW{f!1mAMDm|M8_ zo@*+5^sl@7x#ISZpAZk*ymrQgBoTJNaw?FeGJUk3>Yq=Qb-Mgn1WoIPtqmL>I+bGd z9w1eIW&&mYf2ayr8 zN_bPTy6GL8P*Ow}4^3?l_XyU7+%E@Z-uC*@uGPd=DR`|bNPQRjwvN9h+ON6?L*a%t zo5{P}#tx4%36X1e;d>H1WQNff>c(3Io%^ zm27Opkc?Iz`ws5HeIICotx6e}W4a74w0>t9%YP3Q-Ayj)Te%8t^_vn5KC6!XPh`WE z7rP)qWL5^ap$aWZvIKH}9hDzK$$O4A(Fv_9J*gr+6XVdXtERHI@Q35E^eb^qkVV&Q zKXTH-viLD&RyvMPaDG2y?01>dqTu<#$v*d*e`i8zors?7N|OBYAHx!nZW{xIh!yhG7ERm(YMJTCVDN zf(N{(*ULuA+yGX(>B8P3eWs+C?A=ATHj;CfiRfQl9Sy4uxY~u3TZey*7r(jDrgHc~ z$0}`Mb+lS4pw+T;6g=iU1jzjm=&Wj)HKqj~uD1S`m{Af3^Jkf(-!QLsDR7gg8*o_2s1EGj@(LuJcj$DYHa!pN5 zgIyoqVx7giNY}RMEY>enD9)$h90JHBjdzK!x~h}onrCI1SeZ|Boh@YU6w#~vKofA7w?i>3r-9i2pB~baFk7Z$+sCO|q&1)FRo2GHMuRb~KM1!b~xDK_sB zdIk_aB7cScPjIHx-8a7|698%-kMa6JEgN*RHUFhmPZ_sC+(;E+#I1AljiraARZ?M+ z9Pjm=#Y=)Utrmog4j%jy_OT2<+%}`5z1YOt9HY?lha{`dO6E`nCrh5+_>m$~;fJVSj3pJF_FUU!I9bbg zP%^j(FgFBRdpdX^ZWv@ zr)_fU)_Fcx()j_rZAuffv3jKgzQI4ca=4J*R$mkPES6$8nzYQscME*C6$_ULPG(R6 z3#^GwqF@iCyRobLVPvqhIi^qzAO?VA{#la=;!pwWfg zK%aBRBag{pROrn5YO=J7nS4!CtxzXz^!dWO z(N?AA52ax8E5Leee0ALy$`G6cjHq;M&>w^Cd)$;W*LTXcD&1o-;H6d45y;yNQp|(m z>d^ej3mjj@xD8K#s?xA}yYpBX^Y2c?y8!bDcume`Ty3jR+Es-9QiZn3nTRH&Mm)N$ z=kIHss7|ls8y{Eu?Jq{tv$KO=jLPgmZ4?sJxDj{cPDg&}Z4d(U`f!0;3kZ5wvat%H zO#4Oeo~`R?Aq`b9!Sb<)+=`YBF8zlwDVj4TeiubGaH=ng{%4#KTLPTx5R zxxj@{a?Zqo`+oOW=j&pz^e7_=!(8_crQ)IfdfahD@###z)%_jP6<0OWeEhi{O|@u6 zibpkDq9Fr6yk+cPOS20iJfPTK?$X|javc%kd-R+aXl|#c_qK{`8oCg_3!Oc#p^CsLWD5v_n3^2}>dTL$nCQ z(YwOGJm#r4@z^>PBck~a=WzGYw?e6x+9U{*wX{_bU%~N93Bz)iSc+lfnLxx87O~95 z=Jy|eCWOw8P5=I#+;rg;SP&4AmCX`M))s4Z1~iMz{15!R4mr(XL;-njv}Pb2`4jUF zv*R-IO)i8EZ*0^ZKM1lEtq!g*+P+FbXjw&aE^nfyX$~gJ!C?)Gwn4UP=$*{20Pv4O zpFsA_)T?c6m>8Lsb1CPWqDRSD>wqXM`Z904Q)IjD<1lGNa08e$Pq5v1BiNhK-b})r zhS0xwwlmoK6#t&rzWFV4WN{!)(?WWSiQ1Yaujx6&9rrURqLrmFX6nEr;&MFaGl_0o z4L9L?TuLwK4VQbcY{T8?i3WZuC4D87z;X1 zRhYb*3M8{w@);4~jnO3C%N1hFECjeS5AY<0Tlf(KSA94NL7H6%mUIi@dd57|g?{&) z+vVftS>)7CBqJ6ev@G%T5>Xe{5eHO@_mO1aN-2YGO^(y=Yr1I#7h=cw@tIfuFCW3vKSNr4 zO5kWY{u()OU4y4AW#(OXDMXpEHtVlWYGCBOXPx4%lOAG7%-(u`%z;%}I}tDj28g~h zNT9M`>LnndnaQA!J`nV`ALR>6W|w2Iv|P^pTpwpp&9LQnr{U|O(s$dX>bpZ&)+zMC zQ2k-Oi{U+|t5G!Ni$dHW69uO%H&}R9;_=x_-z@&JYH4C6^{QD%DvoQSVZ(x6GF}bk zwm$u`zw+GyQp*`#+y<9g+D&rHG+oc>LrKNlJ?(4V-`y-%m`lfRo6+ACC%!nrFqCp) zHAyN#R4+*yivsGB@QpkH$>!@+}AGg zEYf5(c1jlPud#Gyq9mAcQIxKgxhfXab3?F>)iK4kV*B^52bU812Ihz~`{^Q2!UZPX z^~wCLKc6cp`ZL`&2YOx*L#Gsbm(5xG7f;Pui#CuA{=OQP8tV(u0G{7Qi$jadZX}S^ zf9t<~BNt$h&gF?O8OX;@8{!96FK9lpcniaoWki4}A{leIB zUL$!y2t3b$5xSmqZs`M~WJEtf>pcb?Em3%#zl~}>>%^4D+6S9@wdY-(Tgg)Y3sT-0 z+~_5u>$C2xFG!c9X9-#bs=Y${#rVDhwe$+=sX#_&t}27KUC(`Y;!byN3#fFYqGsOH zM6^k)rQ`qJtPLfpE71IVB=zMyV9V2iRvecK_SfN7z?talhqY#YQi6I)tt)RyYK1EKI|$RShJ!WpveFOxwOE)3tv*Dhd3g0N?C_HOCKXK2eloJg*9$EB_PbEze>5czoru!Tovb ziA6`C*lUN!Cv~|>-Bbh?ZbIA6_USp=IQ0(is`zYwtlMN^37?-c7TJ;6rJ7wo(uNNT z%;#L5lu63ql_yLYU7s<(1>*CHKsoKxI5w9D&lj7VNd*jxKEGOZj26*mn=aZt2Cp7&CK;{pM4?edly zm=zFG6C5BF=^^u}Vh<-RUiyPc7Wbsh;(|(E?|kfpF7R`f-g5>xZrqQWtWOx`J=acSS6z#je0 z!5%Z{eIoBdPA($@QzW>gup|>e=5H-2Y_wU6{7yTR{CxAMKlICqqL?qMc=~M8W-!EP zHa4q_^zmIkHOC?8I#bLDh=}p{E6W_Y$DdGx)3$~Qw*KgYmUB4kCn2APYcWUo zTh+Zr@G*dGu;S9a;q|Yl?S+q`7leD#83{Bd1-4DH?oe1Dv)1(8=|g3#9p+hxt=iN! z5;o(ARnbHjrz(`}8E`upsISp!%v%qM-0pbNj955Bz7fBwzqj@wk@kGP;`C{dz^zdZ zh4c^iptJ8krhoEyws zw7+4m`KI5XGh9=j0j~LrlZR;x)jz{5mqMgY39hDm2Fml@zPP)obztb(@}%My;W%WYS^*%ouB3|A{dZn6;toCVwF$lJe$BRKJ`kIIPK#nvjz;dQ;5L*eLZ)y~v|ar)lP0izf~IH$>+^Jy^=1xbvfZ4Y>HZTW z{ZAShRKtMGssYTu7wsb6azg&BdCg!v*B>PjLEd|D?0cxHb6;Tz{f%XtlwY4*J~4fI z&UMOIcVnf|?m{UxKe$!RVVL0c`y2{70c;?vk+lqUfY5w@2!z?_f|B)3)F(9Mo9M)0 z|G!`lWpm!U`Mp~e-2ZeRLMdoa44Zsi`J(f7yo@Mpv%;_g%+CHJZRY)M8lt1b`fN-O z%l9Yk>$%Z6K@|j0>wC%?A!oGGv8x(4-RE5~QzG_DY;Q?R-l%L4hFH~DG?N4X*fkuH zyhhu5_bEQyVasm|{OuOvR}VwqWyS@l8Jgwjy`A3*U!D_Q>~tsn?6(AS8{LCK;>OT# zM=Yzk;a}pcm+>Fvf6BQ$06mE95+iN;==6`6x>}M0{(yGcqA+oC`JwOArWmJ^GJ$(X zS$|(u>uBk@Nv<&nmVV{ps6XF&{(&ZSxafGX*(Q&RHS3s zfZG%cC>teEpdf7;MAuGNt(n7*Y71|o_p%x?N=D~}0V zetv*)dUwtLSprvO>E@oAt^Ya!3+82ieoQ+g(NV7Ca56U`D;9`LkZZ1?T#p@b_ zC{m%$zj!~Q&ULU3ka6rs_O6{2;R}YF2D@7TT2%Q)y4i4984pK}A$w%s#n)xnHW{<|WIjh>!rsxy*6py+4QKpQ|b_7GENg96LJ0XAZvcM@KWrl^{{B3AdkoOiWC6vG1wL$jK%A_Fsm3%xAd%)C|+7 zJC5op67v<*?+s*U?=cj(zKMv>mPNZ>6V=#0W<=*uZrOa~R4@*`=Ii?D#MzbF9=D^^px7aw-JOYr47tjjF|uZ+}i4N1E;rA3$hqh z)RNbzaG2D7=CZ~z0LhttHl3mu;^t2joLHn`%Od;~g@9yFQUlSTy8aNFX)=463`iYs=xGn7b-T7vx@EP zT}D@~#1oXT?W)i=CtN6M_5GD3)z?Pccv6Jcp-;AUd>YA&SFV?BH~)}Szfd8jZ4Em$v%j4X7;b_#P8_MNCu4jchgN`+xxMOG5E*9}n>6t4PlKQ5II^i43hgm;GZ7k7ZyYm`7u zu0ul5$DvT3wfdv6`Uh7g=kAiK7a~nyxFem6Z%K;~IkD0GSFho!m)gt7&=(g0dVd;y z&5P4_b&UKcy6Ux3n-Z=3XjT9WDA}m7L$t|Gl>_jy8xJd2W81(^r7w4WpYY@n2d^HTYPFc_2El z)N#8UCp{{IYmv+hv?q@E%3%Hgv*TM)M{{Ym$2>+wWhzF)Xl3^IjA5$xrLRjCy zM0AQkwfFcC?hi!0#z*$?m8+4&tY3G^ez#lPM5WjH=OJZ+wX+_&Nkk= z5)sR{c-#Pzn|7G1QGEDKwfP8Z^T~Ffi8-K%l04;ocQ-PHtkSW1mE~}yXF=^)9Ai;F;+p0lr!%ml{XcDI(>+G`qS&TQND&0HAO ziyY!TTcV&aitp8#MnyF7=h^}G8`h+2&*EB6j7-;?Q4i{qbc3^rw=9M&0%sfSIZ03!F(5jAA`W&dbdQvX2H@T}a)8 z=ySeaw@gs)&QY$6fi84M+4sI#2nHd{PZxoP`rT8s94z)NSkYo zf=POSEtGmI2lgr_EJs&kx6IxgfB_C?3gXNUba{hicX0rx#S^e@1rerYc* z7~@K?^HOKK)&ok2T^?}zP`oYoWXQDC-@5XN9mQ(@g*lca?=3-9@Ft&rzASm{lPBVm z(gPQNXC;Du{vWo!Gp^}vSzDTbbSa@Dpn{+TM4FUH7nG(*69`q1UZg`Jy-E=glnyFL zN2HfXN06rU7CNB@LQQ|O&pmtJd(Q9uf6bSbHM5>I^UO1|uB#~A!Ai_)gR|VGV;UMb zzDMJoU0hJkwTD-N{OMPu-Q5wQa|gff$^Ou9%^0}SAz^92yq*CR%yc+xzLd4xKYxWE zo&97040y1Vnt1;9)x-->|LIfe8vj{xQvXhL=ewVhS+XCPxU+^Od-gs^+sF*DCEgyk zahIVJ&uRiR)Hj+Zx5KUwyxw31&3*DQ%Cs@w)_rj;Q!vaGOu0;TORkL=b zt}n{JNf7Zs=!QfEyzFRmG|+y_G{@R@jr~1C8h>1SF!wI~miPCk%Gk)D|`G=hjCs}v6nmjwrfBpC*oxnlTLJ7Kd{?$(`z0S z`_QxcuUub>Ng>bYK;=;?Z+vgvy%d9wa!#b+-nM+fic3CB&Ub3x?yRc`%0%OO@dLw{!6U|TXo2t5#8ER zB%V1`nv|bUhlU_^0w41WDB11@RCM6AE*ANgH$@11P5ZL_HG*y(uRGw0|5?uP9Ll#o zfmW_Nk#bThD0Ce5(@my&2VNH_YL(1bgoaVVJJXktzM~F=}^b$H#lLs9ZdzogZY)hORheC~tF0 zKTjTaP(JKGd@olq%-|Xz9oi#`(;k4urYxgJOEtjAPDsVF5X!K^@nCr}vIcc=RGl$g|=jG_~#E}|Zb!*Fz} zNslmc+g-`WyK8?NKfGmz+Bq&HPVOkr zS?5sexzKJMGI7KK^f0>Z5!?Htt`;-kcP(X&rvu7ujBSzAodIL-mwUz0itLlP$}Y%K z$wlFMEsw|j`*!2#;%5bwr4o-BX#Ztx6{I< z5G!>_w{Lo$iUkGr+=g-&UUt^^N;+pBR94%8XJU8DIzqZ{lDe#GBD(c@(Zq<5ZcSLr z{S$zNYW6To0iw3rbGMLl!SEWd@WJ;(#j>xRZSVq(4>0M97^dyr(dsIOKQBoI_*4IG zdoVy32@=N`UA-I>T_d1#Wogo>P*Rz^N`j=p8%jzfkVwVjBu<5d*wb>SyZP~9CSjuv zARbN|*2!-=t|bP!Ngt%?ZC-jrX!_o%2_3hzHix}Dy}CD3!yB^i?sXE&Am2X9pP9?& zg)Lb;RDuZ*OjCqTrgStya)V87JO&3q9cM?nsg~#{a=7kGDp;R;hezNoB1H^IEpQ#7zE*JbSYZ zWU-K$sI`#Bm0z~nmiIe&rC2v4#g#VH|D^YqLE`I3+uq;_8QM19nt*O*T{T^D4KIsi3MSE59VODZ~5_r z^OuiNAT{l`z`51-BiSid&mw_>TfZq7Yy$*oTOvP-$O+Q6^@=PxrXPN*DT6eGtq#}8 z*N-Hd9+wZ|QZ^o4C!waN!rbdE)2%SNGG98wckkb{RX;ScAS>H#F+M-b)U;ryZd{xi zBW7BFKPwDDU;fZSum8wr{?9hN9vj>(O(HN2mwy#sp$*DUHI18&XDtodrZ(16wdN4K zj@n8jByhgkBo&ZbKo%t8thi#GSb<>LC=z(<@LKN`_6swr;qG^n&w|oZ0x1HPy_Mn; zhfR>nDhB|T^)S9Pvc|N-UlbpVmP8Yv5jzt$_co#m+a<}7vwx`6)Enkk?QGaLCFV6)+!a7LxQ<1MH3+-<~mf{&^~tfXCb} zxJgy2%bYCiHZ;dvi#1|T$xFy|enk7AcAnN)MLuzJptUQ^_6aDJ>E_}3)=IfaPIh(g@pi4%~1jJdf+v2$Ndl?_9Ei0BM3ln98b-R^3_p!u*1Z0b23rA z*M3rRJfDFyX2IbNRjM4IproGDYX3$c{K@rCoXA;hgV3wS^}<#K9%a1`h?fszD^#d_ zbcEI?j~;A1igru6nr|!`#At3L8hjW|PZRs?zk!&Qn;)N17hp-1$*l7&Aj*m9fe(2!cYS_~%gWoCGr1D(soeT+be#+Hk;1?z>oH< zOl4c+1n05S&t!REgFK}r<)4*QVfx$er{Y3=m&H34uJG5*~usZao_~8a_ zp}5D_wlW~0`x-F#X2Y*r^x==?K{pW_34?gTZ!4whYu=Y4Kr76PiZ(wsl+#h>24m@H zPUUR~Lg!R7;G10V+xD^aPjQD9eIO|P%RP#=v-`1w*&^4DyfwAkO1v2N2yyOjFo}@K zDdi#rG>TC(g=pSM~crK zE*)B^aud{l-hqFqSXT|iG0*<`-2|0b1g2-jYnymzHf5L3%*E(PGFBr4Xsr=(VXx0bnZ9c;Xlh3( z-WOgJeB;yKifBb7w8vI8Q9IMYA}#X&lBKXwWhNJ(253^yeCAE@)vI9+@{eO01 z+29swCkQ`6Kak47_%;x1TdYC`#}E1iWn z-zlxM=cVQDQCq8jz`pEh-P1lK@IAaAcBz`*`a%CA1H$#r=>)=ApuqRO;IM0$-AH7? z^3shQvu1v{!N)g$krAjxDwujJ|9^rwr7A8DN2LiXTNh{p5^W;#d#4<3$Z}S*O;vW? zpcZLMK3A99tpsy-hU`JjCW#r}V8$07D|O*dpf!>!!=LVB_4Oh|525c723JM8@y|41 zf!2@Pq_+tYdgJ%EJ~MHvDI4wtvFiY=4skuUN-E2gM0`l9&w;3}XO7x%dtK@RD6y=m-4pe;_@A8$cw3vtc4Y=``roD{K+g_jL=$|&0Hk+8_Ld*Ql992725*}56(MRCW(`U* z77a30BO^mLDosrVnh2kEywalbpOardlE|;@VxBEh{VFUe3Ayk&RX$grV8xh?!By4) ziH9F42qS6`qt$bR*vH+~0%6fPcX-AF?{c|2wFn^$OuJwC1|F1Fs1lb#_7Kw%gyY$m z8gOnUQW626+vnCk&+3NM+IV^^ePrw}QVCJ4`t06|Zn~611ApC>>L<^(7abX%_wWeE zFb^dFia4MtzcL|A>-arfF9quH%9ce*k?(@gJgmtUI6zmSc9nn!%>R`e=yOW{6AT()}E)5>?^R5mKU=nimJylp=Q)Iu5q zS_Do^U#h~I43{MlaB;wThALFs7WNY6A@D}~DS>gq(X&5e;!bJYasP+hY;Oq#8o*i1 zs+|R=e!pkm%9!84Ld{j}h<2~g-Qb*s&0?hyrb%qWvW5P2648_#{8{6*=Q$yzkqLto ztqy7p6tPI&t6{?UelGwClTZJiC;%rhi@_UMc(%f#Q^5O52xM|zK(wX*rx1p?Hg>CR02GlwtSRzjGaf zX)|n>)4diKnhB6bz)Gp{b2)^B+kVg<%~&6nlaey*r&xUOGV&h6lp>I21g^vu$upbQ z^p-2RrA?G;pgiSiKlUD=uSiyre45Ead$G{@9!JmMEWzit;nz})dVTpoqD3?B2@)xa z5SX?7%Ot?T$^TwF%So$ZI+!?bG~me#m&R6Z-#tvZ2;&m_)=<1}$?cK<*a)zdp$g-% zB`#jZ7p+-So=l>DWY`~2;W3E3WYT!B3x3lG$RCx4T;sBdpO2y5uqFc-@l!C#TsF5` z_qhip5Wu;@WTZFq349>#L1nfoY+jJ~)YEP~{VcqrPUxR+$D>^Z5%4)3R-6hqp8>XD zw%RH$;}b=~l8r$?OVHJn2H))_VZfH2FA!l`rWdsU?`xCX}isQHQvQRqjcTqf_debXfyK6o(|zA~2*Z#R5Np%`i^sUM5A z!{-EDARPOPLlzj&y#xFKY6KQ&NIRZ7^B?CeQ{$1U^+lRms>jTt<;uTJuZ4I@Lik^&ZfO6*3_V4hBRb?nq|Bf!dq z8G?HNz$F)6O8m22D*Q`}G0&_&NRKga(R;N2JYMKK@%`99u2%#{p(UvB(L1FAEGLOa%6ymcU#Nl>=`qOq zBr8JWqg5j?Z!C|d;@Br%;UHLd0W|hc0kMn*ldf*WClF(@WlxnUI3Tv&~DXpds?M>Z3!;Xd=1IBamEvC?#W5~UAMgxT8ML3k?GQ@ej|&Cs0^)8Q-hRWsgFg?TfADsG&?jpDg*ir(e&jHgtJ zhPkZK-@eoEK4R1kjuLnekrVhMlHA$nNSA@NU*ApqfEOY`HAF-jb6NoMqjPzy=4BfT zV)QVJ2Ex&o)`$egCFstbq_8iF>JUHU6sdJ&M*)n*NsaKMYo+e!^poE}^Nbzj(mzJU zQ*VD(g@rXCZzGW3QlX`o<3EB=9Rr9s7J;=)rmZel0uv1eZR&=#SFke;x#qFYy=N>I zJgFOn!|=4htfFp6cl5Natn!dQt#z2&lF#H8>vrXO8*mS19ko}~O4w7WmxfOk5Pbx_ zzNQy|ZwpmW<2UT+(=I-gP4Iuu*w>oBrF;ljJZC%`Hs0?jyarEiDLvS?KXO*#PKha^ zTo8TyV-iPcERfXSyq7DVQOl|sVwaX)!)NZD7Du;~1ayK%G+u_qZ@@=Yb7?RJ_n9!+ zjJ>Oyoz4>iaXkzqu#R2R)y<;EjC#PMj8ou}yQfCq(uw#Icvn`*es`$TB)cFqfP_4b z@rQv>*$xg>*b`9Ypys0cadEINE9y@A(F~EF9=Uq+IM@GUg0kcVlt2r`q}THIWi9*6 zM_QDp9{#ld(l2_tAmlLJ(tJm|#Rn_lF_b2;2yvI?P_|#1%0HaRp`2)#<2T_~y3CZ_ zcnY#o4AA)Zce1=wrwSt+AE-f||L~OXCVMbJ0)geVX_1w+>6rhLqlV>Jc z(qIx77%@BsH;Y?rsKtDQy_>IboDM={1mMxn`&q}!CibsNfxzW!F;55{85waLl^z*; zYR9$L@A2trt&x0OT)#6z_-m=yOrme>AEWn;O#QxRh0a8kb*C50V;x}wi>-j>5PxAQ zJGzb>{H-McDSDMhfCBRh$7}a78#DZ$69S4(pf5nb~00VrN1+< z=S@x1Ezet*K~h{sTf^s^-%SKvv_SNhZ&Q*R5WgFEw+HuIn@C1@g_ZegcDQgUw6?Xl zoK8=)mR=ne&~CJ}()ah(QQEkju1Z{t#{Cg|aTvgc%BFyx9{q91Bv#0Y*l+TrPaYCa z;|G!H>+V8(`S>ZejgpJ7yB%CI6wzrs<5>bE+?ZO;ovHyd;Pg~sS?NG>^dN8jbMR$c zOe#?#64IPn)AZU)f};OP1j~1fHtuY3i{{)qqATi>v4e;DWVo~CP>QjSVOBe0YJ*;GHzU5KIHo)C*9bBVcBHVZh#a7w-?!ZrdR<%FZtmUJECom22CM|x;MYfD@k-kfFukr?Ew(wzuo=z#%3 z6Vw&M#!d2sw27P~_hvZ(WNjWJ;W4{&p@c`R5#9k}mUu zSR7x#ae%=X)50%!0{AqQxHc>w+7Y5gC_{WeoG*}nx<8n_JCv4dF4W&OabWeDtm-m8 zeoof)*E#3Cj34&SprqP&0smzX!UxGD^sdeA;a!B0-T=Y&8fG|7jXe_bw?R}sk5b`D zp_Iy4fblsu%Al6+eE3EL;e+Sno?p`<*Ix8`mM*kX1tg2CnyfH>=ZHri?zduBH%{K5*$`WKG1*99nw(W=I7O;?R>|iwGuCq-$Qx~ zUSl&pwul}2c*bNT<8iXfPGiZ;K1JeWpEBILY85WsVRNQkF|CZrwBPa)+=_zcP7 zS~MzeO`P}nB;JTz{TCw1u?N~5f@3?8#?)I6MzF|OGH^*z`cvJ%FM;;Q`ByLk6Mv;B zy$|!5!2Gd#L>#}!8u>)D%dx#2&j}|3J#*8gXN{1e7c^a;!nRtLWs|F0I$j~ zS}~X+aoE?dI{s^kKM2VjtBv*b=A&;etQMAhb~!v`WmkjU??`}KqDZ8A;mNuV@8FO+ zZY0+X=E2wT0VE)-os0kN~vCbCv9b-j|rZBg)_1ILG%Kd@YW(_Y3)4y(@gO!F2_-{5{?i-&#pmKppqbU{^A+uPzKWdEnHq(k(vKhg zZ3CtbQo0Bl5QK4`7<45~i`eWGcwe~pS*}x6YnRhhF!dJP0GW*BdEVi$5A`pz+PiV& z{HOmsN1trOv8=P5=JfP6xSCsiz>@*PB%U(r%Xy+siQjnXteAc|XH+9@8g@hoK`xVA zz7Jch-Mw}WPh;juEW(8vKg;VsEjJxom=UE2Wm#7gpREOw6EMM+RaIR-*KQ0ve5Bqp zRcTh|l0ko_ox&Y$Y7OBs0G+a7&XKWBd5|jx%BT18poE~u`I6kdt++A6Hda!IIbm;T zN4oh}C(yV#?{vDOgj!`TmZrBYq##+%%iWa5Crs(E|HMFY)zj1e{ZVSN^`W z5#iG!5d>=G^-STAcbJQM+AP9gV5l@o_<9H-yak_jw}xYJ+s=EIL!nQb0Xy$^nm@;o zGiaT&)~-G&m=O6H7D0byw1 zp~?a<97@`x67?g7fv08`DosvK!NPkrBDKblGKSJV-DkdqLFK}JQVe&31RtI@(nwApW z@%L+&t5A8pnvCWaW5DEid09IZ;+>5^nGMZyx+9lkboHmGl_z%0F8-GVcltFiUd&L^ zBhOptF}ZK{w+~Wb&m$q4ySf{K1_kTgoqJ zKI@&1J&2WFUc7?Q`=}pni-Llp$mkR~MgCYM?g>z@u4v!q*Rx+TdHPI2_X;WvSWdYi zqn{U&IUg|4+2CT3;fyUX_Esp%Y3o_^fEUh%k{(o`;XiP=XZUOZfH*(2&rQDkcUo0M z{k)n9Gn{xZM~z7?D^VxVUR?Oqzi5*s%WqSlElh;=G)G-qxc@1+;N{hDXe%j%YH}O{ zf27aRF?HHcyas-CIwUrw%Y>$LKSq}`DbQl19mi69978r<`V_(y9ly#4T)V1BVY-TK zmX>sxF;vjnLPDYXXa#0Z2CfLB?pXWZSyC6yILco+q?Z9p9(U$^eJZ7mMsI)8$x=9= zc+7LEaucS=YaiPdomSnE96;TX6ku(fN9>~G#Nm!PD{!H^y?~5-;OglX_y^BmLo7oW zD+nUPs-r6Iy(aM2qA0BvBXVhX^?`{Nv|^>6lRH77?NymLQ_-l`atav$@m zEQYHr!&+0}^&fD3+)GIIW9`PF#oO}?L&nc%V28)U4<8w*H>q@kzvgpX7QRz`IafbD zoaXa!T8rE>lZm&Tf$PMiaP9Ay0GAgkWxP>+=T}b>n~!YM`8$P?n8LQm5;;DzC^BNX z0LPvmcX;dn0w5{#VAXBAytYEjODa9y#L~MwIqC%q^!;!|^8wHP7x2DY^PTJp!f23I zOqh_n>-iHB>wp^(#FxO7?w!$1VW1bE$42kKj}|FY2CRE7e&-j2D=`1@6ZIgLsYGUQ z(l(0~?pu-|G`uhyoIMIP0>@2ro*?U}@Fho5vmFi#TNvn{$B9?C;^ z85ZdY4+hZ1b|iYj`C~knAb{fxj0-|B>--EP>3QLW^BoMVz;BDQ?JdN$6!AGL<~m?G zB28T6VE6OEl=w|FZd$rWsLi%i=SnBq8MODjo}Nzo@wenXE?)t4LLLn!I{Wj>n#YY) zSVmWfkl5m5pH|0LDIa*}B`|Jt-SsjCO83Xx^ znT3KpZrZ)aC-mXxjWX*QPG{%6rRC=C*MV=}7w>YPorKx}4BubLVWmUy|5giA{{id@ zBV~yGsNKZF1P_8`Wj2@&BYsvc{JN)+LSvxX?_}+Szu+E~yWO4FgJFa2x8&=9Z1L|M zXTEz$+!oM_MP|{OfkJOj!4x@o;Mhx$;+sE+_;?y#Y1(jm5pj@+@Wc10MxT%$i1qR<$^HmTJT9KtRw>R zb%mD^O9+R4pny~=kuQR48p|UIU!-Xd&uG=VJob6W$9HlrVgaH)W+VuoH^Srd1xjtzy%}52@#()r8aTN`7{(Z%QLzU z?jnvah6Q2nDo`bh#DGE1`wN39s(%E-+(uH1^`@-gjVG_ir zW^pDjj}aYv9x{s?-}kSa9$7h@8a7jWWL0`z612;lVHk5ibL)g>B5oG7;h)&?v6=g1 zdNaso20H(O0K!d&bDsTtqQTA+fu0i680NVKh|fsD=BL>F82f3qoIdB#(EjLugW%u$ z)1U0d$FwWvgAr*EPFyG8@ZoK_SKD%hJAk&s%1XSNwr!97~{ zq9MYoZ@AguS0X#d4Qo$=ImK4xitjD(^b*Rw0`bTJ^L9#eC@w0DwEriLiH?q9Pyw@3 z&-EZ+cbcBKw_PG&q|aULbjfgnZ=uQ!sPBK+_>yE5G7{Gc{}c+>{{lmiZ4&IoLSZ5pMydim~9l#3jKBa)4wJ;?L z`X!}U2M+)vA$Qgr=`hlIszmEM2vc>4YkUE5T|&X6L~lYz%33=J|IJ~e_9se~`H0q$L5`F8&ErHr`t_N-3U^eX zl|G}YV+H7HCY}f0A;%(|ANZ##o9LlVBJS&$j&n0=)4@z=t`pY3=|>|2#HlK@-w!DW zQ}`8NQuP-yR{NhM=7Slq%-E^Q2cJ1t(pxl>i&zBx)%DptHoqnwC!{`4YEqr$U$%VD zy>7}!SypcY#z_E{CLb}OPivJe2Eb`6K4U5Atra)4cbyAEvdyFmuB)QgMQ;EviKZyz zUI$*95z}e6QUd>4Zd8Ffm8^6qAR0%uK;I~a2Wy%8H7sdZ;1K4-Lu)<8P8KMzB3l`N z1Xadhz7-RzNTjNzfoT+u9`lcZN<~gq3W%NbXm=Uwk)8ar9eKB`#!FNL>!$Zt#Q^Ww z>3&V^r)a2quzf_?jXkNMXw)2#=-bKBGi}B6I`gw!@C?oL0(aV`egY*JXQFX0NsNH; z?hJqZ#JF-_0i5?oBi)+ft>d-DTgr&(t>be0kfM#+v_+hbVAFSLW|lv?KotnoSikC9wO9Pr>|&p4$4_zhKbL*;2ixx4dHg7jYl( zr&!^QEN&LBp(+Av>uZ#;pOH1o>TY;Pa|Ibp^r;Ap|0FRLelH(xBnMkcga5gqg^lxM zj`Jj&={wUXmePK896MzHN=o8V5RZxN&mOL<6C6l#hjxB||6H9A!ZTewvf(L!l1BVZ z{RkE1jZu@?XMDK3%K?JxnW`{;lplY&?El7cXmSY{M#@7}u8n8Du}poVf`3KgCSGC&-6ZFo%-{`^7| zYQS|*Yxex78L?MRp7o_FDZ-n$9=klZbf+{u@mQ+}ZTNj^68Pe@q->>~=GZab1}tvh zRGk@QY0#Pq-rXdzitv&Ga1<_h4A_6hwwIcCD7)^~Uw=~B^zmv;-MpObsK6ts-FhQV z?62o@! zs7XqQ#1_cvS>>F+IPm|z-aioia$f&td3d|buTjJ9u=Zao9YHrqd&C1+VOJ&oq!vM# zwxZW2Yn6+#L2_5*?g|^$iLlAUcMhO16fnIHw*ZTLcQ}?NIad8Z>wrbvnJq+n!`V2c z_`l1Ptbh5$q6Z=G3R=^T4V5@TU;=ZMxCJOdIHf6mLT~qOdx0nRzD1LqtFdr<+5bCR z->SY2`J8S*c`iCQt~zD2mS@~v)P4Z&L1s-|hekdn6+>r+q2*rGA5q__0?$2qCl?Fl zS799QgTS_!f^!EE80WO`&Vd?XdM^SuGC14Snw;cjuABw^j!vCacWqV(I{AjI{w<(un>+%K0Dh zs6(W_^{dLkXwXRYv1(wKct`V?&vpIey|17ezWVJIpZy45BghN}ACN^n2u!-j&Kjz| z(}DdoH|)uHocqk+zY!vwgb;kw!lYML`{$`JBf6wQr!_Gam=Zp{7bL&F8}3RQes>S{ z@oEAOwqbQM+`TD7;LUumxAUKF2-l1&S%=h^+bfF1}ejy`0>+9?hWYs)YuL0HG3M{92YgCMk$27T_Py1@u_sD2&}eUlgQ zbClRkq8dc*qZdE?^pyBJ<`OD8m=Y(g#(1>-&F*%5Dy+B}cP0p%`w4usyOV!@;NX^} zC_t61WXR{L>i*;bwub0+&jYakgA{g&8l>_O+%W@uzOTV$8443}nURtm;*SnWZa;6T zmS}5zY8BY{fC=5W7OX{CwMX0C+jOb<;-Dozq)}> z)+EWpYgkGQPItQw(~Hb!{P6k*6|LE61GbmEy{MHq zqyPDYF^C1nqvr2hfUMw+IzG3s13CO0SK0~WcWnY!T*le)6DuRknh!m?$(|2@bD5(o z1(*Uy3FLn+GxiUNEbY~%659zv>j6+prhmv-A)y_e_PYqV*o)j}qy<&CDpr+*4S3RH zdq;JEZ%od%DBLh8aW;4B_&E)brOt`AyDl^L-7be2xR0}<2S8(OB+YDrh3=F?-0u}> zUkMjP?BS>W@|!xegO02-(z=so1{+c1foot*Hq}uSYH9B@Vn=i8gAoVvd}Tma;&=)EV#$oy1)GqSZ;dOTk=fLD+8s zjca=Z#W}l{DMK)jYp>jKe+jq{zKJutCy>xN+~$05Q=`xWdcEpkQOpTtx=*js;mBYT zc8^B@cK1p0?zr~ZKq^rO`+!teeGSh|1@lc72cY1KP5eg03!-(GA`zLmnc@L|wIyru z{FmI4mTwpz_nwEG^Rv8w{?Ot?3vO?`mbAri!JTK59{RRR~V{HCMI{|;P~ z$1tH|o_m{eB#LAAfONfaO|P{r^}oy1vK{h_0WT^j8GxX0mO-Mk_)gkBi(XIE_ zp;%&@4FPec9Kdb#o}V_q#?5%)`{IH{7^f{ySDJs-tbg(NunTV-eFRijfqQ|0Gh_Pp zBKwv6Qaekh)rA{X0(!4g9GP@?Nd-1UzcMBec>kc$dqYE3h&;09#p&e=OLtX`&Uz1+ z;drP7k1CHk3;4bboUX!m(kg%|U&L)P!|Hrw)~6#O zSV_21d&<{Ht)bUoLg-7jo8qS{L&deBb0QCM``S5ItP;y2bod@S4o>Mmz z-H;={L)}=Y8AXUKo_M=R7`Nz$R?riB)jApyq%$f>^B9)qsnBzTUf=_oN|~INqa9l zD-4d9tR*NC*#f>cw{RXA=?p0O25c2?{e#sz;=zt%pn!|Vt%h*R00C4h{9l(##;zcd z({;eJ>L>6`Pt=yS&C0;n8PsB?2~Qry5XYVG#2J-KntbKE`>F9+4)@aT4fRm>hK{Mv!14!`&(U-8dEHVj z{gAx5dU#fO@+Qmixn>hMvtEzxqT5KAoUqPpsY}!MfrjqMdt!osmO<}@6TB}34x&4qyQujR-&0y{9AL-7inMy@7nBFcOD`Ei3ckA3ftS;o>i zi5vQB87rW!s@1-*CuhtV^DOU)E^n~uKtH}2fm`$Xp_+wMLcre8DU8=>I27;oSzWH8 z$Lz}(U;7CsR<%xIUyMO{GJS+r*t2F2=5IRm6#P4fEUiXls1l35!e^+kR;;M`*bBZ4 z%fNG)zrdjxfSPYX56k$a5`6D%w#o2|e}P7vJbUB?nGe3V$M~Q-@4-ZgSO!N@Us$2@ zRl2hm?y67yo1U;ZtJE+IE9h=$t-ddfoc9(tFn(tdTQnYOW}LLw(^#&)V;MGESe;3K zGHFQsLUZca4`JImwSf|47Y34koQAQK>M`|`B2&XUMS2n;Z&++xFPj27%%;kc4y5k` zVUy|4CqLjwwLj!35}gWP_z85G<0&2%Sd_RKLHKM&z3=azW^To;@#&%-``S~@&Ar^!!${G z_@=yMb%?!Qu=l6E1L8&f`O(k?*9>YjT7JEbH`6}MDE~Vb z!!5GXboRKI_D<)=Oq%vuoZQll%U?<>Dw~=?ymEEI@8)8%sWmjqGV1u=G?OSTQ(V%w zXUW#{8wkGfLZGsG7n`$L|eN_m~H${Ell3%+f9 zFunCvyk3G$b^PUkqCF?Wb&9QP6_x^5hJyFKdDK`q^50xN7A;U5ZZdxNMs!1_T`421 zUKIOr4gwyxi2c^~Si_wmb~HF~A@5ZA!%~QA*bUU%wPjeR5E#DV%1v@pX<5sTh6Muy zs9D$5nv#M!h&#CgM1FyoR;!!)V2h>R-R>c&Nml1K9+KppIB63(-<#}UajtLs(U4xi=$mG^Foy) z5s;0Gj7{hHb5tyJou5~JvXhGX=;B0vzL^#IY_?=3X|2gYX=!AsyaB|pbtUan*yY}4 znuH;(v?EJIe!Bl!iCSg;PyNx)C|p9$bxQMzwFWJ8lIAD=e)gaRk2Q?WhA;c4{cKZa zTydR|MLFcr=To0T91f}AI+ItvC1(}%I29Fi`aAhe;KGV-_u4yRaeC}VNTZuEs9GOH z%q5IU{T-103*=zJHmz1apq_%TuvECwA~F?BiF^9)BW{%@3F;w#lhh{yZdYV+1)+Iw z!H7v~WaWnJ8+0wWxp)0m@RDc2@-BZG23y{j#bE3<3G9`wU`p&Ht!im9lNu?@%Sl;E zN-tCyII{@9Lr09)L>lx?WX9Njk|ilk*8@Q70iKpAQV1j_6>PlB4JI-BiHrFKu;wRG z7aSKNY(;xMd=j|>nmv6ChY1aS`t#KI!Lut@m+K_hj1)GSjGsq-Texo4cAI9Xvi1N* zpChLse5@f;H6gc(>3zcckfxs-*xmKT;&tmyFDBH`yZ*(}?r7FnmKzZs$_rE0$GU}Q zA4BMjUKO!v#@4a$IES0|*joOMJlJ&kL}hL>`z-0(&i#86;@J0%)C6lD8y(pS9Yb)q zvf!X^_wQ8b8F!U2e}7&j!E9Dlq>Vmwnp#k-Q7vfnjdPPld{G4@x&wbcr{>B6$=thI z{I)3V-P5G2j^N{Sr0UpZ77tT3=%cCqjc20$C0q=qWf}Xj0l&vd{g`zdqOGNEjWPF) z*l;D3~caC4HOAGkUc0)6IhP5*J zqgYGXo2VT`wtz&=&}QB2p{X@UsF)4lA)4Pilrb1IE-^NdDZFG5#N-`o6l|_gy?Si< z#G~EN7I4xU0?8O1qS`-xo6j9DQ=W0`^<6(K^{k^!?XJ{p5iQa#ulAk>qqz)(5SN=*vJSgKvW};y5AmV=cTMmK36<7O z4S$3vh;vbTP4AauUE>L*dRHE}`xIETMjB=pP2|~pR(p5lnHc@_lgSn_*F?|r5d<^6EreBHdrsqO2e{B}^!|K}(K<%54V^=ikbeyvX%pqK7nnTf%%CAejK~| z`tWj8kZ1x!M5Yg+`uqF?nY-Qe)w}Dyt8>l9BjYR1^C5CCtA0hpE<$(nWk`>1!T+G$ z+hcIf(2E|i{`SaoM*^<(4AlQ0VFT>2dmVkwiE5QA)1JU*{Y2hgN0xqRzsn7$&!-$U z*u1vgDB!&SWtY%IFKcz(TzGiWT^|UtoZXK7C=arnYo?Vs$~H=0u6}k&LWFYF$1b(v zk?u1Q%C#pEsF1d)3;_XAbzE7~1Ir}3AH96Ky_hw%UoUb}&brb2x|*26CusBfFlh<5 zQch5@VAt1R%alpCxhm2h=RR}-1K<9SC#$tfvNh{2JBHm9jz1`JY}w7_)m#Kg4L zN6@#$Wfe-iT(YoBB$aK@mj`IATXuI;<0i?$zGHC9_m}hi&N`isKio5uog+8x53dWf zym@;SZ5N^+p8SzHPnU9T= z@f!56Ze`c|Fp@bnzbiV!Htlxy`$y@L;}Vl*I#+ zenf4-pYnsq>y`oq=(P3wc2b;#ajl+d9Vh_r;`gggjTP#XXAGtBvvD8I=p_2h3@eQ@ zN)dWZ%=@u)MlOaxb?kn&qZe>zLDneSjomiQPh}xuuu?Z#ywSaO`SIapUif#$<~(s` z;<3TZNw2BdU4n3^l*8>WZHHBRO9G$YY;zR@+jjj$U|2z72)>oXz_G74kK@wzFDnb2 zBzjy(Dkv@(nOCURDIfs3L)QK&(}U7iKLAJyyWX>iDQdxvibxXe_ywXGC-#KGrvCYT zGEF)96qcT2)`(?xqf-AUMcO<^QZt70sha8|nY)p^d#xtcM{}AKto@ypt1oVxQCckL zOLVvwNO14gpL$^#{npmLO?cjrU(6$k#v6Pdr%xQ+G5_3TIG?mRr@Jl^)j)?(R6Nk> zTk~MR^g^B)5qmF;HK8R1e<&a zm{En8OZ<-@!hH-3ZD;h24Rd3_4BK|pwPbrMx8GO?d{#MAPJ%)>`&6(Jee@U9Ul>D~ zj+fAvVEQ>c%&s-hJlF6)7s)HN|kYS1rHCfr>4;l%x9*kn#P+ad~bLUh2jg zf1mQY-^lv4=iX20F!lZBi(l1^EK~2F^#;ev-XD;B-?!}zfPWh6@0_8+yJ*9_DN`Sj z&XvMjZ3W=BKOOav=X30Qc#qtndFN6I%@?njO@d?QE0xDAz;BA$$9>*JO2*p99-QJ_ zRH3OMsxa68ycu~;=vo_kn%PmK!M;~tbl3{4lUQnB%M?-HEV#K|Af)L@x8xC3ts&AY z^e~482k%5UE%h}y!F!WTwe43z(rbL?L})HtRO|r6*Wcm9|Hs~YM>W-M@1izDMLu(?00L=Fk0DkndUYQ^6 zT8GHKgc>Gnd%~h_<#fVRR)wewM_$;>Q9^omt{>;}cIA_> z`fe>uUaa6r_E`UYB_T?;zX6gO+ayK_2$1{H50&qBkp`Wjp;C&lKR0ZBenp5xC+m!$ z^5?}_B3pRrZ2_8HSOo44D|TD1H&)eXV2po2MJAihn&~G^^RSdTsAU7>8=jBwe z;71LRpXbU?3+w?ik8)G3`M0N+7b4{Gq_&qFJ@Iv&3egeRJS;{Ou)_j;Iir9ykMg_h z-KKHKtyNusFTwn~`F!y_{YK5_=t&=YO)_8Ldp+|?bKE!jaML>Lp7NL(EI#86@Y|4} z_pF;-$z3*PUX__b-x$oNU)X4Z{^$qmeMRF)gj{CouUut_`U0}$fgTs-B^V%;a(6z6 z+6>REN zyz6}m@#*!Pn;Cg!#_?}X+3as1ocnyuXYPt+)8^L0^aU^3n-i&CcBMg_&OP-`8LUaM z#M-MHjfc{u%nSz@{9^(U1lnrc-5;JG5;kxA&?zN3saG}l7O1R z`HaFrzo?a{v*)#66dmx=k?kF${alWD8eY&byockGXep~7Uy>@PreUpxPDqXMfeAN; zE9bx!psTbREO9L%hkq-OXZ2 zzX02o?)HC<>ELI;qebJ!-3#&MXm(6$G?h zKKv#lDAlfBeJ#7-iXip#8`<`AB)6P5QMTKpF}3+j&BqY*Onq>cu;6 zr#B9(li1BCIvEG$2;a}F3-6EO5^mu4zl@&1+?VJKi);79j0>jxx}Hw$vu`~tJy4nQ z>4#|?M;k*P+cNS*9mMeL5x)!JN+NXCy`(VU-u)KWiSWQZJ7@y)u7Sno1Luptk^+hCpRW>{ zRt%nvW7rQ;T{l3>I{kNKevc^KL`ujfvZ`zH!v;6}0#c@ zqMO7v+!JuoJSWdJiHX*7jwdo9XdFE_9@0nw$}3-8NKV!!e1GMzyzu_tu=n6zI5#8o z>dyiXEv{~Iy?l|~nAaw@DXFtPde@DgUfBR-3ciqB7w9@1DM+*Vn-+{hBd zEqp)pccQ>FLSKl&C%f7}TII&yqG3R;<)#@xx)+0gkSe+Ya=D2MTb$H8APjn!Q;IOP z*W$(K9tf9;`7~0+(VTw&lN8J)%_!JgTy`;oJ54v$7Dy6@8JxZUfUUAC55Z^fq8(y@ zFmEmy7K3Y)33;iZfb;$VPg_yt5(->$6QWwxP32~&tXTF;{R9EHiNRoJbCc;Exx7d&Q1*B!P3G^8 z5wc7pyfHvpaGf7jHs~Kpi^3~k!+Is4~vR#!*f+hgBv@A&o+|3u7I+B!-R3aYZ@>S%oa=^2!Pj7 zL~|w3fAIX3KxdQ-4=Xr4zJ_HG@0 z91v?6Is0^ zrf6-`kn`x=g64BcM@tAp;V8EffU>_4qzoV<_{%V=d|Mwqn%On)fD$`3b$=%U?Pqku zcozdZ&$d0@slXH!K;EK%7W$i;UAcqMz^iCG#=()Sg8&p;q6TUI%m}EGn0ERIk4fq~ zz)F2aIa*FlsXI0#?Z;2O7oWx>|MjF2HFB2wS(Oc-9MTs#Z;G8WDPhbfe$()GWNef| zYu~q}+~`vsk@Fjm&ZSTJL+$9kMn4BH-QL*fC`6v?gtBU-(wGVJm=}c#59DEM@&4xW z1)Mve-t!MO`Ck^R*{{w&X6u+0*v{lj^>E+)JrO2lGgmuP7MIv5++Gtf%T10&89=R0 zXEKz#Vc|-ZCrc-C8 zO0%T#Y0C8W3d)`$*H1=4R(ijbQorly!JWEVDQ9eqFdKODTN|RcL^g@a&9xtP?l!h^ z20!mnAJ-&2HGqy<4myw$4P<8C-udL(hPOxm&w8NDE(>$lVje>L;X?9>r4}f)&trnB zqRnnF>MZ!!sWG=mSyo%8@^uLU*$LS&a6Erb+yYS+FNzve(g@C?YR!dpHfC>Q*$S|j zrBy8gxUNp~bC}cNOl7zDCNlIZ3R!inaWlem-jv{}jVW13zZ3~tZ(xH@&|hvw>u>Jq zl832$UDI3M4BwDaWh`NlQL`|PW8C@QmeTz-q9lXXC7%$^K~$KCl#-Sog2dJ0Y;FU0 z8V|e0QW3G7<2c1d@SI*HR_qZEmKC?n2T5m!6EfcwC22937X^RJb2T%_1@n!DMi+Sq zHYe{iDMyV2+vJM7EPF{dc>I?3o!C;5zJ?a)Y-Et%(L9&n160uHSCtN7R$;1BJ7@Bi zN%f_RyI5K0J7HN-p4ab5d{Cb7@Dwtp)6K4yolFO5!x9Y2+l7i3YdsPeQzzVX+ir)h zs&vku)Y`=CksTo-E6B-*a*2jk#IundPZZ(HkAX@Uj>@8HyXTkL+`K1e+w!)0RBmm2 zvQt>{e*cAMF5=zGT$!p?Xc&x55EaxVG)N~4+I$#0B9{D0IW3uKG`lALsL8=65Mz;Q zXMOW@Wc(dPor72>%h$&rb%Pr` zlhRbYrPZI#r1*RupG!O|1c{vb0A+qZHk6!?wTpo|Qq3Uwmb0A>5$g!?Wj z0nuYW*PUW>t{f?#;M^ecIzycr+ii;aLJBF2*`(CgYzZRKU@x&kwfJ#jkE3Xt@T2%%x9(Hk=J&_s*4^R zf$fGUPAHMxLO@5euFtqrc?QjF3~3^Hq-+U z!wKTmy!VU8ws}&O3saV(MqVfE6x*iXOPqUUrL8Q zU;erm>Keos$V~&UTb~%nm?>(_j3j zxjkyqpApL`4Euq-oOHGvp;~^OC8a+7>Dst}+m4Z7ZI0riZ|+I)1mY;{yR(X0uioIq zwoR&25`bZH?1cI)EtNSjC)m)FRqMgdy!a8rUmNrrLtRss4=|*;X_+|YZ_CBE=WSEd zdRv?_=x6(r>r+fJg3dfcJ$@K-!%w8E>Oz|!k$V2d0UfvG$u7rxfTZpdg1~d0jKj=s`!bhHmS^EPtBJ_SC*KQ;4%wv4VE{Z^V_fwTl`Iirov>+| zqJI4dYWv0nNBY-Bvo(ANY4=^_>h=_KqRXmIkU>RNY$1<8wYB&Ey%Gpq+xnz6`j z9O~kg@S=*;AP$OW^DdC)5Xw%~W54woJWqatq~AX8P6Azh zM!uWg1hj*wU4iySBttq2c0Pos4T@vSmAdI|<$9?Oc`{YP2?5)nir2gBMYOfQmJ)*4kLxJ$KduETA zJINzN4hY^*-{0Ub$|{_rN~Q7-eWzDWev%TR#4zTZ<~5J{8*Ra-Y!!p8XmXvQuL`ef zX?VEl9G9uj;8IC(UGM4PHBl{UmvuRC;oF0l+zd}zkh||^Q1~!`>@$$t|4{L=} z`|ZjZ`f(3OFxL){yrQwcHV$JHmEXUAMc{cG4<=*7JD$R>yR{pMJP=^5S3Iaq9|xI- zAu+jX^LQB(9Myk!mm==ogQrA?y2W2UT-I;}_sx9(JE(f%-$vm>Fq)fyHXkXidUQ!p z5H!J4C7e4edtF3&(Zf0QKuwB4tClrd>kz|;j@Y2SIDS;*EMT5HaJg%9s?qXoEzAW4 zJgWa^4Tcxdv8TaX_I{fAR6Lfwo-R$F+w;89A|GV;LgZ*NHYxek+=DKmD<05Ja!13d z4pmX?fg@F;t{{3_=v>oW_yZ)Qw?p-Q$Cj&$R-0g4+3QG3R?Q6mx8lRDh($5L#731c zcF(gr!D-fe$72pL&U0&%D6hqX2jD3PA-SN#BokenL-qa2@yx<2_Jh_LUSbV}fh88w z=G;<|=g1xNJz0~@-CUyU;bUj>+dt9GJDt_*2OcH1Ud(?wbW*wZO%^tCz+~qWd26(a zeP*FV2{X`dV`Y>?_9ULdgPQYK-)!xF(*BK|ipp|sb#OXir|+ixKF}?Vfa~bXN0y!u z^hC7(_OX|8tP=e#?vF5ST{|L3-ZP}UkF~kyv8K1Uh{?EA&j!}|T^}9Y}roj)nhjisGN~0q3 zv;BT%bVKU_wjG>WhY6;BlxQk`G!C2d?8Zz-%q{p;kSER|!6#B5Lv-Ksuw)z2?J;D} z&@TGQuMO}Cy!1?0r+M9=wwWRAzaFmPG{y>Ej1cocjAG|e3YYI%nckEQ6kNA9 zX?s>hzd)iDK7RiSdu6>oB}oYDu}b=5^p zF^V`dSBT7{K1~SoC~zW&hdsYhYCm5$7+Z5HSk#5%5%}`5OsX+GmdQdcD#)7xPMHG2em>e;vXTL@Kj>p(?@By+&X z0O@?fp06mtd>mqzebtLw0_YPTLqFh#A?;(~+eP7(Q+GA1`IblNlq^{0oXXtXGg{j_ z|A!ZxTQ0aqR5%695=&g}eGV2I6S`clYHFN{vTJ$S;#!e2>mITD+YhN#ZZ5w`EZ=v# zbC&~=!H-uz(7*H%VRHqo!7cRmf5Ng)@IOT@PIUD>+g_6m718G7c8-{+T-de5mIK3` zb9LX_dIQCc0li8u=Yu=IUD;dQzKZ*6U5j>n%Ej76{xplJ{!!T&dBPR@$}lnQ2TQ|M z>;hLPyx~+0h_l}p5i%>H)$VpAm&IsH=84KW=X6?S-vN&nkE*sdmj|sK*skmy*)7q4 zW6wP0n^~PkhpMkv--W<)rMZ2{6=O^(@3A-6Z6P;~opeq9#I=i4nw=u8nt87ZVmJz6 z8&(A?*L3raCo{siiaQGp#V$#x>q@f2vdQArQd3i^0`mU;Qu+QXRfLuA`cvQm(qj|w znB3!&8bG%fDTg~x%tsbEsbBxmKjezNro0d^ zY36zQ`^7Iuyq)vw>vwtTQNR}f0Yu3I`WpvYEYiv(78^5@=^tcZCRt~@_2w^c24pam zZDf&MgBsRE!{9|#hhO9@=5I{AkHsDAlgVupWr3O(k%EL7Hn0}chI zJPU3(@EQLVO%ermGIo3WF=;)x{+(6HsDdlb*M-cI_6o z=9Aj<(twDl-JKXot0bu@pHnpVI?biL`$vbAaN*UYhe24q3%=c!RQ<)sdpi!-x6aT}Cd{|p3W zwZ8S6&yhikUa@8O1JmQqLS|N)56;zPZF}5gh~uy$cmHNBuZ<{im1?kO(a#F6G)j(U zo^gL^9@|nCHXps~Z!hTDhzvK0c*Wj)AFHy`x494^=U$bjSuAz2zZPT^Wp|F6akye!!tcA}``a*w-K3cU`$3${MVyhCr*{(JYZ1pPyh|78XL_hK)9#|-~3 zLq7i-Z#&4cay~3|`Rhtg*h>0##ozsFDf&moHZG9dxq_fl*C)Ox%CMo2fUM`EiRHmt zG2u8^C&OIjU(fM@14A&=Qs#QeV5n^~^!=!oUGtQjOVsJm&-)MF+Hvnylosq(Ft%4c zq;Lcv>-5vO{_TtBM|-DE>DzX^>$xYUvR6$;EPPvN|J;RdF*oXkU#t4O?G#s95|G-{ zEqvm!`@tvn3A?4blTCFCgndxBF)JIQvYj30GdG`>#yqWe6JHe^VP|6pg>kD4SQlrr zi-Bo?8#%T4Sk6>!>GZhwB@mgH)xf56ta3Ts9HX2wM5x|YJ{vvNM5|{tY$i1l&2zL< zJh>j%?a`~d{(K@+>e9>y%x{%f_xa8&2{Iy%W$;fM_prU|H)adCRT3NqE^C;__E?|a z_owwEv^{fcAFH-jg3B!j8Ft56{K%eL?9KiSczCZ8?~|Jk)RE|3dJf7id-|vOu62n3 z04yJtY3rFY*qV|LWys=DRbAClb56znC;w{E+BMlNk1zQ+`sd;0@UXT6jGFQXfq7e* zrH%*wY5}jNZ5(9y`Ki~7_hAk&N>t+5tNv0s@@-yaB76R{_!>|Fj*WvjI;I2}lQrVl z%gOn`mjAOKqr|rb{oo1#^4Y1R?HLkuQ37+$pe4pA5n68q2kRbzVlOwuWI@YwnUh?( z{uZ;V#gtp*Yvv=JIuiq1DF?CWr!*sRo(PV)PpHpVD5_VD8pq!458Dmul9LQ_?8gk)SNg`WTm>XfIStbEGD_t-AKVrxDNygG0tR2p&g% z^3(kPsL7A5(8WhN9nO8X*nuW?f5&wS`-G8jQa_`E+dQ#-1H??!>p zk{pWrq}(bms1@#}-(U*jq{;9LwBRJCxBGzjZpoRUr~MFqNWgiWb<@=~rb{%aU9b+f zj>OL#K<#;3)pZ(=oG3tRSg#cDZW2+kX5ZwZcX)y5fRf;nYOGmxJ}^4LpdF+Zb57i= z2VXt$e(-a(qaawbNQyqbGaxKkTLa#r6A!K2>DRLs8UqXedmh1laxc+HR~{X9$JI@>L>ZN&BC7Zojefbb z83oBjN)Kz}>F^R2?XZn_4Fv6tzn=YF~;!;sM#Druwre%utO?Hw?b23G_cQ-hV@-I`5`0( z!7I$&C%o;~(_Zkh==u;VbJ3@iyQ3nAhqZ>HAleF<04OD941pqqo$TL)ppqP^yvSFD~GlaGi z-$d^U))7c6rMyYC%G$(7Q9%HXEe2vy%1iDGh`N@>p2cZzJ~(&#;2{PHJXD;k^0s?H zso|3|p`K%FS7>!KcC_4z={nMGbdno4(KVsz#?LZcd+-{!YV+E}2Sy_*f@sq#1D zE9vQk&(jWx{j`QLR8Lw*zwCv=B!FIivRm=EN-U9_s#*6t`=Q=tY;@}OE$X_}5-BF` zTh5pUgE{Uzr-_ZSknx#_B=);dnRPr+qPvJS-VEm&+BE=7Ga8Fo>r) zlAIV1_r=lOEON!EZZty#xELF?lOjl+K{YIQFRGU@XEda>DekM?kKr*CX3AQ+UND9- zESNjU-0RXG0zpMPM2a*aW|BI70MvYx{ZjRgI5#Qk$I9kQ5nYz|cT~C`T^U)`-Ph(%Bgb`9 zM!GadRgcZ>=V6u7IdZ@l%QUC%?5L2wAEAUA21Nw1lzJeo-WrCRoi~ST*JlNMvx583 zn4an9J-fXLdQy<$>w<0Tm?Eos7@+4`;6*0I3sji-3{&2;=lOqEuhYHWp$%a(Z{2 zm#>S-f9>WlEd!*qvgq;#tZsQudUzQyfQ$H0U=BA6QbETrI)!eZ??u zLkTZVUVL{TVg^Mds^;fNdz-O7Mz7cn682qYPPg(ZQVZ`V2EY5f+Jg_j6%NY=U?zdd z<#ohQb%;uIOdTss4-r}_`H3ID0_V!$m-i#a9$*~Y2GPHv;KD#*VG8nNrFqaW^9-J} zZ2bIKwo_h{s$+e;n6&`VZ_ zvN4S5(x-P?<$b{Fcp^=CT8*^f6p(#5FXQFUe5}55pIezIG;5YD6hzzjwar1nBk&nG znL$I9YkPlhnh99E0RKs5C~1 zYU~dj#?UnMhVBNH4`r!EhdckLhY2$fcO z2#>w<^Na8FO9S{SIPnHwU6!RfzvOc-5m{}uUQ`UHSDFf zo981bxb~7o@j+|Ana{QL^J;4W&)7uGJ?!u=%-dqNb=GOY^t@{BJ0v;&%10z(Dy8Qy zJssHM?ib^Q%Wg5n#?Y2QX(P~gGKpgWg5sr*gT8MCF*XFT5m&)zyR1qab0(a{9@9J+ z&xY&kR#c)|wJ*iZ(BJ?V&qKQD6- zGqs3Denibx8N6iZfy0(7zXFUeo_=G16pup8?ne0%F6DrCoSF@~S5KftDJ4@J-uXE9 zmM}zlN%Dt=kMte9RiqFa)+f&%>9WY%_#N>A;XHEK?Ue#Se3}D{};k!f_d8AX-GxC@co#02>C5eR}@aI*Glul zZSU4Op*3Vt%0o_~tP6${er#`1RWmaOgEAHIP-UY5*qZijdA#`-w+@6d0i<7B&?oJ; zQeVW)`f_(7%Gd5fl?$`j8A5 z90rPScjjBwalHm5J<)k}V(ETF_?98nxTO5xArx_&p1T|{H~DKnf_~#eKGr!uqD76z z!nu4f52_)zA-s>p;(Ta8lAtdzZBTpITkL^2SHjm429*)b+C=0P5ccnE;nt2_bzN>P zVd^!1hPG%_LJU%XU^{NAyq4SvtBaBp&~+uerWO9JU!=&}v!T64y?vc`0nemc5_wq5 zs~iIZj;J(a@S)}tGcs8!a%Y2wCC+4v{qg3sCfCBt`fe9kITrE47)`0!rJ$iLnVZp5 z67+nm)|<0v&g5z)yyRUxBv#DjzxOcHKNC+=5fbN2_NC~6{5Pzz6Mph z!FAo|(bTQIW6W4}ZN;%@eqdB!v)( zezz|UUX-DfNEFB%%QM+ahUGmM>@9q~kCl`6Ab$JGjW~#!DGC%UFMy8!Ybg52RK~|` zp_7c}h*&93^Kg`T)i)?{2q1v?P`Rk?KLuEKE=>Q)4Y#5Kfc$_U^6RubO?Rkl77+E_KpD?^bX!PU~aSY~Yg>^GmHm z=e5J+sdS5>dD}~PK=|Q)uCf`nya*eTZ$EEUcjT`S+0~Oc?*kp+EFMQ}Ui;DZX!i5^ zw|!bF=SFpfPeiI56ASW&EPePGy%7l)UOU!V9Q)jfmUAioUH&f2ZGuJMRr;IY{Ds@l z3n+l`lqp)+s`0Rc_{80(6OV=HTR-{-=*8hEzpG^Zux~XFQ5TAY+5#&Y7()=y!_Yz zxw;Ih*B{KsZYjT%d~*WNsW$=ad@{>{JTyi;kE79T~or(h)UE;9T>t72Alkl7#|0z;S|?!N)9oG zcXZ`-*^wn{KS%yO7Q2Z{I)vKU-Gr7Rr4&-Zz3xhUbg~(IVMgN}cU{yoARU?wPRu?- zo-{wF{VKXLBNuJ>cK;ceS@kh}2sd`aHWmVLT#qOrB5WlZ4p!}M_m+?hvFw}=e!JsU zVkS)*u+h0IHZVF5L>Ka;HHto$vgppc*{7s{PFQ+FGujVCvR|3yK2!;0n!YnIjoZcK z#?&+(8R#+o+=@jA#rKuWW+9@yAAO@}KdHN>^uzp?K8lSaqry znB5uVvNKx*7P=9_LF7nlkFA;MkVk`ZC#@=Zur8XhRdcGf+)b>JdMO{J0vie7AC10% zojhaWDHkSOMGqY-AXU>826%r_3q9>ZYY0hZtSUoI#tSSR#_H3{W`M&VWA;LANhPqAH|Fp8@MjJ)7M)Ku zZami}`e}Qzav@+Uyn#CL)I3aHVv-jz=5By==yDd!?}}zOP`)LOg)`7H0Zd1Dd+t1N zB1U3$+ZtLcL(bSP_>F;pH_b71r7Oo--(nDtRe$&nfa*{>6)1x?YEzVdva1gJRTab? zJOg)vA;SXzM6P&B1l6w6z)ys+^RWVNlRZVPP3t(!c=r~5KE^Opmzj3bjLgHzX8bY6 zu+hMn0JoJ3gfZP2DZ)*++7kDc?Wa^aaBZM8^^_0v#fSfd&vyKT zD45+u9Vd$KV;?hD;pW!)*+b0k+w*0MW5O-ktTN#XC z9XD|Kb0^REAa1R;ME5OD{AVO7ItOAclS7Jh-4^kYS-^X?;RnnJ)FqJ);|6TYPL)Qa z%p3Ao&*%+)`u7@u)WGm9a^hN#OS2gUf&-`m8QdM2)@d@i{RC8nn=p#rYJw4-kvzWt z9E&Ln6QkRcJ+Dm588W}d$wR8@`Oeb#IM|&cQyoof!f%o>x-J{T@sbX282s!_w30?n z=9>W4Tg?Nuc?r5cuq|546tB$SJkT#>%{&}dhr;TzL-g3w;~^*|mlC_xWyAfU)lu;> z{q&u_l6w60fdDD5oQnoXuk|i*gbOYk%`V+99gWI$l(!rJ9S&Wl>qvNnP_st;a7u$w zWMN*`QrnCg$=}>2kiCNhuN_B#mQb2;uH`^{7PC2kYnwKCSdBCr7TXG^^%_wESJn|# zOr5c#_X6>n9JLTK#YY>j+1IAfL=W+%;Yj+$C6J}}%c11-upLGID1G@cR$8z)V{mPz z8|2vC@G{JaBK9tj19-ugKwRQu5OJm(QK>o!<9z^%U>DfdgvwI=m09gs6Besm56+dL z$-tM6Ef4a81af|zo1ni$+)kPw8})3VhBi^BH89Ok*H<#JwT=W@qfhHcaf(iNW0>RJ zy!O_FIe+2{wn8vuJob0>xHBuH5*MSj5o%cI_n#Oq^c@!z-UtpQN{om zwDbQL47SEG(0kXe;3GG#8Cd^cbowu>{=70CUX|$z$=2X^L@_u{ST-<+0^)?J8$d-a zrS=J9|8tAeHvpcm?9wQVa&jIp&#C9){QjE%&o=C5@eqj=W5V_awALQhX4X)#X|3M~ z+u5!}#eYn&4#;9vamk6oLElTzj*UQcW z|D6Bfv5)od)4T4e#zFo*{vu`o{QKD9MLyu)$B)h#4+#GI_=<=ep7-C!Cz6H!KlbyS zW1;lnWJZpjJ8N-C^Ad7-uXN)^9aQMg1HX9^EzSM1;y2(}Q>fr+7Q<CkN9D{?XdTj%j{C&a8qkvU4@x za^696Fg}OIcJDfoln+&G!4`HEH&D^tYxpXTKKEvKC7wI$mnBR_6MZu`JLZfGRr?$+7;8DxulJ4`0hBzn#p;{#$yDtz^LkZYIT@Dkl4~_PpK<%tW}S9R z@X8V_n9!rbOCdI3CmVA9x^W-NyXl3*swH7bg8P16!#9YeGeOcX62C!m^%`wby3arn zd#-43Nusj0HS}XmNF}KiVhLbRK;?_;s*h>0vX0G6SJWWbI>tZ2ZNk%RoukR2bpf1j zwqXKWr0mDVUunB`-AiOf0EZvbX9kn>kOOXrz_@RfjD8gXJSa791k*rbio!CR(?%6R z;jhLTP75;R?Aps*(@WmJj;;$$X>|N0wG#H@;5I^T%Sydw^t$6mcs?~Cf{`ZUi`0MP>%*r)a))gp%kUp~( z2Fd6?d~s6N=d+u9z0If3%?@_Pl&`0HpJgyE9!HLpt<@eHhU8A$7Jv6?U%4HyU0TVs zM7 z^Ijgg0G8J*zaVd3bF{9>W)cKO7fVtw&F19~OrIYrYk#A$`8HZQLHr|0kZh$+ej9qN z*>Th&Xmo6Qo91)cr(o3N(?r1-!E<7{G8&vreXnjJjDCZ_)duuEtek`d-($Tx=wV!1 za;UMe_o4T;(6WAsA=O4vzzEHJm;po@CiYVlE)L~mM@UZoHe9~P-K(}MNP0ZJf2FRh z=z3F4B9G?_YX0i4^Eq zIs1{easJ+Gaj#dxO;bgir)^EPzmPxmXF48_oUt;4yh^e|j~h)|SiBW z%5MD{xqmSQ<;d|1a<=@iBBvP}acyM6`Qy|hq*}m)K(6V0sk|X}+q)79ft$VXxYh=Z zxmKl7{;&WCM)8&2cgQGfkRE+nK!@GaJ6~oOKswOCyX)?+mYDgXoAm;Mn;^Fx5`)mk z&z*!=i=XD6?i@Ps*U(RQ1_=NC=diZ>Wc3*)^McQW_fyOirr-Ha#3_~#%W%KkN=}DR z_Xyzvd5u{@$ZiNpqrE2%FkxYn9CZ#ia4Ek-xTWh8PO)Pk+A~#~QJ2btO|uX6hV-c-z3u#1w8DPB z7sXrAZP&Gub9eQNgyvAATg;7N@@`S5ZOSm{;0WKNO<1x#Yrb2rIk#f#`}lZg$nzuu zW)#QeKvT+osLCxXSvyNgF9+?JuT!*dG8A0}k52NoRLBy4*j748ksm|1 zIdq<`^KV*2cGIJa5nEy2qJ7Elg_6C&l(3uuxr*lFCl@Q9ryAe((dz_i?mBS`JYDDl zS6|Tqxk`nfL^IuHMld8q;k#6sX~52%AQGb3;mnCCHkO*B;@RW%ab|e3@sxR!xkh(N zM?*Zsss$Amu(gxV&^2-i8rASV)UlGZsQ4C?Cyy0RiOzRu(HQ-7DIG2~tQi?z{yhu9 zdUgyY`6ya?Nw$Uk5{W~#;~re(2pnSedA?Z*vYUP_Ym>m*>noM}TjF?npp5>Bk1aNY zTbbom2)9>+N`Lzr=cpy}rH1RB0pa*3E`?5Y3rmab`_mUH0w1ETgaLUomL81x_;{sA ze9!XOo4>!R)GMa)SJv^f5vjvKW!D;q7J;=eeVsAvuY(z-58r@RZjzgHTWvCwD!M1& zUNr&^-3@~mM6=b&sI(^zGrG#B)%whg6t=Uk?&d;;16FyYD%8^@R$|ym2Ac)esS#)x z_06aY3R#_Z$=0Y(33PdZ)qaNm^;nVcwn=^aO2y2rL!j!J_@8%rX%!XdDh*U^P2q(3 zD)k;U+1A=GgL?VR;M@6i#&q6UcV1@Lw^b9RTj@S|n%yhtHC-IVQ>`&=_Z5wtdIRM4 zrk~zSl`xU$?>AHM>$I&U>FksDsn^oH4i? zNP?YKe3m+UqfWpXEZOSuXnN0-6rUpzbsuRKm=qpbf$}w~l+ZIO%l6NY zyiw^mMW3E-vl}gryaW_j%K8*LJUDB1Ws0`W%Q9@xCV1h;(>?T>h9iXxv%C%Hv!9&VDO&MRloQ z8^WtIqm=?$VI5o+P4|fH)+1)C5?ug{EsmYJJVLOTn%eQ+2R#zf!i|X1OcfuRCXO8| z&2QEck%%F+O%>UkEC z&}OPc3~;$M+A(oODP0E?wfbUya8-UVAG+xM6lKr60Zpr_CE6^0h&`S|kUV_e>KL=3 z*TH4U#ycFa_fen*I35C9lT-hdBk82i9+`cnyjq_Z5}Yl8GI_7^N_{MAaA$l(a*1!D zqxkhJ9+vIndZetIRy*XlX6NX`#U~!SWzQItz0|Q3(zqKmtbSS%e72$n9WxR^c;f{-{v^pOP1eD=z(ur>>3{$36u2u|IyuQ2GQb)$8Buu~0xIg18RdFq&Z;g-^TqxpGWYsY#@|$sSQF-IZ ztan+C(aGaLY>}`Xlh|z(T_`PG1DWQe*>^5fS2}u)6>9DOAxg=)>ycfzR^LFl31^+N z6%udNpKD0m6AuabJ=c{a+ftapeg^s2pvU!_r}C?y1FJ7apxcimf;-&q(`j{do1qK3 zQtvs0@?R^TfHniLT7C1vs_=OB`_Vz6Ut{zrC&VG|MC+)_+7~A)mvK$lo@HH?BVPeC zIm^*;Z!xT%cbTuVl_0~8$5k%wO{OVM4GQzQ^+A|LHb7A7D9Za%xVu+P)!`|NEr*7# zG-iRK!2pO`bkFB_i(IQIvTLNcnCAM$SyIpH`Xul*zvQF2*kHcAP`FiC4@Kx#f}U~w z8bLCexGWh|{IY+(ISpNQqSp4eGDlCwzyO&Rk{NPI@W25Em~g*nC`!d(DCT`#Um9_g zF?w3@l252qU<0$rkp52J^wZUp8L6&7lmzPTmq+xs4}lwS`H1ZPc6G&PG~%8t%PzX= zt{>jR8h8@H*LM0%Pwv@>USF4xliBab;p7eJgM|7_iN(GLS*j&BmFu-nX3PxJjD;u> z4FN1!y82d5%x~4(M|Bni-ohYlHdEO|NsD|j?@M7*luO>wv(MQIv-?>YGXjCvd>XPk zgF~|50@}wlKRtTDw|xg{IlrRgi74(|gZSOjMaQ^$Syc$<_)7Om%iPg9*?==i+vU9g z{(T6$+-`UjAwyRaqvY*%AcV&}Jp?m#zNURLlA_TN@*z7m4PSM4>$R=mX?_M7y_I^-Be^`8HFFT?a&-SejhJC?Q3Cm+fzYHrb`IH=B^aX_^O{HEdA4}X!*R0r; zB*<_INWRp=I0|5RX&Vf{YQBejtM(01(M`DV+W%6_mB(}Yssr}M*$;0{U(is%Mlx(-6IPS||s4WByU&(B=zw&`V z*K!>jOZN}ktCdJhbB#CNQM&0QmrOf%KukX@jq2EYHlL4dV_^wr1)=veJQYIfO$Duq z4+54E#WmgUMlD=EOm)^Ba?@-mu{XCYt>@i!f-lmT(n8cp)E`Jh*io?%cNTN8%bjk7 z>6I8H!BNAX%DFs&TIbK!-v&rld-Fktj_k6Y%8|RyIK1Ex^hQhGIf=3$Idr@2`PIBd zKVo-Sk75FBLrbi>1Uq4GSu|y&zBc>%lmYa{t6w?7wB-BlOJgdUTOWA+(2~S}9lQ?}73e=f!h}BynE30W4PLH!QWc$j z8C9&G@oao((QcCJ=)cB!Lx-D*8P62kb+5)xoRZ@P?wewCV*2^PyT?m@8=36QhL)^c ze|sWmV!cUcJ`O@pcU6mMVRd?LacjT!{K!UQ4{l!YDmv7(_t3EtPkgSG-u3$fpyD*e z(BuyV0};Nb8cgo)_9VtodxZCo4GJyLvJcdEJbr-9mR79itGm7ub|k}NU(@nEYh~5k z#Vu5!+y58=yS-4<=Xli2A^)G z$WPO~ioL#Qn;Xg%#D-8XvU=K*GiARzw|~V9<>vjAhr~qIH$koQ4~mM2mVTMoexudKoW2{`i+%HV9;$TZ(C=Bz zIZo|k6(f)EGg?y19=@tGYenDu%-HjBUW}4P&^~ZCt;`L7?<{SC$R~VzS{U){!Pl7E zO|UKW8?u7SxZTHAqqPaj;~s_izXo(wfZ-!r%D57+^C<^YLiCGxm^tE$er1`8*L*xj zySVt4k2aPVR)AsLX_>6*k~hrD$MRE_>~k|lox<>qRC-#XO~dyUg>y-!I8Uf}e_u^- z`A`?wy-w<20GcK}3E&r1)w=U^YBx`kJBa-BryMe zp7M_KVZP1GyFc;UZg=jo?p3a9t+jQ(dfa{^C%`Rq_W2>>%>rDe;3Bi<`q%d}M;KV? z@_RKeD@uYsYC~aHw7{MPpWyu>Kl9v2D;-v~EtcY~NW!(ZRaU{R`gxj(s^nO))|AG+ z$&N!hFNbc8;h+ztE`CIk_l^jMtbyE&2(w4m3;ofw&%WpE zA>>%R1`r}Y*VtkOG~x{jYq-65t8gu{VaoPJROwxt0*#p zQ>R@`IyMqX%(17TVNat5s;t~R$FrU*r4Cg!Av%m#ZZe-DYi%RH@U|}Kva29VlN%!} zTEto*kD3IsjO;KS+``I<#2ev0OUj{I*C%`pLuegn4)8HtUeA#=qoySOif)U;ZDmp# zt{WeDe03u1ZH$o}#J3|!OOG>0YO^~|b~Ai=JTx04Iv67k{Rz7|Fh$R8%Dh5lBj`c5 zvky?bNd2@U)rq{XVBiz=dwsGiZT1tU1G}IXYtppuQX8BLb}{=~erAZDyYYWwH5!v9`)jrz zC1K~gL`jJhm85>X!(6j+oiEvKl@^;Z_;He6yA2v6>KAO3+ND2a)zM+V#46?oYaRCp z_HRRcv>%~s=m7f8-afPIpU8()NL{onmyXDOP1DIQvqcVv?>Q`6~}PIweOW z?nk=ZH+~uO$7S#9q|#ffF?op6PNWMqeRPeqvr02QyQ;xNJ#QY&MmiGd&FeSPwz?O2#C(@t?Ki6DcPyhiXpz3&mLhl2>UsIN zZy&qQjquczq`q!WO1cI8T?`N&-LKxZsi$GK&?m5u7i%`$0Yp-9R`gnnnUa%`w!%3+ zM$Poo7Lt+yh)Wx`8~x-Fb~0!_&GHg!o}4v z$Rcwpkvm=yzdtgd!}aEinVe7;PBBZ3Wz}%{o=3)a}VhIXSv<6%QJ zqhnQ!08&vEo}Hd1uwBlZ_bR#tYn|voZuih%REAk6nZ_MAhm;=;NCY5JtS8nZ%D6FK z;~|=gVFextoDhtQ@Ez62ms?e*XRi!zo;}t+R~4gnzGpLLLEpVmoN5< zxfRx3)i1hb3ueQ54V?zPJLI4d{>ru@1HM>YW+&7s-2HE_BDM57=U~DXjJm7o)aDmi zh!&D9KNn@H^{~+LH2B(ck=?$J zYj%U2D9|(~O+!XpI|=%Ejk93`pvdZ7MV!zdwPdFBZ}*L^eCP)7(EPrB0ABaVY`Vcd zrWBbhCv0e#G5Y(3Hud5u)H_uV_Rear7Yd3(qBijCt^H)uCoL|npU1W?9$V8Y$E+S| zpR;eqy&{i(w)i1JNQc~)Q+f{Bd0X{`cQ@(!C*!*o_sU`lq;(dg)nW{0%-r$AFV~f8 zK*~yIsTVx=L>A5Jv_YTHD?n~Wzr^jJK}2cJtxp0E52#QO?E|&oKao4op!rq&H?zyi zU#2oVI&!U+&4WC6RVZEU1Jz>9ew&A>E>z0+h+%%BEjQOQnHTJHTFJiF^>oY6Ij^mK zHPW#EQ4K)aL)s+5kAJ#tY~3mdFyp_aVS%tn>Gpu);5*C2V*+ZTdy z2cGg>B?;r4|SNmW6U+%nn@+;=(%_~(= z+av2d^1Q^i45!3utz6kpYW&-mkU@_6ez_KRepZYu#{Z;bJ^$KzlU{GXf|9-G1bJJ) zAx23)U7lu)5Jk6_@>yVykxv`I>$n7C#rMd$jIajv)#Tu2*pFErVTIx8>Kq+ZmP^Uk zi^OKm!{m0G+}P>4=TElZ!~wuF4wc*K$mjX?;H-+lZs;EuSCNqI1FY>@i||gm1II}$ z^)m~g&+b`BR$X!GUwM0P%fNdD5=0a;GA@7AqGb5sH)lj_6%Z@9;da0Y`? zNyN)Lv9?s0GhSJMQp#=@;ClA>ZSHl>`|}(2xp2F}<~gWdoB1~PFus4E_Uk;0qD>PM zZ!aHoA%F@ED~JKzVfw#)g9QiK)@;=9Q0A+xc&YCiAH*u$;uurTH%s|X$I(KYRVn5x zZzERTJ;ua26a2JSTiJfw2}cy5)u9MX9d6HqkC<| zxG;+vqqEAph)*fGZ6?k@{xUt`%W*c3LIcqX!Ygb}Nm1`n)1tEcEFZ>K7Iu;44 zMKXG2Sr^97h`p`zS3?5Vm=C+xD$DFLo4;j>~}4h*fV<|zFEsZ1C1dxe9H3%LP? z_>(;c@Br3WYi?@#rm81z94`+*kjuP`SSh!*EP^>TcZA&q9>L7*L>!yKWd(~iqV}s9ujSpnGc`9lK+AxzZ()Tn3~2GlO6nsYNG%; zM4gt47>XRODaN>MTAI&mZMl=Hi(gkIXZW1{l;G%#soKFn<_KLEIa(%?TV^@N0Z7)0l2rwkLZdVSNpTwKb2gXpWvu5~UpbIEcMI@S)_ ztq#p*k(rw!(?`)VdkFi}7BOQBSYH6le%_QAZ^fHG^FUs-YJ&ae0oMu9_7GF~rD83J z&(9!z1@+2^yML5s&!aWsmS$Lsqn3>X-_$0y*Ft%Jj+b!&Me;*_Ri^t9=1cwB7%Qg+ z$B_OUgog{$Ls${0dv5jrprj0V3C++}#gP1|%Wi4sNy)2&2szkRggNMM#6$;wK)((v+busd!e!RT<+-7YMx_&Z;~1t{ z*X67uXGy#pDfR19hhe5D2RC%(A{W+i2-b2-(;9gn&}kP>w5dGu#;pwg$cfVuiDPnE zV|8&gA1=zTasc{;oPp;cp;OYH;nte`!!nW33}B)AON#dx?qZfHY~@>e#nxwgHK}&h zN{~ci_Tr>>1R`p+n)QQ+fs$bb-(br$R)-mDbvRV};@5l#@^X_^>)~n=dKz*4Ts9?! z7inm3^xHER6*C-4zQzMI#cNY!Dv&tRa2*4XAstCoS`URmL!mR}G(O&pvl_t_$|ZJp z9$1i0uz$x%8wp@V_{vP`+6Ndn9Bthr?*cuFK8H4ws_)f$GNdiO&7a*p5Fa794l(?a ze0f#zo_ny?DYMQ1tV=;j{qB1{r#fedPxho~aK`xJhwIRu2Avf>F{ZM{w2VyRVb)6x zp<4dgNtR{ST2wW`pU=OUJPO3(SeGZ4vVzZlP&=gs0JsBmW7lt&j5?F2VPh(#7WNl3 zS1Ep#Rv#n?)#*(SPXT3f8i2A6J>rvd`yn?g^t(H{XWmSJS5`%QtAA~J7KIQ8OPu3j zl*jmoum*)$%bv!wDPA6nk(^*%YAAU;uTe6b(`d>>;&DI{qt1ox9M-WAb-2}sLCKMj zwKJ^suBY}(xy^DT0;N_s&(0qJn%KqkFv@$QoP1l?6X~DLXD}7XdTZL0AsdijX+A5I zef(*WUH`C?nTRaB#DEXA(J_Yh?`{e5)@-v%y>mmZ!q0Su9s(r&TvN}`yAJ)9MFVBR z?RL~ckAWg?L6P<@%7+jaGtdJsqagNKVPSHMBD`Nald}V+s1owz%{)R~W@QlGA@@yI z@lE8na^T|vx%snr+9YC}`N5#0%S~v{&Zybb2^rUP7%w`9Ap>SoTTIN4hqv26S@h;J zqwIZdkz;>Q7bh{{^|WTqdfDvV28GpDIMKZ5YwCG9+uWaLrh6Wq*~=gjORww8yfuD| z6_$X~*|C;i&9uI9WtGxh@;yzw#{T%dk%iYhm%Pz4U&VS!hgpj%MnM~6IG4!|4(+mr zPu`l~7V+aAe8c{*z3P$(be?fWTcuULmwc1$urwmzhlbL&5yQ)#v6j0JyF;7%7hg(l zK{y6UCmGymdgbE${p1m;g{psOWwtYd#|HDrt*c(ux+b$}Hoe-N2Xm0S;|+0R&dQ)-UX zmq9Unwovfw?!HmShttDI&^^2ozW($1Igf^9yF_7(&!PmgP-U$}Wm-g&q|2Y-rk^No zuah4XBvGL;KdfmgR9!J%`=0HE)U~oB7uh!-?27&?B&X_VbPP)G{$cJGa;?pda?tQd zYpeTC{FxQ2@E1`*G4DU1s+#;pbKTf%dtV)(Y5J*LcVJ^va<3!X>-<*iVLyL^^*RdC zzdQRjA-;!+S$5ultQu^WWO821my-#(M#X97*_G9I~6GaHJ zo^jiU!p}Xu1^r~4pfZ|cXAX0U?U_TuZ_DHR52+X}NV1%}nH51wxLh^4j9efU6!bu% zN}(a4@N1T&R`9oqkKFXC@$kHYGrpgO=67??1X;uv;Bv&B+!PQFWgQ1bW)D;vY-MZS zLxsvzdnIM}1Q(rOkcP}#+1x7{B*3aob3j`y@vS{-n2qKt$9qNF{lymBM-`1w0@uP8 zNAm38P9sH;qRCZ-eewg<%;DY~2b7k^sOyMPpmtg#KDDAL9LB$6(0Nh*BkKc#gFBKj zYFN4LJZeAM9q68^emEy^9IRKJIBH!nCX_|3nYQ+FzDd$eu9^Y5&bp4eZd}wXR3IQF?4WFze?|G zUfAkkmgc2axdnVqdpKt5XP{aQlhW?)T}K4_%&MeU+n+lwx;4)_)Ts`;+jAWj<>%M1 z9;V@#ytPXDVcl%676H)CFvYK3v8zp>&@q2>7kXU9y9Vhx?a5~7<sLQrXyQXp=-4 ztBSUE(VX*qyTfEzgC=&9LpT8I**v2XY28qO+tST%b+!me83}EVj9m>%e3t2tgDhc# zGy608FQh-p)+DJ^h(bop|7h7DH4f{7j&9+`X7Tngjuk#n^BcS7Z8!`$vs@j!kGS)q zCH=Ef+Mkx|Vs%$@s0WM}2Unve;EnUc0tbAWVH;T;HQNhe_zLw}{;(HOKDarX!iBJ* zX7;mYT(FY`@wvV5D6bb9@d&4~cXl%0l>#MH=O0D2hZ>%r@il#8jgE~qjiz!B(-gmQ z*C+~8+(_2Pc|BRlaf|p&?=t2$XRCS9ed@_5o5i9PIVUHay4&G@q zebX+hKjzQgNUHjao$CmDeaZQ5sTTOw-32YRV*X)bgR@!4ofjhm2LZLesO2r3VNIA^ zzvAm?U1UUARaVh|muZ3Mm5Z`*pi3tCIY7tq@83d(?Vj;*(D|E;&JCF%id5h=Mbaxe zcHTM_==(X{Yg@FpxwGz8Y5%}(oOJ;1pPXA|mpjF`hGsS@cmET3l0RMo(XK=$j=e+*3l zuJ&|IR-3Cn;)%#KY{mMV!YW0(vB$Y3INLK`T4k)CpN2gpw*(YQWnnlJ8J98t_0xjy z6{|uH-!HkJzordxfzdSKn!p1HhF%RF4;(U>t|!V~EhY2Dl&1DfZq=kC_*B4_!i9KH zm&WAwL8Vq^x|)3Zv#}Ye6({&Tm5@2Jdt0Q9dRr(UCBQlOI{?r=u^iC!Z>V4-bLidrL&3QSj)EH82*lx$#rBp}jI|`?9 zLSzdEaN{tzSM6Pmj{!KJ%l-XR$$T>&ix5RJy2?B{^n4rF&pKaEZr}{~m6uClH3PaaGv7Eb_S2&*II;U4Zb}z_x%_QWq2v8W znJ@AE+^y0%Bg$OQUJZ^EK#k9=Bf?ER6>($HFRcdE&IXcrLtM*lH-YBL%@vefgOIx6 zIHA*~V}8Q$`I<9rTGf|Wrgz0R7IqRQz7*i(`>flF{dZrKk(EGNmy;IL433cnXe55#$XQ%vDQ&@e+t@fQEt8V$6pRdAH66>04 zm&-(Hf93h!XSZNMj+UjYJg?-94dM~ThO~UO`>tKQZqJ7^1l_X6qgxvXJRF{NTt!U7v#M|_q)g`M^l zU0sYVJIa`pp|N@+7J}NMzdV4AedE^T;+l9{(U)lq_{LW}qeO;}cv+dG>gKMPkNF$G zE*|YMx#G{(biU5{-YD+tajstbkmt%su{U2v?ZiP=*xEtXT373>>zu*erRhHLwnD+! z)~YA<)a9E$$_}bs=tF%Q9;dkCBVEMq{kT&vYmXALtPj^h0lNQgo>>EDi(b)5jL|ab zT**n5aB0ncGsm98IbIsAVqx!hOuiBqu&Vq~qTLYjUaU}0$b-o|d|h-|vI#Tv*~7P5 z<{r67TvFUs+I0fI+8P|ATa35x?F80B;?jD0|Mo?uLUyIo&^rzIEuzDM%1F0ye#^Pp zLpiyX;YAko8J4TymViSm0Jb|{h#GsS`pI8M`nHc4*EJ7RMgdMr?cpd?jMtDCLqf+X zARIlaZZV77lb%HmmN-bb)WR)$2sbX#|0lzaHRv)^x5a z@PY-f>eD9_^%dU{GducoP@c7JE4e+hQoHwSU#{f2K1vQ4ZROrLiWVDrQ4G}2n9G;g zCAfKN@+(1o>=wVj#u`T}fk2^7RU+UHGtOUjoGINkL~HO1whXa37Ipvi?u=UD6(wg@ zPZ)~Pnco}D@;HdhtnJ^`kol&Otdwk`5ccRXQLAcD-&%fS=lSOdjFBNw47txQdUH22 zUFa*3X4wq=#Gk_31sa(J6@`6#48@(2Sxt^NbxR3Y+_@jgq6aVI0VY}Y9~1sCdvN^?)N)vKyb_?!;{yaq*>{x|3vf(-X%)4*g@mt;H%a{EkP9z!_;2Ke zffo6d_X;j7?iGo9Djzz`iqVaweh2cm73G`H4`$kwb-b+68egn(8dbCzafEsNg?SKa z;u>|XZao!+;*nMt9ntkgyZ>!20ehtguIpdWS-D&_!N?s6QYRlJK5m6rmxk$b=Ok<} z47cXbS`sqr5SVaD*A3isiHOQZG)LSKI76y0*yNTAYLERV3eVPf`+7C3%lb$vY)uPt1-Nd-Vxdni&rqX`R#`T zT8J8}9#J)X0Ap0%HVhvdvXUC1rRNjS8=3!|O)fn*~} zwj;(jW~awXHucX}=}G90l<%p;l;0RiZs+HuQL?4cfE={)w6u7rNxc$w#jC4ux^&O< zF5oX2p>*i@j~%H@Q&{7?9NGA;ce3{tQHLR$4=E19dSND5Jc61&B>1qyYBeS_a zR#)cRLH@T>S>ZrR%ULw!4v_isz1q37aE3VSU|sCA5vSM`_alf*%WZ3Cq^RwoK;HWb z1D}yqOlV!(iz-1uHU``xK<(Smj!x!UK+)(MLAitt+&@fRxFyI0;%$Uz}8XClM6_-{ci@QX%Wn|KUn|{`w!Bzz9D@y)>j}% z=aHVM1`lYh1sGaq|MT5dH|pOk>k);#$0yqgF&k=fd4#Y?>X2pk{QPK0CNC%!T+#8M zeRE-X?sAa)Gb};J0%1R-I^DNOSy-{hNpwctni~RuO@IqjvHs4^aK64Fgvzrx%hIm| zPIhzzwn)bFv;D>s!UHwQ-b5Jog`epk(J-G}3z_A-n?J52!y+cmEQGVPut##V=sp-E}{(i7^k>e2^Yw#hlXl8FmPc6Ujk>FbH zJxKR>hk%Mp`|sh&6TCZ0i^c)|25Z@}VZ*!3Mc%C}jz()Hb69yTW|xc0Sp7xRup$OYk$P;BHQJ+b9OV10&r8%8z&WSoP@TC3IJ2z(Y?5*Q+TffoEXgzfUhL) zE(4qpmx{pu|L>UCCsJ3^Cu*Hk#pNeA*pZxaKEP4r|M$d!2PS7_S)EYB;&El5fz)ok zI?$%?>OodU{fzWJuJ^&JUTUVQtDI!c-Egv|c%nLnM&ao0Dd|5>{?}Us`4}83l!iNS zUzI%x{TtEpI{PnPvG_JD@HfWu;lJ;ny*8FCmaxZC7#pToF9YaYrv6?%oxw9e4n>$} z0lqHjLQUW4Rc_^ky_&mMT>te;H^&4XitLTx#J+#aLROP_Y=QK^<-OXyEBpUz_`qym z+wIl&-9Nae)#^d}xt^^(n(&r*5p}9@j|zVO8^B`rJ@}i~94|owlfUM%SIGD5*s1@w zOu!=pIWu*oEbaI&=MD8f(N>n`t0u>{;)5Xpe0NqzArASw@(1aKEH1dd&v6yp1{<7m9iw>G;G8auxnN5! z-4>O2DccrxApz7T;LVvIf|fTU*@>H>A>Pu_=T~!m)TbB4Y%4g!?IFS;1j5gbp++$a3g7c0Uv|H_IsylbpAn{X9(|=Nd-|Y zyEYsz3jqr>M8&w>1S*csLo%(X3xo`pA}clRsV8WsIlhLM>?GD^ZL5!sZ)!Z1ntD>s zVx`O@*F@+k-Q^xoS~8fPDl@v`RDUytAX;W)_?~6z}uE&`f-`z0=F=6I6<<0MMu5H~GtR{RIhf7mJ|1#QM zoUk)|QyZ#gonHCAt88|U`Sn3U#fxu$5g@Zrf9@{bfi|VH$`hckIzhi&sHy_cgR)fF zd(L}#?OXFfp9wMELgY<_DF87Ve3z0^{$da{C#_d?lS%VN9*Hd87ZjB$?l2bubS2MS zZS&xmU%7mr45~>yA2wL|{gpSx&jx!2+;NK9b7POaZOtq0c9KVFTehEb(L7HM*0{|! z{T6PEF4S46t*}~ND(2yEHn9GGI6_|F14HrXt}Q3jDH-{a_oC6@f&ixj9NpE_fA zdEnV`+n&Qh`)j{NzdaP#xTyct zT285MO@{2Z1_(5`7ZRAl9$SFs0 z^ltVEi432#M~s)5e{1k?ZddtS5`(rC#0HUmZn2!BiF2x(58d)tp050?Y`c)RQSHcB zDiB|PARcb{jXwzf$*;Y>F)_2h*t;^Wf|@55a}l=vxy{?>f%wxl3%rNaJahdW3$b+G zy=inz7b3*!j3Iw!#IsqnpkuM~Aol1|z|JF zSPZ{JGz$7Ks%+Mm`vPoJ=qu52pQa!;r9TxmE!0bEh~044Xz!t&$h>%j&+&0k> zvy&`lq(jD$lqifLS$an=_NL$bbLPM>*mcI)1tMwMTuH$1dIoABmlVmIdE9Q(7oZ(U zix89gsdi0f&#(m+tQz)yeF`M(tgL<-38YmK;(bOcaPS*i!$T(jFLCZ}!oCsc-)@4t2f-l8sx5$=T%YPF4^& zfsi_|7R&O!a&tK23}kfWVRJa_=4p$k1U~&n_<=hlK6zXd!LG3}%7E71owV&?97X?n zi)Qt}=Euf&AP#{Ne#Vk#Jwec2_75n3?0m~h`rSfO=ew8@q1iscFN)-#9kU>TElRm( zC~G1Amj?wR%*yu3YP)ZQ53C_?bxVP5bE`V|{TCqA*NcAWn2$X9l<5K8JD6^5@y^bY zt+ejnRIIyL_HLtX9@T$dxIk!Td~mq}Swv~Ox9niv)3D2ZvFG`6TA-n2HiGnoh5Fj= z^kR+M+q0CKs)S0Pr}mhIE)TzCpU0uS@--}eiwETv;#wyIr~4x;zPR2vKsYmEelv~! zYM*cQqi@yS3yikI7vxb3*_f#pVFP4C5f*cUu+>k=cgpW^ZP_S@Y-%oC`P63Mck!Wa z)AY(>fl42T_A=G%HL^`njk{=%zdZlH$eIiz_s16^pbb`%TFC^xr)c@`+}K9H?&-~k zaB*U24Be~k-B^cgg$70yebQn;Ohd1#kN0I(*c+_V6>Vx@KJS;Ke5wvthwm`PCAV{i z5?iJ3wpE(ch=!|ePeC|RLrM+sx8m^{l%u*rUKWIaiT2;?hpwM*p%;^~-x(;7hZ||t z-Ccxe8~q6ZL$uTn1;<$X-c&Da&Mf4U81EwsZG5#SoXdsZYZoUjbI((j4|wfhTKxsybGIVu4O`FOxJHs2o~ zWqCOXh=R4MbcO8e=$jZea=NXS}}jkj6FOdeUxLnJqa!E^hf?MdvU7x7n?1^ z0CoE#FgCad7+iyW`|M;|)OS(j1RO~<`}6&;CuTM>O;J;439^2?gihG7r+;_+#W+Ux z=|dTTHxB&B_=tA3ivH-m^F&{ab1T25+S!5S{i>ZW?~~f zJ#e=55$KU_j&FsZHSVLSQhsFW#4RK%?~hx};Usv2>) zEw5+a&{(uB@FaFCF2>4A&|*5#%LGfZ@#&WR(y6w+0BdovTW^9|L!!*x8mU?B+VaFW zj>1nqdFSL=s@LTE?vl4bM-sQ1WFPWuHTKwV4bm45#ilI=qHNR3F38JgDQybWOR1u}vR++iOGC9}(k~x{jXOKbU|??`G}SmSli^yK?iFDcZ8!Wv zcjV?%6Szi@DAyV94dhv(t5E_kji!Tztpbb?XFitE!}(#sN`N z!jg$8foRMp)z=y&X80eH&3Qa9_otsDZQ(XstqZoZ)LPm`5t7|d4PH!cQE!UqbZ9QD z=ZX-v-g%Hzu^mIv{+<2d_vm^GU()?A03T3CM^3O>QD98A!s!Es73tB6(dcnz^ z3WXi~i5ndm&*N|YLWf7IGNZeIeth+U@&*@UJOwN~O z^ytS&_2V7nN0O?DP1>f=q3ws`VFkm#Qh}u+ERUbr*^)eHp)~9);YjmzEc&T@=_}b* zq~SP+5e4sd42oq%-K0zS>GI&R(d+U|U37F0OX$i?da%A#NVxgu7u;JN6G60H?<_U* zIt4wNPW7UPl|E@Bd>MMoJ^2^vQnr0nL$O3PSiNX0)7d0Lds+H|YQP8^Y=Nw{i56Ja zwH%j@uZj$?$J{Uq0(0kbug8oe`^-9!=yu6Yl*p9e*qKVe)Xq5L|7B{suelECh+Eys z?dCVZu6L%sR@1JjcSxhwEt05Sg!#jTjjXH;HG#u=Yt85~j2Nj6#2;J|yuVNb<;Dr@$Bfc6 z(aU_f$yeQ0M!&@f?N2)Si#b`O=|ioF;7(!Xp4F-5%F*!l(eKyaAN!SoF>PAq9{jbv z{eNoNKmkp^INAT7G0mp6s~i?CoxPg;+i9Ezk`6>XK%>a9|MD|(9LLRm)0_jm1g>W{ z|JyA?u&f!e&{Ka(gdmtBoOz%yppN(74ouG9z-TJq7W|J>adspSKuVtt0&dO!xF5#| zSAjd%RtoT%vn5uYb~sFa?$aQH)L;|-ISMrABTDbhB{9gS)B`u5{=ysrfYbi!tIC*xxXP5sX^ z-dE>q@`#i6I(1FjeMOv?z!zN&N!v=qZ?!gizIA$x+V*PX?eiYA*`_%&{VBb$zjzgp zk#K1iDKYB9Yu$@(K_-HtZrf0O7oo@gUYz=Vi?K*R=ODPTp}E z&p3RKjC-;5@_O^9a5d`J_qc;*)^O?bsS$`#+}lJo6Q{V!rQOwwml!Ie7Fl<8qVikS zo1UJn?MnbRb!2k(bDaX*tN+t+X6%jxHrSgvTKmdW&&{~=nbo1zJB-8dq#R0)59BgLvmZD ziI$Fnqx{IOiFh`2+@+>#Tv3j3y34NHG+4WzHWDqOh|k#llF$Av({0lLdH6D=kx^Gt z4||y0)3>7hy$kAEhx!PNBz`scB;V2*piMl869P%wsR2 zwjgwOM}Zec3s#J7!1VQsmg@^wPD*-{a&0=kP^wt;0decm#1aaD>sdkZzvOteQM*5o zr@5kPUD3w_{$s7X2!xcW**4;kCbhjmE37WPG8*6!t&khG4tAxhP%s;tMJ3^)DeHUhB z5^g6tZCDS99*Z7saS}rhr+n0I5XkAf#OOgND>h!Kh*|$jOEBzaN`!4nNU_a^XAuut zAAN!{J+qJnsn>TNr$jioUWBBwU09o*jAf1-Teuuv$nl4f##BI2aIXyu0-8 zkVOv}Bw?Z6Tv?@6hFHM%M>&s6Yk}l^TyG~Nr#0;^bWZ;4$$BebVQ*ZjntsA&I`gj^ z^{#Z&c}JjVA2Z`P7>4_rl5U#0rnt?=8O;Gc`2zD)UPI7-WH~c==Kvt`3{6x4?6}21L5GZVDHa`8nL>A;FAb884RXW_qt{BpM@S2AoKGQFM>*}8{iPmiv`*2w z2E~O0>k<7t#bGTwdsIzI`%^XTDg~9`)Y&BSDQ8-|HmI={j138i!8f=NyNET@*XQfo z%j$V)KXi#wFZm&n@{mXeq+=k#m9~_Q-=C@hWwuG#Kc(z0h?A^~?Fil~6larfECgW) z;V?1v#l6`8MRB!E6jgwA%T{3)*p2kwg^jh1(Nok%w(_0~HA19?jIUG~R?ucylzhc* z$+nf@R~nkf_aL54jTZeZ9^1X$+Uhw=(ry%3&&nOeL9Z(^6-wixg07EtX%v0WZ0m>t z)1WjHBR70VBin;rz7YaR!E#hoppe*k9*k^ols$2_+SA$V$Rb7sfM3h&$(Vf=LAH}91aIk>dYMke)6tvQX z46 zkCgpl)<2aJfYf{w)>v|c@bPXe!|!4e;k(|MJ;BIM zH(K1V8LF&c&60#B4Xw9asN^l&oOvGvf=9)dh0jlYbvhW3K3y%MvXI8~a92mY)o6;i zR2$IbaF%ZKPMvw$2fr*u;P&fxjgRt|rmf_G?&I^fX_1f3Rm^am;6eYae9ExLJpPV} z(I^X{3d~WR8*0gG z8**-mLC*FYv z=#?)J{MqEIIG*~}v*Yl-Kl<5F&_1qwq5rUx+nOV>>GsC2s)*H)i(%7PwN}-I^3_qD z+mF6H$QFOnLkFPOZ~@e=kUpoZ+t2fk3?m3UzVbWU|TEHTvS_eRnyATo)FT&aZ zzn=#=AZF{SjotB4)S4Vy!=;XFcbB*g$FW9^`c>vxioY$boz?kt&Sr}c*>hjwUT5znru(g@tX0k0+D)Cp%KC3{t!=utdNCoiHWX@y}g3g@RU^kI9-8(<&EGY^kI3Q0gmzr zJ1|CTE;j~tyA;_1%7)eF`db0jjRQqc+$ia_KBrKx{6Ri)hY6|io$ffmWy%i-S(>KQ zk<)+veq&H69|@?FP#GcbP+mxRS5k$#UtjV__PYK@F%`slo1dQ-_^|N9DmjT^F0~a& zTO#ku$iXkYf6I&=Cky$ri*T<>rEBY_T?_xv%(}>WKTIr${Sn^FER)?mQ>E-aPt)1~ z0OkPl;m~+`SHjU*0*!{rR@yWP49)Or0+0IxDITIMaxNkfUG{18()zF}zUYHpYxOXq zp|und0CfXF-VN-;znhwUppQhu4B)DvgRT~JfL6? z?CFkH`L*b-C$mVM2nV&FqB1DF zscC4wmF@aTd^8NVH49%&o}0J-cH^&}2=%hnQC*qYpo$_+!6>OtpW~`mUX+hy(ZO}T zOfjGyGsTk)euhj|JiiyJaBC(b(#SbM zvu7um|6)#|=LL`ScczM7UxIB5Rl2jzeQIv!Rh2X;dasmow-9^* zc5e9Y%965L5k1xE?w430EQ_{z*~G-ur*_7Pi621|eMeqi>mh`z1<${ASM(`CIwXd; z5?tR4nt|;08qK zrrKTzsXheZ0IvPdC+4~3*v=MhYTryAFgECZTe6l@b8Dr7|7zMo@AH4d>L2He z^krTx%QAA^=)pe}{8obo@q2qbAu1i>TKxfBKNev0L?x{Y`ZMRO0;BvZDq3_RC+?m;?Yf@-Vj$&) zE4e&YmLb3xCWR?Ny(lR!{6*VAiZgjVQKp@GP#|Xixv&=-0vwm#EZx2f3#VOBQGoi* z#Q!DUX~1i=P2#0qyXT)}f%4wS4eeVr1$7kX1&wdeqqFCx!V7II+8;!^nOJlymH!E^ zN~-$tvB2ZW%8bRGo4S(ZpKP^bYB?=9$Y*ErN&j|y?T$k_Hi5tF6KJxgkejXjLYLMA z!&KN55RO~jp-7$&qRywGiH1iYvw><^r`5VbeA-oOzjbz1E|#c13H1CUb*_=t0aCoI zB9Mdci8mM_P#m;FXl$Yw=2K64^iA)_h<9qMNmz=pXq@(ZHj=g$TkM_O29GWBUGK;Q z3T=K$Sd9A{VeFVVll0bP>Trrzh-eM+C4tCj1ZZ4~pc89qG5UE!KN6#@AQ`C)XkRGNAe&sRbm)YCY zhf(=}!AbP_#CCWcMZY&xDGX_6Z)koZSZ-0vSGk{!^6gQIa?EugdKQ$UYHTR6)IisX!IFQ>Hoc#}&GX zC^9iUtJ7U^`EeuU?$~9*uzMnD`_$LB2~pISrMU@y=)2AQBb}2>S~4}_&pR~FTskR{ zlu*)F+lOA&30_!C%Lt>r-=~k{|2ce=YLe$eZhbTC!zbF`oT1R5%N=Q|5Bg6r=KB5I z{LNmH+PR}IhF@jlqRMQn7d4&%;{DtIti-;zk$#%sb^%hLq1OI~mte+==&WICiNRNt zciV#vshHomo<;t1BDj7(D4nJn+$XtM8gk|KF~`FV{&=4{r&f;_j?%AKi6+p{c}RhsI1eGUd zfN`)(FRJnux15muy0K!~C(NS;Ba*Xt(sR)3HT=;=b{GHNl?Z`0$WxXyCZt(@2&st_0Q<9TF;6e3Bkk)YiU>M{~zsLYgAKL7EYJiRxHI4DGDMk z9YCPK>Hx(WC5{Rffr5kpq687-l}e(3F@%@aB4WW+#Q=eTM2V6FFk(r0B|cGk1;h|} zBta1pc?8Wj*uWLyV3Vkj>g%7IhxD0%-{(KE@3} zcb%RU`Q${M^_>Kps8KL5sx$Ov9Tih^FuTqRMnWwLZm8(3MM$p<{&D(EsayJ=Zm+6N zvlopCLq!3qrl45#9qs$Mb9AR+@O*_{%G+s;E2F7pf0mhO#E{7-b0v}oej{p99&$JYU^RDQVivitAW(WLmiS8G#{($KRR zt`F6Y+IH;9fb|EJCAVzAH{4iMTw$;xlzJY}eLq{Y;2f}PtZdywdmiQ=xF#|6R{+`N z9)F*z^qAZWP+2KKv3d1`MxC#?Z+rYnTO!#_eik+?M#m~Gw*>TKGb5fpZq6r4vP7v% zOxjq_ES58xoU2u%UH>|!k-n)oc5>jnaCNx2FloOTpys|$e3i`3uoqOE-mZ96Lek_hjXYn-(0a6`|-ToPk|?2ey71SF3Acx^1EttJKHrJXE|fE2WW zAuxNyw@}DVXrAKg!#AbEmk~kvK{`c5Xn)&zo7Dc2Nc6t2%4+HygC#1j-%2O>kMHG- zl-aijZ>bs{IA$6lI=SGzCrSx7>k%gWlKp6q=)x5 zH{aIfYy^E?`Kz)2H_NkhBMmD4AX_^%>z4L{R-1CkRy!9s zuDegVxI#hxT~wEsjO={msea%*0|G*(8AJX4N=LlJGZi06A{>Rt_^Wj7#`;quq^~iN zOO7pwRYLMf(&cY~IM68Jr|sW#?%KuL;)`Y^<*>EL;SZRdMdU=Q0sJsKFn;XEYzg9o zsEr$LZZ@OowevV$6IdPGm~q@kzsU7$v9uj-5V9n(NmJ_Elj!GN;^DrRK)&XCFjAkR z6Bd4BF>L5{O=4`j3tElU`Qpt%LEWn94AiG)7C>LR^TZey;g}UvEIwv z4efKmx@GL@@)}-UpvLr$s^%(?GeIVo-dE zu#NteVs@$FePC}9#`BHYmtY=tto)F3h54M%M$&9sq}VV)TnJ#UO>SwE6S4sXA9%3P z`9~A=<0FA(FvlpUrUm=?=*boFdy2JXo_mBJJY#F3|ifk!=kxnh~Bsq^109=0yZ$zr9_rE|C25W>AXC2SL8{cvJ)ielYhWV2+#1umr-XHdPCjj5dfDq&$?jz+I5 zH%zKtRrat$DwgQy;Mtw;YLolUSh}F-bzZoq$e3s5XF{{1HfQsrI}!N)1Jqsb>H78j z|7JMZ%cl3wN&edw?20T|7CJXeQaS7|7FY|;%+9M|FZf(%m4F1dCJ*_ z-5-nr7*Ef4ky$p{AMcR-1Jys4g2~~!$;)nln*WSR2Vxuf_qoor$MIe_!J zo9RCXWC{Nt|G`o=D1m?%YyiOm>!7T{qE8b4OpzT97Zuy+fq_f$NKb;t?kg@MqN-RG;;KZwYVoxUh zp@Z3SZANVkf)D$x?e-hp<6Ecc`{J59=(;-hiO+_fZf^9sCw;5w_=3 zX=5TA9CDVjbT8=EnEMWuW<4YmGthaT#=4+#(}>Y@HWec75D$_8_Mn!v#NTCYj9uOA!Rpv9brQx?!i`*}b{eTkVKuYR{D*f^@SJZArvS8wQ{o+q$yKv`rEbSBtx;UelNMdN0Hm&yR(HDr1XPdsq>$?Z> zeSPOH6&?Sjw_pn+&(>E+X5yIQU8N?uW;;~8?QiP)hn0cWQWpyx^WxoovvR={vo44h}ZZ|Qx>Rq$pBX5K>9~ScqYVaa-NDF6+t$#R89{c8UALqcgy9`lc z<1ka_SD4cu2#JY5DtWypwMGX`+G0tSUd=Tc&QV}3fd9!?Z$2Vf|W!D8U4Qp+sx;>;F?vK$4Q#KV(UX}Fg_)SA~VJ-(LLA_|I9 zgI|NebhbLk0t-6vhpWn(5HZ_Si^CN$u94hOQ3&u~*-d4c2sC?9KCcec7F_(UWcJZD zp`hV8a8J2y3)#Q>Idh2)n+ZOH#J0qfHFf92=h}1b@@oj&Af=Nn3m24Rz4MlBA1dqe z*(0fIDrz>ubl{ifvt>OL^By+X>`8`WC%#s>T3oLR^>*7tP~RaLb^s#uB;#KCLtWGw zQf*0DZ}sb5t*qw0!caka#XPN&;jBTVJ(k?s=>Ckk*{bqVEgL6gkecc6?5( z;lo=fsqniN)AGw~&?h#)$k+1sr*4zFWFPx4C0%;asA%_V-k5oQoj9&!kynzH`kg@7 zo!)z;ze?ivcCSQ{nTO9@HmmnP8LS7rM&x1x*Pg=evFH_rf!#N_7?Fs8DJoVORs9Fu zeOA9KeB==jeXJ^-IaLM)y+9ZWQ3n)Nec?B52E-^4Lv5=aW|W=k?_U8DKRI z$7hUJea1qdgrO2OnU{>tR2n|ZVn`Ks2;ozF5Lx&3i(47G(hyLPEAgNfxB4^|HE_F2a|W6Ot+kvZR+@iX>u$)SW~V2 zJv>u1=HQOV@-=zTn0wW(x|9oVM1%ADlbhw+U6IKqTD>AyeB<;>%_6p}8Emf2#a z-s%2DW9$z~a4L}0<5t~%T=e`3`=pf4a{U{pX@g#WNT#-ad6zefb$0I$WA4_SOXu}7 z)?1{zAW{Lsmgcb`bntPBmupGL;_C%+ay}ku3ky>#tLWy6*$Y3>z#2ZRL zbLZU^Jx}q4rczY#XZGcgp)$X^`u7ZxTBwcG?`mBW;b^qsw$AnV!J1z&b%lV-xg5aR zv^?9$Y1*G}a%0T#$)P6Ph6?q$RMs-o#4E6nhi2l6ujVuT=rI{NhhZ{9&UxlLISzGX z>jIT%Af;#Rq?gnJibdw3I9YijeW(PJsMvQg2~U_rO~Eg&OZ4O1P{$23&t9By>D;5|BUxm zEpPW6$<@Z*sHwRVKXwrcNf3t?(ypcg_q>eh(J5B)u{eHgmPDSlk^!VlKk_s&ysxm! zR1{k;iN(Th>re9wZBOPHQGT83_wnYr*OH$K*GeqQ^2GW8v*#yn?e`e$@qHv_gCMU9 z2#HKm9gv61MRHY27%rfKLuf|aM9mz^TFS0kELtZkSp{y%u?^Nbk57n!To1{1?{2j0 z=Tmo8Zc;WWxTqV(X#XmmUK8?SN0hIx7Y;gQ=cNywi|D-SXq}`*UhPZ$&E+m7BNJ@s zLu}n70YNm+rfx1#Rd!Uynkp&5DtkR> zMm1^3=h~hi?JEA6jls;fgEEImxZ6r@gqcp}lC~7m!OMhe5vj<+7Yl=z(`xeyA?VDV z$|?s~L99}!fDLN#!n+^QaX(BOy)01Cc1eyF5{b6k$dr<(S1M*Nnq}@JVk_)*^g^tF zd9j(q#4aBQawxl$)!^)!4vM_nRYe2ZYE-k?#53xTp_xlJf21FEudfWf@72Kzr&{Eh z2giyJy@4orZjdl!Ckpxa88xRnq22Zx>%kn|Tpgy$klZV|K|yaGCiK_j zGU)OdoF5MG?o7V~n#Q)0dl&^>nr*rN+3W;`eZjVQ&C0c8O8&SfYJc*2jA47Mz^`Kp z-0)ju^Q=S&-q4{!nr6+SokWea-}TYL;!_Ceqq+CN%*1#kfKtJpgCpeP{ofX|dB)5w ziF)v(b>Y_RD{Y^qFQT=|+rpb@YHdkMZx1EfeY=h>$W$1GUa!!hV@d!yep7<55vhvU zD$LQygT&)2iT`@&uOBfjP;6n4IhY+592)tPN>LQGwYB@FZ<69bWp!f!1y=J5O4(~R zkq0tT<`QuORx0tjL}MykD>)~TpWF+mo;XhX{hUSh1mgW)CuU|}Xtt&CGN9uxrwJF8 z=yB2x`~tXkiWm?i4B0{lA`^_K8nQAP0zhs~x#Qq8P{L#W+ewDwF(Fni#q0o z!XLos1pPZOWf&X4nNT0Xj z{&bHPElL2}5f->!q)v7cgty7<$2L5*FD4V}mc!4jj{8M|MF%)9Br+&%pi1`CGkd$2 z*W$b$?no;hAtkEPNI7zT$@8-0fMYY=U1m%MuM`E1tepBX>JWEcwDrN^^^rvq=G~$r zvveVe6Q5xv&IkH-%CQTT!6Du|BzbZ6U?=w3K&&Mq*o zg`DSlam|8SkxO(&y5)r*NWIJm2x*#q|5cned@>3Iq9OWqCF86aO_bHbKglc8$1a`a z>WsNb^0Q?z;x4l3qQ(LGtB~4zSAh=$7{^7T<*p zQo0-(I-*;!QkKY6t`f0{Xp1TAd&AN`-b*Y;(^OS7^fdXrpn?D&6NK7vB5=zHQ|)+# zVAjQw<-X9uk8+Z;d#_!3aLszeG3%ywK7?^~f)Qn&YD9sZ{gj|>$^`hen4QVfdi|i!jQN4~FY^dUgoi|}d7!=c@8j3INMLzVtG3#}fYGczs zZ{H5we1%MU!EzRBsJI&ebo{>~+We93&OpW%X zEAfFvj`G0%yxaOxgnfjAHkhN0&|85Y{=*q3JJ#LenNORZg{@O|_AKPQ#T7oj46JOB zK>Pah#Axlp>g`T2{EJ_G?$`V0X_GV0&$;-O>pR$hEzNqi7i5Ir_l0LY)`{X4e4?^@B zY4jKbsSm;61jyS_^h1kdXos4!gV=ZVQohHKH)`xdPJlM+Gt}%skdFM(t+8m_-CkvT zbW-bZ_jug9kI?tB^ZUIWixHKgEO2u3N1$|dF4cwI#cC`{jZj-NiHv;i;7uM2VP-AX z*hjiz9yyjFeVfnYS%XfInmGVYKvT&+pNLXb7n4txNVeH0(-zQf>cBts6b&k&87lAX znxH9;yh4_q;9RJZ2s^Z6`ZQxwU4$@rD+#Ub&|4$jQ$51h-`=yKxpIO!;RFJd`9oLa z`mt#1SHmtt3<*l>kLVUhp;({P#u-pTBf0d>jalYKMo zH(nAu{+LQB-^4#~Ws>n-nNU2lh&!r)s()i`IXwwUpoEH76lCaF`83mtylXoOo9Oa+ z6O_C%XTyfPkWVzDP#Rtj4zKn>lQtBxdVKJ+9L^Os#$Rc`F69C;px;m|qIK=%Pcx&z zq0K7W55O(CgWKc_R-q?P(RaC_;|frE%~wuzPRQiwP>mMl6P!KL2Q}9ZFG*qEv%y%sl7ngk6_TY1dkrE`>yq%Ox zezxlV5mQ{-0_PZ;YF_4(WvCqo`*e8=QpxZ76zTb&ST#pO{_j`DB}qXV$9G*2NQ3-J zVqqCFQlCWf|3nC)-x1hJYWA#&j9)j-Ji*J4E_FebhX_s5Fk;D%&9m0Rit}k4PT7M% z38gqcy2+7f*H6p!*aM=8Y!GlLa_wPe_zzx}^|X0AGIecN}< z#J2Fx=cDC4_~?2rLnK)==HXmWk`p;&&4WwvAI8nC&$A)*nadNaTb*pd z86xs(;_Kh73&0tJfk3!`zjM>zT8|bzkGh=)d*y1#P;kILi_Y!W*z8vJLC|dH-pp3N zc<^ClCauXp`Jc+ekU(L|>{J*$6mwi# zX-QOa+8%d*sXS=Jt(h_mdbZVm7*>UrR=(GnljRuQcy|4!!aBhT-q!` zOMA--5g<_}Y}_=q^1f^NG$7<${nd#h+f3SnOn*%*$u7=efGZWP_-&WeE3^LRsPunJE z(Jp6;-}!@r9%-IC{dz3C>v$Ukl+8=^eJs*BO};S7lHn~_B#x~V!S|GE?-)hvdA#lF z+1-mB#J!u}87(8xH2yQg;u}H0Ou*V^%^*$o zbkAaN;@9J%6W4ryzL@FN3%ezE{a9ztS4SxL>-9&Jv^l4_G;Sz3Y#5*foS{~HA(?ph zoiOkIdZH1BYQnDtAFq+(9RcX1RwaP631YZOVNCZ6BwXcwQhY)I8+Mx;wM{gD7^FwC zhZ~m|(-}=a~D20bs(&tp5 zq{5E-{N`Li(6oxOIhR*IPxUQkmWkM8iZVES5<(!tr-Eu;SSENWz5`BwBROzId87R8 z34f!ZcMqR}%RlR000OPDJMVDk5Q;{#_W5&t-0tK!dhJ|uxyn4{BqdH{XhEAlC`aSu zPbfg-lDj+69$DH^)n?Opr~hFJ$LtfTgul9=RgjXs$LrwDz2KtA{qls9K%mogT0O<^8f#bi?w=WjV%C5& zk9KjIPogp45z6?OK=1m`a`b-t57L5meDEO5c>>rDSGdNqz9&(9{L=Ci^G`b`oVlz>wv|?)GS#aP&AQ=FNUG-j{OVX5K@KKKzrcAi5 za1I5J>0kUC+dxneQD%bMvBb@W^JvNEuC$4MAvsUv^@(O*a-C+__?^vYoJS$R%trm~ zp<(!Pjcof{X1YD$6G-RZF!pANX>y( zDW?~pvvm{MXJ1nB3bjsn9mSe+aWEEjCMFjt0O(sGusdOxmHp=n@8yuAw-BIgheioW zbFGC@_xJoj-|MAarU7jY)cz7?7|x=J;lNKjC03!`uM?Bg--hnjE)#IWrJ&-Oe3om8U{tCNwL~Ur)nl6D^Vyfxw;F;&MtP>7qry_nikACRgsx-*C|~+(L07Vm;n@6GDMzm{wQH6#(HA%43(Lzs105-=kET|TV_TeLZwIGinWQrf zP!_FDu3Yz=D(WcpQqh&`E#iY5Pg@tCrHUk}&Z^t-BBxdG7o&ZKxfD z|3=l3ZzbX7;^nbzR>gT}#b9XOES=vX^9RPF+NP<#nH~Wl0ub5OuE$SX@5K*BNkNrt zUwF1(BlY#mASgy{O~Nbdf^w`1v}r7g@ZV;?*V1x|72r*nTyK#X@i%P;(HSNQ$8~kS zU|;GUN)08Jy<0ddTyOV*C=IFNP=n z(xx0Mo_UhDVvLnyDX)U+B4A-WnLkkB$@pp{jN-L!_V^49F1_RsA`ULs)={C6ANvcZ zx|FJ$D5T8j4C^*RQpP!oZK~c(jr_H_dp%3Rxjov{kSR|ELJXnsGRU z^BN#?ej&UZI9$9IBSPc+0+N|UjxcH>f3wJkAQ!n$eGWfn{!v!M{Yw<5Aekbt##tW% zYM|=FolF^0`6YB<(Hm{04jR9IW@TAe;i9W39jgqGA}tf z33fN^U*`OlF{V+=#ocw`ghZ?#C*DSCF~1?UNm2&;YLFJb;#WczI~U-$f>~>0uUsEY z`na>i5=`Zqy&KMR;Beo{G3~MZXLamCu~FY%J;R*tv>41!!V`LRSjKYRFQ1kZ zeYVrOSbTu>=<})c>Jd6mIm^6`x4-zlK6|(wqmI(ms7+_Vi>6_vA)G+`*7eO@!qeI8 z`crE!N!mp2V0OCR(1aL48cFY6rHVI=!5J2RxIiYszcBbw4^)DGGu4QXlja2fA4x|3 zugPAT#r3ZA`jy<;g21I7DM?W`q<>u(i%w(vc zZP)arEFJ)Bbj_bbw;vwMYw@3|Y@<$>5C~WULap*IP*5-$keW7b3qY^3N-Xc5lCVA= z4Wh2x#_vpNdox?X(lbZE)D?O!rJ}9uPfM;JL`%WayNMNVIOyMdZ6%3m!!O}s@+hYE zwzO*sD>2)58GVD>yDyQNiYnzl(x9V{)l|cTCO%$++Hb+O{PlbLWq@-Swz2x>s^Gn?9kB>_bywwa!njcPTEV*{>#hC$ zu-)b`4mS2*!q7#|LxeAgw!Y=W{KDQyf2v}VZ=l)*@m#mzO(KwlOp1=y2>v^0TLJY)+EoAjxxbUN%))(dKba)Klfs-d)4LqK+|g6E+rmI z0)E&;C%o;se)ku775uH>QLZ0+)#rLn;e~akzk;<3w`# zO0MruwQt0vU5gS%?)ft6yIGyKik8;*VDhgho}QiqqoWdTZuK}0gCFG}z@nm}Yo~?8 z<7x4dxOXKR)=?k@{g4yWkni8~$+}DF*}gUsksPE>h&TxD0FFV|)9h(&M)#gvBDzAA zcy*U#e0=5YsV`Qr`BJq{wjbJq`>zENcbej>83`JfbF*>C>_3DxJu~K8UkO}DT;f9% z_bua**|BiYN`m_YAIAeIAr016dhEF6OO1uKv-3)g7(`+mjK8ZoX_wN=9>?0{$6k|u_ABWP6 z_@b1=6OR|(Vb-@y`g)IClh9Qh*1tE`AZ7~NpY)|)nWO0LOe}3QUlC|zB?0qBlt*Qs zjApJ^7>EWzu_D^#0nkkaI#$;#=lN?AgzI0juk{ssTGGvX*f@b^F~D?nLn+8%)EHM< zrG)ek{Xnz=MLh*%i0>4xb$&N*FyC3O#Kb~b`aoyPa#EQ1Sp?7gsrL6hO!NI$t z-!^our6m#o)foeNAa5Yzo-BC-x|tBq%Y>KyQz(u%gU1En&37Wp&NPMhE@Jo`0)&21 z&|>FBVswMJM@mN7^@iT7+F0!OkxS7#4W&5nlryF^&>{%dJ8tN~SFAG4d^p;c3yH8= zlz)(0Ehj?xl|v+Vu5f8DG2_JeYiA&u9w|ADQMsjw2$}URpJ{|xxEA%5Gl%l=0p@`v zT+&>VSFy+0TRxD@8ZMAKIwr2JlLnfdXXnzIimsoH2&>xZXl8#sw=WuSaTsG+p*j}~ zyfN@pPQH^>ycA)5@bz}o7dT4gL@p|#PZIXxdEBdbL<8R>fzX^+-i|Df7ftpXyQ#%0O(sM`XPS_gKvVPt5`)Y7Qw*1`rYa(-k#eN|eOcBtZp;Jz zJYTUMkwu`v``e{}*xQk$W;gO9=G4mFkvLIK>`5}_=Uq&bsHvvikZ499K+W`OR{?s3 z_gohR=;$&KxU!CJAw(%)HzlO0p$<7{l(KM2XC-=~^8G78w2+LYU1t3q_xMHDmwu=h z^#*dQU{UCv)mrgn`2C{9!EP=LSnt!9Xk@ zY6H}26EB++aSQK1i}R1F+*ZS3C-XT%Lbr7{bSz0x1r!g&k5x;MxdT(!!Y%3JZh>eI zY_Y{*Lo}^W_Yy-WSu-aPs2yD=V4i$pN;~2{7Qs-0;d(dY`*dvSas=-^=5w2-|5Kv3 z5?t)<_~Ji39QH|dOy9l&-}ugKT!(>}XB@WXxOxXeSW!7bwh!O9XxMk~28>Ev|3 z+FrcEMWXGjqJ(M9vbZP$vfiLPtvVr+E5d|c-U*CEJtjHH*Q(WFDvzq1krv46H>9JO zrCKlpOu2fD?NmX>$t~`9Ho2x^VjI~?Y61Vlacv~gVclj-5;uzON+=RFW-GG$+)wW& zEsbqQBD!KYew0c#)6GK71DJL0r`1mqTCvEVA^-|2$>jwjlQF!-K86MbcZbCRMwyHK zxI^a5_qHI3=^NhG_wC}tgV=!Hy)6a2s*LpU#po|JtS&9`U2!hah|Vv6u$M=WqnDk( zA39!ZkR1)0)pfkjJQVd^<)p=WwT;=>jG<0zygLc)jl`>7&AlvHDyWSVt7OHtaAvIR zw|P{aG_U|m2t}z2jWbPF=;-_5HEo>SvdNuWM;SAw3`!~%k&QjX+`bjjwOI{R z&!Na`t3UWT;47b1K}|6=lY0(wnhw)V=*4tlAUK&`jURrDfFW()-dW1dq*!^hlUdfB zDlg(45K0^_7J(9cy>dUJ)!TVYx}OR)OXfd~joq?YORW6*m~>J0%e3)BeP@4x;BoLO zc?a^c*JRsW=E)Sr?D~?DZ=h(~nf*0v&c5R+wPE74o1k)=qIh!V+D8qKU^ArENa)6p zZQyoClY$#sy6Qk{B|!nTIAaed2Gb6%&49#*ewB4LO_@kc*I*u~7R(WftbL4h_0Han zJD)+6?idYW<5{J9&i%j{-dCUm#};gCAN-MfHfu$8;)SbhMVB{B8;1F=VqIOO!yDg{ znFY->;_Pj@SSD{6QfMEAE2!T1)05#&Hqlk`Wyac@*GfF08Q~Hnw)KR(<`Mwn~;sZb)?!J2uMlEg8$CWzF}1 zix|evZwzI%GDlu= z5H?^C(ECkiKP%vC%var{g*wbJ+`Hd+1sWeCo6mDmo56%JF&67%k9!$XxXo1HBI}5;Gx zoE(wvV8Sj-#hW&{Y;ve)Hdf}G-K(IZU#@GW(z}Jn?!Kl4UX~cTQV;012k$W4?ZskX z6LzrEiYtdJOf}|F@zAt>rtVO6Rtf%OMB$JkyAkN6bad<)N2* zmYXG{ecVOyp~bpjodI_|UOlwg)~<0`p^$M@gM3pJqF>~L`di5w*XNsfj;PbM%XM!@ z2fOAuLB_=ut($G>CqKYcEt{N(uoFO*(|aFuKm_5odFl!FxC5A=@&cbOn7CN0vhKa>n`nxI~HrDB-lJD#x%1 zFPYK3$2}mR2nDeQhy>tJjX05$b;BH=p0kz>MbylNgA$&q=xfAj$;pIUkt8E#hsYVp1jV6Cp967=AYJUT9s)~01&&3226qacP56;u9NQmw1mrN!z? zb}k+AvpPSfc{?)JQQRl3Ng9xY#W~$XBcKw-8F%L~kh~(J zt|^=qTFv)(04~uicX2*W>g9Hd4UBE`m0B)64KAApcu&p|`pMagkni7*gtT3w%MFZ& zOp-uZ_SK84tAvNeQey`;ar-55EKMpIF@99rfh)PJpdF_IoELdzb7Wx=-2m1@adi!1 zj>E?=(@^W(b?s!oxKqA6_KhU4Nh&M~*uw#jAGSFq+;$9b&Zc(cXhYfY$~H!vt| zv5v0&MV+-R-2x0AhCG1%dYr&mLIDHqbPg27^C}S5uE7j=E!d5GPmqIzXW#sXN>b@i zTs-3Ii3%iUPs0AUW-LKT-6S$TP-52tt*A8?-o$a6wFIf!^M*>`oyHAa5V3<$uBFWv2yKhyu=m?g}=ok|B-*_{x=Gir7%td^NA&|;k_0wCN z9_s!5DBBYq^8s>*e@c4#qT~B=w+t(n&Ah4aMUUz4;?((#IyJga6>i zJ5jAN!;|AO;Z`>K#W#Vzq^5bKq&oLIXtwTCt$jHvIc(aD-daPzry7Y;Fb@PSVB22{ z$>i@D=dhY!0q2)nUkiNa=?8Dm@>XKi-8^3Wm;oMg+)uU**%DBXpiu@0PJTKG4%>LJ zDSeZkQU;++^wmzVNcz&4^?Sj zZWoK)z1GH4QEUTC>q=*`XF&B{1Oiv}E&dK(L=SR3GvM&3P*lCx3J?u%dqY0bT%G> zZntc-D;J&5R5Pv#d|;KmW%JI*#bB(7p=Z6eVtp@O5VXIx1Sam@fU}U}JP4E=pcjK? zK6f#Bf;@cKi!X<)#3&SPO5O~c&yR08nTPq-bVs~LGA3;ECQcW$j^<>&*7n;@{E|1Y zExL!l&v1K_eoWRs&8uW0Dx z&?Kds)fVq&0;<2I9{E9*eat2YA=3~~nhC=|kMN6^MX#ydqm@8Z`}(iaoKUivTCi%3 z`ACvTi~!~>DJq(KSaqrz#io0&p`2zQjmlVhtc^pbLQo<}ol(=5TDIZRGeX1J&M)8u zmCdK*=5qW=)XAZ3Bn8p%HAK&Lv>fQfKds6#F4tUA+@OP41YLLp3{(O>PI@X1Cb)YI zeVk;}M$RV~V_;O}uqj+%5+G?V(Hfe8HvN_!enS>B+6H-}+RAD-$v-so(X8mbm9)&~ z&s^Jfh3d0TM+~-&SwyjHjK?*jr{>zC@3FQ81u=Y*_0tHWALweJpZUr*7;`Cb@y!NB z!qRq2fa$7~^O0$x93u`?AdM_m0{Rh-qMfJ$`^0CUS@#5yfJ6pp*i2OXT8tEVXLf_W z#MMff*69Tmmp7bZ?G}Wj@3ozI(!76n9gGMh5`)6dz4$1jmg^hVmWFkT zlFTkB__5$)^o5p2%!w&p_aXN{jQC-Bc-Ha}Jc@o%vh6!vK(-1IF*B27H>l2@Tr(+8 z-$U1md?5vcGj1KI2rVrQ7Ined#b&Ja%@p%dw6$1!*~PSaLZ(&4#b=@#c}dq`)$J6Y z`I03G!qfmt0$raD$6)sk04o+7;>MftBy^_7D}hOPwj^(`m!IP>j{GP;&-paA|E>b^ zYNrUt;IvxRx}MpCEpFT)A4rsvbk+(cFO&%eR&TX&bw6Eqke!5g17;|rYs7+uBzYjX z5muHhgPT4`qs?P^G+GjPq%?F1ww{vjM$i&2QuX}U_t%KJm`tVfwC0$6heH}65!s*0!u2MYlqi1X-wDOm6Y9UHZv&i zYS9X4?yntSg2%Tedf(fDI}$bOyKB1;yT&X8bY14IcahcYu8r=?7|ak3YfYx6FeW6& zH=Ipm%LXXOi_3b}s8Uz3VREY7G12EK(5P#fjTq>VuWsLGKcZQl_0xTl1xn5fDfqRk z2dhIai8f)2^aRSBajqz(yMQ-^LkQ5NwXzsr>giDZes8s*L;p+A6}TCR;-Q`le79`B zxn%FPe&-{)uwv1L41dD0RS@k-ZArT}?{`0L+ieefx|iWBf6Cm1-Hm6iQMBuXxVt|- zi}LZTLaa;Pf3P=)yH-WD0!QVBrMx_vYWc(Z%Vi6J( zV*fu^%>15EZ@U}a(`mI`k{;^b3h`~`zYT5xoH6G|_U1|sq(o+VI8k&I@&q@lLB?2`Jqv>Lt;yvhqpwL2qG$xN(Fb-i~03Z5TWw zz}Z0Kac3l+#Qn9H1X-!*3>=Y;Py0$E*Rq@UB0Ye_Nt8)KR`QkGV5A=mM*2q}e~Dh^ zx6&3VHn6!Q;xBaWZ~qe6eL*GnlFZ*H{_8U4Vm?#@d({ z1o@tZ=Nz}^?7Y9`BRw50d^fkw?A(DQ9`h<`W>s&{QmIy)ZC=38FYrfOaizQJ9<2CO~6nxxQW=y{qQaeZ!`=E_h5PaPiNS`f zCZ}D-0`jW8uRmkERcGp|v*Cqi;!FQhJOl6f>*`05q;7nHx5}v8?j3aoyx^2HnxAR} zI7ILv-ZhQlrD6BWjg8}XillpesK1e8-*c1_4KOXfyvjZ!OlTMMCGMV+zqLB`1biBU zWtZhtBnGReUfs|dC4#|PybWc5q|=%Jck*`j!t*PWXZSom!D*0Od7I#Lvrmanib=9> zTouZr(i%lDlGR7~vY`oJvY)S1{vwwn|K^)=UUK+=66~*qB3+uQK%Ni|ELeue4n}&X zm92UqP&K3-*s4)m;4uAQf9;Y*lIcAWp)`IkhFZgRPO^s8{>s;#@OsVG`|BlvtOxhP z8NOumrQue(+26KnF6!Ye_^UZ<28$LpjtMh3s{`Q*N>?Y}!bGakrhL^Mi&60y4QvY( z)3|q1iu+kBhrg;F$aJOZvPy7CG>YGonVG*g&m;31yWRjeZNUP{wDL%Z>7)o>GCc1+ zrC8GS8)@<^TxOLbyLPBr2FGT;xS)AXoVUTmd#bDEWOSXw#Q*EF&XHXs>3+{@p}Kc9 zT2-wG8?)^7>0e}#af`E_f*0Mntq$F0$X6}KCOb8GF3ZtK7sLVdFpSTT3 zoZP#A{<>wQqu@al+4o9>%}MqC3Z?vlqGK)l>03iP?%X&O3Ep(Y=Dk67zhhp}>3&df z{op6;LDip+UX5?`n}D1H%7kDeYmJj6{))z3kbiWe*S*_MmYOw8zmV~6vA}?~!DL)) z-8VK@>o=!5$=9%GLtTt{mvraLl`*VidVF=!r+dQ zd|3M}!n+FNy#I9#j@LjXQC*q^tG{g5nCoiqe0Ia}ATs=!xYTnZE1zSY^7Lz>TOIx0 zbqema&p&bJR-URj4vwv&NJL9-d7v>Wgg7R@kH$IwYgja_>LKN(<5aD?35H4Xe!&Wx zKB@MbA`W`QW{Brw53~-mqKOF{FIC2hs246aMZ2@p71cy)nckQP3&5?lQZj<6Et~$E z*c%6*3Cc#Rt6vAI#^k*M;u&}Wwr?1#d?&41uPQ`4q~Hzfv5%PE#erIn@8o!ZF&8H% znd>7_?nd34)|DG!>z`(EZ-&EJ+tqeS>8T}t~S(?QqRf}S@8uYO`1Em=EBtH6$wOK#-fiz zcm~5=hm}Q90fM{yjih8JFWc~}st6%l49}WU39r2;KH%R3&rXV`Dzh*ao`Cz+OhX2mDG$U@vMdM?t%{3LgEwQ4kv5$J>4aHW%9e#ol{H zHPuD$gS<9gx{62#6#=Ce=}iSisUp1#NGKunB3-0OSCQU9S`r8ldKDr)bO<#dy@V=+ zKth@8`}@zVnJ=^E>wm4ur@Pk8y2(A~?0ueRKYQ=vW$^d^Mf_RJpN-Fyaj5TJa(O&0 zc_(Qi*V&YJFy2ltgZk69Z^er2u#D5$>XXzW5g67voV(yk)Aui(k@T}_R%yD_>uy-s z921~~I#r+r!__Z64o;9wllR4g+07zVJ(Y4wGByAq3GH9NdG0e)Gq~tHZUUKdeH6e8 z)We14JMlxk4^`6bWn(!YFU?CC9wS!>K^%^=%58`f<{xtUOOeKPP=UbaW-eFBnx%eH zFkQld&tDg)I~a+SQ@5&oZ!^J98lIk@@bRE$$+ldltG_$581GXumvs{q&W!r%$G@9a zN4wkKweZ3f6*=2BKdc<4H(9tRD}_*g zR{H@BcUpnNpDB}053-J4{)-G)3KX<7i>4vJQM?-%XP5Q9!v7sP)PShHuj{U^V^;!a zRh)}$6k{C)#SC@L$={i9qG45&oihl1BEf_)Swm(qaSYYoA1y&;_A|!p8B_`zS3w>v z)YI`Eac1;mT`_mKJhJ_sJ*Z<^&FEBQ+`Q^p$jF*J`-WffDr5Jr&;XnJ3&vxAm>;I! zzpaE8^A75Y&$F`S5bO8;{pzGMkK)i=F~Xam$kxEtJ^2$a`lR(#{0xsP9wy`+q&%_d z`F1k!Rei~Y!nf*;Whf0q{^!kGBkxPCFixy2@e$siUM5Idg>MKKewSR_mcWm6`@HKk z!#@nnX5jzT8_*;f{GA1~slBu}a^18w#JPSOkn(z-s?|zQ`;{`QJ_xrkjBn@G9;}WQ zJurCzW_M*D4yWq6V6zs;q2_N)e`Ba0&Bol(^Tx*NF;ueAi#MWbNsZH@^b&&@o1@&8 z;nfnUyMq$bJ`28w2J!>mh;Lz{SFFtE+mU`y>?${dZG+CAzHF&c$ZRcN3OhwVB zymURNU}aT9ey#F^?Vdez%2@My4eTvuShqBTEV52Ht(!wk`Kkb^E{EK-Sy6WWExNl#6*>o_FjW&W(uwy>7E0#`uO%e z^lkEQ=cYO}bJ0%<>A#1d0Sy#87aJ;O1kCn(*%s-m$*aWBkrnf~CfdgyD(m~M+r0Sy zOM3s%zsd}$r`M+%kh5S}kdcC_ti!c%XBx?DeHA*M&A>7VlTX{Hu{LbjAajvZ00g76 zU(X0{cx8uFEVO}wMS2xlvxzBo_Ti=Fn2I#V?BrSvI_!fsatK3|Co zrutsm*din|c33g#?uWIWpWhoV z$se1aOs6lmJU{0oNh~{sF*5zlc-S6(df1cv7M_Z6e5NLE-8N;9Qb4ZA`_WHXDu3R~ zHdOmsYo;J9!lhWCb--*sVXsK}dbdu7_%X=a?YG>cCA&A-37?0Q*NDTp7@r~v*q?J$ zRbWcv;&(=Y@tEs`mD!P?UMGsr&N*p7pQQNjnW(49M$vTdeB-XNZb{|k&4>IMWw|^f z2W90rh-8cO%LV)s$NO>@9;HD4ow~rl_QzvG`3~9lZehk^Y+j1EpXJLs9O6PtDk$>= zXq+Rts6na(k6eEv|1uK!)j?3d{3B;9;p37Vona{h%sYegTGZzaty_ZV(FhIOf;o2h zyAjimUwKb|Zz815b?v;4CWW#pe z@MV>X3i_K)0s~B}kn(R^YGg+QGfRhn+uWRf`ak{FUekAM`Y7PsrkTT0JEAk(TKDW& zYgf6Y`Z{0R==`uDYTQ#55g0&G3O0Y^?dw0JKEGMXDPeHWyoaY>dPy}*D%noL9RmVTLJy-dsE1L974;kAW=Za2>L@T3TWp+j6`8_LI4c9itkfvWs*s+K+#e3PM*4 z)KUwzTLiy`3hwpn4ZFKvQ$G8-0IH&dGRdgNyjZto_hxqaTZ%4$wfTeAexzNUVbZ6u(NWaCbb3652n9w6qnO08`s;a%VFT49}FEqWxV-P zCMPr5B#>-ZDt+L?N>pCl-~Mw5Pgb?ak3whkuzV-Y<`iUKW3ZA_QQ4znl#+=8zs7CtB~L1_&@ z!K+wi8QS)D+f~hLU4sdt=x?^)|4`;jpTMCmpPB|}){&jB(hB96!oRoq6a?VX< z!VFpk739J@l%h7Ayhg_)u~~{5SA-XAy|QoGepZPPQ&shCVdcG&^~jhOZc+KQeS=tL zPe*-lm_l!tEJdOdTBb%``Q<*b2B^Ch!Mq~Y%$0xo4_yW66!zD~VL6Nv8%f+3kFAZV zFc_Pmk>B7Ke4@uRp7~Z~f;TVj!m-hzA^gh#CY@Dsx@YTsLkvjMjKDUAR%D*Njp#3w zyj)3kubO^)`5svWgyudk0iw^_h$N#MC4tmv+}iDo*$v8Bpp%q%4rc=ZUHyW6K>_K`r&2XMP4x z2rM&$UWtb^KhOzz;N=|imkCtsv3lozdzK_GJ(b~=C@}L?TwCf{i72{pG$x{O`V~L+ zhsJlle#okRQvTe#{l}L6N70v;frh_4oJ}J$3p2(ivzJ8FZ&Zo)edaO*ovNRC{A#RE zppCZW_;t&t#fZ`Eo-V;-?6wV}jVnWUB8)5LEa5QDp|IQfT!mc8ww$IW&e~TfOVzG` z{kjLT(z>`YerxV-U%T$bKL{g?#U^!T^Ei`}99agA)9SFdTng1l`nE znc16nd*5w*yGUDcgEQS_=3^Hr?GUpW9ePXjjd>9asWe%%`Jge^FU1Ztjmf;t3p19u zwRcg1))iM5LYz{p#Xi6kn-3=FHZqVe%ZTbn7_a5^IQ10!UCBIbcJ6TOWdijEJ^wCK z_gzH&I4j@0BA#bPHqIt>al=hU^~(m5iNET>o8$JmjYP;;mUEQ{C~9xBMWV;JUTD`r zV`aY$9Ueb?$du%;ai`nv%{LT^>iZ#Aj@WiZF8uM$@pMJu5o&QH3f`GWhy4CV?XkL) zL(Bv}KTj6?DX*HsO)<2Zh}bm~3zmSk?@=ZYHE!MCxi-|$hc&+>k!m!bo^x=~DmL+d zdCZ$L5m?#Zd)u(5a=VK^E4`oe%i|7=_wL`PI+oTL{P;|pMjAER7F&7+Xe?K31SR2@ z_vUb+h7KBZ?`Ld|d@M$KR%_OnE!3T*e2X7SXy|F(hUX=@S1p@?Qa=LfcGqhdQ{T%| ze$rXeb0D)wmhXGih^-goUgoWZNw3rVw(5!-LbhU_Hmixjw0TcPEc;4lq7`;Q_1?RO zhW9PMG3xy~9H`7UGia&XLuEru7w1^>o_Y(dxv>?8<>xzm7}-(=JyD*Igs5{PW)miY*h!>Okzj0<#S!y881xsx{6{pD zDS{5t86D2x$_%qB__CfC5>y@HV5yKjl>3mhvn2jz787HxU;CRz=H{kv6et#_+!x zFN9D@2DYrLP!t8aLqJ01iL>d02P|}MaF5v}fXD|R>=+6h`xP@KJgp+=cAieWg?xEa!f03U(L@|xcxiwGE=d8EFNY!Yzi_GtllR%$7nc{Xby*hY2)}m9Q5a$*U)RgZ ziu+U}hu+)xknyP7vJ%U>lsabT`I~7D&(M>}tL@B{Q$o6NoX2N)!~jjdsw?owr+$2> z&7*DA$ ze?z)N`dn6OW}UX~?IrCht!rP@zl{%5@%*yS(CChusAsFuPr+ar>C z)K)4Ptol!GLB`l9v#4dzPeVdpPiw9fA+ZD1y$+y6EiIHFJ7wZsv7aJmkK#UF)zqB{ z8^u5x_twkp%2snK>6M)-21wk2Fl*u2ez2h25b?w}yCzQ)``QnF#mD40!q~l0FWvH* zdIr5&l+Z)P&(WNq4-?ef9*q;c>n%2Gu+?}|w)6mpG(>(hx@;1<`;dLSFfgaE&K&^}- z*w^bJQTeXq;#r6UuXs2WZrn;}8BE7oqQ(NM$^KWC#H$E2#9+dB^T%`0Qj_)2Ma>x3 zbDIj7vFQdp?a(*ux~k`$)1DQ$5LrKnRRx^d|Odzk+4z z5t~7{UsM8hb!o@?ymM__+Jg8^2?U=jY|a9D&~5hqwlA(;!cf>V!E}9!UuU&;WxYeU zW}^6rd^_O;fHPsVMh1^bb8+#G-y2ab`dbN*s zQ)BU#Xhc)jg~Xtxl*1=&J26x7l<%ym4=Irv!&S8^*>9%qNTG*m^P&0v0S(VG*lM#|tb_9Ud#>_ptBK;MJinjqbJP9GzInnvgEuB%114Q7qLQy zDWG>xYg%Wq32R2P7FC}N;_-s&tuKF6Qst)`*&(BYSg=* z|1%6MBW5jA)BOC#>@b{MU~1u=##;%qvp;&wk~YUnUJh~s@j%}e;}iu9$^1=WQ90M~ z%7IOa7A`fgkZ1jC6bkN^r68YsUmQJR9fWrzKWzeTTfsET00qm^Fa*0dnUp!hZ8EOWOSIQT= zyg$vGwjTyMV&B-3m+&wN)>(T(J&_LRWz-1g&SkqBAYVwYk#sf zJaMkp>kyC$8U2p^tQucpniyK<0PDn?5D;p5HJ?^e9V-}<2CV)vaZjb9qvWxu+NN@;7v(S#BQ~@ z%3k-XtuyzhOXyky>O}wK>b94(bue#- zD9WD91`YNN7@sVR(OK53kN>@Fzs78-Q@Lv4 ztXB8+f1ky%?dqYnR{7G`le#SnA{4HEwenalW|%TT^l=9<3?4{7>+E~Ev*Bc@Zk~i^ zN}vqv*KaA+?JjRhNMq7pkfe92f7aua6KyzN>Tr3BMzy7$9V+0F<6{xkx8=P#{A%Sw z1b5mfrP7g5H1q{gR0)Y}8v_%O~o-S2)xUb;@QFboPB_WwTl zUUyxX)?T#*FK^+p(!y)9_r;}kT&`Pqb8mWB{NinbBO_6-vO!zfuv@|!l9wM_yH+WQ!#&gIVZ6A!{W|Z*AP6<|dGv+KVt9UQ)p0}n_7iiZ{A62h zzVf}wgj+~WzQBvr)lfUx0%z9AJk8ZVspq$7(OqS=4PLW-gVe{_SIOqotEADCTie-u z48Mj5?=F|tCB^0xxoy|6YHQfz9n9?p2oc>x$!RqVtwb1J&y%Tt zera)wfd|{18*h>W3g?g#%f(Zb9gmps-fZBODyyBijgYT#o^_lN>32}RJ9q$FeD~0m zSHxI<9qFZyAd5+jGCtp5G88!5%L!WE#f~(Vfnh*s5o0fJnb7 z7DEauyKE9~NeH^nOog|)>yJC@{MH-y7bpFhmVjb6!&11&ar)IFlJ`80L$qyY%a#XB zg1Vz`Cv}pSV%Oa8l?hkLeoNX0r%E)b)R2hV4ICX_N7aYw7FEADoYiWze4e2D^8Xs` z?|5}4P(#S*4^9frfwGbL!}e=d$*lY6C`uQ&q~^Oa?dvh=UOh)zYIi`!FKNenb>A$} z3bIaC?&$MXTfp9Z-ONgY8z!%=*?PH@=}teeL?@(Q=aNw$|K5dId*p^1IZP0k=4_ z=G?rHk0u7m8mFNZ(=T5H`7A^l%|dOwqSQ29S`N4zP2T4Bz0sDPoEj12!>7FyJUF~U z=E`5CgifcQ?fHCbtBPZy{!z8^!?BiWgz@3zqnj6a-jYRBmZOPjp*5oE%t_qJHiI~4 zTLc-e9}>r#(Z9xQ%JHJ39sYfB-Bfq5`&~;;-r!4p`QJ~rC<9iZ^D`-)_12PJfF~yN znb)&2XdeY#Cl&-f^bCGfJu4Q~0e_k$?`CD-WB%IF3bXwtbyeihXlLpTcY*`C@1(tp zUIMS`54)hv2yd^9yomFE%7TA7YGc(>Yy1Etdh{sc&gkRUsS<53%dl4~XL0*(S(;*K z5m>5)K5H@zUasj+*m)Z|K`Uf#QjEEHEObM}8B)xk$l${A>ci?wV4r*{*%KoIdpDiz zTChEpri1&Mh=Nz5Fr35F1}KLM_X%gJlBNYmjS1s^w0Sv(evosbw|!z|wkQkyU|P08 z0SWRgU{MKW+t9o`EX)J2qn8i19la)=AWt5QlJ^mjji2Z)%pDde_ZD0)4aoN7Ttvy#tA&N^JLtt<7)ISkGB zXftH+Uz(M4Cc%FeN3VSprw9lbg5R=pCw$@_pv+{_AEw>Zpo8+&95pH($5EF!L`{JF zbG78qbRpz&6BXk`LI?5H7rX3k>Za};6Z zq{=Q=Mi}vu=MB=6uk~$+em*PsYkN7o-{w;*QxUegR^`R(H7T1bAO0?e3lZ?~iVQM7 z%jfchhbn#v1;<@=6iJMa;GwO-zWhHB~;pq3K0-*dG4Yz>(6gf;@eTwlzpMEa|P zUlM&vXR`KZ^%nE_B(BX_*@;si*NFPWrzM)p`qRjeSE-`zDrK<#9T{Y%ccLXj2Ao8{ z`q-d}x1#jr3m#8ovS6xZ{t|b;{`B@mszc3T#9!2sO`n|BJJ(HXy4Sli;jFFZLSeyD zu^vp>HpCsbB~4HIWW#&K5h|gpYSfQDfZFRc^clG55DI$?s4TX1b@j*fZq5HG@#=M6 z>kIG15G6gcyl3KpMJbv0jhSboR<(Q3Xa}bYx)U;2D!2vjRtYx;1wWaDS>>?)PLte0 z2KgFP%M4j5*yRoqeUiij#wt`9PR^h^?j3!VCjb1G z?NiFW?tquBX}z*7k9v=LVh+e90n`S|OHRSXEOT9Yi_t47VZeDa^)>*XR`C|u>7JLI z5Q;i;-7?0MJe3{?9Hs(z`?2^oX`Q66GYgL|0L{b?KNy^Nh~nak#dX*Clr8wiDv<98 zu}3p2GL5_L-Ax+sx!N19@8}vTNJch#zYZnf|3Di-iAu4ijiN%L_kSi?448~FT`=(J zq)P0}QIw)3M6t4IGWV?49@S5rGIdE*51ABCbDQLh{sAnPSq0#XWV;pHbV!gk2gu%W zWAwv&_YnZINc!*%Pn5Hpt3LVm+cARce1I=|StEbm&Gl(uh`FQD;uu`!s|bHm1N~o5 zu_^l+b<7P_;46pds^;p-9Us~E9F?bo6eE70D(+0pfE2V7h_uHg6Vx)X8RK_={iPh> zJb=G60?ah;lwt`wWk#G7@M=}1QEwjHIaJd#m@Lmb=(S2d4+!aU^|2d^YxMjowdNSn zb>zXTAwC&q{9sYGH~Y-fC2PS~8yU!FF;YS+K9uZ>z5^7E($sc)(&eneMv3PQq6d$F z_aq~GDr@VOn&gle33!LUpLv{h;Ch9+L*PG30g$mwH@e9GXc<7CB>uOhPryt4 zC4WBsgk|D+uu{osMlj;?NG;*wbSTBs?LpA}ze7Mqrox481P6^9S_UKbcv>eH5`uG2 z5l2vb@CDOfqV@Nae-or>yHYQEe6+Fs;f#HZRc@ky-Mm{O`MC=W%&Rnf2HA61cw}|= zzc2sP+uacXpVgZfd@r$I6=IK}gO}3+1lbUI7d{eC|5Yy3FaahvTwr4uszcSy!a7%| zhENUXpYgPRcrkA@IT$Pu3{Ke63NG7Q+Pn7O6Q9PyX_22&Zj3k9s&!H|r|bV7fuC~o znNOFrM5-<`wkS*{0FKk}djE_y3Ld57<+2YefocY(SS!O8%O&_SP0N!D4mMNzg9dLW zNgQu%51hy?Ys7-PaW4IrN-y#HXMz9y3|Zm-qT8!1Ob-eS`16UV z+Lq8pE-o@^j##>`KjX&7CsuU~UO=w$L22wyXdk|A7yoC%r2E;ymf*~+znPtCmxT9b zHSP78n&scN|I1LEb%7|Pls34V5&=5J*t?8p>Wh{iJG2ZH7<-&S=jX~>X1DYu7pPU? zBlF_UX0C^yj?14Y*r@3pYzuj@{cFEB=GHD2xig?2>)3iUUBOh90l3E1 zJIe8@7MWF~@!Env(Q{+}7Q3vU35v%_9M?2jY)l0muMp3Dnrlv@ujp@X{XEHjIpt_2 zn5yUUA_bk2q}5KfWn_Mv-YkyVNoTX8B=8p7MBe!T)WRgcL&kzZ(7d4NT=mKA8U3{> zBP(`8bDb74-j@s|hcG9c8*gk?d`e!qAk<zWxr4ikt-&hXK&3?7i()76!z2?2-F_9_HTFDp@oobJGWvf5vcq zxDf%DIFo^E`}8RcC3pwSb6l7#lsAU`xqw#$Z#Io=h+%tX@1pL9=@KAHY%C_{_pgRVdm8FY$+)gYb?Zur$jQ`$_e2Tft8VCWXGSJZCKcPMCxqd1IpF44m>Z!R)4 z=d$Z_L#OC#cDVvgE}!~J%L5`L`PKw`Ah)Kt6X746g3rsg^+$&OdZeH3HPkbk6DyN7 z&T_R7-xW#vGoe4=Km_Z<+1Vm9hS@pD)xQhsX#^02U;t_51_DmVVXP9D!eFG}l`7#m zMw6y-@;>KBciJ6LO{r(RY9~Hxi&c7wn#&V6RoWw>tUW3MQ<=zHjMS0v6m17{9d764 zSPY~i%>*O4NcTQCrtqP^poZU!5AWE`lmSPv)PnASB(yj|aTzcRqK*Hb={ios{k zttWN7|0ZdCZo(i&2Xykjo-?&M4#>Nz-3F!Qh2V7-r+aSglpu5}6=YfrvtMunPR=l~ zCF^!``P{sbI+i~;qNCmp8+EK{v}U=h2%vUg14s9kiSTa>2CtUs{@$v`>OO3p)Zf=A z=3Ddc;GJIkHO~R67k-xT{lqH5khEO^uYf9S{x}4=yA5UDmN@FB5r2XZpQV>rq4vqy zgyi_sc*`xfEsJ!i>EUkK_Q=q$SBZ)wZKb3}LCMOC#>-AIVLH%;eCcc+Ty^ z4sfAe4{qQni5-gl9TA)y?vk~CXE7#lw*s4s9fJn+iGWw0W+~hmp+%zG=p>=zd(;w7 zT3Gs%Rp{jYXGMxvNuk9K+4K=3#GQY<=%`DYz$xhlDYMF_@?fk?_;$mWX1)&qQD`Lh z+;~^al5BEmVT5>UUj-It{s4(Wugn$Jm{v;-7sO{l1{qeDPy%tY%46sWN(FwFiJ1wT z7Uw3Dx*An2qULYWp(9$@WPJI@<6Sr2M7p+k!$L2}mh^DJ&kJ)$>~sP0^(WEyCQBmy z9LaT$4n&lP9!Px=eKxW6ZGR42dj}=Zq-vC;ot@OHtV62A9EdsG_7X?CK6{j_d6N(8 zoN9|mWX`rP1KXEaADKC0>>OGyF&zSO`!GJkoe(NnP@r=k+I6Oc@E;(1%JbeW)yvGE z6|Cn}uEmrd>=^HLWuD2Er_lSlFinYVA;s5BTgsFtP_8YgQ|-anR*9u^q~4(WSJ+@@ zgmIOB1)F$c$PkSnxZKmQxFrwvJB?KLSI?;XA3dY71&qeYv*Kkv0{F~Z)VuQ|pDoe; zU1qaQTYAkR?uF>ec5i*5BUml}9arOi&+@N!&*Hq zMj=CdE!W~CvrM!41Ql1igRzaLcI&mgw@@pLd`|TFg=>Z5^ZBQGJ>ciRF*AQkK2F+L znpvqf|+#7nx21=*Um!K!c)N}Gnn*T~5D^ebc^f{{B(5Bm?Nrp^m=j7r-tv8HbyuRmI(SXHQuwfV=_*-tUkWf8PlMF)&EG|0(se484vVK! zPIWhltv9MDx+Q>n7ytjg|Mzjh;z);GX-W>H?4YbmzdwNu1_WX&x>#+JAR)Hh1ZJ7J zWQ7>(7Z;}}l@%aE0M6xGY} zBd779yNEHcowHUD5SH_|4d#KduFsE(uW}Qog)ee-EjzK7c!|K_LtYw-w6l6Ac;Ve#8>t@L=~Cx7SuK zsD1u&&+?+3I7vs`&VtP7AvO2TR=+vNT8uWdS&Y^xbt%~Mv~o@q?*+rP+hSXMm;U$@ zcXWqvaRgPHy&iYANnjnG3Qru4&e0-UMR*gr0gmS8Xc4s=TyLWNWJh-oOB$9pW$J3cm(2Kh7~|5ta8n zH7$9clNdWOX;;(YUdeHeot`=;?MUEj}RT?R)xvpc*FTo8G4~}>GC{FpnKY2B2m&W zZzKWVHN=Xa-R-rS5^VA_Y71tcDKyx06kuEl3JV`>&@=9d5l2I+l)-jKQn zK+Sm3wlR2>pPT2N%Q042#0pD9iy4d*qk$+{gv<42LU&JI`?2r^k`9XoFV)L-{Z9;8 zo+xCtww53A(!#*A;>5Jc;>h6hy6yRth57NglkDdNzf=bNw1yq_VCZ#~2!9O!-#2tQ zB4ow+`EBaXR1r8U+heSrr%8GQXVtc)MUe5VbJHQM1C*eI9G5rX$-*g!_u;pB@NAjS zMS8?L5g`0mFzRmxfW&*Og?<+4hE@hYoVU(6%joBGFkQ3*q$PNxMbJySln?s9179Ub zZtGrl_M97DH0x@APbqP&9pm2^DXM$mao?PI94rhU3&q%ES-eY{A+~!3Uha6&cspaD zk&NJZw&L|()a(uXX_C@r)M#Y2+t1B3TRK&w)@Q0Y4!&^i1pA4uz%2zvJh5fS-ojHj z`Lt%MQ95sk++ui0EoUTT-&F#4&OTRcXQ1%I*JHp#e=90k$zEh@<)V)q0bZt0YHaH< zUhs{9)i|3H*S*yiE@G*W`OchYUWIE(5Dd9x>S6{0r-Nt;jD|y|?hsnZ(cZo)gaM!A z2E>|||H(p zWAMLqGbR|s$G3~{euySgyB`{bv6=t8^}_pr&TrhDu2`+Qd{Wk+O%`@l7%_$_4wF;J zR4G@iXU`N#U7RGmsy|$oA|5R)jDu;0z+=(H+o$;!j#FiIE>Mx$NL|W;?fgj-N>!!YwGqI~BV`CTwLHqP?q< zVb!(E{4SdXizPd$9kmSylXXY4c$(w$V~=gcbd1c;QNRBTjQ_8J6rzdb#qpRXD`jnK_W`?y)8c!^eMuhs(j zAoxa_BQ1x)oYZnworV~X)OS6Kc{N%l1I;qWVABLrpI?AksxA53Jl7plaGFP`-;M)L zC9sl2RC>7QcAFCvs90gFl(9aB(hPocnPx?Eygd%RjaXAy%-o*+XIK)~az3U-lTJ@U zAaLV31cwQ2cz1Jp>pn`4cx>lrl}zEO=!1$L5~g(|3~`PQWnUz+%Gd8Tx!aw{I0r07 zgj<^X9H-RmAgI%Qf#o*QR<8hgPO4ZGl#^~em^Q|@nw37M*KiInKj$4du--xB2xFT2 z0v8)9%h>{+(IsOX!9xq4ow5dlbj{_wcZD$p{&SE_xLvZ0q}pAuxxHcyBFn4E?Le^1 z^z2LahY8sm2(!r~@$(r+b|j(c{$N~tmft>ag8ee*Q;5aA`J6XK5%uNP!pI zfd4Du#)YekftRXwC954M{xY9Wp^b9^q*Qdg;ixH$Ns7*MDq+~Te` zshl_Ng9#jxawJ_Ovdo+|TM#F@zy926aycra5DPkcCIyEabP->kAG6o3C$q0SvG3na zJpMy3rHbE_Yr?->J@g}a>V0%SWYtVvCpnuL&Ijwx=FCBTh8h-o6AHW&Dk8dr3w&-U zj>PT3R|jsk6ti?Z8~!y>u=Qcfx8->4b)Y0M&Y3!Aya_{WJ^Hg4c0Yz)a^mde9^K_{ zIDwZFw?izh+3f83vq0NYD#)L0fEy%u?*1vMv2fX}OPJhjU|jG>c|9)vdXb`wST*z^ziBxwM1m;kyQ z>({1fKi*X;xav$tvwm>y2dZS{tG~QddG{wk@tER38&-4v{?qS!7h#fmfaIDwuMc9z zNvNwImH3ZlZa-95t6U2_pS#B9^1?4Z)mG8-Q+!#d)=j&dYQ(1Qqz4(sLAfKNW}TK}N%f;v`lOmUVScYm z-CaqIYC7z_txh^F1(4$9PuU1Hj7;|zUk%N(pte$7e`wZCz&cBTk{27UX05hbOexQu zSF)>Y{xyC(a|8Qs^>WIG?S(FuS`V|tVZU>ZH}yUR(jz(B*bOFiF{1OsoF1`}eADX> zS4D8i2?^sJ0=!P}>SLerAc?(BV)HyBv6*LvkTO3?&wbF1LjQ#~wHY}ZS;Utuk|I!- zA-to%X3V_X)nZoFfv~l5LTz6gE_O$P;Oy#9{nRfF=UA^fM zoJcW|`E+|$+@;hjiNY~|Ef6?&JL1jF_iMx%Xi7F+xCSlBEx~1sM6q@mO_5;+6bv_7 z_yyD{iq!!KDZ#?IA{4qoU^Zqv%-p0wZm*Y5LkWs$&8>;QAO+(caLyxRf+WNbsvew> z{pg}U(OcvMD(5pSctC&RI{fBYWU_SZ72bH;*?b~{r5XvSw?cJ6HqPs zci8b#DU0FI7ZzB<2Aw9lY_G_ehWqLzc5lvb4=JB(6au`S;zv&WHQipVQ5z0Y_+d7$ zX8w6+u7!Z`2sGGjUOhkY_|OGD7P#7`cBbfz1YqufcX@Vo!dlVpX+=%`G$`4DgSHwoR2@<-N^D5HC5}>5nQ^ z%23ika$+sM4X(TYu>qWqGmx#Yd-6&UUDd|h#~Z9YmD4or$2~(hwws(WILO&#)@y7< zK$dy&E=s``E@uxqV#{x-RKWHj!(%lWn(2jhrK# z9tvf}1m)b=F(3rgE@_L~c@^?zj_oSK)QR8#@c_;9j|a}0!QWw2OG`l})e34O5- z{)&S2j6Z-Ku?-l!PfY33b2LA0XOd|{5s1xDDM>lhF^4$nXs(-wD&+R{`$calk>#+u z#XM6$`}DUk`}PFw?&r&`=+JiCsF*~b=`{2Mm|FTHbhI!|!8vfsj*dK*V~cURJZgau zmx#cPcnQQ3}7Do3PT!=3P~bh;xbo~2>+3S z=;@&?Aaml?s`qy8kHjQK_|*NS+O=u-?X?vVbpvdg?tYYMWXoB*LN$strksIm*O(_S z&!uLnfeq3uooROr24gugA@Dlq9>ghP7xFcA!;L}trBd{+084O+|L!DUjLe571TqqPF+Y(R4dzx-MLWY@q4c z$3PRS<^+d2%^sfu;t^H~Kg)|dn(LYm!v!||KS4?|^R7P3SII5HE^T)EzV!RTPma4{$uF|ruGfWO!uOy!3dVR}&x0{*T-FWyX zEK)E$SrkPb!!a5IdP{uByCcI1GA6yB&@O{GwyCa5A}u*H0i0Hg6W5uYkX5uO!<U$Ol4Df6Uy>5Uc zZ_z@+u?XrmmQy0qz?1tj)5&|S&_n64=q&}ZNJ(+f(Pw=9$yvHvcicJg#p?*>h&7~o z^&V0I7$B7(wwlP9G!CsYk`jgXRFKWPItwv{&s_uisD;f!-r(ZA{fZh+&((pF`@s~U znHwTF^1zvkX34Zw<$q$*KF=Rr^We0JuVf}-Z6x*nt?-ERKreo7q&$T&gfyr>o)oleg0M1=epiZ>w%-ByX{q!Dlag8<0^ zx!xz$vxh?A5PG`~znw`AmvL6rF<1SUh9>_*G7ABcc_@HxEFBv7(JxrjxIp@ny&1J7 zVWTBKaBbdpXiE8CM1Y&Qp%(2{=rbQ?+yxyiZKGklxFOY95{FP#_VUo=4hc=+ke4=f znt%~AEZ;nfYTNvtmMW`r)0*#Ds@G)z*nB{L6#aUK(QfCy4I#ytcXbyym38pEop#uu z#c#?l&WeWi2)y67a&Noqx1s`ZtkZ-LF{``MXVr3|4FoW{>Z67a1<~&QvkE8ASD>+_ zKwSM_d}3s^(9JDldQO9fQ;}og#%nd?L51Wk+C?z{~2GMMG$ zA31OPV9se)9iP@7gwKH8=b?O}VNOiMrz>JF$F=Y#-K*=CW@DvvbhAT{wu_`^c-nfD zWm`)TokdOUq&8NjIX`Dzk{__&2kmy^&>|qCeE~H4Qu}AHK`1YLXsfPQiFXieGCP#j zvml>KmyFTrq*YsLF}8;p3A}rTw!{dA4z!9)8;6B z@ElK13S7`iwM`bM-;G?{_n=JKnRiy!bLBIWv`;V&SWu69iJ&MZZ4Bn&pWE zT{&?Bz+A;VYA_+|{198Bkk__(3hH=mGXt?vSeqLO-e|Py$^|sLvmBja^{cXobTwi_D)=YTwh3o$rPC^|gEmJ-x z_;QXkDujN$Zzh_6ceHS*$v(CDL_hO}n-aNZ%sUgq7-`v7;Z)G5QGY8aQ|8pXm;{m| zFn-54k|HO0!;Oo|sR8ytC_bWx;a1#%IQ}|P(CB#Bl{r$7>l_r(IGIUB_~B=}m2rB-7)#CxyM-4VHuDRrkfBIR zkFhSP9SiL`2GDe!`6vnVf3)}AQB7@IzwxM85cPNC z?;R^1K|n-GsEX2(5QGo{geC|m37|kiNkRmK2mvC!!`tAw-}SrWjW@=7@4oWKw+Dl< z_s-g@uQ}&$?)h7L78P8Qu~-T5Jdg_VTydY9MA_G@q=q_-%#O<~Ha&qUs26IK7vDM_ zlEoGp=zgyLs5?Asth_BnV!nMgcF;d;MINcTDSwf2QN1&G8yl-`VPm?Z?u6RwVjj%iB#8k!+Bbq{oD#G?Q># zj+>IVBI5gSO3K_|vCUit3L}MHJUr7<r)ARV1^PI47F7sHv3 z?d7O)Gt&8q>bA&4M`0vOpt+R)>_#MFUhs%GR{rmfXu`GvKESqyv z(lI*<{3T(H?PEQ!06kvs&u+v<5py?3j&1#*V`fnrGJ7qIcRw%`IMOk=dYMhgvfb8@ z0b^;g$tG_{&~;UWI?`yGEi7QYd3mnpvj9L~C!DgeaYDze&o(%{1|J29LU4hLH#S=$bI(bpk4Hwv$?<{|o&oo-G^GY8tk01aaadG3A7+faz68rP`=}(W+WZGC-|}Z%-phG*cJdp8AuZNtwqQI*@e{ zzLhm$eeGRl#694!cL0N9T{6Q-opmxhI;F_0v0a0YbwKv*t^?T znsfn(8nFI;DImFQthXo%Mk{?%4$*1A_h|%=R&D~J_EPjlzPE4rG@z6a*?nNWOi3#s zqG>|Qq^npHz_X-Iz#maJuL0r4tldjKM-fu)#onBCvM!h$(Jw@er-IYV-PJ1#R$x>&i+zYkw6X@7*8XI-ugpdqn^#h)TadXM zvvwrV*TO}%a#L?frTH5`5c6>rN;+$ZVMf}DFEm`?J2Y`K7a&%E882#0pgHrRs;vBE z$^0D<#^qZ|^?7!YfWQdM1+ap4qKE_|YXopAj(LypT+i*`x%jPI)^PRp-N*chV8qUZ zSIx)Ax3(zTjrD_*B#-Q?R=Um*{bdvVWcQ>KcKWaJbFR>dB>Lr+&BB z?$C-HaHydL<88(ux%_9R9QH=5*a(XMvC@1!g-m%|SgJ zt?s2f6J?wC``tQO$!<qjPS& zOwFXho&F2)5xME{HXIGy)rCV*qXZ{5RbQD>H6CT^%YSH7*xRA_UH@32AR-WTD(dQ< zqWLWMDP+&*<*W*2JP;`FX>{kHtY;-UeW!|G+QyFMm@Q>AdSt+CjaaXw`Bx6?0pO!9FX52KTW;rN_S-J2C zhI{+7mB7xhqfe@)hk=0Je&Glz;NBX^X_W4=Yz3qfT^Ccp?e5!E)86Pv^P3Hd8hsr- z{$4)T&xYsNbv`79N)2?Dp8z%lI3#6j>T*ai#LQ`+G z@P+ACW!^hGDAyR{p^C8Ywl!%62IfZph3Um7o9^m?Ek~g%F{mZ=+98~Ast*uBN6H;l z)-TieB6pR@=h8vWtpM01BwZdxK&}nIm`dGOdr9@w?Q_SkW&w^tU_~i4O6yb=TsMhJ zlRmmXeJ?_~>b*-<`4jCzcs?d{jdK~8y7~7Zh`J3QFv>uK&btS!aQt%!@ygNt{afOt zVO~_TNJNUc?`yV*mq)h8`kN`hs0h50)`nh|>bsG-1;MP-qR3o}mpea!VT zr=l)0Bg_0^)nL+lIRk(Y^JI0WjkjI?LA&S>N6h+>GP-QSr9teH=#PaaU&iYvQ;k4W zXHFKeo(1^!xEIN~V82^2trI`6Y77JSo2kwx#tzx_w(#@Acegn4V}4W@kOP`<{4>0O z?Q@5rE)4Hub~BsPQ2bIMzb*ATMzxzZ&f6WkICLo*-nK|zd?LH-RyBC&+1UsYIv`9B zzF;`8C)lZzi7g`0u1bGE%byfqPQ_ws!-J6=e~IG2;26<6Q;&B-N$~?;eth-uk^1zke(cG~?iFXVQ^xlzj||~@v&;q`D+dnjy$P+Y zTU+-*&t>-F?=iNM{JXDH2#z!=26}$m_%5yL^x$!{T&prW>K{1XjQ8x%?kJA@0v^)< zBFI8(I?o^*v0{;H2|o>WjMOCjFubW)SjQ|df8))v$pU+JlisWTOX{sXB|_T)o(u@~ zz%dFi3APRUz6Wx=AH%mzg#Wq*AkhC;{ZZjtE7rr^T)oo9S_@szhlb2`MAp8I;h*N+ z0rENoD0LsPEvW-+G%@u`Y@XV~;*g$l=NE^?TsNd@5bN2R&9b{d^)-OjOZ^tf?DnDi zLjkP4g`$|J-U9%k(6f7he|S33nf9UJ;N;!zm7;JV)D78!quDMKuK8)>#Ddk^avQkg zJ;o8QmgxgswPst?k%qna&T|EW58bUdCoYJPL?c;D#oL4=A@te|WxAjqnw$6V&2-Ek z#$j6iQvWQl8he$w!{6od9ig$J6qkUfv_+Q%|Ff0B)NHxdki6w5tL(oR)1uEdp1N;m5XiWLQ*az|xiE(Y4JZGty}DmJ?kEPXJW% zh_)Hpc`tCp;GB>u_*MOVaiO@o8@s?K3!o)LTMkK9RmpC$Yvr+M+YGh95umfJ?D3lz zs)!;9L&oPZm%Lz~Y)sGV)5=9OamfN_B&{nATBf{w{qlx(qHPLEz&Zg;hdsas4($u& zg#jpstV){L=5NK($=$B&G-Ht}m0``r{eb1yq*g4sU|Uht+}Jw^7dVzWuYc1QS+*GV zTu$oFZCh3QNSlpKd35m*7a(%uN;l#}TrD4WU|;|~DMI#`E_IYI3lnvlqyq1LhtD~6 zy6HM56XHVA7Kd4aC3JDXq~D_!>~`CNIUgYqgk&s+JZX^T&-t4Lubac&i>N@xs`=_$ zgx2rF147VoSN|lSAE@k1C^Rl1H(+kj!2B!WIX;q~C|!zZb6%yWKbvV7OfF zweV1C-J-@+;mnNMY`Qxc1>@+dvWu-RHr|_1mz?=TGyu#HLWk7Uzu98J&XI^B>O~2E zsN);X)^<5)s9-jVrzk%f5*jDbb^u+cuU+1P1Zd+oCfba_M1hFx{qWEc*liK$!@wZ1 z9iY-iy=?V9x=VJUfaZ{!+<0O`I3Z3B_*_c&6vwy!)N3EQ z_+m0i1a1@{(f?4!p(08}IFl_c=PUFQ6M|%2_26ENJg;oKcA;#n!FG;wor`SXJ- ze2YYkYmAGZUOI`U4TePz! zFD>5vK3<{QK3ACADq-SJ5_Uy77;-Gi>Q$7Ly{sEkj4`3Uv1+_M1>)5Xz^7ZxUv#-gX{JKB`H128%po18lW1ne$*d z0)l1c#J&GmZS;P2YMsV1CABGN9vO8K=UNfk4m!%i?IA+8?t##%Eyh zz%DIxPr@m5E94@}JzKh@Ut(2-;AEcJ8kXSCoAFfb`i~D6AQWE*I>Vtykeck%h*?H5 zejuvk$nK$3%fj9{z}ol=f@YrlYdpb4Q1~bF3*N6f`a~8ZQr?Adc^q-lw-K9~<>m2C zK+OIz{o&wDVfkvQE>GHI77PGJ>(Bjc(nVc`*9O_=tP$?S^@ISs&T{u0vCH|Po`oK7 z4#XV74Uu=j?sr8JQ`URTBP9UiG*kI(A|j76U?5x z@jVnVx?YM$R}<-TRUI}W<+nY1{0iz!!X+}AAIx%+t~Yh?bSvG8s8Pec#=Q5sT5nFp z)-Y*KJUrd%UZ;*s{rN&W6=Kc8O+5_XKXKRc@mLd~tj+yE1s|^O3_!Ol)T&2NCdJ+f z^Na5hp1d&Dgrs+Szq&4B!?957!QvH9tiI$3?Z*pt7vz#dSjiYwDL0X%18=;+ zos*AZv(Uh{E8`_B^O4hv7oDO38t03wHP0Q(tWAaCS?5^PWO;!x(~QpwFBUCG#n9J$ z5CdKNvs=qWd#qe{C}w}S$tiblnH}vh1ZhR<@^rt;(N#4(?ANtIuL!6_kS_FIxr$<~ z(7n%Z>^Sj!OpZ+H`-bn|?Ym|f`o=C4;3!fa-Pnu_4Lr%uM)d~UPTF&;Iw2C9-koK+ zzsbC~KJ@nY!izZ?wh7VvdR7WLIIWo*e;Djx>bXq=3`eH3tax$#DS`G9X%cn811^%5EjCh4f=EL-l%DIFMT33+DR+%O6`J&Q604#ZC9Q=pmy=F4 z`EjD<%}0s}1?)Qw{g+;6C0B$qzN7~anAHp?;%OUCGG?&YTJ!MyBBzXi7X3YVkIAqw zgByy;icXp5U8;{1wjF(*E`w)G(&opN6T2VJ;)S?eQ|Cf(v&toI-15yT`5{Kt3H5Hw zdqw_nq<{3=q;LgiORUjD_(?dt!Op+gahZ&*NV~3}$i|H=43{OVIn%0o`i~l>B(_(~ zhiSj@EVrr?$I%M0hY+*R++}+ z8eQDACgM3@D=mS;3QPU-)Q0nld?12wQCu3W&FDCAejPg4yR!)lxks=;G-smjpqd@nVp575wu?vQ$W_NUBJv6KH-Y4@A zOzgTIcQMg1Es!paY8g(zC_%*8lJ+da5KTFt7#IpGoF7P;=L<1NX|W*ogw(9Vv%{PO z8%2nzIno_P$p*gbXa%Ik8OEXa&sJ%xZWJMhjA}^t(w)0FXj0xwRQt(B5n?=xcgku!Cr0*dM^W9y$W`^4 z@O81t@J@2a{K^Nqa#K&-E5I?%+D)RMSp}3*9_ReFSCrL#-^PWx-@^MiwtkaJ4=XFw zRgt4BZ<3T28$6c+!4V%&3ify5YHjXvQsiC>6abi<`06S5Ixm>d91xty9L@Bs`J^b< zCVio9sxoBH1ysvHD|X-Qc6=ll6Z>yb7=bb_ES*((K;Ow->kH zYyYUIA@5XLHIq87t1yys;tf^=Ds7i}vty740`~w*%SXyyOb)rPKvtu1)LJML#ttHu zvHr%fS%(fx%4byS<{f2BDIl3h_uv^VMF|y%iwB!h)&6_n8Z5|-w2*dezCXG`SN0+C z)k+t)t`5H1HR4Q-KuWr3wn~F~YaZCZWk}g86Ye%H>p9w8V~U>D?ijoerRS)L7!*^< z*B;VXtUNl9v*>tVDa=VZm+nh@RoHYsy7eF*r!^#7%e|bU5T9gu?D#$B03ZD~AMayz zMif8UQwX0cM^8xOWb&e`qaL?PFPdvzuWyz1jrsWHEVYkl99PJW6{Md0-u*R$lq%~i z2)ZRQrn-+nv*z-ra3%ZbZ$~Ky#C>_K!t;+rFaj!oncf~+MSl4w+>Kz2avoR(`f*6aRQg`_k?~fcNWqiz5L~cXanWDMIfWoz$;8Bz;(oeD z=tiZ`*?iw}bNG(>DM5yULA#9OLK@%t<72j9&ke|#Q9f1Vep1a;!aUqAn~iyb&ofEC z;<_^MGEEB0^1fXIesQzPyQ)!0+F2u4vOZpcT$?Ei=VM@ZJXB|fif8$@DO$}5n(NqI zb2S~TQvbuuaaGi33Zwc( zm(#dP=O9-67Ed~p5Iy1UBbb+Ag6I|s(`^;*R$?DDi2*)=$;mR`XOxBdyu{d)? zru041eG&zZ_+s~`UybklLE8gdY0PQdV5<;pR5-R>nJ9mug10_JWTIzD8GjrzU)|n6 zU)S~{_Xelc#t1#P0R!ZBaJK5@i#>yfdFywAd}P|^F;n&9#Qo`qkZ9{>Kk<<;evc&7 zj+*x8Umq`9!#`y)yP=-3JM6jL1u*Q|+RKoGR+?On{qkpNR%%m#=9o0y)E+ZBAdj?l zj=iqioZ%^a(WyK@5$;=S*c|3)G(<_|F=?-2{V|c?5>{%4a&CsH)40TrbvJoMJcE#b z+MAH&S8L%S!`*u$7Th8*- z?a6pwAZC$$fcx8z$Hns|nTHOFqh>#4q9Cqr>8tKhP1WVMaS5B%yQ%O}aX_Qi2fn|6 zKQNp0KEDcbjBFkG`cGV%_~Q;1U_vBkPOu)Q*g67l8|$2Qe-%A0td zQ*`C?+V}xX(`*a%yQt<7PgBn4Gt4@**9#$R8~=$9Hr@WC{VN>!vIQK~^X{@zo@FRg zR>FC;Xor47aI68eN4Y2CzQJe-fn`{+0rr!&D{FsWJL272v%5p+j(x_>?ByzWV2Lfe z1KumL#+CL3_MGJ#N7atl@|yS0Upj}Vo&Q+NSHCRwqBSU8cQP_11LmHzszR$I2!P&k z)NAwZU*#Kb4SQ4U=wZjjLSQd8)t-Oo|#;d#!JW0tlq9`jV`tvW%j(P zx|%5z$ZDx^DxAB@A(UH4-L5T?XV<6)ZdU8Gm4Y==#{)F1%34&Y2+ zV=tZ^%!_WjbKMla;~w{c1AK>UD^@(fBgp8>G4)aA)qGq0$SpS2q2(ATBblQ%D+s4ms=4GSFWITKN16eUy4)MdUbv7 z9RA*qH(QF_Y%8o`*KTLQ!x2Eruc|;spnI- zKo1@$@b2AGOurO4xRtVYD@)McXge!-_{wnlN(amEJ9(X3aC?aBzw%y@d!c?x`#&ce z>oX4rc7@Bz)A&+BV zrNn@YHQ}z+M1;w(u$W^K z-4X9Bopa45`)rD;+U4!6{FE+eb|#Gtw=c|8pslOGK~uO+ltjMAdG8#Xws}HyvQ399 zF^koY`LetRvuf43$Of;#pCE?hU9y2)pGp_vaZtGW%F~VU>+y5m_b2Odzjj#BOIRUN zs2~>6QG1Zj@Jv!hHgtw@Mns zyuR>7FO&lBIaiD`Eo<{^_}F&@dXqxh1FD|+dnyRGVh@<#q9&0>x*Om251S3Uc&0FZO-Fsm$X-uHmS?1pjUtVTv0#+ooi#g?pQs{=TAc! zAWG|uzUUdo=2KQI&oeLg!C4QEZ{e;nSev1VtCy?xr&SLb$TgI+EGY6^p86RALIg!{ z2|mN$LUk34%cuNy5-3G5@@!HBbM+jk{^8G6U49cTW8e8Tfrs?2w5LI`7&2V)$iro7 zudVS|>zD`ir3;N5T{xqaA1<6zl&V0M%k48Irg1O=-jUEd4lz}ElqzdbxdnXv>-{+l zv(q!eXvIV#x2|@SxfArW8DD{B?Ed38P>yrhjN+KA?2XNhI)lbdI!ORzAN)^I!wPr_ zJHe_Mk>0zx=F1fX1?B!CXXwDLHDp;JeuT2ZV+I0kORZbLsv9I`I@74Dopl>dV`DA@ zGN2#&Kjq2(R_Q<1fHI9XwW^j&=Dwlk1|@E`Wvg!1>;%!a;0S2%KavoPZX{@oK{u>c zik#XvRpq64K|Vm%{}6FNr-48^Te9WvM}Cn7|5ruic76Zf6^?~|R9yctv$_)hko!G_ zXTW@tqy$b0nPTp9{AI20Z^c4eyByT0`2hMGdw9st_1x>Lo6l#aek03@2nP-Ri`uDq zk#%8!_WCvVdmSTWoVjaj$bEi}yUs^Igf}A7ZcxTs8_NQ_;?DVLjHUA<2981PHmj49 zd)!*ZiymJiq5)GNE%>Y2&94=*Lu147-OFu@7U^qGHP#s?z?$YP zR5}vGu#hq}w0c6SB!}MZe_Q`p`Rg!PM}yy!)>dF)2Mc?qg!&jf+*8zJc3Wg|Xf)2| zdzc}LYV|t=!mSpJIgiHzI*%|(WLgG6y@BpFM_xrEX z3V|Z5>3wqIi@ug4NoVEI+U@7(#d@?Ni>+-`z#EQBt=J}%2PFBLK*k8uc+}-2Mle84Qfx_>o{&0^h<*0O#rw^-D0<5H-9A0tqwmrtiAWt zpNXuc{^VBdV>}c6>>7lsj(MzI1KBcQ#x0!O39YB$qn3m;6XuJW&~Y3*s)|~niPO_5 z5@KD(eQ3irj831Kr>3)0Q8&G*C#R_2*LJcieGEibQ&D#WG=xP|vn2p@ei`>YVP6{{ zd$BoZOircH8kXhf%PtjmW<3>zz{sh%w>0JK(0yR&HOMRtoZE&3IBR<3M;^r|`&C9? z&NDi#=j{ydPTLZ5&QQnGeA|_{-kVcd@Hk6k2QpJ%%~n}i#!dr=?yRuR&xF|_)q85h zSkzF>jmiT2{#iljK%j$tSBPa|zQoIlv{FyDu)3T2CP8pM!|+@}s;NoLysu8Wu4h$?0icCvZ=7MX zlhjmS*U}K2MS|;G6`pw^SRYM|kSydqCOg(JVq+bYGZdHE(%CeOE_5|zt%>J~ouv|F z^Q!oJ%3cyWhHUH5r_FQ_s$eg;<{oL&nv^oyW_k01M`HqmBLgdsQwv zWbN5{hr>#ur|Zm0{KR^e+NxpQ>@ijj;NXSUlV$N95z?78SN5I)`eXlyM4!Kr=yEHz z8_d_OOUPfSP?suvHE~*kGkC^)KkCG_r`QwM7WomeO%{QjnUy06wTijT(WycvOaj0S zSfA2~bN4`HjA1SN-pe!PcE7w?^_lfbui9J@)%odY&~?MH?xH(1w}NNd?BN=o7WjX2XVkCpt3L8+6>hNxxmuo2s>$0;NkU1{CCyLo~?^uGJad_os#g^J* ztQgD^SzYv=%`XEIHEXuTCe@kdVUybyDidfCU_ZVC1HJ}d-mkn#u=WF|@if|akuRpi zKm^~@7#u6=Zbn6xfa%Dn3~kBCPv(r0n$AG%>@!r38)3q_N(Gzd!zt-94$f-|_Meoh zPPW{bHJbu^d4iwS$|F0zD~v!!26$ElufFM3Fu3ard{N1LVUg3|#9^=E5ky?lvih>U zc=WJL!N%Mwx43V^FBnE(rM32LS-SzU+q(MQCn(@;!M|K6zdK_*P-%S7Gr@^`)R>BB zW2mGg2`}En5C@XF(f)TVZ*ZpX3{{M`_9Vl;WW31#%ZaVWY5vr(yEiL@_zuuD8An>B zHkZ$Jfc3^&pYrJ37D-$CaX*~y*mr+0>86|mDrvF8r*`>s?e6J`oieFS9CD^V@yAg0 z?xatj$k0jmZ1qiBzQitNI-s>~1^(29>0!>v&ZoW<7NE{kHM5C~l98jzak(+;Xi52a zhgQv)@1JD&XrY4ob)InoKn*BLhjanSHk_<+LRge89bZ7en9X`!4weA6eeA^c9KQ`CjwF46_`Y>W?CCj=f7UHyRNMEqlrpQ|HrqUL`=cJq z0P$6?v2~%e2LbVYWu(3@kPkBgShRixr62l4!)uJf*$i#OL#JXnqGIjuJy}6S_>A;; zZRz(=?A3iFFMXu9hgI8ZsXceY@|h&?(oqk%C<`dYrMWs zL%7HX!=2rE|9k1;YkrVI)19h~9v%}5UaaSx5wuAE^waaZt;>?dzNS^WJj9|5#U(3IFlbVmf(FvzE=|1^p=fPgw;^Z0Mpl^A^qi_3_d5 zL1J!k1RXGzzdHX~*;~FFQ{rPvb!XS_d?M}sm;6ktxvZoJPO7=<4p6|sUz^;tOyA@j zg=q$TW&Q>V>I2~PS3qWO!|C4M>+zX3yqkmB)ixlI>iu7uelJ#JBfGPwjvam!^v?W0 zKQypoEM-$~rSl76`J2mt`VNrn&R+`z-TU9^W5C=M28`&6e_EW5SAXeUz$4)HYi&TF zf9C-I&lhf#M_CE<)KAdR)_XqV8M;+#mu+z2n0Ow)_tbk}_JNjwIki>q^yTo78kUyO4F1rKoPpOPg z*s?IUEv-k-kHwCq8unPYB{-KBD#ZNqL*@Zz!M_s$clQ~c0|wydGl#YHT(wa;|Gd=Z zZDAD7QRKl(M>N5ClkBNxERz4-cXlW+Up>wW)cirf^_zh#+0?pSEv P>YN)o#@BG#w;udAf3d8Y literal 0 HcmV?d00001 diff --git a/project_profitability_threshold_alert/tests/__init__.py b/project_profitability_threshold_alert/tests/__init__.py new file mode 100644 index 0000000000..352c2e9e9c --- /dev/null +++ b/project_profitability_threshold_alert/tests/__init__.py @@ -0,0 +1 @@ +from . import test_project_profitability_alert diff --git a/project_profitability_threshold_alert/tests/test_project_profitability_alert.py b/project_profitability_threshold_alert/tests/test_project_profitability_alert.py new file mode 100644 index 0000000000..c84a17ad8c --- /dev/null +++ b/project_profitability_threshold_alert/tests/test_project_profitability_alert.py @@ -0,0 +1,12 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestProjectProfitabilityAlert(TransactionCase): + def setUp(self): + super().setUp() + + def test_1(self): + pass diff --git a/project_budget_threshold_alert/views/project_project.xml b/project_profitability_threshold_alert/views/project_project.xml similarity index 60% rename from project_budget_threshold_alert/views/project_project.xml rename to project_profitability_threshold_alert/views/project_project.xml index ca422e384c..a5edec580d 100644 --- a/project_budget_threshold_alert/views/project_project.xml +++ b/project_profitability_threshold_alert/views/project_project.xml @@ -9,15 +9,12 @@ - - - - - + + + + + + diff --git a/project_profitability_threshold_alert/views/res_config_settings.xml b/project_profitability_threshold_alert/views/res_config_settings.xml new file mode 100644 index 0000000000..37c3585a8e --- /dev/null +++ b/project_profitability_threshold_alert/views/res_config_settings.xml @@ -0,0 +1,37 @@ + + + + + res.config.settings + + + + + +

+
+
+ Percentage of project costs compared to project revenues that + triggers an alert. For example, a value of 50 means an alert will be sent when project costs + reach + 50% of the project revenues. +
+ + + + + + diff --git a/project_budget_threshold_alert/views/res_users.xml b/project_profitability_threshold_alert/views/res_users.xml similarity index 77% rename from project_budget_threshold_alert/views/res_users.xml rename to project_profitability_threshold_alert/views/res_users.xml index dcb16b898a..4f510d1d3c 100644 --- a/project_budget_threshold_alert/views/res_users.xml +++ b/project_profitability_threshold_alert/views/res_users.xml @@ -7,7 +7,10 @@ - + From 600cc54b9c328fcb2194e6bbcafd6b921957f025 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Fri, 30 Jan 2026 18:26:59 +0100 Subject: [PATCH 3/6] [REF] project_profitability_threshold_alert -> project_minimum_margin_threshold_alert --- .../README.rst | 33 ++- .../__init__.py | 0 .../__manifest__.py | 3 +- .../data/activity_type.xml | 12 ++ .../data/cron.xml | 6 +- .../data/mail_template.xml | 4 +- .../i18n/fr.po | 0 .../i18n/fr.pot | 0 .../models/__init__.py | 1 - .../models/project_project.py | 149 ++++++++++++++ .../models/res_config_settings.py | 23 +++ .../models/res_users.py | 7 +- .../pyproject.toml | 0 .../readme/CONFIGURE.md | 0 .../readme/CONTRIBUTORS.md | 0 .../readme/DESCRIPTION.md | 8 +- .../static/description/icon.png | Bin .../static/description/index.html | 29 ++- .../static/description/screenshot.png | Bin .../static/description/screenshot1.png | Bin .../static/description/screenshot2.png | Bin .../tests/__init__.py | 1 + .../test_project_minimum_margin_alert.py | 191 ++++++++++++++++++ .../views/project_project.xml | 54 +++++ .../views/res_config_settings.xml | 27 ++- .../views/res_users.xml | 2 +- .../models/project_project.py | 116 ----------- .../models/res_company.py | 12 -- .../models/res_config_settings.py | 22 -- .../tests/__init__.py | 1 - .../tests/test_project_profitability_alert.py | 12 -- .../views/project_project.xml | 24 --- 32 files changed, 499 insertions(+), 238 deletions(-) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/README.rst (78%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/__init__.py (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/__manifest__.py (86%) create mode 100644 project_minimum_margin_threshold_alert/data/activity_type.xml rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/data/cron.xml (61%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/data/mail_template.xml (88%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/i18n/fr.po (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/i18n/fr.pot (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/models/__init__.py (77%) create mode 100644 project_minimum_margin_threshold_alert/models/project_project.py create mode 100644 project_minimum_margin_threshold_alert/models/res_config_settings.py rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/models/res_users.py (50%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/pyproject.toml (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/readme/CONFIGURE.md (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/readme/CONTRIBUTORS.md (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/readme/DESCRIPTION.md (63%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/static/description/icon.png (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/static/description/index.html (87%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/static/description/screenshot.png (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/static/description/screenshot1.png (100%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/static/description/screenshot2.png (100%) create mode 100644 project_minimum_margin_threshold_alert/tests/__init__.py create mode 100644 project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py create mode 100644 project_minimum_margin_threshold_alert/views/project_project.xml rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/views/res_config_settings.xml (55%) rename {project_profitability_threshold_alert => project_minimum_margin_threshold_alert}/views/res_users.xml (88%) delete mode 100644 project_profitability_threshold_alert/models/project_project.py delete mode 100644 project_profitability_threshold_alert/models/res_company.py delete mode 100644 project_profitability_threshold_alert/models/res_config_settings.py delete mode 100644 project_profitability_threshold_alert/tests/__init__.py delete mode 100644 project_profitability_threshold_alert/tests/test_project_profitability_alert.py delete mode 100644 project_profitability_threshold_alert/views/project_project.xml diff --git a/project_profitability_threshold_alert/README.rst b/project_minimum_margin_threshold_alert/README.rst similarity index 78% rename from project_profitability_threshold_alert/README.rst rename to project_minimum_margin_threshold_alert/README.rst index ef8937b96f..9b0c8b86e9 100644 --- a/project_profitability_threshold_alert/README.rst +++ b/project_minimum_margin_threshold_alert/README.rst @@ -2,9 +2,9 @@ :target: https://odoo-community.org/get-involved?utm_source=readme :alt: Odoo Community Association -===================================== -Project Profitability Threshold Alert -===================================== +====================================== +Project Minimum Margin Threshold Alert +====================================== .. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -21,10 +21,10 @@ Project Profitability Threshold Alert :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github - :target: https://github.com/OCA/project/tree/19.0/project_profitability_threshold_alert + :target: https://github.com/OCA/project/tree/19.0/project_minimum_margin_threshold_alert :alt: OCA/project .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/project-19-0/project-19-0-project_profitability_threshold_alert + :target: https://translation.odoo-community.org/projects/project-19-0/project-19-0-project_minimum_margin_threshold_alert :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=19.0 @@ -33,19 +33,18 @@ Project Profitability Threshold Alert |badge1| |badge2| |badge3| |badge4| |badge5| This module extends the Odoo Project application to support automatic -profitability threshold alerts. It allows companies to define a default -profitability limit (for example when project costs exceed a given -percentage of revenues) and to apply it to projects that do not have a -specific alert configuration. Each project can also define its own -threshold. +margin minimum threshold alerts. It allows companies to define a default +margin limit (for example when project costs exceed a given percentage +of revenues) and to apply it to projects that do not have a specific +alert configuration. Each project can also define its own threshold. -When the threshold is reached or exceeded, the system sends +When the margin threshold is reached or exceeded, the system sends notifications to the project manager and to internal subscribers of the project. The notification method follows the user’s notification preferences, with an option to force the sending of an email even if the user is configured to receive only in-app notifications. This module helps project managers anticipate financial risks and improves internal -communication around project profitability. +communication around project margin. **Table of contents** @@ -89,9 +88,9 @@ system automatically sends (via a cron) |screenshot2.png| -.. |screenshot.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_profitability_threshold_alert/static/description/screenshot.png -.. |screenshot1.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_profitability_threshold_alert/static/description/screenshot1.png -.. |screenshot2.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_profitability_threshold_alert/static/description/screenshot2.png +.. |screenshot.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_minimum_margin_threshold_alert/static/description/screenshot.png +.. |screenshot1.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_minimum_margin_threshold_alert/static/description/screenshot1.png +.. |screenshot2.png| image:: https://raw.githubusercontent.com/OCA/project/19.0/project_minimum_margin_threshold_alert/static/description/screenshot2.png Bug Tracker =========== @@ -99,7 +98,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -129,6 +128,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/project `_ project on GitHub. +This module is part of the `OCA/project `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_profitability_threshold_alert/__init__.py b/project_minimum_margin_threshold_alert/__init__.py similarity index 100% rename from project_profitability_threshold_alert/__init__.py rename to project_minimum_margin_threshold_alert/__init__.py diff --git a/project_profitability_threshold_alert/__manifest__.py b/project_minimum_margin_threshold_alert/__manifest__.py similarity index 86% rename from project_profitability_threshold_alert/__manifest__.py rename to project_minimum_margin_threshold_alert/__manifest__.py index a341093b14..030b3ee967 100644 --- a/project_profitability_threshold_alert/__manifest__.py +++ b/project_minimum_margin_threshold_alert/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { - "name": "Project Profitability Threshold Alert", + "name": "Project Minimum Margin Threshold Alert", "summary": """Send notification when project costs threshold is exceeded""", "version": "19.0.1.0.0", "license": "AGPL-3", @@ -15,6 +15,7 @@ "views/project_project.xml", "data/cron.xml", "data/mail_template.xml", + "data/activity_type.xml", ], "demo": [], } diff --git a/project_minimum_margin_threshold_alert/data/activity_type.xml b/project_minimum_margin_threshold_alert/data/activity_type.xml new file mode 100644 index 0000000000..40fa348c6f --- /dev/null +++ b/project_minimum_margin_threshold_alert/data/activity_type.xml @@ -0,0 +1,12 @@ + + + + + Minimum Margin Exceeded + Project margin threshold exceeded + fa-level-down + 100 + project.project + + diff --git a/project_profitability_threshold_alert/data/cron.xml b/project_minimum_margin_threshold_alert/data/cron.xml similarity index 61% rename from project_profitability_threshold_alert/data/cron.xml rename to project_minimum_margin_threshold_alert/data/cron.xml index 26bcf4f220..5896a06e70 100644 --- a/project_profitability_threshold_alert/data/cron.xml +++ b/project_minimum_margin_threshold_alert/data/cron.xml @@ -2,11 +2,11 @@ - - Project: Find Costs threshold exceeded + + Project: Manage Projects with minimum margin exceeded code - model._cron_find_costs_threshold_exceeded() + model._cron_margin_threshold_exceeded() 1 days diff --git a/project_profitability_threshold_alert/data/mail_template.xml b/project_minimum_margin_threshold_alert/data/mail_template.xml similarity index 88% rename from project_profitability_threshold_alert/data/mail_template.xml rename to project_minimum_margin_threshold_alert/data/mail_template.xml index b4a65e69a0..548dc11b16 100644 --- a/project_profitability_threshold_alert/data/mail_template.xml +++ b/project_minimum_margin_threshold_alert/data/mail_template.xml @@ -2,8 +2,8 @@ - - Project: Costs threashold exceeded + + Project: Minimum Margin threashold exceeded {{ object.name }}: Costs Threashold Exceeded list: + """ + Build the domain to get projects that need to notify + partners and users about margin threshold exceed. + """ + return [ + ("is_margin_threshold_exceeded_notfication_sent", "=", False), + ("is_margin_threshold_exceeded", "=", True), + ] + + def _cron_margin_threshold_exceeded(self) -> None: + """ + This method will: + - Update the field 'is_margin_threshold_exceeded' + - Notify users + """ + projects = self.env["project.project"].search([]) # pylint: disable=no-search-all + projects._update_is_margin_threshold_exceeded() + for project in projects.filtered_domain( + self._get_margin_threshold_to_notify_domain() + ): + users_to_notify = project._get_internal_users_for_margin_threshold() + project._send_margin_threshold_notifications(users_to_notify) + + if project.force_margin_threshold_notification: + project._post_message_to_partners(users_to_notify.partner_id) + + if project.create_margin_threshold_activity: + project._create_margin_threshold_activity_for_manager(project.user_id) + projects.is_margin_threshold_exceeded_notfication_sent = True + + def _send_margin_threshold_notifications(self, users_to_notify): + self.message_notify( + partner_ids=users_to_notify.filtered( + lambda u: u.receive_project_margin_threshold_notification + ).partner_id.ids, + body=f"Cost threshold exceeded for project {self.name}!", + subject="Project Cost Threshold Exceeded", + email_layout_xmlid=None, + ) + + def _update_is_margin_threshold_exceeded(self): + """ + Update the field "is_margin_threshold_exceeded" + Do it asynchronously as the mean to compute it depends on + additionnal modules that fill in the "_get_margin_items" + method -> not possible to do it with compute/depends triggers. + """ + for project in self: + margin_values, _show = project._get_profitability_values() + margin = float(margin_values["total"].get("margin_percentage", "0")) + # Margin is set to 0 if no costs. Ignore it + project.is_margin_threshold_exceeded = bool( + margin and (margin < project.margin_threshold) + ) + + def _post_message_to_partners(self, partners): + template = ( + "project_minimum_margin_threshold_alert." + "project_minimum_margin_exceeded_template" + ) + self.message_post_with_source(source_ref=template, partner_ids=partners.ids) + + def _create_margin_threshold_activity_for_manager(self, manager): + if manager: + self.env["mail.activity"].create( + { + "res_model_id": self.env["ir.model"]._get_id("project.project"), + "res_id": self.id, + "user_id": manager.id, + "activity_type_id": self.env.ref( + "project_minimum_margin_threshold_alert.mail_activity_type_margin_threshold" + ).id, + } + ) + + def _get_internal_users_for_margin_threshold(self) -> ResUsers: + """ + Returns the internal followers and the project manager (user_id) + """ + internal_user_followers = ( + self.message_partner_ids.user_ids.filtered(lambda x: not x.share) + | self.user_id + ) + return internal_user_followers + + @api.depends("margin_threshold") + def _compute_is_margin_threshold_exceeded_notfication_sent(self): + """ + Threshold has been changed -> reset the notification is sent field + """ + self.is_margin_threshold_exceeded_notfication_sent = False diff --git a/project_minimum_margin_threshold_alert/models/res_config_settings.py b/project_minimum_margin_threshold_alert/models/res_config_settings.py new file mode 100644 index 0000000000..4467f89847 --- /dev/null +++ b/project_minimum_margin_threshold_alert/models/res_config_settings.py @@ -0,0 +1,23 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + project_margin_threshold = fields.Float( + config_parameter="project_margin_threshold_alert.project_margin_threshold", + help="Check this to define a default margin", + ) + project_margin_threshold_send_email = fields.Boolean( + config_parameter="project_margin_threshold_alert.project_margin_threshold_send_email", + help="Check this to enable by default the sending of emails" + "to internal users when project margin is exceeded.", + ) + project_margin_threshold_create_activity = fields.Boolean( + config_parameter="project_margin_threshold_alert.project_margin_threshold_create_activity", + help="Check this to enable by default the creation of activity" + "for dedicated project manager when project margin threshold (minimum) is .", + ) diff --git a/project_profitability_threshold_alert/models/res_users.py b/project_minimum_margin_threshold_alert/models/res_users.py similarity index 50% rename from project_profitability_threshold_alert/models/res_users.py rename to project_minimum_margin_threshold_alert/models/res_users.py index afdaab66b7..d26fd5440c 100644 --- a/project_profitability_threshold_alert/models/res_users.py +++ b/project_minimum_margin_threshold_alert/models/res_users.py @@ -6,8 +6,9 @@ class ResUsers(models.Model): _inherit = "res.users" - receive_project_threshold_notification = fields.Boolean( - string="Activate notifications for projects", - help="Notify user about project costs threshold exceeding", + + receive_project_margin_threshold_notification = fields.Boolean( + string="Activate minimum margin notifications for projects", + help="Notify user about project minimum margin threshold exceeding", default=True, ) diff --git a/project_profitability_threshold_alert/pyproject.toml b/project_minimum_margin_threshold_alert/pyproject.toml similarity index 100% rename from project_profitability_threshold_alert/pyproject.toml rename to project_minimum_margin_threshold_alert/pyproject.toml diff --git a/project_profitability_threshold_alert/readme/CONFIGURE.md b/project_minimum_margin_threshold_alert/readme/CONFIGURE.md similarity index 100% rename from project_profitability_threshold_alert/readme/CONFIGURE.md rename to project_minimum_margin_threshold_alert/readme/CONFIGURE.md diff --git a/project_profitability_threshold_alert/readme/CONTRIBUTORS.md b/project_minimum_margin_threshold_alert/readme/CONTRIBUTORS.md similarity index 100% rename from project_profitability_threshold_alert/readme/CONTRIBUTORS.md rename to project_minimum_margin_threshold_alert/readme/CONTRIBUTORS.md diff --git a/project_profitability_threshold_alert/readme/DESCRIPTION.md b/project_minimum_margin_threshold_alert/readme/DESCRIPTION.md similarity index 63% rename from project_profitability_threshold_alert/readme/DESCRIPTION.md rename to project_minimum_margin_threshold_alert/readme/DESCRIPTION.md index 64e121a975..3b461b09ac 100644 --- a/project_profitability_threshold_alert/readme/DESCRIPTION.md +++ b/project_minimum_margin_threshold_alert/readme/DESCRIPTION.md @@ -1,9 +1,9 @@ -This module extends the Odoo Project application to support automatic profitability threshold alerts. -It allows companies to define a default profitability limit (for example when project costs exceed a given percentage of +This module extends the Odoo Project application to support automatic margin minimum threshold alerts. +It allows companies to define a default margin limit (for example when project costs exceed a given percentage of revenues) and to apply it to projects that do not have a specific alert configuration. Each project can also define its own threshold. -When the threshold is reached or exceeded, the system sends notifications to the project manager and to internal subscribers +When the margin threshold is reached or exceeded, the system sends notifications to the project manager and to internal subscribers of the project. The notification method follows the user’s notification preferences, with an option to force the sending of an email even if the user is configured to receive only in-app notifications. This module helps project managers anticipate -financial risks and improves internal communication around project profitability. +financial risks and improves internal communication around project margin. diff --git a/project_profitability_threshold_alert/static/description/icon.png b/project_minimum_margin_threshold_alert/static/description/icon.png similarity index 100% rename from project_profitability_threshold_alert/static/description/icon.png rename to project_minimum_margin_threshold_alert/static/description/icon.png diff --git a/project_profitability_threshold_alert/static/description/index.html b/project_minimum_margin_threshold_alert/static/description/index.html similarity index 87% rename from project_profitability_threshold_alert/static/description/index.html rename to project_minimum_margin_threshold_alert/static/description/index.html index c046f4d79c..36386f239b 100644 --- a/project_profitability_threshold_alert/static/description/index.html +++ b/project_minimum_margin_threshold_alert/static/description/index.html @@ -366,28 +366,27 @@ Odoo Community Association -
-

Project Profitability Threshold Alert

+
+

Project Minimum Margin Threshold Alert

-

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runboat

This module extends the Odoo Project application to support automatic -profitability threshold alerts. It allows companies to define a default -profitability limit (for example when project costs exceed a given -percentage of revenues) and to apply it to projects that do not have a -specific alert configuration. Each project can also define its own -threshold.

-

When the threshold is reached or exceeded, the system sends +margin minimum threshold alerts. It allows companies to define a default +margin limit (for example when project costs exceed a given percentage +of revenues) and to apply it to projects that do not have a specific +alert configuration. Each project can also define its own threshold.

+

When the margin threshold is reached or exceeded, the system sends notifications to the project manager and to internal subscribers of the project. The notification method follows the user’s notification preferences, with an option to force the sending of an email even if the user is configured to receive only in-app notifications. This module helps project managers anticipate financial risks and improves internal -communication around project profitability.

+communication around project margin.

Table of contents

    @@ -406,7 +405,7 @@

    Configuration

    1. Configure the default profitability threshold

    • Go to Settings > Project > Set the default threshold percentage -screenshot.png
    • +screenshot.png

    2. Configure a project-specific threshold (optional)

      @@ -423,7 +422,7 @@

      Configuration

      4. User notification preferences

      • Go to Settings > Open a user > Configure the user’s notification -preferences. screenshot1.png
      • +preferences. screenshot1.png

      5. Project notification preferences

      When project costs exceed the configured percentage of revenues, the @@ -434,14 +433,14 @@

      Configuration

    • An activity of type To-Do for the project manager if the Create Activity option is enabled from the project.
    -

    screenshot2.png

    +

    screenshot2.png

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -467,7 +466,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/project project on GitHub.

+

This module is part of the OCA/project project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/project_profitability_threshold_alert/static/description/screenshot.png b/project_minimum_margin_threshold_alert/static/description/screenshot.png similarity index 100% rename from project_profitability_threshold_alert/static/description/screenshot.png rename to project_minimum_margin_threshold_alert/static/description/screenshot.png diff --git a/project_profitability_threshold_alert/static/description/screenshot1.png b/project_minimum_margin_threshold_alert/static/description/screenshot1.png similarity index 100% rename from project_profitability_threshold_alert/static/description/screenshot1.png rename to project_minimum_margin_threshold_alert/static/description/screenshot1.png diff --git a/project_profitability_threshold_alert/static/description/screenshot2.png b/project_minimum_margin_threshold_alert/static/description/screenshot2.png similarity index 100% rename from project_profitability_threshold_alert/static/description/screenshot2.png rename to project_minimum_margin_threshold_alert/static/description/screenshot2.png diff --git a/project_minimum_margin_threshold_alert/tests/__init__.py b/project_minimum_margin_threshold_alert/tests/__init__.py new file mode 100644 index 0000000000..b85bc85ed2 --- /dev/null +++ b/project_minimum_margin_threshold_alert/tests/__init__.py @@ -0,0 +1 @@ +from . import test_project_minimum_margin_alert diff --git a/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py b/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py new file mode 100644 index 0000000000..8c10c0d017 --- /dev/null +++ b/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py @@ -0,0 +1,191 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from unittest import mock + +from odoo.addons.base.tests.common import BaseCommon +from odoo.addons.mail.models.mail_thread import MailThread +from odoo.addons.project.models.project_project import ProjectProject + + +class TestProjectmarginAlert(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env.user.group_ids += cls.env.ref("project.group_project_manager") + + cls.user_a = cls.env["res.users"].create( + {"name": "User A", "login": "testa@test.com"} + ) + cls.user_a.group_ids |= cls.env.ref("project.group_project_user") + + cls.partner = cls.env["res.partner"].create( + {"name": "Georges", "email": "georges@project-margin.com"} + ) + + cls.analytic_plan = cls.env["account.analytic.plan"].create( + { + "name": "Plan A", + } + ) + cls.analytic_account = cls.env["account.analytic.account"].create( + { + "name": "Project - AA", + "code": "AA-1234", + "plan_id": cls.analytic_plan.id, + } + ) + cls.project = cls.env["project.project"].create( + { + "name": "Project", + "partner_id": cls.partner.id, + "account_id": cls.analytic_account.id, + } + ) + cls.task = cls.env["project.task"].create( + { + "name": "Task", + "project_id": cls.project.id, + } + ) + cls.project_margin_items_empty = { + "revenues": {"data": [], "total": {"invoiced": 0.0, "to_invoice": 0.0}}, + "costs": {"data": [], "total": {"billed": 0.0, "to_bill": 0.0}}, + } + cls.project_margin_items_90 = { + "revenues": {"data": [], "total": {"invoiced": 90.0, "to_invoice": 0.0}}, + "costs": {"data": [], "total": {"billed": -100.0, "to_bill": 0.0}}, + } + cls.project_margin_items_75 = { + "revenues": {"data": [], "total": {"invoiced": 75.0, "to_invoice": 0.0}}, + "costs": {"data": [], "total": {"billed": -100.0, "to_bill": 0.0}}, + } + cls.project_margin_items_100 = { + "revenues": {"data": [], "total": {"invoiced": 75.0, "to_invoice": 0.0}}, + "costs": {"data": [], "total": {"billed": 0, "to_bill": 0.0}}, + } + cls.foreign_currency = cls.env["res.currency"].create( + { + "name": "Chaos orb", + "symbol": "☺", + "rounding": 0.001, + "position": "after", + "currency_unit_label": "Chaos", + "currency_subunit_label": "orb", + } + ) + cls.env["res.currency.rate"].create( + { + "name": "2016-01-01", + "rate": "5.0", + "currency_id": cls.foreign_currency.id, + } + ) + + def _get_project_messages(self, project=None): + if project is None: + project = self.project + return self.env["mail.message"].search( + [("res_id", "=", project.id), ("model", "=", "project.project")] + ) + + def test_margin_not_exceeded(self): + # Set threshold at 80% + # Get 0.0 values of invoiced/billed + # Threshold is not exceeded + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_empty + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertFalse(self.project.is_margin_threshold_exceeded) + + def test_margin_not_exceeded_no_costs(self): + # Set threshold at 80% + # Get 0.0 values of invoiced/billed + # Threshold is not exceeded + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_100 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertFalse(self.project.is_margin_threshold_exceeded) + + def test_margin_exceeded(self): + # Set threshold at 80% + # Get values of invoiced 90/billed(100) + # Threshold is exceeded + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_90 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertTrue(self.project.is_margin_threshold_exceeded) + + def test_margin_exceeded_notifications(self): + # Set threshold at 80% + # Get values of invoiced 90/billed(100) + # Threshold is exceeded + # User a is follower of project + # Send notifications + self.project.message_subscribe(self.user_a.partner_id) + messages_before = self._get_project_messages() + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_90 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertTrue(self.project.is_margin_threshold_exceeded) + self.project._cron_margin_threshold_exceeded() + messages_after = self._get_project_messages() + new_messages = messages_after - messages_before + self.assertEqual(self.user_a.partner_id, new_messages.notified_partner_ids) + self.assertTrue( + any("Cost threshold exceeded" in message.body for message in new_messages) + ) + + def test_margin_exceeded_activity(self): + # Set threshold at 80% + # Get values of invoiced 90/billed(100) + # Threshold is exceeded + # User a is follower of project + # Create activities + self.project.create_margin_threshold_activity = True + activities_before = self.env["mail.activity"].search( + [("user_id", "=", self.env.user.id)] + ) + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_90 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertTrue(self.project.is_margin_threshold_exceeded) + self.project._cron_margin_threshold_exceeded() + activities = ( + self.env["mail.activity"].search([("user_id", "=", self.env.user.id)]) + - activities_before + ) + self.assertEqual(len(activities), 1) + self.assertEqual(activities.display_name, "Minimum Margin Exceeded") + + def test_margin_exceeded_mail(self): + # Set threshold at 80% + # Get values of invoiced 90/billed(100) + # Threshold is exceeded + # User a is follower of project + # Send mail + self.project.force_margin_threshold_notification = True + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_90 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertTrue(self.project.is_margin_threshold_exceeded) + with mock.patch.object(MailThread, "message_post_with_source") as post_mock: + self.project._cron_margin_threshold_exceeded() + post_mock.assert_called() diff --git a/project_minimum_margin_threshold_alert/views/project_project.xml b/project_minimum_margin_threshold_alert/views/project_project.xml new file mode 100644 index 0000000000..8e3591f895 --- /dev/null +++ b/project_minimum_margin_threshold_alert/views/project_project.xml @@ -0,0 +1,54 @@ + + + + + project.project + + +
+ +
+ + + + + + + + + + + + + +
+
+ + + project.project.select + project.project + + + + + + + + + +
diff --git a/project_profitability_threshold_alert/views/res_config_settings.xml b/project_minimum_margin_threshold_alert/views/res_config_settings.xml similarity index 55% rename from project_profitability_threshold_alert/views/res_config_settings.xml rename to project_minimum_margin_threshold_alert/views/res_config_settings.xml index 37c3585a8e..290039a9e4 100644 --- a/project_profitability_threshold_alert/views/res_config_settings.xml +++ b/project_minimum_margin_threshold_alert/views/res_config_settings.xml @@ -7,12 +7,15 @@ - - + +
-

Configuration

-

1. Configure the default profitability threshold

+

1. Configure the default minimum margin threshold

  • Go to Settings > Project > Set the default threshold percentage screenshot.png
-

2. Configure a project-specific threshold (optional)

+

2. Configure a project-specific minimum margin threshold (optional)

  • Go to Project > Open a project > Manage notifications section > Define -a specific threshold for this project. If no value is defined, the -system will automatically use the global default threshold. (see -screenshot below)
  • +a specific threshold for this project.

3. Manage notification recipients

    @@ -430,8 +428,8 @@

    Configuration

    • An email to manager and internal user followers if the Force Email Notification option is enabled from the project.
    • -
    • An activity of type To-Do for the project manager if the Create -Activity option is enabled from the project.
    • +
    • An activity of type ‘Minimum Margin Exceeded’ for the project manager +if the Create Activity option is enabled from the project.

    screenshot2.png

diff --git a/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py b/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py index 8c10c0d017..0e81769bd9 100644 --- a/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py +++ b/project_minimum_margin_threshold_alert/tests/test_project_minimum_margin_alert.py @@ -55,6 +55,14 @@ def setUpClass(cls): "revenues": {"data": [], "total": {"invoiced": 90.0, "to_invoice": 0.0}}, "costs": {"data": [], "total": {"billed": -100.0, "to_bill": 0.0}}, } + cls.project_margin_items_33 = { + "revenues": {"data": [], "total": {"invoiced": 100.0, "to_invoice": 0.0}}, + "costs": {"data": [], "total": {"billed": -75.0, "to_bill": 0.0}}, + } + cls.project_margin_items_15 = { + "revenues": {"data": [], "total": {"invoiced": 100.0, "to_invoice": 0.0}}, + "costs": {"data": [], "total": {"billed": -90.0, "to_bill": 0.0}}, + } cls.project_margin_items_75 = { "revenues": {"data": [], "total": {"invoiced": 75.0, "to_invoice": 0.0}}, "costs": {"data": [], "total": {"billed": -100.0, "to_bill": 0.0}}, @@ -88,7 +96,7 @@ def _get_project_messages(self, project=None): [("res_id", "=", project.id), ("model", "=", "project.project")] ) - def test_margin_not_exceeded(self): + def test_margin_not_exceeded_zero(self): # Set threshold at 80% # Get 0.0 values of invoiced/billed # Threshold is not exceeded @@ -100,6 +108,30 @@ def test_margin_not_exceeded(self): self.project._update_is_margin_threshold_exceeded() self.assertFalse(self.project.is_margin_threshold_exceeded) + def test_margin_not_exceeded_33(self): + # Set threshold at 80% + # Get 0.0 values of invoiced/billed + # Threshold is not exceeded + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_33 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertFalse(self.project.is_margin_threshold_exceeded) + + def test_margin_not_exceeded_15(self): + # Set threshold at 80% + # Get 0.0 values of invoiced/billed + # Threshold is not exceeded + with mock.patch.object( + ProjectProject, "_get_profitability_items" + ) as margin_mock: + margin_mock.return_value = self.project_margin_items_15 + self.project.margin_threshold = 0.2 + self.project._update_is_margin_threshold_exceeded() + self.assertTrue(self.project.is_margin_threshold_exceeded) + def test_margin_not_exceeded_no_costs(self): # Set threshold at 80% # Get 0.0 values of invoiced/billed @@ -130,7 +162,7 @@ def test_margin_exceeded_notifications(self): # Threshold is exceeded # User a is follower of project # Send notifications - self.project.message_subscribe(self.user_a.partner_id) + self.project.message_subscribe(self.user_a.partner_id.ids) messages_before = self._get_project_messages() with mock.patch.object( ProjectProject, "_get_profitability_items" diff --git a/project_minimum_margin_threshold_alert/views/project_project.xml b/project_minimum_margin_threshold_alert/views/project_project.xml index 8e3591f895..04b746dd37 100644 --- a/project_minimum_margin_threshold_alert/views/project_project.xml +++ b/project_minimum_margin_threshold_alert/views/project_project.xml @@ -16,7 +16,7 @@
- + diff --git a/project_minimum_margin_threshold_alert/views/res_config_settings.xml b/project_minimum_margin_threshold_alert/views/res_config_settings.xml index 290039a9e4..157639aec2 100644 --- a/project_minimum_margin_threshold_alert/views/res_config_settings.xml +++ b/project_minimum_margin_threshold_alert/views/res_config_settings.xml @@ -8,7 +8,7 @@ From 8d02e22989b2e5b5642b0b1b6a93f89ff7faf1c0 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Tue, 3 Feb 2026 15:13:06 +0100 Subject: [PATCH 5/6] [IMP] project_minimum_margin_treshold_alert: Base computations on expected margin --- .../models/project_project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_minimum_margin_threshold_alert/models/project_project.py b/project_minimum_margin_threshold_alert/models/project_project.py index d27af56ecb..577672c3ef 100644 --- a/project_minimum_margin_threshold_alert/models/project_project.py +++ b/project_minimum_margin_threshold_alert/models/project_project.py @@ -105,7 +105,7 @@ def _update_is_margin_threshold_exceeded(self): """ for project in self: margin_values, _show = project._get_profitability_values() - margin = float(margin_values["total"].get("margin_percentage", "0")) + margin = float(margin_values.get("expected_percentage", "0")) # Margin is set to 0 if no costs. Ignore it project.is_margin_threshold_exceeded = bool( margin and ((margin / 100) < project.margin_threshold) From b12a5cad4fa048b95e4721994ac960539f3475d3 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Thu, 12 Feb 2026 11:30:08 +0100 Subject: [PATCH 6/6] [FIX] project_minimum_margin_threshold_alert: Use sudo for ir_config_parameter --- .../models/project_project.py | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/project_minimum_margin_threshold_alert/models/project_project.py b/project_minimum_margin_threshold_alert/models/project_project.py index 577672c3ef..d58f8cfba9 100644 --- a/project_minimum_margin_threshold_alert/models/project_project.py +++ b/project_minimum_margin_threshold_alert/models/project_project.py @@ -38,21 +38,29 @@ class ProjectProject(models.Model): @property def _default_margin_threshold(self): return float( - self.env["ir.config_parameter"].get_param( - "project_margin_threshold_alert.project_margin_threshold" - ) + self.env["ir.config_parameter"] + .sudo() + .get_param("project_margin_threshold_alert.project_margin_threshold") ) @property def _default_force_margin_threshold_notification(self): - return self.env["ir.config_parameter"].get_param( - "project_margin_threshold_alert.project_margin_threshold_send_email" + return ( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "project_margin_threshold_alert.project_margin_threshold_send_email" + ) ) @property def _default_create_margin_threshold_activity(self): - return self.env["ir.config_parameter"].get_param( - "project_margin_threshold_alert.project_margin_threshold_create_activity" + return ( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "project_margin_threshold_alert.project_margin_threshold_create_activity" + ) ) def _get_margin_threshold_to_notify_domain(self) -> list: