From abe9bdd03258d3c6d9be088a7e32fe2c9f9cedb9 Mon Sep 17 00:00:00 2001 From: SonCrits Date: Fri, 10 Apr 2026 15:26:26 +0700 Subject: [PATCH 1/5] [UPG] viin_brand_{}: upgrade to version 19.0 --- viin_brand/__init__.py | 33 +++ viin_brand/__manifest__.py | 6 +- viin_brand/apriori.py | 25 +- viin_brand/controllers/database.py | 2 +- viin_brand/static/img/viin_assistant.png | Bin 0 -> 33058 bytes viin_brand_account/__manifest__.py | 2 +- viin_brand_account/i18n/vi_VN.po | 87 +++--- .../i18n/viin_brand_account.pot | 71 ++--- viin_brand_account/models/account_journal.py | 12 +- viin_brand_auth_oauth/__manifest__.py | 2 +- viin_brand_auth_signup/__init__.py | 7 + viin_brand_auth_signup/__manifest__.py | 60 ++++ .../data/auth_signup_templates_email.xml | 8 + viin_brand_auth_signup/i18n/vi_VN.po | 192 +++++++++++++ .../i18n/viin_brand_auth_signup.pot | 109 +++++++ viin_brand_auth_totp/__manifest__.py | 3 +- .../views/user_perferences.xml | 24 -- viin_brand_auth_totp_mail/__init__.py | 5 + .../__manifest__.py | 5 +- .../views/templates.xml | 2 +- viin_brand_auth_totp_mail_enforce/__init__.py | 0 viin_brand_auth_totp_portal/__manifest__.py | 2 +- viin_brand_base_import/__manifest__.py | 2 +- viin_brand_base_import/i18n/vi_VN.po | 8 +- .../i18n/viin_brand_base_import.pot | 8 +- viin_brand_calendar/__init__.py | 12 + viin_brand_calendar/__manifest__.py | 3 +- viin_brand_calendar/i18n/vi_VN.po | 7 +- .../i18n/viin_brand_calendar.pot | 7 +- viin_brand_calendar/views/calendar_views.xml | 14 +- viin_brand_common/__manifest__.py | 15 +- viin_brand_common/i18n/vi_VN.po | 165 +++++++++-- viin_brand_common/i18n/viin_brand_common.pot | 155 +++++++++- .../static/src/core/browser/title_service.js | 59 ++++ .../static/src/core/errors/error_dialogs.js | 48 ++++ .../static/src/core/errors/error_dialogs.xml | 13 + .../src/core/errors/error_notifications.js | 21 ++ .../install_scoped_app/install_scoped_app.xml | 8 + .../static/src/scss/bootstrap_overridden.scss | 2 +- .../documentation_link/documentation_link.js | 6 +- .../documentation_link/viindoo_mapping_url.js | 268 +++++++++++------- .../notification_alert/notification_alert.xml | 8 + .../fields/upgrade_dialog.xml | 21 ++ viin_brand_common/views/report_templates.xml | 16 ++ .../views/res_config_settings_views.xml | 23 ++ viin_brand_common/views/res_users_views.xml | 24 +- .../views/webclient_template.xml | 16 +- viin_brand_contacts/__manifest__.py | 2 +- viin_brand_contacts/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_contacts.pot | 6 +- viin_brand_crm/__manifest__.py | 2 +- viin_brand_crm/i18n/vi_VN.po | 6 +- viin_brand_crm/i18n/viin_brand_crm.pot | 6 +- viin_brand_digest/__manifest__.py | 2 +- viin_brand_digest/i18n/vi_VN.po | 6 +- viin_brand_digest/i18n/viin_brand_digest.pot | 6 +- viin_brand_fleet/__manifest__.py | 2 +- viin_brand_fleet/i18n/vi_VN.po | 6 +- viin_brand_fleet/i18n/viin_brand_fleet.pot | 6 +- viin_brand_hr/__manifest__.py | 2 +- viin_brand_hr/data/hr_demo.xml | 12 - viin_brand_hr/i18n/vi_VN.po | 6 +- viin_brand_hr/i18n/viin_brand_hr.pot | 6 +- viin_brand_hr_expense/__init__.py | 1 + viin_brand_hr_expense/__manifest__.py | 4 +- viin_brand_hr_expense/data/mail_templates.xml | 19 ++ viin_brand_hr_expense/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_hr_expense.pot | 6 +- viin_brand_hr_expense/models/__init__.py | 1 + viin_brand_hr_expense/models/hr_expense.py | 12 + .../qrcode_action/qrcode_action.xml | 8 + viin_brand_hr_skills/__manifest__.py | 2 +- viin_brand_hr_skills/i18n/vi_VN.po | 21 ++ .../i18n/viin_brand_hr_skills.pot | 21 ++ viin_brand_im_livechat/__manifest__.py | 5 +- .../data/im_livechat_support_bot_demo.xml | 22 ++ viin_brand_im_livechat/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_im_livechat.pot | 6 +- .../models/im_livechat_channel.py | 2 +- .../views/im_livechat_channel_views.xml | 13 +- viin_brand_l10n_vn/__manifest__.py | 2 +- viin_brand_mail/__init__.py | 37 ++- viin_brand_mail/__manifest__.py | 2 +- viin_brand_mail/i18n/vi_VN.po | 6 +- viin_brand_mail/i18n/viin_brand_mail.pot | 6 +- viin_brand_mail/models/__init__.py | 1 + viin_brand_mail/models/mail_template.py | 24 ++ viin_brand_mail/models/mail_thread.py | 8 +- viin_brand_mail/models/res_company.py | 7 + viin_brand_mail_bot/__manifest__.py | 2 +- viin_brand_mail_bot/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_mail_bot.pot | 6 +- viin_brand_mail_bot/models/mail_bot.py | 94 ++++-- viin_brand_mail_plugin/__manifest__.py | 2 +- viin_brand_mail_plugin/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_mail_plugin.pot | 6 +- viin_brand_mass_mailing/__manifest__.py | 5 +- viin_brand_mass_mailing/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_mass_mailing.pot | 6 +- .../views/snippets/s_call_to_action.xml | 4 +- .../views/snippets/s_picture.xml | 10 - .../views/snippets/s_text_block.xml | 17 -- .../views/snippets/s_text_image.xml | 12 - viin_brand_mass_mailing_crm/__manifest__.py | 2 +- viin_brand_mass_mailing_crm/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_mass_mailing_crm.pot | 6 +- viin_brand_mass_mailing_sale/__manifest__.py | 2 +- viin_brand_mass_mailing_sms/__manifest__.py | 2 +- viin_brand_mass_mailing_sms/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_mass_mailing_sms.pot | 6 +- .../__manifest__.py | 2 +- viin_brand_mass_mailing_themes/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_mass_mailing_themes.pot | 6 +- .../views/mass_mailing_themes_templates.xml | 20 +- viin_brand_membership/__init__.py | 0 viin_brand_membership/__manifest__.py | 55 ---- viin_brand_membership/i18n/vi_VN.po | 25 -- .../i18n/viin_brand_membership.pot | 23 -- viin_brand_membership/views/partner_views.xml | 13 - viin_brand_mrp/__init__.py | 1 + viin_brand_mrp/__manifest__.py | 2 +- viin_brand_mrp/i18n/vi_VN.po | 6 +- viin_brand_mrp/i18n/viin_brand_mrp.pot | 6 +- viin_brand_mrp/models/__init__.py | 1 + viin_brand_mrp/models/stock_picking.py | 16 ++ viin_brand_onboarding/__manifest__.py | 2 +- viin_brand_payment/__init__.py | 1 + viin_brand_payment/__manifest__.py | 3 +- viin_brand_payment/i18n/vi_VN.po | 70 +++++ .../i18n/viin_brand_payment.pot | 65 +++++ viin_brand_payment/models/__init__.py | 2 + viin_brand_payment/models/payment_method.py | 8 + viin_brand_payment/models/payment_provider.py | 13 + .../payment_provider_onboarding_templates.xml | 12 - viin_brand_payment_paypal/__manifest__.py | 2 +- viin_brand_portal/__manifest__.py | 2 +- viin_brand_portal/i18n/vi_VN.po | 26 ++ viin_brand_portal/i18n/viin_brand_portal.pot | 26 ++ viin_brand_pos/__manifest__.py | 5 +- viin_brand_pos/i18n/vi_VN.po | 6 +- viin_brand_pos/i18n/viin_brand_pos.pot | 6 +- .../app/components/odoo_logo/odoo_logo.xml | 29 ++ viin_brand_product/__manifest__.py | 2 +- viin_brand_product/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_product.pot | 6 +- viin_brand_purchase/__manifest__.py | 2 +- viin_brand_purchase/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_purchase.pot | 6 +- viin_brand_sale/__manifest__.py | 8 +- viin_brand_sale/i18n/vi_VN.po | 6 +- viin_brand_sale/i18n/viin_brand_sale.pot | 6 +- .../sale_file_upload_kanban_renderer.js | 16 ++ .../sale_file_upload_list_renderer.js | 16 ++ viin_brand_sale_management/__manifest__.py | 2 +- viin_brand_sale_management/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_sale_management.pot | 6 +- viin_brand_snailmail/__init__.py | 0 viin_brand_snailmail/__manifest__.py | 62 ---- .../snailmail_error/snailmail_error.xml | 8 - viin_brand_social_media/__manifest__.py | 2 +- viin_brand_stock/__init__.py | 1 + viin_brand_stock/__manifest__.py | 2 +- viin_brand_stock/i18n/vi_VN.po | 6 +- viin_brand_stock/i18n/viin_brand_stock.pot | 6 +- viin_brand_stock/models/__init__.py | 1 + viin_brand_stock/models/stock_picking.py | 24 ++ viin_brand_web/__manifest__.py | 4 +- viin_brand_web/i18n/vi_VN.po | 6 +- viin_brand_web/i18n/viin_brand_web.pot | 6 +- .../widgets/mobile_apps_funnel.xml | 11 - .../static/src/scss/mobile_apps_funnel.scss | 3 - viin_brand_web_editor/__manifest__.py | 8 +- viin_brand_web_unsplash/__manifest__.py | 4 +- viin_brand_website/__manifest__.py | 8 +- viin_brand_website/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_website.pot | 6 +- .../plugins/options/website_info_option.xml | 8 + .../resource_editor_warning.xml | 8 + .../website_loader/website_loader.scss | 5 + viin_brand_website/views/snippets.xml | 59 ++++ .../views/website_templates.xml | 2 +- viin_brand_website_event/__manifest__.py | 2 +- .../__init__.py | 2 +- .../__manifest__.py | 6 +- .../i18n/vi_VN.po | 21 ++ .../viin_brand_website_event_exhibitor.pot | 21 ++ .../models/__init__.py | 1 - .../models/event_sponsor.py | 12 - viin_brand_website_forum/__manifest__.py | 2 +- viin_brand_website_jitsi/__init__.py | 1 - viin_brand_website_jitsi/__manifest__.py | 53 ---- viin_brand_website_jitsi/models/__init__.py | 1 - viin_brand_website_jitsi/models/chat_room.py | 11 - viin_brand_website_links/__manifest__.py | 2 +- viin_brand_website_links/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_website_links.pot | 6 +- viin_brand_website_profile/__manifest__.py | 2 +- viin_brand_website_sale/__manifest__.py | 2 +- viin_brand_website_sale/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_website_sale.pot | 6 +- viin_brand_website_slides/__manifest__.py | 5 +- .../data/mail_templates.xml | 8 + viin_brand_website_slides/i18n/vi_VN.po | 6 +- .../i18n/viin_brand_website_slides.pot | 6 +- 204 files changed, 2199 insertions(+), 927 deletions(-) create mode 100644 viin_brand/static/img/viin_assistant.png create mode 100644 viin_brand_auth_signup/__init__.py create mode 100644 viin_brand_auth_signup/__manifest__.py create mode 100644 viin_brand_auth_signup/data/auth_signup_templates_email.xml create mode 100644 viin_brand_auth_signup/i18n/vi_VN.po create mode 100644 viin_brand_auth_signup/i18n/viin_brand_auth_signup.pot delete mode 100644 viin_brand_auth_totp/views/user_perferences.xml create mode 100644 viin_brand_auth_totp_mail/__init__.py rename {viin_brand_auth_totp_mail_enforce => viin_brand_auth_totp_mail}/__manifest__.py (94%) rename {viin_brand_auth_totp_mail_enforce => viin_brand_auth_totp_mail}/views/templates.xml (92%) delete mode 100644 viin_brand_auth_totp_mail_enforce/__init__.py create mode 100644 viin_brand_common/static/src/core/browser/title_service.js create mode 100644 viin_brand_common/static/src/core/errors/error_dialogs.js create mode 100644 viin_brand_common/static/src/core/errors/error_dialogs.xml create mode 100644 viin_brand_common/static/src/core/errors/error_notifications.js create mode 100644 viin_brand_common/static/src/core/install_scoped_app/install_scoped_app.xml create mode 100644 viin_brand_common/static/src/views/widgets/notification_alert/notification_alert.xml create mode 100644 viin_brand_common/static/src/webclient/settings_form_view/fields/upgrade_dialog.xml create mode 100644 viin_brand_common/views/report_templates.xml create mode 100644 viin_brand_common/views/res_config_settings_views.xml create mode 100644 viin_brand_hr_expense/data/mail_templates.xml create mode 100644 viin_brand_hr_expense/models/__init__.py create mode 100644 viin_brand_hr_expense/models/hr_expense.py create mode 100644 viin_brand_hr_expense/static/src/components/qrcode_action/qrcode_action.xml create mode 100644 viin_brand_hr_skills/i18n/vi_VN.po create mode 100644 viin_brand_hr_skills/i18n/viin_brand_hr_skills.pot create mode 100644 viin_brand_im_livechat/data/im_livechat_support_bot_demo.xml create mode 100644 viin_brand_mail/models/res_company.py delete mode 100644 viin_brand_mass_mailing/views/snippets/s_picture.xml delete mode 100644 viin_brand_mass_mailing/views/snippets/s_text_block.xml delete mode 100644 viin_brand_mass_mailing/views/snippets/s_text_image.xml delete mode 100644 viin_brand_membership/__init__.py delete mode 100644 viin_brand_membership/__manifest__.py delete mode 100644 viin_brand_membership/i18n/vi_VN.po delete mode 100644 viin_brand_membership/i18n/viin_brand_membership.pot delete mode 100644 viin_brand_membership/views/partner_views.xml create mode 100644 viin_brand_mrp/models/__init__.py create mode 100644 viin_brand_mrp/models/stock_picking.py create mode 100644 viin_brand_payment/i18n/vi_VN.po create mode 100644 viin_brand_payment/i18n/viin_brand_payment.pot create mode 100644 viin_brand_payment/models/__init__.py create mode 100644 viin_brand_payment/models/payment_method.py create mode 100644 viin_brand_payment/models/payment_provider.py delete mode 100644 viin_brand_payment/wizards/payment_provider_onboarding_templates.xml create mode 100644 viin_brand_portal/i18n/vi_VN.po create mode 100644 viin_brand_portal/i18n/viin_brand_portal.pot create mode 100644 viin_brand_pos/static/src/app/components/odoo_logo/odoo_logo.xml create mode 100644 viin_brand_sale/static/src/views/sale_file_upload_kanban/sale_file_upload_kanban_renderer.js create mode 100644 viin_brand_sale/static/src/views/sale_file_upload_list/sale_file_upload_list_renderer.js delete mode 100644 viin_brand_snailmail/__init__.py delete mode 100644 viin_brand_snailmail/__manifest__.py delete mode 100644 viin_brand_snailmail/static/src/components/snailmail_error/snailmail_error.xml create mode 100644 viin_brand_stock/models/__init__.py create mode 100644 viin_brand_stock/models/stock_picking.py delete mode 100644 viin_brand_web/static/src/core/webclient/settings_form_view/widgets/mobile_apps_funnel.xml delete mode 100644 viin_brand_web/static/src/scss/mobile_apps_funnel.scss create mode 100644 viin_brand_website/static/src/builder/plugins/options/website_info_option.xml create mode 100644 viin_brand_website/static/src/components/resource_editor/resource_editor_warning.xml create mode 100644 viin_brand_website/static/src/components/website_loader/website_loader.scss create mode 100644 viin_brand_website/views/snippets.xml create mode 100644 viin_brand_website_event_exhibitor/i18n/vi_VN.po create mode 100644 viin_brand_website_event_exhibitor/i18n/viin_brand_website_event_exhibitor.pot delete mode 100644 viin_brand_website_event_exhibitor/models/__init__.py delete mode 100644 viin_brand_website_event_exhibitor/models/event_sponsor.py delete mode 100644 viin_brand_website_jitsi/__init__.py delete mode 100644 viin_brand_website_jitsi/__manifest__.py delete mode 100644 viin_brand_website_jitsi/models/__init__.py delete mode 100644 viin_brand_website_jitsi/models/chat_room.py create mode 100644 viin_brand_website_slides/data/mail_templates.xml diff --git a/viin_brand/__init__.py b/viin_brand/__init__.py index 474ba3eaa..c0438f96a 100644 --- a/viin_brand/__init__.py +++ b/viin_brand/__init__.py @@ -1,2 +1,35 @@ from . import apriori from . import controllers + + +def replace_odoo_branding_in_mail_templates(env): + """Replace Odoo branding in all mail.template body_html and subject (jsonb) via raw SQL. + + ORM write on Html fields with translate=True doesn't reliably replace + link text inside sanitized HTML. Raw SQL on jsonb::text bypasses this. + + This function is idempotent — safe to call from multiple post_init_hooks. + The last branding module to install catches all remaining templates. + """ + # Order matters: specific patterns first, generic catch-all last. + replacements = [ + ('https://www.odoo.com/page/tour', 'https://viindoo.com/page/viindoo-solution'), + ('https://www.odoo.com', 'https://viindoo.com'), + ('http://yourcompany.odoo.com', 'http://yourcompany.viindoo.com'), + ('>Odoo Tour', '>Viindoo Tour'), + ('>Odoo', '>Viindoo'), + ('alt="Odoo"', 'alt="Viindoo"'), + # Generic catch-all (must be last) + ('Odoo', 'Viindoo'), + ] + for old, new in replacements: + env.cr.execute( + "UPDATE mail_template SET body_html = REPLACE(body_html::text, %s, %s)::jsonb" + " WHERE body_html::text LIKE %s", + (old, new, f'%{old}%'), + ) + # Also replace in subject field + env.cr.execute( + "UPDATE mail_template SET subject = REPLACE(subject::text, 'Odoo', 'Viindoo')::jsonb" + " WHERE subject::text LIKE '%%Odoo%%'", + ) diff --git a/viin_brand/__manifest__.py b/viin_brand/__manifest__.py index cf2eccb6e..1feb318b2 100644 --- a/viin_brand/__manifest__.py +++ b/viin_brand/__manifest__.py @@ -3,11 +3,11 @@ 'name_vi_VN': "Ứng dụng với thương hiệu Viindoo", 'summary': """ -Set Viindoo Brandings for Odoo app. +Set Viindoo Brandings. """, 'summary_vi_VN': """ -Thiết lập thương hiệu Viindoo cho ứng dụng Odoo +Thiết lập thương hiệu Viindoo. """, 'description': """ @@ -38,7 +38,7 @@ 'category': 'Hidden', 'version': '0.1', 'depends': ['base'], - 'installable': False, + 'installable': True, 'auto_install': True, 'price': 9.9, 'currency': 'EUR', diff --git a/viin_brand/apriori.py b/viin_brand/apriori.py index 941c3c5af..ff060f7cf 100644 --- a/viin_brand/apriori.py +++ b/viin_brand/apriori.py @@ -1,5 +1,4 @@ # modules_website is a mapping from old module website to new module website by to_base -from markupsafe import Markup modules_website = { # odoo 'account': 'https://viindoo.com/intro/invoicing', @@ -40,18 +39,18 @@ } -# mail_template_terms is a mapping from old term to new term in email template by to_base +# mail_template_terms is a mapping from old term to new term in email template. +# Used by viin_brand_mail's _render_field override to replace branding at render time. +# Order matters: specific patterns first, generic catch-all last. mail_template_terms = [ - (Markup('https://www.odoo.com?utm_source=db&utm_medium=portalinvite" style="color: #875A7B;">Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo Tour'), Markup('Viindoo Tour')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Odoo'), Markup('Viindoo')), - (Markup('Powered by Odoo'), Markup('Powered by Viindoo')), + # URL replacements (must come before text replacements) + ('https://www.odoo.com/page/tour', 'https://viindoo.com/page/viindoo-solution'), + ('https://www.odoo.com', 'https://viindoo.com'), + ('http://yourcompany.odoo.com', 'http://yourcompany.viindoo.com'), + # Specific text replacements + ('>Odoo Tour', '>Viindoo Tour'), + ('>Odoo', '>Viindoo'), + ('alt="Odoo"', 'alt="Viindoo"'), + # Generic catch-all (must be last) ('Odoo', 'Viindoo'), ] diff --git a/viin_brand/controllers/database.py b/viin_brand/controllers/database.py index 87cae683a..8900f195d 100644 --- a/viin_brand/controllers/database.py +++ b/viin_brand/controllers/database.py @@ -4,7 +4,7 @@ class Database(DB): def _render_template(self, **d): - res = super(Database, self)._render_template() + res = super()._render_template(**d) if res: res = res.replace('Odoo', 'Viindoo') \ .replace('https://www.odoo.com/privacy', 'https://viindoo.com/policy/privacy-policy') \ diff --git a/viin_brand/static/img/viin_assistant.png b/viin_brand/static/img/viin_assistant.png new file mode 100644 index 0000000000000000000000000000000000000000..769d7205d5fe00a0d57cf2014818913dbf2a61e7 GIT binary patch literal 33058 zcmYJbbzGEf^9OpGLuDO$v{v9FI`5#iGbRF|R&RA=8t1>+dkF>LyGD*L>C0c@{LGw`=b$;dCB7F%gk- ze@JVWEh~0=r1!}Tzl8O>5iN(S(sjLeyGpX36D9M%y?SIE_s~niqN_f}Ac0CpE8#QW z7C_$d_HmkD!0O4k#UoDU)o*o;Nqsyt-@eZihAw{dYT4bt$jGGyV(2<^I~L;T8!l!& z$$KJ|oN7<6kd9Gj%Vq^OEu&gSzuyj5^p!-;oCKu#HL|`O2s8Zk>iTot-nD2>l5fk~ z)9nMF)y2z>Dfc9K$uvJlAs;W_DGvaCdl(<^UjClHCqQWR-qE>{dMBmT`QkPFC%*Bb zRpVaW;hCq-^CHRg%ZU==KB$lprkvHq~k4)zfU~ifZ;DCAxUHC^6?+|)LpvE6JiU$a;m6;6k3CK4xMMPc-@K-4@py`5~1xK z$b0)|3a&zLZFIkyj6Q~c&*Q`wCq=;zA25*$@R9vnCBWX>88%+Gtpn%;BT01>xk&BF zi1hMkhn|8^tjzS zgzt+Th`xc$?KPM^WCZT9L-D_Jli~+`A|82snFrxSdLTHEYWlsT_7p^~;Ssz@b1=>P zfgMR$6!<{?ppZ8QP7Tu4-1I<#m22PUi)7{0FcR&`h*$O&79#J}%KDhSBpAUSKr0kq zqe2CX>|p)IWdN7qV8{33gyNqLI8x5ARh{W=W8nEC8!Bn?gntk)LgGzqe$n&PIhv|T zZE&cEMf;)cbd)$&{2;K+Wv(pLoH}Xh8QaW}F>nxzBt3{;#{g2f-lPY~U?LI6{*^C} z6~BoGir<9cBkh;Pg~BOsq2TYDWUBbd-fQMV@DIW_IQmTx9Hrj*N*-_hGjDwX{Niz; zhi4V{U+?8@aFjA4IQr{`Ia6>Ss?Lf5bJxMy_EU__%hhUaynb#Bm2D>N^T4!0LrA42 zj8IQG0tR;zCmtHU{p~joPh}#$6c-f#=Oa0Z3{dK?p2qIEgCDO)%XoXE+Bb3JL8D zXq2#4$)qO6g9RI2J|Q=gfiWYlZlPk{*?n1?zIdNEmH`1^jPq2l!QLCoP4NTEpR7`> zZuEWMb(W`s?~tNmRC>a`^pOSu@!=NYG0zYjOJN+MfQ|wLTnKM%c~QPp5Dv;H&B#ti zW?EvrJm@L~2VF3N{-0H1Ja)@w|9&q;dQcX`STASS09xWs0sz+wX3=A)&U%^^fER{M zZ^f16y$ql69z-KaFD>WTfl7=&Oj$^dpBb@x3)N5AsgdIzbe_&c7$^x2*GvV$Bvppv zf8DU-MP=N9VCcXE{5V+)BFh0q)L@AYs?IF5mGICcmGOu%u)QE{KLPyug)gOv81(A~ zRzcMLkoP?maF%U4b=Tb?y7Q-Y1HlWL1jGx9pjQApCHKpvHd9^2wU0>B^d~{DtXGe% zC^46Kz*3Ncct16UYSJo(99Yt4d@SZ`5sKp|Ohc0LTlEkE(3`|(FoBUK1-@t5lk#&y z+g|IC;Gs`+C@jFUM?mQf74SoGgevhLXxrgUL8A`EJTX`he{{PyQl9u+>k8@qZoQRUL{u6)%Wj-^^S(K-4?60`?Sm1xPTVcP zoY#)D2V2*)ccRZjz=wckOBbd9fZmS{2;XB^HX~#EtBpPtX(<3Gy`!g(q$ch``s;^u zlLiBDrj!DHat!7`2f|x2EaaW<4?7n+4q^sgV7F2%U#*#MjZ5A|iXu3cJuW(pUOF#% zwZ8%aiw87RpW3lueYG0awz}fsq=1KRLHYq@xdR1^Isx$`>!Hbk>##!uK7h`xjMHKT zo1;yjz?#%{c6{*B^YD`UCLT+*V6%gSw_2(QY|KLWM^>OK@(knYcs_(j^bb@^EpdPV z@XAV$|1c=0y63x^+aQod0=(v_it83)NK;hpP5oN_+s7_`xD2?7uXQhgiS(i>Iq3 z!XuPcbLkBP09vQqAuSdY)XVUR2f=Z=aKR2B-+~FTNtN#CMfq7iDtrJtCT(*v7`<)G z4Q{MI^W)uq_a9lJ$pIwAdP;7h$@zuCTM9w~Zm6iI9a?QT;}#HzW9Th@PmZ?un#TLe zbr7ChciR5EgkgXj&`HA+CyzpQnPO0ldB= z#mGk{>e^fe{VW(!zq)Z7!OsH#-rt23>(yY{k4&ZOI&UL@z-GH0QQy;C?#2px1V=&A zTdGm}Py!(E3P;IO_A_Qg)HYWUlmJ)?Gk-!7jF{vBiCEGH_Y><(vy?e17@@awGW_CK4_lPClRf~%n0?@I zqJkJCLrHBmJ1c6o+VKF`2k%SUkGHoYS*EP<6FH!--SIg9_;XPFleb%AmPt_pn(TxC zOu9A3%D}X5@a9l8_TwW2dElIytnJQpK5FOGffyKzQL#pQe$Y4YNu`HP1Li-bnsKgeNAa1nfcttE2N z+fATwj})crCg6h{bI=6sj>2z9rxx=U6gkm)3XtGf**rV|ZL)tDwAV02Nr=4%O-u*p z;;VhnNM_XBls^o14^#RJJnoV%X_)xQfv+1QE63lm%)EqPESS>5=KUd)`{D<_006HU zwyF8vTape@{fK?tBrs;$S+#7v2S$QQ)InQD(-GM^9u=sE6%@u&R#5Dl0> zePvp+sSh6jn6ulTFFcx%;6*K~S;S)D^i|-U0|ZIx2T1$7oMX_g!EIm4)4-W%OirJo zjt+Pu3aaa+|E3i17t1$^P(liR-3)kh$~g~aaCVd=c>_H#Qz30wN) zrW%@lOGJPwp^Y;+RbBvGCrH4k!a=`)4}yRRgs*IbnSf&|AxpN)a9`*vqiI{q;?B!k z_}&=;04!tjBE$25zmKTy9&}}9kIf}=A~qiY0xeU*&bFe)Pph;QgzVUQDmtFt{2lY zmZL$bZisqXql4QN>b;{}WdHzOPoBZRzMU2H>GlW&T;DMtzi%1NxD#+fZ~vISzyrqv zipLo{H5g^YfJqgS`4`e^M*9@t3K=Wt*$q=^`D5HKg|KMBx(8PrN)g=bgME}AH}oj3 zRTLn&FDc4wBvlk0TAozIBqct}%ES`2_r{_4v~gWisN>)?;=b4;x;Pv8kNWa5nN4zZ zz=45a&db_FqIM@Sg}z9_OEJ20B1GWT69v~}8|Mg};SD?EzRQa$ z*JqboR@@oq1!8z`wrq!$iPOsoBTW+7T&;0oI|aYtBN9MXqS;?v=CJP3OHEo*{X2wH zv3z0quRVW9no0460|(>Am+L1@+o2yo9qYXHAtEs28Q$-&1n)Yvk7ubbU6;mef)xX2 z-J44(gWF6UcDT|8B_aKf&Uc!`j^ux@7wZ$daO>WteAS9H;)PQ_G#ht6f*ws8%WzTQ zA1K??$TnZ@@BN~an>vP%pB$GM-Bt15Z+>v`pI_uPE#Up%#wo)4F}5^mi;HkASzKo2 zG?ca0;=>v`8#f;n7m$+^;0%^w5HZx0R6f?JI%5grwit|pr20*1hhnC z4(Cq+^k$my7WH;k)8MoUj0)ew01_O^)+qJvy~xvR_55@R-TQcJ^<|$;&VBpeAS{Hl z5AXI;<9nDujCiS5lFdo`wZZ-2)LBulc5YkKgXrMh)cp+l`# z-+o&(ODC^Kz_xN$9=0vwf`OUil^Rw7HFn3RHe@xIYli^(XJP&t-*(oF_}{tPd31pC zfzXl04I|Ee(e2&>>IF>P%~HnF$L{f=W-KoW;hNdi15yF!t!vfE5lNOSgV@hp8BQ-Mog`=ANq@%7jJQ@!N7C4+X z6O9&Q8=NEj%$TG1BALE0arb37qzMzEH$l4a!KSAE%j!;9z)a1mSk3qOxkh0=dqemi!iF4YwqN=ewzgZ#mkJ}|0Zs4y#3LKsE69MhNGIm!LKWlov4w?<01Jd z7UAo>ZTRQ32Y%c;0T!aSFSh8)3};R%fYQ9MlOT`y2#tJbv9di=dQl4l;4$+pF*1?{ znyzX?tW7WT<|t?_B&^W>G8KvT_QWk@DHKOl`Q{psYc^dVnP0ZRx}b4es0SXrLO)s?+*UK zkK)2FM;D5ek9ndl{%nt*w~x_Ye^&;K>B^i<#HfV8>G?N;j;l8SdS9w$Em!9HU3F)1 z-waK9KLXPKvcmn*!d{66F@KKMc=4jPfn9yEI7Ppr=JdowNangbn@vKalAe6FNbT~` z%1^->0g$JGft6L?joy`2;XienHVIuCQ%|a5@DIkOPBXP~ z(y_gl>Siqgu0t!fLID8|lY+ip2QH@| z%mzW-d&_$L%T{m9b;rDKz7WQi^9a8pB-BK z*ifs)35ph$rcfJN71G}xEpcf+_z_~nIa=)0=(VvGIuPcTfC!Y!XZttFzfs~vBC_^Q z;xNHM&&q9n)DWBBbQ;wAXU4 zD5vP%H0@>eVeeGdT@Z(Yt9@g8HFh!$hZ(EcGZlf==!3OwtiRm7Yjid)?QM|zh{o(P zwF2)eKyEX3@|JEEtoX}#s}C34Yyc3Op9MvyD88JG*E3LaTrW(oxVt_#(rq6G9uH#PGB^dG%tbL6Gj(#J28dnX^BpYBS7dkruT+^CZMJFon~ zZ73~XuP0NmuW$;=&ZYI^FL%K`Q?$5zy#3@l>R@-{+tRui-q*m$+iauC-U-Os{^`c_ zVBq2JwyE96xwo%Z{01EQ0#4tr>2UqNedwmj2S}-oT~zGp^s_^&v*$$*Q(VXc6$(Zc zh9@W=N$Y>kuJ8vh3oh?v@J@LrV{Uym-RZV4BNi#o1q4~Yvxq>BTk>$gSN;_^*pqFXj_t*mv#ab zd+5q4*VW2Q2j}^o(P-!J?zOO`qq@takTz0Hi+u|vE^aeb(=z7BqP}`h{*4U~^X%`@ z{^bL1O72E3{#Xlv%~S_AttRg=-p&>B0h=2n&J$2z>E;CEyPckI4NFU(%T*N+Q-my~?J7jHE-SPu^3ZVW2jw zjulm`;zM=jaF?h2-UHANR#rG?&o?{%8BElCOwZ*M&G7w&TIevPG))Ch-J&!snx3zv=iroP6v;9^Bnw1S(~mj10wURi)CH zeh4IRVbb*{#U``XN&PjdyW`cM!lQ$;)UxgGyL0rU+EZ&GzPe&~FUrDBdNtoE5$R<4 ziAN@+7ifa8Hc=w&WaeqA^`rGS+&lGxw*wY``nm9^C;X6=_Y~A<^jYaJQyXa&tSPvI z5B;kfRttjug|IsX%Gkf-J|o-K?!wJ@%DewLNLC(k-K8|$e)eqr*Y{^-ySV|=C+|R= z_MToW4b5^1)KCErDU>86F{UFxFXP@MOX(|lbUnJ-VEQmk=F*he@7zP?_-D<_mBBlA zksyQR$zidRmsZ8JiSp29nKus_T*vPM@hbKl>aDJ^dV?s|y3Oj(z6VTYhWVnko8P*> z7knVQ1&*fsh$`CY5&b>goudJrdr(rmA2z7@&2Q_e!L>B1KGZIZq$(<4_k%dLe;4KH zqd)PzgH`6Sq8qhN&W6)ZKkp>xWX&FdxE=bJP>~n6Dy|VDB8bz!M+j?CPbJaEIOqyU z%`gJ-#zocqrWf6hjqVJA8Xc*7}^+%++H+wJ@7(`zHfL z5J!@iQz_7#G%rH*HPS%$cT|G_7R(A0)gx2+@-f8zJPX8mbs?ea%M0Jv!ZC&w>N>hq zf!0;7qN>@x2?$*TU|3JHV6O<8fP&Zp+C*V!4j*U@!b?8hPO|rZT8F^gB>NqB-5X`9 z9;tpY#vl_w>tQXTvftlcKou>6`3>Swpvnlq&9b-dGifT_isyo|W->+_7Ktw#fu;!Q z#`zDVpnwXvW8Nj+G_5HU)gg;ugXrGE0|MXk`d5{n{I65`v^IUR2$ugV;D1|HI{tqJ zjR>%S>3;>&Fz2e$+W!@FMYrkwe+9<8)>WmSF~6~Kf61Bs_#F!~-ot&yxaL*MgTBH) z*02IvTD86Zu@s}vThJ(@n`dwF|7O@6o@Kyd453ePcm5(QdTX(@R0W4u#d@9VEp1-32J+8Nbe5{8a$f>a=HzuCC14m>7a{>8aqLcli6zHeVe`v}UA9@tr6l z5vsceq`sVF?|tOlQ>jRiuY33w>O6N!W`~?1K?xCu(9=9{LO_pH3Y^prbdc$2OB0u_ z?o2TX<8zV^zc3D;nb@>>8TjWpukUGsR2J(Z-hnYB;Knk|s6W1~Ko#ha9e6TrmLA5{ z;=lW&QX9R>y;v6d?i)ZM2W3r7`8SV^5}m81>v~P_PRf+vYY+3~<}uSq`vK!x8D2>) zz3;iLAb-*%0#9}T2idv$<-{F=-=8R+&E1r}G5=o5eeRxWip-1CCeE z$DjC}>ppu>5tP-(itl`N6wnjYB_>h;&Xks^>YdFAY>4S@#AfEqLZrt*5#_Z)b}XI< zC4jeJT~C$@T)yQ~_K}pTa#aZi*>bQLpRXBjQKDZiZjOE1+s<@p1d%&(ReS#Qv$Ldy z-$BO`8L5G~pCfZE0bg9V}<= zgrD{A<5k|9c`tjBdVDJgSegXaP1&*LZ20;<9f9o-@Rs&=p4NlLM}gIOxABqC^*TOT zo9%|p_*xZ%C)Q6pq5y<%b(QpeYnAdZ0zD^V$LXlclE1soTuF;cZB-0} zD8q4YM*ETCFUrblp?*cQNAln{BS_98P>M_J&*d2qAE5xk3neh(vNd@8$b#K)xeb@| zywT^i`IWwMk%zNyI#)nY>ES^^OH@$H#hYKhdWlLu%IyejxnN!4K2m5Hi1_Eb_&#MP zL|5J@avkpJ=^?In{eEd&QlR{Vf)KIU6||E|czGWVjK@5C?~+?ET>jL!B)icizJP0N z+PrV3hAbG+QQb_#;E9)J7v1R9UntM$APyE%90Hs~ZS9n^QxBez0=l0v&b36Q{f?dR z1T0@I#jXX(RY#BV;MXdrv?YQUiOxhU$!^6OE3NJvonL<@^5l=^J3AJX0~TI;{a%v< zpaPMTow9O#XYtW!+Ce$+cFH9E4+4Tx&hZ&cM2fY&T~GQdbOI0-GsDkqsY&t7?baU- zGAO>tYv%DTJjRGrMdg(9^waZ!Sj^WyU_mQY@tPNz9UC9YP=zCTynF!30KC8`nl*OT zLu}XG$n16%F{96I1y=p8FeLcEi{#4UwhunG>rP~LE`Lj8lCeAzKBRbP*&_3`hfwb+ z#N?tX*u?YdC*`*j>30wD(0A7#>eNs?)--zJ!vv{{(sB!J{!fMwDAbcqy1qd`@~UU6 zVvdBM_AJN4t5|<3?ci*1+e_`c&!hJOA*wd4d|+g5)DC1VJBJe@5Rl?F~Wz1kOHPB^&z9ke3}BtMcWi_plu9P5j1F8|Fa+5&(UC zTi!EMQVW+qdr3RE18Ueg)gZm$jG=Q?k@#>kTP|$5y}{_&4*#(d-5dEEUOs?^BK+D8 zELgEOnIV}AI(lA|rSr_*WIz%E1YsiMRdFNk%r|@3=6aeD$zk`jsror+tsO95#AA!2`vww<3+w>HUnz7x_m8M7a(6MoZBM&)5% z_UR7IQoV0ZzZU|>#o{PsObqTh1OF8EFfGWrEV>l{1Xd8h0=h152fBAQ* zlGW2eioT!`gAho&6~Jz$g+*4ys4_6D|EOyds*VP^k)94C4D|iOtd1RSh-9rf zb*zVlgi=y3bhL(8=j%=%h_b+`J$rLR>q}EC4>6^6;g%zQg)#5I!)hGdGDKyYQ9Y5^ zBP3pdsro>qs)c?B8ZrAY69B%);?LhelE_q`a~u!=O(Xyn#zl@%Eo1qx7^3 zzxaW){cssepHv5x3N3cERw_PoPU(IxmbnCu|Lf#y@cvDnkrbn(B28uH$Rs7IhgBC7Gw7ZH`l`QEnDKqt_Csxlwi&#S`BTwH z3jE+n=Rdg6xaTW6rDwgFeM7fuUmybj;}Ijs3!aY+ojg6zKwwlku&cKSfFIp^R5%O& zFX??d?9jK>RMg?GHghQOfOt)N4%A@52sc>!2r*xl9~KCCVgtbo{4-HM5NXC|A<%sO z!;k-R=?L7PlN;(NPF0eA76eJ)Yf;CLA9*E>hU3oXYmedG`QWOlv*WyRmNET<-h2xj2?zitkpK!Y(W-_ve-s0vcF{qG5g(DgGjVPD3436opwsDF!;gBiou%`E z2Mn8#y2<%5s#PfPS7WaPsQJD=1T{fb4DBL6gJeZHxU@hc7l8AwLB42NyT~zFTVYD& z8ov;PBRy_s5P+gTEHw1I%P*__09=7Dvk>6n|DLH;r?V%tr%(jSC`tgpy&P#F`5#j$ zQ|r87j;w0pufPC5w5^_q@B=jT<&yh?chA$&wF;J{6-*_~UX$CpZsPS|QUGkV>9m8s>(|LE!$cA|DS z@i6kZrjQ}B$3fW=gq>gdwx5lAPZdShbe2aG%p|Zz$L03DitdaSmY1_xEZW-hl05hP zbmIi+W{u0zXH9*Xl@;0fYVm%(o8O`Ye0ey@nZra5Dy>PX^BD48<$A&6#wKm_J_=G^ zYe@FktNVQzwuN|uSy5Wc@m$Ez{0qFo&$UQp5@flDUhc1zXqb653ZDCvce;2RoYV=w zYH7KL>QLFKmwh|quCF%z#)uXwMF?LXS?x?Z!=?te)gL`aR}Ow(!Hms0>ac+3Hg~(@Wrnk{3VzB#Fa{B=)8>D+#+n_0iK{|2N1iT{%v%Mp#nc@*?rD?7Bvd&BuQ+ z11Pqi$@4loTz@Yk83!8V)q5w<+do|{d;*wV{9fNjYq9!x4qViDz#P?Bi`Xdhs4%6| zgACaqI8el++p0kt+8-Y(;wd{{dJ&A^vx9XkzGL;@?4T6>zVsaZ&mhribLN%X^mW@S zXMBrKA!A#Y^A2v;1B-4Tnna@WT$-nLdulEsNdA0(ny~GkD!<%J1`_|Hhz=2^K&=;+ z`0Il<5Or1}Rdy5C8%&E4uTbzWnEt9nrDDoPvFCW`*{9i(5zdvBl-<5Q8+oCM%%mhC zD;FEK)TUwIhUW52Op&YS!pyM_cizV+{^RwsF;7S9BoVGGu<1+pwLgA42XDQ%u$@+$ zWyz+womSpYqo*bkLK}lhF1A?q3uI{2Cz%SCr^6!ids28|BD1Bc zd@e@lpRr4N2XT;Jq1DQZF`B46GW>iOavxU*<=$3<^F#AoCk4R z_y=*(sdSiUPp*43ujaeQua{eBNc=a+@T}qt>-0S;xMjJe937iYyVXphg4Ne5y57b)ovU}|MP_QB%D>DAc;)jlfe4NnrZqEfIYB2U;8x z$4R$?^Aj9@ZucZXd(XTEyej^7Fb!Wjb+3?z95_zKw zx*?*KoSq)CCezBWxAsKyB7!Y*N88u=ZqF%{h9SZ0K3>lq#+0Z1JO69{@6d2w1T~^` z)u6R3R^=^!9MatiZ}k;zSU#f^q=B$O0zbTvq^cHrAhmRIp~=rI^gP)%L(Es{drX_b zk*`a^Yx%cRKSDamRUrlIHeGk5oCgUoR6UQEDlP;O!5ZMuBOxa|$jrt@>pRT5~W7Gv5#-48S4fZO*K8Ra+44{YW4dQb3 z1`<>WT(zF9zmZB|EXwB5u-_*R$H)b=KX1JU>iNkC_G4P7XV0_=wb=z!-?;MTTRH6~ zG6|&(J-Il*_j(5FE#Gjvv zwkh4`p&iikhNhp14-0th?_u{)yR-B+C(`S!kceI#KbSk%FrZf_;RSnDtf97oDdhoyZp=cjT*L zSuZAp@&Ei6LKUC$F|o+XgSSX;kO=Q&qVUsh4n>U7zFXYUKnjN#TyDm7z~HF5@_Tmd z30aO*4y~4=4SnT-?8!7!fY%|xm|vzI!XatiYCWe1lL>k}PsIb&SBwh%hNU6w@0@Gb z)O;>*w4_GPbw_>v$W%sxw>=c82TgU~J{=D>6sMFJk}i#_^P?8=V#LObJ#xrODmzPX zS_P9I!oLmF%)OcK{yOd2&aL~qKtT7YFlEMbLBc-;Z!1(S{A7UFE8o_|^ylhy6%`l1 z?7#NOAk!pXPhpbOE&flqa&OX}1HLnySa5TYEcM5lHT%6;$cyML&|+F&mY@-mVTk9K zavWSN|3Pzs8VpSTX%^uz)G>=-4=tY1^>l(&W>IxvvRqn*eA|^)tF)NxAl>tAajj40 z-1VKur^|V7q;J}6=dSJ}2siyTR5qhsq=;Uu$?c!Q z7aQq;{`G^>8zDUlLi%L7f8HA#x)%SQM7|i4gDm~bj_6G_YN&RbPo6v}uKc4Aoi4ra zzkd#j7i*#|sMAgI+FIeLq1aCcM)+s>@#fCiGWD*2Wh*Mzp78QD=ws}Wnl3e%UG7{d zu$iL_G|umfu9>2Jh~dw*mUGnOP-8ZkT_)?}r`za%8Mj++QNg*MqkbguXPof0 zZP?L39vKSmY@F|1G?MaGJ4skZmuoEvRFzWS_fw>%8r3wr6(fD5VuY*qMvcaVOV}s_ z)1J^hk1UPr{pIHFFe)iLjG;75KV>I-#PosYMMLr42Ix7%XIDwYLG9Uy{$vd}OW-7& zzL(oS#y$RJoJO&R^=Qx8^UHbTVI`#hXQmSGHMV*jolKY8LBOuUSfnQ;tuIuyXC*9_ zBt&#Dcu*J3rL0^PRn4XQrz#rXYkx+ck^fdnNE>xg7QFeFapQPx%ohp+D_v}iX=+`( zUvy*?p;H%Y>aLkbJ8@TT0jMD6zJYcnDAzK$%}*q5ZAvV*#j!g0Mn~3L4AIK}43tT6 zpd|+TJGH=2b(v`DRM<>+FV#%MJ~l->2o9ut6LU z95KQ#H%EzBkQUg^4k;J%NvZ1DK5=%Njs3;-krCtzDL-geQkeuFD*gAHtg((XlkKh* ziI5)PG`o|ut7z{~NaoS~W`zjGCJD)fEqfl{nZW7%k&dAP)OHrQ^SBl_gWKL>BQ)qT z4h-up7S9X)jHH}M!8Kvl^687|yBw-68am|mRK1-aTt089rY};6y+nS4jO&J-3m6qzvUergt@SkiCI0hE z6~aFDb|yd80!wInwjK6Jl7xS8@7B^NPlZtmI9;navM#JnnCty2(T3e-S#;)+Z^!Yp z>ei383LIaIQ5IKfD#q3S1&r|ZGl_*2t4bYt33ZH1(v-?#Gtk9LmmyVi{l0;K*kX(YXa3Wzofw9nfIw5F znHWxH2#7>at#$=w_j8>H^iVLdA8)u}{f3?7*vAI1Wa%;@+y}bRr>w?lOp@^Dm6Iwc z@LszupEq>rEhODdFw*w@)=#*?M>{qm2p1~T548G?m%qd{{%-Ot0u$>Y6iD*J)BD>u zx&xVJ+>_MXugu8k(wCHQ(0aR}cQ44?gPrnpBw7ZV{$u7qK7PZ`8~EYb>bu)I z=1~9oT0Io{iD5zoA7T4}Sl-5J+Iz%Z$oqw7+woSnLyF*e5QTy4-HCFN_JazQXHtJ( zj6kd?Lhw11^jFNm04OUrFU^~~0aEPPie%3g_(4w|E#sL9CyftLs8x6j6uQ3URhk*}F*0Z0VDBTVT1>Nz?{=ZEXtzhX;@*$nU zFM0OdQ+rhcb;n61ZGQ-^9t?hw+l{^x=}$C6*q*nN7dGfo5tYsQwqRe-?V6ON8;u|B{KnKsK=`*0hs& z;HhR4sZFJ3<293)&x)Zcz5}tq!^Hff%bP;?g{{NL0Is&1i>@`6xNl+}6?t1qNQiB+ z7PB{r;`Y$@CeP`#_I?;ED>rmLl*E?x>}hoC!6(+}V=MW^8tdr3uqnyKp8)f#y$4d=@Kyoe6=teL<90fFgMUaTQKN$ z3xwQ-fH(sV$2tT;6aX9rI;jDGW|SONHR%C0-3w&5#c zfNb7p0W0Z5ss8_Mb#+VnjAym!#lR}?kzbX3sJ|T(fqNSq8aLUm=5UtxxBj8+-z?GX zEU*t<-Dv*pEElj2Fe2(vVNDR)_y{WfF8%ZaBsC-eSJlXqW`g?!bM<8fjX@J z%Mnf0CRiZ(mzVbCHniByFe4s*=XrmN8LBYr2daO8mGBKIJ;>b6+f1Cr+8OeJc&^rs zNNDyC*AF)AVQFj`w{Obk2e-~|?xzQh!C@BtUd-GQoR$Jq5XOi1iNC*`{ zF3Sr#JvMtV4*nRuzjN`UxLOBh977Ar57x5zf8tvoN!^5f+T=$~-iZE3v84EnxAtF( z>=R|QAF%C$G2_6pWQ)$Z?Kd!Z7eG%7^_cRKnleFF(|AGlVNDcSLq$?06sTyI)Eg3i zIC8&rY|x?t)#D_Gs`Z;DX~k2T@*WkMH{Xx#$5@$+v$bG1^B%9ior0J3cOi_tj#IUe zoxKsjj}7hw#NWAF)-9RK)_TDIx9+Iz_Q+q&eVgxQ+yaNUP;SKt{}huOnJ!m!nGay@ z$sOu|38d)Z`lfujCk%Ye1rF(JuP6ltl5E*%ZdRmfZuP>^z{7@{?;qCw*zK&Oko3Qt zq;8Hr|0g08;lO)C#7f8;Xm|goOlQHHHIXbZNi99R;{ukT12+znzsogx{9pGnv<51% z0(1~FikoJLbJ)$im^4on5m!@>g)sjxiD+8-$9n)8JLu;hE( z(cDsGs1jvCFtIv&^3zsd@H`XwLIA|czJ1MkjujNfBU! zsIwEnuw@cl+gFL7<&NEu0=s67&~3&RD?b2>>P*&c9l=F!FDwwEZ6p8hcr9uW)4Y%nzRferqJe*_+uFmC#mq7Z08@uu@drIUxcT87-vXN0O8wk1`=P$e!*Fcly7 zB~CU2`9z9AG!8_TL1=SVIH&Q-8y-fp_G-j5up+P2B1*Gb+)SmQTAf1nT^YU__@=^U#Vv;(ZKXa$Vk= zcwFu2O`98{_}X46;a>IGIJ<1_GYN(zP2JHY+qdbXG<9gcFFN`5d~K&;>cTV-e@I&O z4Y_*pT7@O{W}tK(7W)R2hf{^%^C}Uun*iAdu{lxPPI|XMKc55`j>(LqIHc(bG4O&h zvu2Rz0jrSwl-!-BtfIc?D*Z9qtsXw@omxs$d#0wG*A4TDww>CU4Pt0j#_cRc{uc6( zHp9PMMTdC6%k)xj!ydk)%un$8a`%7VQkrhq{DrbiBr=car=dDJaUs!O#IwQZZb%BEou69bR zx8gu&Nv~7BmTj0U_U*>jIi9WudjWlwMA$(+*hf|c7zTYS#4o0~BeLYMtvBRwb1FqT zg*ys&M@zTFe{B_tmAV^n>>&I1q|&knqY9-R;P{^|O?ZLpNTUNe7Z2SS@Nqf+^*OYB}4De{@Ib=%hSO;d{cL*w)qI(EhLa_@j05 zc?vM9{(Wg=Sl0S(?KTsDyc4Qs>tX#`Tc=~Kzo88#sdQsGD6Pw-g z)27)|6P|#*9ilD9CRwnBG~DhBTo;EHd#(~eHR`*5?64cED~w=i+gDpI;64s~iMROI zEw|R=0`45M$rjt!ejJ`mY%@1h4Nz>b9aLaf3kY3j##BGY6}!dVdn1_#P98{IFJc~4 ztnMX+^njiX^v0mp`LOC_Vrp=rhxPFl9rsHxSdiv6-4nBju$S_VEA=G-YqMKV`mN zifn=2&N5(_j`O1!99#JIS}JSQWerBf>h-(%s5cZ5CgEKB(Ut}KZNm*0J2E+J0CT(| z(DzkOEd@=yQI{NV+65*Bv!k##^v;>*dOHXrw#p?z)S{kAzQ1Wr0u|9YrEHKC@$ zf>=%6QOSZJyF9fN=2Y;Ng+8{^JS(U*8S$eqXg|1n!`@F=vxx!xFBNcxbU)#a@=qrd zE!QuAF=_DSi|3yzDa*5q@3uxbTI=YNWn4(aQ#`jZo89oDnwgaIREd1f0pEv1rc`R9 zh23rc6|v}&3{8fK-?KL}1D4J+efqn4?dyhff_NXz4jC+KK;r)X zK;23m+X$jo8Ny=sy%l_tGwLs*R%Db}FSc-TYQ5}=n*aS6@*+1C&%x2-A6C`*-@Q{z zy5EY7oWc09AO_Z0zW2Nr*th!!XCsxX2U;Ynu|s3aqh;2xE%@1^`&Lleq>P{1bO^_K z33R2jjOOP;(AmDC@!0PPEIVzGArA_vXt+RdOv6yoH_kNAGdh<}Ov}lp?bO--Q`1)m zMD=`cFO5sf64Ds3Gzy5)A=0qK0@5KZp&%fQupo_+A}QTSBPAd$-7S(!cgH(?e&6@s zd+)@ZnLGEKInVQ)qu%(ZttMZjv^gF!T)sLmD@sei{C6676dqy07Y_QCr-rxkR zEf0KQELkc(o?;$ejgPx_i=5MIY1pufrw1-|ovr2@T-*7KPTxR6g#q-uS5S!|>(Ba8 z1fE}UvDe`(%X6$BH)inC^Y?uHbj`qs6tqWpe}glrVQ-^vN?uR>+2zvWr_h4a8=ZEq zSI_9?-2~jSN^27M-#^3oby7ZVS)SN1}gYoL84fD+JLslx(hSv6+;@D=c;tsQf*8#)Jm{^Avlih?E#kGrv6l)vN7G;7AqU zCw&^&C2}aSD8m%+t!_vtQHnVR*-({Fzi)t#D(AtD89iUYzg#V2g@taKm>6zj8 zHhS!QLMj%;5@4A^wQZria#@chorg!65(4!K_nU-qeqn*%q=wPW7Z)|1bZ6YtTEXkG zGZiv#7m1Gb0``$2F<3-c=8bQJyEgO5kXXj1eC7|!!uL63HF=r>019;S`xZmz;*+gN zFfxo|0M#x^i#5#2*E@H!JIY}eio2e*9XF)Kq`Izt-<+~(`|K#3N8tEHK5qg~$(CxXP_}X>#;4g)**{LepudD{ZA^V=T^`vW14wD3mDT$e zJOX$xvz&s_<5~}Jn#P7U7B&9Ld2H137`OdA8({!d{b5FS_17Y!BuNu%9 zT@iMClj5vc-EXc&;|Bc+cH}ToBQ_W~AzNMKCHh{h?~f&Fm0dVUS!Rh);Wr)IVKS&0 z-O?0Oz&yA$<}d)M9t4-@hZzmTwBHcnAQ2_+-_skPNH1J&=F5JUDkd@~`9@T&|Ka4; zjNzlQ#Dc6f@$0W7_R%Ay@{PBnslJE)WP~zatiR6O%SBkQ!3-JRCT}bK7oPj?(U-AN z3V9vQf_k#i0FoCt_1X7{;%Ezw>wS_2G5YA7c>+k9&yeF+4&giGpvJVZ*|EV)*>uOM zf@P)7EN9kty`ygrRZ}mAA&~Rc#Dymr8Nle42K#_{!yS~aTwVx{>qFJ#tF*U`q>!}+ zz=-?@s3&C~6eZAEV}r>gu3mwPk?g3!=rWcim3&ySfyc6eT_$9}16_OkxBvQb9ZwzQ zIAL=yKTYhO=s+DpC)JBP4f@osvF!W($qWB+r3W~^4D!P-hn==4*a(Fb<;)K)ToiYt z7CJlg2BZ`yGFdaiwNt~?IeLa!Z=OMXx9cpXtiE6ZRsnJ#1H6fAx?@MxJ+4g6m%3^{ zjMx5r20Q1V0ujx^JXQ!Ix0;NDL@;~)z(No5!|9K-M5Q$a$XR--zMxH954olzjqwU}$QVOH`<1Z8Y zL_~m_LM?&?p--%JV*{c74BLLP?A0l~r?{H3JHV5j3v78oz=m|%m=GA2`*uM^ap%8S*>QCf`vp>xlfIWkh$^ zMzZrs4DFD``=gWLzCFF3^V#;GQF4Uc{B^1+;Ok*P%wtj(tGq5efU|Z)i!CK*b2U3N zaD#Y8M>#27_JTL*dd+jw?Myb@7aw9iRDX8X(C#!#q>kDh>&1A{t>h)@GJb=oF`HJ( zdyt^j>*?m5l^qfAH!WJTPouw%o4)p%fxP( zO=kTLGvp8iEXdG@udeybGE^HcTKOAQayL=zXvb^-0a31c!l5{Zba7T)=C|rh|2Dx( zbsN@M!1*-=t`SlIo9Sf8d5~50l0QZ4EC;;#p?>wUiyvvRU|M<-79pw}Gb zsUB8){_U^`a1g>$0ECvFBQ?JFI`_@P}h%im4P1+SEJ2$^R1~zb*8@8+bsH4 zzOgN(<)m?6w!cTrRxLpiA0ml%d`yM{)FHU+l_3m(tEafb@CL}v3_E?3zz;1T+IE{Y zW{mw0mUeAH{R~U74p0#NzgiqQ-oYJ&@Z#qo55aa^cF6Sg;q00cM?ytt%MdQVakhDB zY)kt!5tgO#E3`a6eY?@?K`%vHQe~mmg?eU4!_yDv4KK}kMNc?s@damqmQA6Y*ArZ; z-J=UL@vois%=9FGSNc*TPuE(_3j%|?L5ZlAzkcJ_Z_b_$KCJwdUG9%2WOj5ar`nF} zXnIbM^(8Xf9<;T5i-_gL`TdQQ7-KDP1O>dxY6k|~=#j}UeI!D{_#6VI7<^o3ZWWCp zN17uWL6|zV6k0^lTF;VdHl7YEVCa12mtf&a^#O>wWxW@AN%R4IBQ_rY2JQOWAj=P6 zG|#Y-0X5=xEs6Fe+B&vv8*jS{^WPQ*WL%N!I~!rjGcOBs6J8{?!{mgBc&-rs*1cWd zuW^?m?;@2&qrH&FI0KDObrtl~j~rboNl#v5s2!1}O{pY%i39rmVRyktE?pUu_v=Rw zemGssQJ2!8q`)hU3gHKJjd4}CZ(oShlBYH{>^+4n$FqOzjpySK=BPo~kj*BD8ihsR zmO`-@c!$4~Obg-mNw_*w6Gv-GDp``G)~pVPkDJ+wEMUb*3Oz``{JT`Q)8^FVS=SI^ ztO)h5e)GD}eaT*EN!uxbpncWKyUV*VWIHsPjF?>Xp#*{67 z{)}b*IXQqeSS6AC$HLdKAvdU&qzWJ)3v+*a*mq zIRGICRz^WA)A%gMnh(8l88`x{-#-Qi+o$ChuQtaaI<;sgZQ)zSaw<-PV))a6LznZ) zlk#e9`s?EOd_UT!PmKut2WX$?-(@-T$P_F@SX z0#@Xhz#ejNFgbnD`!|7qj*1Rr>I#lGNJPx?G|2W-T8l=ugeu0R8)^vO|| zMO9Z0V7k4o0+=EYp~*iE2=RwE*?VkKDxex?lC}R)U zP1M5>rxV(&(v=`22mb;zkLC&jr3H8J(C1BFbn zdM;?1L~M)P^7!iQ#ht(qwMR-JNH!%y_vPNrCU+pr0@;Ui70jRQUa66`<-=HT6lTCX z;1G=xzwm?cz=#14HTe#R(A3K#TV$&#)+hA#q!xeyn-8K&65JGp3JI_sC6jkRwZ~$^ z!NMW@HWy(+b>7k%QqY*th{etNlZnd*Hy+BRw1vS^ff!V}bvYKp^LF5&)z3&BzU z4!U2ANT~n+5-5JQ*!7hU!hgB$Bo1itT&rX}jhi8vN^tDPDgOjIEUfzinhBY287OByGg#xM)GuUG^aW0E`Ob`@N zE?ze?tl@ki^WHaRb~zH2v0z2U2*X%-l<6aMy;K3`x!~^U#kcW}>Ze6|@2Kw-21em) zst1Fmc_wY5YbCDd!{=ek2~k+7F5ivs!>D5aIN-qc(A#6B-bEv=eh3;;OCa2>`$(yq z5gNUtvK4uD?gxR_XcAps{WuEeJ#`gy7$8S}hyj-_VZ%F5pFv>a} zxH*{ph9jxtr}_NS)w1uE69!?6lGdXctyu60G$0am)G!X^^P$%}JM{t{lS@fV&JrGM z13t?}w=D)raj^R`Xix-fYlvdI7X#%2%6tpB5>TRJwW(~y7QpT4@{w z_HaIg(FkD`M)BgeG1Fmk#0B(=f`p?Mv3$1Ra;?q-{e;7NffoUG6D|2()X zd^*)`hIgva1Jcb_8Qy2$9I-3Jj#B(lN2;*86ES=DW>(Z}uU6mzMkyUv7DC#w`ig?*mFkA?Z_o5GX4W@8$^0^|y~@8N5^>Z&~C$ZDzbjWvaB~ zD2a}G6aQ9*pqVQ(OeK-?+`)UXZ-ReGmTtfRUAS;#eeUq@VwD>kLF#gME@paFupD?% zBP%h9=@3d4N(y{GLpfyY%`Qq+kR=8a=do+^^OkRpqZR5MDq_)IwZ}M7ig{TZMmO#B z;h*;*S5f(aH)tLeS}CkrEpedJQ2p^AOF&EP&`W6Tkxz}S(`B^k{Q4%-fa^|wZ->vp z@v8z3rpSu$;slP|{~n5&lDR2Kr6OhOud|DhE*xjvJuWWm`n2FwDjL2B3TM^3XH-6x3cH+4W{Hw(uSU#cik-6 z`;m5L9hS3Qg(-*^_+kt`oqC#HN*?L;{z)CqTexrIxr5kAUi%YwUlBzhyxE_B$Vady zsJJei?p2{NC715d{xWcJfNCdr)^(mT)pK7yN!&+l{m30SVnte^M;qfEKi_Zs8z{LJ zO1VCp#yIq=8jQGuDtNoeN`CvBSp({gkq$SWZ)Pj5yE|4^R~P+B#H{LZJEIpC7A7jJ zH3*3e?AjB7R7;BIQTVL@5YPkTnJH12xVM#2@Oeru$OaE{EqL$9)^wfL=qC#)3)! zU&@SRDaQZHh!j&7z{X`k{R*cQZ13#c$12Shuca1NxqhXT+C(j(tqh!YTJCZvsDoF} zlSVi6|R}f z2?ID=*e!AVBPOkZM1o0+7;CYI@ zPOab7*KBwjN_JZbJ;5#w(6viFB5wd|cpR9%a>vLy`d<`y3^l^H(t4c)tyXD2he*Fx z7@Agcu>3^-rQP`rbO-2vNgYY=O&sU=r;tKDxRQD5HB-AAhZZq@-?E#7eE590)Y(Y0 zX9Lmo>5llz@g2N12qB|q0NV%|6p=kuv(po)?Hw!ximMk3SwP-#s#8;+&niz~?b++=lJ#k~4iOkG~Z*m|%CUdzK| z4uy-(p|m@e#OWgHkT*r~Ywi1IhKk}Gp}TzK?!{t05=@(-u`S;2=%s_n@_}Mss5=NS z(@4WYI=@Q8i=E9_QNILi$CkwKxmP-YT0?`+zLtc*bJ+ps{EQtG@KeE z5(%71T0*&b0TLd%1&?$?S3{}sqn(L8Kok#KQ{|_HnBeO#KB>8|W4!}U6WurBln9JG zyTjgjZ{F^up)AF4zM#C1_)CiU_}K>^&42nu_fcgx^I12GY6dt3cmdHihu#C!wmafZ z5#M9;Xm-*(n~8jhXRi4Eqe472<~?x}HE+$(?B{4pYnx`*#;9(`h|(SXF2WYGX%YeV z%=D$9yDLE6@q3|ePjMv(&u7x|vteiR>I5u2F8J&nw|x^{htb!6WrPv*$b^Oj_idB($J zg@v?RS(EZg)(1yQ(p_L~E*NuH=UQMWl%MZixdPT932aJ1Vd3cn-TVd^<+u%rvL7PL%Nn#5f9~h@rcN>p z>mh8V?T7ZzSxd0*M-QNim4CMwVOxpvl^e}sN?_kWC#5mfJh2vS18a)`;r4%f#_EhO z+PpjT^HenDw1zWYMR=9@f=%cMjb#H4atKTp<;Dm@qHZBhODw?NH)I{djD8+pS*@Xs z{{ofKC6L&GI!_hVb__$@iyt9T$fv8y|HS?&M*b)Iv%R+!(N;vo$o2Kk)!Rh@n2PP~ zNo(!jIOmkiX1=4Jb&p``$ei$Fsh`FwNO0uxhA8hXhB8@}&EKQ>erw0Doz-nQ4LPFZ z^wRYMRf2%CboB&T+m$_IRxXM!LGPLc{#HAzA9dp&ryLZyy{AvEd6* zP5W3wtrK5D+YsV0I8w=PpJ(_yD0vxl+@5tl##t4Kx1ERHCS7Jgq^M&{mSZj*g|cI> z02+U-WvNo}9n=Tc|NRBu!BNdHC|jUbs5Pi`>kyM53o-%qLBG$(wZY>eCfMrw@in2L zRGH}yPkJf-f4aO#QSvCh{D8Lc{QFgg*ljk}s3w%;fN{bjxL6tJ*0^MNm6^nSu*x|SWC`X?8m9@Dnt*X^yoe$F4Bhi%xuVt>=`uz))Xz80L! zUd^5aSZ#!cC6&Y(@1Lsa{K?TeRpd$~;P7oRdY_rv3xu=>6ZqLlDSa)2?>`q4pe#Rf zZgjN$1({ToQ{>=eDRK%yn_-&mWd0h5dJ)WPon@H!EZN@5uJR&|o>2%h&QZcXDwuq} z{i1kOMDMk};;qR4h%t5ZYZgNu%3Rd_?}(xuwNQHWlY&O0a*%(7Hmk(a-5RH1>~B13 zhroO0&#fW>-n<*Dv2kMb%Tz*WE1x1+!+#E*JcV=tJM|~QrXypZ-9uigO8_7V!RYrJ zTZem@6bzv>_w|N_hc~qT+BSH3L13qAftrt$My06n3s|9D<*I58m%|2XjP7D-{l}gw zRnLI%3J#${L3d55==&dkC!h)Awy56aik2x;MkDGON^g~oE!ZyQh5i~VmL+w<`DWFB zO1&6t`tPxTWlKRVM>bR}Ngq!#saTlmL`N_Ia)f8EEejucdA# zYBF(hrkAb_<%hV7Pz~S#4haCP2J$=Np0}YhOEt23 zVlIPM_d`(u&RJJ6W61lOB1sklUUkSfQ|qY3S{FBSyNwUsg%(JFTMX}*F%WK%Yo}>u zlLAX-la&v%SYTQ*(7+?aevV!HS1j24Sh)S};2pnG_J9_4-~ur;N4Y###YcF8t5v#J zpCokXrA$WoKbl-w{eos*1@w_)!ctRLD}W51Z1p!&BW5WRig4mAyxO-dGchg?eD@uT zqbTItu>4BjfeNR7*s;8{5e5q2EPyrykJRJ}Fdr?qZH)}XZh?Y6D)7F>sj{CUg~a%8 zlf;eU2TWEjL{AFbk9`2sdc{FKW+r4zwzx5a#Dx}h(HlyB=??5-zR-XpB`mBvLhha=8(UDOPtj#Xscl|3o^sX>c>8M zG?%`sh{TMEr1hqFNLq#|#Vp85t@Q=ey8pJd#MI{K0VXpCc=Sn;u}%pikwU)=mc)lz zv^E(Vsn}1i5{XU)d{m)6G*Gx&{N9lpH(X#C4b-R05jx&Q68IbsVMC3{Bs;;mj8I6L zqqBdE!IiIs9KdP|9RM5541SR=%~op+f%5ETqE%PM65qhx6X8h``sUJ@3QCNa zc!Z7?CUY`5^wsSZeO^dRJkIeW&D42T(lU_tq#*vI$w(@(0!T{(=Mi62%zoO$>f*gT z>5HVkvliG<#TXLrBSe3c-a6@FCYfFvsubIBu)6b_Cnv+eEOm}J?loF{MhKB;AH(9LFBfOh`S#BGn)!z-8E_`O#KzbLo zNc5*kRBvIr?z5A?5gy8ZUvRDDt&?@5vklRE8rIe>{xU%kjnq}BdFY1M;rzV0gzi{PEm%@2m5DYd^znvC=j;vvO2H@&ZcM9!zMVgXru%Dd&U#SP?Ny4KeV-F?XOT->c-Yt6-krxLF_PsCF`gh_ zM!FliBYLuW=|C-X52C<~lf-y^!Pr*tss`&RK zuX9`0bYn*hCK1eU!SP4zUZmHS<}cqnsHKj+&7gmw8p5VE-uk=&rnabNMsuE2&zKUe z!Hq1a1?zcb$bA%A>)GY`{Dr$G+r>#XhM0A9BU`jY7bGwcfwAa?KN*}b*Cb{w&( z!-U6-gnZRy2qneUn{zLsE`S4AU0;)1-d<$`Pl3A1>rv^2D3x2Mmk>b%cd}nYyX}AL zBl$uLe*WbdZ#&PsPPe;2v`H8wu>om&*a#cXhiugzCKET@TVfA^5nGm(I03A6#X(OC z^VYX-1h`p`5$$J^?_}W*n}#5X@hXk6NW#>vIj6Q^SpZ8hdlSw`GNTVgM&GQH2&c?F zw~{fE*<1hUSaalBZ856I@q{VI;yXi~>8c9>y6cg)*V1&~mh8W_JP^yiuw5B?lpbYH zAxc=aWKGd#QvqbO3rMcEr2~f~Qa~mS%Ashd;`7cX=f2X%z82T_RtZfUhjtUjJ~Y>> z+_jUP(^7MmPRvX+RN_P>IeJHZBn8G8j4+umzz;t3aL{GxJ%x-QXOd20i^;iz%XU;8 zI#P`Iy!lKrL>iu{GxWSQ-sjxr4~b|-a)s;A*Or<`xiw{h&2jZ5-`4`Qp3&9WmIr6) z3y9Di#vJ&=A`o(WBImIgd;dn*RtY^USN>(C{R|P3uP~5#B{N9G5+{{9AucC*2L;ox zO`kN&R%TK$Kz>?i}XS?ov5Fm>W0mm$SHrIB@ykH|q?O+#}=hVr{;+g+`W*p@vw z2e~50@3gPnd5j^EfyBCklK1dYF|y^!&JLa@OBIzA1sPryo&n7T-Sr{gX_Yv+#09Ul z>{!+h@cuJU;o#411yy{Y8vSD2PM>Q2)WayU#FA&j{+@nK_XSu{ zzf#VtZ*tXsC}Oy*BsasDL2W$b+1lXv>k)7!RHo#$%~!r4beuoXFhsMzVZ--kV_n@7 zx=Qp!>luZ3%OiiXUU&ISxe24r51({4DUvJpm|J*@tp&KKbr(<~Tsl;?dm2YiEFEgw z8l?1sHXc_lE~L5b-^JBH@)B{%k5-B(Z+fow&j8SJn^vVm)-NwS()rmb$2P|(cOO|H7-N3w5fHZ4%gd)A5A-l9}dD& z)DhIqp=;_xwcR_Hq4D1h(ETI%Geo-Q!YT_lFDS3^Ms=sYuqU#_QTE3<-1I*#x9}>( zj2qM-12yi?Mqd!6zw&cpeCahle`lXdwbe|0IalDvlm3Xy@tgb%_VsO_YZ9k3%N}W4 z>mg`Rp3F03a94?Qiepc;59yD$8jgJ6FeAbIP}3hFcT^8--pAsHVfhPB#Du6E#Li=> zo7$3>M7kBJ-w;K}+Xb+}mJH5+UJbKeI}8S2&0je@=m+8W0e|Z+hhDo`^VjNHY}bkD z{LkO7|GD_Fb>Rd1;VoSnz^}w&s=DcU`a(j6nqT_pf2%%^I^rsDfYZbZUiVFe_N`)+ zbcxT+YWP^Qq&!8rvzFt=j$N-g7#FSbko!Bj{?5?lfObRWyT_bF!nx7UD;a5ddk{ubEyC{^j#}d!*V{dNUwtG zEz*Wa$r2}&^b6%Mnmr^4>TJl3IxLFE`=!(*L|@{)TB%Q%%`8qM47H_cqck~TiUouW zyGT3n7$i|7jg(XJ!e@)DsP3K~`)2#K!Vg&;?;*~t{Poy3K`buSHrb6_mkrFRpwk6p6G<9 zZcX;PaToOOXwYK=g6etl7G8P&f>VCrU`^;{975;$hgq%(B6Bg-i3lxQ>l7D;A){f& zoZ~?OwGY;#FaB(YCmRVWBVExA{mb~z^`K9QV_6`L}=@fZx*j2t{5OXPU8i@M0p zc1Er6`)7dmV{tE%63I)ke-jLZI}a>cV(eX0X#0ctA8tMdvc(Su3df&5oC!CRSJ`@=pP!zd$}!7sWm zG>`-AP=Hry`Vmxhs6>gX0!h<~!NQ<77zS3~l)5dN;AT^tKQ1-LF`;jgBCoPy5eYNm z_D1oenw_-{WhX-^)xK1#pLEFOMPmQaPvLau^{v834dj*W2>f9Odi-+QCQtosmC5WUh8$UlPM62|N~WZN!16>7-g2NC6R- zcSbMle2!f{WIMgKSXrU9yIpc7d|g={ny2KC4U@W`A8wdP@IO5XiGp2S4%aE^k>#9ff-t!WRbyK znz-~VXSbT?MG-So?$5)Bp3r4Gd7vLTtP%?w$b6nMJK*M7#W`@7_N7%$5sNlBid`z} zPrS1xlur87ZuR)VThDbXwlVFnuy#Gl2`VXu7L$z`lff9uQf7ki^5uSc6Lk$CBK6_HXrS#d+3&krW`^fEqi8-)CD+UdBZjvzRP zOH?|Roc!lyxa)Z^*V3Zjymw)g{k;hy5}m1T|+d*Ufyqsl{;I zeQg4wFMbT_YypNgRWbIVAZ;PrYen>~Bajh!J)wjVF3!*3aee0YfUfa8d7Nf6OVWxc z3+?*NnZ=hUYNek zmXhT)E(Nikx~(;os)0D@rUdkhUi>E2hiq%=s{h7>`(yv>W7k-4MA}p>soit;j1l-JGw=J+Sx#k$)D001 zFSWG-+R9FkaFpaliolq<=YUA0lyybRg2v4;qd>mY2OZ`?uH+O}&KC9%Lpc*( zZz)ePiX3#=Rec)s&qt{h_&&X-oaHxYLBbl+p6C#TBVk=uD$*tm-Vax}8AjNl{*Pc% z3>AH}*B#mszu(YxAr;XBhzwn~!!1`-%U!@r_{S(V2$X6{j&E-q| zd}wtaA=H1_^>Ayrm)(TRwH${vg8`2-E$B8;r0R7%Ne*krg_G-?qqB0oyGyACDLS<% zURxISm@dwoLWU=kH(^TpqLMPe(<+ITu6J!UX2u_Zvu7auNoi%?Cn9;)lC@^bCRF{f$@d z=ht!G-GhKv)FOh;yeXbK)BzxI74r_|wjiD6GdjBzS$QgIDU z%lhpDaF|01RRBpvZHO|^+Rx|=hTYyDYUh~E$G2nY>ednC-6Jlj3TcUuv}d_0v|sD^ zAVn^dz8i=MuYwV~ih25sYK-rq?GA}`(7O?jSID&E-o!AYp`fNpw zEY*&YFn0fnMNrF;sO?c|t%%x)`yKcl?e~bMY;-_t?4Iq4YlprIUiG&H-pVM$8dBLg zH$4J2!Pu6C-{PJR3ux@a(Hg^|v+s4rkl>?8uK5}AePf=Fpe60-E`kM+meicot(`hd z1X~w=ZWbTZlF)KxN-=YQ;w=V2Y;-Of_q5f*yxch(uba+w-&{2mwJ_N!3U1Sk6$Wzy zIK+|-M$CMu#-ag15ZI!^h)CMLscwRFKT&*n?+*cu@|&My&(;rxsTb+@2^0O;@&z0f47b!rHpBl`tw<%E&mk>_gtrpig-Mc|AVFaD{9xCTTC8L)Je@SZINI^lUh7fe_~PdLd>#tM z#9CYtk&T3<{&ZSy8U#=ak*y5G`{d2%^&%^m-Mm;3+--%8wQjsWN*3ZLtef|+HKBgC z^xxd?*V)zcc-WeD^$&tq5eBSM2C%Rkh!b9kQD^hIF%kH)VuFb?X5+bXv;DoMp;oX{ zyD+}8N~ZZOrZaO3en_4^ zZhy0Nooh)&7LI`(Pef$!_08>mf$__j{`}1OAe@#Xph*6^p6Tjw1157Rb*z-J`A~7| z!dWnfv^95iR7BCe@N%D$Lvh1TntZtaS-nVVH{vAb0LJ6~%yszh=7KqB&t`K!G@uJdQ#G9GIR z-@W;Jf|5+LlLC2(gN*1(cFr1d%Bo$=c@{Aw#51b~q$?lDriM4D+K}N00i_TFWQkyQ z>~_SmmM)}}CVH~RPq!$W9p4!Rk|4jJB(SK*ncVznDQK;8;CPpGDdO9wiM#v~1(COl_a_x7$=k1-QKaGU{X@Q%O|3++eG2;OdO0scLF97Y{|4z(4k#Q!dx=ag`4@gD>^}< z7Z`Nj@k$ZD2$SC8)nLtF#7J0IL=h(ue<6RewPG?iAeT*Y6N>^o51Xn99sA zhq>b4iru7tgg+Xgm>mDSVCLn(B%_{8B`qA!!fS^(F+u$%-{Fx>kjqN@y&^~bx{v?D zSQg1oF3F7lCk2j8nM3^heS_Dfx6{S)7P?CaLNo1>Jj(1w1|eXE`pMYN``6@+=eW3% zki|WSMA>J2#ZRea#OI6!N2{<7rSUDyl`Lq76vj3w3KGdH6Yy#++pqQsb_u4h@C)W& z;x;*-zL{bSS8T;uGyR$mmh!zp;F+or^~gDoz=&BHq2=K#I=QZRn45Ai%uPv;kwfVQ zv7n1jyj9$oPRXGXzN=&?$OHKOx8y9ryZZM@jbD5x{fkr4p&ayity#d)2-oPIUxYtq zm=X+=PL4k0Uf^uQZ)5^XnG%wJFP_n%m z^p{*~Mp-`yu~efuh-d8WLPcu)9rXD#8%xN&Pv0C5V_NH|Imsn_AKZsxSbT5DIBhiC za1gBi=9V z{X3C9#Xx|Pn}u!@%G(8|Mnu=`*P@i3XV1<0AFD!KK$obMAHNM-%h*frFEOhndqr{a z{zv!DJr5R7NSG81lb6j-t}%F}(M*@ + + diff --git a/viin_brand_auth_signup/i18n/vi_VN.po b/viin_brand_auth_signup/i18n/vi_VN.po new file mode 100644 index 000000000..b48c44eba --- /dev/null +++ b/viin_brand_auth_signup/i18n/vi_VN.po @@ -0,0 +1,192 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * viin_brand_auth_signup +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-11 02:01+0000\n" +"PO-Revision-Date: 2026-04-11 02:01+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: viin_brand_auth_signup +#: model_terms:ir.ui.view,arch_db:viin_brand_auth_signup.reset_password_email +msgid "Viindoo" +msgstr "" + +#. module: auth_signup +#: model:mail.template,body_html:auth_signup.set_password_email +msgid "" +"\n" +"\n" +"\n" +"
\n" +"\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" Welcome to Viindoo
\n" +" \n" +" Marc Demo\n" +" \n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" Dear Marc Demo,

