From 84691c11b554aa01b8371d36fbb8ca6c891e28a7 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Wed, 13 Dec 2023 15:13:17 -0300 Subject: [PATCH] Added options to toggle "Time Left", "Filter" and "Sort" --- .gitignore | 1 + WorldQuestTracker_Core.lua | 327 ++++++++++++++++++++++++++- WorldQuestTracker_Initialize.lua | 3 + WorldQuestTracker_OptionsPanel.lua | 41 +++- locales/enUS.lua | 8 + media/options_visibility_context.tga | Bin 262188 -> 262188 bytes 6 files changed, 376 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index c9925da8..7348b6fa 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ locales/zhTW.lua *.afphoto api.lua *.png +media/options_visibility_context.afphoto~lock~ diff --git a/WorldQuestTracker_Core.lua b/WorldQuestTracker_Core.lua index 44cd264e..01556f2e 100644 --- a/WorldQuestTracker_Core.lua +++ b/WorldQuestTracker_Core.lua @@ -3566,7 +3566,7 @@ WorldQuestTracker.OnToggleWorldMap = function(self) setup_button(timeLeftButton, L["S_MAPBAR_SORTORDER_TIMELEFTPRIORITY_TITLE"]) - local BuildTimeLeftMenu = function() + local buildTimeLeftMenu = function() GameCooltip:Preset(2) GameCooltip:SetOption("TextSize", 10) GameCooltip:SetOption("FixedWidth", 180) @@ -3652,7 +3652,7 @@ WorldQuestTracker.OnToggleWorldMap = function(self) timeLeftButton.CoolTip = { Type = "menu", - BuildFunc = BuildTimeLeftMenu, --> called when user mouse over the frame + BuildFunc = buildTimeLeftMenu, --> called when user mouse over the frame OnEnterFunc = function(self) timeLeftButton.button_mouse_over = true button_onenter(self) @@ -3681,6 +3681,329 @@ WorldQuestTracker.OnToggleWorldMap = function(self) GameCooltip:CoolTipInject(timeLeftButton) + --sort options + local sortButton = CreateFrame("button", "WorldQuestTrackerSortButtonStatusBar", WorldQuestTracker.ParentTapFrame, "BackdropTemplate") + sortButton:SetPoint("left", timeLeftButton, "right", 2, 0) + setup_button(sortButton, L["S_MAPBAR_SORTORDER"]) + + -- ~sort + local change_sort_mode = function(a, b, questType, _, _, mouseButton) + local currentIndex = WorldQuestTracker.db.profile.sort_order [questType] + if (currentIndex < WQT_QUESTTYPE_MAX) then + for type, order in pairs(WorldQuestTracker.db.profile.sort_order) do + if (WorldQuestTracker.db.profile.sort_order [type] == currentIndex+1) then + WorldQuestTracker.db.profile.sort_order [type] = currentIndex + break + end + end + + WorldQuestTracker.db.profile.sort_order [questType] = WorldQuestTracker.db.profile.sort_order [questType] + 1 + end + + GameCooltip:ExecFunc(sortButton) + --------------------------------------------------------- + + --atualiza as quests + if (WorldQuestTracker.IsWorldQuestHub(WorldQuestTracker.GetCurrentMapAreaID())) then + WorldQuestTracker.UpdateWorldQuestsOnWorldMap(true) + end + end + + local overlayColor = {.5, .5, .5, 1} + local BuildSortMenu = function() + local t = {} + for type, order in pairs(WorldQuestTracker.db.profile.sort_order) do + table.insert(t, {type, order}) + end + table.sort(t, function(a, b) return a[2] > b[2] end) + + GameCooltip:Preset(2) + GameCooltip:SetOption("TextSize", 10) + GameCooltip:SetOption("FixedWidth", 180) + + --warning: this looks like is running in protective mode without any error message + + for i = 1, #t do + local questInfoTable = t[i] + local questType = questInfoTable[1] + local info = WorldQuestTracker.MapData.QuestTypeIcons[questType] + local bIsEnabled = WorldQuestTracker.db.profile.filters[WorldQuestTracker.QuestTypeToFilter[questType]] + + if (bIsEnabled) then + GameCooltip:AddLine(info.name) + GameCooltip:AddIcon(info.icon, 1, 1, 16, 16, unpack(info.coords)) + GameCooltip:AddIcon([[Interface\BUTTONS\UI-MicroStream-Yellow]], 1, 2, 16, 16, 0, 1, 1, 0, overlayColor, nil, true) + else + GameCooltip:AddLine(info.name, _, _, "silver") + local l, r, t, b = unpack(info.coords) + GameCooltip:AddIcon(info.icon, 1, 1, 16, 16, l, r, t, b, _, _, true) + end + + GameCooltip:AddMenu(1, change_sort_mode, questType) + end + end + + sortButton.CoolTip = { + Type = "menu", + BuildFunc = BuildSortMenu, --> called when user mouse over the frame + OnEnterFunc = function(self) + sortButton.button_mouse_over = true + button_onenter(self) + end, + OnLeaveFunc = function(self) + sortButton.button_mouse_over = false + button_onleave(self) + end, + FixedValue = "none", + ShowSpeed = 0.05, + Options = function() + + if (WorldQuestTracker.db.profile.bar_anchor == "top") then + GameCooltip:SetOption("MyAnchor", "top") + GameCooltip:SetOption("RelativeAnchor", "bottom") + GameCooltip:SetOption("WidthAnchorMod", 0) + GameCooltip:SetOption("HeightAnchorMod", -10) + else + GameCooltip:SetOption("MyAnchor", "bottom") + GameCooltip:SetOption("RelativeAnchor", "top") + GameCooltip:SetOption("WidthAnchorMod", 0) + GameCooltip:SetOption("HeightAnchorMod", -5) + end + + end + } + + GameCooltip:CoolTipInject(sortButton, openOnClick) + + + --filter button + local filterButton = CreateFrame("button", "WorldQuestTrackerFilterButton", WorldQuestTracker.ParentTapFrame, "BackdropTemplate") + filterButton:SetPoint("left", sortButton, "right", 0, 0) + setup_button(filterButton, L["S_MAPBAR_FILTER"]) + + local filter_quest_type = function(_, _, questType, _, _, mouseButton) + WorldQuestTracker.db.profile.filters[questType] = not WorldQuestTracker.db.profile.filters[questType] + + GameCooltip:ExecFunc(filterButton) + + --atualiza as quests + if (WorldQuestTrackerAddon.GetCurrentZoneType() == "world") then + WorldQuestTracker.UpdateWorldQuestsOnWorldMap(true) + elseif (WorldQuestTrackerAddon.GetCurrentZoneType() == "zone") then + WorldQuestTracker.UpdateZoneWidgets() + end + end + + local toggle_faction_objectives = function() + WorldQuestTracker.db.profile.filter_always_show_faction_objectives = not WorldQuestTracker.db.profile.filter_always_show_faction_objectives + GameCooltip:ExecFunc(filterButton) + + --atualiza as quests + if (WorldQuestTrackerAddon.GetCurrentZoneType() == "world") then + WorldQuestTracker.UpdateWorldQuestsOnWorldMap(true) + elseif (WorldQuestTrackerAddon.GetCurrentZoneType() == "zone") then + WorldQuestTracker.UpdateZoneWidgets() + end + end + + local toggle_brokenshore_bypass = function() + WorldQuestTracker.db.profile.filter_force_show_brokenshore = not WorldQuestTracker.db.profile.filter_force_show_brokenshore + GameCooltip:ExecFunc(filterButton) + --atualiza as quests + if (WorldQuestTrackerAddon.GetCurrentZoneType() == "world") then + WorldQuestTracker.UpdateWorldQuestsOnWorldMap(true) + elseif (WorldQuestTrackerAddon.GetCurrentZoneType() == "zone") then + WorldQuestTracker.UpdateZoneWidgets() + end + end + + if (WorldQuestTracker.db.profile.filter_force_show_brokenshore) then + GameCooltip:AddLine("Ignore New Zones", "", 1, "orange") + GameCooltip:AddLine("World quets on new zones will always be shown.\n\nCurrent new zones:\n-Najatar\n-Machagon.", "", 2) + GameCooltip:AddIcon([[Interface\ICONS\70_inscription_vantus_rune_tomb]], 1, 1, 23*.54, 37*.40, 0, 1, 0, 1) + GameCooltip:AddIcon([[Interface\BUTTONS\UI-CheckBox-Check]], 1, 2, 16, 16, 0, 1, 0, 1, overlayColor, nil, true) + else + GameCooltip:AddLine("Ignore New Zones", "", 1, "silver") + GameCooltip:AddLine("World quets on new zones will always be shown.\n\nCurrent new zones:\n-Najatar\n-Machagon", "", 2) + --GameCooltip:AddIcon([[Interface\ICONS\70_inscription_vantus_rune_tomb]], 1, 1, 23*.54, 37*.40, l, r, t, b, nil, nil, true) + end + GameCooltip:AddMenu(1, toggle_brokenshore_bypass) + --]=] + + local toggle_filters_all_on = function() + for filterType, canShow in pairs(WorldQuestTracker.db.profile.filters) do + local questType = filterType + WorldQuestTracker.db.profile.filters [questType] = true + end + + GameCooltip:ExecFunc(filterButton) + + --update quest on current map shown + if (WorldQuestTrackerAddon.GetCurrentZoneType() == "world") then + WorldQuestTracker.UpdateWorldQuestsOnWorldMap(true) + + elseif (WorldQuestTrackerAddon.GetCurrentZoneType() == "zone") then + WorldQuestTracker.UpdateZoneWidgets() + end + end + + local toggle_filters_all_off = function() + for filterType, canShow in pairs(WorldQuestTracker.db.profile.filters) do + local questType = filterType + WorldQuestTracker.db.profile.filters[questType] = false + end + + GameCooltip:ExecFunc(filterButton) + + --update quest on current map shown + if (WorldQuestTrackerAddon.GetCurrentZoneType() == "world") then + WorldQuestTracker.UpdateWorldQuestsOnWorldMap(true) + + elseif (WorldQuestTrackerAddon.GetCurrentZoneType() == "zone") then + WorldQuestTracker.UpdateZoneWidgets() + end + end + + local BuildFilterMenu = function() + GameCooltip:Preset(2) + GameCooltip:SetOption("TextSize", 10) + GameCooltip:SetOption("FixedWidth", 180) + GameCooltip:SetOption("FixedWidthSub", 200) + GameCooltip:SetOption("SubMenuIsTooltip", true) + GameCooltip:SetOption("IgnoreArrows", true) + + local t = {} + for filterType, canShow in pairs(WorldQuestTracker.db.profile.filters) do + local sortIndex = WorldQuestTracker.db.profile.sort_order[WorldQuestTracker.FilterToQuestType[filterType]] + table.insert(t, {filterType, sortIndex}) + end + + table.sort(t, function(a, b) return a[2] > b[2] end) + + for i, filter in ipairs(t) do + local filterType = filter [1] + local info = WorldQuestTracker.MapData.QuestTypeIcons[WorldQuestTracker.FilterToQuestType[filterType]] + local isEnabled = WorldQuestTracker.db.profile.filters[filterType] + if (isEnabled) then + GameCooltip:AddLine(info.name) + GameCooltip:AddIcon(info.icon, 1, 1, 16, 16, unpack(info.coords)) + GameCooltip:AddIcon([[Interface\BUTTONS\UI-CheckBox-Check]], 1, 2, 16, 16, 0, 1, 0, 1, overlayColor, nil, true) + else + GameCooltip:AddLine(info.name, _, _, "silver") + local l, r, t, b = unpack(info.coords) + GameCooltip:AddIcon(info.icon, 1, 1, 16, 16, l, r, t, b, _, _, true) + end + GameCooltip:AddMenu(1, filter_quest_type, filterType) + end + + GameCooltip:AddLine("$div") + + GameCooltip:AddLine("Select All") + GameCooltip:AddMenu(1, toggle_filters_all_on) + + GameCooltip:AddLine("Select None") + GameCooltip:AddMenu(1, toggle_filters_all_off) + + GameCooltip:AddLine("$div") + + local l, r, t, b = unpack(WorldQuestTracker.MapData.GeneralIcons.CRITERIA.coords) + + if (WorldQuestTracker.db.profile.filter_always_show_faction_objectives) then + GameCooltip:AddLine(L["S_MAPBAR_FILTERMENU_FACTIONOBJECTIVES"]) + GameCooltip:AddLine(L["S_MAPBAR_FILTERMENU_FACTIONOBJECTIVES_DESC"], "", 2) + GameCooltip:AddIcon(WorldQuestTracker.MapData.GeneralIcons.CRITERIA.icon, 1, 1, 23*.54, 37*.40, l, r, t, b) + GameCooltip:AddIcon([[Interface\BUTTONS\UI-CheckBox-Check]], 1, 2, 16, 16, 0, 1, 0, 1, overlayColor, nil, true) + else + GameCooltip:AddLine(L["S_MAPBAR_FILTERMENU_FACTIONOBJECTIVES"], "", 1, "silver") + GameCooltip:AddLine(L["S_MAPBAR_FILTERMENU_FACTIONOBJECTIVES_DESC"], "", 2) + GameCooltip:AddIcon(WorldQuestTracker.MapData.GeneralIcons.CRITERIA.icon, 1, 1, 23*.54, 37*.40, l, r, t, b, nil, nil, true) + end + GameCooltip:AddMenu(1, toggle_faction_objectives) + + GameCooltip:AddLine("$div") + + --[= --this is deprecated at the moment, but might be needed again in the future + if (WorldQuestTracker.db.profile.filter_force_show_brokenshore) then + GameCooltip:AddLine("Ignore New Zones", "", 1, "orange") + GameCooltip:AddLine("World quets on new zones will always be shown.\n\nCurrent new zones:\n-Najatar\n-Machagon.", "", 2) + GameCooltip:AddIcon([[Interface\ICONS\70_inscription_vantus_rune_tomb]], 1, 1, 23*.54, 37*.40, 0, 1, 0, 1) + GameCooltip:AddIcon([[Interface\BUTTONS\UI-CheckBox-Check]], 1, 2, 16, 16, 0, 1, 0, 1, overlayColor, nil, true) + else + GameCooltip:AddLine("Ignore New Zones", "", 1, "silver") + GameCooltip:AddLine("World quets on new zones will always be shown.\n\nCurrent new zones:\n-Najatar\n-Machagon", "", 2) + --GameCooltip:AddIcon([[Interface\ICONS\70_inscription_vantus_rune_tomb]], 1, 1, 23*.54, 37*.40, l, r, t, b, nil, nil, true) + end + GameCooltip:AddMenu(1, toggle_brokenshore_bypass) + --]=] + end + + filterButton.CoolTip = { + Type = "menu", + BuildFunc = BuildFilterMenu, --> called when user mouse over the frame + OnEnterFunc = function(self) + filterButton.button_mouse_over = true + button_onenter(self) + end, + OnLeaveFunc = function(self) + filterButton.button_mouse_over = false + button_onleave(self) + end, + FixedValue = "none", + ShowSpeed = 0.05, + Options = function() + + if (WorldQuestTracker.db.profile.bar_anchor == "top") then + GameCooltip:SetOption("MyAnchor", "top") + GameCooltip:SetOption("RelativeAnchor", "bottom") + GameCooltip:SetOption("WidthAnchorMod", 0) + GameCooltip:SetOption("HeightAnchorMod", -10) + else + GameCooltip:SetOption("MyAnchor", "bottom") + GameCooltip:SetOption("RelativeAnchor", "top") + GameCooltip:SetOption("WidthAnchorMod", 0) + GameCooltip:SetOption("HeightAnchorMod", -5) + end + + end, + } + + GameCooltip:CoolTipInject(filterButton) + + --end of filter button + + function WorldQuestTracker.RefreshStatusBarButtons() + timeLeftButton:Hide() + sortButton:Hide() + filterButton:Hide() + + local buttonShown = {} + if (WorldQuestTracker.db.profile.show_timeleft_button) then + timeLeftButton:Show() + buttonShown[#buttonShown+1] = timeLeftButton + end + + if (WorldQuestTracker.db.profile.show_sort_button) then + sortButton:Show() + buttonShown[#buttonShown+1] = sortButton + end + + if (WorldQuestTracker.db.profile.show_filter_button) then + filterButton:Show() + buttonShown[#buttonShown+1] = filterButton + end + + --iterage among shown buttons and set the point + for i = 1, #buttonShown do + local button = buttonShown[i] + if (i == 1) then + button:SetPoint("left", optionsButton, "right", 5, 0) + else + button:SetPoint("left", buttonShown[i-1], "right", 2, 0) + end + end + end + + C_Timer.After(1, WorldQuestTracker.RefreshStatusBarButtons) --------------------------------------------------------- -- ~map ~anchor ~�nchor diff --git a/WorldQuestTracker_Initialize.lua b/WorldQuestTracker_Initialize.lua index df7e468b..f08b12f3 100644 --- a/WorldQuestTracker_Initialize.lua +++ b/WorldQuestTracker_Initialize.lua @@ -171,6 +171,9 @@ do }, disable_world_map_widgets = false, + show_filter_button = false, + show_sort_button = false, + show_timeleft_button = true, show_emissary_info = true, diff --git a/WorldQuestTracker_OptionsPanel.lua b/WorldQuestTracker_OptionsPanel.lua index 5fbd9d39..53894e25 100644 --- a/WorldQuestTracker_OptionsPanel.lua +++ b/WorldQuestTracker_OptionsPanel.lua @@ -704,7 +704,7 @@ function WorldQuestTrackerAddon.OpenOptionsPanel() { type = "label", - get = function() return "Visibility" end, + get = function() return "S_VISIBILITY" end, text_template = DF:GetTemplate("font", "ORANGE_FONT_TEMPLATE") }, { @@ -716,10 +716,47 @@ function WorldQuestTrackerAddon.OpenOptionsPanel() WorldQuestTracker.db.profile.show_world_shortcuts = not WorldQuestTracker.db.profile.show_world_shortcuts WorldQuestTracker.SetShownWorldShortcuts() end, - name = "Show World Shortcuts", + name = "S_OPTIONS_SHOW_WORLDSHORTCUT_BUTTON", desc = "|TInterface\\AddOns\\WorldQuestTracker\\media\\options_visibility_context:" .. 36 .. ":" .. 80 .. ":0:0:256:256:" .. (0) .. ":" .. (80) .. ":" .. (0) .. ":" .. (36) .. "|t", }, + { + type = "toggle", + get = function() + return WorldQuestTracker.db.profile.show_timeleft_button + end, + set = function(self, fixedparam, value) + WorldQuestTracker.db.profile.show_timeleft_button = not WorldQuestTracker.db.profile.show_timeleft_button + WorldQuestTracker.RefreshStatusBarButtons() + end, + name = "S_OPTIONS_SHOW_TIMELEFT_BUTTON", + desc = "|TInterface\\AddOns\\WorldQuestTracker\\media\\options_visibility_context:" .. 30 .. ":" .. 210 .. ":0:0:256:256:" .. (0) .. ":" .. (210) .. ":" .. (37) .. ":" .. (37+30) .. "|t", + }, + + { + type = "toggle", + get = function() + return WorldQuestTracker.db.profile.show_sort_button + end, + set = function(self, fixedparam, value) + WorldQuestTracker.db.profile.show_sort_button = not WorldQuestTracker.db.profile.show_sort_button + WorldQuestTracker.RefreshStatusBarButtons() + end, + name = "S_OPTIONS_SHOW_SORT_BUTTON", + desc = "|TInterface\\AddOns\\WorldQuestTracker\\media\\options_visibility_context:" .. 30 .. ":" .. 210 .. ":0:0:256:256:" .. (0) .. ":" .. (210) .. ":" .. (37) .. ":" .. (37+30) .. "|t", + }, + { + type = "toggle", + get = function() + return WorldQuestTracker.db.profile.show_filter_button + end, + set = function(self, fixedparam, value) + WorldQuestTracker.db.profile.show_filter_button = not WorldQuestTracker.db.profile.show_filter_button + WorldQuestTracker.RefreshStatusBarButtons() + end, + name = "S_OPTIONS_SHOW_FILTER_BUTTON", + desc = "|TInterface\\AddOns\\WorldQuestTracker\\media\\options_visibility_context:" .. 30 .. ":" .. 210 .. ":0:0:256:256:" .. (0) .. ":" .. (210) .. ":" .. (37) .. ":" .. (37+30) .. "|t", + }, -- --map_frame_scale_enabled = false, diff --git a/locales/enUS.lua b/locales/enUS.lua index 7c5ca65a..c5021fad 100644 --- a/locales/enUS.lua +++ b/locales/enUS.lua @@ -2,6 +2,14 @@ local addonId = ... local languageTable = DetailsFramework.Language.RegisterLanguage(addonId, "enUS") local L = languageTable +L["S_OPTIONS_SHOW_TIMELEFT_BUTTON"] = "Show Time Left Button" +L["S_OPTIONS_SHOW_SORT_BUTTON"] = "Show Sort Button" +L["S_OPTIONS_SHOW_FILTER_BUTTON"] = "Show Filter Button" +L["S_OPTIONS_SHOW_WORLDSHORTCUT_BUTTON"] = "Show World Shortcuts" +L["S_VISIBILITY"] = "Visibility" + +------- + L["S_OPTIONS_GF_SHOWOPTIONS_BUTTON"] = "Show Options Button" L["S_OPTTIONS_TAB_GENERAL_SETTINGS"] = "General Settings" diff --git a/media/options_visibility_context.tga b/media/options_visibility_context.tga index 580f41664ee042b6631f60cfb8d1daf8344d0cc1..5a063f666fe107c6f23961398c62818c0da86dc5 100644 GIT binary patch delta 25522 zcmaL9S#VuhmY$a+K+NNv=Mnc_%=18y009!W+{?inhXvkfoN#kYCz^{NT6c@81_-W;tX(ESz)C zIrp4>_Fn(`|F!nM_|>DPUp;F2k3BDnsk0wi%i<>%Kl8*wCm&hcg-%)4lU~GqOyyV=M)^qs_8)kp*Cdtmn$-HgMw$>%abmb#TA@ z{QDN$bH!TD6s>#ZQ_C;BZ>f`Sn{Q`v#Zu=#wD`gY7QOh1C3t9p3*t+kS@_~-7Q*}s zADefM9=Y($qF9jL@}GWU0eUWcf$L-!pIPGKa|@l}+7nORHgVx|%Pf6i+Qt??w)7<$ za_yxRuD-O~5DvM?y30?JTT9;D;7HZw#CnWWT{JETI39k z=ic#i&n>d>nFWu&XTI%MEIIecikXEc)^h$M%U}A`3QM0_2VK{8`7`Uh`po+2&OzC= z&z%k5cwrmweq{sKo?GwoC)URp4qg4s`Y(TC!`GhK06o{c%-Ak{XkF(XTgTa=buO}9 zeBV0eA6f6Er`Esnp$%UC*alZVvhH(_xM1Nu8(4a3gG*0r;L;Nu<(W<1;9MaXWC}?&Z&ME_?;+yMjL~ zz2L!LTHo>u8>DA9-TB_Oz4c3*es|_~Z2RNiw}}V8ZR2nL!bTtduJzyfh2<{MrHe1E z<~KgnYG>cE$g`Pz4g8MOB*i!!B>aY{oP{l z*dq%bFInW&`<9-6YArO(fBanwpDbDqUlWqji%%_n`jJIXylb(O?>a=~=&dxvk^p%v zXCGVZ;s?%o+s-}V#q@Gdt?SZ9^!#Tw2ylcZSvS2dR1IADtjJq`<{&r-a)xhw32L4@ zRP{2nLwpu;y4ddlP2HD2x2_eP2Zf-ibNM+#{iTiHd4+xDP&Ih%1;=^N8lt#==Gc9U z>{zz0rH?@5a}Y(tL6?6|@v23SJ+#Ck@nn%<10})v4=n(aVoM+h6huHvYWWM$^qF&b z@5#sJJ^sE0Kw9k5b7yIWP7a^C^f_qy#G(tIT9)CHW$3r@Af9sA5O}Q&yIYedf znZTikAnLw(rmk2JWTik^dg-M@Q|Q!VhPi0LV?_(hzGL3)SIxioniUlp^K_%o)VA`> z+UeRn0j(9Z^xa?xZoL3O1SqVZt{c2g(7W_8PWmyy@Y9mv{5?XFjx*lfMAM$-kF4v$ z6Kgy3p0(1|d7Qp5U$l<%?{oYEu6+X9ibZRmf7gaqKDNFKkFAH3L(3m>@?6zIkQqXJp3vTgqqgCw?dLwSPP$vxexC3^ zQ0u<*!p3j^#CE*>OWXVY@7vzTf77Pk0Z|hVf7>?S{W&oEnGM|jg$>^QrL_x1i(guL z;S0-N_{y^9iGnLXVLX4!+CWv;-Jj9D4Be%#tnJ!wS@+GKS^xdtafpiGA5pqH2}dQ* zd|>gp$8gqDi-Mjtj!J@-D5wb^14$gu5DwC39$5-B2~im=$2AHQvcf7?6+m1Mqtgbm zTFyU)uXs_MIxnO#A{(zgFCnTA9ucDYR?#GW>H-Pkr#^V98(vyNRQ|%p+~8w)3}me^ zhh-+ zW++0KI4XyK$uc}7gCi%GJ~toX-a`!XI7EHoxJhVg;d~3clN41fer8cj`z@SnyQ<^x z9cYb!!Z^d6S$Sb;EK%g9x-bnQ;^&`1e87}#mWV1;2~n-rgs9IgJpU2b>KqSTdFcqy zks$mNI{L0P?znDEJ8xR>;6sbi&^Q)8^?@bvC;ySRtO;If-nL@CeRo0Lo95kh#fpMe zX7NLZCh?OH)kc?f!BO4fB2d)>XLZv%Jy;iG*FiUSvLzzgsAK{BytePI1Sa`1}y2FWms zo`9F?H!WLa-Gy zwHYfR>h0gQ(c3?@jW>U4ogk^>%JuYHFK0OZO8F^6W=YeIYnXsvvOeJ@XP4VuXbhh|6$Y=Ij%JQN~tt}P;HDO3Hg2jPf`W&t2;od!W&9nQC`S#v3KYGW%`?mRZ-DG=<7XTe> zB{8CBpIQ)!D%s)Pb;Fvru2|s6+aT&4^Gshw5ngtv3d2{SBM+_Unc{+dx9RFZd!UFS;31nY70M-Pq5z6_u9*J)(`AxQNf4=Rd#~gfN_+ zbJ>$`S?)A+G6%(+dI&Jy;zCrPP_zl28pXN@y)CETb=Ia7;v&%#rwZ-AgQmD?$)gVm z*&jG(Q?`)h+AKtyBh<^JQMxXD0ym*Y@TUR%YSYb^w&%T{+qMTkq0ujJOh^}oNA;D| z-tf)ut@{d^Vd*REm36Fq3z}Y8>H^X5{0jmUQF5N(cOL0*SzPrBgQGZ?y?~Nm`3C#e zAu7$7w-NYq=LnAENV&Aw z0?L2xi3^_X^iD5Sp`IEc8I$#KgS=qM!#XACL5(EI#yc+^qT~`Sh_)Oibbp1@J(k%=cB z6TFZI&e^kwUW{Cck8PjsKSs)rP{6RPi! zq7!oHwqAItn=Y4{mqSamcM>U;nx;XEOd6&2EIi~8g$hLdDTit!my)%@Q`r;v%gKi& zj_QZZCQx`A;iUoy%Sk2z%~tZ?4iTT6iS#3O_`YQb-4a6Lr7qBxIrWaE909(E+9Oe; zp+c0nN{Eu*4B#(9)!6MB40M^)l(}MHC-sNnIq+ zu^&B6e!chw-A^P0K|)gU+!vM-N3D=+2~n4S;t-W&_*zl-;w2%ez;IF!SQDw#NIh|$_a0b$}U zh?>0n%Au-{VeC_`geuFO2i_nmMkA6uu!Dy5fwrOR@C)XU$IWu|pb#a*sV9d~e%bG9D+RfzPSCuJ(?b&JB!FllGUZZ5RC0dg&E83W!;F?l>wA zl0wJGtxpg+PZ4F$5{fTyp5s~4)WYSjsbIWB6n*Uw6;P4~LJAiM10bt_iLVOiomPlb z+bq2vCzfT&m6S)tQG{_6V2nU2wU>t5QsOsWG{?4;5YkC#>BrfXsVZSCAae_Br2s|b zeS{rSpQ25m)&>ZKtth#6#Uh3&4T|DWMOKZVS6YcT?WjLh9NKa6HV~HAO@XV#y=sKw zD5cL`@Rh4%AW=HigCI10j6D75eeUrI1uSYl6s-zemsu%t5=M;>6MQoWsKal98nTHS zs`0?+kepOsfU=p-)%!?E#8;~v6(nC0KZS)T1e+g6_QH3e{Xm#_lLkRqUMve8WKaUi zQlo$%IuFg@@S!5y(t`pF6ZC>u1hN#7hS_=#J^)>BA~_ye6DqI)?usBuLkM}_?wcTrh^kC6jga#1 zxnW5hww10{l_E#Cx2TIB3(06~W0lk#f^ab1+^WId!w{S+L! zFMeR{TqBNZ!#Wq=S7id_&qV`3aDXIRRSK!S)QPto|A>ncD81MbwC=uJ7A8nV2z-J4 zcP)mHPR_ms(tsz3lN41xE`Mq#Di;W5c}y9_5EZOWf?)?p5~4B$$@U8~#0^r|UJ8K2 zw<)1sSKdVALl&kMF;rf1@r8L0y>Fg_Pt1FmF*`wiw7__Rx(ukwODQfpbBGf6r07kh zF5;)OtEMaWDOop8-l>YZ=mP$UQK5*Qc<%=zGZ06`j+18{Cq5BcIw0$IUQlT2S6z=R z*7ZIk&<>*783DaK1%)CBA=OQ|LnZn&vN8qq#7){3K#ok62o0?)hqVF89OT);b!`mk z00k(SaxQYHPSiz4g~}B;DgzV~v?xN&FL3A{^8=5q zixjr~+E-LjsW1>@!YH{QiN2gQ3_nFcPz2c!VrW9*Dk>E|3ACxp)DD?fxJ>LKGijsN z*Kv(<8+lg<{*velP(%pe;2}zSp(1|*$8qK(q^d|k%5d5Zv0~ zpzK-FAeG)2PAUFg5YINFaNePGeq2bLfcOs-miVJjtga1)VJ4y;Bh$s0kw4xn3lD6zJKsMrb8 z+M`I&b2AVaHP^wL-%{2538Df8`J*G{sPGs`E)o_!-VL^pL05T0xn5tb@j7(MGZ~Q8o;Uf`kUi4WTK> zOZf;LszYm2iggG%6SS{3n^86@+L$La0*y)C!}kye~9~JPYjigB~GD!zv!?Wge;@9_j)tYlsSLzwD~#gD67< z(%}9ZL~3e%X-F&s^dtjwJTNqSAA3M`o8mNZPE#z3s@lMGPXta9n&K1@qUdfPG}0t$ znOJtIOX%QzSB*&F*m2@c0v1og=sxJdL#EQamFt|XKs8sasYtb;dCwhk9g2=v;K;k6 z1p7EvKduxA?rSpnr@kYkjH>}9_h zo@!PlLwvRWo;8tQNjZjz@Wo~&T)<3zpt(l>p6ir3uDc{nm8u_C)mw2+b$g4t9slS> zG7OQXNc}0*QIV(}x>-Y%>c3rZl@Qg2`pcvC@>J71L`zgGdd@#)eh>(Dkc3GR4pD~h zBjL)U`dT5npA z!tgO(lo*zto6&U2D~iHj+sK{o5HCL=5vRttil`L)B+HOHsS=T6+%p$Y@Ylby)*Ii! zXXI6ISrUuQKX-_Vf+h{49uPk9zJ&;q+Nxq9RCN=Fx>1A$C_#wIP`L;Z;JjoWN`r-{ z0KreDmyYwYX_CcuI!IikYHNWGiJ>NxbLBylUR-Nr8nZp(g`h zN%d(qSMyX-fkKmbN=Q_NRfy^X9GW3kEpLP>#SrM}Wtdx;VhoZfbTE2@aH532pW2^i zdvV!PWCvMfV>>tRzWXhi<}(D=ZQkfE(VKY%nA?Zu^)Po3porj^ArF${AAHLi$1hpK zrgPYN3zDKF&`_%DsmAAl3Oq1?OrDS>iQB`Duht!%ATEs3DMI zGjmWLBxwW$YUotWNI)aS$ShC>Q6U^PMMWXb82S-ZQ8cUGUIDF>6jwaeqL~kdLM9dO zCRC9O%B!S3x|zf3B7(Mn7;#i-j*U{CDRIW}F<}ZJPUwmbW`R6Xb zDqQ*2TFJX|D84mBWiGsMhzdb~{v&YOVbmO=K0zc-Vrf!fSqlxxqj`j|DEt*ej`*37 z_Z~tvuni(P)~rQk7|2?tFrnN^nmUP6RQaY-NO$W6zQW+}m3HU9=HcU0P`S1tUTs#O=_fQt$;^v*$ z0fg7#_sq|*_>hu~yYE^JsH$f+MpbYh%24W1Yald_m7-LVMq;KZdZ$o*Zm|dDc^`R~ zN+tpL%_}7-WGV0glnA{Rp@{iNGS>#Wg1ju=?UdjYo^py zrf8di*K$xpE1z44ni^lxiMDM_6}15jX8@&(&!V3J05hyYIkPAuD~x{*(u$MgMwsDf zp-|YP$t;S5c};k#3ITEos!|{obA;*^Ezlv1XR(|nLvgxxWdI6f$brD&hiKe;pbq6o z{750TGo-F@(wpQ-E$|_Aaa+p$i!)l?1Lp{8lpg92OOO+%7YN&{sxNSq>ggeRbpJaPh2Ep?1D}AbDA72!YH@}nN#mkG zI|8bt_Eg)G2~A;!I!Y;5VM85|z**x|DYW=!&DPMQVyI?_6LeDS^t(m$2W1W{i#(9p zD+nP%m~tg7MQ5PhY)kz zTg$0Zhi+S9FNwo}TTYhtEfwhv#CZm#*TO}4V4dd%Spr@wdPbH+I%vs(k2m!)dFnkv zfSY3;3yV{&5SqfwF9Z=(zTMYIpD7YhH4~p{wpUY4X;2i>JQfx{OHOt6nR#ZPnzwlL z2@Z`00YQP2O#PkKq74!=w*He(-8zaUNU?4kDv)wV5WZ>JMO9pt2>e84lLQG{0s)pL z)p5vTT1kaRFNt3OE(+=eAX-g`_@t5GwkW7l&Q%PfKO_~K(WEM?Cv@UK2~nEq&yhn5 zO)3}_Q0i^Ug^4*GsflsYIczLvFzR(%f6t zf;8zsessW5-4vb_G~p;5Y%i(FmPLykxWR>*(b!boRvr4!~Ca9RaoC~s_w-zOkh#; z3rdSn=6JmYReF$L$l`o6IhLP1D2kTxvBIc!>k4%}CNNaJ02DDwC<)5*3FfvPS5dHx zN*RJ0KSQTQh(UT&9F-(LPq5-dU~-5GOV?8PDEQUA>p&-R`s{JZ&cDXazWQKE{%=ijXeU$XJTz~Em1y7Z#rRA*u;dEkQ`3d!q!o z2#za6r4a2>ep$p$m#oQ4H5~|{CRU0f&J;$8ttKa*s)$Mp_4Kwc%HCaBjzi18n;4DxTJVxp(4m&_4 zg2=3`|6mD4VRERj1U>3cjgDdw9a9h_RH*b)QUOG2UQ|`tw7^3>DMY7fwQc;=d%%zj z#Zf|4g8h^VOdvt1i6J`zuzV6Y>U@~}1Vfs|7xExSK~j>Vjq7{iF6B_FsyhVn9WB&I z0+K9wR145?q>jnI!6~fC=QxUq_RC>K5 z-Hg-2$R3K@O(;NVB~9eZj{*cl9}}q(WG$q@324G`(mYNLUo|WDg5?DitqT-bf<;J6 zoFvo;c0sLV#e96hO90c7TtCsYnQj(GsR|k8m&^2bXDn(ygCi>=P1Zl<4v}dkV*o5n&5dB~;(*0aaaa+5q|1BSi#F3aOMj&^N5nw1& zN73vjACiz3wZ4W4EDk0}jlI*CK-RKFk%jTYR3;c^mmwe@d+xL5>*gzXiE`QGGR5Z` z+?Wa(Y9U3bEl#!>MOtLxvrgtoTgY@{q%>g=6@X4WASwvrRGw2&+kvRa*g8a=Vwnmi zG&xS`XGQ}k3tO2~>FdDDHjS1V*yH3v}}QGLUXqYx}^-2+A9^ht>y z76I~Q?WAgoe^m1F9ULN;y`F z9?Za1X&5_>)JPJ;;wNWV5d>F+5Z;j!1Rj1jkY;8#c8bMdXo;w1I5-wQNzaJ8usFxU zAkYswVg$h!DMXN#o&UsfRMqfxhp5`!?^px;)Og^L<0ywHq3KW&eIsrHNtEy-vy!GI zL4%gc0-k0}LNfR6HG-Xm|S=EB7yEZ`S`<+c7M zB*SmQAS}Z1IK3wIC;y2Md&0mp4)dqzVV4@C^0J7n9O<%-DN#$&+es|Sh{YL!7^rHY zgqy?G5H)bUNP%#*=9@#4MnO?<&ozYm9lD;>mw>25tc}D>b--4tUS5_l1c)VCzK}vM zr9qP{i_*)%O|k^@Pg-jcAe9M%vLyRaf}?j(-$rQn?$i0Zucm36{V1romyJrP#+DQ(QT1o0;g zstO=3&x(^QGc!?19Vn=nzd^MM>?aUVagdQj(d9su%B*c9XL))hwqw!aI~N@)#8I*W zDX)}Y4<%XURN|=&U7upuk~p`Jq*ZIG17-k6p5E*MQ3F)X$8NA@hG{~0it0J#cBKc( zrIa>=B{^{thbY3YzTAyuR1L5bL7wHaxJh$Znxbh(UZx1+5#|(<QUbKeqACi|>j`=}c5+7RFDV2cB>scY&6|%|^QPl$u}#OUiDUI6hpl$_ zAm8J<(Zg0Z3S4!tVRV)+9knJdZX7>h4P(ch)pL_Z-H2n&6DL>gg!#6eHs97$96xSe zj)$hsSYYdE^G}|(;I=u7PM@*p_OlktWibqI;BNPucCy>HdQWOu9 zBm*t1!HFM1^dGrnff+4jSZ49hB@66XvcPT%-_z$SQI(@RG!xP5^h;B9%s;7;CV&pFE+SYq|! zMecK&i7$F%$GnC2p0@z!ee6f~UaZ+L) zx{Ip%k$5XhAJ zWH^>Qbc?k0j&;vHu>N`GEV)Pa&Aw3znRov&dxWy3oW43&|h0oUj1CQL+=}#jj+|qsPp{ z*0<%P1@xRPGpEcqe#*S#I22vq%(iK>9E)KXJ&AK3$5R=rF^+SranlKo&AM|9?z%Y( zOwpCwFERvI9HNAt8YVg#SX5RweUp7Y^HY>+Cg^J?s1;MXt=W8zg=UL5`#Fa9ER!X3 zRx^CkY6g#6-OzEX9Xw{W14pfa=LQZV_%mQxO0T*OOZAg+#^I5dHpX0B=AVGSG?>Y8|HlX{WwM{$i5J{Fgo zY@fHt?hCkwTx12GTQ>jJdGpYL@%=^SHV<95*#4^)*?R@M%03wbs8Xd$d3T#iAB6lo zVmvr?$xSb&AyWlZNs?Br5a9YO{*(eu(HZWC1@#E$gIbTIcjj4t^X+ zrdl}pruCfV_$hvnapV?2x{h)?a?NswE?WdxhcIo!Q#3|z##;x*j#_N%36R5hvDJQV z_q;<>dixoNuI#R}ZX4Z-4{bVZp3y_*BV_xCJw6Z_0AV3ew}vRM9F!R49iKVj;465^ znnpno+|algj~zP&atLD|_^7?9Z(H!QZ#azN5Bb;XAADKWbHdvmi_D zIqurk#PbD`1_E#cT-Ai*HwYZVxP{PEvJ#@4KXI|XATIJw0z<5k@LvA@Ke8H#Rz6ja zHPbV4fhMlgP3qvdx?x}{e*<}bz8Awa{A8#VpZ+&i{^?&h-wEtI=a3a47AhPy!2%9Z zx#M@N<=9=K=uLin!w>Puqau4QBOA2PnP`iI)H0Yf*`JS^pq6V&;H&tQW0Itu#nO5F zMu!F&=sOE7jr;g07QjA zTXYpsf$4ef%Xy};iyJ=s3!o>mgVJ@uDx#u$F07(y9FE#*K^!>>XBAF^DA1GvSqXYg zh)RH>40S+OzOM2W`yi@Yzk{M8p;fUhpsrIWn|ok+^0F2x9fjGOAZqry3aTIJz z(20QcuwX7EY&mA3aZoW1q#?}kmZQXkOIE|1SAX!2t>)>kt>Mw1T726{U{7ej@U1nC zAcSV_SOvZ#o{I8Z_@Lg%`*@d-77TdMEwv>1Y#PczTl-2ia0J6hDSGo zI3Y^NYCxrVCgxmt_HSFn$u2lV`S@*&moe88O(Cjw8+jERRXMf{qA(CudG;GC2bJsI z`!8+X-M?e&d-mG;sTC_LOxU__{+(@z4_H<2tkv`%d(B&GZ4k2RX-5+wp%FTA93@{W z8Ht--gp(zsq3$!sfMEmNv+n2r-pXivZReyzlYGXZjgHXydgNpSCOKIPvP6bnqWrp_ z|6iOtVjDamENt}`zvkDg0!1klc@SNhBgLE6ia)fTqTW9X8h~&JGkB|2^0yMJoyzWN`X67=Dd>M8M?RG)Y%w944cTY)#`I7+Q8Zwk<*gntp3 zL)4OmL6E0=i#2y{HgBI0b<%NE3e}f5cAK&qF$hG358q-RUZMxJrd(_G(kMZ3l@wtC zHCQ;sZ=v|yF~^qgwD27ipJfkTW3uAlWy_$(v*^(zFc#zbQS?HTpRx2awq7Eo2kr@u z%{oLyY3zFZVgt#0W&a+l*iPya%CJo3itCk{bT83(+1CB+|FkN4Cptwhvplbv6j|KV zg!9Q7M`r{px`<)$6X^uG#u0fZ9*gH{TR)7Gv2}=AQ+*&z944U?m@08pYiWluxwI4Yir)l>HsZ^VR=mLmP`E9;DS|+F4~6tq^*A!M9sglGEdSf+jd(y991^= z%GOoZ*#^{N`TTdK?egzgy>1*Dp@R8K3e{H|5A zf~^kct8*6|;r|JgtdUqEWUTAiWwl*f;U##BFDhzF=_#Vi@2al;uGO%{rj&CLc8GU! zm32ZQ%WJ%(Fcn|@TdQ9BsWp;_N;|1%!+TkU6hrmJ58oh5xMDGsAL}=f9SEaIBKAI3 zW5Y#BI4Q*JZ38`_#TOa)NDD7gXqn7Wsuav+dC}4ekb3YNwar%7yA!8gu)3b@jM5>v ziR=@`u9|yhmArH_zqAe&@g0qA?KFXF@fAIB$Er_1a|u`Zi+^Jk=f1W&rT~>Yc|nKc zrd^laL#hV$+4`zFYwX=-aVRD>F>C8y{##o&_qmHXb$hQ_)y40unF?t=3(!iLC?b9N zd#k4QNc`g;&;a_djBR#XW0i-Dq|BA*;iw>o0ywdH;zuUH++s z_ChJ}j8tFh*gbmZE(n6LrF~DJ{OFxDoRrXUwu)D6r{JlhWU5D)pE!sv-glYaUM7z^ zu;Mr>O9q(QeG#=sEMSb4>okL;=8cEQfo4J1tW$JSbzvmv`c=PZXz4dk-?Y^iHj=t5 zS=E`(ZGB}e6tM)N{=Ka$udu-MdD}p5R-XF?e|XEqrADG}&D_j0tG@C(RJQMzRa`W|FE(r|HP`V|Goo_My_TQ6$)5{sInLT+Nv)67Koadw{@TX3#-5ngebwT!Esh; z|23lED92}ONJ{)%u-d?Pee2; z96yL!oY5k|3;ft((aJvjr|w~uS8-ZmRoy0H-&UTnZNbXF1SD_$J=?&rmOcEtR#trS z=cW7zQgkhR_$O%GCsqe3>hpTatraX7tm~Md#U)f#U;Q0h_x1l`Zvce)fjuzv5r+3T z^%*kDTYuBu`2K&hnq&vR2q_Io`P+Zrswq;{caFOVUU~PAtdb?>>)-#!KOo8rqSU(D zm7iJ-Z?XQ9zpx5wyADx3Q?4-^-uVYs%j)Z<{+$+uV-m1>`gjRZLRAV&5@S-w?w1gE zjQom8iZqiIs!XVt0(&&?aM6Vf|MVhjW~fGFD21fqCsmA8g%X;aG6PMGC^#Q)9>n~c z4?7E?03D)k{K_it{V^iz3Ka}^hqOk$R-5i)t+6;th}vMaR8U{{CgWd|AGNa2|CLoO z%)CO4&6S)72W-aqnkMH<7eDwDtDyUuf!{=whPGm?G<@1G59X}w z(qFSTc;T|fkX0sokt6?uy^$Uy=bEu9B7g(R88}K8mc8?z+Z!+b(kioqG_F+NlPpwK zVhvF>9b0I$cnN+YWK>_&P3W;RUvQ6~TiM%x>h4jK8+87q9#ms$2(pcR+noYiu^&PC1cGl?}t7C}$tS#XvlT1WTac4&(2XPyeaiqB%q zvINPyf(&Pvtq;X0L^W<*uri?h#uxwE))7}~j(tF};S9b?BMFq{bsnokqEzKZ?2Y30 z|GTZ9R4KLO3uo$R*S)=g*>a&F>C)tx_b>dr-CSiET*L5)9AI<@Lc z^a>AMzoCL33$HlWaKjTwSmo(YTnt)QRcjTo0%`Bw9}rc$^8MPFSox*zt?a>nMt2g{ zgDF_HgecdzVA>%nBAz)2s;DpsMM+R2PKpp;!uzSq9H7o~7(Rl-Vr&y!8$ZBt4-k@Nfv2V8ZYbUzD}e;A7L z=BQO>U}?m7t}#wvvXbap zZU-R_kP~5b!>6ovWX@UHYecnLMfa>#44-}d0vkq4eC2w5XwJ%4e&5z#`vWWUCasEl zte1cFfu_!BtGNBQaf$!Q)@4UP6b~yW*<0VU+i4gfs$MoiZbh%IA*z-rt!lYyeO~H$ zm3RNx*1h5;EgNabA=@x`(8^GU>+u&a8SNUPRR5E?`-BVDI6$?GnxY5FXdEdXv4(+z zF4jbG!0hZzN@n^cJ9T9IpmP?V!4EXs8=64@vYb;tF^GYvF!@!G+F*z(d1U`J=Pxm~ z-l+vw0IzNxvvolIjqm=-YC5;l;J0Z zcHo*rN`kyd^95ne=20nCMj4^b6J;4?lymB#5d0LP`YA+(08tQX3hn?=>h8!+D(9+3 zP=WNS;t8r6lydg(v%0SB)(o0bJE^AA6GBwe(Ebu4x_4PstljEbH(L|qsuI}R3pMRr zao4Oz_4$cKF8YS^+;7S%Z~n@~q;=Vu5vv%Y+i;+A-dfJ1NsP6d)DP^3YbbMIssy;Q z23!>YQC^~?t6qqs5KdIv9ipm1P<8KqtLoVYqV`&K_a3Wk-(}UEGuS?cnuLFV;Tk?+ z<;8#GR9{)R-6{r-(~cj|TsE}ux*ZiL#ImKoVe78{%GUc@tfC+H_#8yhuFAGaQl5wI z+I5AoA`hFg8hWjYZB@rK)dgS-^o6QMdT0$%PWRwXHB1>dD1MP$=*8C;#;mS$o7Hw~ zvzqn^XZ0foUN@#5-+9e-piePR6|`oEyK%fooEayTp%;Th&M=c$0fx5k&I{%`pV;tR zN%=?kUrAp6;a^BUs={CNgVHbv3sS`h<1fM8l;(-rQPzR^L79lOfvmOi+V9yq^pnJV zHC!bvTpnv<1ZJQm$|ps1Ng2#s)3*6_i<8@qQ71lDLKH1-9#O?yxis})kkyP&l|B1! z?G51B2+uT+F$KuET2?KoM{3A8tG!`2)3fFps)kmc{?wf>L-RC(J|8G7u3gYT(Z+Qr zCuic)ObBdN>CL^MIm&k!+RM|mQ9R7)*=7Ov_4(y{hSQ8inO)+{c ziY`{(6`+R#yO@?>HuXzSJ#ZKfBxT5Q2K{f76MWI$8E!od!=WS zhp*pR8WH8>70g|&fA|k<9hLU=-mF#h5juWGfq@0n75NFPLSdGlCeVKOS8x<*N7=`J zVH++}T^L4oQkZmTqVmwN?Of>r_{qAj|7VA;4LAP~)NFIgPkEClpzP^CvGR}pxm7Iv zf=U@-WoIdO7t1?Dk>QFWbZs?1PpT)(G(g&oTZ_zBugXX-yb;~LX#J1Aw=;kA52bS)x8KV1t>{{$03rsLIq>5FL zbf<~Dscvwety}tQE@#^C$v<~$PFZCQjgjL=wj5;D$-A%bDMYCnTE0SxOD~jv^iQpk zH5x_tP`XLAKFLDYosa%&D|`HFt2q0@>T&~CyB4)+T#)L861ET}IZdo&Mz>PS1mG7fK&n~e~$YwE2wJIX$(&?YFN6^^PR zYp6+fS&c7l4J`xoFp3O4tgW9+Q(38QDywSnSXE7()ln<*Kj&Xi{lR}_ z-EaRc6ZFTdbN@L){dHzp^urt+`!K&m%+s;S)r3Q68nrmR^@ydnpSIL? zO8DL5R!xheLpv#;g|t>~jNu7~{MQL5JXXZsAL+)Ss-PVfux)C(!`gheX5BGvYKe# zsv=pd3iBO~R|fbV*XsLKR5WCj`o5oII=*UkTwfo}g4#5ypWssA(*w9kq{CvPQ`WWX zAj_Jruz2te|B~*u^&LH9jl_(qP}ZvBY}bs)T18z?RvBrvavzP37OW~WU^SHJer#1J zzAD1GhN7wkA86UcOQZT~DEwA)Ko_V>)wOl2R!c5ilcSq;KEn;Du~ksostDzHSn9QH zpcYpV?Qn?d-?Y{GHcet{+qHdt-fI1ux0P&@wo}$W_G6povuwNdk7HYQV!Nz=VmG#D z)!2W1OvhJklI`T~q76*$S+(74OV&T3o9wcIiJi{+SGQ}QOWPf<&;RCezO!Wq58clB z9X2?*!$!95vLW_IruW#;6wer+cGrwf7kAs{o%?L_o&&b|z^qLiJZfY6j@ZZ)jT+l( zLtCb7aALc=$sjk-4F`1NADNE-aIUof`WV*@>e?}SZ_`A{Hc#^X)%zCt@(?W?n%r43 zJ#2i6)^2yL9@)0rWV)vGHalsIdPNQSQDZnixV3a#Z#=Y(H|Be~cFhKK4}GRL+&=dx zzHT`!9H50I+d@nK!#2S2A8hS-Wfd~j@%7us&aQ;h$RTFt}NkWJfn z+t|*%Hac^}wj7+bakiUwA1DpMW*#y+{=d&7fiJL2Fz0P(9c+#vy8u>weQFfApCb)yq1=2e|JK zpE=I+25HA@V~7WxF>C;05P%GVAlc9)L;TwG*_nD2FaHf&y%-ez;AcPDm+!fAB|jW? zH`Osd|Hy{%pJ7Hz+fAToBerGc5F>Pu<9lpk??IcGDIT)%eTP8NVH;!k#%9>=nz4=B zY1H^u8^-g8ac*}r-B8A7IlQwi(_9AtwAFRk2-mEcyH@9fPKMbT`@%wfhv;c7}NH5KjBr z#(uQ_8^?JIAwtKrUEBZhHUGc+TX?DMHoj-SjqN?ie?Z;2-$tkQ+9YG6@fl}aO2ffW z?4GgBJND88bT^Q6_8++UAm?7&X7;&8R%#?&uOV{APym$DuyD^UAZnNcIyi(k|6qIp nuXnaOZiAp`?Z*Ef+Yb&s|LD;3b^qz1=j;EA|NHAmx##}@r^vQ# delta 33 mcmZ3}Ah4!EV1v+v_5yZBAZFTLz|Oqt2asfpE1xRGA_M@@y$fal