From 51d8e2b7d8026a3c20fe41132af85bf7fe570e61 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 15 Dec 2016 09:50:21 +0100 Subject: [PATCH] Progress --- .../Moose/Tasking/CommandCenter.lua | 34 ++++-- Moose Development/Moose/Tasking/Mission.lua | 114 ++++++++++++++++-- Moose Development/Moose/Tasking/Task.lua | 68 ++++++++++- Moose Development/Moose/Tasking/Task_A2G.lua | 2 +- Moose Development/Moose/Tasking/Task_SEAD.lua | 2 +- .../TSK-010 - Task Modelling - SEAD.lua | 67 +++++++++- .../TSK-010 - Task Modelling - SEAD.miz | Bin 28633 -> 29980 bytes 7 files changed, 263 insertions(+), 24 deletions(-) diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 797711cc4..593ca1893 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -74,8 +74,9 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) local EventGroup = GROUP:Find( EventData.IniDCSGroup ) if EventGroup and self:HasGroup( EventGroup ) then local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu ) - local MenuMissions = MENU_GROUP_COMMAND:New( EventGroup, "Missions", MenuReporting, self.ReportMissions, self, EventGroup ) - self:ReportMissions( EventGroup ) + local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Summary Report", MenuReporting, self.ReportSummary, self, EventGroup ) + local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Details Report", MenuReporting, self.ReportDetails, self, EventGroup ) + self:ReportSummary( EventGroup ) end end ) @@ -91,7 +92,9 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) function( self, EventData ) local PlayerUnit = EventData.IniUnit for MissionID, Mission in pairs( self:GetMissions() ) do + local Mission = Mission -- Tasking.Mission#MISSION Mission:AddUnit( PlayerUnit ) + Mission:ReportDetails() end end ) @@ -109,7 +112,20 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) end end ) - + + -- Handle when a player leaves a slot and goes back to spectators ... + -- The PlayerUnit will be UnAssigned from the Task. + -- When there is no Unit left running the Task, the Task goes into Abort... + self:EventOnCrash( + --- @param #TASK_BASE self + -- @param Core.Event#EVENTDATA EventData + function( self, EventData ) + local PlayerUnit = EventData.IniUnit + for MissionID, Mission in pairs( self:GetMissions() ) do + Mission:CrashUnit( PlayerUnit ) + end + end + ) return self end @@ -208,16 +224,18 @@ function COMMANDCENTER:MessageToCoalition( Message ) self:GetPositionable():MessageToBlue( Message , 20, CCCoalition ) end + --- Report the status of all MISSIONs to a GROUP. +-- Each Mission is listed, with an indication how many Tasks are still to be completed. -- @param #COMMANDCENTER self -function COMMANDCENTER:ReportMissions( ReportGroup ) +function COMMANDCENTER:ReportSummary( ReportGroup ) self:E( ReportGroup ) local Report = REPORT:New() for MissionID, Mission in pairs( self.Missions ) do local Mission = Mission -- Tasking.Mission#MISSION - Report:Add( " - " .. Mission:ReportStatus() ) + Report:Add( " - " .. Mission:ReportOverview() ) end self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) @@ -225,18 +243,18 @@ function COMMANDCENTER:ReportMissions( ReportGroup ) end --- Report the status of a Task to a Group. +-- Report the details of a Mission, listing the Mission, and all the Task details. -- @param #COMMANDCENTER self -function COMMANDCENTER:ReportTaskStatus( ReportGroup, Task ) +function COMMANDCENTER:ReportDetails( ReportGroup, Task ) self:E( ReportGroup ) local Report = REPORT:New() for MissionID, Mission in pairs( self.Missions ) do local Mission = Mission -- Tasking.Mission#MISSION - Report:Add( " - " .. Mission:ReportStatus() ) + Report:Add( " - " .. Mission:ReportDetails() ) end self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) - end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 64a31d41e..07898fc5c 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -46,7 +46,8 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi self:AddTransition( "Idle", "Start", "Ongoing" ) self:AddTransition( "Ongoing", "Stop", "Idle" ) - self:AddTransition( "Ongoing", "Finish", "Finished" ) + self:AddTransition( "Ongoing", "Complete", "Completed" ) + self:AddTransition( "*", "Fail", "Failed" ) self:T( { MissionName, MissionPriority, MissionBriefing, MissionCoalition } ) @@ -60,12 +61,35 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi self.Tasks = {} - -- Build the Fsm for the mission. - - return self end +--- FSM function for a MISSION +-- @param #MISSION self +-- @param #string Event +-- @param #string From +-- @param #string To +function MISSION:onbeforeComplete( Event, From, To ) + + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK_BASE + if not Task:IsStateSuccess() and not Task:IsStateFailed() and not Task:IsStateAborted() and not Task:IsStateCancelled() then + return false -- Mission cannot be completed. Other Tasks are still active. + end + end + return true -- Allow Mission completion. +end + +--- FSM function for a MISSION +-- @param #MISSION self +-- @param #string Event +-- @param #string From +-- @param #string To +function MISSION:onenterCompleted( Event, From, To ) + + self:GetCommandCenter():MessageToCoalition( "Mission " .. self:GetName() .. " has been completed! Good job guys!" ) +end + --- Gets the mission name. -- @param #MISSION self -- @return #MISSION self @@ -114,6 +138,28 @@ function MISSION:AbortUnit( PlayerUnit ) return PlayerUnitRemoved end + +--- Handles a crash of a PlayerUnit from the Mission. +-- For each Task within the Mission, the PlayerUnit is removed from Task where it is assigned. +-- If the Unit was not part of a Task in the Mission, false is returned. +-- If the Unit is part of a Task in the Mission, true is returned. +-- @param #MISSION self +-- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player crashing. +-- @return #boolean true if Unit is part of a Task in the Mission. +function MISSION:CrashUnit( PlayerUnit ) + self:F( { PlayerUnit = PlayerUnit } ) + + local PlayerUnitRemoved = false + + for TaskID, Task in pairs( self:GetTasks() ) do + if Task:CrashUnit( PlayerUnit ) then + PlayerUnitRemoved = true + end + end + + return PlayerUnitRemoved +end + --- Add a scoring to the mission. -- @param #MISSION self -- @return #MISSION self @@ -371,10 +417,12 @@ function MISSION:HasGroup( TaskGroup ) return Has end ---- Create a summary report of the mission (one line). +--- Create a summary report of the Mission (one line). -- @param #MISSION self -- @return #string -function MISSION:ReportStatus() +function MISSION:ReportSummary() + + local Report = REPORT:New() -- List the name of the mission. local Name = self:GetName() @@ -392,7 +440,59 @@ function MISSION:ReportStatus() end end - return "Mission " .. Name .. " - " .. Status .. " - " .. TasksRemaining .. " tasks remaining." + Report:Add( "Mission " .. Name .. " - " .. Status .. " - " .. TasksRemaining .. " tasks remaining." ) + + return Report:Text() +end + +--- Create a overview report of the Mission (multiple lines). +-- @param #MISSION self +-- @return #string +function MISSION:ReportOverview() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( "Mission " .. Name .. " - State '" .. Status .. "'" ) + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK_BASE + Report:Add( "- " .. Task:ReportSummary() ) + end + + return Report:Text() +end + +--- Create a detailed report of the Mission, listing all the details of the Task. +-- @param #MISSION self +-- @return #string +function MISSION:ReportDetails() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + + Report:Add( "Mission " .. Name .. " - State '" .. Status .. "'" ) + + -- Determine how many tasks are remaining. + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK_BASE + Report:Add( Task:ReportDetails() ) + end + + return Report:Text() end --- Report the status of all MISSIONs to all active Clients. diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index bf22b3b6c..6916969db 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -215,7 +215,7 @@ end --- Get the Task FSM Process Template -- @param #TASK_BASE self -- @return Fsm.Fsm#FSM_PROCESS -function TASK_BASE:GetFsmTemplate() +function TASK_BASE:GetUnitProcess() return self.FsmTemplate end @@ -223,7 +223,7 @@ end --- Sets the Task FSM Process Template -- @param #TASK_BASE self -- @param Fsm.Fsm#FSM_PROCESS -function TASK_BASE:SetFsmTemplate( FsmTemplate ) +function TASK_BASE:SetUnitProcess( FsmTemplate ) self.FsmTemplate = FsmTemplate end @@ -405,7 +405,7 @@ end function TASK_BASE:AssignToUnit( TaskUnit ) self:F( TaskUnit:GetName() ) - local FsmTemplate = self:GetFsmTemplate() + local FsmTemplate = self:GetUnitProcess() -- Assign a new FsmUnit to TaskUnit. local FsmUnit = self:SetStateMachine( TaskUnit, FsmTemplate:Copy( TaskUnit, self ) ) -- Fsm.Fsm#FSM_PROCESS @@ -869,6 +869,7 @@ function TASK_BASE:onenterAssigned( Event, From, To ) self:E("Task Assigned") self:MessageToGroups( "Task " .. self:GetName() .. " has been assigned!" ) + self:GetMission():__Start() end @@ -883,6 +884,9 @@ function TASK_BASE:onenterSuccess( Event, From, To ) self:MessageToGroups( "Task " .. self:GetName() .. " is successful! Good job!" ) self:UnAssignFromGroups() + + self:GetMission():__Complete() + end @@ -934,3 +938,61 @@ function TASK_BASE:onstatechange( Event, From, To ) end end + +do -- Reporting + +--- Create a summary report of the Task. +-- List the Task Name and Status +-- @param #TASK_BASE self +-- @return #string +function TASK_BASE:ReportSummary() + + local Report = REPORT:New() + + -- List the name of the Task. + local Name = self:GetName() + + -- Determine the status of the Task. + local State = self:GetState() + + Report:Add( "Task " .. Name .. " - State '" .. State ) + + return Report:Text() +end + + +--- Create a detailed report of the Task. +-- List the Task Status, and the Players assigned to the Task. +-- @param #TASK_BASE self +-- @return #string +function TASK_BASE:ReportDetails() + + local Report = REPORT:New() + + -- List the name of the Task. + local Name = self:GetName() + + -- Determine the status of the Task. + local State = self:GetState() + + + -- Loop each Unit active in the Task, and find Player Names. + local PlayerNames = {} + for PlayerGroupID, PlayerGroup in pairs( self:GetGroups():GetSet() ) do + local Player = PlayerGroup -- Wrapper.Group#GROUP + for PlayerUnitID, PlayerUnit in pairs( PlayerGroup:GetUnits() ) do + local PlayerUnit = PlayerUnit -- Wrapper.Unit#UNIT + if PlayerUnit and PlayerUnit:IsAlive() then + local PlayerName = PlayerUnit:GetPlayerName() + PlayerNames[#PlayerNames+1] = PlayerName + end + end + PlayerNameText = table.concat( PlayerNames, ", " ) + Report:Add( "Task " .. Name .. " - State '" .. State .. "' - Players " .. PlayerNameText ) + end + + return Report:Text() +end + + +end -- Reporting diff --git a/Moose Development/Moose/Tasking/Task_A2G.lua b/Moose Development/Moose/Tasking/Task_A2G.lua index d931a6c38..3e49e432b 100644 --- a/Moose Development/Moose/Tasking/Task_A2G.lua +++ b/Moose Development/Moose/Tasking/Task_A2G.lua @@ -45,7 +45,7 @@ do -- TASK_A2G self.TargetZone = TargetZone self.FACUnit = FACUnit - local Fsm = self:GetFsmTemplate() + local Fsm = self:GetUnitProcess() Fsm:AddProcess( "Planned", "Accept", FSM_ASSIGN_ACCEPT:New( "Attack the Area" ), { Assigned = "Route", Rejected = "Eject" } ) Fsm:AddProcess( "Assigned", "Route", FSM_ROUTE_ZONE:New( self.TargetZone ), { Arrived = "Update" } ) diff --git a/Moose Development/Moose/Tasking/Task_SEAD.lua b/Moose Development/Moose/Tasking/Task_SEAD.lua index 53e0649cf..765c0e0ad 100644 --- a/Moose Development/Moose/Tasking/Task_SEAD.lua +++ b/Moose Development/Moose/Tasking/Task_SEAD.lua @@ -45,7 +45,7 @@ do -- TASK_SEAD self.TargetSetUnit = TargetSetUnit self.TargetZone = TargetZone - local Fsm = self:GetFsmTemplate() + local Fsm = self:GetUnitProcess() Fsm:AddProcess( "Planned", "Accept", FSM_ASSIGN_ACCEPT:New( self.TaskBriefing ), { Assigned = "Route", Rejected = "Eject" } ) Fsm:AddProcess( "Assigned", "Route", FSM_ROUTE_ZONE:New( self.TargetZone ), { Arrived = "Update" } ) diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua index 1f9e7ea45..5f907e15a 100644 --- a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua +++ b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.lua @@ -1,4 +1,12 @@ - +--- Task Modelling - SEAD +-- +-- === +-- +-- Author: FlightControl +-- Date Created: 15 Dec 2016 +-- +-- # Situation +-- -- This test mission is a test bed for the TASKING framework. -- It creates an head quarters (HQ), which contains one mission with one task to be accomplished. -- When the pilot joins the plane, it will need to accept the task using the HQ menu. @@ -7,6 +15,56 @@ -- A smoking system is available that the pilot can use the acquire targets. -- Once all targets are elimitated, the task is finished, and the mission is set to complete. -- If the pilot crashes during flying, the task will fail, and the mission is set to failed. +-- +-- Uses the Tracing functions from BASE within the DCS.log file. Check the DCS.log file for the results. +-- Create a new SCHEDULER object. +-- Check the DCS.log. +-- +-- # Test cases: +-- +-- There should only be one Task listed under Others Menu -> HQ -> SEAD Targets -> SEAD. This is the TaskSEAD2, that is copied from TaskSEAD. +-- TaskSEAD is removed from the mission once TaskSEAD2 is created. +-- +-- ## Run this mission in DCS Single Player: +-- +-- * Once started, a slot. +-- * When in the plane, join the SEAD task through the Others Menu -> HQ -> SEAD Targets -> SEAD -> SEAD Radars Vector 2. +-- * When flying, watch the messages appear. It should say that you've been assigned to the task, and that you need to route your plane to a coordinate. +-- * Exit your plane by pressing ESC, and go back to the spectators. When in single player mode, just click on Back, and then click Spectators. +-- * Immediately rejoin a Slot, select an other plane. +-- * When in the plane, you should now not be able to join the Task. No menu options are given. That is because the Task is "Aborted". +-- * However, the aborted task is replanned within 30 seconds. As such, go back to spectators, and after 30 seconds, rejoin a slot in a plane. +-- * When in the plane, you should not be able to join the Task through the Others Menu -> HQ -> SEAD Targets -> SEAD -> SEAD Radars Vector 2. +-- * Once accepted, watch the messages appear. Route to the attach zone, following the coordinates. +-- * Once at the attack zone, you'll see a message how many targets are left to be destroyed. Attack the radar emitting SAM with a kh-25. +-- * When you HIT the SAM, you'll see a scoring message appear. One point is granted. +-- * Maybe you've fired two missiles, so, you'll see another HIT maybe on the SAM, again granting a point. +-- * When the SAM is DEAD (it may take a while), you'll see a scoring message that 10 points have been granted. +-- * You'll see a scoring message appear that grants 25 points because you've hit a target of the Task. (This was programmed below). +-- * You'll see a scoring message appear that grants 250 points because all Task targets have been elimitated. (This was also programmed below). +-- * You'll see a message appear that you have Task success. The Task will be flagged as 'Success', and cannot be joined anymore. +-- * You'll see a message appear that the Mission "SEAD Targets" has been "Completed". +-- +-- ## Run this mission in DCS Multiple Player, with one player: +-- +-- * Retry the above scenario, but now running this scenario on a multi player server, while connecting with one player to the mission. Watch the consistency of the messages. +-- +-- ## Run this mission in DCS Multiple Player, with two to three players simultaneously: +-- +-- * Retry the above scenario running this scenario on a multi player server, while connecting with two or three players to the mission. Watch the consistency of the messages. +-- * When the first player has accepted the Task, the 2nd and 3rd player joining the Task, will be automatically assigned to the Task. +-- +-- ## Others things to watch out for: +-- +-- * When flying to the attack zone, a message should appear every 30 seconds with the coordinates. +-- * When in the attack zone, a message should appear every 30 seconds how many targes are left within the task. +-- * When a player aborts the task, a message is displayed of the player aborting, but only to the group assigned to execute the task. +-- * When a player joins the task, a message is displayed of the player joining, but only to the group assigned to execute the task. +-- * When a player crashes into the ground, a message is displayed of that event. +-- * In multi player, when the Task was assigned to the group, but all players in that group aborted the Task, the Task should become Aborted. It will be replanned in 30 seconds. +-- +-- # Status: TESTING - 15 Dec 2016 + -- Create the HQ object. local HQ = COMMANDCENTER:New( GROUP:FindByName( "HQ" ) ) @@ -64,7 +122,7 @@ local SEADTask = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 1", "SEAD" -- The reason why this is done, is that each unit as a role within the Task, and can have different status. -- Therefore, the FsmSEAD is a TEMPLATE PROCESS of the TASK, and must be designed as a UNIT with a player is executing that PROCESS. -local SEADProcess = SEADTask:GetFsmTemplate() +local SEADProcess = SEADTask:GetUnitProcess() -- Adding a new sub-process to the Task Template. -- At first, the task needs to be accepted by a pilot. @@ -115,15 +173,16 @@ end -- we check if the SEADTask has still AlivePlayers assigned to the Task. -- If not, the Task will Abort. -- And it will be Replanned within 30 seconds. -function SEADTask:OnAfterPlayerAborted( PlayerUnit, PlayerName ) +function SEADTask:OnAfterPlayerCrashed( PlayerUnit, PlayerName ) if not SEADTask:HasAliveUnits() then SEADTask:__Abort() + SEADTask:__Replan( 30 ) end end local TaskSEAD2 = TASK_BASE:New( Mission, SEADSet, "SEAD Radars Vector 2", "SEAD" ) -- Tasking.Task#TASK_BASE -TaskSEAD2:SetFsmTemplate( SEADTask:GetFsmTemplate():Copy() ) +TaskSEAD2:SetUnitProcess( SEADTask:GetUnitProcess():Copy() ) Mission:AddTask( TaskSEAD2 ) Mission:RemoveTask(SEADTask) diff --git a/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz b/Moose Test Missions/TSK - Task Modelling/TSK-010 - Task Modelling - SEAD/TSK-010 - Task Modelling - SEAD.miz index 84f2a264452cd77df3cd6f02982bb75b09990b00..0714d75a1772925d8ee0b52fa98391e58ddc2845 100644 GIT binary patch delta 15445 zcmaKTV{|4@@NV=b+1R#iZ?v&(dt+N~Y}>YNZ@j_Awr%U?_rD+RJ@><%IcLtPneM7H zJ>B(GRX?+`1)6mVS_e%BW2y8^o{Izm;>nbVLdOAY*3!0H6T|Rj{P)FF$t%KOLhPF9 zgR~7m(~RkkCKpf2l+}-7=1$O1E*dAUHphJ1dRjN*O0tt&b3xK33H?3w@H2I1XD2_y z%Bz$ia?nIGgK;50V))P8Rd3+W`?LN1q8FB`N>xRKdCe3C^@Xz0%7)S7sq&gAoMgyP zGH@5*y;^pL27WL1>(9+%^jei9wdR^x5WqZ`ed!r#Q}Q27Q22sd$<-_afO=L zWa!K^X5y2j;%V~=#({1wL2sFgjMsp0yB2nK*_M^AT1iud*XK=MX-g%WUO5)mf`zSW zJZ|qCN41)Bz7V_$z`D#C5A#emWi?sSJyIS>n}`aV$wo`_pzUvR>{a44r)&WTYLGdA zTn3N`_FL0v{c^U7)EcTiB3xMAXHU#Nthd0(|977y>FMmEiSZzY9%=A<6`%=mnaXW< z2z@V_Ufmp1DB9v=<)V7>Ecbz1yy#INlTtGWBU`%TFO@2-tf`tI3(A8AfJ@fJbfW?W zZLEw}g|B#Jo4s-fBRiurVFzMc{!KV}e&V5zCdD1aw=FRY{w-YO#-mxptyv&Gv76l| zT~)3?*N|Es#U)Z!-!^~Uq$;UP@|FknjCwAprR7I9Ju~tqhkk#yisS0%QEptIeZ=g^ zeyxpR^HG?`Y+^C+`#9U2mNq_{IEnc4V}O`b8$Ehzq;!dJ zm{oQC(`;8NTP2&aL`9hh zF5dZvUM0epKLT7YGJyfTwtUYMcbu{!9MVAL2%jrr8y;pR+8=E6ecPvGCbBJ{gRaHm zP`5S~PLW{mO;9*lpe)rjEqkTniTx5Ti})nS{l2uqoob02GKi;O_`ENp$o(ILmcZiEK*@ zi*cDoZ`rbRWfS(A33@>EQxB!X^l|C+5Mg}=zxq+58p-Lcp18)rJnT; zP!vgKRGp3AFJ?tOF#tpl9XA9#sKwON&JhkVCQuvIDm2#VSNqg;%67|~y`!G>WH&W- zCEM0x8T2*WL_Rsd)Ylt4;a7yTV7@R&4UgV~P%$UWZ@?*lY;?O^uaMH&OEkAfkyHNc z;0qliOVWGMn}W$~f65RDqoW9O4tj2;S?}_r!@<6@SGGBqU-Eq^PN3>nPzv7yOqNOY zoi1&+shOgrPdo@o>JWl~G<-T%KL2@&)r0{(?eCw&QjL^_skodL+Yqq8veZnIJU z4h1H#deGGUP8Y=tI|DFuA8O5RR3R}a_eMJ4Z?Xjg@DfH<$W#TpVqAUP`-~O?(xCuL z8aNYYvkJ!}KWt|sI3y$>oST!yR7Qeejt;(85}qIe z;kt4EuT*;k%{gOyUXyyGzkAtEVo*S!94OXDlZ^!)E|GM^JNPqZ^Q5bOb$YJ^@hD32 z7_l@^iX9XM^zc_Rv3H(8`@}AIR^kowq5SigaeCXr@eD)owa`|@f@*z83};B(1|L=5 zVUL3oMZ!5SOwvcPz(FbSJ{W!=ulgd7&bz4l44_CRsTJ@8Hc~h4L$qD~pqJ_9i~02; z3#(`_Ptr0&qqo%cwfJ=;guQYLd!1U6zFOM56^~bxoHc~}fxCeGvRc?Gjgg`RWd|Ua zarlLch5YnP`(htWUlbgolEXWVBuJG;A@c{*gZ3TBbSb0Is(8A5r@5Oh+RwIM5LYE3 z87blju%dP3a;vKpq@i6DliZQ6j*Lt%>9A36p=VP@CTm|snD@q;bYO5^Cg9%bE%8s; ziM+~e1Or2<%_^I@zjfr|#*e1FyRl|sUaRpG$kfw^pPJ?MXw5usKB<^`8HwRhfD(Fe zENFEt(IBtLAuRJ6%yT2VspJz!V08yCFO^o-GV1=Qr^l-3tz9 zZQBQ|3kRYg3Fw_(fU}||%z`dug%pxy`YTt&>RihmcW{Ju(J%_lxf(%qXP>ghJ%U>dkei~6|1KqU^^6UocbWV>*l>aL0CM5 zuudeiHkN+l_A?o+#_w1$8l6Fu@Q(#Ph(Z7)lu=7TKGSLB}0MS=ak~ z=Nz0qtl(EZvI4kh>=9>_O4%uRUnQJ-Cyn6}<8Z*G#iKZ+J!gI51(=tRiG9j~>w-_l z7LPpbj#4TEHK1@^Qc)7h^%v`w878NzK5q6}iKlo6!eMqk74fcptvH+F9xt%#&=wS& zY|^TNQ?*<2-^J%)Q@`TU@t&t6Gf)bDDV}F(?I-$VAMq1f1EWCnNd4d&G2hnSNSbU#s0xKn+Y@OBH8pKo=QkP}cMxi67FBa-rJwgux@=RS*r{ac(G+F#b=U1M1iP(Id*VHNO|My@}z%m(c0c4UOn8b^_h$ky0hW`DAC#jsp)Z!>K-xBP2qCmiIv_jue1Cl&fl*P^cWO2hzZZ>%t6|v3mM`y zoa{G42(x46;!4j(*KFbQbZ3dCata@-Zpzz+6wW+bZepP*ja5jj_idJAy1NB*JjNXw zeFp8v(+vWNy+VFBI7MnME2 z{#%@%2*YiFq6qn}@B~sCe7QOqt)nV_>R0(v6lP_ecASi+0_D_h2GLO6bToe&fki#f z;J9=^0%98teA@AUCG=v4*icnM!&-8w?9)MxGFk<`?zECfO}T;UdHr@p{;QdUu>bB| z3*M%k>M^29j`9=H1HGcar6l3-2ir-q1r1h}qD*+Y7_(tXq;i?4?(7W`DkK^F5BJ9!4ZwySWoFF3E8c}$XXGHegC+NYE}63SGC#dF2rTn8WQ2gN zZvr9T8RDw3 z>yDUfXTVpQE$`tL(S;ECxR}ISi`fp?`s0td6rmX7kOWdj29v!ef0O0wL6f!4Lh(&K zT;l>h%-OngChV@wd0~vpEjV?S?*j2u98YN!AK=%-&vqHY_KqE2@1D*0v$_eV3!!dg zc!Tmk8hY>&+k%f+-rq^W3DbUlo@4=kjgA3c>BPJQ!ABg27cBDs`49Yw{RF^Q8PsP7 zMvmAK8eUdH!~VVw*C*X~jdX=RCM4*-!QuktTElU*^#rd^2Yvd8QrwiY)}!CZ+=Y&~ zan=~f;Q3ttqh+&J7TyfK?#htx>)jM_FHFK!7~EA3H~6KMN0UXm!s{;SvLhepIYm%$ zglw5dHIw9Z#6tHEYCB>XDxA853_IoIIcy-c7bDOClLS)0!EaQxUZb^LXvc3$HYdz< z{n;8&G0r7$9p0X0#B9<&Q(8Iay)-5(Zq{VwRj$07c&RPyaW!_gBQJ}2V2|uU6*$Sk zMIjAVBVlj3ctV?F!mb$_T1^C$k-3U3f!(@Rx(TeaqIK>!gk*9fFZGsZb+7O9x3QlR z|CEl1=YT4`n!I;=oS?P#8ZP#=%1|~l5EFBL{qbl6aS^PPfUdk-mTzA}KNe7#Z&+x7 zT%$aRVvZbV_!zM0V%8d|Gb?KkbD&$84%(Tj{I%V6{7ic!>Rb40-d0#S_fj6J(5UeY zMF#3OW?K{PwQT&s<@B+vj@Is|r+0F>MvhtaKiAZrugiDR+Yq}K2Rl4r%pXDwE*_Ps zXzE|!3ew;ZXdoaU&>*1S*N%Fg2)e{YPBNgrRUi}E(AEbU=37HQ3`L98&*i|6KQOdI zs?vll#073hrz%G4YQsHmO{?6=<^+fWa#QW?H|dlbXdUkmPkG+7aoN9J(#vDr9UqBN zwV&|uS(Nly1vj+oTm@q5Rw_7^T(#;bU`as1Wl0@VPP@;+V`tl#C?1eFC<=lpkukC1 zvRUjx*NTW7QR~!(8w&rm`PQ~GY1cUrB*t@L0h28u(ka{{+Sgg`nQyovotE%lTQc$R zX--rC*=&$aXASfNQoLUdcSJ*XA00t_g9pZskVS>VPRivgRjqW@sk(Skt{aiKCx7Ld zHiPrY8+=cpU9=HRn@Lswv{gA#^yQr;M&T;Y9h^6HF9k({?j zGYt2$>W_2!_1>-t1i(J%};idprEvUtt9nb1&UZl>E$18?9UZ`I`zaA8aT@bB@7X_}#wPH@wUUwf9|gZO-y z5CLfn0DO6|emkw1RUf=a{*<}iPB2Yc8wE175>vINtJ|`6u2bkU%qGo6uwef4XCQbu zoLU?b?`Et)73pPTV86h;7M}Kq?UDE4zE@vcIzFq^uamOib10TR%H643$ep`g>mA&J zx-@HD-nD-}Itp%eWW^1v8@XP>u$XI-alW6Xk0V61uy{{P(ne$DVD7zi0oAhks0KEM zS+)mFABRWXHv3N0s-Wd5ZBJRnr|FZ**4bv?FSmjBLVVh?UnSHNU1PcnJaWWt4r~oC zc{}QNuM89q=4KBK2g9f6Y@1E{9GPU@VZd^_xBmWgJgGXgjT_0@Y`cO>?Ir4^i1vGl zUm&c^0zIzgFyYU(`M3&$T^#GX$pv!QUO)1Q^30F6C<#0tLO8v>3GZ5AaConR)t5{+ zxonGewe>^Vy#t>svmmR{QT*ll)T<9|DsOg5e5#vqIG4%@rquZ( zT~RxY4jJnXBMX22`}f>XK!~d;z|rVyEjs-exOfOW8eRn~y;7$G#Y7mw41kl551|U} z3Ib7&m7KYqwASW4I*pDgP24&1S$=Iwzk89{ryI3$DXgs>&X88Dn>2?m&NI)DNSXUG z(;IbPGudBOnp>}|YC7XOyH%&ij;!q@oTwMcIju0ST{(=FY;G!zMUUTGd4&V5=&aj;iXGNJn=y)<^T!H;_wmUUu61k={ z7`wS%nbnC&NRQMvcY&evT0{ELqEM!SvbCelQTP5dc01mRyvKaH|p?x z^Oaq+t*ojMoog)C2Y^Sfp@buC0}e+l8;k`gzOocmm5+ukBi-lF(ot52KVcVT{jb$7 zZE@p3Nw)9|=_1`f&3dCLF2w?0I5O&Sqf~Faa4&e&XIfh)T9=x#nYK1Xwpd&Tu3BeW z=^!syUNZpsqWc+iF!TjWT}Hhz&+MAcS|W8rU^65k^azq7^}vPiyId_bK{g-PRej(S zE=T3a!$OhA_0Snaj*VX|1ts-cViRm?6SS86M$<9Lbe_(f%ZYQ>lp{XUgm|y(ZKaYI zk}WU)Mi#ewO5hW{GVbdg)Wz>{bfm+fTe!%OhlZoCiKWF!*sQIGqRy7f%-Bn(Q+;^j zA!J+J=6c3BfVeauUi1gk{JCMik=-1ZnL4p~u^MzKOeCP8-R@*ro%cTC@4i7(U}IjW zhvM36@~~Ep0Oo+puHc^}!@iO#*Pi;ys3 z@fcysgGIl0PgE&h)e6PnzZBg%=WV_KD8(N9TC^7_O$+Kw7!)(N*|KC)x)lIXVc=d zbG&rJsNP{~L#UcGJk4r}o_8@*B-pN5`VnkVW^3s$h!(fqWTaB2rOqPuU@A;hGc+V7l+Xwl`$>w0^DtVzNJ5&!m35{vg%n|gTHMucw2O`CgZkP9DB#V!1*8RSM^gcn z&7Gn)f`6_J@6hpcqx8ndZJI$-K;>YxYyM2*_Ry(6muA)y|0O~axWgr(xbiaHrPHst zb0n8lMu~+z$a%RXkt^@oKd#-K#TSADG|^~x=N=Zp>^7Vf^>wHB-JGFU?zsG&J8=~M z2dRf%_q-eIBp^W~rX}RS%w)@pNz=~OPGEhQa7C$a9@pzWcWI63`M1?1%k-e$b7QR% zAD`~v&Vt9AFs?TQWON(RX_oz0jQ?zE8pQ> z9N7dxZ(~GAM29Z>MO)Ul%y_VJ5KBz1Efa5w_0HFstj<=U#^kE8zLW$#<8QDmezdmK zxWY*pmqs!0R54}Q_!wAymxQjvk3dl!G0*mtidrKisU7OYoJAua;Q1UD$$9w4C$n}l zphlK=X=}aD1G&3%#EucO{wKdyC{XmYL<9_{!b-wHgE7mE^O&bnZ@WABrcI*MIlH~p zGd?|08a@GqU;z2Ume@FJp*!Z0r+-c7y@zn~%r>+1%B6bzp(9{1hX@($4R7XbvC(DY zB4P)0LvEl}DSu5jw`VOJrRXL><=9n15AnOSau(g3wQ2k{`_ymM>PX73POx0W`sH*VvjhIZ*APG|BQH{n{=UobW+SZNb}BuBE1 z?@tClT6Lc=F+8izfq`B3E?2#EoWG--TOb$i%i7YlgUOc8@`{*ivnFiPZ#P5B6z?KbGU{51wP#N9ak7w76I$q9Ye`;t#Ue7 zS04_@+Fln700CLbU`_J4(QoxoF4LK&Tz|xg#3fvDjGDM zYBZ_Yx&*QLr=L4hded}n-CkPmjo!{0THjAmfpR^ znxUT68)kw0KA!oM>j4p;dbN^eOJoLNG`$r58z*F6Q=W=oR8%+RO_{>?5-gceT>X=k zO15nDqFp@s#CPL~7;3e0Vf+uLK|q1-)v{BkVSD?S$nyX>`$XljoLW4ASz zu!W26cQ>-ODU^ozSXX)ri~UsmDR;NA9a73;yRp(KcRt5%q3j!)5QX5VC9o4Imtk7E z+vzEHd;wlPG*1UG+Zz3l97+0i0Zj%WN&Rbg0j4`sbK#m7B1U0y!lNfiZy?{RP1*h& z%~w)`ek2FO*-`X6(qbHphn{|Tn~ zWW!QSK19-cR%*C}mhgvd-tW!*byy*%5z#<-q&S2hP-$?!Pw z@mcP5#Y+|_-D->@>z}UsAHd9NZCg{evn9XZYCJtv>~{R?=K`~9uk-mk?>uM!u5a>p zm?EXj%qAFYdXL6VgSlw#Md<1FBx+QOIZqX-r@Epca^tYiMEaLd0huTKqaB!859_}% zr{fbp>?z3de8H%f{Ewgl?qXwtD#W@~;6wRfR|rIvFb^pwo-H8lcFwX3VDoen-;V>t<$WmsJ4$)i`R z+Ax#XRHXYNJ4V5HbiiP-a(XaxYV6DrOpk|51{vAR{Jh`~VdYGiiQumlNzsD|>Vk08 zi9&Hxs3|%EE7Q~wLQ|0s-=6Eu_3aHgGwP!kI^G^1Ilt^N@>V~Q+{*!{;^DSLne+1X znhnuHzIY)Jlq@pqpR)@b1o(fO5HB88D;-v>by_mcZ}wMA@qj1Z$*x^2iJ7+hj+t3c zqHQ7j@-EtoMF{CbmItTdr!-FyRaNB+_)%|suXvveme|9S3m20^lNTEoqG!WQ4ELRf z3!-l|OY^q2wfC7~S6k#!qlJGi$^TrG{wrEL;jsPbHZ0n>WUkxPpOD z;nhnF&<-s&z}OOl^Q|b9?ElD8Vv4-FfDkDCH`sR49M)^^=CEY7q0_XQeHIzBd8xzZ zyw|XC()6%)xp9+$wrmm_7;eWJ|HK_kk!o|HW*4WpuLQi((KTOvKP6c&xZAx|>LnAF zJUYF+g}8uN86v@?=ou5;EamwYev*C*&0^oe-j48jT&%2D z%J|@bwIUkKQUlb=u4y+G(@shS(b*JJY+!r(c=2`uB6p87xR3$ zQVG0!*Lgfl#g874xG4WSq-<;_Pq7TDR)e=gTZ++VnX0rF@mfi__2cl-vb8AovcWz} zp?G8OZ%F2;!c0$`a&SZu4WC6>Sv5XB4a&uG$W~f2g4|)*B9EF%OF>x!kJ_NR+DOFn z_^Af6z9v5HE^Vc;sJE$0Rak9R4Ejy-LOqbA=et$V{CBIm)l&_{{^&$5hA7d+nhNZ8uR=-8qQ7)2J!p#!7g=WDx!*}E_L7f5HP;=_5Y_% z5SS`#RG z3K8kMPSW&vQQu$Ca=b6|K3rv>*olBq&huxnzko+W1uD|~|6@%_8=r2#^4l7~t~OAV z@&`t9EF1>9t^lbGD1lc};&}?&toDpa?zXe;ab0G5uMUb?Bk)hWpy+fJwbT8a)ApzF zQH|M^!`!su!B4ywG{TcX-3;yKzSLo;jSsbufKfE>gt=P(z3MujTPGh~f5yyENhXkA z3a@iZ>PLvvW1_+CnP7G-h{;6G(2CI?8;=hY>(=Wwpym>(m|QO0|3ti?gv=4A2&a~o zm@qOUVI8_4Vt}d$42o_6Z9EL=Ew0P`c^Mmdpbv=W{9z> z@{$8cdB7@~(K9UE8?Ow&1g94YKt$}?I$ASjbp%*d7NGh!z+9XmG5{OztXuF=7Q*+|xny`pX@C(a2 zAzj0YY^x`3KydzDUnBU2{RY2L7pbkX4#6@?hddC2)1fu&hg=a7nT+cAW3~;Gy?WRiruTKIJ;JoZMQNuV~BP z_Yd!OIACkMXo<1CJw!kvV@U8YbWj4oNTy`5OyG1S)(ptTO!p>tg*f~;+9YtYapGK7 z#N?4yEIN)33jKJ>ka7bWS8;+OoLG{p07iFJO6p~>E_?ntN{}%(Gf0qjxU7)S0$tgJ zAT%q8Ppv&AImK&*$s1x&AqRk0Av^ zF+f9~5XXizyfSg_MsAunS|m9VwB5KgCdgBF1;5eYWkPqsPc??=PyIEBTwxDQtlwI* z0%Sm)Vwa*x09E(x8_h#NTSZCSKuF+c^?F#8q6zFvQiCXjNzzzmyp)o>MN4PfN{br> z$IVEj;W9uwbof-4L8oHQ;m1*XDzx1|ZQXO)Qkok$RFpdNLjtfkKj^s$h{!|{x2sXg zrDs?|_e({Rl)yK&XU0VP`^q!?6Gt@J2F@>Ji6W=XdK#!`3a{5`r$X&H8Oh!ICwM~l zr?9pwt`-om0DXb` zPwS$WEHd4DixvH%riPAD(Lx3_ zB$DKLF0#f0_DzC0(sJ6j_@e8b64s5oVIx}{ujP9%TgnT00Mib-yLpiZ zZF9M^%LIsv^9jzbFQ~y)c@FD@(dI%8&E5VH@`-$@KOB@|RX1^95Bl?-ls)YwVey`> zb_&(q?vNAPNF6HuYmPehhQvIwY;o)7)hcT9_sG-Ts=3F zm|3rQHPXU`GMtU%8yY#n{t6fF+s2C-<0wRR5ec>5EJ@J`=%yFuG>`yiBlfjSK+TC8 zE<{-ikVJ>HS1(_J@m82GZ*6Pj=7k|aGu@zO71=A&Fir4Um`76sKbx$8D*t>oqxAEdNpwNX&x|L z(I2M}cXlyGB}2YllEO)Z?pP6i-G*@`eKfd-vr91JfN!f)rB+DZebtsmNMJ6FJ!p7d@glke#00}L6u+wa#WHa20^6E8U z(#=)k1b94XkGq^JD?O=~5d3s}!zN1bm_#++aFg2_0hREGBn_E>fR;|-=-#Ltj*dcI zRGa}2!jfR2Fv~QvO3g@M!TTqv3^fR%`}dq5E3qD5G>-oS+{s)9uDH9!dXOB9BpnQ- zTnSfF&461FL(d|eWsH>+M)sn5)QSMjy4(R!3WRSuVc(@b`Rg~a9&uRaKvdkkZ85OJ zK8~&UUJQUz@~t~C2ZKNMQnunzDA#2*Gj`x{sdf3$MB9NE-;huDx!XwXi zQA{n#JE%G=EX;QwZ-EMRV5iKU%N*O#B#sbPV!{Mv=xaN|au3zXs>*JW6sjo%okOFr z3!Gsgyzsh9G>k^uFye?-;O|SPfTkDsneSzV;`4g1uRV637EEeI#E$qkB!Myb5N=^J zWTv#Npc1pRACTh4=4c9%AuA59d^P03MCxQT$C#8P6{M;~Ol)B;FuW3KsH3rP%o(Y; z>1iTq)*N-(6p7jlQzL8Al}V76n>yhxs}rRkO3ulERqRb!qB5m~gyO9_n$F5zDlao3`fjz^Lf( zk4(e#ZwUU;)>IuZ7i#MyUx+(f(d!ijQqhG=p9iP%1J(F4L~$x#(|?Q#yrzjqbKYOb zIf!7>WkIe|*kBwA9jW5qqTMpS6AN>wWv`Qv!T8$i_oN>DRDmCozwEb{vhx3)_+)3V z7DXxV>&njAZ~@BvbkXsqQ7b0E@SGQ{8qUHuJgV|ABx`DAj8ga}=F2zqG^1}fWJx6A z52ws>rDEEHZkQa~87@&6V~}O0o*jh*W27 z!?mcS4TQo$w=Sq@o|Jelo~yAU*LuWG(jquH?BMfr@$dAV%76A3o%pVG^%cXZAQeqy z|9!;QVOkx5qL!K99pL{oh0-)eVxQb{4h6Du7iN(U}H$bL`nKuUQu zE&UVTYV+4}jTW3x%}tWOsG!go+1dF;bl)%Xk``yqpz2kHCdg+iHY6@%FCp>3@x0#$ zZZw#|Qgtc5(Si5`q2_vo3sKSpho$-)w%5o<00lE0fd`a$8Sa~bz~Q|@{0%#hU3{M2 zsj)2I)4L)@jUXkJ5UQz_uY>GofZF{wL-A+^l+k&uF+A(;rJ+XoMk}muv@$N+ij4}l zsBF)9_LIxtB7*!qZoYzfBQ1~)?t_v;C3c7`eZ^1J6{taA_R`KO4{_{Tq%>YpcLX2P zqGByB2*isak7-@5{i*iu?uo4S!YnF+(?PA8md+h_8zZqeA@jB}2oqZ;kd}27>h024ipfLsETm1BVqfw@j1l-e2zc=6lB>h%{ME zOc2Y{_hy{-FV?YT&o2qmq^GA@2+)U#K!;d25 z2EQ>jdqJHt-qcFuy^<0D!Q{jbIOtFD&j7`C0T8gGOH}4$foF}lP)eH&+vZ?E_{&h; zpG^f9_FIa@Yn(AE`~eZDA*h4=YW7z(>wPP){er4b8bPYQj!5w#uHZ74%4;zq@#EUa zT!x!zY2BWd!!txZ4UpjEP$O`MOi46Vvlu(cgaQqtr4*R<9d8QiY^r|Znns>GVPMz^ zcT6<#@}v;7^bu(s)+7{sgEb_;OeNF4WIHzOdBZdAtnNzBmK=}@@4v_jkQIG@Dpds{ zG{3z$Cb0$4#K20M|LmnVPJRaR$PoyHjgB_ zy=*)TFqMAJ{+X0p8HmB1xH9>$wc8;CM2sJ9NvcZd2u1Hqqu&cPYNFmy{d{nVcVZUi zAcE*zIeD2y4CHB4k9?gCauQJ6r8gzYK1V0N;IaUvBkUCWcY3a&V6O2e25$0^G=yOCxv-kmoB8MY8+1hYHtmjgF z!}ty`V1mpo=^&BEdTLHVCj59Au5o69_$NPorra+eY=IAlklN~#*$AQ<2OlKJ7R%xi zh!IZ>N-lG@kOkgX22@~=Gml`-XO_w0GT%N32J1WKkwwts*#wS12K15Bo9-bmKV~+% zE3>+$MQdo~;(;nfQ;boZt$;UHnw9PdrkFF)$u8@-T2c%Iwe1srFl0lcUKqHJdMPDP zMJi^niK9RZ2A15*n66>nizDt3j%#gU+e;5eI-Cj;XLxTa{H*M85Yh7qoUGc)6-2Mb zlEN1*E`rc>F9x!YkxjecZQz8I2KJ>QL_Fam?{D!&fiFx~LtkcE7 zf;V62ym2T7h@_o$WKT1x-ZE*@q+Hr>pXHLhTwZO(!6heOuB;R;(>FU{G6%&|kKK{% zu1gI;SFOz9lc(I~GrGDqrH8&n3@}Pk3nU%mW?b&c7{{UHj+5?SH2RTugE6f9gkhbw zU|sRz3;Y4lV(^}r31(I7)ea9n;FWpd{*e!p1kKuTZ;4M#=SN#DgW-~=fM$xAK(CRk zOCR(WN6^^wC& zfP^b5Dax`LM8I&5^{=jrB z4}l&r?KwVc5Iv`+ut?CT>DD#uJJSj6S!P@n=u zpTbcDlNbM6wh2-w5{?imTc!xX+AKl=%1|))99YqAvI?B?AfhzYk$y~ZCM?ZjgI%P1 z3IZ@9zNc<^>M29i$M`CP=sjV`}nC%2g z%mmQ=M=0n@ZUHd&SruaTJ}#})tun!BQGcmQzd3*>-TWk|cG3i>_BFSGJuuV%Yw{i= z*1vP5tiwD2m-q`e~ctOfC5mdeB%|szo777yRr7!kcx239ti&o}c z`0E6WFRc|kg&zm;ZRgNNDuP7pdon{h5Ft8Tl(@Mzx${l9D*~0!FbbQ{@Fa;qd|(CP zX0N06VXW;kgVp&>l0*r@(3Tl%GREY-L#&%Lq`Wrytz+?W7z_*A?}SN~Qsf&NAc;@t zv_*FCA4N4{TSenO9&WyO9HA{SHc>T6y(jMNPkEVD#Sl+BnyLOJfYV50o+9V2Baz#A z&q5vk3!6e^1Adm2&=|Gdu9_%7!3@3dXX;+>(sZxz!>DMXXEFRET^A5LiFO#bi~M5~ zA>2F9z#cpnaxB#l9R}L5{6@($Q}*^qhS=D|)=p9c!8)>&Hp7nY@~jLZEdlynUpT?H zn`dYKPHbuNOt7VWdUqUxQI<5CimO~eZ<4zCz2`@afopYiKC@S1+O=mpn`f4(b3`?5nb7reOB zu*H{;=t#M2UufJ@RP`ms$&@$e zNlFRRFj-AV0_TxJwsB$0DoUJsOW3_YFeJx9%h>C7?6Z;|kH*rj4y%}aTS5pFXN(0c znbYJu_=)U81+a*O)_g=y@D&|t3=66|J+J}4kqt74>gPyFg9N%>Gf|(GEy9olxZ!2! z222*^SYeXejYmP2#guJHO-FLf9=$~!>?n9Vg7$52W+ZJnEV!Z;ObUrXufj@)PErd4 zW}3?w{chEOmlyFi>3~1h$AkrdK~BN#nJVB7Vh)}J5{YpP!mrYBo=wG}h&-T-$`ELa zBeb<#wwC7jD>W;w!2~4ZLlu#AlU>*FFGFfwSYVk&p9>?p1s3oAUIu^!l-2*D6|Q1n zKRAG%-C?K6pCi%!A+Yt~J-M+i;e&sqb}DmCKYde3GW?e5Z)n1;h+n`E?w@;c-9(Ai zY!TGV-8J09fRt1^^^n}S&fURGdvv6|-hRYyz9jMP*ZtRjG|faEJDf%#V@TNl`=4DU zTNS+jVYz3;zh$(?fm delta 14059 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