\n" +" You have been invited by ViindooBot of YourCompany to connect on Viindoo.\n" +" \n" +" This link will remain valid during days
\n" +" \n" +" Your Viindoo domain is: http://yourcompany.viindoo.com
\n" +" Your sign in email is: mark.brown23@example.com

\n" +" Never heard of Viindoo? It’s an all-in-one business software loved by 12+ million users. It will considerably improve your experience at work and increase your productivity.\n" +"

\n" +" Have a look at the Viindoo Tour to discover the tool.\n" +"

\n" +" Enjoy Viindoo!
\n" +" --
The YourCompany Team\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" YourCompany\n" +"
\n" +" +1 650-123-4567\n" +" \n" +" | info@yourcompany.com\n" +" \n" +" \n" +" | http://www.example.com\n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +"
\n" +" Powered by Viindoo\n" +"
\n" +"
" +msgstr "" +"\n" +"\n" +"\n" +"
\n" +"\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" Chào mừng bạn đến với Viindoo
\n" +" \n" +" Marc Demo\n" +" \n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" Xin chào Marc Demo,

\n" +" Bạn đã được ViindooBot của YourCompany mời kết nối trên Viindoo.\n" +" \n" +" Liên kết này sẽ có hiệu lực trong vòng ngày
\n" +" \n" +" Miền Viindoo của bạn: http://yourcompany.viindoo.com
\n" +" Email đăng nhập của bạn: mark.brown23@example.com

\n" +" Bạn chưa biết đến Viindoo? Viindoo là một phần mềm hoạch định tài nguyên doanh nghiệp toàn diện được hơn 12 triệu người dùng yêu thích. Viindoo sẽ nâng tầm trải nghiệm làm việc và cải thiện hiệu suất hoạt động của bạn một cách đáng kể.\n" +"

\n" +" Vui lòng xem Viindoo Tour để khám phá phần mềm này.\n" +"

\n" +" Chúc bạn vui dùng Viindoo!
\n" +" --
Đội ngũ YourCompany\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" YourCompany\n" +"
\n" +" +1 650-123-4567\n" +" \n" +" | info@yourcompany.com\n" +" \n" +" \n" +" | http://www.example.com\n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +"
\n" +" Được hỗ trợ bởi Viindoo\n" +"
\n" +"
" diff --git a/viin_brand_auth_signup/i18n/viin_brand_auth_signup.pot b/viin_brand_auth_signup/i18n/viin_brand_auth_signup.pot new file mode 100644 index 000000000..9d710d8ab --- /dev/null +++ b/viin_brand_auth_signup/i18n/viin_brand_auth_signup.pot @@ -0,0 +1,109 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * viin_brand_auth_signup +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-11 02:01+0000\n" +"PO-Revision-Date: 2026-04-11 02:01+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: viin_brand_auth_signup +#: model_terms:ir.ui.view,arch_db:viin_brand_auth_signup.reset_password_email +msgid "Viindoo" +msgstr "" + +#. module: auth_signup +#: model:mail.template,body_html:auth_signup.set_password_email +msgid "" +"\n" +"\n" +"\n" +"
\n" +"\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" Welcome to Viindoo
\n" +" \n" +" Marc Demo\n" +" \n" +"
\n" +" \n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +"
\n" +" Dear Marc Demo,

\n" +" You have been invited by ViindooBot of YourCompany to connect on Viindoo.\n" +" \n" +" This link will remain valid during days
\n" +" \n" +" Your Viindoo domain is: http://yourcompany.viindoo.com
\n" +" Your sign in email is: mark.brown23@example.com

\n" +" Never heard of Viindoo? It’s an all-in-one business software loved by 12+ million users. It will considerably improve your experience at work and increase your productivity.\n" +"

\n" +" Have a look at the Viindoo Tour to discover the tool.\n" +"

\n" +" Enjoy Viindoo!
\n" +" --
The YourCompany Team\n" +"
\n" +"
\n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +" \n" +"
\n" +" YourCompany\n" +"
\n" +" +1 650-123-4567\n" +" \n" +" | info@yourcompany.com\n" +" \n" +" \n" +" | http://www.example.com\n" +" \n" +"
\n" +"
\n" +"
\n" +" \n" +" \n" +"
\n" +" Powered by Viindoo\n" +"
\n" +"
" +msgstr "" diff --git a/viin_brand_auth_totp/__manifest__.py b/viin_brand_auth_totp/__manifest__.py index f8710597e..4b6211fd1 100644 --- a/viin_brand_auth_totp/__manifest__.py +++ b/viin_brand_auth_totp/__manifest__.py @@ -51,10 +51,9 @@ # always loaded 'data': [ - 'views/user_perferences.xml', 'views/templates.xml', ], - 'installable': False, + 'installable': True, 'auto_install': True, 'price': 0.0, 'currency': 'EUR', diff --git a/viin_brand_auth_totp/views/user_perferences.xml b/viin_brand_auth_totp/views/user_perferences.xml deleted file mode 100644 index 6377a40f1..000000000 --- a/viin_brand_auth_totp/views/user_perferences.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - users preference: totp - res.users - - - - https://viindoo.com/documentation/16.0/applications/getting-started/external-apps-integration/two-factor-authentication.html - - - - - - user form: add totp status inherits - res.users - - - - https://viindoo.com/documentation/16.0/applications/getting-started/external-apps-integration/two-factor-authentication.html - - - - diff --git a/viin_brand_auth_totp_mail/__init__.py b/viin_brand_auth_totp_mail/__init__.py new file mode 100644 index 000000000..c738ae874 --- /dev/null +++ b/viin_brand_auth_totp_mail/__init__.py @@ -0,0 +1,5 @@ +def post_init_hook(env): + """Replace 'Odoo account' with 'your account' in 2FA invitation email subject.""" + template = env.ref('auth_totp_mail.mail_template_totp_invite', raise_if_not_found=False) + if template and template.subject and 'Odoo' in template.subject: + template.subject = template.subject.replace('Odoo account', 'your account') diff --git a/viin_brand_auth_totp_mail_enforce/__manifest__.py b/viin_brand_auth_totp_mail/__manifest__.py similarity index 94% rename from viin_brand_auth_totp_mail_enforce/__manifest__.py rename to viin_brand_auth_totp_mail/__manifest__.py index 63c5b97d4..55f730f88 100644 --- a/viin_brand_auth_totp_mail_enforce/__manifest__.py +++ b/viin_brand_auth_totp_mail/__manifest__.py @@ -47,13 +47,14 @@ 'version': '0.1', # any module necessary for this one to work correctly - 'depends': ['auth_totp_mail_enforce'], + 'depends': ['auth_totp_mail'], # always loaded 'data': [ 'views/templates.xml', ], - 'installable': False, + 'post_init_hook': 'post_init_hook', + 'installable': True, 'auto_install': True, 'price': 0.0, 'currency': 'EUR', diff --git a/viin_brand_auth_totp_mail_enforce/views/templates.xml b/viin_brand_auth_totp_mail/views/templates.xml similarity index 92% rename from viin_brand_auth_totp_mail_enforce/views/templates.xml rename to viin_brand_auth_totp_mail/views/templates.xml index 0d1abbe0d..0aedc808c 100644 --- a/viin_brand_auth_totp_mail_enforce/views/templates.xml +++ b/viin_brand_auth_totp_mail/views/templates.xml @@ -1,6 +1,6 @@ -