From d8ca54c9f9d07e36f014d773a3c7d2e1860bb30f Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Fri, 5 Mar 2021 19:57:29 +0000 Subject: [PATCH 01/24] add pat support --- STAPLE/geometry/processTriGeomBoneSet.m | 36 ++++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/STAPLE/geometry/processTriGeomBoneSet.m b/STAPLE/geometry/processTriGeomBoneSet.m index 2fef91b..5f75de1 100644 --- a/STAPLE/geometry/processTriGeomBoneSet.m +++ b/STAPLE/geometry/processTriGeomBoneSet.m @@ -33,6 +33,8 @@ % % algo_tibia - the algorithm selected to process the tibial geometry. % +% algo_patella - the algorithm selected to process the patellar geometry. +% % result_plots - enable plots of final fittings and reference systems. % Value: 1 (default) or 0. % @@ -75,7 +77,7 @@ % so that all params that has been processed here are immediately available %-------------------------------------------------------------------------- -function [JCS, BL, BCS] = processTriGeomBoneSet(triGeomBoneSet, side_raw, algo_pelvis, algo_femur, algo_tibia, result_plots, debug_plots, in_mm) +function [JCS, BL, BCS] = processTriGeomBoneSet(triGeomBoneSet, side_raw, algo_pelvis, algo_femur, algo_tibia, algo_patella, result_plots, debug_plots, in_mm) % setting defaults if nargin<2 @@ -84,18 +86,20 @@ % get sign correspondent to body side [~, side] = bodySide2Sign(side_raw); end -if nargin<3; algo_pelvis = 'STAPLE'; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; in_mm = 1; end -if nargin<4; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; in_mm = 1; end -if nargin<5; algo_tibia = 'Kai2014'; in_mm = 1; end -if nargin<6; result_plots = 1; end -if nargin<7; debug_plots = 0; end -if nargin<8; in_mm = 1; end +if nargin<3; algo_pelvis = 'STAPLE'; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; algo_patella = 'GIBOC-ACS'; in_mm = 1; end +if nargin<4; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; algo_patella = 'GIBOC-ACS'; in_mm = 1; end +if nargin<5; algo_tibia = 'Kai2014'; algo_patella = 'GIBOC-ACS'; in_mm = 1; end +if nargin<6; algo_patella = 'GIBOC-ACS'; in_mm = 1; end +if nargin<7; result_plots = 1; end +if nargin<8; debug_plots = 0; end +if nargin<9; in_mm = 1; end % deal with empty inputs (can be used to specify algo_tibia but use default % pelvis, for example. -if isempty(algo_pelvis); algo_pelvis = 'STAPLE'; end -if isempty(algo_femur ); algo_femur = 'GIBOC-cylinder'; end -if isempty(algo_tibia ); algo_tibia = 'Kai2014'; end +if isempty(algo_pelvis ); algo_pelvis = 'STAPLE'; end +if isempty(algo_femur ); algo_femur = 'GIBOC-cylinder'; end +if isempty(algo_patella); algo_patella = 'GIBOC-ACS'; end +if isempty(algo_tibia ); algo_tibia = 'Kai2014'; end % names of the segments @@ -192,15 +196,15 @@ %---- PATELLA ----- if isfield(triGeomBoneSet, patella_name) - switch method_patella + switch algo_patella case 'Rainbow' [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = Rainbow2013_buildpACS(); - case 'GIBOC-vol-ridge' - [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), 'volume-ridge'); - case 'GIBOC-ridge' - [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), 'ridge-line'); + case 'GIBOC-ridge-volume' + [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), side, 'volume-ridge'); + case 'GIBOC-ridge-line' + [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), side, 'ridge-line'); case 'GIBOC-ACS' - [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), 'artic-surf'); + [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), side, 'artic-surf'); otherwise % error('choose coorect patellar algorithm'); end From 52da3e74573fba02559a5e9e67f489bfea637bbd Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Fri, 5 Mar 2021 19:58:14 +0000 Subject: [PATCH 02/24] add pat support --- STAPLE/algorithms/GIBOC_femur.m | 36 ++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/STAPLE/algorithms/GIBOC_femur.m b/STAPLE/algorithms/GIBOC_femur.m index 764e3a1..ee6bd93 100644 --- a/STAPLE/algorithms/GIBOC_femur.m +++ b/STAPLE/algorithms/GIBOC_femur.m @@ -153,6 +153,9 @@ % on long convexhull edges extremities [postCondyle_Med_Tri, postCondyle_Lat_Tri, AuxCSInfo] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'post_condyles', debug_plots); +% extract patellar grooves +[patGroove_Med_Tri, patGroove_Lat_Tri, CS] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'pat_groove'); + % exporting articular surfaces (more triangulations can be easily added % commenting out the parts of interest if nargout>3 @@ -162,13 +165,9 @@ ArtSurf.(['lat_cond_', side_raw]) = fullCondyle_Lat_Tri; ArtSurf.(['dist_femur_', side_raw])= DistFemTri; ArtSurf.(['condyles_', side_raw]) = TriUnite(fullCondyle_Med_Tri, fullCondyle_Lat_Tri); + ArtSurf.(['pat_groove', side_raw]) = TriUnite(patGroove_Med_Tri, patGroove_Lat_Tri); end -% extract patellar grooves -% [Groove_Med, Groove_Lat, CS] = GIBOC_femur_ArticSurf(EpiFem, CS, CoeffMorpho, 'pat_groove'); -% Fit two spheres to patellar groove -% CS = CS_femur_SpheresOnPatellarGroove(Groove_Lat, Groove_Med, CS); - % how to compute the joint axes disp(['Fitting femoral distal articular surfaces using ', fit_method, ' method...']) switch fit_method @@ -195,6 +194,14 @@ knee_name = joint_name_list{~strncmp(joint_name_list, 'hip', 3)}; side_low = hip_name(end); +% Fit two spheres to patellar groove !DO NOT MOVE ABOVE knee_name! +patellofemoral_name = ['patellofemoral_', side_low]; +% !DO NOT MOVE ABOVE knee_name! +[AuxCSInfo.(patellofemoral_name), JCS_ptf] = CS_femur_SpheresOnPatellarGroove(patGroove_Lat_Tri, patGroove_Med_Tri, CS, side_raw); + +% add patellofemoral JCF field +JCS.(patellofemoral_name) = JCS_ptf.(patellofemoral_name); + % define segment ref system BCS.CenterVol = CenterVol; BCS.Origin = AuxCSInfo.CenterFH_Renault'; %[origin must be 3x1] @@ -255,12 +262,17 @@ % final printout disp('Done.'); -% % plot patellar fitting as well -% PlotTriangLight(DistFem, CS, 1); hold on -% quickPlotTriang(Groove_Lat, 'b') -% quickPlotTriang(Groove_Med, 'r') -% plotSphere(CS.patgroove_center_med,CS.patgroove_radius_med, 'r', alpha); -% plotSphere(CS.patgroove_center_lat,CS.patgroove_radius_lat, 'b', alpha); - +% plot patellar fitting as well +if debug_plots + CS = AuxCSInfo.(patellofemoral_name); + plotTriangLight(DistFemTri, BCS, 1); hold on + quickPlotTriang(patGroove_Lat_Tri, 'b') + quickPlotTriang(patGroove_Med_Tri, 'r') + plotSphere(CS.patgroove_center_med,CS.patgroove_radius_med, 'r', alpha); + plotSphere(CS.patgroove_center_lat,CS.patgroove_radius_lat, 'b', alpha); + plotCylinder((CS.patgroove_center_lat-CS.patgroove_center_med)', 3, (CS.patgroove_center_lat+CS.patgroove_center_med)/2,... + 3.4*norm(CS.patgroove_center_lat-CS.patgroove_center_med), 1, 'k'); + title('Patellar Groove Fitting'); +end end From b9cffe6b2c824e31fd3229fd512d1790cb9f6a33 Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 24 May 2021 13:47:42 +0100 Subject: [PATCH 03/24] comment --- STAPLE/anthropometry/assignMassPropsToSegments.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STAPLE/anthropometry/assignMassPropsToSegments.m b/STAPLE/anthropometry/assignMassPropsToSegments.m index 6a90494..507a24d 100644 --- a/STAPLE/anthropometry/assignMassPropsToSegments.m +++ b/STAPLE/anthropometry/assignMassPropsToSegments.m @@ -37,7 +37,7 @@ % opensim libraries import org.opensim.modeling.* -av_bodies = fields(JCS); +% av_bodies = fields(JCS); % TODO: rewrite in a more clever way % setting defaults From cb61aa061d64a02a5015f9a2186a2a70baa15a9c Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sat, 18 Jun 2022 08:39:56 +0200 Subject: [PATCH 04/24] Added Example_VSDFullBodyBoneModels.m --- Example_VSDFullBodyBoneModels.m | 187 ++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 Example_VSDFullBodyBoneModels.m diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m new file mode 100644 index 0000000..81eabdb --- /dev/null +++ b/Example_VSDFullBodyBoneModels.m @@ -0,0 +1,187 @@ +F%-------------------------------------------------------------------------% +% Copyright (c) 2022 MCM Fischer. % +% Author: MCM Fischer, 2022 % +% ----------------------------------------------------------------------- % +% This example demonstrates how to setup a STAPLE workflow to +% automatically generate a complete kinematic model of the lower +% extremities using the anatomical VSDFullBodyBoneModels datasets. +% ----------------------------------------------------------------------- % +clear; clc; close all +addpath(genpath('STAPLE')); + +%----------% +% SETTINGS % +%----------% +%% VSDFullBodyBoneModels +vsdFolder = 'D:\Biomechanics\MSM\Database\VSDFullBodyBoneModels'; +%% STAPLE +output_models_folder = 'opensim_models_examples'; +% folder where the various datasets (and their geometries) are located. +datasets_folder = 'bone_datasets'; + +% format of input geometries +input_geom_format = 'tri'; +% visualization geometry format (options: 'stl' or 'obj') +vis_geom_format = 'obj'; +% body sides +sides = {'r', 'l'}; +% choose the definition of the joint coordinate systems (see documentation) +joint_defs = 'Modenese2018'; +%-------------------------------------- + +%% Convert VSD to STAPLE format +vsdSubjectXLSX = fullfile(vsdFolder, 'MATLAB\res\VSD_Subjects.xlsx'); +[~, ~, rawXLSXsdta] = xlsread(vsdSubjectXLSX); +vsdSubjects = cell2table(rawXLSXsdta(2:end,:),'VariableNames',rawXLSXsdta(1,:)); + +for n_sub = 1%:size(vsdSubjects,1) + load(fullfile(vsdFolder, 'Bones', [vsdSubjects.Number{n_sub} '.mat']),'B','M') + subFolder = fullfile(datasets_folder, ['VSD_' vsdSubjects.Number{n_sub}] , input_geom_format); + if ~isfolder(subFolder) + mkdir(subFolder) + end + % Create 'pelvis_no_sacrum.mat' + trPath = fullfile(subFolder, 'pelvis_no_sacrum.mat'); + if ~isfile(trPath) + TR = concatenateMeshes(B(ismember({B.name},'Hip_R')).mesh,B(ismember({B.name},'Hip_L')).mesh); + TR = triangulation(TR.faces, TR.vertices); + save(trPath,'TR') + end + % Create legs + for n_side = 1:length(sides) + % Create 'femur_*.mat' + trPath = fullfile(subFolder, ['femur_' sides{n_side}]); + if ~isfile(trPath) + TR = splitMesh(B(ismember({B.name},['Femur_' upper(sides{n_side})])).mesh,'maxBoundingBox'); + TR = triangulation(TR.faces, TR.vertices); + save(trPath,'TR') + end + % Create 'tibia_*.mat' + trPath = fullfile(subFolder, ['tibia_' sides{n_side}]); + if ~isfile(trPath) + TR = concatenateMeshes(... + B(ismember({B.name},['Tibia_' upper(sides{n_side})])).mesh,... + B(ismember({B.name},['Fibula_' upper(sides{n_side})])).mesh); + TR = triangulation(TR.faces, TR.vertices); + save(trPath,'TR') + end + % Create 'talus_*.mat' + trPath = fullfile(subFolder, ['talus_' sides{n_side}]); + if ~isfile(trPath) + TR = splitMesh(B(ismember({B.name},['Talus_' upper(sides{n_side})])).mesh,'maxBoundingBox'); + TR = triangulation(TR.faces, TR.vertices); + save(trPath,'TR') + end + % Create 'calcn_*.mat' + trPath = fullfile(subFolder, ['calcn_' sides{n_side}]); + if ~isfile(trPath) + TR = splitMesh(B(ismember({B.name},['Calcaneus_' upper(sides{n_side})])).mesh,'maxBoundingBox'); + TR = concatenateMeshes(TR,... + B(ismember({B.name},['Tarsals_' upper(sides{n_side})])).mesh,... + B(ismember({B.name},['Metatarsals_' upper(sides{n_side})])).mesh); + TR = triangulation(TR.faces, TR.vertices); + save(trPath,'TR') + end + % Create 'toes_*.mat' + trPath = fullfile(subFolder, ['toes_' sides{n_side}]); + if ~isfile(trPath) + TR = B(ismember({B.name},['Phalanges_' upper(sides{n_side})])).mesh; + TR = triangulation(TR.faces, TR.vertices); + save(trPath,'TR') + end + end +end + +%% STAPLE +% datasets that are processed +datasets = strcat('VSD_',vsdSubjects.Number'); +% masses for models +subj_mass_set = vsdSubjects.Weight'; %kg + +tic + +% create model folder if required +if ~isfolder(output_models_folder); mkdir(output_models_folder); end + +for n_d = 1%:numel(datasets) + + % current dataset being processed + cur_dataset = datasets{n_d}; + + % folder from which triangulations will be read + tri_folder = fullfile(datasets_folder, cur_dataset, input_geom_format); + + % log printout + log_file = fullfile(output_models_folder, [cur_dataset,'_bilateral.log']); + logConsolePrintout('on', log_file); + + for n_side = 1:2 + + % get current body side + [sign_side , cur_side] = bodySide2Sign(sides{n_side}); + + % cell array with the bone geometries that you would like to process + bones_list = {'pelvis_no_sacrum', ['femur_', cur_side],... + ['tibia_', cur_side], ['talus_', cur_side],... + ['calcn_', cur_side]}; + + % model and model file naming + cur_model_name = ['auto_',datasets{n_d},'_',upper(cur_side)]; + model_file_name = [cur_model_name, '.osim']; + + % create geometry set structure for all 3D bone geometries in the dataset + triGeom_set = createTriGeomSet(bones_list, tri_folder); + + % create bone geometry folder for visualization + geometry_folder_name = [cur_model_name, '_Geometry']; + geometry_folder_path = fullfile(output_models_folder,geometry_folder_name); + + % convert geometries in chosen format (30% of faces for faster visualization) + writeModelGeometriesFolder(triGeom_set, geometry_folder_path, vis_geom_format,0.3); + + % initialize OpenSim model + osimModel = initializeOpenSimModel(cur_model_name); + + % create bodies + osimModel = addBodiesFromTriGeomBoneSet(osimModel, triGeom_set, geometry_folder_name, vis_geom_format); + + % process bone geometries (compute joint parameters and identify markers) + [JCS, BL, CS] = processTriGeomBoneSet(triGeom_set, cur_side); + + % create joints + createOpenSimModelJoints(osimModel, JCS, joint_defs); + + % update mass properties to those estimated using a scale version of + % gait2392 with COM based on Winters's book. + osimModel = assignMassPropsToSegments(osimModel, JCS, subj_mass_set(n_d)); + + % add markers to the bones + addBoneLandmarksAsMarkers(osimModel, BL); + + % finalize connections + osimModel.finalizeConnections(); + + % print + osim_model_file = fullfile(output_models_folder, model_file_name); + osimModel.print(osim_model_file); + + % inform the user about time employed to create the model + disp('-------------------------') + disp(['Model generated in ', sprintf('%.1f', toc), ' s']); + disp(['Saved as ', osim_model_file,'.']); + disp(['Model geometries saved in folder: ', geometry_folder_path,'.']) + disp('-------------------------') + clear triGeom_set JCS BL CS + + % store model file (with path) for merging + osim_model_set(n_side) = {osim_model_file}; %#ok + end + % merge the two sides + merged_model_file = fullfile(output_models_folder,[cur_dataset,'_bilateral.osim']); + mergeOpenSimModels(osim_model_set{1}, osim_model_set{2}, merged_model_file); + + % stop logger + logConsolePrintout('off'); +end +% remove paths +rmpath(genpath('STAPLE')); \ No newline at end of file From 5bb91d0e6f0589ec8406215dad1237a3929d5e06 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Wed, 20 Jul 2022 20:57:39 +0200 Subject: [PATCH 05/24] minor update --- Example_VSDFullBodyBoneModels.m | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index 81eabdb..fc121ba 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -1,4 +1,4 @@ -F%-------------------------------------------------------------------------% +%-------------------------------------------------------------------------% % Copyright (c) 2022 MCM Fischer. % % Author: MCM Fischer, 2022 % % ----------------------------------------------------------------------- % @@ -12,6 +12,8 @@ %----------% % SETTINGS % %----------% +%% Additional libraries +addpath(genpath('C:\dev\matGeom')) %% VSDFullBodyBoneModels vsdFolder = 'D:\Biomechanics\MSM\Database\VSDFullBodyBoneModels'; %% STAPLE @@ -33,12 +35,15 @@ vsdSubjectXLSX = fullfile(vsdFolder, 'MATLAB\res\VSD_Subjects.xlsx'); [~, ~, rawXLSXsdta] = xlsread(vsdSubjectXLSX); vsdSubjects = cell2table(rawXLSXsdta(2:end,:),'VariableNames',rawXLSXsdta(1,:)); +% Remove subjects with incomplete skeletal anatomy +vsdSubjects = vsdSubjects(cellfun(@(x) isempty(strfind(x,'cut off')), vsdSubjects.Comment),:); %#ok -for n_sub = 1%:size(vsdSubjects,1) +for n_sub = 4%:size(vsdSubjects,1) load(fullfile(vsdFolder, 'Bones', [vsdSubjects.Number{n_sub} '.mat']),'B','M') subFolder = fullfile(datasets_folder, ['VSD_' vsdSubjects.Number{n_sub}] , input_geom_format); if ~isfolder(subFolder) mkdir(subFolder) + disp(['Created: ' datasets_folder '\' subFolder]) end % Create 'pelvis_no_sacrum.mat' trPath = fullfile(subFolder, 'pelvis_no_sacrum.mat'); @@ -103,7 +108,7 @@ % create model folder if required if ~isfolder(output_models_folder); mkdir(output_models_folder); end -for n_d = 1%:numel(datasets) +for n_d = 4%:numel(datasets) % current dataset being processed cur_dataset = datasets{n_d}; From 56dba5b51b7da23595d0b71a81802e0419d1a4be Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Wed, 20 Jul 2022 22:00:28 +0200 Subject: [PATCH 06/24] Cloning VSD database from git instead of hardcoded path. --- .gitignore | 1 + Example_VSDFullBodyBoneModels.m | 34 ++++++++++++++++++++++----------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index d67a070..c80c42b 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ tests/models_from_tests/ #vim files *.*~ +/VSD diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index fc121ba..d137508 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -7,16 +7,13 @@ % extremities using the anatomical VSDFullBodyBoneModels datasets. % ----------------------------------------------------------------------- % clear; clc; close all + +% STAPLE library addpath(genpath('STAPLE')); +% Additional libraries +addpath(genpath('C:\dev\matGeom')) % https://github.com/mattools/matGeom -%----------% -% SETTINGS % -%----------% -%% Additional libraries -addpath(genpath('C:\dev\matGeom')) -%% VSDFullBodyBoneModels -vsdFolder = 'D:\Biomechanics\MSM\Database\VSDFullBodyBoneModels'; -%% STAPLE +%% SETTINGS ------------------------------------------------------------- % output_models_folder = 'opensim_models_examples'; % folder where the various datasets (and their geometries) are located. datasets_folder = 'bone_datasets'; @@ -29,17 +26,32 @@ sides = {'r', 'l'}; % choose the definition of the joint coordinate systems (see documentation) joint_defs = 'Modenese2018'; -%-------------------------------------- +% ----------------------------------------------------------------------- % + +%% VSDFullBodyBoneModels +% Clone example data +if ~exist('VSD', 'dir') + try + !git clone https://github.com/MCM-Fischer/VSDFullBodyBoneModels VSD + rmdir('VSD/.git', 's') + catch + warning([newline 'Clone (or copy) the example data from: ' ... + 'https://github.com/MCM-Fischer/VSDFullBodyBoneModels' newline 'to: ' ... + fileparts([mfilename('fullpath'), '.m']) '\VSD' ... + ' and try again!' newline]) + return + end +end %% Convert VSD to STAPLE format -vsdSubjectXLSX = fullfile(vsdFolder, 'MATLAB\res\VSD_Subjects.xlsx'); +vsdSubjectXLSX = fullfile('VSD', 'MATLAB\res\VSD_Subjects.xlsx'); [~, ~, rawXLSXsdta] = xlsread(vsdSubjectXLSX); vsdSubjects = cell2table(rawXLSXsdta(2:end,:),'VariableNames',rawXLSXsdta(1,:)); % Remove subjects with incomplete skeletal anatomy vsdSubjects = vsdSubjects(cellfun(@(x) isempty(strfind(x,'cut off')), vsdSubjects.Comment),:); %#ok for n_sub = 4%:size(vsdSubjects,1) - load(fullfile(vsdFolder, 'Bones', [vsdSubjects.Number{n_sub} '.mat']),'B','M') + load(fullfile('VSD', 'Bones', [vsdSubjects.Number{n_sub} '.mat']),'B','M') subFolder = fullfile(datasets_folder, ['VSD_' vsdSubjects.Number{n_sub}] , input_geom_format); if ~isfolder(subFolder) mkdir(subFolder) From 8de766c9502665a3d49daecacbd9e9eff5bfc222 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Wed, 2 Nov 2022 21:50:41 +0100 Subject: [PATCH 07/24] Fixed the bug in fitQuadriTalus.m by ensuring the correct order of the quadrilateral vertices. --- Example_VSDFullBodyBoneModels.m | 8 +- .../SubFunctions/FittingFun/fitQuadriTalus.m | 119 ++++++++++++------ 2 files changed, 82 insertions(+), 45 deletions(-) diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index d137508..d72e058 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -51,8 +51,8 @@ vsdSubjects = vsdSubjects(cellfun(@(x) isempty(strfind(x,'cut off')), vsdSubjects.Comment),:); %#ok for n_sub = 4%:size(vsdSubjects,1) - load(fullfile('VSD', 'Bones', [vsdSubjects.Number{n_sub} '.mat']),'B','M') - subFolder = fullfile(datasets_folder, ['VSD_' vsdSubjects.Number{n_sub}] , input_geom_format); + load(fullfile('VSD', 'Bones', [vsdSubjects.ID{n_sub} '.mat']),'B','M') + subFolder = fullfile(datasets_folder, ['VSD_' vsdSubjects.ID{n_sub}] , input_geom_format); if ~isfolder(subFolder) mkdir(subFolder) disp(['Created: ' datasets_folder '\' subFolder]) @@ -111,7 +111,7 @@ %% STAPLE % datasets that are processed -datasets = strcat('VSD_',vsdSubjects.Number'); +datasets = strcat('VSD_',vsdSubjects.ID'); % masses for models subj_mass_set = vsdSubjects.Weight'; %kg @@ -163,7 +163,7 @@ osimModel = addBodiesFromTriGeomBoneSet(osimModel, triGeom_set, geometry_folder_name, vis_geom_format); % process bone geometries (compute joint parameters and identify markers) - [JCS, BL, CS] = processTriGeomBoneSet(triGeom_set, cur_side); + [JCS, BL, CS] = processTriGeomBoneSet(triGeom_set, cur_side, [],'Kai2014'); % create joints createOpenSimModelJoints(osimModel, JCS, joint_defs); diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index a6676d3..c98770b 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -17,18 +17,35 @@ plotOn = 0; end +%% First project the mesh on the plane perpendicular to X0 (1st inertia axis) +Pts_inertia = (V_all'*Tr.Points')'; -%% First project the mesh on the plan perpendicular to X0 (1st inertia axis) -YZ0 = [V_all(:,2),V_all(:,3)]; -PX0 = YZ0*inv(YZ0'*YZ0)*YZ0'; %Projection matrix -Pts_proj = V_all'*PX0*Tr.Points'; +if plotOn + figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 (1st inertia axis)', ... + 'color','w','numbertitle','off'); + axis equal tight; hold on + plot3(Pts_inertia(:,1),Pts_inertia(:,2),Pts_inertia(:,3),'g.') + xlabel('X'); ylabel('Y'); zlabel('Z') + view(90,0) +end -% Keep only the 2 and 3rd coordinates -Pts_proj_2D = Pts_proj(2:3,:)'; +% Keep only the 2nd (Y0) and 3rd (Z0) dimension +Pts_proj_2D = Pts_inertia(:,2:3); +assert(sum(sum(Pts_inertia(:,2:3)-Pts_proj_2D)) < 1e-8) %Get the convex hull of the point cloud K = convhull(Pts_proj_2D,'simplify', false); +if plotOn + projFig = figure('name', 'Debug Figure: fitQuadriTalus.m: Convex hull of the projection on X0', ... + 'color','w','numbertitle','off'); + projAxes = axes(); + axis equal tight; hold on + plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') + plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') + xlabel('Y'); ylabel('Z') +end + % Find the max edge maxDist = -1; for i=1:length(K) @@ -44,51 +61,74 @@ end end +% Find the two points of the convex hull with max. distance to each other +% assuming that it is the 1st diagonal of the quadrilateral +pwDist = squareform(pdist(Pts_proj_2D(K,:))); +[~, maxDistIdx] = max(pwDist(:)); +[rowPP1,colPP1] = ind2sub(size(pwDist),maxDistIdx); +pointPair1 = [K(rowPP1),K(colPP1)]; +U1 = (Pts_proj_2D(pointPair1(2),:)-Pts_proj_2D(pointPair1(1),:))'; + +if plotOn + maxDist1D_H = plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-o'); + legend(maxDist1D_H, '1st diagonal') +end + % Hacky way to find the second diagonal of the quadrilateral by shrinking -% along the point cloud in the direction (U1) of the first found diagonal +% along the point cloud in the direction (U1) of the 1st diagonal found U1 = normalizeV(U1); Ru = [U1(1),-U1(2);U1(2),U1(1)]; -Pts_proj_2D_shr = transpose(Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D'); -% plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'b.') +Pts_proj_2D_shr = (Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D')'; +if plotOn + figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 shrinked along 1st diagonal', ... + 'color','w','numbertitle','off'); + axis equal tight; hold on + plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'g.') + line(Pts_proj_2D_shr(K,1),Pts_proj_2D_shr(K,2)) + xlabel('Y'); ylabel('Z') +end -% Find the max edge on the shrink points cloud -maxDist = -1; -for i=1:length(K) - for j=1:length(K) - diff1 = Pts_proj_2D_shr(K(j),1)-Pts_proj_2D_shr(K(i),1); - diff2 = Pts_proj_2D_shr(K(j),2)-Pts_proj_2D_shr(K(i),2); - dist = sqrt(diff1^2+diff2^2); - if dist>maxDist - maxDist=dist; - pointPair2=[K(i),K(j)]; - U2=[diff1;diff2]; - end - end +% Find the two points of the convex hull with max. distance to each other +% assuming that it is the 2nd diagonal of the quadrilateral +pwDist = squareform(pdist(Pts_proj_2D_shr(K,:))); +[~, maxDistIdx] = max(pwDist(:)); +[rowPP2,colPP2] = ind2sub(size(pwDist),maxDistIdx); +pointPair2 = [K(rowPP2),K(colPP2)]; + +if plotOn + maxDist2D_H = plot(Pts_proj_2D_shr(pointPair2,1),Pts_proj_2D_shr(pointPair2,2),'r--o'); + legend(maxDist2D_H, '2nd diagonal') end -% Get the quadrilateral vertices -quadriV = [pointPair1(1); pointPair2(1);... - pointPair1(2); pointPair2(2);... - pointPair1(1)]; +% Sort the quadrilateral vertices in counter-clockwise direction along the +% convex hull +quadriVIdx = sort([rowPP1,colPP1,rowPP2,colPP2]); +quadriV = K([quadriVIdx,quadriVIdx(1)]); + +if plotOn + maxDist2D_H = plot(projAxes, Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r--o'); + qLitVerts_H = text(projAxes, Pts_proj_2D(quadriV(1:4),1),Pts_proj_2D(quadriV(1:4),2),{'1','2','3','4'},... + 'HorizontalAlignment','right', 'FontSize',14, 'FontWeight','bold'); + legend([maxDist1D_H,maxDist2D_H], {'1st diagonal','2nd diagonal'}) +end -% Get the length of the quadri edges +% Get the length of the edges of the quadrilateral edgesLength = zeros(4,1); for i=1:4 diff1 = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); diff2 = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); edgesLength(i) = sqrt(diff1^2+diff2^2); end - [~,Imax] = max(edgesLength); -% Indices of start vertices of quadrilateral +% Index of the start vertex of the quadrilateral I_V_sup = mod(Imax+2,4); % Edge corresponding to the superior part of the bone is assumed to be the % one opposing the largest one Edge_sup = quadriV(I_V_sup:I_V_sup+1); -% Get the direction of the edge : +% Get the direction of the edge U_edge_sup = [Pts_proj_2D(Edge_sup(2),1)-Pts_proj_2D(Edge_sup(1),1);... Pts_proj_2D(Edge_sup(2),2)-Pts_proj_2D(Edge_sup(1),2)]; %Z0_proj is normal to edge direction @@ -103,17 +143,14 @@ Y0 = cross(Z0,V_all(:,1)); if plotOn - figure() - plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') - hold on - plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') - axis equal - plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-*') - plot(Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r-*') - plot(Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... - 'linewidth',2) - plot(Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... - 'linewidth',3) + qLitEdge_H = plot(projAxes, Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... + 'linewidth',2); + supEdge_H = plot(projAxes, Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... + 'linewidth',3); + legend([maxDist1D_H,maxDist2D_H,qLitEdge_H,supEdge_H],... + {'1st diagonal','2nd diagonal','Quadrilateral edges','Superior edge'}) + uistack(qLitVerts_H, 'top'); + figure(projFig) end end From 54b3554f20b7ccc79358caca0b54c20d7a919f49 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sat, 19 Nov 2022 15:59:57 +0100 Subject: [PATCH 08/24] reverted fitQuadriTalus.m --- .../SubFunctions/FittingFun/fitQuadriTalus.m | 119 ++++++------------ 1 file changed, 41 insertions(+), 78 deletions(-) diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index c98770b..a6676d3 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -17,35 +17,18 @@ plotOn = 0; end -%% First project the mesh on the plane perpendicular to X0 (1st inertia axis) -Pts_inertia = (V_all'*Tr.Points')'; -if plotOn - figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 (1st inertia axis)', ... - 'color','w','numbertitle','off'); - axis equal tight; hold on - plot3(Pts_inertia(:,1),Pts_inertia(:,2),Pts_inertia(:,3),'g.') - xlabel('X'); ylabel('Y'); zlabel('Z') - view(90,0) -end +%% First project the mesh on the plan perpendicular to X0 (1st inertia axis) +YZ0 = [V_all(:,2),V_all(:,3)]; +PX0 = YZ0*inv(YZ0'*YZ0)*YZ0'; %Projection matrix +Pts_proj = V_all'*PX0*Tr.Points'; -% Keep only the 2nd (Y0) and 3rd (Z0) dimension -Pts_proj_2D = Pts_inertia(:,2:3); -assert(sum(sum(Pts_inertia(:,2:3)-Pts_proj_2D)) < 1e-8) +% Keep only the 2 and 3rd coordinates +Pts_proj_2D = Pts_proj(2:3,:)'; %Get the convex hull of the point cloud K = convhull(Pts_proj_2D,'simplify', false); -if plotOn - projFig = figure('name', 'Debug Figure: fitQuadriTalus.m: Convex hull of the projection on X0', ... - 'color','w','numbertitle','off'); - projAxes = axes(); - axis equal tight; hold on - plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') - plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') - xlabel('Y'); ylabel('Z') -end - % Find the max edge maxDist = -1; for i=1:length(K) @@ -61,74 +44,51 @@ end end -% Find the two points of the convex hull with max. distance to each other -% assuming that it is the 1st diagonal of the quadrilateral -pwDist = squareform(pdist(Pts_proj_2D(K,:))); -[~, maxDistIdx] = max(pwDist(:)); -[rowPP1,colPP1] = ind2sub(size(pwDist),maxDistIdx); -pointPair1 = [K(rowPP1),K(colPP1)]; -U1 = (Pts_proj_2D(pointPair1(2),:)-Pts_proj_2D(pointPair1(1),:))'; - -if plotOn - maxDist1D_H = plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-o'); - legend(maxDist1D_H, '1st diagonal') -end - % Hacky way to find the second diagonal of the quadrilateral by shrinking -% along the point cloud in the direction (U1) of the 1st diagonal found +% along the point cloud in the direction (U1) of the first found diagonal U1 = normalizeV(U1); Ru = [U1(1),-U1(2);U1(2),U1(1)]; -Pts_proj_2D_shr = (Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D')'; - -if plotOn - figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 shrinked along 1st diagonal', ... - 'color','w','numbertitle','off'); - axis equal tight; hold on - plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'g.') - line(Pts_proj_2D_shr(K,1),Pts_proj_2D_shr(K,2)) - xlabel('Y'); ylabel('Z') -end +Pts_proj_2D_shr = transpose(Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D'); +% plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'b.') -% Find the two points of the convex hull with max. distance to each other -% assuming that it is the 2nd diagonal of the quadrilateral -pwDist = squareform(pdist(Pts_proj_2D_shr(K,:))); -[~, maxDistIdx] = max(pwDist(:)); -[rowPP2,colPP2] = ind2sub(size(pwDist),maxDistIdx); -pointPair2 = [K(rowPP2),K(colPP2)]; -if plotOn - maxDist2D_H = plot(Pts_proj_2D_shr(pointPair2,1),Pts_proj_2D_shr(pointPair2,2),'r--o'); - legend(maxDist2D_H, '2nd diagonal') +% Find the max edge on the shrink points cloud +maxDist = -1; +for i=1:length(K) + for j=1:length(K) + diff1 = Pts_proj_2D_shr(K(j),1)-Pts_proj_2D_shr(K(i),1); + diff2 = Pts_proj_2D_shr(K(j),2)-Pts_proj_2D_shr(K(i),2); + dist = sqrt(diff1^2+diff2^2); + if dist>maxDist + maxDist=dist; + pointPair2=[K(i),K(j)]; + U2=[diff1;diff2]; + end + end end -% Sort the quadrilateral vertices in counter-clockwise direction along the -% convex hull -quadriVIdx = sort([rowPP1,colPP1,rowPP2,colPP2]); -quadriV = K([quadriVIdx,quadriVIdx(1)]); - -if plotOn - maxDist2D_H = plot(projAxes, Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r--o'); - qLitVerts_H = text(projAxes, Pts_proj_2D(quadriV(1:4),1),Pts_proj_2D(quadriV(1:4),2),{'1','2','3','4'},... - 'HorizontalAlignment','right', 'FontSize',14, 'FontWeight','bold'); - legend([maxDist1D_H,maxDist2D_H], {'1st diagonal','2nd diagonal'}) -end +% Get the quadrilateral vertices +quadriV = [pointPair1(1); pointPair2(1);... + pointPair1(2); pointPair2(2);... + pointPair1(1)]; -% Get the length of the edges of the quadrilateral +% Get the length of the quadri edges edgesLength = zeros(4,1); for i=1:4 diff1 = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); diff2 = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); edgesLength(i) = sqrt(diff1^2+diff2^2); end + [~,Imax] = max(edgesLength); -% Index of the start vertex of the quadrilateral +% Indices of start vertices of quadrilateral I_V_sup = mod(Imax+2,4); % Edge corresponding to the superior part of the bone is assumed to be the % one opposing the largest one Edge_sup = quadriV(I_V_sup:I_V_sup+1); -% Get the direction of the edge +% Get the direction of the edge : U_edge_sup = [Pts_proj_2D(Edge_sup(2),1)-Pts_proj_2D(Edge_sup(1),1);... Pts_proj_2D(Edge_sup(2),2)-Pts_proj_2D(Edge_sup(1),2)]; %Z0_proj is normal to edge direction @@ -143,14 +103,17 @@ Y0 = cross(Z0,V_all(:,1)); if plotOn - qLitEdge_H = plot(projAxes, Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... - 'linewidth',2); - supEdge_H = plot(projAxes, Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... - 'linewidth',3); - legend([maxDist1D_H,maxDist2D_H,qLitEdge_H,supEdge_H],... - {'1st diagonal','2nd diagonal','Quadrilateral edges','Superior edge'}) - uistack(qLitVerts_H, 'top'); - figure(projFig) + figure() + plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') + hold on + plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') + axis equal + plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-*') + plot(Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r-*') + plot(Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... + 'linewidth',2) + plot(Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... + 'linewidth',3) end end From 6a8a9fc31ec5556af6c309c477e1a2d5d13241da Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sat, 19 Nov 2022 16:10:25 +0100 Subject: [PATCH 09/24] Fix of fitQuadriTalus.m by ensuring the correct order of the quadrilateral vertices. --- .../SubFunctions/FittingFun/fitQuadriTalus.m | 119 ++++++++++++------ 1 file changed, 78 insertions(+), 41 deletions(-) diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index a6676d3..c98770b 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -17,18 +17,35 @@ plotOn = 0; end +%% First project the mesh on the plane perpendicular to X0 (1st inertia axis) +Pts_inertia = (V_all'*Tr.Points')'; -%% First project the mesh on the plan perpendicular to X0 (1st inertia axis) -YZ0 = [V_all(:,2),V_all(:,3)]; -PX0 = YZ0*inv(YZ0'*YZ0)*YZ0'; %Projection matrix -Pts_proj = V_all'*PX0*Tr.Points'; +if plotOn + figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 (1st inertia axis)', ... + 'color','w','numbertitle','off'); + axis equal tight; hold on + plot3(Pts_inertia(:,1),Pts_inertia(:,2),Pts_inertia(:,3),'g.') + xlabel('X'); ylabel('Y'); zlabel('Z') + view(90,0) +end -% Keep only the 2 and 3rd coordinates -Pts_proj_2D = Pts_proj(2:3,:)'; +% Keep only the 2nd (Y0) and 3rd (Z0) dimension +Pts_proj_2D = Pts_inertia(:,2:3); +assert(sum(sum(Pts_inertia(:,2:3)-Pts_proj_2D)) < 1e-8) %Get the convex hull of the point cloud K = convhull(Pts_proj_2D,'simplify', false); +if plotOn + projFig = figure('name', 'Debug Figure: fitQuadriTalus.m: Convex hull of the projection on X0', ... + 'color','w','numbertitle','off'); + projAxes = axes(); + axis equal tight; hold on + plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') + plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') + xlabel('Y'); ylabel('Z') +end + % Find the max edge maxDist = -1; for i=1:length(K) @@ -44,51 +61,74 @@ end end +% Find the two points of the convex hull with max. distance to each other +% assuming that it is the 1st diagonal of the quadrilateral +pwDist = squareform(pdist(Pts_proj_2D(K,:))); +[~, maxDistIdx] = max(pwDist(:)); +[rowPP1,colPP1] = ind2sub(size(pwDist),maxDistIdx); +pointPair1 = [K(rowPP1),K(colPP1)]; +U1 = (Pts_proj_2D(pointPair1(2),:)-Pts_proj_2D(pointPair1(1),:))'; + +if plotOn + maxDist1D_H = plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-o'); + legend(maxDist1D_H, '1st diagonal') +end + % Hacky way to find the second diagonal of the quadrilateral by shrinking -% along the point cloud in the direction (U1) of the first found diagonal +% along the point cloud in the direction (U1) of the 1st diagonal found U1 = normalizeV(U1); Ru = [U1(1),-U1(2);U1(2),U1(1)]; -Pts_proj_2D_shr = transpose(Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D'); -% plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'b.') +Pts_proj_2D_shr = (Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D')'; +if plotOn + figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 shrinked along 1st diagonal', ... + 'color','w','numbertitle','off'); + axis equal tight; hold on + plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'g.') + line(Pts_proj_2D_shr(K,1),Pts_proj_2D_shr(K,2)) + xlabel('Y'); ylabel('Z') +end -% Find the max edge on the shrink points cloud -maxDist = -1; -for i=1:length(K) - for j=1:length(K) - diff1 = Pts_proj_2D_shr(K(j),1)-Pts_proj_2D_shr(K(i),1); - diff2 = Pts_proj_2D_shr(K(j),2)-Pts_proj_2D_shr(K(i),2); - dist = sqrt(diff1^2+diff2^2); - if dist>maxDist - maxDist=dist; - pointPair2=[K(i),K(j)]; - U2=[diff1;diff2]; - end - end +% Find the two points of the convex hull with max. distance to each other +% assuming that it is the 2nd diagonal of the quadrilateral +pwDist = squareform(pdist(Pts_proj_2D_shr(K,:))); +[~, maxDistIdx] = max(pwDist(:)); +[rowPP2,colPP2] = ind2sub(size(pwDist),maxDistIdx); +pointPair2 = [K(rowPP2),K(colPP2)]; + +if plotOn + maxDist2D_H = plot(Pts_proj_2D_shr(pointPair2,1),Pts_proj_2D_shr(pointPair2,2),'r--o'); + legend(maxDist2D_H, '2nd diagonal') end -% Get the quadrilateral vertices -quadriV = [pointPair1(1); pointPair2(1);... - pointPair1(2); pointPair2(2);... - pointPair1(1)]; +% Sort the quadrilateral vertices in counter-clockwise direction along the +% convex hull +quadriVIdx = sort([rowPP1,colPP1,rowPP2,colPP2]); +quadriV = K([quadriVIdx,quadriVIdx(1)]); + +if plotOn + maxDist2D_H = plot(projAxes, Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r--o'); + qLitVerts_H = text(projAxes, Pts_proj_2D(quadriV(1:4),1),Pts_proj_2D(quadriV(1:4),2),{'1','2','3','4'},... + 'HorizontalAlignment','right', 'FontSize',14, 'FontWeight','bold'); + legend([maxDist1D_H,maxDist2D_H], {'1st diagonal','2nd diagonal'}) +end -% Get the length of the quadri edges +% Get the length of the edges of the quadrilateral edgesLength = zeros(4,1); for i=1:4 diff1 = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); diff2 = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); edgesLength(i) = sqrt(diff1^2+diff2^2); end - [~,Imax] = max(edgesLength); -% Indices of start vertices of quadrilateral +% Index of the start vertex of the quadrilateral I_V_sup = mod(Imax+2,4); % Edge corresponding to the superior part of the bone is assumed to be the % one opposing the largest one Edge_sup = quadriV(I_V_sup:I_V_sup+1); -% Get the direction of the edge : +% Get the direction of the edge U_edge_sup = [Pts_proj_2D(Edge_sup(2),1)-Pts_proj_2D(Edge_sup(1),1);... Pts_proj_2D(Edge_sup(2),2)-Pts_proj_2D(Edge_sup(1),2)]; %Z0_proj is normal to edge direction @@ -103,17 +143,14 @@ Y0 = cross(Z0,V_all(:,1)); if plotOn - figure() - plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') - hold on - plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') - axis equal - plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-*') - plot(Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r-*') - plot(Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... - 'linewidth',2) - plot(Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... - 'linewidth',3) + qLitEdge_H = plot(projAxes, Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... + 'linewidth',2); + supEdge_H = plot(projAxes, Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... + 'linewidth',3); + legend([maxDist1D_H,maxDist2D_H,qLitEdge_H,supEdge_H],... + {'1st diagonal','2nd diagonal','Quadrilateral edges','Superior edge'}) + uistack(qLitVerts_H, 'top'); + figure(projFig) end end From bb17c33811149f8e7777bdbbca0d9d95452bc9d2 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Thu, 24 Nov 2022 22:17:16 +0100 Subject: [PATCH 10/24] Minor update of FittingFun/fitQuadriTalus.m and STAPLE_talus.m. --- .../SubFunctions/FittingFun/fitQuadriTalus.m | 29 +++++-------------- STAPLE/algorithms/STAPLE_talus.m | 25 +++++++++------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index c98770b..3da026d 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -17,12 +17,12 @@ plotOn = 0; end -%% First project the mesh on the plane perpendicular to X0 (1st inertia axis) +% First project the mesh on the plane perpendicular to X0 (1st inertia axis) Pts_inertia = (V_all'*Tr.Points')'; if plotOn - figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 (1st inertia axis)', ... - 'color','w','numbertitle','off'); + figure('color','w','numbertitle','off', ... + 'name', ['Debug Figure: ' mfilename '.m: Projection on X0 (1st inertia axis)']); axis equal tight; hold on plot3(Pts_inertia(:,1),Pts_inertia(:,2),Pts_inertia(:,3),'g.') xlabel('X'); ylabel('Y'); zlabel('Z') @@ -37,8 +37,8 @@ K = convhull(Pts_proj_2D,'simplify', false); if plotOn - projFig = figure('name', 'Debug Figure: fitQuadriTalus.m: Convex hull of the projection on X0', ... - 'color','w','numbertitle','off'); + projFig = figure('color','w','numbertitle','off', ... + 'name', ['Debug Figure: ' mfilename '.m: Convex hull of the projection on X0']); projAxes = axes(); axis equal tight; hold on plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') @@ -46,21 +46,6 @@ xlabel('Y'); ylabel('Z') end -% Find the max edge -maxDist = -1; -for i=1:length(K) - for j=1:length(K) - diff1 = Pts_proj_2D(K(j),1)-Pts_proj_2D(K(i),1); - diff2 = Pts_proj_2D(K(j),2)-Pts_proj_2D(K(i),2); - dist = sqrt(diff1^2+diff2^2); - if dist>maxDist - maxDist=dist; - pointPair1=[K(i),K(j)]; - U1=[diff1;diff2]; - end - end -end - % Find the two points of the convex hull with max. distance to each other % assuming that it is the 1st diagonal of the quadrilateral pwDist = squareform(pdist(Pts_proj_2D(K,:))); @@ -81,8 +66,8 @@ Pts_proj_2D_shr = (Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D')'; if plotOn - figure('name', 'Debug Figure: fitQuadriTalus.m: Projection on X0 shrinked along 1st diagonal', ... - 'color','w','numbertitle','off'); + figure('color','w','numbertitle','off', ... + 'name', ['Debug Figure: ' mfilename '.m: Projection on X0 shrinked along 1st diagonal']); axis equal tight; hold on plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'g.') line(Pts_proj_2D_shr(K,1),Pts_proj_2D_shr(K,2)) diff --git a/STAPLE/algorithms/STAPLE_talus.m b/STAPLE/algorithms/STAPLE_talus.m index fec1e21..ebee216 100644 --- a/STAPLE/algorithms/STAPLE_talus.m +++ b/STAPLE/algorithms/STAPLE_talus.m @@ -67,21 +67,24 @@ %% 1. Indentify the inertia axis of the Talus % Get eigen vectors V_all of the Talus 3D geometry and volumetric center -[ V_all, AuxCSInfo.CenterVol, InertiaMatrix, AuxCSInfo.D ] = TriInertiaPpties( talusTri ); +[V_all, AuxCSInfo.CenterVol, InertiaMatrix, AuxCSInfo.D] = TriInertiaPpties(talusTri); -% X0 can be seen as a initial antero-posterior or postero-anterior axis, -% the orientation of Y0 and Z0 can be inconsistent across subjects because -% the value of their Moment of inertia are quite close (~15% difference. So +% X0 can be seen as a initial anteroposterior or posteroanterior axis. The +% orientation of Y0 and Z0 can be inconsistent across subjects because the +% values of their moments of inertia are quite close (~15% difference). So % another function is used to initiliaze Z0 and Y0. It fits a quadrilateral -% on the Talus projected onto a plan perpendicular to X0, the edge -% corresponding to the superior face is identified and provide the -% inferior-superior direction intial guess (Z0). Y0 is made perpendicular -% to X0 and Z0. +% on the talus projected onto a plan perpendicular to X0. The edge +% corresponding to the superior face is identified and provides the +% inferosuperior direction intial guess (Z0). Y0 is made perpendicular to +% X0 and Z0. AuxCSInfo.X0 = V_all(:,1); [AuxCSInfo.Z0,AuxCSInfo.Y0] = fitQuadriTalus(talusTri, V_all, debug_plots); -if debug_plots == 1 - figure; quickPlotTriang(talusTri) - AuxCSInfo.Origin = AuxCSInfo.CenterVol; quickPlotRefSystem(AuxCSInfo) +if debug_plots + figure('color','w','numbertitle','off',... + 'name', ['Debug Figure: ' mfilename '.m: Initial talar bone CS from fitQuadriTalus.m']) + quickPlotTriang(talusTri) + AuxCSInfo.Origin = AuxCSInfo.CenterVol; + quickPlotRefSystem(AuxCSInfo) AuxCSInfo.Origin = []; % reset end From b9bf51aa1e781d24de5dbf5b9d6f5b6d969f7a5d Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Wed, 31 May 2023 15:36:24 +0200 Subject: [PATCH 11/24] upd file names --- STAPLE/sandbox/GIBOC_Miranda2010_femur.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m index 6389678..54fa7a2 100644 --- a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m +++ b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m @@ -1,8 +1,8 @@ -function CSs = Miranda2010_femur(Femur) +function CSs = GIBOC_Miranda2010_femur(Femur) L_ratio = 0.40; -[ U_DistToProx ] = femur_get_correct_first_CS( Femur ); +[ U_DistToProx ] = femur_guess_CS( Femur ); [ProxFem, DistFem] = cutLongBoneMesh(Femur, U_DistToProx, L_ratio); [ ~, CS.CenterVol] = TriInertiaPpties(Femur); if nargin<2 From 387f420d9bb7e066d86d65f82de73c0bc7822abd Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 5 Jun 2023 17:36:09 +0200 Subject: [PATCH 12/24] Revert "Merge remote-tracking branch 'origin/master'" This reverts commit 0a303f0b3416097fbe22c71df60a100c42181838, reversing changes made to fbd2ca8828b1f6322cb4a4e8b72ec6053cd8501d. --- README.md | 4 - .../SubFunctions/FittingFun/fitQuadriTalus.m | 134 ++++++++---------- STAPLE/algorithms/STAPLE_talus.m | 25 ++-- STAPLE/sandbox/GIBOC_Miranda2010_femur.m | 4 +- 4 files changed, 69 insertions(+), 98 deletions(-) diff --git a/README.md b/README.md index a4558fb..ceeab5c 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ [![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4428103.svg)](https://doi.org/10.5281/zenodo.4428103) ![visitors](https://visitor-badge.glitch.me/badge?page_id=modenaxe.msk-STAPLE) -### ⚠️ STAPLE is released under a [non-commercial license](#license) and it is free to use for academic purposes only. For any other use please contact the authors. - # Table of contents - [What is STAPLE?](#what-is-staple) - [What can I do with STAPLE?](#what-can-i-do-with-staple) @@ -337,11 +335,9 @@ Before informing us as suggested in [the contributing guidelines](/CONTRIBUTING. - [ ] ensure that the entire `STAPLE` folder is on your MATLAB path - [ ] if you are using one of the workflows from the examples, ensure that you are using the correct names for the bone geometries, e.g. `pelvis_no_sacrum`, `femur_r`, `tibia_r`, etc. - [ ] ensure that the quality of your bone surface geometries is sufficient for running your selected algorithm. The GIBOC algorithms, in particular, require relatively good quality surface meshes. You can have an idea of what we mean by "good mesh" consulting the table that describes the datasets provided with STAPLE. If necessary, use the filters and tools available on software like [MeshLab](https://www.meshlab.net/) to improve your dataset. -- [ ] processing the meshes so that they are triangular and contain a reasonable number of vertices (decimation can be applied) also helps with the OpenSim visualization. See [this related tweet](https://twitter.com/JohnRHutchinson/status/1455490276298997766). - [ ] if possible, try running alternative algorithms in order to establish if your bone mesh is processable in the first place or if you have encounter a proper bug in the algorithm. You can specify the processing algorithms for each bone as input to the `processTriGeomBoneSet.m` function. For bad quality meshes, we recommend using the `STAPLE` algorithm at the pelvis and `Kai2014` algorithms for femur and tibia. Keep an eye on issue #78 as we will develop an example on how to do this. - [ ] verify that processing of your dataset is not failing because of the [current limitations](#current-limitations) of the STAPLE toolbox. - ## Does STAPLE work only with OpenSim? The algorithms collected in the STAPLE toolbox were proposed in publications that did not have modelling focus, and can be applied in broader contexts, such as reference system definition for orthopaedics applications or modelling in other platforms. Similarly, the outputs of a STAPLE workflow, e.g. from `processTriGeomBoneSet.m`, include all the necessary information to create a kinematic or kinetic model in any biomechanical modelling workflow. All our modelling examples, however, rely on OpenSim. diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index 3da026d..a6676d3 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -17,103 +17,78 @@ plotOn = 0; end -% First project the mesh on the plane perpendicular to X0 (1st inertia axis) -Pts_inertia = (V_all'*Tr.Points')'; -if plotOn - figure('color','w','numbertitle','off', ... - 'name', ['Debug Figure: ' mfilename '.m: Projection on X0 (1st inertia axis)']); - axis equal tight; hold on - plot3(Pts_inertia(:,1),Pts_inertia(:,2),Pts_inertia(:,3),'g.') - xlabel('X'); ylabel('Y'); zlabel('Z') - view(90,0) -end +%% First project the mesh on the plan perpendicular to X0 (1st inertia axis) +YZ0 = [V_all(:,2),V_all(:,3)]; +PX0 = YZ0*inv(YZ0'*YZ0)*YZ0'; %Projection matrix +Pts_proj = V_all'*PX0*Tr.Points'; -% Keep only the 2nd (Y0) and 3rd (Z0) dimension -Pts_proj_2D = Pts_inertia(:,2:3); -assert(sum(sum(Pts_inertia(:,2:3)-Pts_proj_2D)) < 1e-8) +% Keep only the 2 and 3rd coordinates +Pts_proj_2D = Pts_proj(2:3,:)'; %Get the convex hull of the point cloud K = convhull(Pts_proj_2D,'simplify', false); -if plotOn - projFig = figure('color','w','numbertitle','off', ... - 'name', ['Debug Figure: ' mfilename '.m: Convex hull of the projection on X0']); - projAxes = axes(); - axis equal tight; hold on - plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') - plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') - xlabel('Y'); ylabel('Z') -end - -% Find the two points of the convex hull with max. distance to each other -% assuming that it is the 1st diagonal of the quadrilateral -pwDist = squareform(pdist(Pts_proj_2D(K,:))); -[~, maxDistIdx] = max(pwDist(:)); -[rowPP1,colPP1] = ind2sub(size(pwDist),maxDistIdx); -pointPair1 = [K(rowPP1),K(colPP1)]; -U1 = (Pts_proj_2D(pointPair1(2),:)-Pts_proj_2D(pointPair1(1),:))'; - -if plotOn - maxDist1D_H = plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-o'); - legend(maxDist1D_H, '1st diagonal') +% Find the max edge +maxDist = -1; +for i=1:length(K) + for j=1:length(K) + diff1 = Pts_proj_2D(K(j),1)-Pts_proj_2D(K(i),1); + diff2 = Pts_proj_2D(K(j),2)-Pts_proj_2D(K(i),2); + dist = sqrt(diff1^2+diff2^2); + if dist>maxDist + maxDist=dist; + pointPair1=[K(i),K(j)]; + U1=[diff1;diff2]; + end + end end % Hacky way to find the second diagonal of the quadrilateral by shrinking -% along the point cloud in the direction (U1) of the 1st diagonal found +% along the point cloud in the direction (U1) of the first found diagonal U1 = normalizeV(U1); Ru = [U1(1),-U1(2);U1(2),U1(1)]; -Pts_proj_2D_shr = (Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D')'; - -if plotOn - figure('color','w','numbertitle','off', ... - 'name', ['Debug Figure: ' mfilename '.m: Projection on X0 shrinked along 1st diagonal']); - axis equal tight; hold on - plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'g.') - line(Pts_proj_2D_shr(K,1),Pts_proj_2D_shr(K,2)) - xlabel('Y'); ylabel('Z') -end - -% Find the two points of the convex hull with max. distance to each other -% assuming that it is the 2nd diagonal of the quadrilateral -pwDist = squareform(pdist(Pts_proj_2D_shr(K,:))); -[~, maxDistIdx] = max(pwDist(:)); -[rowPP2,colPP2] = ind2sub(size(pwDist),maxDistIdx); -pointPair2 = [K(rowPP2),K(colPP2)]; - -if plotOn - maxDist2D_H = plot(Pts_proj_2D_shr(pointPair2,1),Pts_proj_2D_shr(pointPair2,2),'r--o'); - legend(maxDist2D_H, '2nd diagonal') +Pts_proj_2D_shr = transpose(Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D'); +% plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'b.') + + +% Find the max edge on the shrink points cloud +maxDist = -1; +for i=1:length(K) + for j=1:length(K) + diff1 = Pts_proj_2D_shr(K(j),1)-Pts_proj_2D_shr(K(i),1); + diff2 = Pts_proj_2D_shr(K(j),2)-Pts_proj_2D_shr(K(i),2); + dist = sqrt(diff1^2+diff2^2); + if dist>maxDist + maxDist=dist; + pointPair2=[K(i),K(j)]; + U2=[diff1;diff2]; + end + end end -% Sort the quadrilateral vertices in counter-clockwise direction along the -% convex hull -quadriVIdx = sort([rowPP1,colPP1,rowPP2,colPP2]); -quadriV = K([quadriVIdx,quadriVIdx(1)]); +% Get the quadrilateral vertices +quadriV = [pointPair1(1); pointPair2(1);... + pointPair1(2); pointPair2(2);... + pointPair1(1)]; -if plotOn - maxDist2D_H = plot(projAxes, Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r--o'); - qLitVerts_H = text(projAxes, Pts_proj_2D(quadriV(1:4),1),Pts_proj_2D(quadriV(1:4),2),{'1','2','3','4'},... - 'HorizontalAlignment','right', 'FontSize',14, 'FontWeight','bold'); - legend([maxDist1D_H,maxDist2D_H], {'1st diagonal','2nd diagonal'}) -end - -% Get the length of the edges of the quadrilateral +% Get the length of the quadri edges edgesLength = zeros(4,1); for i=1:4 diff1 = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); diff2 = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); edgesLength(i) = sqrt(diff1^2+diff2^2); end + [~,Imax] = max(edgesLength); -% Index of the start vertex of the quadrilateral +% Indices of start vertices of quadrilateral I_V_sup = mod(Imax+2,4); % Edge corresponding to the superior part of the bone is assumed to be the % one opposing the largest one Edge_sup = quadriV(I_V_sup:I_V_sup+1); -% Get the direction of the edge +% Get the direction of the edge : U_edge_sup = [Pts_proj_2D(Edge_sup(2),1)-Pts_proj_2D(Edge_sup(1),1);... Pts_proj_2D(Edge_sup(2),2)-Pts_proj_2D(Edge_sup(1),2)]; %Z0_proj is normal to edge direction @@ -128,14 +103,17 @@ Y0 = cross(Z0,V_all(:,1)); if plotOn - qLitEdge_H = plot(projAxes, Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... - 'linewidth',2); - supEdge_H = plot(projAxes, Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... - 'linewidth',3); - legend([maxDist1D_H,maxDist2D_H,qLitEdge_H,supEdge_H],... - {'1st diagonal','2nd diagonal','Quadrilateral edges','Superior edge'}) - uistack(qLitVerts_H, 'top'); - figure(projFig) + figure() + plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') + hold on + plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') + axis equal + plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-*') + plot(Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r-*') + plot(Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... + 'linewidth',2) + plot(Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... + 'linewidth',3) end end diff --git a/STAPLE/algorithms/STAPLE_talus.m b/STAPLE/algorithms/STAPLE_talus.m index ebee216..fec1e21 100644 --- a/STAPLE/algorithms/STAPLE_talus.m +++ b/STAPLE/algorithms/STAPLE_talus.m @@ -67,24 +67,21 @@ %% 1. Indentify the inertia axis of the Talus % Get eigen vectors V_all of the Talus 3D geometry and volumetric center -[V_all, AuxCSInfo.CenterVol, InertiaMatrix, AuxCSInfo.D] = TriInertiaPpties(talusTri); +[ V_all, AuxCSInfo.CenterVol, InertiaMatrix, AuxCSInfo.D ] = TriInertiaPpties( talusTri ); -% X0 can be seen as a initial anteroposterior or posteroanterior axis. The -% orientation of Y0 and Z0 can be inconsistent across subjects because the -% values of their moments of inertia are quite close (~15% difference). So +% X0 can be seen as a initial antero-posterior or postero-anterior axis, +% the orientation of Y0 and Z0 can be inconsistent across subjects because +% the value of their Moment of inertia are quite close (~15% difference. So % another function is used to initiliaze Z0 and Y0. It fits a quadrilateral -% on the talus projected onto a plan perpendicular to X0. The edge -% corresponding to the superior face is identified and provides the -% inferosuperior direction intial guess (Z0). Y0 is made perpendicular to -% X0 and Z0. +% on the Talus projected onto a plan perpendicular to X0, the edge +% corresponding to the superior face is identified and provide the +% inferior-superior direction intial guess (Z0). Y0 is made perpendicular +% to X0 and Z0. AuxCSInfo.X0 = V_all(:,1); [AuxCSInfo.Z0,AuxCSInfo.Y0] = fitQuadriTalus(talusTri, V_all, debug_plots); -if debug_plots - figure('color','w','numbertitle','off',... - 'name', ['Debug Figure: ' mfilename '.m: Initial talar bone CS from fitQuadriTalus.m']) - quickPlotTriang(talusTri) - AuxCSInfo.Origin = AuxCSInfo.CenterVol; - quickPlotRefSystem(AuxCSInfo) +if debug_plots == 1 + figure; quickPlotTriang(talusTri) + AuxCSInfo.Origin = AuxCSInfo.CenterVol; quickPlotRefSystem(AuxCSInfo) AuxCSInfo.Origin = []; % reset end diff --git a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m index 54fa7a2..6389678 100644 --- a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m +++ b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m @@ -1,8 +1,8 @@ -function CSs = GIBOC_Miranda2010_femur(Femur) +function CSs = Miranda2010_femur(Femur) L_ratio = 0.40; -[ U_DistToProx ] = femur_guess_CS( Femur ); +[ U_DistToProx ] = femur_get_correct_first_CS( Femur ); [ProxFem, DistFem] = cutLongBoneMesh(Femur, U_DistToProx, L_ratio); [ ~, CS.CenterVol] = TriInertiaPpties(Femur); if nargin<2 From 0d7ba08fa222af5f6d254e12bf44e4e1e44725f8 Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 5 Jun 2023 17:38:44 +0200 Subject: [PATCH 13/24] Revert "Revert "Merge remote-tracking branch 'origin/master'"" This reverts commit 387f420d9bb7e066d86d65f82de73c0bc7822abd. --- README.md | 4 + .../SubFunctions/FittingFun/fitQuadriTalus.m | 134 ++++++++++-------- STAPLE/algorithms/STAPLE_talus.m | 25 ++-- STAPLE/sandbox/GIBOC_Miranda2010_femur.m | 4 +- 4 files changed, 98 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index ceeab5c..a4558fb 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![License: CC BY-NC 4.0](https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-nc/4.0/) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4428103.svg)](https://doi.org/10.5281/zenodo.4428103) ![visitors](https://visitor-badge.glitch.me/badge?page_id=modenaxe.msk-STAPLE) +### ⚠️ STAPLE is released under a [non-commercial license](#license) and it is free to use for academic purposes only. For any other use please contact the authors. + # Table of contents - [What is STAPLE?](#what-is-staple) - [What can I do with STAPLE?](#what-can-i-do-with-staple) @@ -335,9 +337,11 @@ Before informing us as suggested in [the contributing guidelines](/CONTRIBUTING. - [ ] ensure that the entire `STAPLE` folder is on your MATLAB path - [ ] if you are using one of the workflows from the examples, ensure that you are using the correct names for the bone geometries, e.g. `pelvis_no_sacrum`, `femur_r`, `tibia_r`, etc. - [ ] ensure that the quality of your bone surface geometries is sufficient for running your selected algorithm. The GIBOC algorithms, in particular, require relatively good quality surface meshes. You can have an idea of what we mean by "good mesh" consulting the table that describes the datasets provided with STAPLE. If necessary, use the filters and tools available on software like [MeshLab](https://www.meshlab.net/) to improve your dataset. +- [ ] processing the meshes so that they are triangular and contain a reasonable number of vertices (decimation can be applied) also helps with the OpenSim visualization. See [this related tweet](https://twitter.com/JohnRHutchinson/status/1455490276298997766). - [ ] if possible, try running alternative algorithms in order to establish if your bone mesh is processable in the first place or if you have encounter a proper bug in the algorithm. You can specify the processing algorithms for each bone as input to the `processTriGeomBoneSet.m` function. For bad quality meshes, we recommend using the `STAPLE` algorithm at the pelvis and `Kai2014` algorithms for femur and tibia. Keep an eye on issue #78 as we will develop an example on how to do this. - [ ] verify that processing of your dataset is not failing because of the [current limitations](#current-limitations) of the STAPLE toolbox. + ## Does STAPLE work only with OpenSim? The algorithms collected in the STAPLE toolbox were proposed in publications that did not have modelling focus, and can be applied in broader contexts, such as reference system definition for orthopaedics applications or modelling in other platforms. Similarly, the outputs of a STAPLE workflow, e.g. from `processTriGeomBoneSet.m`, include all the necessary information to create a kinematic or kinetic model in any biomechanical modelling workflow. All our modelling examples, however, rely on OpenSim. diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index a6676d3..3da026d 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -17,78 +17,103 @@ plotOn = 0; end +% First project the mesh on the plane perpendicular to X0 (1st inertia axis) +Pts_inertia = (V_all'*Tr.Points')'; -%% First project the mesh on the plan perpendicular to X0 (1st inertia axis) -YZ0 = [V_all(:,2),V_all(:,3)]; -PX0 = YZ0*inv(YZ0'*YZ0)*YZ0'; %Projection matrix -Pts_proj = V_all'*PX0*Tr.Points'; +if plotOn + figure('color','w','numbertitle','off', ... + 'name', ['Debug Figure: ' mfilename '.m: Projection on X0 (1st inertia axis)']); + axis equal tight; hold on + plot3(Pts_inertia(:,1),Pts_inertia(:,2),Pts_inertia(:,3),'g.') + xlabel('X'); ylabel('Y'); zlabel('Z') + view(90,0) +end -% Keep only the 2 and 3rd coordinates -Pts_proj_2D = Pts_proj(2:3,:)'; +% Keep only the 2nd (Y0) and 3rd (Z0) dimension +Pts_proj_2D = Pts_inertia(:,2:3); +assert(sum(sum(Pts_inertia(:,2:3)-Pts_proj_2D)) < 1e-8) %Get the convex hull of the point cloud K = convhull(Pts_proj_2D,'simplify', false); -% Find the max edge -maxDist = -1; -for i=1:length(K) - for j=1:length(K) - diff1 = Pts_proj_2D(K(j),1)-Pts_proj_2D(K(i),1); - diff2 = Pts_proj_2D(K(j),2)-Pts_proj_2D(K(i),2); - dist = sqrt(diff1^2+diff2^2); - if dist>maxDist - maxDist=dist; - pointPair1=[K(i),K(j)]; - U1=[diff1;diff2]; - end - end +if plotOn + projFig = figure('color','w','numbertitle','off', ... + 'name', ['Debug Figure: ' mfilename '.m: Convex hull of the projection on X0']); + projAxes = axes(); + axis equal tight; hold on + plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') + plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') + xlabel('Y'); ylabel('Z') +end + +% Find the two points of the convex hull with max. distance to each other +% assuming that it is the 1st diagonal of the quadrilateral +pwDist = squareform(pdist(Pts_proj_2D(K,:))); +[~, maxDistIdx] = max(pwDist(:)); +[rowPP1,colPP1] = ind2sub(size(pwDist),maxDistIdx); +pointPair1 = [K(rowPP1),K(colPP1)]; +U1 = (Pts_proj_2D(pointPair1(2),:)-Pts_proj_2D(pointPair1(1),:))'; + +if plotOn + maxDist1D_H = plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-o'); + legend(maxDist1D_H, '1st diagonal') end % Hacky way to find the second diagonal of the quadrilateral by shrinking -% along the point cloud in the direction (U1) of the first found diagonal +% along the point cloud in the direction (U1) of the 1st diagonal found U1 = normalizeV(U1); Ru = [U1(1),-U1(2);U1(2),U1(1)]; -Pts_proj_2D_shr = transpose(Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D'); -% plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'b.') - - -% Find the max edge on the shrink points cloud -maxDist = -1; -for i=1:length(K) - for j=1:length(K) - diff1 = Pts_proj_2D_shr(K(j),1)-Pts_proj_2D_shr(K(i),1); - diff2 = Pts_proj_2D_shr(K(j),2)-Pts_proj_2D_shr(K(i),2); - dist = sqrt(diff1^2+diff2^2); - if dist>maxDist - maxDist=dist; - pointPair2=[K(i),K(j)]; - U2=[diff1;diff2]; - end - end +Pts_proj_2D_shr = (Ru*[0.5,0;0,1]*Ru'*Pts_proj_2D')'; + +if plotOn + figure('color','w','numbertitle','off', ... + 'name', ['Debug Figure: ' mfilename '.m: Projection on X0 shrinked along 1st diagonal']); + axis equal tight; hold on + plot(Pts_proj_2D_shr(:,1),Pts_proj_2D_shr(:,2),'g.') + line(Pts_proj_2D_shr(K,1),Pts_proj_2D_shr(K,2)) + xlabel('Y'); ylabel('Z') +end + +% Find the two points of the convex hull with max. distance to each other +% assuming that it is the 2nd diagonal of the quadrilateral +pwDist = squareform(pdist(Pts_proj_2D_shr(K,:))); +[~, maxDistIdx] = max(pwDist(:)); +[rowPP2,colPP2] = ind2sub(size(pwDist),maxDistIdx); +pointPair2 = [K(rowPP2),K(colPP2)]; + +if plotOn + maxDist2D_H = plot(Pts_proj_2D_shr(pointPair2,1),Pts_proj_2D_shr(pointPair2,2),'r--o'); + legend(maxDist2D_H, '2nd diagonal') end -% Get the quadrilateral vertices -quadriV = [pointPair1(1); pointPair2(1);... - pointPair1(2); pointPair2(2);... - pointPair1(1)]; +% Sort the quadrilateral vertices in counter-clockwise direction along the +% convex hull +quadriVIdx = sort([rowPP1,colPP1,rowPP2,colPP2]); +quadriV = K([quadriVIdx,quadriVIdx(1)]); -% Get the length of the quadri edges +if plotOn + maxDist2D_H = plot(projAxes, Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r--o'); + qLitVerts_H = text(projAxes, Pts_proj_2D(quadriV(1:4),1),Pts_proj_2D(quadriV(1:4),2),{'1','2','3','4'},... + 'HorizontalAlignment','right', 'FontSize',14, 'FontWeight','bold'); + legend([maxDist1D_H,maxDist2D_H], {'1st diagonal','2nd diagonal'}) +end + +% Get the length of the edges of the quadrilateral edgesLength = zeros(4,1); for i=1:4 diff1 = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); diff2 = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); edgesLength(i) = sqrt(diff1^2+diff2^2); end - [~,Imax] = max(edgesLength); -% Indices of start vertices of quadrilateral +% Index of the start vertex of the quadrilateral I_V_sup = mod(Imax+2,4); % Edge corresponding to the superior part of the bone is assumed to be the % one opposing the largest one Edge_sup = quadriV(I_V_sup:I_V_sup+1); -% Get the direction of the edge : +% Get the direction of the edge U_edge_sup = [Pts_proj_2D(Edge_sup(2),1)-Pts_proj_2D(Edge_sup(1),1);... Pts_proj_2D(Edge_sup(2),2)-Pts_proj_2D(Edge_sup(1),2)]; %Z0_proj is normal to edge direction @@ -103,17 +128,14 @@ Y0 = cross(Z0,V_all(:,1)); if plotOn - figure() - plot(Pts_proj_2D(:,1),Pts_proj_2D(:,2),'b.') - hold on - plot(Pts_proj_2D(K,1),Pts_proj_2D(K,2),'k-') - axis equal - plot(Pts_proj_2D(pointPair1,1),Pts_proj_2D(pointPair1,2),'r-*') - plot(Pts_proj_2D(pointPair2,1),Pts_proj_2D(pointPair2,2),'r-*') - plot(Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... - 'linewidth',2) - plot(Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... - 'linewidth',3) + qLitEdge_H = plot(projAxes, Pts_proj_2D(quadriV,1),Pts_proj_2D(quadriV,2),'g-s',... + 'linewidth',2); + supEdge_H = plot(projAxes, Pts_proj_2D(Edge_sup,1),Pts_proj_2D(Edge_sup,2),'m-o',... + 'linewidth',3); + legend([maxDist1D_H,maxDist2D_H,qLitEdge_H,supEdge_H],... + {'1st diagonal','2nd diagonal','Quadrilateral edges','Superior edge'}) + uistack(qLitVerts_H, 'top'); + figure(projFig) end end diff --git a/STAPLE/algorithms/STAPLE_talus.m b/STAPLE/algorithms/STAPLE_talus.m index fec1e21..ebee216 100644 --- a/STAPLE/algorithms/STAPLE_talus.m +++ b/STAPLE/algorithms/STAPLE_talus.m @@ -67,21 +67,24 @@ %% 1. Indentify the inertia axis of the Talus % Get eigen vectors V_all of the Talus 3D geometry and volumetric center -[ V_all, AuxCSInfo.CenterVol, InertiaMatrix, AuxCSInfo.D ] = TriInertiaPpties( talusTri ); +[V_all, AuxCSInfo.CenterVol, InertiaMatrix, AuxCSInfo.D] = TriInertiaPpties(talusTri); -% X0 can be seen as a initial antero-posterior or postero-anterior axis, -% the orientation of Y0 and Z0 can be inconsistent across subjects because -% the value of their Moment of inertia are quite close (~15% difference. So +% X0 can be seen as a initial anteroposterior or posteroanterior axis. The +% orientation of Y0 and Z0 can be inconsistent across subjects because the +% values of their moments of inertia are quite close (~15% difference). So % another function is used to initiliaze Z0 and Y0. It fits a quadrilateral -% on the Talus projected onto a plan perpendicular to X0, the edge -% corresponding to the superior face is identified and provide the -% inferior-superior direction intial guess (Z0). Y0 is made perpendicular -% to X0 and Z0. +% on the talus projected onto a plan perpendicular to X0. The edge +% corresponding to the superior face is identified and provides the +% inferosuperior direction intial guess (Z0). Y0 is made perpendicular to +% X0 and Z0. AuxCSInfo.X0 = V_all(:,1); [AuxCSInfo.Z0,AuxCSInfo.Y0] = fitQuadriTalus(talusTri, V_all, debug_plots); -if debug_plots == 1 - figure; quickPlotTriang(talusTri) - AuxCSInfo.Origin = AuxCSInfo.CenterVol; quickPlotRefSystem(AuxCSInfo) +if debug_plots + figure('color','w','numbertitle','off',... + 'name', ['Debug Figure: ' mfilename '.m: Initial talar bone CS from fitQuadriTalus.m']) + quickPlotTriang(talusTri) + AuxCSInfo.Origin = AuxCSInfo.CenterVol; + quickPlotRefSystem(AuxCSInfo) AuxCSInfo.Origin = []; % reset end diff --git a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m index 6389678..54fa7a2 100644 --- a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m +++ b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m @@ -1,8 +1,8 @@ -function CSs = Miranda2010_femur(Femur) +function CSs = GIBOC_Miranda2010_femur(Femur) L_ratio = 0.40; -[ U_DistToProx ] = femur_get_correct_first_CS( Femur ); +[ U_DistToProx ] = femur_guess_CS( Femur ); [ProxFem, DistFem] = cutLongBoneMesh(Femur, U_DistToProx, L_ratio); [ ~, CS.CenterVol] = TriInertiaPpties(Femur); if nargin<2 From 97f5b8a5d81b131a8fefe22f7a2126dcb11db2da Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 5 Jun 2023 18:37:01 +0200 Subject: [PATCH 14/24] fix misspell --- STAPLE/algorithms/Kai2014_pelvis.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STAPLE/algorithms/Kai2014_pelvis.m b/STAPLE/algorithms/Kai2014_pelvis.m index 9df0ff3..552d8a7 100644 --- a/STAPLE/algorithms/Kai2014_pelvis.m +++ b/STAPLE/algorithms/Kai2014_pelvis.m @@ -8,7 +8,7 @@ % 1. the original implementation includes the sacrum, here excluded because % difficult to segment from MRI scans. % 2. the original publication defines the pelvis reference system -% differently from the reccomendations of the International Society of +% differently from the recommendations of the International Society of % Biomechanics. % 3. The robustness of the Kai2014 algorithm with respect to different % global reference systems is ensured, in our experience, only through the From 4027b2fb6ede5c9497a964746fba8edbf4d6d76e Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 5 Jun 2023 18:38:30 +0200 Subject: [PATCH 15/24] debug plots for pat groove --- STAPLE/algorithms/GIBOC_femur.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/STAPLE/algorithms/GIBOC_femur.m b/STAPLE/algorithms/GIBOC_femur.m index ee6bd93..ca95a26 100644 --- a/STAPLE/algorithms/GIBOC_femur.m +++ b/STAPLE/algorithms/GIBOC_femur.m @@ -154,7 +154,7 @@ [postCondyle_Med_Tri, postCondyle_Lat_Tri, AuxCSInfo] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'post_condyles', debug_plots); % extract patellar grooves -[patGroove_Med_Tri, patGroove_Lat_Tri, CS] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'pat_groove'); +[patGroove_Med_Tri, patGroove_Lat_Tri, CS] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'pat_groove', debug_plots); % exporting articular surfaces (more triangulations can be easily added % commenting out the parts of interest @@ -263,7 +263,7 @@ disp('Done.'); % plot patellar fitting as well -if debug_plots +% if debug_plots CS = AuxCSInfo.(patellofemoral_name); plotTriangLight(DistFemTri, BCS, 1); hold on quickPlotTriang(patGroove_Lat_Tri, 'b') @@ -273,6 +273,6 @@ plotCylinder((CS.patgroove_center_lat-CS.patgroove_center_med)', 3, (CS.patgroove_center_lat+CS.patgroove_center_med)/2,... 3.4*norm(CS.patgroove_center_lat-CS.patgroove_center_med), 1, 'k'); title('Patellar Groove Fitting'); -end +% end end From fbe8dfaa4c662e7ff6b5f5458975bf8b59e854e2 Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 5 Jun 2023 18:41:25 +0200 Subject: [PATCH 16/24] add debug_plot --- .../GeometricFun/PtsOnCondylesFemur.m | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/STAPLE/GIBOC-core/SubFunctions/GeometricFun/PtsOnCondylesFemur.m b/STAPLE/GIBOC-core/SubFunctions/GeometricFun/PtsOnCondylesFemur.m index a28554c..a739993 100644 --- a/STAPLE/GIBOC-core/SubFunctions/GeometricFun/PtsOnCondylesFemur.m +++ b/STAPLE/GIBOC-core/SubFunctions/GeometricFun/PtsOnCondylesFemur.m @@ -75,21 +75,24 @@ new_ver_line = R*ver_line; new_horz_line = R*horz_line; -% figure() -% plot(Pts_Epiphysis(:,3),Pts_Epiphysis(:,1),'g.') -% hold on -% axis equal -% % plot(Pts_Epiphysis(OUT_Elps,3),Pts_Epiphysis(OUT_Elps,1),'c*') -% plot( rotated_ellipse(:,1),rotated_ellipse(:,2),'r' ); -% plot(Pts_Epiphysis(I_kept,3),Pts_Epiphysis(I_kept,1),'rs') -% plot( new_ver_line(1,:),new_ver_line(2,:),'r' ); -% plot( new_horz_line(1,:),new_horz_line(2,:),'r' ); -% quiver(Elps.X0_in,Elps.Y0_in,50*cos(-Elps.phi),50*sin(-Elps.phi)); -% quiver(Elps.X0_in,Elps.Y0_in,50*sin(Elps.phi),50*cos(Elps.phi)); -% plot(mean(Pts_Epiphysis(:,3)),mean(Pts_Epiphysis(:,1)),'ks') -% plot(Pts_Epiphysis(I,3),Pts_Epiphysis(I,1),'ks') -% plot(PtsCondyle_0(K,3),PtsCondyle_0(K,1),'k-') -% plot(PtsCondyle_0(:,3),PtsCondyle_0(:,1),'kd') -% plot(PtsCondyle_0(:,3),PtsCondyle_0(:,1),'k*') +debug_plots = 0; +if debug_plots + figure() + plot(Pts_Epiphysis(:,3),Pts_Epiphysis(:,1),'g.') + hold on + axis equal + % plot(Pts_Epiphysis(OUT_Elps,3),Pts_Epiphysis(OUT_Elps,1),'c*') + plot( rotated_ellipse(:,1),rotated_ellipse(:,2),'r' ); + plot(Pts_Epiphysis(I_kept,3),Pts_Epiphysis(I_kept,1),'rs') + plot( new_ver_line(1,:),new_ver_line(2,:),'r' ); + plot( new_horz_line(1,:),new_horz_line(2,:),'r' ); + quiver(Elps.X0_in,Elps.Y0_in,50*cos(-Elps.phi),50*sin(-Elps.phi)); + quiver(Elps.X0_in,Elps.Y0_in,50*sin(Elps.phi),50*cos(Elps.phi)); + plot(mean(Pts_Epiphysis(:,3)),mean(Pts_Epiphysis(:,1)),'ks') + plot(Pts_Epiphysis(I,3),Pts_Epiphysis(I,1),'ks') + plot(PtsCondyle_0(K,3),PtsCondyle_0(K,1),'k-') + plot(PtsCondyle_0(:,3),PtsCondyle_0(:,1),'kd') + plot(PtsCondyle_0(:,3),PtsCondyle_0(:,1),'k*') +end end From d522374a5055d9930a26693ef2fbc33e4ad00156 Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Mon, 5 Jun 2023 20:23:59 +0200 Subject: [PATCH 17/24] fix git mess --- STAPLE/algorithms/GIBOC_femur.m | 36 +++++++++---------------- STAPLE/geometry/processTriGeomBoneSet.m | 36 +++++++++++-------------- 2 files changed, 28 insertions(+), 44 deletions(-) diff --git a/STAPLE/algorithms/GIBOC_femur.m b/STAPLE/algorithms/GIBOC_femur.m index ca95a26..764e3a1 100644 --- a/STAPLE/algorithms/GIBOC_femur.m +++ b/STAPLE/algorithms/GIBOC_femur.m @@ -153,9 +153,6 @@ % on long convexhull edges extremities [postCondyle_Med_Tri, postCondyle_Lat_Tri, AuxCSInfo] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'post_condyles', debug_plots); -% extract patellar grooves -[patGroove_Med_Tri, patGroove_Lat_Tri, CS] = GIBOC_femur_ArticSurf(EpiFemTri, AuxCSInfo, CoeffMorpho, 'pat_groove', debug_plots); - % exporting articular surfaces (more triangulations can be easily added % commenting out the parts of interest if nargout>3 @@ -165,9 +162,13 @@ ArtSurf.(['lat_cond_', side_raw]) = fullCondyle_Lat_Tri; ArtSurf.(['dist_femur_', side_raw])= DistFemTri; ArtSurf.(['condyles_', side_raw]) = TriUnite(fullCondyle_Med_Tri, fullCondyle_Lat_Tri); - ArtSurf.(['pat_groove', side_raw]) = TriUnite(patGroove_Med_Tri, patGroove_Lat_Tri); end +% extract patellar grooves +% [Groove_Med, Groove_Lat, CS] = GIBOC_femur_ArticSurf(EpiFem, CS, CoeffMorpho, 'pat_groove'); +% Fit two spheres to patellar groove +% CS = CS_femur_SpheresOnPatellarGroove(Groove_Lat, Groove_Med, CS); + % how to compute the joint axes disp(['Fitting femoral distal articular surfaces using ', fit_method, ' method...']) switch fit_method @@ -194,14 +195,6 @@ knee_name = joint_name_list{~strncmp(joint_name_list, 'hip', 3)}; side_low = hip_name(end); -% Fit two spheres to patellar groove !DO NOT MOVE ABOVE knee_name! -patellofemoral_name = ['patellofemoral_', side_low]; -% !DO NOT MOVE ABOVE knee_name! -[AuxCSInfo.(patellofemoral_name), JCS_ptf] = CS_femur_SpheresOnPatellarGroove(patGroove_Lat_Tri, patGroove_Med_Tri, CS, side_raw); - -% add patellofemoral JCF field -JCS.(patellofemoral_name) = JCS_ptf.(patellofemoral_name); - % define segment ref system BCS.CenterVol = CenterVol; BCS.Origin = AuxCSInfo.CenterFH_Renault'; %[origin must be 3x1] @@ -262,17 +255,12 @@ % final printout disp('Done.'); -% plot patellar fitting as well -% if debug_plots - CS = AuxCSInfo.(patellofemoral_name); - plotTriangLight(DistFemTri, BCS, 1); hold on - quickPlotTriang(patGroove_Lat_Tri, 'b') - quickPlotTriang(patGroove_Med_Tri, 'r') - plotSphere(CS.patgroove_center_med,CS.patgroove_radius_med, 'r', alpha); - plotSphere(CS.patgroove_center_lat,CS.patgroove_radius_lat, 'b', alpha); - plotCylinder((CS.patgroove_center_lat-CS.patgroove_center_med)', 3, (CS.patgroove_center_lat+CS.patgroove_center_med)/2,... - 3.4*norm(CS.patgroove_center_lat-CS.patgroove_center_med), 1, 'k'); - title('Patellar Groove Fitting'); -% end +% % plot patellar fitting as well +% PlotTriangLight(DistFem, CS, 1); hold on +% quickPlotTriang(Groove_Lat, 'b') +% quickPlotTriang(Groove_Med, 'r') +% plotSphere(CS.patgroove_center_med,CS.patgroove_radius_med, 'r', alpha); +% plotSphere(CS.patgroove_center_lat,CS.patgroove_radius_lat, 'b', alpha); + end diff --git a/STAPLE/geometry/processTriGeomBoneSet.m b/STAPLE/geometry/processTriGeomBoneSet.m index 5f75de1..2fef91b 100644 --- a/STAPLE/geometry/processTriGeomBoneSet.m +++ b/STAPLE/geometry/processTriGeomBoneSet.m @@ -33,8 +33,6 @@ % % algo_tibia - the algorithm selected to process the tibial geometry. % -% algo_patella - the algorithm selected to process the patellar geometry. -% % result_plots - enable plots of final fittings and reference systems. % Value: 1 (default) or 0. % @@ -77,7 +75,7 @@ % so that all params that has been processed here are immediately available %-------------------------------------------------------------------------- -function [JCS, BL, BCS] = processTriGeomBoneSet(triGeomBoneSet, side_raw, algo_pelvis, algo_femur, algo_tibia, algo_patella, result_plots, debug_plots, in_mm) +function [JCS, BL, BCS] = processTriGeomBoneSet(triGeomBoneSet, side_raw, algo_pelvis, algo_femur, algo_tibia, result_plots, debug_plots, in_mm) % setting defaults if nargin<2 @@ -86,20 +84,18 @@ % get sign correspondent to body side [~, side] = bodySide2Sign(side_raw); end -if nargin<3; algo_pelvis = 'STAPLE'; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; algo_patella = 'GIBOC-ACS'; in_mm = 1; end -if nargin<4; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; algo_patella = 'GIBOC-ACS'; in_mm = 1; end -if nargin<5; algo_tibia = 'Kai2014'; algo_patella = 'GIBOC-ACS'; in_mm = 1; end -if nargin<6; algo_patella = 'GIBOC-ACS'; in_mm = 1; end -if nargin<7; result_plots = 1; end -if nargin<8; debug_plots = 0; end -if nargin<9; in_mm = 1; end +if nargin<3; algo_pelvis = 'STAPLE'; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; in_mm = 1; end +if nargin<4; algo_femur = 'GIBOC-cylinder'; algo_tibia = 'Kai2014'; in_mm = 1; end +if nargin<5; algo_tibia = 'Kai2014'; in_mm = 1; end +if nargin<6; result_plots = 1; end +if nargin<7; debug_plots = 0; end +if nargin<8; in_mm = 1; end % deal with empty inputs (can be used to specify algo_tibia but use default % pelvis, for example. -if isempty(algo_pelvis ); algo_pelvis = 'STAPLE'; end -if isempty(algo_femur ); algo_femur = 'GIBOC-cylinder'; end -if isempty(algo_patella); algo_patella = 'GIBOC-ACS'; end -if isempty(algo_tibia ); algo_tibia = 'Kai2014'; end +if isempty(algo_pelvis); algo_pelvis = 'STAPLE'; end +if isempty(algo_femur ); algo_femur = 'GIBOC-cylinder'; end +if isempty(algo_tibia ); algo_tibia = 'Kai2014'; end % names of the segments @@ -196,15 +192,15 @@ %---- PATELLA ----- if isfield(triGeomBoneSet, patella_name) - switch algo_patella + switch method_patella case 'Rainbow' [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = Rainbow2013_buildpACS(); - case 'GIBOC-ridge-volume' - [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), side, 'volume-ridge'); - case 'GIBOC-ridge-line' - [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), side, 'ridge-line'); + case 'GIBOC-vol-ridge' + [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), 'volume-ridge'); + case 'GIBOC-ridge' + [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), 'ridge-line'); case 'GIBOC-ACS' - [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), side, 'artic-surf'); + [BCS.(patella_name), JCS.(patella_name), BL.(patella_name)] = GIBOC_patella(triGeomBoneSet.(patella_name), 'artic-surf'); otherwise % error('choose coorect patellar algorithm'); end From 3700e7124403be9f5ef51357ca9375a91139c3a6 Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Tue, 6 Jun 2023 01:09:19 +0200 Subject: [PATCH 18/24] rm unused --- STAPLE/sandbox/GIBOC_Miranda2010_femur.m | 224 ----------------------- 1 file changed, 224 deletions(-) delete mode 100644 STAPLE/sandbox/GIBOC_Miranda2010_femur.m diff --git a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m b/STAPLE/sandbox/GIBOC_Miranda2010_femur.m deleted file mode 100644 index 54fa7a2..0000000 --- a/STAPLE/sandbox/GIBOC_Miranda2010_femur.m +++ /dev/null @@ -1,224 +0,0 @@ -function CSs = GIBOC_Miranda2010_femur(Femur) - - -L_ratio = 0.40; -[ U_DistToProx ] = femur_guess_CS( Femur ); -[ProxFem, DistFem] = cutLongBoneMesh(Femur, U_DistToProx, L_ratio); -[ ~, CS.CenterVol] = TriInertiaPpties(Femur); -if nargin<2 - pname = '.'; - fm = 'temp_fem.iv'; -end - -% TODO: double check against manuscript -% https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2866785/ - -%% Compute the femur diaphysis axis -[V_all, Center0] = TriInertiaPpties( DistFem ); - -% inertial axis from the distal femur triangulation -Z0 = V_all(:,1); -X0 = V_all(:,3); -Y0 = V_all(:,2); - -% in slicing the Z0 normal needs to be inverted from GIBOK [LM] -coeff = -1; - -% slicing femur along the "long" dimension - -% TODO: This should be every mm, not on 200 points -disp('Slicing femur for Miranda et al. 2010 method....') -Alt = linspace( min(DistFem.Points*Z0)+0.1 ,max(DistFem.Points*Z0)-0.1, 200); -Area=[]; -for d = Alt - [ Curves , Area(end+1), ~ ] = TriPlanIntersect(DistFem, coeff*Z0 , d ); -end -disp('DONE') - -% compare with Fig 3 of Miranda publication. -% bar(Area) - -% debug plot -quickPlotTriang(DistFem, 'r', 1) - - -% first location: maximum area -[maxArea,ImaxArea] = max(Area); -Loc1 = Alt(ImaxArea); - -% second location: 1/2 maximum area (after the first location) -AreasPastMax=Area(ImaxArea:end); -[~,Id] = min(abs(maxArea/2-AreasPastMax)); -% Original code had a bug here -missed -1 - [LM] -Loc2 = Alt(ImaxArea+Id-1); - -% idenfication of diaphysis -% TODO: should be Alt(0) -dd = Loc2 - min(Alt); - -% Different from Miranda: instead of finding a point and using a plane, -% points are identify above and below the threshold. -ElmtsDia = find(DistFem.incenter*Z0>(min(Alt) + 1.3*dd)); -ElmtsEpi = find(DistFem.incenter*Z0<(min(Alt) + 1.3*dd)); - -% create diaphysis triangulation -DiaFem = TriReduceMesh( DistFem, ElmtsDia ); -DiaFem = TriFillPlanarHoles(DiaFem); - -% get inertial properties from diaphysis -[V_DiaFem, DiaFem_Center] = TriInertiaPpties( DiaFem ); -Zdia = V_DiaFem(:,1); - -% create distal epiphysis triangulation -EpiFem = TriReduceMesh( DistFem, ElmtsEpi ); - -% debug plot -quickPlotTriang(EpiFem, 'b') - -%% Find Pt1 described in their method -% Pt1 : Closest epiphysis point to the diaphysis 1st inertia axis - -% Get the vectors of the epiphysis points to a point on the -% 1st inertial axis (the centroid of the diaphysis) -LinePtNodes = bsxfun(@minus, EpiFem.Points, DiaFem_Center'); - -% Get the vectors connecting the epiphysis point to their othogonal -% projection point on the 1st inertia axis -CP = (cross(repmat(Zdia',length(LinePtNodes),1),LinePtNodes)); - -% Find the closest point to the diaphysis 1st inertia axis -Dist = sqrt(sum(CP.^2,2)); -[~,IclosestPt] = min(Dist); -Pt1 = EpiFem.Points(IclosestPt,:); - -% debug plot -plot3(Pt1(1),Pt1(2),Pt1(3),'o','LineWidth',4) - -%% Find Pt2 -% curve at second location (max + 1/2 area) -[ Curves , ~, ~ ] = TriPlanIntersect(DistFem, coeff*Z0 , min(Alt) + dd ); - -% debug plot -plot3(Curves.Pts(:,1), Curves.Pts(:,2), Curves.Pts(:,3),'k'); hold on; axis equal - -% moving curve in inertial axes ref system -NewPts = Curves.Pts*V_all; -% finding the centre of the bounding box -Center_BBox = mean([min(NewPts); max(NewPts)]); -% TODO: find points posterior in axial ref syst -% post_curve = NewPts(:,3)>Center_BBox(3); -% [~, ind] = min(abs(NewPts(post_curve,2)-Center_BBox(2))); -% figure; plot3(NewPts(:,1), NewPts(:,2), NewPts(:,3),'-k'); grid on; axis equal;hold on -% plot3(Center_BBox(:,1), Center_BBox(:,2), Center_BBox(:,3),'ok'); grid on; axis equal -% plot3(NewPts(ind,1), NewPts(ind,2), NewPts(ind,3),'*k') - -CenterCS = V_all*Center_BBox'; - -%======================== -% THIS IS A MESS AND NEEDS TO BE REWRITTEN - -% Identify the posterior part of the cross section : -% assume that the closest point of the cross section -% border is posterior -% getting the nearest neighbour in Curves for the point in CenterCS -IDX = knnsearch(Curves.Pts,CenterCS'); - -% Get a raw Anterior to Posterior vector : Uap -Uap = normalizeV(Curves.Pts(IDX,:)-CenterCS'); - -% From the cross section border keep only the points that are -% posterior to the center point of the bounding box -PosteriorPts = Curves.Pts(Curves.Pts*Uap>CenterCS'*Uap,:); - -% Find the The Point P2 -% Get the orthogonal distance of the points on the posterior -% part of the cross section border to the 3rd inertia axis of -% the whole distal femur -LinePtNodes = bsxfun(@minus, PosteriorPts, CenterCS'); -CP = (cross(repmat(X0',length(LinePtNodes),1),LinePtNodes)); -Dist = sqrt(sum(CP.^2,2)); - -% Identify the closest point which is Pt2 -[~,IclosestPt] = min(Dist); -Pt2 = PosteriorPts(IclosestPt,:); -%============================================== - -% debug plot -plot3(Pt2(1),Pt2(2),Pt2(3),'ro','LineWidth',4) - -%% Define first plan iteration -npcs = normalizeV(cross( Pt1-Pt2, Y0)); - -if (Center0'-Pt1)*npcs > 0 - npcs = -npcs; -end - -ElmtsDPCs = find(EpiFem.incenter*npcs > Pt1*npcs); - -% first iteration fitted geometry -PCsFem = TriReduceMesh( EpiFem, ElmtsDPCs ); - -% debug plot -quickPlotTriang(PCsFem, 'm') - -%% First Cylinder Fit -% Initialize axis, radius and center of the cylinder -Axe0 = Y0'; -Radius0 = 0.5*(max(PCsFem.Points*npcs)-min(PCsFem.Points*npcs)); -Center0 = mean(PCsFem.Points)' - 2*npcs; -% Get a subset of the points for speed -CylPtsSS = PCsFem.Points(1:3:end,:) - -% Fit the 1st cylinder -[x0n, an, rn, d] = lscylinder(CylPtsSS, Center0, Axe0, Radius0, 0.001, 0.001); - -plotCylinder( an, rn, x0n, 15, 1, 'b') - -%% Define second plan iteration -% TODO: double check: second iteration is very similar to first -% The normal of the cut plan separting the posterior condyles is -% updated with the just identified cylinder axis -npcs = cross( Pt1-Pt2, an); -npcs = npcs'/norm(npcs); - -% Make sure the plan normal npcs points posteriorly and distally -if (Center0'-Pt1)*npcs > 0 - npcs = -npcs; -end - -% Select the points of the epiphysis lying posteriorly to the plan -ElmtsDPCs = find(EpiFem.incenter*npcs > Pt1*npcs); -PCsFem = TriReduceMesh( EpiFem, ElmtsDPCs ); - -% Second and last Cylinder Fit -Axe1 = normalizeV(an); -Radius1 = rn; -Center1 = X0n; -% Get a subset of the points for speed -CylPtsSS = PCsFem.Points(1:3:end,:); - -% Fit the 2nd cylinder -[x0n, an, rn, d] = lscylinder(CylPtsSS, Center1, Axe1, Radius1, 0.001, 0.001); - -%% Get the origin of the CS : the centroid of the fitted cylinder -% Here we take it as the middle point on the cylinder axis between the most -% lateral point projected on the axis and the most medial point projected on the -% cylinder axis. -EpiPtsOcyl_tmp = bsxfun(@minus,PCsFem.Points,x0n'); - -CylStart = min(EpiPtsOcyl_tmp*an)*an' + x0n'; -CylStop = max(EpiPtsOcyl_tmp*an)*an' + x0n'; - -CylCenter = 1/2*(CylStart + CylStop); - -% debug plot -quickPlotTriang(PCsFem, 'g') -plotCylinder( an, rn, x0n, norm(CylStart - CylStop), 1, 'r') - -CSs.Yend_Miranda = an; -CSs.Xend_Miranda = cross(an,Zdia); -CSs.Xend_Miranda = CSs.Xend_Miranda / norm(CSs.Xend_Miranda); -CSs.Zend_Miranda = cross(CSs.Xend_Miranda,CSs.Yend_Miranda); -CSs.CenterKnee_Miranda = CylCenter; - -end From 272fb758707be96252fd0ecbbf9f74b004b891df Mon Sep 17 00:00:00 2001 From: Luca Modenese Date: Tue, 20 Jun 2023 10:41:45 +0200 Subject: [PATCH 19/24] add missing toes geom --- bone_datasets/LHDL_CT/tri/toes_r.mat | Bin 0 -> 192219 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bone_datasets/LHDL_CT/tri/toes_r.mat diff --git a/bone_datasets/LHDL_CT/tri/toes_r.mat b/bone_datasets/LHDL_CT/tri/toes_r.mat new file mode 100644 index 0000000000000000000000000000000000000000..9b93ec326cd83c10408f57a5819c5008e03b3f69 GIT binary patch literal 192219 zcma%>c{CJ$^!F=CB_yHjO9&xkXT}nem?SCNkdVY!vX7Zi$(|(1G9<}5B-v+(>ee=fr>gUwk@q|G|V%kDBiBM5{Dix6+Hj#_#g(LN@FR@riZcgX~Q1 z8s9fH?^UJ-U%e61f3t1a%(n2f*V;s2l(+n4y+Z8$J7%2g!O#d;55=Vl+c4R1sK36= z#C6U@BSHcM&F!?qg6xz&+Liu5*ZoGui5YxgDr8p~^hR3hJrFw)jlSflNJkvf5v?n@ zUNl1!>{h9Fs{p&eo*~E$mm(J%tzZf4zoaH8gXE&Uc$p(0_BaUC&Wx@se?YUd=)ip>ON`~s*vwnOO|u;f9N`XbMcto**{Rm% zdTb5VAe-9%K9<~ga9Q@+PueFPKmS-7A-fT@6wdpbO+&l{ zPhHqQq;D;8x2D5+47-{ErFyUrZ%jNXzq5awYcfx-q11;jLXyA_rcD`V6`#zbg-GTc zdp+x1YmQdH>{HhfKgAh7ejVZ1S4NkcrX^dl_Kp^)>JcqJvtxe7Q)0&=dFU0p<`7}( zHE>|P2~L)f9g8~NHC52e)fCHBSS`8IGuekX!|N}%DhcIf+EpgV$0NL6wy5$)gZ$sI zT;hR!$-4f0oXD50b(T?mt%hfD>)Y9FzeV9n7K=UKPXx}rpL%xssLULC3OqM7-LQC` zq=zn4!^^P5o07m_ajAgZ4MfjWgfR;50~6nvqjssZ8h-b~oL#*05+BSrQc1>W!qtdw=0ba;01?6aXyQr{y>bhb*W zIP00koD;>%oDMp^Bi%~DoCImga3B@);=+CI7hW)5E~3nwCW;TS>?#l?e};iiN=Xpn z5u`c>oPGAu)&jG3L0$VAS757YM^$pnGc7O~P<3J$MD?N&j|0!4C(1*MSd?~W*Q5ef z&5k+7nJtwynQ%=Wmj*;a9PljDw##b9^|=0b&Yv}|pGI;gjql11+T2}DwI(F*eQSwR zijL`OovFwy++6jh9%%J!Cq14Kb}px*qW_x<-v9{B+rW zS%a_TLt|FltmThO35=I6@zuh)VH!Z_WVM1gJ;0;bAF;>5~!4gdOvsE`}oHT z0ryVt#ye0QsiM%V`6XwH&`*P-;sv>aN&oE;K44dY(&{Jno7Tx+>eJGfb3!NpZ zZka$d;YapsK>cB;K`ylga(=wE;f%;Ag82(tq)=`KPUqj+BuRHgkD?2c>)uAsq44&0 z!s@?hHe3XI(iHEIT>9AT5?ns=vC&K-m}ANlyuUv!%;1fzD=ROYEV{WI0=*IT^NcX9 za?5U7xHUN@;s+<|yBBqe^s_LkN2iw%d%RaL-CHbM5&xma+SE1~n$7TS6>nkwtyvim zAE(!z?v}W`4L=ygdv*g3{l5VBJ%>HhLqZr$Z0$%*EdNn+#~@HLkzKrIrXV2$7~bz~ zd6`DtnoVjHGLqpH2YEuul!A9*~{GH{^rc zoqq+`RiK-gEpOsBv@Gvd`SEr8*tds7p0;hMTkN{=7599z4-kPm<+g^L zp86&M1+FyMiI~9ehA;N)8c@Odwu4)WmWlL)U`Zpyc}gZZJOsph1TN#DlS)isukI8V zQ2c!uuXKI=_r?tKU*>BzyyNn4tU>w-FrqcjwQxIL4+F^{4*lgYYC7I1=#>bwDSjjb zCZh^8$n=R^bnZFKv@|hFT$z7F6t8(})@St8U3okB-0R)tsV3}yP8^W+AnL)y286gF647IdgAMmm8J=nIQ;|VZKEUHaqIWJnU zwG&^ezpui;oySCk>jvetWgP{O;j4PF1ZgJx6AVAi@!xuy$|7mbaaf_|iPU9+fO37U+5@E+J>doSGtQ)W38MKtG4fSd__ z&{8qJAM3pl;+ABjDEkQWED7xky4IdjimP^^izj2pKs`m@A`A3s(Y}} za{JWbKk!8v@V`(J056H3P$bGDFgjS_SpaSb1Htn z!)YavjSPa=Tcb+BaAg9Q!mJrG&%3QvI4CCM9KG%%P5rNO9j+t2eP=gKQdZX|%N@Kd zB490skn$;b3?9cQzw^PgNN4{$0XI7|0Xg-dY^WJW53xK^4JdMLZ7sP(Y*&wl$Xj0v zpRf427fD8nNP0p>t_G^MB^WgUWq|VWsIceUlqsKdd~}%%RAEChikoE8W(;szs4iZY zpa(>+-nC?red|d)%hz*4%xyN~U4~`8)7^Z-y(V+(IejkBA?Z7O%-66dn6Id+-wG*P z!kOU$x{g0_Uy7K&V%bH5Y-=MgAo5H;fWu%v%mcULJg5UnfYWXSzE6(}+2sw2=!Ypo z!e7e2;PRQi_*83HT$8LrTyE;QS`^=l2;97ziaH%IC4vukzaDv!sdseUSL#Ur6TLb^ z^?-WUam`^kT(%s*sy9e%%i4PE$T*+FR%lOkZiiOg{D(%T$i@ubT0<4k z2DbkAx`(W;(Wip;Kfvt>x2L{RnB8RZ)K;-j_b z2SU1=pUbA3s`zxb9Qg@1|Ah-NZI!VnhJC_oLOvLT-GOq`%cC>_@9wl3aK_s^qLg<_ zmM}%dy}0jER28;-+-z!#2dFawUy4cw0zxvJU0yLI8_xo~p8DbIA8xac!Nz*O0M*bh zT|Np>^>{M&w|b|!_2jhQMu|ASoab16d`es3KKfe+TK^p5iytvn{B53H9Q@BjI|P^y zy+l6G9GKCOdw?n(4n{Nx2UmaQR9J1xqrA-NFffM{W-92IzGZ)fo8(rRtE#5j zgd45PK0$DQ9e#&gfolp`2S16KRiL zh{EL`wUMHSn{GA{z;!^&ruFY3k)T-|Z)ZW$c%p_{R>%*2g1x^-$UhzE;ko5QcnJ_T(c6*a zR(0>}Zu=~LNOHVF50}#n=%h&dos9YY$xQM_>74iRd#sH8f;??S^^@4-N`qg6ReHK^Idjb_-tR5~#CSsu@Rrf)h?&g&#j>C5q68?0 z$9=v@`#-RVhs(v-a6eB&eYryYOj_urCb4`JNHCoReDv%x^jC2s{F40*4!HHTMBIE{6Z%7MY${#I$WJO|XzEF(v z`EZcP{*PSQ>}xrZE}$9F9^@018HX>bS@|@pH)kDtKg;!9Xb$rldhcKE*Z<&Gt>d^> z@5k*c=%xPYZuf1^cYXt)U(YY!SkXb!0XX>ZR^EQzx*;VJfY>)&hss&~#i95dzrx|_ z1G1H2-Jumo0?M<#y!p4t6oXWW(qk7*C|M0u2K_n8oX`lgf7u;gRW_t2-0Ak$fR|31Zl>Icfm266ABB6Ecb$o5xcOPCMJk+T9x zE_ikz*Klhx{cN4n{>{pX@}2E#di8JGCPaqM4C0RX+vYCmWCs|h=X206vf3Hp6_pPt zWzSLvFprSopMJv%>N6;!af~6~X<@B*tRyKEI!KtTBbns7w=m+U{EC^&DFeZsrOVsa zbk`>-5DE1%%jBQOX(0_YfGA~LxOM?6Te96ON4XO16x65{5Yqi@=%MH`Q0;u1RmWr_ zHavggS#sE;D*W|S)~^?nCG3Fu&F;s`8jE5q3b#3IT?H?aWsV$E-Tt?K{zyD+V{W^T zwZf{U-42DXyL>aG(G;Wu68=@n16mZdyRmbZBZZ_Ex;@M5g zt3ox`@$T$nh&>4?4PWsnF1dI@Kk-)X-4n>$Ek$bAc<2lLu`5@pvRXIM7e5cv-0=rW z&Kbx?@ur)S-O9;(Z)ScT7@RHmtyTrP#JCCo8Ahl78J3=+7MRpgu{l zb}(F@!6S*8e%aFKN&L$VD^C}1ujOvF|JLdb^W!FdCJWQ%I7dKqE(3WASE-L>Y!6Qf zC&c?p>2tm1!)NOBVQ?RNVv~m45Po9 zhqtS)oEXlm>r(!2f7bPp*$JaUUbw}%$O4IW^<1P0EvJ^<#n9`AzMXOHdo6NYV#KlT8gTT$Izp$J?&EkuXBqm>lDlRNyq*7x{g_pALRgBu7b-PvDu|e^2 zsXtQ)_mOJk_QB3){?X4Zrg}~&l6U^47tHhbhUc52*`au#(M{G9nf+R@xm(NtOVrwT%Vm+`Uh^y+%P?>07xnj)9WV9E^^c$5goiqmJUsg8=D8 z&|yY9PMVaj=Y1i#YPmgJl9VHHg-TY*4@D^R6IOn%t!m=)y%OH-BL^8NxEg{W!|v>l z4dHxC6xnTd!}F)tVkXQWmASuF3=FC5oyx;?J4AR!9h_hfl-8lXU)%A^IdJYv4z3F% zbywdcy4HxaO7^`GmRwB7wo2>;DY>JP?&Mj-I{s_aElm$(Sxs294={AMZC%YpKPBYn z;65ROG9QF{BLs&=!SLk8po=THHvz4rV*tsg-PDJq!q&g1fRkqzTe6!xddL{)l*Y3E z^L_d1(u$5!QXX!z+jS7W2(@<@<{pyencqhJVbp01W)u1&@fqh>zZcO@;IFh}8Bd2P zrm9l0F&8XGf1U0@rP?jRS6%SmKyOMhD>cZTb5zn%H2K>TcgNi;G}_aMf4YcJn8HlM z8t=0GmCbH`ziA!141K#OZQKW90*cu*SIlp%5?gAScw(m}fja}f=igxi^9rO)pTQbw ze3CR~UJZ@+v;pB~P#XJ7Eh8J>ke)L@-WB_^MXgN99|f@|9PV3_sBFO<@t5 z%jkEEQsl)*Ddm%J3VFSiY*WZ{=MT<$uO*5f>q{?l_HsmF8pkAo&#TW8ZUft~jzkm8 zKQmW~w|teglHpY>A4<*jasHe_w>af|!xVCweU{<)yWAtZR+A<6_g0=Js>|!mclg3? zQmX|_i{r~4NdKU)Aj1@WbaS(3(4V+(b`jRnr7ss?5R`Xx3hhraANJM=o5jTwO4o^P z6SmSi?P-M1LUF7eUuwr2+GGS2!P=~@%#|A!P8VG^?7NAX?C+i0w}j~){4BW2n510Z zw}tig+%ZoFfwsjEH~lE0J36ruU70;XT5bCpjBzWcz#RVlP|)6%H?my+@>uj{=zU=a@w#=pB4OTgz;5!;yF+VN?wci982)LDW zUq^tsVs<;*5eDmVe-jx<%t9xvW}VD;kML}iI4Rc0G%lDrP9H9EJT!`9m4Pp%Kj&j5 zuk5Yo=2Ja(WXY+qe4AR!Pri!v6!@4=*VUY#H~NMhwHA5F2CXleJ8s`KNNoKiO$}1w zYm+8)(Yu~@XLl;p-{Ga^J!prXJ}A$y@#}VRhf(Z;c-QK1y}-rJVcf&1wPVaj4Nv{B zo!E{zIQMr@N%kKi>K)~HjIk&2hr@XCT%R*-!Y!p?=T2U7WcEmNMnlS^1`MXU*=+j- z=7KtB=rWhe*y!$JUZ}blnim;OdOx~z&G7liy}W^C*3ywOof2p1q z55!OT-!SuWZtj}SRN4da^2h6>Wa`AEkfG62?t(80k9{P9|31dLeyGNa`yZaO6W%Qb zQWf_b{Nks|G;{c(IwH9CV5A_q{p`6S3N)pC6}J45_F#O9=N(vGggu|&__thzs< zY`x%=owkv4VIchCs&u&erMA6g0D~(mXSa3WmaI!J*FQ-6j!A6xsd?G2$Hm|F%t+xy z?0cT7H3=(W?Yb0d#3R>9K14=Aq%2G@*s-IE1f)gb9DDPH=!1H13gi~SsKE441#l9B z6P)5aD0*9Qx%oZiT$P31?D<{);M0UuC%y=^dgKX-;$GqY7n>J+RS9;_#sepDUjzPj zwG`gFF53D+0Crh+*IXiZTHzV8Q6bJJ=85RC#GRP$9|ugpBI}4>-?{f&XkUD8=svK1 zsOArd#hxPe5ChWNYB}C|x?Bp1*2+F4h|O*y_0*CVZo<-~0u>P`fOHP7cbE0N=;#DV-v|%t>GdKr_REHBtOW=9;teYr{1iGV4I2n3*P)OrF;P?Fq+yu8dR%}dC zj}Owp9h+X^naGa2McmyT0BkzZw7wNj)#^uW?z@$350t3ba~naH63FTay6f%MzW=zp z72+H{MG0}V&$!E=vH@0B1ZKqT*OlS6M-XTQm+B^!ztp(0Z)zq&a0$S*?x#suMGVFoLwquh3OVJY~_A$<{PA5pyxnfZA>1!i5yo3MR z38EV~CEL`kU-+Oq3LA~@O!jmP=SE%oS0Q0+>0v%6pFFpp8rDn4p$nOI`p z4ogs@m=M`5J-s1T_h5 zgqFCC7HhQs(_wMFZ&iv-=FUraa|-*lQDP9}eA0F>h^Xx?K}wHa%1&gYe_4G^5>I4E zmdS-ZhWD7pf;K^lRi7i+i!uK}LPldra&v{q!H*l6P-J=EVqtNkqxL%EUS}75%O`_R zqY3>_`E7EZjl|U0FPUtObJ2sHy)&d;cYIn8dVq)s%ZM({Q)A$>;t-)eD0tMRb>^22 zGUY8hWbVq|f}Kyt5Csnj(Oge>0{jpGRvDs3MtGpOJFtcljY(v$KS*XYjiu@~2oO~ImQfU|E~7Jsmt)eG5*+dj-UHWvshj3G3pOFkGh`o1 zHVPGNFSc3ySdY0cw2s&`#b(2Q{!xQfJ(VpTJ$xzoEIWp}eq7g1A=u4o?-UKCa$Mox zxc%)B1zJ^;k8ibyOu=~adli;_b(lK~GR&nCCAC%8#RfGTNjl98#kly^im>JR!;9zc zIUE81H|*Z{AK3L3Zb#PtD5>>sOHzFQ+{?(&0rdvyZ;{xzU=#cW7mlt1<=#1R^Oc7td@ZKbhg3$dp2!wn0U~qs z!A(<$4aDNx1;-Rw2~~y1$PZ9dslS{ppZ76zb})<-i9)l*Sr1OJ=eR~127z79*})?_ zUJ0x}MsJggSR-eizs$$YkN;ELp%sO%e(YK(xV7OTz5C(S?1%yIqCVf3x1Ew_Nk^r} z4bBU{FTETUt+U*^e{%9*{a$M$^0gdqUASI7cOJ7j>U%cvYI0bdNYDOtRE1 zmBD4Z4`&ViM(TMjIajE#zBisUsAeTFq0SqA=DqfR9Ki$Ls?)N|B2m{=IAHe_s4C}7 zcWv=iPxo>&e9kP2m-C8eAK%!|XN;unNU^^Cxc~{z09}*9e2^W>C_VyDGtX0(6G%|L z%_JsMD7Hb0tF7Csj(t@`kEA4pev#SQ_zeFiNOR+fc`QYbCsK00qo5^S+6S$B*fy;* za~Fgc0mp(HOnpRH=ZE}@9Qoj%e%I7BUv3+J$WU=)aWX8#i&k3B(_!;xa898`^k$hC z&wHb_Fzq;(j0?bcxAX7GLcO5ZkcEyO;l>}FY^xBUJ@ zi(ZHET>lKc=$&p^9gsVN3v@}CEp-}6wf&|#bmTr>bPhigEeMzh^JJG3+LOPc-c~D) zs1$JIKiN#qn@H8g3Y!)vs7R-k--S;EZdX0D!>ryVpHItvuTUo30eOf3*!mAJXM%NW zqRz+sn{%DdwNV@GnQ7D79lb}(8xfh$%@C~dys1xfRklDcV#bqcBiUhtYXvEQvxu+H zH=t#hwjI3`ROc*TGa{w+ZjqXUUo3#4Y>MgTIO;)~V`<=jV}^5MkR6_77W$5))Scc% z050oh>nEdbH~TH)b?W&->r2G5QP#i>NQovhwxPHXPQ0+bYJ~4tOxq9yp|6fdC81&> zbgmv3hy|$kE`{?@2V}`@d%VqPe!gcn&mR6GbLw58DV9t?@ij3o+ny_rS?X3@VTBhI z2Fw_BVuV0@Wv66GA+3Ia}8RhG7=M$5B<^bb@$Ys>%8{c(7M{iM_tkoUCI|B+RR3=TMZif zeI?;R=YNKs?aaV5h6=mmJFe^Xr-1R?vYkbQWP9_XeCThu2sz~NJ(AfMvKM%P+1Gyy z#r3VTArOIrD6L7Ta{^u#$H&F} zHA3$}f&8=+M-}txyO||?9m+d5UDn6taN3udf%A8lgFH?Lu3sbhEQBq0QIw9hpLKa% zfqoFmY*)K6oS%P!eHy#kuR{V`m-R+pZPg*oRTiba0-L2D@94FA9i_711(O=5Cx%;Q z7#$R9?v=ftN9;3gVLeS!lttc=Xkem&-sQzFdbpzoWlm>X+a7^PB6NPVR{fxTVtn+#QwRM^OPDK#t`PEkiQjfDsiCTZWYb5V- z8t{FS==D#5Rmg|-jiXtXwDE`i{>US!#2wM^($Se`Fa zCb>{=7qn^;Wk0F)LqM^P6Nv1%o=kH_>?;myT?r0w5e@)9nbzd`ca5$cdDreP13*>F9a-}aRm;poD0`I-y<@{1(q zK}I*z=nY-5L}%}4OLlp>SnUOO3T0tT3I+NqaaD*pO+X|X9?tK_9h@M$_D8!0Mh;RQ zFFQ#vJ`oO5SSo#uk}BC3Flsap3Ul1%Pm^j?lRA1*RjUwy+LKqccM_Q5`sDLHGzWAW zq8dAu2D65`9b*CKJxxQ`6rW|1x;zN0-OyJN4+fi%uOoMIGQ~e9im?%OG36$Jiyzp&PPZi^wOJl{38hpSmeO_byXf<9(ur{5 z!dtV0Ljhvm?NPPvY{Q4Ee2ClQJ_j~pK~HKq^z9=ZlVArU(Sn4Biiq344 zl)^Ho{JJXl^t#oVs0L`Fi-6b++b|`A-nLkI$mb8)Op!i z+tOI^{g(@S*_Ybs3ttNRF7|jt0BDE*O_m< zb6&gjM1mB>6U-co-IT)o^xz+0H?=)c<;~I!KN*5s-v$-yDdUj`mhffbe~OVmfP!|f z7d3jOF8N+Q2yu(krY5&Sg)-jS-Q`+kN(_l!1VsZkpI_hi4TAek9t~Pvv}PIfcJL7` zRoSAiod*}{-5KSLA#CQ{G0~9pvc>3q38Ao(%WU)a9m>(7EYG2`+&Wl-tq-FzOB$e+ z{haYm`Ufh!AcS?a*ia_}6LvF!)s^N!@@`2yA_4FGvs(DD_2x&xyy!+RTe>5bZLwT+ zhb;M?1E#l@;WP{=mduHD{WWwGG+;^$ZuvscUBRjnuc*dN2C@UbLL4FLi0kI+>0{nv zooG=J_w2`O`y>sL4eOG5{$A24xZJ*LRr)bz#-NwYzG(-2mk-?x8y}s?Ow?4^jjnp5 z;OE1)(e%eup`VJ45Dc30Qwj~-zPz!ke}?6e+AKmU&ERYG%Ua9^_H+R(K{pqEN9~D;R%d0qdThAbv{DE7}0$J_B8@(EtptPFH zbTyIVsWu-@J=oKkN?>#8H+JEtWWqju*EiCd^0mf&in6NTEktD3>p>VhuNXxfMGBT4 zmUA4$f3kOel4%@9)~d1DSQ#C9(?5lUek@*d{@LfK-W;aQIKuMt_vt4uDN3nkX!IQ? z9-^l2K-@`z)K7?xSJ5c>!}@OUpI!OeRSwswY9Vg6)2DF!&SWdharAv}AX|K`^|QUt zIhbfHD{}76eSN@jj7|?S86u-bQYH~vKCgWIY+Y1rnfsl- z+1}=($u7uigWd_(J5J>VU9i#hcl1@&pvY4FVBme@VNvmBz}7X}u}jFFCeb;%RCt*t zG#7Q2{U;cuR&@#S-w2?QZ}d#`+h>%jnqe2YyD&Y5@a7Ebm%5{FU7x^Ww zMGSu9;mdiO()Ja>-kx`C8J`W4<>>?QpzYZ=txAVFc1pgf*oo4(mfbIKs4My0XoM zp5>a1&bWPLE+;(lEFFfjM5W`!KA0}sG8G^6PIVMG5OF0^RFJI&HpOXMvz3FY%o;6U zeXjuOQ_w1{)@s{)Jl0fh20|!b|q#->;s0H5}18YH(=u*Yi8Ux!nlAXWs?iR!{ab2Cj zSwX!>?nO8{V-LEf)$_D_LA$tg%&D7+G){2w#1byiy5DFZFpUo^uzmefjOh|d65(FL zYI$Eu!doc1_9Po{&SbdhnjP1dC2ov2^djw_W>N;_O>-f&#~rshuu-?937ztJS9&xa z>U*evNPsylM#on5HN0fvk&dclK3+UHR&t{*7h0zzwHxM+1}w?#QOYGEL+Xq|W&Js# zrm_?FZ?lMWkL=m$99?uzr1B^}z2xkk%D+T>v|I#Q3LAX?`5i= zYN;soz=@uTe&0r%O0(%2U~YAd!j^B}vkgIomE;wRhCbqkC@$}Dk)H>Cph-BKun0Fx z=c^k9Hfyg>P73J9>i&dUGP4>^6x=7tK@r_euWyg5 zrzdP^eTcq4D>#T+@>~RsXM{X9+%lYMC(NgYXl>v=u&SoRV+_~xn(_{m8xv9-@$vl7 zxIMd;caD^^q;Ct$P`+T)J?X<|etCO-rH`n}o|2!&xKO%+>*M z%6LNq>NSohj5XF7n5YkFQFz$o?}&X^ELbycv{><{%iYUI>q(cUvVWwD$Hb8<)h@wK zh&3eX!mt-upZAvt^1G27(Iv|!-r!>LW!_oUV$9wn6UlMCd{}vc+J0y52ykJyojQN1 zyE8rBmGJ5Ns!b7O%f|!Ca>HjOv7Uc62!{UBfU~8hpGt2XR(=JFzLa=|L2YRDilF=t z3Ox-o{Oq?qcMX2&?c3B?H%oFNq`R57Z2+CjYb#A^cbuM)L}IjW^*Z0em8(E~h6ggs z?@_X6zJPWG4!IxCzlTa5IaIc5ZbPoQy#@-2KXzUDlL8liQax4LSPVK?btm4b@i-Bc z<>HQrPlzFoaZIKLX^#HTIqhT=@WsjgPnvnrG;WY%76EV!YOqAacos_bm?Rk8ME{fP ztr|M&_d9VJ{O&bY3s8ic#12lK=HQ^zf{Zv=HBLm(fho*NMEA$bBbCVMh9>o`N;R4F z8o>kdfb2H5OTTzuc@omF#DY#-MEUyYA(Lut6q zLmn10`F@X?*>10%x3!#0ZO~ykls8MQOX43c|A`?4@w2130TZrdW$Eqx#TzShqeft* za2&Y$3*^e)Hz-8`_URf;CPrzC@Np?TT_SJmUD>qof#}A@AXS!8HuRzsvae*)fKEqz zOu^5a{WsOOcKzftd1b z?RgiJL+Ixvf8<91f9>@+88W~^}F zeN8FL_4?PdQJ`JEQ*T}l;}aefE3sIqk)0HuwU{zWImcmdOu0HP% z`8n#wojgfOd;v5rv=kQ{(1s~?Oqktpei&z%V2U>kFn8f&h#Q2zCv<<6Ps!Gi#k?V6 zr_?gQ-6{FR9>*(4_9jT8+SU_oS2^`q{(W{S@AX~NyoUwh?yg$s%;bTZw0)ST(2ptU-9MDdO9*_Qeu@fp@0=*j_BiY)&ci0svjUqZAc9;wb7^v`;`m&lNh zbdBdbO?n5Ciwds9Ti|&%Z%TZhnF&m5;n~bF2sMjVzk~PUS`%00cLW~ZL@3Gtfk`Ou zp5RHfvBkM??ibD{(4rJ1Ln$uG@OA5tR;%uUt*x5{@76p%H38t*e;oX+qo}kj}Se@8b2);jv*f7llz8X4zDeC>vyzyo)D7uW#+P)(_ z<}y%|FY@45C(a-j)!}Ur)ng}o@sBy4`2vgR=pmN+=tq6T{DFu4>B5u?jrhVZ;Bv^G zH0UO(IWO8-X=m`r;nOgKF5NYUo9npssH=jHktK4TPe7=47$9=zikct@%SU^CfM3xh z8T$)?7;BMBgh#*f=(R;uEh(`V0x=H8O62{8?e)y7Bz3XKG01!1g86(jQYZ*^mfqTH z?{%5df^xECJ6AT`DCEofj4vcKh`tL~%ia4a>#ogA7YaTR$zhHII?tzjR@bO*t4HM* zBPWxSid@an<7xu%W|FvT^-ZID)yCHOe&=(bNeap=JS>^ zq_k@!>uVHMMHhr)WRVxAe7pR3ab_uur4hg4!eVpQfwc@vHZ4=K{vY?(-}cM&M>6!` zC4;n}0)ijuDk`_k`aY2XTT@9KkG=Prv3G;$Glv}n!;)AF&VdEWpg5nhPK%ctkl`SV z75ptdAViw==nA%_XK`xkIUXwfmbHBRz@9K1Z46P{} zc!lvuxvv<5&jj4Uk8XO-Lp04@Vq~$NT1BgZ%LRwc=fJQ_LS?{dD7yuk80p4g5aNtZ!*YWWksg&F^<{sYMBk*8QA_`yMPMfvmOk(q_dIybF{1YXEbmt1`$`gY?LQq4FwDt7br(< z$eQO@ha7MAmZ0m~m9CO4@fa?Y&r`r_eCJn=FA!#m5nm(MPkwxf{^VJ@)1wu1(L^Z?gWl$I)qa{0mWVJHOX2L8{LHEec+2%2aF0ruUGK|xO;ByMKyQ6l8m@9m%(b1pSpW+ZxNd&(~P>ebt zNK)}vYv;wI(<>P}-TiE?|8X_{-$U>DH!{v1Z=4TZ6@PT`%*aQ7?c0!dzB=$VTVpH> z^f7V!EC1AkkLP6l?&%bpSY(=ng_u7&_2`ZFwaE20+&YsP0-zZB0N3>}kp+k=R>6PC z#^y9ixMu}t)^x#fc6|5DS)uV_RBhq2@Mo3g>+p`a;C^}TXC4lfq5i*>wwyt|K5ZFQ zuXTJPI?+mbgd)$XP_GFM{6TMhp`Jk7-`=E+gSt6tC7r0Ng|U2pwWXgDZt1o8Ip8RgvuKYvWfm&dO^y+$+eai@GvoX)A? zqw}^sX$u!7!F`V({0ri0{%bZe({?Pa+8l*E?BSE#9KFxTu;+>C<`E@6`cFm*gHh+6 zT?zg*WNMpa@Iudi5e#bEKy^&#UZX1A!Yo_=?bC-ERz5i83~B* z+_^WY&OfSuo%pO=Fb093Ua_+_6u8&!Iu4vVF;*tnq|3%Ze_%r>#alcYj zLQ>AG9E(uN`LN_vDMBSV6_w)4Ld;=@kn<@d$zdcRAxX{~In8n8n6R0#VQkoJcD(!D zkNf@?K99%ybG_f!^?E+9Q2o5N(Bi<<$nMGaIfv)>Z>v|<5ylyA_zvq60 z#>#8G9`xX6*hw&eIyR*9VN8gr|A8(nmE?R2+3*}X#*Rm7%?~{_Qx$>NZ)P)Se{p8k z3kXSpD8*7FTmH57hY;7Vd zPwyONsd+qtitJ^#POD=ZKV(kNNX$fOW`$_HJhr~B?si*8D)f!y5SYHh^txucY`Ai< z`j!mLUJdg(M3kCj<+=Xy%18sInEhEc;&*@fMEx1&m+>Tr1M86#MacAfJ5Fs9$0$pv z;Z5@xwMa<*MV@g}th<@A0=vL4gAgD#YOpGW-w_AWjxLjeMwZwc&iL=CZKUR*s@{D; zqFzVO@WO1-)9vAS;Ii>LNYoMAQ1m9_623an68U?@VGQAE;qp>8Lf!3+P<|CND3@FH zI9p2fRO=59!7YV_Y-l+{f^9jZY39>2mz9L|BwOx4Oqh^Lz|MMTLC9ZrGSXFy)xCd| zVrtVy_DO7w%_fET7XP(ET`tsA#-wx0VZHKxuJynp42FFlk0+Dtpz4y1>Bp=*v1!H1XgpaV>~YY{q+T9};Q3nT`|;LGk!Mi7 zN@R01)J8Pk-p%6>=lb^fY1!0*z0pBWZ%;F}AUqwcWL~AVUn1~Lf|lH3h~5~M01_Su za9b?T5Exa2P5KO>*+!lQ96DvBbWu@34Ey(D{*k-m6Kh$jhf%M9)Lv8D>2 zJ611u;p|&_GqjF8^?t>ijJV`5mb{lA)OR<6#pE$PQhya zPv8mmVfd%_s6~fG#mAp5YH#jXk7%!X*bfVN{Yx4BQQlL$m}V${G}iO)A#?sI=6Y|9WgqvhT=PK zl~&ZKH+Eq`ipdoFJ}ac6qtqXCu6B~qQ~i+ax#tSOPhlc=dZJ?L4I2agl~Y2IzkPyd z*khiv&QFUPnXBe4-w;0vbUS{Q&20G_ZRf)*02{VuYhdJ6``$=`{)j{*_E+xmO`s?# zMxotuO!uYEx=2q!J^mt3{p*zx%OEeY&-TL`+)C3z@5L~I^_vd21F z3zVN;2a=`juvzW4w|yJL9D&)05;*??!5Xq3duXAPApT?`Wj%Bxc8qo?^zOOPpf{}F zmZ0ATeo06Pnle*Ym5Pb91w805{k(T6BQM1NBg$If;gOKIU8^>%kwG8ozRt*azgJ{!GIn;X-~qNUinElT#=6sQ+ue0- zjtliae0{0iT3dWibZOpN=gVQ}Z#(AtZ~_msIsE}85+=W-_{{u=CCG?vQ>C$a zowt#gyQ#z>zw!ud>-qplc#|++gtqeuoR(kuV?YeoxoZNB2j+343*XnCY*b_dFC35f zGepnodqF{e@63zZ}cH9<6R2oEMCoM)^M-%8)w#>iZ0S!?T zrTX>eVTcv88|%C`5CciG-6rwuw*)jqiHnae9PY2b^g}VyJdw5IYQstBM-PV_0BCMU-S4Rt>YNxh z3=&IGfw62@g|q^8!aKb@=H~Qhe%ncC^ib@V_D-jlj_3Xx4PIoRwfkpWZ^t%4ffB91jB+QB<}M1yIYb;Tyc}orz=R8+I-v7U zCSrqEg9(a0_Boc_t?T9s;34UMW{?xasN=*0<9h`{CdzT1E6+o6n)nLRJusQcn{y7o zx{deV%IPxJ8oFBxmJGK~{^DP50jsGibt9{yXj;W|AJemTL!8(CJn24ds;-fvDUf`Af~mZ7BNUL*Cr26cdi{~LyV zoOuF7?kArQPiisXeshNPnT<>LwZ=r;Xd_CcU&XlND+|gHc75KN2LBzTuih|MnapNI zIzUP4r#Nj*36ufv&D(i^hSO=BTLrNmn?udXnS!wTa1d!r5W4X@dcFx%32^#`B51IP zoY#dWRvyzIGx|$7I-jvhq7RzFh5nNgf{sU#YTX2n)mnJ&7y;9qNGi`&Id^B5Tyhv_ zt_ogi>L{l)cA`&aa|~b1nL1*!6UUr{#D?lKEa@jk^KXC-If5($#&wZ zlvBs~hi9Q~b|=F^57hGep>Ei32)bGUV)keqCC11$hiBUvWnLmiPx*!Pkg}SavHd-G z4nLBz}`hW zs*7iv^nERfW`(2#7T%Cn-^>^oZ(@8n1CE>XBed2rv29ISoaS3wQHn&Q@z(~_w%7lQ zDuW@{e5Lw86KYx($JhOiAMtxFsaKO(VRrRvqFZTqWbA2?H75%{mAWHAj@74B!em1y zujR|uC0}cLnsm+ku5vFsg2HHn7h<4A^+h|JqJMy{yR{=tcth}c^2Zs=cKI(S>GDjV z-{;HAY~p^=hB=wWbm%g~9}!MfpqE*07&133mkUAjrA9kO7NUBdwV@R(yw0<`V48|( zXoV5TG)$+>M!PLZH_&P~1eqf=EdOQR-WzEzM*HF>-6%;_h!TX`NOd8C(r_Tn^#}J) zt>IUO)=dCAW~;hHH<9XBNE_%IaEPTBRhskFSr85r?LtYKx%Sfpx1jq9$UXCN;x>x%8dfb zp}O=#x{HHe-Nu^<-%!&_%=ES1NVO3>`;IH^mamPf#w_(>#i{lkf*xs9~c zzMGxAWf5w*TelIxj3ue}O6P-N{!Zq!=*8M&1qZdxu#4Wmf;`d>@^>u?O?%w#SCPzV z|JkitBOR>OQS}|JvR=j3AI;zM_!t(=Ok>k9pfW3S2fF z=?@{Vb9c6UxCijeM@qW`e@B|exXG3cCmQc#!Ajsa+{v)u^fa{oj8_-T-_P)+AoH#_ zVXmR-M%&R9OU=8zSl_foyYv05FUNd27lOXQGP!?xjDKiNZ?&cZw~)~2rgyzwdV>$) zX4+kiD#x3N1qPF1Z8Q0$-y|mGOf-Tf)qzjU#@B=qLcB0QM$xaH(SF8(tyU#oYfvC< zE{wF14D)#}yp(Iy7>2j#bustlOsSIxuP5ycZgiL2k>t2_R^8i^UB8YT;fVf0APgB( zJ9kNXapp#y=5PB?n=2YaLhJW-t5b>?dMaX!#|q+E@LIDj&u3?sghIAJS%f6B{b==9 z{_Q~$y&0&}+GXBUoy#96fR}{71)Z>rJ1=&3MId#tb&cLe6NM4b)B+PMMkS-P52>|2 zvoZ|Z_#lSuGpl19FnQX)F;jU;C-OjNfASL&#xoU4k)Wz>SOxY{AmC>)1z_Mak5k;b zQ}6%%$%^Xfu5jW3=16X=r=@3=(QCu7V=74T&`dYgB`^I~sC$mI59q3he@{l7`S01# zccJN5DOGVX?2zuI)VQ{bt*EYCa|M=vn`K&Yq3C4t#ac*ccgfRd@s^W&#+TK)OCtBK zi#C`*#o$;iQr`QH@D+<*xqlI~BYiNdOSCbyegp7Uy&?NKWC9Ut)r)6Dr*!Kf^{}>T zXACyQIRQ=OVqDAlYlwM6K(Vfvn~8W8F)i?b*K#2@`Lg zj~k_ZCs;Ff3DFeuV=tbK@o?44N(B4H$Gof2y0w81QWuy<328p?kCggcDt}#oFW0}G z;61}vEO041MUV4Xsw~B{7)VDUsm~o2jF+CKBl)&PdVcQsAjg* zxAXaijQ#vx*UnZ-=&o+ZQ@GC|o&IHNA4XzLPY^j)NcHV_nBZ5va=iT3ADnh|@=m~< zbd0+tAYrY&yc4mjymKx}CS%P`K111eBZX)ZCK}$>DmuF;ZCG$@^GDc6@cQEf4S*_s zI)qxO&z52Z_|mi$)lBkq=ty<*jqFIA5VEx>9#egs8)}+Ikv`_}y=YIUZ>GN?CJ=pu zB8N}NpDZ(#K--mzp5bZS!^q_MM{xBj$yBUlv z^&0&ULkfW!(I&e~ zVA}^s!m0>=udMQ%I{!a#urQqWj&pqK4HRivq?f!94?4(59{VA|;`DY-gANl1loNNp z1sh^Nr*WP2Ix*}sqhOzY#woPG+N#Nn&SE-JQ=!v(+U;v?wdPWkw2Qk(3t{#Gqrf|G1~tj71=lZAG%b)&pQcxgvQGvhSGtpjn9Xd1cZT)tlaX(Xk1 zvvI)dHE{hzSeD|Is@o`y1`}m4P7fkp+H8<(PHYuoASTsgLL}-%nmsW0rvodo4&Urs zi6)ix5!3gzwsCd=!x8SfZ$eC-Xb`InBZlQerBGLEuDDS*znfxoz4m{ZSMee(SNzSn zmGBKrHV^ZzfH!P-y#f6qE>iy6bPTw>H|Goe-9WDj#k`7ZFEQc@hs}zK z8;^LI``>Ytd9kIVLp$jHd#t(DGHiVt=&VInjcb76$;JW^6J+=cij5vVvtuiJth z;>D#W00%k{O}ClY>en{b!D9S+MOM#CaudjUbK-fg$w;r54ta*6cmZ_k3IBnkSN=IY zqjCd|j909JSwhrg&8;@_%S|&)rrd6&w+mkPMask(<;B|OgAaJ;BYT}t9~hD$p1)VF za`Cu&(c{=bsgAB`n#bGE+elHPWcXlZ!q68OxmCnI%^Y_f%QlGgz<+X}%5jWRHHDgT zX|j-f6GH$C9f|u9BD9&XNV`s}RYlD*il>|4KZ>%%1QYE3QH&XXe{Z3%Ml=KW7*Fs@ z_4Betu+-i)){!Z@H8!FH22x2 zLN(fF8y255-#!Ptr@R>i&924yYJ^wy8#yl7ypozeOfz`HKJ%XdjGWCtdj*m5e#l0o zfs|MG?P?0wa5Kk?J}HAA#uap>r6w!~1CK4bMTptw1WcGk+E{W%uxaj!#Hmy>G}x3m ziB~(`2;V#n<`m2UDTE?+kzwe4A;bfPwom7Cp$kd#51vDOvuYBJE<%I-yO#|8-yS}&~-bWNH*zhuR1)4Cg?TPsdFn^apUKYYFC?db@Vx8 z%=8T%e&PE{r^}Ao?6%OJamdTx?#ev6D_)IwW>0e@WZSm8G64{j@v%m)7o2U5hD=qB zximO`qL6|Sp2BB`JqPpEpf(+GP$dwcXFdxq!}ag{PaH`u=-Wd;dhF(8bzx75MC` z9qun&oE^uI0o_Z5-cW;Uh;^2qx}U_<;T$PgzH`u*O>(KoqbCl=hm8`Ui79-?EusN_ z=QE1jO4~5bh(|d{vwTrD{D_5%4V?V5O~8= zWgt~9I)GL-oQa!0n&gX30X*V#8Zm99Ud6toeu~^i>Yrf3AEtd&99>{VkN38f56_nN z$By^cK3$e_@^U2lvkiqFe4AKWpp~ROqTqB0$ofW5W@IX_q~;oe?KV~2AlT@q#x-L9 zR>Z$FcHRyEMMyoaA2~_&7j&$h#g5sIy5v4G+YY>g07oOwI7oMHo8PyY_d~s9(-zNi z3XNm8ggicte2M3HE^JNdQon{7TOsE!YZY9(Y2BI zo4vJ9A2Bo-Kj?lLgplp*2OVa9l0>sFuzv^RhDT-84)W4$mQdP+HclxHTp60wRu&%Z zuyg(T6xjO`3qqLpNJ3UPTCrO4Bj8n@!6=NljBpa3VIE4@*|@L{>x6tuw; zHnNPr3Pu{dF-VnO9c)`J^nN{V;P_z-bJ3;_&Z>+Ub@^>DJ7QM#wnCZlaNkyhFk;cf zajiFy>L8soAGC+ls*nt>|5RHqYsA)G8qnds2kHX&4!;qTl0FV1BHoBgO(3o5-5I+L zG{lg3J9srgdfld&I3CS3sFq@}wl?*|9(h#`uYHI${k_Hx2iRlK)zhfKNPb0 z78l3#`j%zL90iW=bX1Ak7k+7LOXgKYWy%%wgG1NE|60CiO@cKqM;w{8<4Ncjr#Ixk z@@ZA07}8I2gU4gR4G~^E>_!&ymf+Hw${yhH1(5a1iQGL7f8sYv-779uM{~oA)1QxS zROe&g3QdnnbelY=^gQaGacKHRu*Zn?Bb^tk9v?zgwoummaQP-J=t*cJGoz}q8E5R3 z9rD|fmpvvnntM&bB$M|Oc|ML(@e#eTDH=-Tjousc`lef!@ggqjrbj3DVZ|hM+L{%f zE#vb2lf#3Ap!sD!r6-wWCjj&d$=oR$xzuL*9v+lP@glU>jC$2WcvtvO`z5+Er(2e< zSd#o7RD~yK)@BnRqb|4GQ+&W2*IoW8Mrn&P>yRFSZ}}57v8M#Q%ev{?FSK@v^>R&U zRqUoZ>YVO}8}s`Y8WIl@^s@jzc4$#Qklk1fYj{7pP@;k>_5a7N*ZxR#00tgdO?@{N zvH2sD`q(tjQOWhYRk+6A+gFua6UaWp+NOV1p7j5oF;jg!I-~A{@tl&rbd3u`Fxq*> zh$xB?u_$D-*|*sxOQq~=bFI?#EXUQnLpgi#hv*4#T0Ji9nEzK1_+Xny^r2<(>93(> zH2a4O>QfHxb-gy2t1Akqj>aK%|MRLI4aF^Ul5Lt{-0GlbMk~`%4}2nCygo$l7T{*q zDshrMANXukbV8=rsPo(r+5APluXXZJS=RQhz*oB2ketFuELQTLNU;!Ce*O>;9Dhi4 zc;sWYWsA2^#5v}zg%Wss1}U^gB3L9E6?_m9vU3s_5hYk8V65Ec0&`OW zmrYKcPoUvV@#U6MN#@DbI=jPR-tAsqxSw%U1!6}eqnso@D!|)T+O@mpQ!pU{+eBUP zdL+MdQEt>{Qf*2=r?~Hz5^iCgI-D+)KDg?$*yAM>iTqYfD}EKk4HuT(`x`y}`@PuS zG0zvOaDVI;*6sFDv%{V=UEwc(gw9v^+PIFAw~x2zi%KGEn69HtLB7oXBDNuw=W!Te zlb}^G8G1;^d?;o+zL46ipTZ?}N26GmAw|U*jx|Q>+W<71a3Ea7Gsd7jPOo-ExS<$N zKh+FI`C>zSJN+LYSceNC-T*RvEiQ-mXuIBq(KXq7!?q)-7ghu;i@l)o&4pgBqvvd+!iOTkfEAz8H}xaWd-G(IBiyTj`^jrH(sPK~Oh9u@q4- zBVaCGa)q*rQ}EhfRI0h{vVH`cN7h8m^>h76g7a!XTyNb>!>cH5>&rO#P5Ob)_K(}A ztnpTPCRaezp_%=Xcl^Z;+z82po9$+;OP-DFS^()wD3Ao z(3NGXR~gvH#o531!jBQ#EZ@aQU6$ja=h{r@@mLBc~cyx2BDTa+t1TyV5Vmu`2-dyMjNc`|4 z(+dE0RFjVZ$aiWdQW*}wC)S9@d*!`2gu)^NBbzUL3{sx4~p?i+@qB(p!^k9x1jUKKZ{Fqe0%;M#)Ahj%K7 zm18~&0mq4}Gr2pVDSa7Vw0+z6B4}DBZ$pxxok-!q5^UBxGGCVeR`J%=bX>?+%HN|e zBh%+5L!x)A=5==j*abMnRk?&mm|eYZppvHCFBTBvyNRZ`dSs7nm2Kp14020|yys$< z*%%v*w5PUz*xxR&Wm#!aF!47zYV?u93$1PG>4k4abGCEv?Y6eZ``AF&*JdkrO2~#Q zSb2Qm&(jB*CxpCi&MOmiP(wIf!jK3#VcJ_?GnG5 z@BDqOaFpfUC`J&EaPlF@#LIsf44ZNe87==PM#QcwY|~XlWgL}IM%jSnVDVI2s8tP* zS?Z34UTFOhLwUHSR+(Ths{IQ3?u}H=1$^P}1zUm%`3y=X4x;JTX&{5jQai4m7NUfR z6YtYA8FAZ7VOD6VW3JWs^cdCpz_vW82W*1V_vS~JMj!0j^@_brVphOTLA&cW=Mq*O ztdOVy)Og>Z@L0E}N?U@suu#LPxOQC^q)pvw>34a4P@5ht)ZU*pKIQ1@&vf=25|w43j>8FA6-=FITP>M zfs!|^F~v5xyMh{3cbT<$eXNg1Qbio4_R6mSx#yOyl6_|MyK9D%rk}-$|h5(r||#ys`s zN}wFz>9q@M@Q6nTwvD~YY7ApdS$}s&q3((E;5P=xVk6xHEIAkKY5UY}i;*<{T1a^c zHGf2pJNa%lZ&FXPZV_BdrJz}D5vt$lkEuU(9sxy+L~@nU2I(!g>hq4kw)AE!CFpm{ zx(fcfvs8?ZR+yL9+{;Ze4Pm||Ih#MK<;Z+ZQ2A&J;&`z$kVA);-0wzh7p!(S%Odge zvLjFb>)U(J(C<*E9$k9XPBl40@VACmK2G7S9ix}dZaR?K!b&kEkC{?&muv*OcGqa!g2yis%jle$R}z_XBlPZ&TWaQChknHoGx$qz`OtD3SSvs zGu-rnN-WHNqkCsAp(Jkz@a_Ir!>G7EiWKnoPk#;9*;5gO)Ht`v-((EpN9b(=Db6O0KE!dF|;HSTa51GCJQZ!Yd8K8LaOk(*a@mR=ixDq^J#L z*67ll+@DQ}ZOUVh>oPhcX7A{KKO#IVIQM=!3$5{jhA>*fNQy|W=S0GQ1E||figFb> zQTN-StS(9cUzult98Yn?$SPYy((MlIO46^Em5?a0sIzi6#Tl9p`$|7%v`AVlY?EIX z7<{n6+D(Y1AB9|1uSe!V0v1%n)+dt$dWW1k(kEG1?>F%BTL zSe_+JREC$?-<1u$TEzB{0etj&SGw-q=+x%5nvdp3YS3$3(I#j<+r%-!v2R@nYayk@ z!n3+v8n!;;u%)Nk>T!h78w zD#aNN|0~Jan^O)r79MX9{{y>siO&Q9WXbx86mi#!a0GmcCq547`vD=@_5Fm1MSjgqWqovw#s%eW|rWK!@|(w%d|D|HC5F`;b1BLD=x6{6)Z6&5#09Ij$IKlEK}OQG;OVrXWjnk-lmP|yh#Qm z_p142n|ke20AX5k+(>rI)q8j=C)#FGfKin& zd}JVgB#(E0QlY2acmBS;$LC?sF32&)wLfR@4xS}VQU%#_F^sbT?y4NqWM*XsQ<0yC zD%i7Pfj30?H-o9?Mgq3w$iO#|*9YtRK$|bS5o>swVL>zNaZJ)Ufw0x9iK`cLP`-Q7Wv?7Ym2pCQTe!qqCT9NOhj1HtP?ZRHfp!Kz!@+5qOln zzxm$e>zc#-ajA?&*n}ki_@Rk3n|d2`A^8}8cw%xEx^Q#TL}|l%f?{{U~6OZ!PBbFP1D?LcF~8a_4c&r=Mq91ApBgc<0gdHsHUdhTLWE^Kr+Yt2FNh4A{TR zTVVW)4cG2O6h-}S-dceD9}}CS(trOAq3T-JC!x8Y6)ml)Sbk;m$0|L2Na=aMbgZvq z&ypEOXI{&^x+mQK>m>EDxp`*L%&jS@KWB6*@~!D#Br?HH(Kh6UiZ*7ob=m6hdGpo1 zYZc)0+xJ9buyol-`O28K!3D{?N0k;4hNpN(6L5T}7Q0+cS9I7K6OlCJU_NMc!g;R< z^=1z(zk-lD1DDwyQ;_3$7y923B0Yeo479Jf-T~kDcHHo8vCb(FChZW!x24P$+k^@@ zT9INJa}@RYT|ko!cLp(a`E@{9@9MBlphr?{kEDWe3l zQYLv_?hj(>N?M<%9PVfc7{@fOhf-5|9R7UPy@n0D3`M8#@ zFFC0m+F0RUs`_I&oayA}c1NRG1X&O{10GSHlETIzLVk@ACq#NhRA{4B-?V9`umOI> z4z^Ldt1ib-)ogL&Zc!fc?$~rRH|-kja)4%sOQmL{-jVpJuSfVzd1$Ri7{f~O$eI7V z+ue>vy0j+D84q`s>k!9AT)O!d(EBbLQW0qZW7w+1tx0Q=0!QsMiNX^%8=hXLQ>c|X;uI`*oXP=+xYIGUk)P0nIUi7*ap;lNFeLj-~RAg zO&G%XAW)wi&wpx*M*!VNLBcRcGfTt12z*hCl8pR>o-2ZLJOVVh19g|$_1EFleU@)B z+cnsc8&RehtV||PzR?}X+X@sSWCW_Mb3J3(9-3%bpUCsLLMh165j|k^`(5{AV4w@En;dVuMKP z7B8LkU8xGhyZdSeZ9@B~`CcKMA8cb{^Sd4hg)ypNhMOiQfix3hGcEvLjsTaRv#1MGY6XRm!h z#zbRQnq*LdvqH+Xf@$r&cVY_~@2aMvqY< zYOTy39aNd(C4#S9AWAUGzGf$;=)EzKbYH8l(iIgT&IZ3ImshDJrA7K6%8TYu$Em92 zVowle?M(B4(>uKDXp?=LLp2sN&+qE*T=dDzmlW813OQKbY7m2Yfv*c@ordJBJw#~* zd|M|#cK?#?+7d$#I2a9g+#3E(;1jN+uPYuy3jT-@?AGNMM0O4t-k2Nso7^_a#r5yW zH2uBVrbpHg2V|7_P+YY-`xC;tTZOtkhUYW(4&4suHlgVc#vn)wRDLJ)?W79%MY%>K zR*F&n;_Q+}Pv`TCI%I03JUje9D>1|orY8Ra@7i9nS(j}WLJ;=$>G~1EQkvD7xJlt!7hR_jNHrEgMB&@-oG(y4u|(4>5J2n zBCmJ{YJO0?#{8v%?tEELJTs%MR<=hmVNQcH56<%!TY9 z0&fao-!<2?3PE>{R!1xR=av|G#9j6-I)l~v z7suBRZ7blXMueP##49toXScCGAK@;|pE3nV(8Cl2z6%aMi?&Sd}!TPV&v2_*Hfmpxr8D?&2BF-TWbEz zw#)x%yqYepUW5aM*z^w38|{EmUGmXj(c9QT+e+o3Z-z)lL6W>q)?LatQHXj5(-r z$;Gi&)(0K?l=)OV_q+A{Z4v%U6;x%P(1oxwq7`M@k21;%oI$`t@}MPHMGd3VmFG*o zlicEFW|R+=+Vnx3wr3U{|;j=a7a67C>t*{lNuj|q69!F7F_G=H5@(|>BTtQU08l& zx3rKP2?{j=Ux-3PP9z#@Za>f=LrNu=Hk7atg|F1i2yH0iuH0({2Ja5@H#eDaClwPucPL;K1k`^vXo`E@5l2H;F@Q8n@4Oqr#Q*Th6Fqu6`s1gci zTn_{)gU@n>=kK*;9Q6}!w^BHzv)0q>l8KrX!@5j|jzM=TP{)mG`8bFG7$? zDO?KpDb^SFmt4G<5EN2JvGnM+I5nGWjAg2dnqUu1Z)3(%1r8N`PT^r_i1(oSgdp-| zrY;rXiLsfu_SNBU5av?;yOHbs( zl8r-vL9{vceo2Ly#PHb!mW%O^ENDwvrx!Jyo)jmE3f@e&E<^s2oJ?rMMI8w89Dw=_ z`|kly_tomMjv>y_-dO=Y0bWXnA{B?&j?HU>EkQn`^*j^1qCZ~^gGIICBR%7R$vdQ+ zH&q+T85$-@%1_1cZQ@sWj#JzA6VnC{7mNyb<`x9ZBH}{=)M~G{9)05v&)bt;DDxBD z9Ydb{HgY6t-TA>zJLNv#M}ecOqf%Z{lWVfu&w} zNfO$G)L40btFDd&ET|r8p;sH)Ivrec`X!c7DKW7)G2h~#4Vp4Tp&3bEGi z75y#mrIm#DsKtkd%>nlEDne?1gD%+c z`yuDH7Ao})^S%~K;4>n#-fl54QD;(Ho+J)nYh93*9Oc8x*3kM-vU^*n!?Tks);}@GwL~X}v!F`5 zp%l6yMQ*!Lo)BMj4tGbFv?T4nI=y~Kai+aIxxF?-=M;Fspcmnr2fB%LC7Z4B`MCKdyqm^oS~zD@05(M**-{MvT0@;)P4VM99hW+h5Sa(btub z&Zy@KX!d8{gG7E3ID4yFo%2UH)5VKWi_9w^jtFx&g}lNO9dP@yn#5Ym*9t;$IJn!c zfmu&0Ok{o1A#HT2=K}Q&Bpxb(EC%oA-fdobLTh7ZvZw#4jI!N3y295&B3>zQ64(~R zEp2_52`kjW&2rY-L1Nx7=ta#zbjrUKWTd^@F03u53X*!NDo9!z&%c{Wf}3nBX8ZIn zIe~bs&kKt#*e~%`%OiZRx9WGm&20(Q=fy!uCO3k;7KAJ&x`H(*@aM+R`}6)nyFsTx z`O}Xbr%j)@JGK$mqSdPd4o40tZ&p-xn;37`^v062)Gb5^RiILLwtYr zVLkow3nS$~<#V({^u`ToY^t?q;K|4wKb;pZ-?6qdf^$*@$bdNW-ZcY=7;~s;?i#Xh z3+{}p%Y~{XP}|QjuIngM+sU#M+Q;_7sG6%173|*`Pm~ei7))Y?c#P zYZxgq5R!hj#P%>3@Td8}&cYn9{uh6(h=1UJW7<1;|1VpdbYiRb9lodGW4A_Kl0T+5 z`F&dc;SVz=cbaolZO*0LU+z5`bAK}ajhyaVC7bSljqO%%3%4pdoB4ZKj-X-G?tCnv3lc2Z^^!D<$rLjLM1^XyTM}01FD8GuP zf1%u-Z`6Y*2wthh=>%Y&Fu%hjcxP?B==L#|8%&1i-A(yEq`GY6SC%4bH_2k8;~BG! zf5kp2XUO;SBmU}5njfo5S6>5T>&d*zF<(6rRx>}u(sH2%-WCQ{l)rKQ_(4}+ALr7e zm%@$v>jT2;5&}emdw1t-sXZ;qd|NN(pp+00H5JyovUl+-CiINx{E2V1;=5HjG2b-l zfDwrB$Zc%4x%7)JOym*D31wt^U;d7pchSIv8Ev zielIbE4u2@pP{J87YogsGbodT5w<2J*yjo@1%`i)%zrcRSKoSnc306P$-Ld`MB_@& zA1O9y%696E;-gbWzT?NqMUBVzTxxtk#D!Elc$z6ioHPwp_`x+GIU0#^cZ#lrB-d>k z%e3E9De3!e$E2Lc#+}$mhx*ot6Pv(ag>tS0=A0q5ADGju{W!|FW5I#@D6d0jgYADn z3@l1V89n;sFSpugjS@*+Z3oGuF)||cDIZF$SlC`Eh$5IZBoIoI2!}MG=ZU^J9WGt?S@H~kILK>l7-d_* zrv!Wx;gKca>iftPvpO;=NOVv5b1^oie8@m29+rdJFEwua3-v;SHQ96&TWW=8WQA+M zLB5==ceqm!R{`QheQNIRjxNW`fl6)=hGy_Z_>k@5MQl1W57TW{b+8D z2M%nv(h5aMv=#Ip0-Hc_e8Uqhhm3Aa2~4%(f$M3>&{iGs@&>QnP=cp%JT^-X%)tA=v?gJ0u7p=S~>6>e`M8h_5X#zMn}99Py+F{lvX-UY67xwy^-qj|_y?U93Y zL@!I+?`4;0)CDYR*8c?WnQ< z*YN6gpm68b74o&Wkf84u)+PS&+yMY4Y#(JRXuEleAOO=oiuxd|xS{uMq8~goZ5#)P z)##eOB*!ii^J$M#BEG{YD@IJ%LDiTSi>5<4pp1%*+v_`)_`(;j=@qRrD8+*38>W9; zl99iRuX@~t6~w~KyS+dHieCoZj z%%8Gm>6^AiVFw~WQ8!>kVtmoHcDlt{4MUDBeZcc;eOED}KY#W;C-v`TT!HH15U`8i zQah1>CF#6<6#8x4VcWLj82Rfh$j}idTbC0CdLsOaj8$K98PnFTSjYMAIC!=^gFLd4uIhY%u<}ie*ClC+jj4NmP}|3CipH*g)k`_ zudwueJIhrj%!{#R@?TztAGB9P{6eM>od22E4Wrg5w};{TAVqo#UnDc0VpFtcLZ2NA z2St0)@(D&ek6gA#b1o46J0p7InH(W?17o!R-$uh*hqu2^UD%x4XC~~JaR+M+5fcOA zr&p}0UaBmuP_81?ai2R$mjp=dE<>k$5D45A_B=&>D7VzHs7dv|c~r1(i$#V#(@!|Jrq<1EJ@-Y}4ZpNpxW9R5;9{rk z!3gXJ&Z%9%>X1=Q3|mT~#H>H+K`y0OO13{Dv%A^4X~u$Ik|CSH339Rp$fBRyqaJ#e z0QDqC9wWQM2+c83^vRRYJhg+p`}5c4zIW4~D&wVuihhLQtYmmvOA8@J(`GlfPt&hD zd^ob;SN#Z13;S2m6Xx21-u%<7b9992ME~n!q>~j>w>QOZ>Hh*F0b$|QLb)lc&TqYy z7wu$^Dc%e9F_YuS-8c!8h95M+M8z_&gZT0fv55}iYe~(wSe)ZY+2GftRsj>a8Ue4u zlBwk7RBkh92DR}PS$q=GuyY10Jhz5=rK z-Hy+TJ|pgUh}Oe3wl{|4NZ=(snlj@?S-2xv?!NPOkS1p=9d`BH zb?(Hw(Y{&Do3!gCaD8VXaj`VR%KCgfL*Tb9{8UHFSdL*&-x&j6xgeQ-Mh$>`1}m_2 zDdD(FyC&n{vS>uljGdyRa%V|oPSc+rn|k=9_lwL-QAH3ijv~4~@Z$3?bV@Tj$~-1dnvn6CA}r?z}B)FknzF5tTKwm)uMYNb{=1wB%AF>0>e;lT@-=_u9rOHtHN~5 zPWaU*YOWOz{UEfnc3@%uMC>YQ?3KA|07NEgZrL+%)N8i?Xyh$$T<=c1Oii{S>R(^w zB;!TZ%OBK1Xh(G&?VSI=C2R}8AOGCQ-;>yNn?YGyZZ9gAXV9w$7aGpRV0c|+fg%FF zjc8yP%D5Z)M)RdP^ydSwwf`LZ`Hf49AyG%nZFsLa7Qn+rl~S|+ko(VR^3XsH;@fax zdvGw{Ks^(f+M1fyn^L#r_jPofY&Rf=rH0}D7{u(@Qq4;fuJeC)cB6CxOA{IiwF9)m zceRZW%G@;VDIzgMmYWkW29z;~aH&_WiOHB*z^7{D`gMHKb;aN8 zgFbyi3zlyWL2PFu7XA-OXC4mK8@KT+5kd&bGL=eYnIzdw_(c&TDp{wJrG)Iuj2TPz zkW_X<60(!5Gn0^g-`8R6V;Reg8MD6L_xax%o=_$;ma=?`HO{ zA8_;KyRhx&FV1kFr6UIq-bie{UcXLC2!1oLrt6{04R!{iWoy;Qa2f@++{a~fsI=<{ zujhf>qw1i5jH+o>Zq~{A1+so#Z(Sk!M#YWrREgG>_MLxiuW`OOmA718Kn1c(Kv1E& zlo7fir4CGN&siD9MDm#Z;PvPpv`Ux1Q3c*lL0hAf=$liRxPWU*qKsPqe3dmd zqeK*1_fYT*D{?pS6?zQ?COpWl(QZ=4;;{P+#k(H7WJT4FLGEni7h25{OR+1H*hnZ^ zx2c~+@(hlQT3EZw{m$+S`DT-|38h@nnf{6DZncEc%Y5i?+h8SR*_eCTY2Twn;SzRo zgQ#J6lkrKkLubMtqe!ye2{C9$En%LFosip)3V{mzqDbwU=fGaf_g*rK-r!bUk>1<< z@}b$S`5+CH%)RA3Yd{>mB;e5db>bYP=N?wWn=lu^d6X)fJYh^tjtnb>nv=)QHWVhw z|6xA$_6)j8Ru$ZN@sDk1?1!ME`;^W2L6NN?#)5*9VU#jsna^VTzrq|cNP5ID|6A(g z)CVlW$z!t8WQp`u%ysb%wcZ4xC*CGDK%J02%{GtSHd<)cJ|Ej$JM7}ODm`#I8r=7> z`I+MBrkCpmzs%7FKKw!USdZr}YVTg$ma8c8+T6vyDz-`;uH4k;r5&0BeVI z8H$V$(S4)dmxuhT&?gn%11e36+y%@FxJvCPZQ_JOkzB~fjW6LkE4!FEU@A;xSs&mh ztv#9VGl@*n?Z_}gmV_uvg$N{fdpqi8TT53f0!?%7yry={^%8`e8-)PwVr$R1V=F8i za5byql*aq>K?+pqxn2zu!(5kt-v7E^Z`7%YL`O9P*TH02&(dbHS$!+zI`teH=IKwE zD0RtC5bW%J#KYU-nE-XOxiZwc#7w}&a-2yBbF<{v2GffMu7*$#}&R$@a zwing_Gj;DZ_0uB8sb$NkVhiprmE$nch}uohzCy5h$;W7tj^6r|)0M+*^gY-ojG>u4 zKI+y7vSclrpPA{(+`rC?@ZjRVofVaz84*Bz@SxFay?x}xP!`W&)~77npB%rgF>ljA zt1#>v%7_P_q5@-(3R|f7Ot)$@V7=X0#(WKlVLko#VN`OmY62i{k)J-sqb%nHkfiyO6%&4<# zX=>Cs-Ov<1SV2;tGQZFD4ovg9+evCLx?CCs$@3J|PlF9HwF( zGH)F&_s;CC_*PdgMg=ll_zdtJu6-`T0YIN3%yVgVo3-i!m>eZbD|59xAq6%O2af}o z^71pz-@xpI`rz!;L7CZ(Cm`lPI$>RI>?fUk>mW*Bq#a$m57M&RpSCB~nEA_j^etV{ z9d+0G9H0Yr)LC5{UC4Ukp4+mI^t?zg431Hw);~7fF&HOx&$N4vX%zC3hKv`ppQ_pN znZ5BcuZ1Dg%VHCo7Okh9^Z%e5E$ zVva4x+JD^ES&tH8M2jM2&Rpx@* z*YCPw*J|C(vL1Z8TRi6xw%TzftTBM^=J8-Q%SO&cPF))Rj|v5g0>4y8i5ZPcCM>82aH0^*!|CEdCT1B#8=$#%nzRxHzTwNH5q;T#(xa}nk*0@}8K3(&Wm4`50J59a#{8}&- zw)OSRDE6z*V2SQs&k3h>wxRWeO9)jiMEAq~C+Yj=Sjw5jCGXU{vYE^9wLwsZl@?ue z#PiL4#hYsv*RGOUu+O=Pd|bi-!S3sjXjw$7PnpwMkpU)82&<>VOJDc*Sm3cOQCibG zG`E0U(ZSmbQZa0s@v|7*53&lI)(!~!x2+?4Z$9CW=P@@x$aVQu!kOSX{3#o=O71yh zPV6Zq2_>An*+R|_Z9(C^-}iWKTO{#*7FSw^ALL(+QNO3W3`Hc|bvzVXv?@L)*uO7& zbR$JO2D`<*Xw-nnLD!4PnRmkmG=5m&be$hY5SD;=3#DHc_h3o6L*JChmlh$@qSyAn zS{UwS^)+=hly)s>Z^_=v30~v-JD)~Mrt-$Clj~oM=6^mFLh2Ot+Oc_Ixl=c7qPKZ? zB@4>G1IcOANs~|6ts~XPIG%mXGG5+<80At2t#i?sjJpj6ieWbXw#2K@ONeO+be+Or zr^O)4@8-H>3=Ht=mru-H%j_s*m`aQB!Gc=G>ElM=CO*eJ$EW$?5++#^nYk(xxByky znB=Hr^hNCXX!;==Jv+{5KDV=tY z6hE`YtO&0a(CEl7&7ieMg+rLgyQ&jE2@}qPDtWc<1$N27`jAb9L8&=@rZAw=!eIaC zRED+mU7+B8Bf((aFK>)HM5Cg7sms$Au-?u#IF(=2 zx|)6}p)ez_kw%i+CydBvrFvOkFAk_Rjh3>Kkb9JEQ zt~os?AE&xp9ty#?i;NJj4P^G7bmgZ7e<->-+VtO5EZl5&V2EI2&9Rl$BnvUfv5D7c zvzK|0MQho0H&`G$+?RORws&}UFjo+2j@ z&q>fL{V0c%`!y7H7`VQlFJ4EumEGF@Yn0(;N7CjPHTCs>jt%pD#Uoz<%;}8wZ(Z+Cvj5Z z@;qsobF<-y?5mno646Q7EK7Qp zT2(wenm!8Ztm!T`D87|IX<6P-<5RGXVuZVkx$lunJCdkc#Hx4-;;R6rPZqE7TAtor z_Vf5H0cVPyz_sp8N(ZS&`jonkG4uwF+oRh2e)6pb{K57l50dCzGeMm6@Qcs;;LAdk zE5Eo&=TKbVARXK^eaP}amF1j^HN415r6W%*L_P3@F3i&$!iim<6>m`faIm$)tz;bo zpM1J+UHer%|4#UC`Kq360-#W5& zdq{rsJyK?_o_quem1ZA=wxLWi`A&Ab%o}hIirb)|L_M4Hj73V)-KA5E+``9ltPQ^+ znkRR^Q<_#_wd(#a-7GSxWz=ezuleZYq*CYsFw%2}?aRQrV91q2Lp{VU54i;Gp5(wA z@?$&W1FY3`{qQNP-lt-kvrGUkW|u!yg6TFkNJT4 zIa`?Zr7g6SWUQBarlbb;>Si_9)&jMy40O@ z{pTB&7*>H$K5v)H`#7GS3;@KV`C&f$!taz^zXR`ql-Z%Q^v*(lv1;svCu?#4o>)=uf&nzj92p`gP`I zW*513_7?1<*HtvqgYw@>bu*TqF+|M}U31X8(ZQDpQ`t1yXae+nLe9{&kF-q#WViT+ z3F`169h=)ay0(8c>q7~#pm7*KB4s|Hp=TeoCGYq^#@}|zilyXB5t+0# zta8FepvPg=3r0xUB$ykf09}>S!AtbIx0>a^Z-X?!W?mr-fp{V5Tko5Z`~&TJR<7jV zozR-X%N;*=jeUzEs<|zcYgm?8Z%YC%ce0NHR zjoQTbe8PZz%xi;Pv=Fpl(y%K_;2p*7@O;i#y@+{s3d7W*Y=d$U2Dl?rpaGDUe|H2M zwWgv1K+ni+`D^XLtSo+g@a-F8Y2~aWwy;0mZTU<~! z0Y+&2SndclO81;j1bnP;EWe%zGDyP4(0f|jfa<(+>nDN$3_gZQSEr}#L50D2uNuom zZfA1{<;m{m!+oiAzNgTbxrEe(E^T@SSkKdSij}fb$W9nA6;J^i;7(>-M}()ZrBxKF zOl`KNOp=qThdf)Mp>&$b`ZulKwd>8|uAAKpkUA#;&YKmaf-UIvKVR0UGK6S6k9cJ$ znWO7Vkm8kFg)29j3%d@=LV$iR${%jL8frf77aOPjZ8+JRLf-OnKjZTx$*J5}ItY^T zB%!`GE#77$s4^|+3K^$$_syHW8s%n0kL-47&|kY-w&8Dn$qo?gSCf+$c({}czf%l* zi(7Xl$D~f|m{)>pSBLY%dMkX!X%n~RxnBvoHoUsz<-3|9c1~Z)h~n*W1}>(I_|V-e zIhNe;9b#`LlcSQH>iJJ;O>Gmk=YkV}@Xxt&KU02o;8yUc^8S4%c(HxIFzcc4 zvyC%UIo^*QtDlU@W}c#4{>bMl(*&5_rbLrU72b+(;>65yN}pZ(Hecf${S# zZ+Z)1TC1z?h3Q`~t^H5+F+ulMSCNzv!KRy7u3CYr9nqujciKpA!?6}}t1kME@19x? zmTUT}+1h$ZrybXh{!w=544^Cqqyt?!AX+ohM+Y8lQ+(%@7$3!bFDHEj4$4a#XZ0EU zdGFQfcvX17O&IPV@E3jH>RMO4PIBNxiG;j1KSiJRiG@CwIGTb-u#kfjfAhu`b92<9 z0v%hcOl;yEo^sNiOLFAw1V7A zsg0ocO{I8aOxt4HDqtC?8(>f(9L&M+vE3bU0WpuE-t$>0gZ6`#ei)bu zEZtwcv|oLC-9v*?*2a7yb37IN)YDe?La-zN@@U}oVHI5z`c&pwcr!1}nz@}n#=WwP zl6V!(48!++_DYIMRqzoq3aAmTO7VR)PVa; z$Ki8l-@~P_{N255ohAIO{VJpTt?;p}msNZ-e;s&-cWIXF-p5plDKkZ);Hnd=6sP=#u+-wSCtc4FMhxRPMP&~i6inLrn8xVzH9mex??pq_Pi&%f@ zVC;eYMI#&9&3P(_H2Bww4oE@q>1Bc`(oQZ6mxYj-$@w$Eze#X-vBp8*Z%H2%J4@nK zA5sGrL4K!Nq2>xY1;^h%jNg7tpI_9n;>+QP3W>%#zM#ZA4y4b>R+Ti!fc)xgpzf0O zd)Sb}|L>7~{J%Z2LC3{8u9tga&U`9)Yf$|`b;jxOxYaB1RpX16*73BLJOt##tn#RIFcS4jJtQ+=>ZkNRlS1ZAR$TcF6W)A1N>s zD@r}N`B?)CjEt72vt`p_8IEsW1o&2)Be!Ef7*yoX5F@@X+3tH_cLP{M9z{#g1#1lA zE2vu(>;5g&HgV?MSwnhDAkM@;6gjf16^gIwX%pAEj3u4kFF;?|*|OaNo}9$~H2sD1 zpRvBivV1rXtafrU$h3CNC~v!-pzzqH-r7~6q#d0ps_+=_+Zol1z92t;lot7~^4A4s zqQUcd2fmeA6|tZ5NxK2Se=_E;vuau2N7Uh%#syDN#Zg#>bBQ_ITRT))DF5-=Mri3DHwj=2EEPL|_WC4m>1j;#sngeEBxjkmq?@N9URr z`29Nt*H>MjzQK(=!II;1`lQ2abY;g_t(zh&O60m((xrJ-87+U6P0vqL;{NAv^Y8B3 z6F0w_(%pRJ)k3(H-u(_NwPW!}Uw#})Zq;fbJVlq*@#u*+I7aqIddQ}pv04e(@{etk zQ)tZzkjcI}d)4Fc1-)meaMg#O2z_V=dmY%sRNaFbx6DXc<;hB*PHzf8BFmRodA(@t z3bz~cCUwWyU>9N|13@Y!! zRu-aL&?!AWQDX+&@WbaXoqSWC2uY(1t?=KUK7VUMOqn^OGgr)G`1>MUrYJZ|AAl+k zuc{lGz{`u>P$CRX(S`YHi?oTNnSxJ6*01=g&T-lQ2meC|FMGmFa@v$wZ@=arK{(3w zY87gFbP^~34ea>NZJ&S7QKuHP32e&esF9|oFD2UlZS>MTCylaxNT0n-AJ97*5!?T5 zV>mx`eR;}9#<%M^)_{1;G$dSlFRMA;q*5~Vp5Ti8V2ViyakyC~IAh^;-s1sD=|jQ? ztW3zy>?b#!m4brvO%D9nk8<4E0fZMJ^H+%Dhu01#E!!YaGp5T`|3KxS30~9X#QTv9&JDmc&v;n26CKhJUcf&6_Xtp!>|=xz(A$xIqg(b;X-5GdesMh z%_4gVIOHcEi;& zBTg%1vwLVpl&@M&5Q!aaNJagCFA(n>7&k&h5V29aaX!Biz6+z z|8t&u3tr~Aoh5PON$5QMo{Mvm_(B3?}PKA5JC47@7MKN`9bfsOFxzu3i9m&%IN$e)!&mfU-;*F9&)uX@=s+q4j09900 z1i>@q*2hSf*H+PT@UtPgRrDJ{9fN}1^TLe}zF|h(MgYc(qjK$4+Ft0kbPZ(Z#P>6A zAMvtazCYb%%^KomNM-9LNPUK-`&<{~y;3b{-Qvw;8VS8V@$5iITJuYI-5hV#()Pl( zjcs7&1FT%ruw1v9>0JQvn!EJFS!sYTF&#ZLd;Wgbwkw^gj@vYCL%7LkcKwIQK%5<@ zx|Tt@wHZrxNMvoB;eP*!X^biZPJy$4jg~h~DcGI}))m#PjU?3k3{yexXVt;O$3pO7UYp&4vgM6VhJ{~$TmO>G>zusA zjZ}az!M-y%F`~$57SN|;Uuh+1Xe6Vv2Q_Q+KNmi~3gnWDhgW~99LQ5C79(ra{L`ZY zf%$bF`T+!=$$*EmBg+94@I)v}Woz-piI9Sw+4J*)d63(V+%HpC(FIZk@N}mlNVmKf zVgIh@8*%*CGDIEyd;JB1>`?Vnv%KKIe>BdApCy#g5M8gWYd5-gf&2 zSSlNI+qK-XfmmbdS&X6M)ZI4X4>2<#a?V542oAjdH#qQf zrK^N=Jsw_X30bK~Tvv-iKf$&`TYG&%kxNBxtL}n<$H}$fhaS9`rT;)0C}qv~eBfw* zB?KFx^o6YRr{(Wq`&X5_+Zvh^NrHbp^g-A8`7SUeudVc7ESJ@M+L+WY3R~;R z>h#NOtL4W{~?-`lv9WQJ1Zjod-q2@M!(&<<2NqVC`bGtua=kNH{Rf#S0vpX&Wn zyIhVxTPUc_#j-HL81${_)5{!?zCL2xHW%xly8tJa7sSwB$x!crJzFpi#QZC>lBADX zrGo!;RLl8|m9}deWjvF9d!(W%kS93Cl#0a&P@k5Yu^()J`bzKn272&&MGw}l>M=eG z<~zRbfZ|k2{tmob1saR`mc0LFIcBh~nxGMDGnq=!T3T>>acxiZzwF+-g~LP%fXa=^GuYrIu$7&;{m>TgaLw;=?V|4Wqmbu_W0qN0^eBMQW=yfTyz@wL ziIcTha4WPSa=9*%bWbw2A~|OJA{FhHy374NMNK1t#BH?Tw9>j;MSV?QOGBis#7@XK zmIwj=d^dXDfQdB;mZe(bGaNQD0|ltYwdPzHt(Mm7la29dnadNXEBZea;M&sQx5P3tBj<9 zGWusUfR|&{35v@+>TN+Q#qrY?_>3%BeAn9u2CyBrB1YELI1;Yk<_a_%ZG{t4@rm47 z0TIV#5%>Bf6p05h=+S2`vLBD)Wss2q!XB+ld#Riio_`Oxd-*ty?$xD>2A>;ZzGjcapG(@y$Vl<$qvPzJBA*N2Wp4Z`GLta8~C%{>U^$)q886 zJH;Z^x-1-9mH0*r1lxi}`JUY4j_Og{4_VDAfW{t0R>;CU7dXcW9AHli@MlZK!4{QO zDH{NYjyRM9N2jm1gwfLJuM~rQAp8VTs=?GM=U$EF9_Z!H3*Uy5JLv942H$>z7t6vP z-!cPK+TAFXRtNWL9NwBR2dfy}miza&=JF0?n9{K8dyRanMox3kxJb^pU&w3VCEOKm z1o-!@udR0Kz6?usGH7x-l(7XgzKqbOtvvQE^exyqr~48<6}F~qf6qQx9zUn#RiPCv zkO1vCf_@uHu(^z%dPg--%wj&WH?X%5WZuh}hKYZ)di>t1?9Bl*y0JC7^xtl-y-}b_ z;g>-Zaoof&mynA-o+^ObQ7u**2lw}-*89+=9F?8|m&#kxSO+FG?KJe+<~zL3J|3p4 zs~N1@I9}O>jlWJ?n64~6a3tCA-m1{>OJyqvnuC6dRY1x;j}V$+V@g(igBW+a%rTDt zest;svs~Est90TC(Y5K_*|*$+SHRSVv=b5O|=w(-{MU9i+ojX zrTUOHD;!vholxiQg6c3kMB;M37v3r~k675Bf3t0Lv#9ohS?WurI?&s?%(FV%9v_ePaowA0Lx%D2N;R^24Tqm` zwVs+cU}&I0CHk>k9Bl@&em_WI)z0tg-}ns6MMndErfC$iTfb$*j3~R0da}F5MSzq| zdDHV|_L2%9L(%2J3;{+nuC3X+-^>M@7BYFAsIqUl+B;mfERQFu8fr2UoArn) zn+s(Uab=^S6~+h&DI0EwUry!D0%x&an+f5C+l+gFVSbroJuUYi_yyAE^d@&uk_iU| z?$-N24s03t(>{-o{EZMx)?|Ea_(-S=E(0%@J;XS^k2^}2C%F08%fSoXdWU|&s8Uyg zguPzuT9&b6h;W$raPz8=_#YHR5|l#ETrB>~Px!!*yo~)DV!#*f8T{)RMYT&!b>>$|As`cr#C?ZlO_4!Q}6QZUfkse(*;^$=M#^_@L>}Qk7wrYIZ)5itZ0?2{ObLhD?JRP zBM|mpX9vR9H;z>J?0|0ZjLjC6BmDHtdwkDu-h52I6?JmoI1EA5gUp^pfXDQ=U!+C; zr1{bXDi(r1SuL&AiT6$#!p>I1uqWh~Kf0KpBZIwUm=h0|duhuD@@$T}!V?95IX6*n z#;eTZik$PRIypkR$YS`{s6lZ-{X>}u#ON!!Qh$~CZ)Duu3z=vBn(*@ENw>&6VBBwW zllUt02MPM~H)H*pt1^M(&y(yvXxmc6J8X)s0`)2?(Y{Y8s+sq4B;<#n&nLW9Vj#)v zJ7(>ez8lL2*h-KFM1!2(X;{y{b^ta#3~I_$2fu1~YsA-g2278;+b}4|dhWR;Ka*D{ z8Jk5I(2(9Rn*IDDYa-NqIVt7OkxxvIy&#v;g&p;3-_ujgO@Icf!16bd&Y;mqv49U` z9#p6% zNf+*X*3C4syD8?iMAdTwPa93?GPdL0JT{u4R?x7HywtOCe4_38rZhY`LB-jzTUZb9 zqlOR9z}2dEOQ6!kC8=KnS((2DK&D0&r&*Z?rvf8bD^{H=>n?qZB2T_ z`L!&tqY>3JQ<64a%TFaXZjogI-szd(K)+p(7_M+ZQJiF)Pw8|L{rKpXuEOy_Kqy3A zcq#(^b>PDV!tsb15!0L*iHI$V9^qLINPhs^cs+@Tba`baHGe@SP zA09$#t^aED-L2S}?1Il}gu+FtkKTu*&Xu3RZr$2<9|B6N3zEz((m-*#kN(AkfT;S~ zV79eS-r}>=M0%6VnK}xemsQRZBhp;i-~F2=(t5Xr4aDQd%b& z&cDo7>Rf6H6M>3g^5ixjFVkLlh}543m1#A<&`h}0?{fQGg$1(en-Z7N!o+>zNM6F0 z%cw`c3mewJDQrFe5llSc??d`;fD7h0UG^qmK(-@`3xr&Rxz|(y>bo1Zj^ceNaTwo^ zOv_6$FA=++=q^ZMEJNpbY_nz3;HKU20N-^=;S&7C7q6%E`)Yi(=da|A`viWjepLXM z=No%0x15z$^>jWqR_un~(`T-q?|F(b-|IRl?=L4zHhI*UoAp(i&ovC|o6bdr^u5>} z6T(5HjsfG>i7w!ez|*Ly^{ac%Ig!EkuNv~Nk2geMMa_5oBVaR-Prx0HK;h3+1e+TC zDmLNg#iz`cF~!dVLUIh7u1};h0eoMq`xI{v)V6?riPW!X@g*#Xby{i)i;qs|*Djve zdcyt5W$N6xSHcCz5l<(f@Qj**H0z7?!uRauy$Ap8RL0ito?I9{J06mNd<*^R*AI|I ziUcc?PaNg~D#w&P8jxU)cO&ecvwf@)jAfpd+nzKzHmaaR&eK zg!1mKo?m{6>&vG|GCu7AvUr#-f@!{?^a-<%tnLRy?6L^xRw|6gs!L^nQ?{nXFY{U5 zLcqIr-Fe{ekIhT-`JTHUw9AoQgk8ZsA<@OmXX1gycB*_Up;vdui~+>Lk1K_yd)VnI z{f)=AbbsF#&$|K3KFmqL11Sk2kpp@ah3`Y_Xf5J^h=r7&Y!n@U;GG0+ zBi8+#`jgAjpv-!i%!OL(;Ya9Rd$llp7+i zXp8_;ve#vK94t1egAg8cryO;pqMwcE_Vk?B;lW1D`}@0r3SP9UVUn$}Ng46>lF_>E zGSsU)+D168eXNZsQ@h3Jx5`Iah4_F-63gb5Q&|+M+c2lF{T8v@_8Eb3zVZZO?s$L} zyd{UF%Pz}D0akDk>vMt;1$x_Cua~Km9t~($$^~Lbc^J1IiW5|;Q>|?}nKbtw0VW;7 zA2?Wavf?^Dfj`=6Lf7wE6>Xz;K5gYvYMJryJkqByw)erH5RD?<3 zrSII@xQUZFF+?`Uj8;B(!_bwG#fwlx;HzzI;+@^Bc{2kH&-^E&ABzw^<|m6g3m{>* z1y%*wrPS+!Cr>1Ad&V@Yoy4O4?)=d%kaQ|KkQ?ZN-rJp6(j>-K$df>AY@iwy66Q&- zrFc|~?m13}Z3E2uE%p^EjuZ_}bh_8S+FsT*ed=oCcpoJ3A zb}B{k{xJQQ)1m!i;x9yA(lm#8V<7XSXGW|@GP#d4GsP&;P9A3!7S?M!%&&||h++|2 zdc87Cg(s;lm1M6$4)};6VX5I$TH%L5=(^e;$?gWNE$~R)x~x>O8kC|ZjW+}|M{%D9 z2I}{@@t_HJb)x+`JYAu9vOq{lbi&^OjWZgFK}HVRQb!J_L#kwjF^N9Oo+AU)rBnN6 zNV!#Zs{M@?2&SHQHudf-?<++^IS8SkO^~f`C6+QlOCUd>Jn2=WCAa?m1iFz;Ik752 znrSZuj*zKZIYt4K@u*SobBQgR2zv@(uCGxN_z}zP@DUycBrpm z9}C7`GOq{5((__qdxt~>FDy^sM#rqMTSs$>W!TZmOKBpuX$jD+W9qRKqm9ym4VMa@ z`=G$T;!v2i9)?u&Nfzq2`)=iWYT$BhM1a89H*72ZQbn}qGM@vHCIwneUg|ZimOJ>Q z`Q_+AH-Q6Cn)ny!qj7j*^>R?F6p?hNW~Y)g$p|=3R&)D{FqNa;4cun;4$8r#r;b9> zQhP~+Sjj^n%#<+W_h7Pae8mIg*``5chwU(?MRnK289po-{E{4&MEp5B^S#LIrLNxB zHR_1x=G8cjtDj+4^4np;CvOmIEr0?n!(Qe61$W{`v~(xPn{{i|i}lInCg%P~eTT#` zj2D=q@%J_|4{Mc7Egnv5tS&amrqYIi+x3_t(}p@%J%g5U+q9zi`2t* z)(Yk)iTE&d9}zq{Dly+c32JJ4w!ZPO0APMVV+rdscK|VZ%LpY|N9oV-%!o+jU$3}R8{<9)sp=aK(VV(ShSPzJO_eP;J9p4adive1mc*kr>zf?;} zsgbxw2bHr89#H(jeK7v#$~)zXfgid}2lkdT`#QHh;s^znH@r|{7KJ_O6MjKW>k-(> z)Bz*2ft3b<1BhO1ULwEC9!j$pHPfE6l} zpqGCbEUM6dRSU#&`%Dc?Hu(tNNqUF*;_Qu8y|f?0x2pBBKMJ{$-5cV3g8Y~yN|*n_ zNNhAN=qDnQ3;s|?7Y&&;5>>gEBlfSm;MJSByabCt2j7cmCvR=Oy>4JXN74QlC!efN zwidnnD9KpQ34dWeK~sJ6A~SO=4;^e-Xz|pOt}4NDbN}-n9!y?0oHfOpmuLW>hXb7s zxx+4sOzHZGHxg^R&_L0k3E7+_4~>4Z`D=V`iyTpzUN`~|OHH_xu6e$NrG^TnevwgS z8-d0I1I>##H`NZlfpsVP&_mV7nIZN zFp6sCVyZgCHvA~97c6KQab{zAJ~UcA>)808bUZC_D1tiXaw};auwdoG#quGh_R3`l zvXG)6NxU|@b;Ug$lQPUnT3oQ1Z~3vj1~)B zUX8hrAK7{*gsE#^fHOPJ+3r-qmC4c}zC7O6Ob*FAhodH8+-n)r83!Im7+ME{?SEag zx6`0@U^1X%U{KgNxvB4g@$Xj;%J}?mTBKKAN$vG2uKZHEs?TCbL+~7^F})NPi=EIHIu-YR5MwM|*~>=c9oN6-W1zUeuxV z=5?I5tl(!rb;ww(btH;WplmV@)iABc~F*B60N3;Ubvi)Bj{Nh8ph@9?lq7u+q zd_mwfk}6+0r%{;hWM3g;(NA_S;Mk@O?}4{?m4ea|5%GcJ1I!Z;6gwuEZ)#0*w%4Iu zqa;#**&XfT$=*R&rHk{nWL}|Mm$L>p-b4RUS(b0$1ntSMhw!p?zU=NdEnFcMV4=oY zrj~dQYZLq~s6xGBC{0t~AXg@v+Z>?>z)ds(C^$4{Rao?|x4l?_MiOqV5{ptd>s`(r4uGe-qI1D^xP#6rPYjht}oA zRLB-D+2C%^=#7$VUrd5O{6o0hp7h`fV*fN%(Q<}IGFP*rHAt-XMP6(f_FNsJJ?S|cCOjPc)&)yVwS_**kxc;ytw+=$ChUqsV79S_UmrD(v$; zJm{iJPBa4gxw#|ODuN}yI>>|5FZWL5&VB2{t#A~tPD3pC_sVVu6|akfD?MqF^QY`L z+*u2-LbpG)FLgs~QXA(Dvx2I1N!u$iW)7;k{dMX*_RWjU1XMhu#E>HGA7ykCOH9dG z_l;81l)kY#e?fe_F5l7T^5(xUPM}N^0XR8v z%cb^+{EWcXJ+Ll5OsdNw80+{lirR6@AG__ZIm3Ut5NAiFZyO&V!1IPY=ZVTdiN;VIgXudYG0oFgAw40oe?U0!zj2%-WztOoqs1QY zeCUKX7WP?8vB4K;kY2nk>F^=H{X@I&&pu*fA?|4ZtYVK-B_a^}U=~T-{#J2rE>Ovo zouZ=?l;fRp<{c>H-iD4vvszA#x6%jf^&!M(OX8J-&TIR983LfJyLMv!D@^tIj+P+` zL#9YURgaHvAGB63SBjrn$~v%TWn5eY;It?i86CdUML{%y#ZwkbO4zX+SVTT@mNY4P&JVL~1q9nGjx<85^~ zP6J@Q&K@~)w%arhoZ>4OH0N8HejtV)S*nDdt}?e?bI%LX9nv53yVLA@5x!v(3ki7{ z?$@sfvUdF^_1pYW(z7BA>TTZ8;`w!$G!*_N(qid6pHp;Un+uxV;BISI?Ap>q*4mxU zFKg_ux~#v$2S41p9apx2NSjdekl4s_rH5jNHOhG^GrB zQVGs>SZFpn{G-{^2=Bn>$%EWBMO`*02Pa69luHEt9?fwmNb6_igErlYRTN)K`H9{U z`(<(g%yJ#vk;F+)TL|*_6>~#lH6_M)rMC6wNC)r1JNHni^{5bE+pvqH)-$) zDv8aG|3d$o$f5OpnPQmwCSQ~=mMTvf7;UI_zRj$1oId zn_kTb&^G(mwU=ZAUtWOwqXrL7gT_%@p(LZ12pt(2(5Y<9gA=WCBXVzD7Oj*4J85w{ z`L{Z;Z&2$TJ=T!V254GW7GX7sVmjAH4cG6ts(2ql-Fd0ArcP5&O(A$m1kDde|00%6 z+72N{?+|5W&paNFgMX%Ggv<;DEdP1B{=1R?++tD=1GeC~0UC}!aq}y)fIcnmyAy`m z;-ecx{Uw}!2|q0(;HmwUv1%BWUnzh1U>742<9QGJ>E(Z{X?25M6=lpV%MHLHQ4V!7 z%;Khy~_PTAe86~lz{FH87@k}@s@zEaxU6n6yc8lxSFBColN zKu!8gj@q`q8Us0@S)Wl;(%>2nv4AFW_&nG0wK#iiM*=s$WC$8;jXD*=otIgGxi}D@ zJel%U7(hnVC-t9UIIA4K@&y90H+ICEs>lnv-wMC}k&C5myxzf13wdG9lw(VJP>(}; zbz0xm=mpGS*&w3^0g!w*5+8uV72pLrVyF4+Tr@URC&$J+{y}*yqYk7uEpOu(gEd~y zFYfVBx~^j*T32(IC}%6RCG6Y2e*=&e*S8j)j$@_t#GBqbgdmI%YJ!!zxU*Dh&1vZ8 z-2g+f@h*578^P>*V$|aD1;^Stc&Z^SD3CJ!skewy+WxWbmq@Jthj(4LUh7QkJQAi#MN?gCb zCvx9n6>#b8axcE@54I#^8nj4Hu26?4M{RL5bd(YwuG0rDvnNfVNNV64u;Dtqv)Pea*Wdh6HIHA?Ee2&o)tslzL=qhwq3L9Yi) zZv9TLiRud;ZD*lP`J+Tj&pg@Mr3d@p;|PO+zK(IwhN(vjp1rDNiowcOUArR=y>)-@ zj8*~2!Lqu-wD&x_?C2$5ZoC6Qh`m26(agf)kM?R-u%u2Wt3O{LdgZ2?X2l8d`Uv!Bj>OS4IRtbV;{-b^xzbT?>7Nm*8y6;MRZ(XH^w@#*&=Xdr!Z)}WYAm%HNQIORWGeyt*Ddks{Y zU{_KcIlO1HFlj9I)6!1ywyt`fp#OiK0{QWb zgN}Fd<t35|+4CBgYv0So-S>X|zQ6Ck za2}8IIPcf{yk5^|xx%Ay4|1BwaZg)>*<5IUz0*iKQc>0^A3n@K7XtDW-V=9{F=xnk zOdpCt>898@Rl>jw3B3_ld8pW#+hjslUK5A zE1g47)$Y-lZ%0#)39k^2JHtcvYzRK1mfFFd6d)tVIVyx@#EKX)oOpJOk{NF1#VWoz z7+G6c$H}hvCo_|{M!+f3&|Kur_7ms_H1$w>s0tuQef6b0{9jlwea)0m zy=+6@UKb>K8BuW;YL*_0!{b3#jf^v%&=~=|864|-17>#WnVVV$tnAl0=vytV$FjRk z<%{kiiRS0=lF)uMrP<-@nUA(#dGF5iv>UZX+LybCxM_gI?iGPrt7#vr?%x?*3iY(RD_AFUy zTnaY(=O;hx%x6~Lx;TR>La)WuFkMel#ob%wqC3QclbG)Q0!_ep<^JR$!2Tq3eu$Df&2-BBGTAE81^H~sifBV|ct6RVy zmn+{zm5t}XyebH736#?Lx3_`u#yK187Uw%9jt;`Pbkn={qo0wleGE}vtyaVHUSkgY zow{b>%Gi^ba5P!=Pi`pJOK9_Wt>Cw#8Im47MUfTsG`=yk^!{A;&aELFj9;6cx=1=6 zdnn#ncp{pu{p54utSfm1&klN4A>TT%WOds*05{ANl$h;uD79|QRt@i;oBZ~GZN95@ zh;MXp2^+mV`|;L(tYTS{qEUr-ymQBm<=^w+45^UKYugTI=@Z@_B5x{>?SLFj7ZV8E ze7MN$7sp`!i_a0$pAIvP31b%*SeolgkhBvMZa&#}=L?4c0`4tFnbO`}ZHm#>F=bv@FSfSKxOc=lgdAn7d`QF$N9 znaRHo4DhJ9p1?Y>d~Y&ZRxuy{`;FV+fdzS8;!84ARf#Ew_VW`9Z`nl za8!EBoaveFp^S#&TTi=S;r$jGv`frb5_h(1&F-aLNw5kyJ_4Uy7?vVTx=?T*LRSAz zRjioRSwi!z~EM$`(BA1>*das2thUekry331Q%8 z%%XTrpb+Xl3S2Wp^(43fNJhXoswi5;B2Fg{Mr*2NZn^A3WIi|Y4)>6();@y*IlV_U zrp)HNMWJ_P;Of8BIp)4Oskwl~i_ zuc95=V!{?yTzFw6Qm;@KX3mJ7{1@BUzl!|wM20n(IiP*ePwbwOk#_Bj%BZ$fMG|aw(+hXKQ(Fq72vE}r~LfD8Eb}v8` z5~K3~*5!8W^wR8cf3CFUr#xbl2k1xjTVHFsPDA=HX-o7G=I*(65FZH!YF4R{{8m1` zzzz&RP(PPZ3lS9gaf)P<26p5@#-};23to-}dx^Xk596@fCI6h)p!-UWu||k$K^mA; zGvxcyXX&PZvZOZoJgi(b$$7*-rf$9VxeT=`sADgnn<(#0pnXYXOc_iFBfFI|d|LYR zrPdTTi~E-|AF};$u}KN;Ns-+z_|~y=AM_=^UvymgH08OcS3)vi8Ue|t8#u+qtdC2; zaCeokM!Hv3E=!@^W~(fg{FCPPuhs|?jiDce$}F6I-6V_^odL(6NKVUzOaYJ2RALZo zFah;XYT|5o&`;QNy}eBfSDv* zVusyOR#ewz#$v>Vk^Evbi3nT2@zSTSm6Tj_9ok0>HnJ+ie+-=9`RWgCp)|LCeP7M0 zRc7ikhGl>2<0s|}R}9gDxrw0g`4IbccgITrs7F2maaOA7K8gzDV(jl7Pc4ES`=nujXq@(HZxHYb z*gIDePx>2G5rgl?!e%hNIPRI~BbGOh-};Hj~#yJs-i6sbqh@cN-=2nGXqpO0iIi3QtRMl8EhWMh7Km*N2WA@VS6KTM?EIijLFnRRt3(Z;(MnHYIzbH0yA>!~& zR`n!Y8YT)q(xvNCAETxyyv7OQW|_aGr}4yqs-x@KZd1>o$IgxDS?i0Cj@;EL9++hf_1=`rwtQ-0>Q zi<$h}qX(CdI-M^oQ+tSd0U>&n^Lmm*bHZSHux53>xlIuol6QrY`0*0P(;?X>%H?lmQy{=39m9#LH1;ZwuEOveQ@;V`dN`MZ>}TX=zAM?IR}P-ZM~%K$J<=#@ zYV-vLP7b&T?>Q?z8zdQ33{lkcs(RwLB92EFk*5bf4eRfpE{$3!id)?NgwYv z^HH?(G!~2#q6PU%62Z#fKX^0Xjcb5z`1Zld5?4pF)fdvP zWe9243|_L6Ubm)2HQAjFJq#SXJ+vjmB#D?f`l)D+!+4@J!%)NDj{U42MCeobxhMt` z*b{OPZADi4egm5+t4%^Sm)q`Vr5(5V9?r(efl)H3U0!MZj5SSz96x|-+AjG$&x zA3(huWJR5hlcs!M5F&)-9TllHw81`I)JZkkHHxXNtQY=u#|b19B&lu@(-^$l8hD?B zs%05i$8lhKf#DT{n@$RCZs3G!Sk?W@tb4esx4m{n{#j>FkQDJz>Hb-og7W@9wl869 zNyH67?KI+p&3l02ja+Q)sq4)@ETp85YO)0qnS8j6;1r#|Tl(Wh{e?X~ZM!Uxw`o?Kiu^*f+B5+^3bIP$$2yxiCOQk@@^xhRSo?psh40O)n+$?? zOm7&3(IgU{N8V&!xZ}W$Q1s=F=BdZ ziXh9rB&!WFgvm1kb<#&BQV_;-;twW)*n%@fZjM)naJ(u?Hks1r_r#%H71>&(3|dI4 z4gn=+c-srE)~5ph#g~bB=((1(c71TCAhU1t%zjSAb7n?0mo2}x99fQ;*xaWrubXKC z4%HJOk^!d2zmhle>y@{3=$3=oCcA$bc8&wkyNzbfTd70I2ow@M4FKJ(<*;}(Xy_`B zue_jj1%P#UWcR5{p*8X=aM<&l59JahrTYWoCQoPZQPvrqD3p>C6E}zmcckA~?o5&O zA4?H#Gm#97pm3-J?aK;Fui#veD>vz4aaO?4SsMsH*V@-$EE@EG2~+);|6?&N ze(Y+&2fb|gRvo9Yb-_DYfcvt0y@1_2S7qf2$2;GyobpkW+xo8J=NP77^(X0C+DlR6 z*!x#uXbcpAAt8pgYzKV?8*oHDoVN45lt*c4f)_W?=%0ASM>n7b6|63Uod7x%u@U!A))wX^f;zfN_5wESWU^2bKu}(Re5Q& z|A+MOk{73sgw$I5?{>-7n&6c)Cl~ z)(5(BFcGo54_2CZt ze?Ght;Q4yZH`(S%^>CTfkbxq5v(%_iP@xhz&A(-+P8XKIP7v4ZGLVL=!=&}!BQ^cf z58o81J?*ZQ;92$QjCRhu1v6ibs;$Zof9Pb*vkEHf)&rkojEK4r*yyo?ubeR29l8x- zO}JOfGv#c8*=qP6x5b&dGB+ytIBrsujMXOGlwP7Yuggw&@!4jmWCnBtM>L-U@3%c) z+xZ)8j5~CZl|=tMem1*?N3%xA0cGt%PG?(_yWB_OY0;U7>4(Qc=X?J8z+&!wYh5hT zqs+frehMk-1v~c7KWWS}8~h^&6St?5F)Q}BB??n}}O z^1}BIH^=slIu#x@_r7p`!U0wH8fzqP6o(>2p{;3|iBvV5+Z0J(Df5J%LU!};=cBDH}&hP3ZZReygZw4 zo6|pIl5ic4-H_r~%pUNELo4QvvS(OjBhIF^@?UVI)}Cahtl*@1FsX<_W}G&t=wRdm zxH&W{E>(03O(4u2)%?p0!Ql+C9p>|_@jH(1OdYK;PSS&%)nLt|(xZmn`bfN}Ka&KPQ`sXq;P2Cqd&n!Cp@(j?F?>Y34kXAUgg%n z6T`bEh(bR?bd#Jr?5=|wqcDAUcz*lJ^>cycP}62F{#`B4AgSIy<_b~QSMnc+WPyxAVgsH)_(-*%sQ zdfmePv$K=U5rx|EvJXDw%JX}7PiQkO@lztezDNS*kxO3^+Yb?sYf27vo&is>7$>v) zJMgBq03Odeg7xOb{uFzze(1#2Xf5iv!SgnJvI_iR*x z&SBho@1oF!(ls{9bQ_wq|JjaRjSOOpNC@-(>AliQc2cVe@gUf1aLHwnttV1Q@U#@aZWODlnM}HSVe4c;k06;dq{c5XV8&613izC2BLwJw5+;oz`9$1tQ2V zRr#X+P3#Dj*fwe7F$wMY?*$0Y&C9~O&IA-Nq30my^;FqFDjonm)fH#e-KUq2iq8lC zy&Gvmim|Qv@wD4OZe-8^n)xm_J)-Q^y23W!l>4973VLX>nau$-tJN`VkF^$pK`!;X z>+&rOeviS7xpc`6ob$q67Iy5Z=Q`=K@nO3-~P6aV{M&0^7mIz@78M_ zI+P*Cy~?y(0c@L#y8L$*IiK7`j&A74us8-yiyOj3F{tyNS4c5`u3L=Z)t61N=?j%&kg+*5BWmu1rYXa3~yb9ch~K*?@RJ+-zu0tV2@ z9{_!TKPMa=+jA|spg=fE*hs46V)jjs*EguNJf`l|d<*jDg*}bEZSShWC| zruQB%Lh?(neM-CRzW0-l3Gyl}3Iv=@Nw8<6W}{B8KQ z;BCLl{VQnB20S0unyWRey9H7xQYXU)84+C$baF!-^0!v}T_+|#uI%oa=lH{9`$N0K z_@4T=@!kF%BpWKsT6

B}Q4bXWnKX55oo*%W|8OQo8xN$*UU^9f(0xAz%I-48X#ifvlQ z-gUV(cU9_<8mF=HM5wYc>cFHj;MYl>AJI(D6O`|G4p1&S2+sGE-ZW;QDKN7JSNms*AFC>U8V$N=so$7ir8P- zCF6Y1H%1ser0``a=)X%46HjI?C_^0ic(5uTpZlcgg7ZX7c1=996lSLMz%#D7#=v~{vxO6bE*XnKO)fxsRH&S|#aas3=*q)-M~!u{4N zC!NMaFP%N9%?mS?)NR}9%wNRBPWLE=MyFod9oR38s^hlZjYQZb2AQ)ufUn;HBVi=* zgB5R)x~9hUTKJ{N*|xrNg3W>vxa4SMLAANCt+dIo8gL$3c$wO+nQ;ek4=op8==_Lb zuC}{xg|%E@H=ciaFfyms>pW-iu-Kx5TV9T;6Hs!v#>k6!e9C5+|HoU4Z6AASTKfyA zojlfYd46;v+lvpqjBk|4ma@CP%f5S&!OO_t_8oGx@-@qk#I!V%@%*^ewzCJ;Mt}iRbl?U(v&YSc*Ypx`bY?wX@)6KIERdD ziY^1YI9xcK`Y^zm_;@+9K#bsG#j`o75b(3E5Iow{YT`&Rn~{jod#0wR`sZ9>JLur} z$olK?y(!#$WTJKIk~3>`>UUxXjU3`ts=5~|Cqqq-8T);-%or=rDoRBr{(7`o^ld`0 zxk*!GhZ~^#n$UOiDZvJ5EpFVdrc9Nd2Y%JMxW8medrnx62+$0&wD|hPpexcw7$5eE zAd{+dqwoo*@3!}?;4j%iMuV#iMdgcl!e&nTwS(JPORLY0`zs1@jUpEFk0jT_upL>1 zz1owNN)iS~%UQW7x+Hjmy9Rh@9n{@qpzEJePw5uHfB~%k-YrX%bAw^$q5a>eJ#M!xGhJM)+xCTKE8@WEW%LU`Z}#e&MDj5eFjwX;M( zuK?w?v{^|oeZ?OCK04h5p3RcWCKn6{j4ZYS{gqHjI$097BLM}gPkU! zj^atk?ZGBTaMdYRLmmS2Axi5SU#w10{NC9O{NXn?O=N53W&EqhtE>wUUKZDeDF>h_ zxOE{5P}gB=8BZ_mSt~h1R}i+EOv(o7XPEQ8|d;w$M500@eRT**e-C-i=qmzwkLhLM75jtg=~R_T#G~0Obcl$bqix`_RX)q8op( zfzRUp5Vp;O$orjV7nC9kQxxgyd_($DQr99%S;K>StG0bPM+8V3txa4|}KX zWtJ3H>0WCo-K6vXw~KR{v`Z&9w19uhlaOO}bEIpXtaQ_Wv|fQ_cy2Pn7SG;_`#R=2 zogDZ+`#dYixLtl#iEf4WQSNgGv>|S?0i~=w!6VLZm*@z$FTI?Ft07Fz4%1bj+qcpd z?e5{o5}>;!Yi$o6cdL*Gc{egLrHiHfLyd$gvjn?>H%s>3pYwVGi2|jN5MsS7wfiTb zpH#nrTCSh*TurH6a%39sWycb%nEwl!RZsu_71_iebAJoww(6B8BLv=SiB`XpPMg!V zx)Nji{@wc3s|}U?uhuLZculb>(-I9h^Y&ZbJ=coozLp=*fS{ovW*~3@PugNIkr@0C zEf|CgM#tp6HWMs-9h0|SP2>1cJiYkeN5cCEeb=?e*r+YG9b@Ia44OfXMy*JHx$fgd zk`mj%*?Eq)=~>A*sDh=U$QjQ%z6D3#%6He0ChiemIevOJIoUM3 zoSG62TBkSJ*C9PjG{>*%vd?fywf^A)n{9@^23p+b*L$r%z_6WIivt9DJXSV2qrQB; zWx{=rG|$80D>^{6HTo*$vU+6(!(uT~sf;sk|S~i{IHttqQw6T%KrT4%05`#$S-k;m{SqybJsOYaf zR)z#4kBw)y?}ob?xx=${b_H4em*P=>k3)vcl!t2-jS*?r()KF91H=U%5*Y0WN|KuN|%_F zruFvFV%k+)=yTa&e*Zys4Hq!O!thVxtJcKE2LLYOTt@fXbN+R~yR^$0_SuVdzZJL2 zUt46=%_a|-gAYdZFfnlWW;Ek7Q(;-##%a`|eEum}&214Ka4oR1(ssy`{m9jM5v(9Y z8`WA?TGF%p`Le~-EEzg;8uLsR*>Et>h~kH?KMrt~G=j6Pc!jw#@Z&GxgZ`HiTU648 zDRQz}g=0IhQFTz@QDkw)?3T7|PnHhPqox2Jb%W&J%w~=o?5DWL5WE*&YsYuMkjlrX z%O9uCx!pePW#`w5pLU_g%<%lO4}BsFr(c|~KJHu(N~12So`pE6d>6Vy?_TO)y}m-N zQ-!TwTcmncp#?*bw<5?ML|b&{D{Q|8+kj2RBBV?Pc2|sg^9(iIEJ<1YgwJL^=82R- z)fb(M&ivbm*4k3E1=10^sQi^7J`8Z;+P`&Xaay2#7*OEkdmZ`<{hw38f&o?ZWQnk_ zv?fgyl2j%wIL7rp2OMcGNZNn4ENZf(2{w0NoPfM*;FQ6&Z^0r1H2!nIi|xJo7TS1x z>7~HxofAL%!v{?-3-Q!fYc_+!FskTC(_ z&TTZEGss3M8tUaXzF?7sKe_y8CKlFx58EZ1WaAdiP%~wok-_U>$tG+U6YbY4fku9f z%ENrhxADEf-=q1f0LOUxH`l1T`-=NJz1xwyY|Op;>xWRXsGlztRKs?}qp@BY5 zsdi?`$`lo6TwptKE1Gec_->8wYQ^LUtaMh@Z9>of_|t zH}`L@*=Ok``sNFt!x!A1=M-OT>ZRa&eVz|ahtB&0ya#;9kxT=mhPbWfEv^L@amb8s zfTyRRzZIWP^GbrguQABGGe}R?2BFe@V<;?zBDThy<@oc%gFvn_d7+y zq6Y%ix#+YIu$D*nS-zm=`Q#L?3H7a^mSNF@yBY>Xz=gGmH@rbU&wu;oAj0`=(FTqX z^WXVkcD-tgU46idE$K+wNMzS`2BcJ(>Ufh-!kJ$wY0N^cIy{{J_Q@+_51d$5Hr>$( z+D;X#w%f%dcIBrO49V;cAr*J>-O&CaY??Pq11-z4vSP0#T|k+ z;ta*ZrSXMN_eGJM&8^L@9*Gur#Z-UgzW{Mx`YaCI(LNKq{+mbX$9>zsBu5<&US42K;l9+i7tdM(AHj zhAy0ICh#C}?L$>BW)S)fu`sjmU4TE&()(8nWoP@-m*i>cDa@I{O#aO-wu$DB=4bsY zK$G&}2-Ntl0hlZ3a%7+-{AR-o>7Z1eyIpa(CF}FBUb*b z59Qvj9O-e)79L-BtKjke5sS1KJQa;nZju{LXb#b%DTl1hjk3l6n`Ik6oQnT!!geTK zxd?=v{Dzb<7pie=I)fX|iE&i~faDus&$O zkkd^e#xZp{oU#YgI8Y1ViF6s_>2i|I3|O*GHkEC67Yaw}MmH+`$2}$_dBTv-%B}O= zCb5~XQTShCzg?NNQyMw&#d5s2G5il3)v1#(t8rzhP_l?N8#1u%Gq42X$+v2ld$_uOfD=aG*emHma5bro1i0 zx6N+r&&iCv39PN0xpp+ZJ@ZK?6#3Wx8tqNIXbkkO2xZMguy8+dkr+VM@N1v_dS~v9 z$@(lBTN;GVgL{tt^<-LwOw^-WwPpWm-i!^5ReA{LJo*bFo?=b&N8t*pJWf!=<@(d4 z2AFT$fywr&kuy#GUo`}##kx^%T$y8D-y2jzLCM6JvWd8Go2mrrTos2QLIT^EK zsN?NnqE$VpqPhQi;&b4i$6WmWh0Hr&eNBF|(QXcH23Y#18)e?oOY7aycxcXHQcznt zN@`E6kC4dXSqP3mXkxPbw0y<*H2&7gLF8!x7PnH#SzUZNd|PMGh$3jur1z>sH8SWQ zDJ-nz`-ubbQ?*XNlgkjTnRZ`)=2(y=w6k!JwvN~jkIitJ%+J8hGxQEjl(P()-=jKl z(`ap|sK-BKqn}m;JJd$b2lGE|hA3-*PmM=-!)zL?+@4t<5oP%)C_8bKcwjj{zWmAK zO-rZ#4zQB(gog0DKA)n#My9U+L3!Vjrh4*ht;Lb|=A$ErPB8Wac}e>~p3L`f!If2Z zXH(TMt4H>0!vvSEYUFf(GpI7}OR?eB9zQe&=YOIv9DhY48^aS7dqPlbvhpON1+RF& zVax^+0#`*hO?7WHF$m6^GrbKZ-Fx)uguevYcd4`?*o^$2^Q_J{`ywCNSo|9qwrVDW z$#fJ0Pnior=)Bqf_za-xn3F|}*N3*l#6>?(z09Q%hRILw&({o;eKR@x9HV&(T^ZK1l>ngY0GC|1 z*7=7bSvZ@rS$}Pq?qss_oJ_!KP)i}!o$PRF0ol$rpbft)jJdS1meG-s7S=rJIw86L ziR?8^kO!Y)$$b_+|ohFiPY&SEj?eiEYHL@u6@C%_X`0VS790a&(KDI zG30sr71Lzh(EIPZRg&@7xk6%0v?&-J*-ec#rZM>2+)rjIg>9!=drI>kS8X8Y1g(OD zp+^z4%Sio3bqCkvky)RlKf-I zsGl`ZQ$lg;}f9J>#`elO+xYgC^YEW99D>me@}d!kp*R}(P8`~74g<)82a7^k&$BE4 znk++EU&&6Cj=v_~HZu?EUgCj5_wR8F^~wn+j~3LXN-u9sEHABn5mKEN6ylzHS1l zsMH53R-R7y&E-GYsho2SmTfjHtep~hn33u!Ta_{3@OSi{Q%`Pl53#g4+IlK$PboW& zCp`}IMj{~S{1LZ&k?^zDp4#N!-Ud=)k#kUC;-OtPF@CBYd22GgZiV~9j>fXGxsen( zNozrLSsS71%)goRuTBK|@#22DALQ5t!?~{`s{Mx@vZ;205dg;8?M_)2e!6X6g^9U} z*ebs=lyNOO@M8ph7jl8+uoK~Vv18KH2zn~sIm<8(^D8Tmz|riqs^yI< z75cGCOonqD7IOAfTw!^Jy**wI)OxF7wXxOzhR=dLiPE0mQX{(vtVkwT8T9`s$PL&$c0U>BZTSHytz%%;TnOIXg1Tg@YZe4%I5kjpfo((K?l6 zEk10>0(Ucg`2@w9B<3YCEj#d@F#o}ol`7AZU02EvaQav z^8FE@UyyjBdDQVkWD%xvo$Il1!22%rGgMR~p|_SzZ~s5Qn0P}QI?Qotr)_DGGoZYZ z&)DhY+wQhKz@e^}P*mXj4N=B@NeVChR^q}5!KG?%iu(TRfJ#YWh}DyDVa2&6BRIJX z+n5XZw4jiAdWhQ3hOh{Q*XnEdOE9=`T_`#`2_DZ-hNSpu>*{7 z4aT&y1oXZ=U#b+_VT=9S3+fkH-^Q$VTFzjLfP_Lh+!?4o8&zYE@L^rxgHDaZ^11JqHaE6z68-|5 zMB9r}UtRUJFwJZa{8lKnDK`dOd2?wC90aU?cNXR;y=Z8Dn%TYh^@}lMG*&vja^@yB zgw`rMW~8Pi7VIPVQ2=^d0LM3eGF$FsWy_gm2Lb6#S82sndDMcXIpFA59qP8C3*ML-yf?$O`!R6M?v}*i77i|3+wg1X+sRDBS z@%e>qcLi#XP>%57=-dVy;)pK{Y`Ec8uy`{L{_6yb&x+hPyW}{h9U!Vib#fd08zJp$ zxkC~`+l+x34sx5LuA6xeFSQ~P{6YbQCz8&RQr}+l!j;}!$7B}*Y{6mzT@)DejH*V-`j#lWd;pAJ|grq0E2fYPO!ql zs_|iyuU>ivWDhmiyqEk0e=}HKQyGfdc}i~@wYW}PY&vii3dX1+j;%1!#1*G){${QvmTDh{(k^ZM)jM!ALKEVNS*mb$uf`G0>uSPDT);MhX#x1w`Qp)s z7K2`049T9|v7n6$By~IXfMT3ugv~;z4MgV1WzecutrY>BOD)nUPW^cj{biS6RI_pn zMm&1yXhXZCYZd~o5M$ckInG?XVEC@?L3~h$PB(Y z6l4-m7n(Fly#ERt2!>)xn+nk4qjcISs4j`e_#v-IMgoc#ce6nN8mbxzdiCai0py02V8f@NQ`#lm^|?2g}GtGLNMp-|9Z@l!-S!b-pm*I8C5$TI48uUq5tc?u8bC zQc*@5>WF})*kRIK90D&hQW^Zxd8mXNG4TPF#whZP5Ii(5Kld57$U(p1oo#hW*#vfJ zcO11Vbh!4ZC@~ZNRdBoR-%VMSJaG)mnSY{EgOTgel;Yc5KQgpG+uUwYpz_aP+C#j? zLhGqpUHGfjPN5Pr;me-GySL)8?}UKx zkK=fl&FCfg-*1inzh!(YbJ-77a&PGAV2lpp%aeE_ZnCa{mlcUF*?Ais1_7sUA6OR)Lzq1NqBupS@>Q_GA4oKC zPmpL6lsG4@{??KU+dSUV${;&M>eliZHr6Br@~b2teszD)!p!C08X1fAjgklhwTq*1 zsC7e}3h4c{qhIO$YEks@plYVK82#H?5qnd0sv7cZ%xu{FV!6)e!!M_5m?`48z-gaz7_|`|i2T-@2RQmqU%{>I7V2N% zA64e_3oF|V7}cLrw*jqh6eSZM&fx#ID{B0ztxqAcuD2;O7jKc|x9ixj0Hc>;(FwL+UK>Ig!-i3H82WVjU60!D9X*s=O&4jX)#GXuV_A$=_|^g>x>Hn|0@%8N*Zss0hrGgOUxjH= z3euv5VcUXK&$Ma_WqoIgGuHYrfVutlIe5K=m?-4?Xio@}-grH0jh4~3wt{FOX;ywf zyMyeaSxSVli-JwZ?7ftq zmlY=5cxFllT|VHk15?k+8Q_3n(}lk#H`d3k*M+a`Gfq_x-A}-V+}xLAj-=;|N>+{9 zfB12BNOOsOYdD>H)r@*&;;Y`UIin}2Sz*YBHIYmrcqS}}C~e-efv=+fcZYf0l6`vj zxFuV;%{yHa;a<6Y*{VMEeFv{`uEFH_dw0Xd9@xCVq+O17;BA{qlRK4mKc&1Y<(*AW zilV6>BO3=B#8={p6{JieY$#~3A?0d%AF%s)gDDrwuBg5OueOBYTyu9v_?z77!yn$c z?!9@MCtmb2*;nFi?kimZ==y7HwAvorJX7F&yn_}(3)2}q=_5z+vB^z*YJkK&IcEN3 zR1bacBMT`?D_xOl*z(x-u#ZJ?KzLUybHaysc~(b7h2El_ZUg*|v+SWDHqN1Hg@@i4 zEL%afKd6&W#&mweYfr18{_@3$2kNHW>8M29%|yJ%9jF&j6qppKpWPOz7l zA7El&`-lr>6q{7b`NUf3mND)JNCOP&wB2GDm`lg&+#A5r-glPfjVV&Ys?S!D`+hBA% z2&*fKy?64fjck%N;AUct#jvR@Sys&{zn$kG5OOqPDf-d9EdWs8YSKP#piv-BHHEpv z$@<|D(bgvUELC2X*%@zxOGkjVJrXxt+5>iZRtUy{{Cw(`D^zu}S_&vJ;`yriz-!=X zns~V=%a43@e1~V|qk$(o{`Y2C;mv0vHS_9(+q`6{?C)~-dM*=85-em8^OD%mSh6BL z0fyJaLNFbuqT6U~8*b2r`cJ>@RMBle%i0+r^4XVJaaq>GxX49eKxbo|5UsrwNU^B0 z_!Z0vO`bBDelcA4c#qZv(lGg4yE4~*aTKSA@9wI!7_Ol`IK01=co zgKSM>A(MtWH+PjCzjwz+^p}pgV1dowEn-j584=3}O?JAkjvhB68fisXa=9uZc0U`I zT0Lo`41wIN5X(bk6~Hz>fkiMr6NWlKQK>nnmf+pZ9{4E#e{Tt%VYwixC zFuP%?s6&~G2u;|0@Ca)=5hN%jH@lczQk75wRe>b5%CAUoy{~AqP?Ju|?_MEg>xg(R zhD}^#X1FbdtMj5nOuda*4WFSSzVz-@6}(yH9_u9PZuXyGoLZ68>y`lVFQ=rph>rf$ z#EGuk2ZC#!{Tsc(@^vB3mk%Us@pqRKM=;ps1GSws@tYuObza&v#0$}7Fzor9<5b~3 zJNX^5+-RXGp@))}nAlozQ1?OtArV>*xzH>0mUaw8@!UKnWo^edZ|L(3sB{`oo}yhg zi_Z&d@Iic(RkSX^(Y9Doz7ihce6$uk<(lb|(0!<^{p)v6-{j6&x>TP#5Y}(#_5SdV zmwFI(+;*q68VCLL-}9^*7a+i7ypB)f4W9NI>)CN$K4)Xv1(BI)c7_aI%A(_E05XRNai&_ zt;Ns#sd&xW!hzDf{qcW>gVoPNHs5|2x7*j#dXQ}}fthQR4EpDLU^~`6bw{$lp12O> zcmhvYUw5SLw3&&d;Z>Cw@f3D=+pu)(kr;B@lJk z60{7nF(hfs&?$cmhc)ju!$Z({Tbe2nGLnNGU|LN)iIlasZ$YeFT(WUJiv2O_M1Y?r zdtMKI2;KAFI8%8ASk3>Vi#emk4sqmw>~`fPIw^xvTrk7D-!C%E3 zIy~`o6y>jpzhnVnU>4hdK+RE9EI$QIF_hOi! ztSIIg=%e3>hS~o^)49hp{lEXe5-On*I-wGhkW_Noib^HsEMZHMN-PZ?)_4?y_Uf1=w-_epto+ArV4=T3a zf_E;6jzbku)vpZAj6E|Oq60B@G7asCxl$%!hdC#_l6YlKI; z<{#e`7${?3!70CVog9D7O#U((CL5R`!wDAiN6aqVn0}S0u9u`We`a08$uxM4h2L)N z{!70bANFz@i!OV%A8kHUIZ%7}5R6 zKt*iyNxn#>U0m8)_u~9@2@Hdw_pT4PxFT-9b+QATa)>r0z!k;Oi|3*D+izuA( zO;eu}HS)!5SGBdy!uFJ{!FS)&p(i!q0oh5Xz3 z0*mQcwU{29W6Ai#0{`-ZB<<7nKdGVGhy!^%cC<9vNsuaQQ;hK>>i31L=fyAN7U2Kg z@K7gG$e^A_dj%s|^kyT6CE%mi2z*|Ie&4Xyg4@ZVk=Jf>;pFL09V3|Uq&o58h=4dz zdlTUx?NIp}c$~u-ch*&+#*2?jmS~*o=RarYr!8>SJMP(uEkA;jnSXj@V}N>dXxCRv z`)TZ1>f5Q+KdE;XX!@;l^sZv}yoS^lpAurvzqodE1zx1J@oYkVB6#Pft3nBce2(*x zsdp(wxjjW7IVboN%QQ^@yat@wxKRn5h#@KimVB0V9F7VGkMq*k0ZBCH1><@ z@%NX#!ApJS;3Kv`1O3`AsFUwz@Ijh&@FlV1z^7Yts`^y>iljdVAo@c4`IXFW)by^Y zs3xYI07^a8e3Ew4yG7~SXjmY$NdBNKPR}G=pn(M89Y(f(}hrBUmCGP7aLjC=U zX(^tAkug%2`L&Jj7+e6kl@{vTH;q46S(G@eM#d%km!21q-$B3wNc-drEb%blNMa~x z1t4@w43wZFhfufnyiV+@z2D`Y!+ks`sjs7dfTAIGb3RJ7$vVn(wYdFJnda(q4(0HK z&}gyl)WKt7?0EwwI{r73D92HbaYxMmKi|jWLud|Y<489s;{EJN@AKZq89o2qmr9?z z+4alDtFTSCsOLa@^|hY~haa3RS*t!)ouKP=Hm&)g3T`g?yoPkiLz{=E3r(&?}!zI{y}OuqnGC9Kei6Zd@Z>44QcZ){fxCwS}Wk&c!9(4cGhVVb4R zHT>gO`)p`@i|@9|X(EncsnK71;M@OV9%E^r1%3ydpx6C+Ez3%<(Kv^&}=_6@%QvjsFeg%mSjPx;L-9>yTE1X zRLWd>wb6twauZYy$A2_)9nvPmG26Iw*c^NicJIaeFn4a2@@z7A+j#jDJ{ zl&`{Omr)7J8jTPS-hG@Pr^)pcNxx|#d^YV|^Y77pHspGUo4;P^a^o1<&3cQ$@*@S6aliYfhj#e6UbgU1eZb>o3PV;^hBlg&KRFiU2=vlqM^^3uuGM9F#On)oVC|SJY?O3s&|;yeeZgCVO5p(;aP^=+uhj z;^IP2WO*AoGx-M=Z__|K8zT;`(NwFV!KWKguOnLC+n-DpgkkcdY4pJ6kaUiO;50D&s@k0 z5VdN=TLdZJ+*G=`$=g$&cK;9Fa&JYy{`eb!=b?v22hk@RpPa(blox(;lv9bNIv4tV z;PSiwT@!${sIt6)&v-MsYNx3igT1vq<&{5i0tk%Z++-w?PVF~}Z%`5@bVBpURm~sq zTJ*#M+WZozt@|)y%CZ?nw@(IGe~j@p^bA3o3J)GfKm4?Ca6B;DTRY>Z^|WTGFC>Ks)C&4( zrw;%NK`uDOn{tFZ4xd$BpHu^DBl+LM^>m%IWm$ipZmk2pZ{O_+F#5|H*%nNjt zX)3p9JcM?n^Cj_;OWiKM6gr>9z8(zhNuX6k^;BaOveTSzc^lUy5cU%q|3WJH+>r$j7-GZ#f;1oO^@8 zWJi1%W;=qtcTXETkBXi0OZ1!I)-T?_@c{96yFA6WKHvOtr+O4r?N-ucGJ0y#s4nqW za#P>bo1pPID0gN(Yi>$!txB8kuG!>#yV^ZR;6FhLr>B*F(NQ8I7HL3(nD2MZ%lN6HT7e1aBiKFn`9?w?2HMk)k;M)()8eZ|Z&Q-b@ z;-KN4H1n~qEoIF=U2w;7`QM>Ulkdsj)VO{JNLSFJ?Sg_Y@-F@Qmp>uO5_o%GJT&rK zpar~tmcB0xs54}fPx?D!^+y~pa!D3fGbWwuYP|a9o7FMC>BFU6xq6fUzkZU+aZJ%| zAL@QHi`<8t=^k9-If(3p5YT~X%c-3?0SX>G$(;br8mZ+We`&$SNi+BqPVJ0Pmvj3S zCHub0Is2t!#i#4P4)?!_vg+MzX7r^vU9C>^xN>OC3iy_@ot0MHJoTem8r!yNlwAI3 zNoG%zyz?08iXdQl+9Uso&GbW_`ROLZ*A2!C?q`7*xpgZadCfiLUYy_?;xn*IcBn=} z=H9|e#7f8~T49!Y#`WAIJ@k37BCo7UzA)etCuw-vLiD$%C`mj6wz>uVpp!Uu=>yyf zsGfw0sC}^Joj4452l3DUeIQhVUmi)4W2o(Gu%-hoMHBbEmdh{DRmp}up34PVqW0c& z&506Aj7nb#_{CY8#*M)E&qi7WJ{VAS%?^Ar%RJsZG|q7UAL#K3l~+xtH+Sa$SlYh$ z_QTpn>NChFdIuqZ0^ALi~zJRgFbdPm^Xez#6Wqf*8xC5Pi3h6oH zrx||d3)q{JkVG`MoW4osfj95#@}X90unFWrUaSTF3`25LbU@&lXx z&G8@jlA=*z$Qc6(;)|`cN~qF4U}Sx^0_g*Pp%Dt7Yu5V(+7JkzOGouslCB=(6E!C$ zuHg%2OU#g=SpH0c(0HN$b$6u?TY4C@Sj~V8gfrh*zrF0Uv(4@KYfu%<3$fL?=+Fd&t)8Mr-`(N;VJpJ2Hl--RN zNHXxP_|$TFaNB(u_NW@*NXw+k;uhXC;3@#S)ml%P-uqCGC--+spU;egSq;-Pc{QKe zroZ7DWIzepET#eYDy`LOoYqe_a|#{MrUvUWAHIj{1ZvF8YR_d=VUwp^16P1IF=Nct z_M^1RkN1E-OoJs83aJtF7Sr>UNwwR8fiJtg8E|Z*J~0Nnr!tmqc%55Lvc5(9c-b^g z;8xwZ+G8!=e8?fbGLPVAwNC|4^xvIma{e#9CWaTm&Aohw2%IU{#VO}KAI~P3OIc^u zsIOxVV28|rFZ7+4VaIS6A0>9qlwA^;E-42sYjI*j_cHda)ekr(0!WK;g|I|D^!)N$ zgs(zqmz_}@8UcE=19_-}_##sCb)A6CHwZ+EDoNT)YS%H@ru;PSd>#MrnxC@Zdo+dD zQF%&a#dx$n6f**ck>hk>uHsF^^CAQtdmIGY?Buh;PEZU$(@Tw;4~kkU-N}03fxU~t zz9UvUMKy>@*ShXq&2W-8R-SBEd8mio54c8JtmCVV7sz57mwiv0Y5cAPO*>CHN-qdd z>Cptl=DpVqh8bnR@CAIofVS>G$5nZ*6X;tznjShskj`N#u zbj^^XANE~4mASmkP66UD)cQ#_n#P7>y$%h<9eHa$Ukja9!_+>)->de0Dhen!TND#0CknA`4z)1ZK%AG_mwsgYF*O``G`qikX|y>!m;aNg{ixko5cZNoi7t<-qP z20k_dB-%x)V#adz7%qRW}nW^Y*h^& zu6$$czYLVB?4uhG0Vrv;x5t@MIKDRZVLM-!SYiY#ih2yzSt%+eX157`naeo&p3&&j<(rzM1oSziWxy zT-7y%NNP=Eb4r;JM;*GufzA;@WyGPhU;+&Odv^8(2w2d5>MZPQ5D!^Rdd8p|gu&7y zxX`(dG34o0`q1B9n@cDB;8DH+{@Mb#-W_%vCNb+@Ou)1fCprp-x7yi+b44t%H~ts* zuiSHd6pg_0X@LV#^Aq~_{!U%NXpx07L`R*{irwtwowkR$Ll?LF%^y@^0R`U-{s?!< zg}KXS8rGjQNus?&BNrzvi?e&C>{h5RVJV#Lo#j$2XraD64tK!Ka0fWenYK{C2dp?K zvUB(Jk?f|pm0!(ez|JkE$Nm20qk+L+VAVSJ6^$MZj~$q%)L{0bL+P&jA#F`xA6BB< z3?X~ED_b!kdB*T94syHc;T&=`QMr`a@8#N3^BMQNVAvqOnaJ{=2b>=+I>L3w@zpnr zhW^D?$Q(49@%rkMxE+VxomksnqsDY>ovy$szRI;kxx8N)YvD_CBHO%QGrB}qHlki3 z<3*2&Pf9r%|3cFn7UT<<6przl!FGYhl0}o@Ue*4^#*sDm^alI2G26fKUU;Q(#Ky#W zpDCp!bI?=MPu|ESl&~Ft4H+h!HT4X|%i*m5P;v_^F9mBe;sNyD>xmI6!Kteqv{#r2(;OMJ9#Xyy-HtqVtz5hJL{y3}!a@UqQ)C=FrGD)wC*d>WA zO1=MCPpDUX6=*W1EuMdRI0&XcEi(?$2r3&?iFpq9O*Q&^PAgAbCd(fO8e5~u)7(G^b6ugRTJQ+%>ueOyZ z>bfDoC+jFZwf9L1GmE>st zfN$;%iD*20RfYXjsSnjTj6ia&@9-Av%kOnF1IC7a5NMnf%mUMe79=?zDJ;*>$ft4gFH&n^OCsQ z7WIQF2_woaxC`_%25hwzm_*CPD8F!P)Yd%HvgOrhf zXK9`MasSzMJ)FxYSGi#L1m)aDf{84-k?tkk8iXt zK);z2X_E{4c-@dvOx0I*^vb&{2-e)t)3!=&7|C}C?FO%#>k3}uw;49fVO?@vL4Ws1 zi>=8@FKZ8&!Kq3 z;H8lY&D|~dD6sa@xgAGk3DZlUDcWmW`z*@El;EMqQ094)!B<9nE}^ANihyuiRSi+9 z(?pQk`yXL5+cx9_@nZ`|{bolkn`MFCC+n0K8|P&XlCGMEdm=LW5rn;?#tOq1Uz-yh zrv%P_%Syv)RmE<{k%LaeX4#?p&mYau(t>|y`kFh6_H*;;S!@s3NGp(lZaipon*-0&59-0#tgvHrZk#I0wF4O#MBk-V^i zW9&9%^?{dbi|f8mtlE~R_AcyUwE$y9cb>_?BI@UJr%d6`&uwD(n3oCpYrw@=^5CeMx_ooua#;ti5$AoD zD>pUk&m~gY)`v$g70Wy#2655Wn?UYe#Qb=T0#i#Tz(ZYiVA{CN$Tz}05q>6|(bxE& z*0`2s@Za<$nY_ld@QSY+8T>t7MB}-uOUAoJ>Ye>fx_;8hSS$2yG2NIG#y{=;&{(!WJ* z;@!U_3(T1iH5l(Bsoz6X>mkx2qpzSs$wY;`A5x9(!CMXxku-TsF~M98D5*-ycUR$t z921T(2K|=a4}r@sjvcc``4e@vfei+9LqGFsZ)NSbOsuK!OBS*Fp48*JPNe%x`P~T&iOlKsd6V$QW`E{^ZvRq)N!^qa z(M!XRhuoM#fhYstyc$ZRZ~sIRAq{G$4z5{s03;LJbXJpd>bLpudm&kaWF=vuC}oh2Js#;S>LJP?0cZD zQiU^S00|?xVC(ma5&2^I=jO=i#?prCD>AkQGy|{UEHv+3M02hQ{HGy)Kgu_lnp-IH zrfYJkOSip9Wm$gFhWhEu=qXFchH+x4ot3m=~UgLW=Z;z%ednw;sP> ze69sF^w*FsuTVWlaPQ5nbfD|Ko;Fh+W?-dtRStGP7ULP1p$VX91}iI0g5#ze=XPH@ zBS*AfQ@fAH&mqq;i7n|?Gqf`-_B=&zqh7YxNGXgzN;|bY6$UJ6Rt9)F9Sg7^_;V(8 zXcxQ^oztTfhQ+cblxkO_e0NFUqgkt?>si}#@UpfG=w-wG*#0@o3$$>?~9crbW1!u#JQ_1x+hY%ZR2G;Tc-rRc5XCOGV5aE*dY> z3`#5pAe010xedT#s_WvQ>Y&Vr<*BY%{kxwp-?7i-zYNt4qFy?Xb=T|e6%>YbqlVzN zi9D8LBeck`J<`0@r|AYbPhboH;720=Wwz^?kiCdq&9_S7bCG|$*=pQ?r|WXq*~UXR zJq>xy55W6rRmQZhc7YrnZtGg36OsoF1Uil*&om381UAbdR9_}w87cWpmvy9A@6A}# zxQhjQKhL+A^sJ!r``ourLxbBp!8Snyh1Ax=xru;&;Vb8?uc!0U^;q(k^lreT&K=71 zc=zZShn&&}wLNn~-+Afi;xtIHaUxE5XpV0Ib2=0fQ6z~oAW`Kd@gj86CyU33&#@wr)sQaL-X^i37H)+Gkov%m3j z6XO2e3(vdD09%AJPqJ(Fkg`7&m@;*qqov+Wfu2xn3WqCqJ^H2AkBeJ!A0k?+)3zKy z!;1fD&525f${@ZY!bpOy z-j?2u`fVkT^FxC#U|+}`+u=?rz8#b5V?vaSb$KjUmpLXwP)W>?>m zk`QvR{*s~kI~emh*#Y+m0;H6XD?_kiv^U-s8Ei(5eQ%E`rH6M;IZXLJ>AVVJXoC*hbHq$1zQ^-%aBE|?D0LlfrAUAxm!taa4*i7A?aAU0Zyk%#>ZP*C~J zQPb`R8?WWIA?tR6)Oq*vk@5{^hT$jkkPmE6hUtHUXyo#NbiKqEq9>lq>V|=NtK^v!qVhb9}xHDHkxL#4cWqD+(&Wk7CeUwB-3sY z#n~6$0>80go4_Dm*r@NNpE`3%eTJVWKobe(2-WTVvyh8|wXF_9q%Cmsm@Gt@OzJMO zU|l5Rj%*kwiKRIdg~XEyN{N$dsELi+Ye)AU#K+EpE5`Qo23qC&h0%^PsO^vfCuMM~ zLcl9u6PU{jH8)OEPLtN$s)1l!79tf)itBdS2VH<0B4mk|^Phm4^|pu~+rtImdq+dD zQ|_LFyZb+St22Kxau*n)J#<1;3|rZZApB}UGb8eMuKYsivq#qDP}6lWDogrb9p}v5 zo4qlI1%siq-1Uo^jG-BoE5|xjo$C`7!aUO`D_tenv(>?ZuQqK- zm!TyI1%QEBVMZqhcR&Sehj$S+_p{CS3AuffZj9ETmh?g#zMSKJcp6tUbFQH~9|`jx z%pO3lKj_3bEJ5cy*><^uo$N;? z;CiI>lR-bXjML_QXF?L@y$^=do;ORNegspS6NawwY_*}yPEDv-A#K&{n3HwgYi?r? z{Ig!Jaer#9cQJpP`F3V?Mmu~zi_E_>V-{=P{YJlTd%~i0x2}4QqGa;3bjbQ) z;`pKUM{~>|jwb>bt(A%T`2=K|iHdu`QOy*qz_OO6>nI3$zxDM%vM3wwybbSs?3owA zDLf;Zcs*-%(GQGxSO4L%=i}&_%6@=(UHZ>~We~2ZkVn&&Q*~a`UoeXmNG&sdXBdG( zDZ3X3`#A=(sO+91X2OTlP+~;wc0@cEJ1bUUjLzUc!Dt64D7v9l)fQ=l$hmyG3aOg= z?~Qx`P!Xk^fxH<^{Bb0!@j%{VK~9V4%Zz&wz|k>Od~`_XQ_Y)j^L69jv%swc@k-@$ zP};Cz3TGP(t!!dBK|2vX@up$|_jYwjbsJ5ulWeq!a%`B|vtKQi;G_&iapYg1<(jJp zjGZFj)~MuRl*MD{D}H1va?N~3ye|G<4B-j|Nx#D5iaU+-Qo`+C_)U5t27*?}( zV?W}>y7g#1CXX3-k%{Co;JvFXY0!ZU>S-cXYwD4rNGqdTo$<2$NnCib@pu{o_Mwm3 z{MihwLHV&xcux&_RH2yDee;NENsYy?ch?AoVicpMFJo1KC(^&%>iZ)#;4X*c3vOD+ zcQx}IitzLXPXz69y-hwAR< zYT1rOuQ~cYMu2P4);#ZZqmg-yrU*{33wU)ubNLIdP+6Og&NcNdQQMQZGZ$H8ERGdS ze#wS59nZ9A`dNLnd$=Z+@6^E0x%?TJK^k+Ue;I)y=NL|;3EgQh2y6Am?;{Meb5n1D z-J>j%x5_Ytf9&2}3*TX!%k*X;w}$5zH+*j!C6^%MjXj|!fGZ8O`NRvFJtVz!Y^LV) znGU=~i0`4zx24{rUr3?lPg(QCG<t@~OR9CQ0 zUcGKIb&FGv$uXJsfqM`4x4>LnVE{K~URl498S1#viuwkTfXF}Z?jtlEfAYbhQi*xg zMoq>T+8X*j=xEMge&6byNAk#V36YCbaB^?0Qq#_3R`oz1mbt3%DC-=z-n|5qWo&+& zaFgXWK=E8FpXfh7*ed5Yg!)xqo5{snc%0(&O)%LU|9ml^nje4Jw{laL9308TJ{;0% zU5{Te_2IbQW}oS0tMGNaptDQ;Cl}amb-XegpnXS?0`Nf7dlc(_0H|K=)qs>0kjGW8 zE{$EdF!z*+hed~W&%$H*f0T?9NFXbo%3i8J%ijRs+)?x#^r<+d*O;5zK7%=B_Sfwe z<{+o*l2;TR?CP|ADh9>bR?y+X0s^U4;QL8!;zM9D|$(_3T1^+^@5S}#XlS^&ux zINRa#81y&zImi;L1@zt%j5!4@T_fLH15Lm%&&yM$ty2T?K2rneW<}_qb5l_^Zwd&T zGoEq@LPjl79gvHg=b#o+fQh)t)?oVvU}Pw*faID9Lv11yajm#wKdclfs_U0!2K(kp zkOqxZ0#D#hpMb!q*75>$>r~fiY`W%?U+D%HK9PxfcC<_DnSZpmK}-_V z-E4kCQeh7*j#pi_Zq-p#${D~Q%786wr(}`tvP9>h7h(9@0b{TRl9LR#V zILZwfcCaPWUx{AU?c`Nw5MIvY85ZgE*e>WxiXG5KU%c92H-6zFJ#L9?2J-bcF9>8b z{$(bEpF?cO006cN=e`!yRKuX*GJdG85K zp%bLVU}}59b95pL$~5%_Q1_FAl?9Rl5!efA?gI~bU8X16&*>bd@S;nB`#td8n0KGk zEl7^W*z2UDy}&pT`g-13fnmv*s<}!I{`%imU|!RAFR<^rykvK=lnL-OhA(l;Fh!Vp zGYis3J@v{^T6}cIbbu>)3u?BG(FEk6)mEm2vK#$h+~e1g3Z}@7w{$JcH|Xkx;610} zFR?}=n^7A+&)x^kof#--5v{ z*lBdPB2<1GTXJIBb7LIx(&(BHb%Qum?S6Pb+cEI3EpJ7JSj1q@eMZ8Z3GXDjcdXzm zU`6K4>8R-rsD}!DH0_j893!)6Ur9F``l+=#wwZaumrA+rxnsyKa)H*PdJPicr6wCh4poZw= zrY}zIR4eAey}!dYh@zxDc-0dk%3{lWbnCo3lX^fB_>O{lxGx;=3jVrv;b@0xCkzpe z9Kyd&m)df;{qf%ewT;9;w`&Qe@9Y>0CBiSwy2gaLa`Z$RW?qNF3l#+{W8AVF&exFi zdnsBPqp}Norc0jaZ>A~sYKE(==c3dAj7y~Tjbex-6meAad%NnTmo%=z!apfeMzo45 zb?++>*-k%6;5eFyN-&{6z?%veTab-68?Y^nN-qEr^_|I-JzVz`+BR5k3`Fl!!2Uq1 z7PeHNRtaVoacmb#WkcL~4F58{vjsU5LpJ^6m9TkZMVfXpmt#BG3*dVJ+u^g|m5YV8 z2bu3$p*t^&Tj4CqT9phUu6Na8?4drghqP05h+X~T5cx?o9 z>~Q$leE7~l-B@qpCYsy_uT2A~AYzdcc`mmFx2evmq~-QZ=}?^E0)HERc}BWcfunL= z{}tq2H}MGHXD(EK{a#>RA1eGUvi2q5WF|?8yjMOLASFJsnbt+q$}}FlZ>t(e$ne%; zpgQ4a&Hl@^5*`;Hp!SB66>c@%no&HmFqO^uJ`R&IDDFSew8Wce#z`bnbjxBAOZ~fYnedyI$;97gO z3NEo_vaL?uU}i5G6#or#gf2a&`<%Fd+IEb3V)KWB;Ap*7`;5BAOm5rOb;uc3$@O%L zpM7gM<2WD7S3<9!G?VrasUU`f5PQOVvn2>_(!jdTV@Cqzu$N}i0t_hGGrrs9b0iZ+ z=n5RX+MtkQ1mo;$9*q^{NtvaZD>23Cx5G^ZtLyx}F6c=_*9b@|wBl8f0qpXLMpzmE zaDyW3G2J8XktEqMd`=*}XtLP&k9dbomCnWr25bjA zp4&(_#29j24WPu)wN5&QgA2^zy`Av&rTR;dU*z)l-v%R!CNi0@p6IppLnN{1Z22X2 z1p5R9v{2G1yyIniYhgBz>)P5REppz4i6HQpz1eRuIxCCqT1b0}IU{5~TpoF}AE$nV z&ToV6MmA_Qilz8-xoxOiZsHe`+Dt6a4l2Ri?Io8z0W=$5FoT2x?c}7_dG9@AZPbP8g%yh0*-Zk>3D{l`O zzXL;5TRYInRhY>gD{hQu_RswL*Z`ny3o*gtJ?7AZMDGmWQv&8mn#5$QvLuxD`rS6t zlgN|@;toUO-tLHQ= zll9#%=bUg|d3qMx>+pA<_dS;Vi@pP&x=!1=vZ11-N`BZ@V3(u`bfnr>8!UF(CvX)=Xwt4X9d>G>8`M?5AvrwVUEKp5!8L7?T+*Z zQ6am9@VCA(E_NRG>|vX?^!r-7{ps!_7~85b+hDO7|6-*0RnQ<>Ag2k8LM6<@D|vUK z$yuOOd0IC#{~XU0Ct8EwHRA&SS*sOS6_+`^YX)*2$M+&1gA8TVY9@To@=ZpkAyLG0 zb9ab7bwN{xoV9-9Qlz>Q`-1`7gjrqxdu-8}U=PU9fA@D+`;Udn)RfBGOWzV*OL5C> z0=Hi>Lm#udRgSLb$xO_<&%IrP`Gyj$!UA5;73cFJjF;jMM6X6|st9zI|2rFGdH^(M zY8(%)VhPLQgrjloRc%YV!qS!#+r`p!`K5}&-C@g|jnG63mdtpKJadbfmyQ&Mr_9N7 z~nGR?~NncDs2fIjzrjdj>n0thCTkISNWql|O5S8J2$tZF$ zbx7vll~GSUe!v&JdINH)F&~GqIYhT5S}kF0ASmLK?Sd}@Zo1&%YA4*T+|K*&R%UJU z&F_e%czAV^BeH(8&q|V&=8-bwOLr-u=FaJ*k7Rdw-gv8)n~&E6oM|Vud#=2pHT9T= zw+Tsh_$L}c@~{}SDB=l0)RN+3DE}Poatge-+q0p-^(N_>;8BhEDp^hg5<&=Bdak8h zgu}as5v2w8ZV&DVQAikSno` zIeA)5&zB@PaDu(wRUlSENleV2p-rZT8n!Af{aHXgSU0}bu%C(hiKE=y2W-8SuPwaJ zd{jl#YsLbm=Jzl~y5Q#@wgi9f;qqKJey(zs-xBG)T5WU_`SfPkCwLOA;Eq^1T+KTm zi6c7QX)o!O@lK>*0d?I?0-|Ep)4Qhv=t?s{Nwh0VCN!~zK|=sB$q&S3K)maPJLtiO zR6r)%zc~DYB32?aQTw&{I0(zguXsr&^$^jz>tY3q>2*Hj5`5VCf z!k_f5(%o5!wBbd2o8?V8U`jpjbjaB^z;AQH@)CEdr^~gcakM3x3hfot?tA{IprCsqW;s024oiRjapQ8$(Ul+#lFVqC4dFQhZwBI zY@B18jz%bt7gZsM+XZ9z4!!~W61QMUZ#(=Wzv|rC?cR|AIpLZ8b4dT?)%Zj;C$`Hv zO0g_}S#Q02Jz_?;t@s)$U*X2qtmePab%)5={y&L1zjO933T=HA+u@D$`s-$s9*2I~ z6U7$c-X(-t%bBqe`LmhKW4~2ia|B$@$C)yLXmBsofvDpQ==mhxwE-!?YhbQwEZ>j`#a^A` zl8S+Aad?Cv2TjL(9)t;@AQn?1an5;=xmKOxe_zl;Z~g6pk!k9AGK~@#cze=h64Ke1B=Ws z>kX0}G4CWewS$yjo(ggyc9d)>@Bok7P?qcM;064_Xh@0vvD08DP$(u$X7Gu&IdmWQ zdv*QP>M7>fZLQ0vg4|Z#c2$Gi*W0IYmZ~O$bi=GBlaH=R>`Wc-{WNx-_mDxpP#JD| z0_%vE^${0UD>YA21#b6u4L!+8Z6)=71{VrC~OD5Splx5TN%--(TUvO*`j^MKH!6(NVMqR!0no%p` zFP)EnCv1qNG^MntvYh=|2~P|cX)XYPU6nYAW50u^uMLG4z%RaPQfy3I1||@Lc)Sbq zre3589LbJqersdt>Uu=gRMUPMAj7!wd~IZ7P7=o5!W_%v6lT>}EvY0mPY%GVa*@g! zA7h~5h?H4i3&Gxx0}3R$*F%wu?J;z$`rhao@mXp={~Fdo?NccEw8_QL^uzRV!<%X1 zVtml+XB^PSMip^d-J~9ME8FgMhITOr`7XIae1xaIZhRvcSrxm|SU-6=-!v$OtZ~r? zxIU1wG!$J6GE*i@H6D~Uo&S=3A`e@DE8q3kLVO(I#tWz(u6Rg9{R*t<;0x8BF55T) zGPVPqgQ2gSJ$6Em<2)@^GvE$pusneYmAFk!XO5dNjCv)=?z5upZr@y+^bGUzU$ikM zW6Hz7+XNz{(Rt4-)J!Ii_zjr}SoY5}6(A1BzNA1pJe6*f@IMT~mj2qWY0k2-oTFv9 z@|VKbvSmHLaC$yL+)#+98pi%+l|9M_m^lBwDuD$!s2wQVBopg89(t$GY5zsoEV}7f$i@sXT5yz3?1R8JL|}lXSW1CogeqM5MpvT&wd8e8uzh z4+@#Zs4};<`{ElP78Bm4C)7#`4FlT(@f5NAwryguQwB04(PwKJqc>x(8|9o^o?B+n zDfKg%q5HbH7Y@a&WlvwXKXF?+)X-_*V|zw^3jEEX!tyVvZR*?vmlG~aY;cde%o5{jtWeDZ4S+i3-9H$JF4mvYMAbQoLco@blP59hpTogbYiLWa zZ%6R|;wZsa#215e3aIdwi{o!2N5Yqd8y!uKp=;*O8wN2Z9iaR?365eZXwqimzruyX zXPX*9Va%7jcU^nh<2g~u5eM^a(g4NwAlz+4Xh&|F$DZ= zWd5DXzm;O1bpoBCaY2!Vtp3T%&|yLL1M7AZ?dCMw)O5giFBXlqJ&)jw++G(B{z9sk zXyqBR9svj+K~h$+G-d7P!v*0Z+FNMw@WXtZeRb@Ot*Tg zym^oia)5x=oWNLZ&b;Hadee!i$2OD9!`|Z7Ir>S&g$_d_4)%br8LDHB{fUK^dQmT! za&If%`XBFFBCftb;5ij@|3}oDheQ3vfB&C0DxvIUnMz1xl*(>GsDvV^ER!Ua7#a-5 z%v83bOp)v}mV}h4RMwfXZ(*!S#tdT_>kMWXv)}ID_x|1Yb*^*0-{<^!&ij2`uk(7H z=i~WkwYNo=dTq7ddzzGHb$mZ?#a}ky5@5KQsYUzs)WgR+l4CduP)g`YD5sRor&cCj zCLG5Hy*ct&m%xeZJC{LmlDF6Sz{$C9=+fC3p4t=IDqVG=A`m!QXZNJfi!1zE~k&{9Y}cncJQU~Z6w3D zl{K=itf6GzBl%+FLWG+<V9*pfC&m|;{U8*nD+Th~jz4@!=awM=ef?d$3@B$*&0?mo`eoOku_9YC!Q%sl> z#`TG8^hFuKRkblpeRFG-$8Scvo-^AZ)U#X$WbU+fbwN~Tc%=&-iwZvzYbY>b`NqW%IJgf%Q=?Tm{I!$5nTLI7$MyS?x5q79)hHc5q!q?8U zGWw|+t>3^;Z?&N6k_A3*)LtJ&<=*o=pX=Ewl@K<=DKq&9LRcIlPP`8mU|L`R&s9QU zuVz`2=aDeU_-g?LVDI|5OG|){$B}{a!l=~dW}C{37H-=6f-@+=?I4WV{bu0e=S{wQ zMhdd{3X>PxFRl`4GneJs9fappt?7sn3HjcimA_#6Z8;ttHvDd|gS1rRww z9KEJYE!(to_Xxw^^VA>xwWS<94AwH$f1}o|P>Xw~bNsMa`me_ez?JmJ8X1=QS`=zS z%!=~*{1@fg3j#(O_H{AIOkJT}hdP!TbRWKcEi{o0xpTi9{<8}R&rXUpstiTXBdz8bdVP`FxIvL zaVHx}3KT?-Ha<))$=Y%mR3LW%P#g(btQ(qUS&ECN9h2WrBbN>+ZvH&NxWDmEJBB&p z564)&EK+#Wntp zp+oLqGcO`G9d?vK3{C#ytMPcRB5PU#h%Ds+F?vaF{Dp_x#vEc4Z#NBW*J#F^-X2xA zp#lM9CgD#-rDiVrY?P}HolS^RGL*DMk>reDT0Tq{)T7I$c5hfNx%e+VbPsL6)@~^H z6=F~_4~_5bk)EI^G?_aRVSC4kqncBtW8WQodPJwwYeZ@IV;I(n4;99v$tl-o{6J@x zUhkRn43!ysnPEdYm0IMtgiid6KJ=|bI$I;bwVegaY)xrn#pJ z>yJ7a6-PyP*8qO9Y6WIjUVsm->q}a)p`%mxuad@wz)8rxd}`PlVc&P1gu#it0D|p zBxTt@xTMoODaz$AM2jvy3FmrkIo*Ufqy@3>q3BlcX`Sh2e!!x!G`HBtsSP<8I17vy0tH^Rkg!qDIh(cIh)vHzBOB`)Ja z-uvot|Ej2@0Q1U4v0KPI|TONyWEK4$aa}syYV=NgRQ7#AViScICkh8oi3nu!bj#HNR(j&F; zZHl4f;8~(vy@crALdONM781C795{`=fDN4dawkRS9VtcI2P}BBD!Sgl{dL&ooQXR! z*brgt0M28Xv?F?FG>V@veP)F(;56I}W$6e7*iGNFWarLGA175r#iMS@YH+#)r5r7Y zNtDA1o=7 zD#@AJxncd?p+teI5jT>bqG1mu0lC z20*xpz~g9-Ej;jvI@FE1=mWS6S|scg-GYtQb2hvhP24WVTFlz#4sT+8gJGAL%S~cE z-lYcIBMpskXKR%8cY3M0l2}T)HBb{_@;Z|BMn2QQA{17x;VB8+_6UZShV(e4uRt-k`p)@2gp$d7ummx){@w zI=*+|rY*%`70}?dAV)tiA9S90DVK9fuy`6f(qVKU>fn0DMF0Wj9J!x(uNAFiNb>qR z62-Ml1RrIU_aN{uc_T*5y-TJx5NzMH5%%RuiC*xgMEIW>*h=j^$o~3XGIfULK+<#0 z)P}Rw=&LzP!Ffv&XHK)8SiaS{%6YOtzK{og1KUHddKMkfK~iF&A}3Ns|MyZz?pAEx z257fG=+ryCa!CG<$>ZV+e=Lf7mK1Dx`RUP*w3o9BkDU7vt!~z1sF>cFG-5JTc%kXs zfRSC?TU)mzcIxSqzE8A&@VYIhezHm8-mWdM2yGk+aH3n>#;Mlk zuyrZ9tU!ZWn@!0Dd38JS%)|LWBe3-B-ae8CIpPg&@hBVev}O|p)c7MOyVtpl5!eIC zD0lI4wD^1!oR&;FHf$#~8gP^^`W$op1F!G6M#*sv&_!g?0&NRu)Bw7Xhx<|;)SWw; zJE*^bI~v9`Lc8O$lE9uDhw|}P^w`*fMcrV+o!$#E9)l3maMR87(_+mf&l89C9Wd> zi!TN-6m(bQ-;!L0N`aQ9FclcBk+Z8bqy+qNEAx2de&J&VNsE%j1IDjL7d(8*@LgcG zi4V+vauJdD3>)7U>(7oqW1fi_xv1=Xmncn3L9TMKir8a}ftSQ+FAH?-M)$Rk^+A`Y zx7U(KE&&Yk!6!I>PPv>Gc@C3g+5%oy*To{*CsaGzU2a&#xQZIxHi?H{eS`+*bSOVD zD6ht`Rz?$$s+_m1??z=~@uab(v=*U$zSRMu>3{?CL~vK@@-E&J()jt=?uIH5z1AT# z=RanfTFFasNA8YJolsfMI7tvRL&bfrhp2)1zqZ4=J=b1Y~_q*)NnL8(@@aR#x_;|gf|LeexRvrCPo$Z;%XNSliEq5V`_;NS5&+UBBv(+oxm#|79H~0q;y#Gw5mrF>M{3qnb~L4thOQK zxJLz&FC=$u_SWAPKt5F}Ch;X`zS^wMfyc+$_6z33Z-S(FYq?eLHK~zu1FM3_T!;FT z$Xzs1Q~|dSHQ*g{BcUp*-|Fx~j|#PUj>3syae zZ_DPevkLId;oT#WWG(L%P5wGf&9$t~X^wIjB`KPV#byTV=gw|Adw^U3;@q{38!=*M zZ^t$F_{nXrpRjZzVZ!yH8zF(Q1ZdxES6JpWGi4eS$IA;NI=t#Ceto|9}R(GqC84IylpF zw72pg@5=nrsg2*)Eh3Xyi(N=#?}hT3!r|`moS1-_txu`?l?B=V4K|5%WDW3@^LsOQ zP$0VByJh0`Q_<&{XdfTn%6)&8n93izs^WYPEhF$D8KL}ofl^qB+^NU2fQy7G-q_CG zhpCZ$4pvsN&?UX#%cFr7RK6{v`4V9>Gvu6rY8~%UsCl>@8|#QLh%AFRY}C5Idfn%w{?dclp3|zYN{eF<8&7iERc3>Fn20CK z)VxICq{YCre9DBHTInMf-RS$P%_Xp0#F9?;BdaXTUOZ{LKPzy4z zacT+rRH#m`PG*@E#QgBKIHa>LDU-9Oz&y2-ch<&O>n-)Q;qk$!QCTp`p-^rM^JSuKKWQ7>h~u>oSQywPm?xLyZK~br#Se{Z*mLLZ)*z&6@;5xWJVbBh7*Gr`9qEfm^e9P{75q|>IOF?^m$m&d@ONM z{|CR5s*62bm#~0!rF>4qih(ROg@2RX>#^14C-wpEQ{{Tgu0Nn0!yE&neAYviSQqA? z4U%Q5U1VyL&U1$|C4naa{Qa3NUQ+3t-|@dR`Qdko%4OJcVNh1&nTsl@cMZ%Jf`7k1 z06%|>NnRMhrCDvhiYcRg#D-}*SQy~inBHb%S3^hQxb`}496T<77sz{Odn!H&%DNUn zlHKKnn=IN^nDV7dprNOWIikV2YL)%5x^w?Oc-*xou-1&&%7JN4_#sYeUeWUv6=K1+TbZhf4?U!7w1udsm*TBF6P z=u1`^2ggm`Z*AtEEg6qaW5=%CdL}k%DwTwi6Co$pU()yVjD4zVHj~oX?QKNUZTjjI zz(7}XeN@DJ`}IIw#_h{=w=BO*n#gCJrL&4q!4?cDm-cqoSqll*EV}(GJ~fqQ&^B(c z>&(lL2Y3%Zao~z*%z;`?Tw~Va2Tv59R`bbdOmrM6wOTZ!^}->29`=P6dJZX-2}_T0 zQk{Kxf+4BL#MHm%f2>|ELs}=Xe_?6;kJeeg%}#(YmZ|fcoi}5V)J`2ANtqi6!*`Z* z$|#)Z8X+>IEV#JO;$wB)0qRt@N4%+lJO|sMqjny7kpAaJZK(udkNUKm!M=R%x=*Gt|?W>YSAL)d(C1F80I(6 zKgyG^8GJ{;w-g1Isa~x2vZ(K~=PIm4ZDOv0KpBwCOENrU)oV6yUu^%n#%BiLO(lEjBUJqdh&EKgG<}%AUWs%ZM_nG>DVFi1= zNEg*Iu9pslsC16b=`qiwBNks6cDaK_z)|LkRGs)x0DChlekkYz_#pGXVm%bm!dGHi zPny?5gG~0;S4LgDJ-xAV6MF zrRxWS+jP9iI;r4GmeA3~e)nr+WB*=Ub%t#Rd3yG05b3__6D6B6PFHIG z&A3Cecj{t5EC&(Shl4;d`63F3RX+>!MxWB|_%YwBGL^11eja*eRpOuMd+Z~pY22|e zPepXX)5RCS$H$PdA8Ep4sOpae3!E0`2l|xVOP15#2T1jwszF}s;}3Y48y14=5og>( znO`@3J%_)I#WSS1-j4Ho;9ci3?!imu;d}LOSVX@NU0TbDT-yh|KM3*LF}hr=x2aZ_ zPgukKN%KBFW|ss9QVIoX+~uOBfae0yR)Sf42Yr?NTAuo$NN*Qq|3<{K+VP3>;i8mC zWB?Z*yfX3!Q`!@IN*Yz7lYP?XO$D!U=Pb^>(ZNBgVDzfT20y88d?v{#znAg*+;9Ix^dwmKRmA|xL=S%)Bj0{O0J z($8u5fEHZtfxg6vE`^+>zpaQd-hmI2Gm)H;gt&6{3kUwPk~iDGVlmU|z9@WkiTWh$ z9<_Lt1}-n#^!|>wn+wtK)#EbORwnah~N~2nF6i@*Q}XJ3xMio()XC;I}I#%07H)WQqHk z)*meR?M}k#ng6{gu4=7f-UZyVTHq0%_Dl{3^xE{o{)3b9gUfhv+_^4)g4T+L4a%MO z`ct1~SSuT-kg(W5{DytXGQU8nTFR>NIsi@B94Qb}myQ6$gDW~$Vfzu#4%7~~IpXyE z*u|KU-QJ_*D(u(6(cjBUVh3LM`F5*?b01JnwAEZsCGOc4S-F0pgjlwxnPeFex`OUU z?WePh>fM*PduF?)eH4fGe|JC&CFz+sT~4@uc=W2b0+ev+FRXcsBvdH6O(@qGqSr}B ztf?bzc}F~djML!Mo#aeeuQ^;Uf!RG^940&^7>5$|>D6-T#nV0bTj3g|y`2Brrd&RX z2NuXMZjW}Poek5BU%MemK+$^Q&Lu{DFNcE5_?C#h@z?f*r?kC9+07x&=gm*tU>l(f zowy=8xoX>1Jcd{3ZzW)vK_7*#@K-CN)!^3#_NzXEaPUZZ;uqb<`vJ(j7&Q zSFWBNK6t2HaN|3^-QQupo2w|&A7<$k1Qb1H6>a*Q-L$O=Ie zStV1Z76Pc-h&C=;<)|*ePkWb7k6EV$=H;Kn11CPA_KOTRe%i0c0My4i#y(iUC8K>( zgHD$bZ_nXe2?u{;(BIlGta@X@?3ja9r+L()5DC%t(cpvYpbPD4y?*;w{hACDYoTW{ zI9m=nHg)lMWkd0vm1DJ{V|d1mg%o=IJ~}6Wr&LMT4^cz3$%EqYyZNVuV^?7xXLq}1 zax@t(mSL|FJYwBW4`Zq6|!6!MjT_}zj1FDJA7boj^Jh{qY- z!pQghH{GVQ9RROmxRl3ZnNbPf#X)l+HWLr^K91|k5e`{iv<1=ANH5N zM9Ae6orLo53qy$+&iM7UM6IQ%sISQaQ7kRqDYIy|$GUT*Q3qH-(=p5s42@Bd%rGax$f4}< zNFvv~52DB$#f~JJ8eFH5`zo)_DTf-YPna^ew-(U0^xN#8&)TD^;r(3L8)!)P!!>uE zYzOMG6<==b@ON*62no2^rM#k~F?IXDPIDC@vK6`-#b3pzHXZutlAAAwf{vk9zHJhP zZd+8J_P;16?rSa4KEyuGv1dqhe);o^%S4y?%9nVE0XSmEq7iA=s(_Oz{!XJDp#8ij zx##b}m5NS4&{aa!J5c~Gd236v1&wuUaHYrFm}jDb8j>ur=N(XC96BcVDA6;EhYJ7= zno`fK$t2U!O;{cCu2ym8TI||@>VpV5Vg^E{1=EB$47?&&+sw{u!I;10oPs*Z{kuCK zN`<0pp;)?6dt#DmVuisF;J0Pw(XlX^)lYi;-M@jYx$-6)<9?wGeK3|qDKQ=Yj~CSf z^DTJ*sMrSe*4bKNJYp&ETW{mz00O-lV01YS)Ui?NpTjIw{e&_E|59(r9WiYOncg~WswTkS5!p-kRZtenZ* zwM^2IayrC+MLe;TgbMk#`Eo7CYLnl!QN9~rl4-sNrNwag__*#?_+x#<-WhalW8LS- zH{P$1t>dI=@nO^t#TXUQ&Ed+K&71=9&Q;+Y;;Cr-MSCGj1)iy+P6?eIe@)m8pTg19 z%lh2=Wk3JsJb7h#?;Fm9_PRgRXgz6k?Aq`;#sTcWete#Oq*cg&iB1J|m-uWKG%lT0 zhVNzRr!Ds=*#~a+N`zpwi(p3eFNg9j<+-guH+@WjM5Cy@(#lw9LI&UjbD%oDfG?qA0yP*9X71HlB2La-qz+@jPJpJbIixGh9y5Y-#%u&?HfCZ z3{#E5buxXPqJE@r29&YRM5wopH~kU>H({h1`>6mYiuDXvIc}rc@ZYGH83l5LpZ{XDJ=6&yf+sL1c z#w*)<_u*Y4{$7dUg9=QgK?)MMBqs80knu5=xng~n1>i*h=sC)3_3%OAVq;amr(2Y- z1XRtH93~m?4BF3inN>XzmUCUlqSI=PO;NFM#$Nb(pcW!ocQrtTM@XeIzgQt%coe5` z$%$(^pO1{SooWx=NH30o#cf%qe#d|O{u&4Cxnsu6!G9&OH0oY(2K?(2BMPaYKKC3h zW(t3{M3<^a4^d?{r_UKnA-8Us!sDzV1t2f32vN^bN@kKIsd3c2TK}OeJ0IJycHQ9L z{p0ZnuK*mH;cz(7pSEr=amk=Dbf~rZA zC6`Db{`lDJC$x}jOc8JUpX($6ksdP#+hpGz-udRjM)#!`7v=4DY(FAr`a~<&x4Ucq9=#I?X~(@Mvt4f==}M0Ke&N97r@!88tchlJ zU>S?ZHsLFd03-mASWR!Gm2Z<+OSCpnL6j$%BqvMV&!e7Ilxe_>oL?REH|BH%1Aj9- zY+-(yT;kJ`bKE_#{@=%36ag0c`_ewh=iZ39)GUww_ZQ+D)(L(L!f!!c!O9ttJ_!d=m-Pa5g+6`UOh5~O& zQQ7;Yhv2~`x+#A}##gogC4)M-`k-tLMo(aSAG^wN=i`)FBGc%vjvb}~Gm zc(JEQbfBPIPKR&a6!JRkdF3=nw~o7w|KG3?F|~r4LXe8{t))HoTNo~+T6Ygi!Vg6W zKhRSux6JI|@uu&OQ>pFdueZo9p_N%W_T-sw=*#Rh8_<>%JoI1GV`DibCZ&6Uwgzcv7kU22;NnMxte!{GNw*qR~XMSW(n=knt?y*X309{d; z?$GE>#Z*a)2z}04gseW))zI1JhA}DiEe2~?#%CmqqA4_wr${xem~+RG>&qIhK5TeF znRcDA^LkHJ7Zf`QlBviTR|;1UZ`EP)mqe8Vdsu_5)VXf+7dd)slEvLdN%i9c-y{T* zW~_Nm?b4)w*drR~3Yh6Wq{%pM#yq;usBux9D`Q^PdwiYlp=6A2>9K3A$!nT0jGPLd z_tJ!s4*DWtJ-+PO70(*{iAg^ys6jt+}R@)_2 zj@+xtyDeqwdsQEmDbwZ(bS5(|f^K!mcKO2+`%ImEfILX2#q0US|8CllA8e}mMtaRD z=cBgsWy@&ht$3+V0cKLdQ@Wo99p`=(e+TkT|5bgO)92!v8$Mlit-gE*Xz;Sxstt39 z6p!wJ)SjTOzZv&Vv;3>|DnXBwSDVayBS`O(LU#bp6f(59MUCvUvUt&g@u8yX6`#@O z#qLV^aa>&E`AA^F!8rV`&7uX~mn_I;5iW`o5r2A;uexWFmJj_F=j`tUWaFK{T-y#Xj;p1$A!t+WAj?Nl)wrT<4d6; z)Qs_9|DrZ3Bx9-3XyBA|zcG#BNFylnGU6i6Zpbtp_b}U#i`MM79$A;;tW9_#xXD|b z8(_DBEOf#udbrfcjtrK*QGmO_#vWs1-%wA=+xu?@Jr_u|6j?6?Ng=kR^BzKOQ5o?{ zl=jD(NW@mLB-Hw(?_WAceRgIobSm0>Gl98lKMyd^z&^+j%@)DYk(F_Aj`06-Bo<-ankj3Ndv`E9>hW6C^= zV!vifL!){&0g(zR>oD&*K3#bRzyM1o>x(tb3 zQA+TfE-|a*9fS}-&1lio`=Ok!T<-#C=YlQL#pC6h0P@8x?$ui9Vvilch!$z$@p$sVzsVWh;FZ2<-Y;v)>%gSYLfUU z?72scXZKDpEoHrsw&Wg$3&Cbz6dfaE>>@iw25?SC*^y1}4+O|iJN;U!ig9ubHGCOg z1%?eKf2nq}nY0*#UFOLxPIB&|?;h8lb`+%HpU(KMsMHhAyoEL^`i7FvR$J-Yw4jfqWeBbr*E;@`;#2A zCIK$FK0eirSI5h3WHeCtPXZ2kF#mAMo8TW#(+8K{in^ce^=1SGzJ$MHmcFW~ea7dC zw+iY`49&V~cnItXxv2i$?B#pdlA5Ardar91eB5*`W2nX-cRzON7Y#YM9gbo@ss0_3 zxOyUNG!`Z)0Fm<;_nG8)F9|N0e+3XGF-Vf{PHR&CV!#~1@Ni!<{K&DQ%am&jE4}I} z|9%$-Bw8n{{8e@9C%{Z7O!qwOcqkcAbZ)bzJgaud4-{;*adg(Sn-ji`?=ht6OkA&F z&0H;cSJ%6TeY!>y(X3%rf|O@Cec2QN=yfJ77>R3Qr?7>U3hofN3$N=FY8}KL`OT0Z`^PEzj_z@$nh76Jol_Yl~R<;X8X*Cp@ zXya^@XCK%x#zOFr7v(eu>O!y-n69$?3zXta0jRPBxfH%<A!}H{o^^o;8dsDgUpYIWHXHXZt-N19C5%p6sl9=DHv&mNN-_W6RFbDbx*buID z*=hc-FPmG;J7-(UF$`_)oA0#TkY6D5!XY#KS_9O|5oXoXI-T%BlSr#@w?2ryj|3cn z=07|L8>UPz=c8x3K~BPiVjEzr$cNTjn_dGx5{xs<)Fy(@-iV6j_8K$;cEXE{@{lse zsqsT_Wwn>V(zAzj!_rq_0XXjtpgmD7&f#}lqg#EuK2I&b{(){}Wi9Q-jWh}~c*^|q zUsWnAI!yK1sc$iyxzFh-p8HVwW?M>_*%K7)!2k;wTX%(jmz$SL#nvC?E!wE9Ha?~W z9Phmm0EztucJtXJM4Bk!XIB2KISA*rQl&C-KNBb1TWgH|dcK9(AX%`{@sKcN4{Y)! z{1*G0ZRp4AQ5ZiL`n@W^Zw*({`woqn)0{f07AH8Mso$uql;Jsabjs;Ar z416J0W_qjVel|g&UWGXrdZ_Z|8_2*yj^nUwWk;PpL-9DZLJN1nLd_+{3X##pfVry= z=5Y{DtyE7?RU1V)U#oV^0qxpX@ERX{OhwF0kY{M4djaSbvhJ(+Th+KLX+=2pZ^+U~ zME^Tj$~qSvxI$_N*^?`hC+qG59m{t+BDG_DEbd}Tbp`p6U%f*kWTVQ4>g+}L1@fa) z@NP@{jR%LB*@x?Xmwq-`sN1kM{jlqwE{-vRJY|3~~7 z^IqyrhWl2)o#Cy#lbgJ^!=FEW)FWKp`udyLH(pAwlD+nJH-GQg!bNx=E`4k!b3r#_ z^xW~!4=svKl=}6Jg4`mq+!CBszP)xj_bBv)PTsS!vpMJ8_C#V}0lntI-G(3x2SMS~ zQ%&hp;)8xoZ#5(fPqitIH~3jvCs%`BN0LW{a><~hKKjo$T+%eG;7b40PsT#F@roU; zW{4!fn^q%Pl0@N=FpC{n#BM8=%GxUYMb2eI=NYwj(-A!{n4)mFl*1|*R5qc?>@c8{ z!|5FGfTuO_1;L039w^%-qB-?(ChO77;C}he zjWf9C^GE&=cl`7HjCB-h@_3cO8dI{Tk&1M)Hc?JP$o|E)-wlPva{;H3<_{!|L>X1r zIMQGLzOMFcyOA=uw{# z?Rn}s--W7d>M>ob6a|l4L}o(;+e6*j5PEdN7Dzp3iDQnLx>qr{4Q!E6KiX!htgwO; z?vK$l#MVi!o{z23(*J{!2LULV0iwF0)Eo%;%f)hoR%?L+u4qGM^!z z=5ZPcn|pY$R2P|DBTqw5#UK~1GC2D`gP)&+8xr$&V}lO8;)0(6A3Inek`ZGEIEyMo zMI_&o2XgDI$sg42HJ3-S14!QPK5LH(V=Ho>#2YhqcYC z+lE*Q`V2}m6CaxU_=Jc#*sy*LQg=in;Aty;lzD8S8`}`M<@`J+o9nl0_5{PmTL9e? z*7tD7V)rd>1nkd?-;Uep)ToCoXFHqPhnWo0t{&#y%p@ za}}@fUZ}ci99@8vK~Xo>a-&!4Vop*ApSc;5s;$WZZOSVcQ6`g`Tn$`(k7A%byfz(J zolo45&lHtKKGUrr{~?#&Qy<%RMflZ^wC-|FD)%$H>DyS|X?+eYCH2I_)Rmi<>h}&D zGm>VU>Yikr2GE8a(b1(Ivs-mJqLT`Hlh#=_ea3E;dWqtEdq&>UmRphrduwFvLc|u( zDof)5zFrH=kC?I;n4Wkk_rA=}&FkcD_i!jHl8!ij%_Hpza5l{X0zxYQNFyYV=xytk zLm#-uO?5|nXi}Z#@4&sG(Tp@AqT4*Rg|f6c5OX) zQ~c0s%;)Ku+!hCQEfBE8`!cpL7fk2s^Y29bxz=7B<*h)hZ-0W313ME_96@&T^0xwR zte9S4;W>J1^<>qTo}H|iFS#YTW9=$plPL>HQgwh=@2wxXf$!>bv0aNS24~alU~BTz_?q|8j?0~;Khoic-$ARfQI8y#U7uR(W>T(+F5O?BRTAbJ{>&`6 zgJow)KYVh&<0=+Zl~Lb)4eN$+z*Iiy!2W)Fqt#y~3q1Rht#$fh-e=CGM+3U*7hSXm z9v7n7_l_2A9%9wnJS@Rb&&{qjAf;5H>YevrrfHq-GE2>X=2y5rzOJuv&*#)1dieWL zTeAUJ@mThRj$4mY-nlVuB^C-5s^2`mZuaKOJ)^Aa zgxFU}#X&Jv1F2G%ihgWbj$XEJjVPNE&gDBN-8biN{g8PaOl@eL@PEh;Vef(O#^w}T zckSJ`cjs2$YFn>LDhetJyA@RSZaqrJAJfL~%WD~RM*h2U^y;1C5B^`P9-E@}U|=rV z(=Y}fN+e~cG4aQ^>)>DBBETh?a%JN`V;v&CsweveqtA%<{_FnE5)kEPp;1_}OEGIM z@B(c)x#PKL6y1+A^gak5m(LS~_yr4#1)Z?D+g2fL6H%v2t}V*ZN*KUSC*48r+R6ZG z)t)bzJNP+_guN@ww|IQVNw`G)2DDZFdU`w>p!TY0o_&^H7%;c*y|_^3+|Ufp54DRA zI4X$<$lD>g}KI5$oIi!I0i9*Mp#@?X;Pm4^OR(esmnn>0*I6IFY+oD083$}c*W z<31A-z6`@|P(6kJshTVxA*SLWb~<$}i0uaUMQD9KX)xYok2KuE;lPuXftn7j%Q3Bb z<3%*sjZ+oy!b9JXVXA*HdOZM4+$`fQ-cA^x`lwDJGl<+O4(A2?;75pQ{&IkG#37C>z>IC%7 zEZzi;7r5B>99hRIChn-Wn1T&kPE4n;zz(1uQ*JS=9~Q@|gA59luR=XoQ2(f&LFw8! zMRFrPR7w{1jrdcPHvF?q?+T*^bcN|h3`6(!X-0O;t1m3hS+as zsm>f@)V#)@5LsYEN(}C!4j}l-9;wNr_xvoudfq!6R z6d40F-3DvHd*~rj8DDuSOz@&w9ggZs)Ut-*)9*hXNN}L%k5$pzbiRo=u_-|VSLblTln?K#uvr zi4w0GY(PE}<2<*WxLkhbktt>hBp=rEYvPN48eD|gp*%C{;vT;^-}n~%VD zfMQTf^uu+hNwr5LSBqGw@x5oF*UgdYXT4ggyLwY_h$32A`xM3=O5XA z@H*6QLw5uCnTU9?ZaU<3L->zY)H`BjO^6#V$)pyk`UTbwnqGz0WPo_DG(Nk8dz98> zTaA~RdOajq+HHA%tyh-JL4QOczMFoo`DAKdpS(($4SXhcrw67S7|G3hC}U~2wa1Sr zT^_8BJ5j5f3T0+J)Of*XLTvGDDq+y?75D{qG9T`V9AX|t+67`XUd;#e4(ATTj#fl{ ztTC?Il*?<}<>g8ET2rY__{Q7*B`QDWOH|yS+|k>3+S$;a19)Z+{o=5$INWEBGiS+D ztNBqYvoJ2=Im?4QeVA+Ky_msk@%)C@jQBt176Y(hP9NVsk3ur#<--79U||V=_@%H= zYYRJIziIBgcfaLH96|02r*czns*v*g(0Ie2ACzVpyzQblx#@RC#{r*7=7K88jPBMA z=#K`7uR2)T$$r#X;jEzT@#VTam#fTaGHq*3uTZgz9n5^nDDyLTs7|2V+P|gBeZ7YD zq*5o6HmQpp>GQd@sC>s#4lKDMpRx*XT^ALA8-#8jC?mBg(P$Ci@x*);Y(x3~;|+zq zKXUbvr$WLWiRaJm7^>`+h;97;ABXqvli2aUNBeeC_HlgJ8t-6RE7yfwL_ z@%;ZD?Py$~s1hKQrL&K?v*M9|aKOeWojUtOEc%&KEPhiLul_fF3Si_@L`8iN3j1`R zph2Ex_muL)f8sp`G*BTxl)b9O?hG(_jthAm)iyUk`ayV&$*0~qC|1X#F@>NB0}+|~ zYOAEQP{aCxv=Q#>#g;s#0rRC+4sD&R`B|>w1Nc`y@qy2#un!T>Dd*{^p6V1zoT=bs zSSP)OY6of7WmUx2l4Jd=W%YPOSMh$0orsIn1GOnu_SmNE@V~o-3-{+nm;)ZcA9!uG ze7@ey&W%z~eqzW@{vQN3q@Trzdh}6k0@Qr%&Rc>q)x&6AdEz4#O>bv5ab`K&7DJ*j z-v_Rk!rq>iMSBAfvmA8ASvP}8V0}Flxjkdf+!iMgWzSM>&yl)!3GC-Q6N@3$ z(&qFs;x6V2tZ#Nk<6n$^oeN`!#dDo!CC{qpx; zOqHsyC4z2@uG>mS!mM+C%|eP|Xc@H*$mJ*sYu20!KMFB@0&Oxmmz*VJ7^?9reBvWz#I-~3h`9XW$u zEP$v6H_4qz?D6JrOgPV#$MLKl!vRgIs1l-7_V3|*bpPyEZlDkLsxdn7R+n~nzA1c} za|&gm%#rRgNfxeAH{Vz76vrGriR?xYerq3iX6n z8%JYwFQ=tKKhDhl%-n(x8fa1xVqBa{d&u&iChU~_ANm|)5rRfJ3C9@ZIko;}} znXq`#ZUVQ0*ms#bU#&mmel)fdL|aXXBGgI3{y@mN_#9nsj4uVL#Q z4E`9-8m>PB0+)iC-|`VzYx}b^uxx}^vB(Q<4~1%YJ1F-#uDqvKKJ}44W8Bk!HU=6Z zkKfhP>dDzb^&(p{8!>ztz0H}c#yYaAJ*_AHd0E&HBXRjIu|Uph&o$OU10r^|jJp&g z{lF^QvnQe}mkxXY9Z-YfE0~hm8NF2@=}#8KyR36i#;@u)LK=s-D!Ke_w#}{2mhGzo zoBdxjy$4)U`~N?F%gof$%+gGgTc(yXHCHO!rkS~NpgC}q=GF)m5x8Zp9NaQj4l*k> z2aXg?1-Ip_n|t9%DNs=mP!RZWKi~iV@Zf#Un{ysKcpTp6^?r@#`}u4RD_y=x5PN7l zDVVnHvw4c*`WFQ*n0$lL(Ib=M)DxTX-cql189oKE3e{H`*V_&nFYuiEnf9c__-}Yc zO5I`XRgza(zQMH-W0dMBtU0ID>i70t~Z7it2wQyyJ9}#85L>0J#}%Z%n#<#mr8+4e+>cZkCO5gss`3_&dF$d6dc5v8L(NI%U z)6i&cne|jr(-0nMXsA(~obC*k8#oBB7ryjnelpV7F9twDNCt{XV)J+#?ADa)d>*yP zN|1C*HG1$;tVrA8iDC-=n*tTL(#a3fsic(x&1A=EofbdDB1q$ygno z-UmRhrKxJJ*u?Z5n~MhrD*L{RKE4Vq#WZ`P-1$F0M{R2`zsCKF?lc@X`!?_^Z2R(O zdCxp?uKqOo@+hxYYxYC9C2e9`r~)`|Q1J9eEGQPm%P=^TL@)OGm-bT9w3?lmkp~z_ zAiIsxl8A|6UlYh7W9-maAb@kC=?%LFF?)3)ZKg&=o^ng4U?P5APkUpj^jlkh-a1~| zpkJKRzV~U!<{lEjxd^Cx6L&%E*R91|$#Hx+33rrr<9m99q5OECgb$?kD9bP}tPwtZ zz@wJ?aHb6D=t4@g?ab)>3jKGdux6%=TY*11&b~4itxz$6d{0182PjDUQiL@uKH@K$ z0f2KY;$-8`YY;X>B18Ua75Cx4adXk4dpdK{zl!3%BwYOhMB*c?h^Yj{LNfp-I96v* zX5}PWSpRuhbRBF60&vWBP{j4coUCh~HZUUF#kKok=#V!m_2#$@_*~LXdc=>7l8<_~ z3+XtxUfi7ez3`VfkD3FE&QBKj3DO1Ib3gqWd ztny4L7@Cfx;Agj&1FCd_VezZd#g=a#83i>f1|Sb>1Y~|t_uhx@-`-zf$ zJi&M%ha7560#uGIW<&y%PhluKFP8K)8*z``B2Sg4c6bh?(6xvk1eOn1jJ*y|9mp?! zq}3>QO)XWOd%;y#VA=1W7pGi%n&Nd726$XHFBG*w2Y9ltd(b=u#;;T;pS!2*H9>R# zUMw*`aqT0{4hU1A%8P~C5{DGeCvpQCKylu&w~+mX$sk|uN7NuEiAka8AX3jf=d7`~};V`25ymIox%)V#lyaBx~R!{TVTw z<85?5K5pe234WnKSA&Gu*2G$7Pu%3lW)sU+teR6Cu`cu9we3lTp9n23+cj0{w-;lN zN!^`rvBXTXOPd47&2Fo6r*Q);YT|`ScT0RuCvu?w#rh0H0=eS-=6Idmh*(xUJfGXX zN@>Xg9kzT7ETLb_@T&Fr#Z_*Ef5eXOZkyMHRGyc%-_5;`+-E!X8=K_5eZf+5T(|AO zMB2d3l?Zooz3JOMm<5J8@vT36h|`#5S!OQ4LQCkac5RP@wJd$&bC7-IE##P^XCl^_7sn zut_E3Xc=O&t>^wKa~n6vF|Q}!MZ?L1#KiSYeW#*oDl)qZ8TQ6;^TYbY1MXZMFKps_ zo4x5cq2gD|N`yeMk;vkWv(_hQM`%+7Hucw)G9}Gu=}lwnGsKRONmJ!1)5LWpOejfa z$Mdwyx{~zbQ71yQburF^YTn;4Tq4{hanOIe%v;_;<7hw1Jb+J1ZD?-jPf9^dfwvP% z-FvWX*2taYNX>tmInF+;QL0@tR>lV~=cZfV4&}!`V4&;vc7d-EV~_LKe}wVP_Y?@9 zc;+PCH;=}Bc+uXNNBim{rdYol;9ly4r<$-b<_!jAY2tuS z-Qc2E64_hUJUk>(uOj$~{G#ZOd&C2}UFTZ&J6_y3Q|Sdey?MFypxL4gwM8_%D=J@w zD8}jpQb$J1X-Uxw7BPT%!#Pp0DhN_~;g7gO^+o|FfsJsxg_BB2vYRggaXEs+wq2z) zhsfz4-TyY-*{{=?Q*#(HRWK1T#(~Tf816{MNs=Zx?iC0zZYYoHUn&VS;UyDDz=;gx7OjpN;d~K+?no$aTn5^rHH=oGP#FSiJ-sg4OTw zrLlP%^#8?D=<9`{O1+uqGSB7RSIe`~&%6KfoRyleckb)Cysv}z_4Dqi2|s;23?FvW zH^@6@rT^cR{x7Y(z77uF_ZNyp>dbTR@)(gw^jtIlRsr50IuXh@YkD}kcf>?aawPwHcu92Vyyeb(863N)Hmi?%;#dGZDLwLI*X);F zuV0KW*$SPYIcR#Zijn=za_gVhIMdQ`;vwQp0qNJL?y1p&BNTKoyAl-70lA=$N;2Gf z&715z8+)J&H(X<+q<<6BfG;uXolV<%yPCgnwg24cPF-|%mH4p>vOadkIz4aepNSN3 z`|VsCg1HR+U}arwt(;4Kbv(1?@7*KWIfTH^$();yWm~VdPH}Fh;P17qekz{vaWlVf zeRfS34=>y_YPBWokNU;93ckme+67KZ(>nI;9F6)7eJ^-1ufp}bSa668s)gR%_9&YG zPBe4cB4mTm7`3ZG7|d_RUzig0?PgiPRXf#Agzb!lWg5rg&*7sJw5KMqQnYmBOIJa@5kK}yk>@WY6nuHz5(8_ zdJe|QqxAXL<_JS`>V$N@90Ql z?jZtYc=N20#+3$)iy=Tcm#C>r6w1(%2K!b>igcf*K>lah1m3R0WGTn9NfcDH-1Qm{ zNMJ;zi*0@@YqliYL#-PykI~Cde$!Tka*VQkBN8EO@Kz!@`<@4%C*m(d{9}dmmfJ}A zIdi1fgH8|M74j?ZMxEgtdxc$fYn_Za(T~%0C(_^d9xK_aBb~>#+IqtEN9jGcKkZdW zSUk<9jUL4%(lvMOPj7MVyMmMxB6sgP(nI>O-Tq5I9KOgc>3-7vMpxZ+P>kG7r8sUH z?ZO|MeHQ6Y`uwf1Myx+6`|ZVfN!nk#n5BVVE!jD=ZS}6b*DUGS_9bbiQl?K~T<}qz zxJ4!TFv!x!i~kl*7vJsm6Vg=ZZ8>}*2%ckPL1SKe+Q13u7~|RR2)W+ky}w8TtPuog zP)aT*XCGeP?Nw^>Moz_g#by}kPHelM$GX<@)z*vee~GU7vgdm`?Bu|L+}~m4M9qb!k~NSD$nX-+CVV0{6wT?koAEvpVT_BK)W1o4p%^M=3k*>lTl(^CB^M zF?y}9B^au5?8_^FUlv!v?RQnv1Zj{ao>!+Pgf=~H?5De0;}V0 zI|&ThFf6lGx!s!P;R9C;Wy^kR?jr z#Q7i7M&}8?1+#aiNP=oEID2B8r!UA&aNGV%*J1aXvk(C+>N1 zPJ6^t?FqHT?0sSPAhj#_s;~h{e`S~$>JsQXE#I?EEEX~d4%+sbWP9-=ynznENcGJx zoc!$q=KNo~f0gb&q0^tx>`7egrjyVQ`y#fDv_tIXaD-*?mhXALwEQj)qTIN;|2KJ! zMP4sNAMe{5yrZ9KrEm4}z8Wa=zHtBFRF*mTziI62IbqjIjXPI_FwXn$jIf_KICw`* z*qqy4FJ+T4w4@o3E;(+*l+BtYo7&y(ClSY8cLncebBT|4N!CA7W=zAoF3}ZYWDT^j zfveuia^6D9eei62!q0F&h?dhXx^hEDZrNUIkksWvf6)E@14kp-GNrE)cWj`xpQ7&T zQ|KPg9H&9m{CtoqwmqFq!>bnhij@$fW!aEAf=fY40yA{dmsb@vpE3d?_H@Qr5pg}d zZprS{ou_+$RA&OtDtC;z{yG@8WCC-~#{LOP`Qd^OfEhH&N?LTg4TFvn&)RxFvn(JM zN>ei`X_8y}x5T$Dp!!rj!(0CpWb6okt>9Yg2kLWLq%1yClpO(Z-24OQ^KlIDnj&~d zeSn+>Ln`fK0MCVY*d2pDo5Vg8-= ztV#~QxEXiS*jp@W$&ZnT#8jW(Qyy7IJYG&ldg(UK%<|6{n0Z4Xzu2F4AKel<$CL5X zRL9R5Kl^G%R_{!=UdY#EDt{wPw7TWv;82QVAuIOyM|kadCnj_}r(HBIm=b3NA2J4; zKnkR};H*9vay~9bhqPQ*Nag*>od3?ffs7pqk)_@9+EU(F-nSuK8LW+Y|5)J;p8 zZ)_H|YW0I2=OR9Kj?{jMd&qTz^|(Hb)*eT^f8~m3G_evOid5>5DpW_&8CHA~F4rX{QrI`lso`>Hn$Um1o#@cJ`e3UlD zI9^;-dSHA8`leaZh+R13`Kj4@=O$a%=oi1oKQ0(s@4xjKIh=^3v03nZR<0}0Uq<5Oe@`;lLxE&kr_qFbkM%`CJ&B|%Ov|_0X zTNb^j@ZsFm2D|E`f*LqaPI_`razJyVt0KjIPORK&>C$W?|FK7XEBnEl4J^_E_p^S} z74g({!Xn?5eMKsgP)^!9uPiLYkj5c@7s+r#48qahsJO@cSvh!`}X54*XuYcV0s%-FV;_1minCD~|+4BQ^ z#UJmPLzbg{-gfg6pmBwu8UYa?7TLb!Q;~DcOsJmVsOsU&~Y?q1vsT{g-q z`G%ENkG_^Mb8kR{jyqQT8l0}`8V_>~XIPAzuV)?1FKLof+>!y-xFT-B*Do+FdXvT{ zp4nxVS&Rokr)#H{q(V9ZCLcgg1cxa``AJ9l;+RKrDT<%?XQ+T);2h2S^KKa?Ra&Y z8GFEL{Hs@JLHczTKk1eFcbnl31rtf^Jwo5?(;1Q8 zH(9ge`H!ezNES*LY54Q@oO%TUqHHQQ?il`!mXg?f@zl5>`Y(2h$ASFE*e@+V(T|Ik?&3a+Bcp?TR>GcfkW6JeN zP2f7)6YmhhxD(gAkijL3eAxHR%dbh6ZCLX+?B|>#6?l7MIoFn8qx=cDqLOX*A}K^i z+^=SUlek#60_5EM;uoQ0`)l_%@J1H_wd+MRKK1A&=QMnd1twjim$*)<+jc3KC`ytO zOBVM$;d84!@ST(MKXz{vWkxSLnkXD0HwaV;gMS8a5G9MifoU*VW>?kYU!iWb8?ov5 z5i(=|Z%@t{E*EkMJ1#GBj5v4)yCj8(c*0=JBn}AoqE21Zm0R_ojx=zTcQduH5t&b;Yhr!gMaZz`T%tDIE-{85=zX{xrpl2hC{usLVv0ma-&N^1CdCli10?Vl z`u2mmI8=Jv7{&OD$Yyn`O*TIKMYy}bCI+1fgnM`?*YVH6Pxj+$V{VOEGNU{7&I2&6 zNTvP}$%q?X0m%LRxMdee7U?UUdaW)_W7s|?JYd;}*lHSl=LfA82#4+i8c2gCXwOVn zryfuTG6NPRv@QXv-8^4OM|Xi&iN>G9={j+e6D#3<{q{}R)kX)>pQSHXh>z>c!4F_7 z>-XWhq30_Hu)YVGT9akm+rtU;k~;II_yTFk#LivwUqw#DR#m(8PyD-e=I2LV*+-+- zioN!&$U4AwOI~UbUu9Mlx8A)*u${NAj;CkDIa+%X%G3uG(;HFkj%5SC}`i|h#^evRR3Yotz*E_+fvCH~?Z z>pM(e3)88zoQuS<7n&Z>@}IHOIbo^W!1k*%(Gqf9$7TW!0>2@A-MFAyWYpAN!I04S zn#Uc~{UR7A?uWFC?#kS5UWe4E)1fK8)kL1U_EU?Q)ugr~VH>lPEB$Uc(2ZUU*3=AGvNJ@GYykI2t& zBz)91$v;FUA3KAt0gj>H@>MFIU}VpXfhEz2sjErT+MH9{r?2cT8`E_;%H9@xCpPfS zB0ou?8*d_s4*XreRK8l%Z4&nDKiZqR=Rp_n_aOO^7F%fk{}rIdqFYB`!f;6wf$6_< zLG$aOo*N$5uix}%4Spfi^)v*q28W|o_^9N;vmf*84A)Mm-cUGkPa4Mt5ZNU-bP)y$ zBp0NTOo@som^AD=aXo>|m_(+xbqMBbt#(xRtK5TTKJs_ce{b5{N%hn#>B+lj5Y?wO zDT46RV)YcckR-)&MQTA(M)f{XN>5E|Fg?wKv$rM=d9~~%Y|ExyAH0$ ztlj2LrZu`E{UR@A>p?ydwoG)|B~JP=Gb1EyyKlRIPLMjjj)O%jgaff4ngRlU8&kUG?z(NO&=3*rUptKbkYmMPw84{3in`Ig7U|CJJ#i?C~gCg`P60 z1_8ko>V>f9hv*YJ1}($m~C1qsk~;Jo1&`hc`p8NxJ-XSo&Z z@vN_sZ|2BUUzgfON!Ym;j#?B5#rY0`r{*g*TH7GqhD~z1i)KgyqdOGF)ZEEH;?s#|L;OID3&M{B^*jetsGX;lpWg2kL8*--2*1@s) z(O)T_?A&6|#{s<|F;lGDuqi#w)$8jp9p7~-^Vt`|?9NG`3`YQ5uVOL3+W#~kg3k`7 z!Z+oZ?jg4O29refKtVKTcG?)P@TeQ)B(|5dj`~EpvFWCj$S&8ktt7dtroim_1)=jD zEoE(*53o2E1&+vhub0`Aw+;oPh5z!vl1d}kR0yg%QFAuC@8nFqeC;t8sj>=R#Fo=v z5W|X*0H&@VtkMVhQTINqK?^k&*TcFE4Vp%s*9n4B?-80-uwAjPiq?}YtO|nLFrSze z?oH!28yY#24k#{BC%*tOIhDjbrZJu%H#u4vgvEwD01+F80^_x9kQ=c5ApyMg+A6mh z3e|1z)PITS?@Kz9hJT`DTim=N?bb5dv;e`o^OGY=$?=hgdVSCpsr8%}CK7!MuBm;? zCIfbd%YG0Ar|T=2HeFWZ#voVzFI?^P5&19C+xRBJO z_b2fPepxCtdP!&R5PL!0D4=v@3_rpF^~~)ks4aO>tv?ZX<7`#sn!PJ~ogArqBp-8M zXvR{c`F&s&caEVJ#_ivI zj(@lKg;N&sbN2q?7t?84QnKSxSOpk(LapyouH27embqx;!9DZirk1;-xiSXsz`~UV z!SB!vmOE6r-;Uc z^>PS(3fp~^1$_X_S5NhJ$On(Ep6Cj=Gj^hnY#)73U#XlRR-``8elmJGXUUT!`5+m_ z{@%@LgJd@;@qME!_ap|uf8r2?biJRjzN{1&HhN2y&Q7UFR3X7iKeq&xwN!*5s@tl4 zcJDP3p9e2jVt|#*ssFRcP`O^q!h!6K|(}BjiwxFQh z@yXt}eb#+xalQ6V}( z#ff;ASrO@c6(w5TG1C)? z9vJ>eN^05sd#Mam#;A@tiCHLqhRpa}@=@T3P_~`e6)(6@vT=O4C(}gCF4)fQ0tnJO z&o8mSst9`F(=@~B3Pb(AcLx5MwE?yAwcsh!k(A~wtu%{N-k0}rUQ3hp>$#Y?wM=%| zALLrlZpuh+F1xu~wDxFGydK+6){#2gb@n6_Xh-h*D(~!BYgO*`rwRb7b;aXYeg9q8 zQ}y1b4DySnVAZs}{q=TO_4z{(8OZg3z9v2*%F7DhmxI128p zFr1)neLmn>q>R(IygD_jEX60N3sW6ZhIqtdGcY7)GfZ|4;j|^msZO3b*S%h=LUe}Dozqwp*$do0CS4|MokA-&&p}kucBAX&e zNciv1(vitZA4vvxNIX5%Gv4EQI}(qOM%q%4nutbK(@sBuEc{uB8D;nFo-f4oc9`5m zo-83L62l8n(cQ96@~G#(O_bFKtSAF`iuLFX(9JR(I%zp4w|q~Ua;^JE#ARXBP67Wc z0YM`_6yO-5k7W2~w2*!l`c51qaW9TD)t?J>(aje@fVu<$}ovkMYKsP2P5 zk_+oj=nwB4qD;6j4TtfIQcT_11hXx$M|z7h9=x0TL%FTqj`oZjDP*8OD*c-$LID>5 zI!F;B$~}IRWo*oTOa-=d6i;+QAN%p|NUouUA^H@)j5bw1@Wk|oBgs^<-dks|3IV^! z!RDB7im*+8o4+Bfr~r6CGmEh@-CIgXU>f;dX_36koXk+kd9q%PWHP3lriVFJU@1tg zAVs2NvOE9HwefoT;21}d<`2d$dktz5)A%<*I$fHZceSuWI_lb^UgapSgcG$d={K^7 zr*MwwvxFBKN z;WdjA?+ z%U5V8My!^PmmVh9(J`bry0fn~Z}n89bsP6x8pq`|+i~ZxQTykQXj=wm2Q?S|tjZ8? z^cwsVa_d*XPspqF8jD6}(q(VxT5g0uwT~o z;KpMx@T>@e(wY=!&FYEX^o#?Dohy(Y-ThNIES-0COb#SbqWfq{X@Cj6JGo@O=h&qZ=Q2(v}pBM zQ7^EMP~A1wq-?x!bN#p4I>TQ$(gHqWVl*?_*Pll(h0P`)BE&Yvlr7Egu~p`A(JUcn z^y%(v|JgXby@QyK8wZNI9XV(NTLIRVIw#xT$0Kfr?}^plFVG9V8RXfRHu^c_WByg3 zdZf-^`jnm{o8c`rnE!%fi_&_-+5d4Q-yU*Q@@uE-fmDAdfe?=^5Ih@)zZ(88tZ=xS zeAb$U1f*$S%dMrI4Nk~BStsijeD|6uYi;U6|FIr}kyoDg))LO&TQhSjsT|wl7Yx&& zuQSnJpn!folN!B)4I>QrIqmB zrp$xUkLnV^l1 zui-mVw@02m2`w2p{}^_Lrf7P9RIHhNMB5xtZXGnsXq5Lzy}dN<8@OhkTF$- z>U$J=DWi7RVKpY7Jv$IcQb?7JRI;t3+4Pp146S~cnMIiN%#UGH3?k%)JDSI_N%ceQ zEs>f0aNdokKR};&vrQ-Er{{fV+=CiWAYffIlgWKUda}~ApD{D5-gFGq>wL2Fx>km2 zZROAay^)=_agb?Ne=190RYpo`Fk)YF=`w6mrcSm{Y|4}b`?Hq&$wNC0yXj-@gQ1g$ zEpqTek5kTlrYLBIZaW)4QvB%NZmZ(VBD-wX1r6f=t-Ex^sag=if37Pq+M3*Nz4DR1DWM^aD}J=D zVS5o*LZ_wseXFlB@pp!9Jfr3B&qDNd&);gKf`CE0Mwz>fXsLb&}5&PCsU8w5R64P2UT%eS2P7HW2vRg6|$q zCJz-D>Z|=i?LHmLs@WGOLTF{{;HxW^ml_@|2L`QNe-Jc>J`pqrccw5#$0{?5U8K72 zLK<6ew!{x@6CYfZN5#e1K?(85p^19JqqjOtTDA)Fx2Ewa2jTlJse#=)9)5f7Ft#UY zt!OMfrOMv)pJ~p>GIUaIW~PPnd)<>wlEJp;tPL;QN6(7G$ex=I@~J`5*wZlf-1(Uh8}T9$7qh!jCdXmqE!X2*cZ)$KZ`eDg^>hpUYIGH1LZC8g z_t#wHjZq#UK3x3=AfZHWno{dJwc59Qz)8x`wd+%!f~;Qh7p%3 z!!VLT#D_Vq7Gk2!xP8h*9yY;<*f+mGdO({h0Sn zgR8F;wIfU$J3dWLJE1DOqsj_g6H+GkWo{aHgf=)4Dtm@qa9t+#sYBt{S8f~6{+(~% zT&Iww4tYcW8H^D0av(msvrqdAs~Ss{rW5;1!Xpo91Vk-+QKcIQj{;hFZ6c9k{N(tE znla>h3&^Ln89-{sI+$Kk68g{P&-=Ej?yqJnh$|(jJHRg;v@3qJ>S>W-O)diBzge6EOa9Hp~|ZmeqW9SV0x%4f-5c)5YVaIR2Z zH4Sq3{6p2=8;*Ahk5__o&)gZ9y-n2wz0&-hE9r>N=+EklK`R+7oSL8T>wWj8Uu^w? z<-12$cDGdhA9$Ibt^bZbR$oHD!p6po9~ceEjh^HBm_O^=1Zxe)oy+cCHo`^EK?5o0M?HgyX>M}Xs-o-__SY59gpX{iI4bpuMwgc>}})ZB_z>}btSQM4Zstt zr{2vtz9k*T)|$c%lnR2MXgipe#w5j4s79PxDpsWtcD ztiSUlX8ha-+LCJHhhW{8$~>s|8HJ%<@SXF$KH&Tb59774AVSj6dpmzZQX9Kg$=Qq5 zIX?;DzRtT?G4|*Wsa~z@ocM_3a`uEU8S{zYL|E-yjA^GkBUeID6_)oP@QMQM5avZK zUqV99#eJ5=j~-vrAm3gPF5gIf;cuD`2xrJfc*RE6j$w#p~ zub;iX*zXl6YpDIRX z>%Mv?V<*@P$O)3m+(oz3mfnU+<($R3Y|72@uuJ}ap_MAaJV6gEvVcYE;s`xV|Kt+X zOG=lxi9+dl;u+g9{w1w4o~zyBosj1?5k`&n=3)Vh<{=pvZ);O|^77d+e5dH-showY zV-^{q5w+tpOZpy9)@wy{`l6cd!m-|#9tjlFo=v3&ovB#Q>Z6{-xoqndMitF=lWfM0w(_`_p$0Oy3ap$5*T%tR)w8m>mmZ@fSl zmZmlc3hCKF!-O7MB$k45ntQY&RAuEI0*#w*j4bHJ{DJO@*XQugfSj?Qt)u++d;80~ zs#Sq!vj#B;StvM}SF*`yz2EA9Bz$8m1C_q=vs>TkiM252i5-4-zw$O8juXcb=0;hS zsccR>s|!nisXW5L!L2aXs=Pd=Y>M4WVm&0c>5bOY(uMMv%W}?f`b8-Li-G-Smb_s{ zqHj#~lH>ht;vcDg;>@-~BfY|stZv84nD=RW2CvW;vU~MiZ*Ps!HO8`f9@Uw9X@-xY z;5@;JnzzHtYK7Dz`kY=k=`8{OkrWzp#>Hi>>Yi@7$#Aj6{1a!GSG2F;$_=EPOJ7UP z2g<-lyGBZo&yiMlUR{IoF08hQMGdxCN~EKvPUicn^wbLe045LVSAw2t*Cvd2jq8sC zdipja$9Cb&7P|SJKFD!jr*-?|~ z^-y}c<=J`@*5GV>JgMAnc0$HP{~AA{GTv{~b8g1r9w2o&@~rK@7U6%}I2qg8c1TB@ zvIPrn#@fb-sVyJw`EHzU5Ggm@>;Ex4<3d3NkTI%Gkr$3K?Yo{$2i(iU^mKAw5D$Zf z7c_b_^$6~v5r)+rc3W24(V?fS`@(iid!s{D!tN4BE)pCeA5p?=?+!4`f%GMn*6lJl zfh2w4a!!Ty;UY@oG`l!qbBZLKMH3hvi6iuWZ;~cH6(%F3EGS{e}-Oy=&$0vIW-CQx6L#P*W?)hc;Av@CcY#zan~) zeQq|PX9|O;werAaNi^R}P ztGKJYXF|{@4XT{Db!jtf&f&NtH zMC3n|gMK^0AB5&EeWrl;F!53k(ln@@O%6t=0S|;t?VIE*HE^65?)((*!%%Q zdg}nNBXehz?j$(0+;ecEu-D+jxYaF`uYpy_X52A@3yJw(w~kRuYh2;wn{U@4w|js1 zo^m1?RwFr*v;`!!bQR!zkn*F1lO@v?VlL_5$nWk8$!%ZF^obfwX|B}4GY!he+LBGL zR?4R6&cuF1h%)kC7-8ibAQZ%vQNr=g{U@LNzB(x1)9I>p-BU&@V`K{Wpaz~EO!DeE zRz^D`yA|yEFUyhZE&=H?uDO)mfK2YyZ`56>8hJiOlW_g+B+&GEQ0e;->s*DUfMEk* zk1on_aMyXNAFN(&yb-8LtQLB>=1e>)8D;zlXx!erI+H!oy_!EwxKz)(i;~Qr0A_Wq zPEONHLR+;P>v-F)-05Bxn3lpSiSL2cl(BH8T>wOS0(Gm^t<-6g0@^Gkd1g*CGWQknWmjgcD%YB_>oE0tiUE_MkX>JB=dAu zFtsG(ISR2i&tw?I)++E@hDN?+K4@fKVK72?yQ{|;W*!fDt|7K~SoXqQ4{x2W8)uw& z#%Dajc=@5rnpKcT2~3~&Jr!%w@YYik-dYDEEULTGv(@nnYO~Kl3sSQwEn5Mz@rZT7 zOYV?`T==IL5#?SLmf&=wfSWsZx<{6UIF9WOjp3lTnZwhUiOUzvG4jGReWNRn*Tsn& zTN?PlK_3ZU&}mJN-pp>3K85K*!~mohRUCKiv}h*4UV}#6*V69tl^i+Dj?z~62fA#v zN8p8IE(j+gPo@jK7+5_f-=A-`QNci?7cnC!=PZRd*rSTaOpu)w1Mz_p5ZvJe*%(T-RuvLRxQ~Tuv9=RYudtx&E`;k>K2h z8nyA>bFO04Y4+R8NH9|yVpKybQBHLC)Nmx(s4z~4_>!!yRixJJrTI&8QTl!cA?cyD zCmJR7NXn!J^C8Q7^N2}tMqVt5S%mhcA>`dHmjO%aJ9@p|0r?}rq#My|3ceOd-JTjn zRt@b2<8qGd6o*p;?3zEbgqj41E&aKtB({81DG^ztD}|4FW)bivJ(%~Rk$)aBd~&a| z$e@z~spmwRoa$S?UhvGX_ML?tx&OYq9rez|(y7lss!$Rx?d2vS0n?Z3?a5OisW7jh zTG*;9&!Zq!(Jcg#p&QQavl{Y~V( zmUbgqBpxNksFpN>p z>f|7u|JPh5+SfYdLG4D{K#a`Hg7YYHav!dEC;b>S_c_Nk|42KAO6syG-|&oDXLoLQFTx>bl>S&+O-1>3!ONIGB26MC?mXE2 ztZrCz5Jr2aHs1Cs+hjlSzWM3M#G?#_6d3K7vO^`qR1*H#j?gifrdw-1C+ijp6pJ(x zTCoTP_>@RT5D-(&(2xFe^44hc@7>FS$3-iW2l4@u-t&J&pw28|QzT{OFQvX6?(^-w zvH5096C?q-Q5dWqa=H+rnrtollo97awhv4lIGWSLNV61sI%euL?ptVi;w15UoT#Q= zHKR;I82!SXvRujEV3i$B!^J_}crDtK;qcYq;$i8YaM7m|>GjZez-5efb^2v6MJCDT zT1eVft+-K70C|Y?KMeA-QTVGNm{RYSOrLG`i-&sW0{>BU&%AWitg=5m zSLIvZLD#EGbpu_Gi}``HLU?BD1gDnpLsFefABJ;kc>lUe40vDu;G>tH)03(vLhGTs z?xS`2xQf&ITnA@%u_a}e%enS75YhS&+Lg*6hE_hNPu%rLU*7aUBhQ4PF;kI|8KDnM zYlx5-?@%guzU3-k>VvFI`Vpx%+^NtAnqi$<@-qq#@xmB;?>Fk`i_|gdfj45kx!Mtg zykzaj7gPPK1DkT@L+poo%tvO?`Gt;c``wo{LgGUsRaa+P z`j}1MXP+rX7=-oQpP~9fiMj`|o%?n!v3dh)5uR_i{@{voCP=YcxwmKZBbN8e-*TBc2|OUWyM8#)xB!Z z6cb!25J6%3Pp=G(>}c|zfQlcH?HqSEyG&!Y&(2yzm`x*e`gUS;SD z|CMwU2r?2Io+&wghBFoZ$dx-sC?;|0$G3xKz*TV{6{J`s;gV-uF)r?-jc4DeNAu&V zA?Xw(+FSPy>uRMH2Mu)zh{GXbB?6-L?q%*x%zvE2NCwKpye?EulPq>6$f4i zW*gVCS|2N=U0a7M#Ng&sG-oWj)`}Kma^?&==@rk{F?E-_IC&-q`<5QgD28(*8$k}u z3DS9nA?TN;-&v*J8S6GTR=h%~18$9_e3g^o!=Iqc5P?HM`jJX(DzpZuAqEW%*BR~- zojgEZzUri-)7jH>Jg4N*_N$dSi5c*Qc1P>^Aes@w-yx?puf)^^ou|9$zIQC^TE(WB8QT!$SA^%%x5W0ovrwJ1E%^$j>GYHZ@kTj}MB6do zKS3{%94Llm9!~ST=Lu&!$ezc=fw+isJFRC&(Noap|6)3pTyS`@g^bj_v&Z7Rtp3Zf z&k;?PDko-;id|O*rY+?C^qlzFwcM;99P^nq;GCmWR!)E4BO|a^Vr|^HUpo2VcaV-z zuaI+PbeulyMCG&o7I2LQZy*F>%KotK8OEJMAZWCntx?A%Og8vI8D5;4Z%G<6_6eV%B_Ow??&xu6 z1h^CP&qX5M@F3fSa+8y0GyJ27kxPz@mQY<0T36ABd8o;J7_FRtNGU}+w`5)Lj(5i_ zC!u8XikXn6WgXL3YqGCCvS9te%zT%LjQZm7f}o(H_{_*t!!-=k@rik@f{gme4?{xK z4|K@XL|zz4d)#NnalI(B`W_j)2vMDm_e~o8rc5y(p#f=|CXim^QiVB)-{a{2$JCpL zL-of0|L;<%grw|CB~+FnvYV+Sm7=KZ#u5@)l5DdS*|Js2l4UFvvJ4^Hn6XQiv6F2u z7z_q8V>UDMozLg{`(4*}&L8JG*IBOnzRxx1US7}F<9RA}@fOj)lEI6%<7fiZ|C^hc z&0Dxi_TY6bO%FyN-29jP?#9F8AHUyD`vevIe&hAS@egJqH*Vbb9`d_fZv6{EyLdOj z>f-04n|Bk+Z}!riv3<}at*Z=z7G@KOjR4%Bvv8FgN4O`CECxUh$1awpf#0|XWqXVc>M8Vn?r?n);hdg!m3qs4d3}%_pZa z_JH=IxPPLyKDl4K8f{+rw!A1Dn&lJM7^~=u{#ahh>C&+oW@foqH+6rn%A{Vcf&^tv zG-H1S+q?Q?rN5{W{9R4Wnr;l|_jtiB-5|ZHqBgljY$PuGHXmQPs)Lhl`e#`Bl#v|T z++0mm1$T}buE*OrIO7UK#`sF7jFGPE&g1RCN%4p*YB>heFIdTVJBdY!0BR!)B={HZ zj~6i?l$y^rErd!s`z3cg3{5CEl#0z%+XOnlb+3vFQ%SB0TQ>aHJYo<}P3jI@85_rq zEIRX|ThoD&IfZUH(>JF>#z>VxQf|=HO;TbdwT6^h27jmjca(9j)mx9R2>&QMzPhYp ze>M~_&=sKy;+OAe5CcV~*t0bgNNus3O;@?~{l?Mc?PCelX3HtsPhLPPiM&ZG;UuyL z#LKw)kYnI3o9(b(K+8m*P2f58F2ywPQ^xmtnRHhj;8Q}?K~kRwILH?_R|&O`FWt6t ze8D0YFp}98oj$(YrHJ3cKK;Ud!aE9%UaUN3c&V2vlEV{OfjX1wJ0Ib6_D|F~z=|5$ z_K#zJ(}VYqU~0)j;Y}Oa=#JSm?!R6C1tk6VGHo(!tCnmH1#MN6nf>eh8#0eT?_xJ) zZVZU%io%l}Hf55(`C=AArA+c zliZ~fZgz9yL;8>P!m~eDH>CEc00j~{0vE&XUFKNwCic|<`?TSRn{YitVE3aOvi=Su z=CWA&@1VcG8ZHOQ{QP9o{Ifhl-SZ!6fQ_2WtN%*Pv2+|?i8E=Ke1&f8U(4=MzPbVN zDHzEAwHz#T^*(z`U^Aq+0#aTND7oJUJj@<=&SMvhCyzmx5n~|-!cGLoKSsJz4LW}8 z0ZKgJHi5>Aje*$}MRd1CW}uAJhxET-H)knYbWB=$(jV}xnT+~NI`Q}p)+0+2q>@j=Dq|K(i>hcn_PMQ}Y_4Q;f zgnu!)BWE%ED=E?DBk8lbb6~ojMWdT;sR}wK1F~%tv!yd(yd{u?=TOi*c&C9|`N-t> zLmYK<45ykaY`hrpg%U@&ft{qtQU98fFz0kAzcU)%K^~xm!~UhCd|d;3>jB>0dqtM( z&O&*9F>m!Qq6v2}q3WAtj!t0qiGj{@#Vq5=tq4P6(=q=aK*SO)<+j^7Wk#+hr3o zvJg|_-VFpIai4qoM+ck9RelKjx!km3g?O$>GS0jO3%7{E{O@e#b9%_6nA_>Dl$_09 zpPFfZ|0t<6Bvw52Nc)y}#Y$?i=G!v>bIR(%$8Vn=Uby_vYR~zjT9zY>hBxS@u@{iI zU>pIKt4m_d6lG*G)T*CP<2KmBo8z}hQJz~#)@YFn1nAHp;4Uon8-HG>(oh{|&C!~Y zmqGLN2I{Sp=?5|T&qI$gU)F>=6l^uf{(ff@;0zOZb-3~T%8QH4zuK7h`e?y!j6t9T z*=PRf{=!2CpZ$+t2&glhi?;`mQH7~U)@Of#?rXbq>d%+=g($W)lLs&gOp8|$dUD{P zZj6B7ea7sNqVj8|(0J$cXKb$K z7PVpZ{hvi2M5XS&WX)cSkv8m~0==SHQyvZ*^}wjU!QR+=hfi;Ab!2sZnUJ%K1F&VJ zaFfCw2qXDgbIgC>3%WuDy>kyp;K(TzK)cO$t**0a`!D{_;6q@Ax{G`0Y#WkzVS1kO zce1$~cau6v9PZV%B8}ne2Cc0@xWuWRe}>z$lbB(1#^2`jmz0s!@0b+M*}cIfcpO*6 zo}A*2b%e4G32u%|565jP{2rFU_+a4TI{0MoD-dXBBljGzdwhTZW2f|yhC6*DOT z*B5uSCpay2i1{`>fc{=QI}yMZut#gNI(WQ8_+1v zotBhYN*Z3LDOD@1<-hnFcJal!W*BvX+_1#*q>qh2v+(eA=AF6UE*06#_x=uxfE2V( zZur_?lj+OLqo8H@9rjENdHR+VR5jeN-dLZS1k*=v{ulCYy?-E}=r&lgSs*-pl;&Risx3Xst}0y6qz`u&YuUFw)BdW3Pku>u6CTi;QZPS)I4kVsx|uhdcR~q z^Q3~I7Bvo5zctZR{$&pT?<4G4!Q8)(OHu{cWK~iE&7JVgXiEB4T60B6h@S!6*&yY2 zkb)D5xf+^+kSA3MEE*^4EK{7rx?j7FHd+!mCd*QR=!fB?;6>DSK?YgW#eMR^^Ck%= zWvgb*-Er+)-B}0Se!$!N?%4OZ6BvD_RWZ;xCgye6Mxi=Gf9juCEael zdUd5%ThD8l&VcnrFrUMMkMJs~-AAGM@zcz@F8>G7I3+4L;(Ei#Cu9%>H?5?WD@k}Q zh7#hIt@?mMn<#VNsdJ%-arAKvA7M&)-PkDw4SY_F!<}pPVW4#JY=+>PT+OURCbpa| zKb7H=3#rl~7^5AC@3szpZ@PjxHmio_?&bz3X9t%rqL@QhmLpoWDwWAu`Mc|8DN6~I zHoyCiK;d0-^$_pfIhFp-IZc1)sfZ%jC7kYFVdZ@{_-?@*^}k~5L(pi^>m3v`k5(8$ zl{Y?F9x`@`F?b~3un1T8J{xA1E+ce7^~s(~`|GDSALFTEl)|yuvV4 zp-`Q0OQ}34Bwx9uX-D}cW;K3WE))<{W0{D)A4$_h{>6Zp$^N^_c$0|#)GS)zC)F%E z;YW=Hjg76)L<~HfDKiUF2(&i5Xd;&T}!8vFkvfc}ek@c1!La^{r(>FdmP zu(kD-B4**GEAExq=Zp9=FL?_K78rhai@A9x-t)J@c@;G+HIrXiRzq=bZvTisqI>m9 zq0dLDf{(((1veEHM>eW3#J&yV6%c|^Ub_dRZ3K;GMtrfli!8Btz~wMHp4fbv`1tVQ zMDHJ;p3Xgk=3GvZZS*MhWdt~LLUEw+`T8f5C94Rq?5~Lk)*mKT#tx~gQTGuQsTw5x zVvJyG!X|4?jEPeozUUgGE3)suexkD3s9r~#kpIV8e@v;apH|JtCsP=}Xyv6J%k0mzmvwBp zFw%tZ(^2qrBepXF2>PV&RXdTH4$Cnvn(b>?Gp@&0^fs6~-9fNyUOKaSSUISXsvdpa z0n@9K;Vk*Hh0LCw;dHq8Qnv6X_;12e_Skj8e&)y(+&xb8J~4BwuLLI}{i3$docjSU zN6>#CyBTc1mr4kjd^o_q*uZn=@*&4yYSQpMIc3NOh2MiPwq?JT(n?(G-)@L(~!0h(`W?dY<8 z%@mm_^K`B>LFAlI4o7xc6PJrN(rr)=?#!;Mh-$Vl9p-|<{MH?R6|O(Sh6RV^=B)Mx z5jURJ4Fo;nH2_IJn=smRmhi3M1M3Tmw!X+HOI0OwF#a%}uYATnF`H(E5)=s2UuMR7 zWMw^|%1srM;E*~b!O4chp_~n=A)Fz63oppFwscr7p4A6IM}f+{`-k^Xbrns`16f2< zOjfx~IxFrs(SBvjr4aqm=rbf$(^VDt^n`_r-!IJ%cetAF0{Yj4+)h1l&0JE>Ks-O; zB@G=d{UPaI6eRoT6XF-q)ojh@M4v{NQGc+8Q7RVsk89_Cf$97$87;HLH$BLeVYx>> zqzPpj#W00@JH#@vSC!mUyYP;qlX3hSyJ1_g*)G4f+NoYc!iyb*P3D1~uo;p-*S*9g zj(g?dX^l0-6)$PNAi7LYQoE+KPvsdXvI?YwZVMjdUWO)i-#p>6W#q2K68j`jc~C{R zT`!KPycmEIunv&%EZ_#?mnUPY$p6G?{ncvU=I%ZzBfCbGwa*`9`Ul`fyFU<8#TQlA zgNCq7V8-qbP4Q~YT{XPeu8`52e!Y)SFBd{I1W0i=x>e~vX$Sx0coTGIg>08Xu6omO zAR#f`JtJIEzplkL5nt@Jc;8=|FWD|5;frmQE6TS@Gs`F;o0I&|-D)sY{)da$ihF`P zDu#5x`+vJ46_z`3PQ?dR4 zvGU0txD99x;tQf17O&gjK8$n0L|Yl+sov8P;=O5B#9Dhni)EFF2N(j_(()IO&r zmWn&8VkWQSilZf^y8x*N9TPJt?m!Kp*7NIT0jHB&PgAr&$F(#>RWf|qrPitSeAC-$ z=Og^2!?YM)yB~y;CKiqEfj#@W?qnqFbe6TdW<>L45^MKC!I%#{QLEhx8Oy&Jw#io~ z-vE8P^fsQjWm{IX9UCR~+|Mw9>ZG|I_>uM!`cnFLk(}Lg5?n3pi2g@ZWrt2qxX#MF z7-N4)QKG|OCaOHtB2)9Ap^F(Wm#GS{*RHa2IkEf59xgWIp=D=m04h~^zFkjJzOy1D zw#PQHx9YU{_R)%#FSc)e0@R+kp3K_5SkVQ_VLb14R!Ov3yp|mg!23GBNvJ$T&W1ev zGbvwMGU0Y|`inGslAmQb7uOtc&~xFD%v*)P)9Rg>_0qHgd+)?nzl?W$nv${ZQhsg4 z$K8dEOrhHPvLgWser-;nC-J~5O7lAFBY!OM){~M1mov^Xi{VT5kRv3APD1xwXg25e zu5m`9@FMSRc)H}wL z@My*rZI@YYY$)L33wK2N+DdE_*yB>H#ixBO5XX1dRofrirm%J-_A0btx0BD2E_8p4 zoqxFgLhmb6?_Q@+sJca~*Y@iMb)|(j9|8^Z6CDC|<+`kl7DBlO?%K{V{A;*d7Hw4- zr~zm0f6i|rs*ctz(&$2*Xyfr}05E2m4z$=GrE3UvZibE)yZ^k0ZY$=ci)qZoTW45y z?TiZi3A4S~oQo2-Tzt*kqyv#}!}-yqjq?~jjR{LMNST&S!q^opMffO#?O%{04rj6- zpLRCk8lWWoza!%KiW9u>0nGn_*#V$C;ix3oDNk$5cA0f#Ap`)xO#C59?Hb0>*!yE$ z^P%o%aD409?kA{Sfv-U;A}ca{l6r~@{{I)i^AG-DG+3^Chjb?Ro5RD*3cSH{>~7+c)IK#wOW3bqY5SVz9a-M(E}AX%Z3nR$*7 zCa9ldW-FH#9x=d6d`hIb1F_hC2vBPm>+Vd#rjSCs(nu*ZsV+EI#&nD8syEc}Rq%#D zyM*<58TCiiX5&@2#?7PsYBZ!rG~>E%xstLrxL?=LQe8Az)|LRgQBTfOWubzqJ6Hb@ zUZxAkuHGaDcU6%Em&k$ztzlQ^&m!7;I3;J=CQo)NW@R**KI=Bp9!kixm*XwzHa)Hv ziPaeC1!kw4%B}2o^$3o&SxaFVE|XIux5#S$<$@z@m~8Lkh3YJ}F)KGu?JNOm4M8wBlw$xMCQPxVs*$ z#H^HY7+etVss>tUnNI8W?K8?OFBI)R%(&ycWkZ#4t<6)OfEW2LKPe5#~b|43-1g_o-BL0^ycx5@OipK|Ol z@~{4hG?fM2F&->i83{cQo57V06H{_MAl8d_aY|U1l&Md$c(pJqe^lA^GPOj$cuF&2 z=M=?VUcKeeir0pS&L^*T@6?ujyU2sTZE6#lHhu6|-vv3}?u&_CWZOv4AF>-)wO`gY zsW$XT%KT|miRARfP0!M-hv>}>fM%?hVb>pm^7n9sgtF8hiU7sVr$AJ~_pS47X5DkOyk2_3cm zBcO>0S8w>Qw>Z7fwE644L-O=3^q){rL#0XWZxiDbO~*G?i4j7@$*+t5;)_z#^VlW} z|KXJb50WKGJR)xFSB1p%57j-yN~zNAi_Yo9$}`o5(INS=b?(OY^~ZxWZH?c4QrMU?EwSJrqJq&IQOk6t!d}qBQg(vs8?%sF23B6j; z8cY{Z6L+~H=6XrJOX$S>6Qd;RSHr;nka;A9{Ak(G6P7L~h35(M5SbRh_7zx)=(AS> z{?Km*?^7iaF?aMF$R1^*Gs)8dN4be`(?YY1xY!*px~dYMP{ukAa5ccIXoJW5+Fp-; zNi`ozenFSm>Rx?g4~o0K(LGXs`aY^`*>m6f+ALB4aOe@z3X_`smgXjcj>Z;%w~!4| zeDtK1qs;9WGx4N?=zjY4IoCKDOS!WM6LD%-M&NBHT%36ozs-UoM8r(UAuh&=Pqf9t_Yx*MK{=8y`uHy%)2vm106TE52 zt;j&#WL($T+|Pt*<$E1Z`^V^?($ZZH__f$Xui(#p1UwMN+o8A_0Xm-UV!%$O+^(if zoBYtx_juD|g4!=aK^C31EBBSKH)D0Uk}Lh^0E4QoMp63*D>@!0dVLHU3-*-sv%17F?q4E<`=jEFj6HeN`@UCLEDiG<~ ze#d^mS%ES*A^QWDRY8N-Y4R2*l>VZ9UVo`f<=`)}E1a2@!o#t5Mwr_7SD&ByN)cAy z&Q)hg!FFHH;eGzd&86}O95s9QBMO_@%d)s1Yp=}ZHkX)30RDE~ok>!kQ+DpSvC)2v z!8xBx>NnG$3(Tci<~c=xKVa7oJJ~9TiLLptr&SR3pIWv`jh3ljiQnxyxHcd6xXoWkv%#noYM0T%w#tnJQs%V6E0>dkFi;g8dOn7ONmYeo zR+l0!!$baPNv7{MZ!AaX5736ySeul7_opC4_+{uTejLtXU7fiocOUTkFUOFm%3R#k zdoM{rj6B@Kx)aA5H+=lR`8(a?{)^rGg>gczuW29(k$YXdKOSIcB8^5|5Ny<@SA(`wH$;@I#j15|I$QL4aZsN-yI>m&^lr0o7~NR zDUNsKK9cK6p;fXTpn%ixcBt2-*AL zo2?>HIyevWYPW(2>iUEkj^mw;$~>BJ7g+Z|!{C2W2@P1!yp4%O4RqpulN=5H|BnLh zJtj!D>}VwnSegC%8F%!IGT+V34EH#@xAqfR>cad=cr3E&gKb=b52$Zz0%Vkcou4#UKdFR%C8{uM?pw+urWvo6S7eQhf zVfFO};N0Ib{rmD3`g5JHjS{TwJBc0D@lEmKA`xmq8YN>hSg{!%O8mI6YvGyF1FBs< zX|r@`9}KsJFI0j&)gc}r0!#qajnfu0-blRd$%t$CpJ7~HElRLiqU}EYn9xFYU5C88 zvU3Yf4b*ucQBUc~yy4_~gncgw7B8BTkg6$U!vj*`uVe?`=xg1{cqcmDd1~=$$Kmnt z+KlD+j;IcrC~_2s?_F(Apv&#KQSN9S!Fe!z7b&TpM#9w^hl}u#>}a3LqhK?{@^jxd zT~nHa>?v9$N*ZCH_+(!Dcd1f^fk&5FrI5dC=!3+QvlnGLcaL@81CI0(=8w!Iz3>%p zQy*PMRL(XRDRScI(=Rz&Hg-U>SFl?~(ez`EExWAxt&1>_oU-k&x%kdOr7FzLKAcjT zO?*07JOOu-=GN!D(*~@nz0=p_|BLIq>#0T#lTUs+qrPMiiH*}mxj~XwQ5SCUCVc5Z z*%KWN*qKD##BdAqcC3FKK!Q~xBsHb0ItmgG+Rom#MO4&k1aHF-s1=#2P%xHm~%YKSTbP_=`(#TM(ddC~($B^7xa9`@IN}Do! zJ_ot}N>mS*v^4ZewcDp4tL=5_9}?&nvpirIdfKlOKj|^fS2VpVw|-rL8j1dsc^fR6 zB)oWf9NBq3Eq&pN?^Cvtin^lTZ|2X!jzSA*;w&*Vi7FoN^%8umvU!h(tjl^eHRH_E z+-&-!YW54N9&U>klXn5JP2D~)A6ew|d_zC_fMYLpDnYXMQ+pv3JL~OK$8JyGMT5n) z^qMVw%m*rN8S=gi4S1Pgd)Mi2A$HdV===l7D3ND>akERBybc2?g^k`{3cXVwh>-L_ zQ&MR>vEQRzJ3a<6r8rFGCamFA-y?#@2_-E!g`J-hDBa5rk7sp~Us;Fx0kDRk_F3?&NN)pp!Y&suPKsyedOIIqQI9?xiPP^@Y#vf;< zpFGl#EZ7$n)L}69Y0c;IKVTBEzw0F|-O}-iE64BN7w;=SuE5fFvrSYH1EJ`6Wn1|? zY{NZ-)=kIj7;Ab=$)2Ij1J>6~+sX;YioIX^fz~#x>zh7q66tCkQV!T;D)wH9zqcm=0&8vnhX^y+{&Xpnya7$i=Ax#!1>+Wf7SHF?u zzCrC6Jz3D(ojGN`Y4T&(?9m!ar|T2{!2FpL3i3%E?W(lGmGXwP^nkugBVXwJCv2hb z48#R`dhKb%oiaO;teb9js8Yp+6y*82ccnvE7EZ9otDST|p-0>RExUgSPrisvB@kx1 zgTfMt=+=;*Nis#L5UKvaVZG#)QmwCb`hLgB&KN_-CB}15$On9A2^fNq8o=J~69zD7 zhgkQ|Vmww^2r4k6E4*Lf=K#iFWyI5m=ZIxn-o!NCwwv*$#!{RHFq6(0*3DEn#qhlx zL3P@DHuo?4yTA0n$n{+ksHbkt7kpE06jk?`n1N*wQHidOI9Eql1zWRw?P<24h~)|@ zOsKtEzI6xjlxtu~Zzk)|#w?wKYf`4q4$Pyd4DXHn8aN=5F5}7b z8&5D$w|dBG?Chv|{NrjF=AO};AW1W|u^+evgT<15vALZ)%x2WF@=$&DY!Pia^Q zlots2z|#LpTb<6h&R(mUE1a+oE)o`yB(VZz@XP)k$2w|5JAUedi_qE1us5McU~wgh zBvaey+O!uEmFrj$mE_iMfU5rlcFrqV)mc?`yo{uB^V^wnSd?9?X3ctt73XEwov!lYvEj$ITHu8o(0OqaCR|`8*cct-wJkv89%1VN zpXoVb(h9^8-67k2Fx_So6oJA8S1<^yC4{`2Dljr-(Maoca|d6CZoKkePApEqoZ9>$ zEZ0UE-DXsOu8}GCxjnScWD_TBPll+FjapF7*PEN(9M}y8kfMw;`a>PN=pzK#C4Fbp za*%g1iPYQAG}?#Io@1`d9s3jUzBJ4R6C}78)>Y0y{Ok?q?1P`tp|{Dt>I{|0Mj-ZQ z5!M#hx>&{yQTIfVWxHp)0@dw;gMWBvliZn3=Mo6(04;bCK`Q~j7NS5?UVOHmn4F?j z`{OHuYP=%E_-ynY|2L>4&|8 zm8RosD;~uNwf!1;56}mRJuH54Almlqva9(^iStM5CS6~z>o)6+K6@c_JoBy&feiH= zP^2NS5G*uo%a|||gdo)2*&V>$He-S=n59Xle(Cxfkz_s8$!|10AtC)l(rhr8m`H>_ zl}V|HwVsexk<(F+Cc1PMb_L06jo;k3C@DYbl3hC#Dx+j6A>8uyepyH=4;x;-tvQ7Y z9k!)@u6kX)V>xM7Npk~_`8XaSZBh4x*?oEj!~M`c%$VK@T#VXuBB0gZS9h*qmZ-Lk z++HtA0>xOi!s>S<@t5?xV*_<~qT&UidclfGZ^+Ssci7e}*Z|XoU$uqQ{==yYv9%j6 z?K}CxNXTnLvm!QXJKM`RR>8RrTMt2uxVm}zUQr^?!!}Y{!0miB031mI9X0n3b_|`| z43bEvRsurLFd{ynUR=Nk*}|eV`7D%e=F^|=LA6*8``K0dPPt}4ODSF|;&r+5^ILe; z+yzn@`5;q}-C}E*Tk&Q(Y(U$vC_kA)^p$r#7=D1o`pL}I7xXzs>HNLqxqAi^@r9<3HRR7bc|F%--myM3$-pxiN z$uC2Eqge|c*;vi&CjIOtpx%Grw^%cyqg+97l(@CO(k&ifwMBjX5kK<|rEVdwj{nuJ z$X3qCq*<{rNm2tXo=k8|+?M;!B4{)0P3F{=(32*zQirqR+r8JT<|dN;wq+K9KIcFY z1t`=zDx?5+8x^?`lErN=8jRh+yN)v?$AjKQ_{SMkJ5yt6Dmhto+h(pUV7s`x~@WKJUA!p zznm=>Yu1wvZxIdxqmC#)pqZKBgq@bi2Sd*VbIvm5D7d^iZUg@(uZ8EkD33bA*Ht!L z*XXce2`QBp-WbOxbX{R22rk1Y< zB6x|cFNSzv=)yb+L;0kTifEG^|B9z?x`o9P!Fg%k@!pXbU%0kk3>lX4!8dwwbijyFP0_k|=Q)ym zf4Yv_L_H71W1<4@R?ljR%2!Pcf}^ zMY=sfoSyz?8K!%x&nJScmSZVuXw2g2N)_0-_a<932M9Mng?w{Uk|!g| zJe_nn<9&z1V~BS0-YFv$*n7a{axwU&^k?qS;bOfrLk38x^wukV_%eFOs2)QalOFDl z+_V)I4-XDfZ~4^KPI21sNb=u#gc4BW=)X7P$dsFtFT?!^4N}5q_}4y7Re60hwwo`h zKQp*2hRx%Un=OVe8AO@(i#`lgQT>Lf=`!2-TM%~DVrLlTy#!~}-GpyqP=m-i35F&O zdmf|?Msxw*uS7+g=6)^uM({S?&6-m16dCF4dZS(-Y8z?ybfO*wFD0e_4qp#BX5@n%cSn$hZOf{z(QH!~gW z!PNdCMPJ}#sNyM-BVvl0YDs)W*bg_xjm3*3e&@E){;n*mW6mNYlNKvk&q`2FfE^L9 z-UtDAvR7AAlVS~GJIzX^CqOoiv}M!<=N>>^Vtf&ky=YU4T-?20x5~*0jjM3o&a4l0 z#UC3bRlHH7W)8R>;PE=r{Sh{Z%?21&ZN~z*Mf(xDUDt2peA5xrB$3m4Fs(A?iy_I$ zIp78Pn}USltRZ55YWz!O!*9ajjU_&+@u97z!7y!*=3Az-)vF^!6?3+nz<|o+CE;?? zkL$!H?=QkpfEnRi$?MXE0&E_99$i8kBCW}CXGC$Q%1KN6vunTskTuXZ*m9PXK;4uz zgnBV^(Yr=ltX`O&Oq+p*5alcW192o*@EvF_7YL*3CzIyEgCG*7h zGxqXpe>mk+oU6>$)-L?#U<+ zv>wZ|<&fpr7REp}Scqr%EMVJWK^AU~$;_Q*^wz~Vm@%|>8-COLbNu-u>QgaUSxH%0 zXc&Ejc{>F*)hHp`(y@GhUcy2)sJJ1g1i3=P*5MBuJcU&ZY1x)oL{#n~=PCe04wHJa z&vJ?Arx{RFf!{6}fjvZwZ2=Ss0zKXm)=$4m?>{E1Vcy0qam+&A^bY zYgYVY#*O~x!58d<08Ldp(E|(iR1G(|XMSVr$grY@<@LuC1+)j`S`+{I1A74xUhF8A zDF1^XD|@mUs*W8)`;8z4p{hAM&CMZ;%)4d*$F(xrGZWG)Uy`eb*$Xm$PEMtSH`0^s z^XcURLnhrvxBf^M3a?VqsW}B&Hi&k8)%k;I0lU4-iiIx5lST{~*8p@Appht>P9O%q zaN4?VXeIlWMfd7X)aG;p%*+@NW-ZZnbRb7vX3R@arT(p`Eoc%Z*yl>5%u)4Q4jZ*u zk=BOh+_#^RM1WI-#6c6imon`+Tbq>AvrX(O0*d8F3Y$|Y8F4O&7#H>@?hnnuInPMo z`Urr_LFI6Oh0PXcILmB0WQ8(5TNvm|g;=C-&)4jYY5BiEw5C#phYZ==e8c8gWuka~ zN;d!MQV-Ko=CN+{6w-Q@-`FI@b!$IC*}-NVJqj4LVaXUoeId`bG~|+dn9oSF2Dl^5 za*8E3MUL}HnaP*774<(e!HLBVY$nNuHSawsN(l$|ipB;6gt)yM z=jh!?$=?HQhKc4Bj(j(snA3e7_HQ^BJ2)jk{+{H+H6%r=qpyjt>N^5nzz*xG!xP4H zC+eBEs2w4zvW-qtjmC{Jv%`D(tH$2gw+fqK+5Fhwus1@87ceYi_1}2s1J;a$@z9*I zphCu9FjXT6rbRG}_>FELBY5RaHe(djS=bEJy@a{pA>V5)w;b7WeiZar_hxXxdUA3O z{yKXWxI&Ck+2U6yhTbRqi!v4$O-D2|d!v4h=IWUGa4equwg^8`8`3|duj)A0mxIjT zE3ksCHt&fN>g@jQm+#jIm-#lYu)4+&>iP|+R4{T2s>Mr%{b1%;eO~TZLXz-o_Wk)Zat`yE zkU_cr%$i(f2(^_M@3Wf{uHLUTATE$)Q%^p5E8q}&MiyhQ^neU`KaLu697E*<0%O0{ zMQ^&!E*7K4E)C9SeZ`5&%3RzWX9GzjlAZjD{ zG2C>T@c)eyq{-V7Ur2QGUq5;1I?shW>g>@Yt!E_;MY(7kjXZla^18;+*8^+DUbSPe zlZT>s7e%?8JQ4Xn`~ST#6h~Vpza^k6v>1*!78=3Dl31$gEK(h_X&>|wFOQRHIi~sv z_a*@}1R8-Xhe#m{%mXs%xfh&GJxxPOQXZVc*%wL#DeXuZ}sz z06J7wpRXcg26CW5Bugn!WM_2^RBrYtLoA#xC!fC}B~*0o-F^-^#;#ai1TmdVpS82c z40`5_s^u#$74b@D82&xycirq)_QP~x`xOqu^X+~mwV(R>tA8~8%8rq$2qwScHfqws zE@nF59{X0DjW_tZ|CI2K8pZFKP3#xA6?C4SkGs1{kjR}(W?H}En-$uTVxBO*hHFvZ zIguO(E@UMaaX(@NH@9xgHsf2xrv#_HS^Rp+ps2!=aLNpoPj6>t2s_s<@6G9?iXdVP z$YIb^>;=XV3?j_0l|a}sWcEfxjblOaL|OvD8yM>x$%Lz*`2xN)O4qsTlpoWjsSoe5@;U#N!{wa6Z6@cT^@M`E z&%qJPVa_Lm2(iXFTm!rwZZxJ9rmml%Tps18 z_8SGVhaqq2Qbs4JNe_xFbKCAOGV>W~i%d^Yhxr3}nM3PYkJl+ZwqRwR5u_uA_;v`8 zmGfD+BbIq$M{8o!AV+u9#^)LIm9R0;at%Tui`Kw!W}qYN#l|5fSCmz?pny2qik7djI zS{GT8LPlQm&uYWt#=BDn>nixlLAp2Q_Gqht+XOL2JoyHkzE!|F2i)EtVs4caHY481 zwec4tlLu1*dPuD-eDh6WuP8+e@|O91r+_xih;0ley@-Q{Z^6K;Gm7Ll0s)d+Ou4)X zmjhx8N~*0_W*YBx+tCv$S`=-A_jx6hYLr{y_51O}B4#mXYd_h5*EFouYlI@KA;KER zUju|gGP|nhx$7{OsBkvpP`Ur_8D%b_VEO?9O`ApCWA)Dmuhzw*-$Dr@%sR|;?<*MX zt%=?cx4k|EF6n=oa-k2epU8DXr9Q_cO=uuuH8>6u1mi&tu#Cpqm7ymC0oJhSogf=; z5Ly|rAX|k|To20UhOJ^@Pb!9CPlf~n1Xqy5;k6{I15Vm<>*Hf+lU4ehZwbGx>R za4@8eW`fW~o9B?C%BF$aCx4fa;h|BXqD;B$0*7rSl;{d+sPG!@t0>y{Z>*2(fSoeFK+JLK~-b1z%&&a#qloXShu98jf5o zkkq7wxy#G&`RG5#mD|iCeIn0nM+lLf^3h@x=TO4oL- z1n_XPX*2Ng)^~^?`oY?F{3c~Mu(a|}NW_{RGnM0xNmzZcuER%*SfledzuIrt;Cy6> zju-O&`q*RRCJ{vY=2vrG`B3TgDCYRpKz7B+Dc)C0rllJ$c=sd2k^(lYX977)?EmWlpCtfS~+MW6oyZD0CKuc;0clzF8f9Z ztp;a^keGfa0jxc5@_-GodB-IO7wCto?@YPGg=Eb|Mu z*K!uT7j(-R!Fr@Peg&}8)G%Vzsmzo9b<@=13ivc*VOH^DwVI$;-*<4f} zJDE10Q4idGH*Ti174eL_%JK3xBo=L9XrEt`@-cz)Ctz&=`qwYq|7Fp=O7nlZVI$RT zX4?7we|}Ob&&zBdx-XlSg^8R|0sM~*c+&f;moGmlD}GqDd!A?fy_I9g=tnp_tm|CdaFfYlJd^hrh9EC=z7j(~G z!g~c2q^;kfM3eYtO=$;_^Q}>a1ETOv?_0Y`@K)P>Y(If& zT(GIjS~Uqhq)a(8#R+n>oXBa>(i0#5m#)6P#@qsw5%V`K)2Xl6S9t+0%11&erVZjp zNZu=gy^?pV_Kyu@O`Hv%hDFM~-2<>3a(9MW4%U#8NZ+#G>>1)WV^deH;y^XnLa#jb zOQ9EtY}_5Z0F&1r?sb|{PSprcai2&a!~FvI{932L10777P5%- zPgi$nuiu0s;^={RQ3JhVG7U-z8Qv+{zA(t#^d}@vz|KCU2Are`KeZ=&T-)zp?u50)73avkCT|KabkX0Eby8P+cakf11ESvn z@bq@y^qc7Vdp2d9HCOKrs!2JK zXW5K_+3XJ##KtuZg*;~HqK~`BW};XF5tt-0Op*YR0LAjR!jr*mJ|rF>b+*M(D~V`A(;Z>YdcD~ZSVYcW zn*?JhWe&2%DagoiOxT`ujDiLSB;kcRxh@~Y5e{DoV>(eHOdM_G^Ac9vjrh$IX@_6T zMkRgbfHe?ox8oM(E7Xw__Mo-Gf1Zu#Z~kAsbE7>QEkJ7Tf<5qk(zaFV^{1cBdDOt1 zuG{3}OlS@Qqjl2By2I2l4a{L(ilTu4zG;rH7-`u5*>WBhXZY-g(Yw93MXT;)Z7b*@ z%Z1D^lsxmV5ezigtbqh7R)~l8??dIU5ouoAV$Mf!+0hZktIby{zFgs_mI6o9nRgL_ zqDU-CI6(u8qJ^DyI<^!2L<%&17vIg-jCfh_<>e`h*2gRhmE~6|vv8#ikhJXyM;fdx ztgDVH8-8H?t2Z<#f9vkN)t@?<-STVDs;Rs9@%ba8!o=(Tzpd60YP34e2g_L@B6ZA9 zCb~;&_L%=e)49hp z-N*gE!&O2^LXNvSNad8|%vMPfk#Z&@6-7qNd56k5q7ceqm5Q9^l(WrQIjv%w^PHzG z#@5Wvzg_oz|Mqz7pFO_+Z2Nq_ulMow+}yaznZc9NxO|Kg75ew#51>tzl-K=RimUS- zzy;h7Trnz+Me036k`eR#VuWV3{{!~*K}mgJdMHWPkFs;;Zf~G4QO$)_fSUAb!Rv?? zU6KP)s7xt#`dePTgZUHkgA=U1q?Ba6?PanPDW>W7+QQ=-Nt|6WNA*MfuEqhnfCf+3 z%_WgC%tDr6xSD1Glho}1C7KPqPjBoNq&|ggBj!|L#y?^os1eu!BmmE@G{|s_=~G%R zA^eBLf?IKuIp|Qet!HRF;XSRgo7Nn@8jG_cdF29;SUzL=$(BYq_#JbWYXW24DnWtA z$f0r+vdp~eJ1X!QpkwW2z{zbF!Y-SO7_*^^YQxuURMxx1j?mP3{|I!J05a!ON3yx&9t8_Vx6)*i~4SV;`^OU5qjMA?EfIg*%(J`P{CjW z5>dr1fRf13v$NEg+)O$N+x4bJ_$o6%`)p3fS$7F^$0PUs<#R6XQbB%F74cFVEyF?e zz-t7wQbR|+5msup0YMqP4{z};-%Mv>1K{SqXeN9I*H=dMNk)axfBTShH^O9>&HTTr zjZ9mUyU>H7BO}*3_LyV$<<3c(NP#^_(c680%b4Ie>W1O;8UDx!q)TUe=XytDDDiI* z%dUVS7o&nn0?fbv{rb{3!|mu3V=bhe77Yv=gZXCWr6$@xMHKjnF1V*~C$`&QTk`W| zvV9WhOThcOVi1kw>mY5`y#>*{`1!i<9XY9aERux)RgtQju>g0!+V*(PR$#;q__V&`_K##>b* zPAnM?7HT?0p-V(>zt&tFpoU!>x*vGX(vS5Q=7hLrJA+#f+kkeQYCugxkO@-VU2*!)$UZT0o> zwp;m)0XW9@m9_5OrPDXnk)NyDUcB}n19ctS-h(kjd}Y674X>05#hF&yYDJR;^2_3$ z(Pc2OYtt05_%YRm+avJ;p{ijtTXkLR5 zlsPY;+_|!hrZ?*<(ap4L;V;HieC2{0_&R~he~0gUyFo1h4nUYeNdv!K|2`bwYyQ`? z8a+C43RnJ~-kJoDoL3u{q;&(guhR+{8Gom@%;)u)y4%N(kSLorZ&C0oHoXfv5V`z`{y2qc zy?s_`J@(apw!~>dJ-vN6sn^^ppCN3XroeCbxS2TSpm%B4sLJ7&PnS^e^stP;xhPz;SuyylPSGzSpe-_#^Gc%W*|+P+u&^BfSg);>dbN zkNd*`<7~~aZvmku(lpaD@|8qx-#hxFU6pOBb&LVq<;g=#@|m5lp;@lr>*^fDwhR@z z8a-nm(d^4r{Au^$(Si04ZI`r2e}%{J;0wz?p0Au=&V6LdbzQ8++(VRvvn%NToO3IyZ$z@vqy}(6iP|+x66Tmli0V356zMyzy~3};a2RMVxE|>lpJt)G1I)= z1|^n_oVh^4BPfFd`V`u0WFXs3uSI4cV@Y#2r)^AA+Vl$FUzL6&oIQ9T1~&qjWN}V$ z6Ghx~B~JcteQptjYibKWQklbq{uKoqmLM3>KQvE_D?QAyE8hk z9OsCVffeIa?oA=s-Df$U*xhg0eP!%KiVEFod*rXeG=b!$N>SshtwIT88JQuF^gOWQ z89n7#JH#s&shSUh>7z;wv8B1_EiG})Cq%iT75gRc zOLmNscGB(!AMs^9x1V%9e0k|$v{9NenZ8U#p{UcW zW*nn{TtG$G*|N!Ka`*)H%BdHHHL9*%r<)AJ`(}wp?2_G7N|I@g{K!J($AIYY)x$9d zq&s64N`{b6LZ19yGVHsEiB)@~3=|dI5eFsNDVqv^WB=|7zSq{#hdMjE7u9XJV2!q# zk(Hd-LriHbHvTb_LzKkIlH$FpaSQyKGnh*LJ(vwQU63-HAQl?G4UE~}o}_LK@Z#-* z@6tSsN=sP0Mk#^Bk{u-|ZFqDsTFSHpwn3U@=VA>*NagQ2o3of@e~0{aQu2%>~| zs#SfUs!Pkvv5jn4C{rl8Ek8Tfd`y_XEPT?t(J;eO8zuQEO%s}bu#)6g6k9hs)_()Q z=ZTc*^XxADwsO%F&rW1_(&v2N2fVcVo1wg2o`Q|>K7%<`+?#|Py*tIA1K8w|c+=|F zFt&~EV)VvY?+*?;TMl4+XI=iy)HaY>@fdqh?X9}ErFS7gQyb~RZ%30#W~BNHk%yL#-5CC z+{l{|$>8*)a8GSra5m)YZ!Wd!3PkI84?=kx3l{bgoOEpva=MEJlLUeRVH+&8bpbzB&h69oH*p2G~fDFSB z*x$svuin06*)erhZ(|I0%9;iNe)XG9OJXcJl7bOt+2Fe>jr9N{v=X|>>qa@SF*e1 z`y^ku`2mBo0mYJY*G3!D=;cAHx1+jGq8=nzPBxyrV_H!iUgoP&k=_-9dk3>cJT{g% z1u7fGbjL*D2uRx{C?=+Qm>`ep1YsWHm`5d0 z)K5i5plqG_J%}3I!Fo*8Rki_^;~OboX|r<$kM5%o&9Q5zH>V z6r-O)pn37tUDcRR#p@Bm)1dF$*~{hVp)){9(0Qi(@5t3}EAShtBb}`4{N;8|9HAy` z*y|Z;-bs51OfaKp1u{{h60CO|HB?SFA3`ey91w=^WE0rnpI%NT5LN*&^h5YJ^XuRm zPHU(mwewJu4BkfiL-o4fA;L^;Oj$98E?Gt@SY_9zuV~~2ID@ZR1-Pr}Tgt9{0pA_B zV3uh2>2+!M;q`R&s}Qe~My|z2=l8f{y-xPon>{Ue!to_2yp=ud-t5FtM2@ z(^8Go23o&_&+E7=CwTHH5l0I&;UEc*p(aim$03E%ZO(D19$Mv}hktk$rBPv4QdLxZ znYJ@X&TpnQkonX>1x@50HW!ei$86M(Uo<+;Zly?-`Bw>j8IITK8E&liP&#{1>b^XxvZ2Mh7fuk7k|vG$!YTnS%3!*-#e72(ChfHrUF3;@`O2(Y zv8`KsW#($u-><9LUn{CvEQsOoHPqi`6m;m8=U=?VPS}F0`}|u4eU(ly9bR0}DM+N#zWl!LrI7TN4jw5122 zn9o$R@Ub%u@Ly2HVu(gJYkSZ=dq0EO_NjWPbo2BmenYwqp-w zm3g`G{rSGBy{ImuK}Z7bTJCsk&N%PUC~nR!pD3*rPV?2QczUY=JJW!g?DvTx(K*3L z&iszxCzhc<`nbWc!_u8jizWr}H$NZCtLNQ697jt7%%%PISS;XKVQ#ZiH;xq~p|0so z@$~*P8Z;C+qOw&&<*Fv5gKL@U9))*DN%L;o-6IVDrn}QMY;z+Bk%07Lu;z@W8yQvG zJ1yd|b15^L!(8}C+s!=sN?Hr({;IPGQ{VH~_%8B)=UV@hw1dj-8pN!0!Ojnnr}oIo#;Z5^od^o2_FQ7Aoe$JbI4>f zmMJ+J#f>haPA@O>`BRRD{M5FtzdIRz`l@%@_gTj4UI0A%v=M5ylH2J=8TiSnaNJW7 zUtE#V@nAtt0e!?L2=0vh$1>-+#RLAwj8Fcz)GT&7cI_SChwHj$VoQRqYJSFbD?~~7 zJYiPLH*_2HrS{#gGRS{Ulr{fjmRpG(zt1`X7yZSz2#qQ}PjRJ=oz&l@kdKSBYd1E{ z8h!QJq-f)`L$t1<$8A0!)oM%}!Hvnf26_Sy?co6H1;sJ6G>W+&9NRKF=T(2wnN+ zt1ulkro!}-sSTa!G5)8cE{(fEc?dC(7hm(Q;*9YodX@D%ukjnlcm}{}Wxkrl3tlzu zM0(EZZSNL5<%Y_vXo^jLbX1Q~x%IL~kd!$t3_aKkAv$5zIP%3gNS#eqLo9Nr>SlaE6%9bn30{zL3@Md!rW!3bK>Qo`%El*MryU~@gL}3g#(a_ zD7-)x^a2>Lc_K9^#7)U793+xJ!vL@3#!gAm5Xn?l9#S>p_^Y>zZa>^!6mBU0d1~xy z+$J9Tf;fMxoSGCDx=*@;yU|dTyYf$rsK`6|+Z`>Csi)EXiWtWh%xqTM=q4$|H}Q^t z)jx_tYI2@J@rdP3+dslFL}Y$Z)zJ5ZjD%~8qBF8d0-XKy2|-y9}-pFZNVHz@0y#KP+apMBnGgbmKk)K?I7xV57XoC&Fvw2rv1>=80_L8nV8uG#BmA`n%R1TXz)b1 zf;L2U4Z|6rFE84?$q+BrDL&wxfP)86TFG5J~ZG6 z>SS$bY1g#Tsz?6HL^%s2Gk#-+6_NRXGKAv#Z^3e%0&Y-!;~!4$@^4k|^F_SMACH}k zYX4DxrsFEgsr<^>A5UVlz&STHkrn6NI`duKY`p~@aaD$d3+z>=dYIE6Ba(%Kk0tCp z?@-JoZVDl~R#u1P#M{4FcO7#K@ZhK}>Hg)xj3ofQkTFRP_D1e18P>}#F=JmgZ;>B} z^!X+-gseWMLPWn?mXXXsN0k)qh83o8l)VY67fDZ4dWdt^7U(Hnt3FX)IHdu-h#`+b2}G z>NS`$nlWIa1_61`TeRf8W7*QA#+p~OIE8rlXzV}XBd_$azME z%9gf=bJi2+X4hs%+tZ?QD{1{F)Ml`8$)DNdc(E|x<8lBUy?4zZIKE`wW7`Ru)^cLO z40o>B>mBbJBI0S3RyIwlyTN;GEs#yJUOV;}@aJD$P}>K1A|30H8hIZzAHJpqdmtFM z^F~CeSo)bIU{crPJQko0x**l_dhe2c=+){2?P1rsuTq(;_dF+{@kMWh!Sfu)0bE~l zMz>9TH`H8`+8bTNDS(C<3j|8 zhooc+FLKLRV8#hW;&Q8GAe;IDk4?1OC}C3{=@Kg4XHRDe-uYt^{(;RQ~Wrj`e0Qt#wec@4itV@tI_gl;M#>Z{!!1gtVtR% z1(rmQsd|n)c~b+RASe)4`udlhrLm{PC_rVAhwfwH{;p1wL*Opi(%4cJBuQWFB zP;c|#EK_la);&{ zv={1&5h*-asA95*)YBM@s$G8?8O*=c3YhI?IkCFMw!B##Nu{w1$EHA1`4jvzYM{;x z9b7$k?q;mu%`jKHRR-7ytkd5)HI7MNQ8ZCBpFmXN8p(_etwBjAA?o*Kkr!~su0QE^ zq52fW5BLu;?t+BO-DVWrfN}R3n=WAPc`QyUZ>k`I~RYeuX=dKCBIH3YLs9o7PJYO_G3i$udIR7_KDTa z*7e#u7Ou3WCe|!v-$c*l~Q2&yt%reu&yOt*?Q02y?gs*hk2pGKHynjhmMHGIg$5LhhE~ZXQnMRAsn3 z1oXWhaSW=+xf~KiKCO=GQEsSWe58G0{Fo)YRvC}HdWH%A3pbw-jEr|;z=~5OdGp)G zR91a^qdD-N2mH1+s~$yGqH-(XkY$r8QuiZ0Y6%Hiv265t>o=F#N7iO_3bxxSvA)#Z zo7SpN;wllzc&Y9SuAqZ9^M_%3z+cI7+KxRx8z5&f={J9ETehX#tU*mElKLVyEz55T zejrf0*Vz3zB@?u;w`(f5;Q{WbHztSrJ&NwaKQ9K00P-WfjyhEH{r$NccCk1&6EVf{ zNOeCrv%PsO<^C>y-ynn#4S61=>3UB-&b! zS9vJR$U)Wuy(&pYqI9Zp&S9{%f`%hRHZo`8%tO)3a6%+Vy&55=FD~N+yv&GQ#MMLS!!(Q8D8OCE3&^EPS!(!S|n{@GeYew%`U2Wn_Z z?2P0+!#aPn!MEK7cZOZ6dVGb`1W*POmpX9<@IaT5Wf-vMU>xmKAnnv0xXdKxLn-_8 zW!?0*`I!WC^%~LQ^^x4(E84FP{{gEzCdRq?wjTw?zcmEs+Pk{DR7Z;vVX&hlfl} zMeE$7@Koc@3=_$)Rni#c7slqlnPUh85w+2oR3JyLx4t3@+AL7HGUbqR^#T zz2ow1*7$zO!4>yQWWe?5gZUy%@AJy9vl3Ic#h1Uj`G_s&j>RlR_Uc9<7{~}s-4~WM z`?tDk-KDj@Vcf;JBA8V2?`n{1_fB^;v3cK0&ZqZcLG_-I?4rhrw?xyH$g1_iq`GRgk$$75^SWcx zI=`BGADxOAW8WR{dRl0Rt(o1O8)Uf>V_4NY`<4+9Dpl1lHINa#7N-&pT;WHtAt4e_6&8)izQ0|CkO8c+LeE2C2Xg0Z2D}mgi&rh;0SkT>A7Z5kiklpu zyf5pPpQHKqP+r1_n(M6iFoPU*g8`F3^^R`KBVOR6#(l%SV}iq4S72>h$e$dI8CEMotOfvWzsb$r)Z^_Yb!kmzuxE>Os$h9~a^`L;A#)1jm-51rRKp3$7bZb@P0<>#eB zCvi_2=Z5oS{T=5;~&akcDu=UXJqB}sv*OG~SzonvuxE}qY z`pZII(rTnZ@Q3K&_Y8fRPmimf(TlOecq08QMK!#<3i#C(9;Ah>tSIM2jPIS&!tMrs z=GcJDC`BeD4|2C|i{?UA8Dx6Omc_h2eFGlyB{rr^rv0lri}{PaYNw^dovF^iU^CLN zL>aNUfB$5}h3%8>@iXxzCoWv+6@^ac(mQIN_y3-bDtO}mw@{8*WIL`{GUwbL)HG|X zR`T0CfO4yDNwuJyR#46w%9VU=?8tYoVCi(;jUnHGvn1fcs|D{Pt6XQ5m;1SdG8t;U zI?dxbeAeTTGP>Km(Hb^c?@JZB)Tai(gvmE9 zQp<=cWjF`?_jT98*&FS%oww)@r;}nIlYH=zr_?)GF66i-kIkf0W9B0^AYhkO8DvR~ z0Jm`_eFK&8SNlu0-*7fe*E<#|c0J&^+^AiwMYpo4*eFk~=H_mT;z;!$=KdhcBWY}J z#%2Z2hm5?g)(r?JMdLTk@dgBBpMTVm1hamQbz3}EbTjg5DLl=hF49KX$0gRsqYf{e zSjp(lb9oBrmytSQyL@u9d9&24OtLi~FM_G;pn{CMqi(1!YLxO7M$lm;U;)ND+A}gMu`kJytBk z)>l&)YmU{Y+}dXl*j`PE1O1)f|#S*Ul%5|?_ncH|=v3y0eno~o3 zTe4_h@F_~#VKlO@nLXh31j=kb*5@&e`P%O=9Yv^>W-JuU* z7GNX{O!gL9j8GZTNFb{q7Un}zk!O;yJ)dfXa)wd?3kM2rM~k4O^Lc?}@|=aYZ}bt} z2L7kRUCF~*di{5sB-|D~y)(4J;)WqT;U>y9lWpr04_I1|uC@OrISx-h%MViw>7I%3 zAtSofa#-V*phe(xs#qu}z1PY_een+>x@TPk?Ma`{I1C|6FN#|vVCU{wq>JYuyX#EU zaPz(v{!qo?!6#ZrojhsTE8e|R-r6TNUUQug>HQbHfO%IyhMnvl(sP zn8MYy(CKd0*_j*y`Q+ZgTtSHOSBSUHruAEr@GHAkE z%^7)h_zMW1&vXY}0Y2b+p!hB0JHS@VMQ3W=C?QG8srtL%~Hqa^_zNIoqAc{z+R4DSR8+_sxM=A*vmrXBqzAqv}0ts2B`9Y z(H*)E5g?+B5RzH~>Sql0CM~-2)cdF4pmEEvhzwMIAo+x!g+rfso-g^}pMn)R9mjs9 z2nRlBPr$;tf``%RGr6RKAQmO|JuL+z$q0Q~sP%%guH6+l1%A$W2#V)8WH+J|FT;(G zHemkAT|7I+x~EZwa~p@bjIr(-R&{-Ck|q|%Aa)b_UNnh=JKdbxD`!cG6y{o!T%@0W z{?rS|qWT!={k4a;EHR3#VvbjPl>qpJLW>*!MfVfMr`P##RmVBo;0&AV$VhdKa-s;X zx+yotn%gf(R103$F2mxnw{*ZA&?xcP_c6@VMK(-&IAiZ@J=1IZ1wuG311V=U#)!K=ID zZlr=*pX-3qfH6HvR&9Y^lD_*9)dKXDs`%GBR3P(;JOQt#SaX_+uQn^w8#`v`p3$pC z01!7cw(xR#S$M$LuFhsqh2j_>ysMKDUZY+H8q-6^$B|(UmN!vM?$X{n%p`(Jt)OxF zqh;4yN2=rK2C)+RTXN=#+%8aAsfb4!xa9Yjm;Q%V- z#pZS#^UAffI-l!~_C1p(-#O=LJ~Vi3rRLnBF_QcMCGLyK@QR!h4QXc7^~Pk7b0NBc z*`qpzO673pr3Po^t_|%WC=Lg=?u0HE3Q-1%FYnjlc0x4 z%d!BYao%NTT&bJU{5@@7s@HXXvCm|p+Czu+j>0BMQD*-aGm%6o+}%(G+lP-$S|gVd z(>>SkQz`F(rRwI%Tql0?f9KL!SkU#f0of;lXkmJxMv=2Cx^vdfLhp;r(Ywwvw>rzC z)bPiQLwA*dLgpW~rDO#Qr3qiPg*{PisYnl3?6eItDQ0!&NXMmoBF73APkB-L%^z?6 z{a7de&QkWh)85~_A9y*&QBtk*a+r^s@|YU)z79CVUT<~jl{2QtqCYJUm103>U*V5Y zE8J?wVXlvioHI(nV=9!af}!P$%)}voYV>z6{INSs8{ngz&Y(lb6)!S-eYCq`oSgM6 zRK#b?i>~WsC;#Ijv)Zoce~ac#Gd4RoR8n*2coQ;*d1L8Usn1C(0+$erC}KV;1s;CD zdTqnJV1GQyanB>`iaRXVzSE_cQf2WX^gWhyBlp2Ojs{@_Uk}x@zWsj_`Jyu3NVv#K zUg=Wy32Uc_uEX{hCu(U^-!QZwe^PGeVeVVF;tkK=COHA>cTcq*I^ub0!ZWyEA+BDP zhWpI}lE*-3C>G0Y$3cq7v*pRjNP(7I*qJoQ^Wb+D>O~?+iP=urE07l|o~G{kZg~ujZd%oP0@tRm7~Cfv@rOH!icfji}#d znkO{5SKl_9LrOJ~;QE4x4oR#qjm3OH&@=ZMc-kh1K#P`%6VXN@hi3hqHhvLD_$9I~)xwUa~`q`8=L@c6bZ5+RjyoUqXtPw?b$yX$6 zoKe)IvKXefZnZ|_n;ek&u=P7PLLe{wm2o6$8%f7pUL#sX?N2J+`m_}+ZIMn|5HCn0 zEk>5YBM-@~F&+aIva|_g2SdjXTMHQ`owLx)_KdB~LpS-c%8njwJ4F=@7o;GV9dIU| ztnFB2%@=k@w>?3*gUUh3Ztxl}(~{&LO_|b)l0|z845?t|T6imRH^dVR=X}Ys@KAEWOupTE7gh;Q`_F?<7Ijo?#NS){7%o%aARi zMv|W2&x#Y=CR0jC`i0BU0E@S(7DQUC(kR0lOI9-{(*EWxf67zJjEhEw73rIb_MbHM zB@Cvb6<~cs&mH}YZbsw0W=@(TCr6;3`~dw%OI#2I%JAPAoAK=M3!IU(v@$noNk5J9Vp`)_*J@a=i;g2H zGQ8rMVRarHDGG)adKX+vbP4@?U2RB_I%#zrsWqr`$*bNMl?b`u2kaNa3iq^vQz~l; zd)2Co3nRO>#(Nj4#?{RI9aF*m>f?jA@hSblaT!retC|)UTDttA8lmUMYWI1DSGk*B zgHsB6fH)_!T(N#7RnxsaB`-NESo$1jv4W;G9_w1qDb_B!hccc42JCg{d*jNIDtKO3 zu^wEJ2-S9l4^zF%&2f~GMzgnG!%LL6`#u?=B>#9r+lMH+{qjw})+=kHg9F2J zyk^afa6!RUq+V92sC2NR&{z{2r0tVL-Q1n(5+L`$F}P=V3wXppsc~*^s*6o*sZPjO zv#H8i>HS`XxSCY_M8Z_4@p=ufy=ip)p|Q-nE%&xUTK8_6)MW@Rqxv~( zz}arG!?K9LOZp^htHtY^>=sj zXxc)tg|r^ZXlZEmNJic%)i&X|GLn2ipZ4}~po%o%d*a*Oy#dLn>X-?At(9uCxB1=? zMJi0%E%j8!K~x?2Z85Ls?Xlqujt{gLqk9Fj^8UbP_(EW+q#WsJdQH>58cutlNuahu z|Lszs?uClzU#dNxn5||``^PWs4Asp+_sNCYywUa7$8-~xYxYwj%^eX5p&LHdgXO_k zh{jM-^q-<4w{A)fcz5}2oiQ3%g?ig^%x5fmcUt$ZQs57tU{PS9qc<5Gf=QeV&`I&~ zlZ5@`6pJ^Ai;;>e+ilE)6W8?n7Tn8OnfTQDn1?#+$=2Eq4=LXKQVcbi|G7ykq7Fe# zFRaM$={-F@y52vXk;8UwhdB~4nyVu91Vs9@oGetpBL}x~|OoZ$7 z1#-*-tk_n!z~q3~$#i~(yo`(BjB0#$*uHdUi>u+6e@_RhK3&WG+YhV6Ig zt1+==mJHl4%c?R9Lzs2Eg~KY)g*RnoXjHVmZoGrAeVWad9W_0^IT=Z^K53ZL^WL zbu1kLa6>r;3O~{v?x$ntl$KF0LR?S?mg4=H(hEa$lMGRydH{nhIeJj20-Y>3Q`Efi z0vdb9?kIEmQxCEnF$71^b^C)4Gb~Eky)n}CTK^$)%}xDY;vCL1!$fiO{;aBBu>>cUSr;trd?U+Z4v=)V^ zk4#ev!-A=C3kAUdBb&~j_zxQSscFCBeD0)BB6soXP{-FMWn=F-XvI$kaZ#b!W3#cz zWix{39d?nuDGVMJiZ*X%I7k*nm~Qr_$qHxr#C$UrFWf0JFUy2}+H#xIZaV=I#TN6xT_})4_XIr_Jh+XcdJ>@X;dz>GV%GOs3^cd(XeL9cus{9N z$7tFsHwD8{&-uKb&Gsf8(FG9}C8nfa4xp#;pyHL!gj2~_3in1H(|j`|jb>Xx%D0F6 z$ik~GejjUL$jBJa@MZ zllM?6pU?6{SMe(bQu%|`IcYqz78^&uYcS;?Dgxi#o#Kr0vs`zB!(3UFM~r^(AI5_; zZmo6k08 z{h=+Me?1IrS%NAW1+@A@RFijCAKL1?PzG{mCY2(_loB_&XAcdQh1~CTLVl!V^d;#d zkco?jRiFBYsit>rmKk3Fmc?vx4Q<0mU65xTT-xc|N`17&a|Owx%mSsD5&ME?buPw0 zmNy<%!eO`|rFDO>6U?ytcT^eTCOJtZpvKPGIW`6oZgxIv#_{+#WeDt4PVPg}|TZp|L2kIqf^@HpY-FJB_F~+i(DXz66T9Z=utZjJnop&KNg9TdVI|JdV_MCSx>9daUy21@3vsqa_Pc6^$L; z6^-@N&tcgxIraheWxDJml}8Hfdyl*6{o>CS79sstiKrRSQxdK18UOiIM$dy}-$-*Wu%`iisa3nuj$%rNA(7@+6;a0}HPUXmai1~9s zy`lM-QRE@KKd6|aD~b0v*vwliN7p*FM;yevQEF~RDI+g1@#xZ7jv8(p!?A1sgoqNu zz2_{nePKCRzSQF2@G;op4Ik#k^^C$-*~YnGdE>MMF1Nu{M2dAX0q@0Y-7OBSQl*$z?DBx$)R(}CiWQC; zbOrjSrGZkPmZ6nw{LS2~^7kByB+uJYE`d5#y_ag}WZ5tiQyy_>#mvdXEtglxoOoSP z-ZCo$~T`>QoZHOOAxX=l{T zdDo1u$rrzp4&ot{Q_Or$xgoUjLui!_TOl~9@pi*-;lI>YJM!dI8*5fALbxW%tuN1; zGT&j)W;ICTh(6uC=eO2o>k5dh0?wBmC;Xk-h%xqMB{AbX__!Rce|>z|-Uv|dlPTi? zu?)sJ){$8?r1uPX*lr|}=>ckGIkmF%%}HSXUAS?_2&;zSIClVcP;CA>Ok&iDUplK2 zLQb0BH%PH!`nU{QJq+2O-cw_u+&{sIf)Tdb6@%vgi5-zNLN_bo159M``B}jsXUl9# z-o?;0oHHCW%7tSny{Q(CXvC;(US^iKMd(dhb1weU>beS8i=yQOUzE0 z?PCtzw;HOVnZ1ZsH>g;cnfiI=H()FIjCyCW$>2~eTRR_=PC*6plt?}PTWxYtzt&9? zO4iy|kYAzLiDr^h`zIP2^k-JIa4NXZLVe}p-ay{iru;CfAYYBgVgHo{f+CN?5Ji`^ zd2LIus3ImWGjHL35L_V@Bz3 z;TOM0_`tm^WLFL@*$+~PnM?7@H%c+u*L+kGeDb!1-U@^7V(L}dx1IGKIJCPLwY~E0 z9D%DRgnadW)qK@m37gtgA$Uo7fBFxt4$d5yRgF1M3wId-r@Q4DY7=XjlkWZNub9=C zewgS?2H5H2r{(^x46nBM-~v_w}=c2V)!gg(OM{Qxs^`` zd{C}FQ6WX`POO$~Q_pE&92&jrYcQ_b@TAiBrn`8oj6{Cs^WfHBl!F)h<^nC}JF7Et3YDtUJXTY=W`ECN_oT_+#o_Y|x&jYo& zAv=f)jLF11HnjBHgF@h+-BC94S)WTh`G-5>|pdWf?UJ!|tH4{NA%Y*^mzF2<#`t{EVcx5P7gfZpU)y9@V`h z12DRt!x|=)4`IvamCL~)%(DC){)|mCYDt^SyjW;E+l~y#*Ly8|wG4?zxzC(y`pyYX z99{DkWa}+=&xUGE?`oWA=3!@eZQYc}w|d+z++46ZNecWFmG8*vfQRNXN7>Ysez<~A z0wIMxhoUvM?cR9F7J3Z|M|g$C-?q1adv|XZtG} zGBIeF6;MIa+i;6g5d4Fzb-R9q}_sj19eQ%{JdL=!YKb&$jV!=f<6ahnw{& z)jlj}G5(WXJUd?-Qs>0duw+l^RB>PF%dXt5EREoA% zd}jR~L0n#>Cg(o+zr1ON|vPsan1+?!%O_ZdF&eUY@5IC9=H%k54f49ln&O2@tjDd?kj0;FQkG*ReFF zPE|`E0WB`7p3&Fv)o<`xV8Ltj@>C81-0}jiHV>bAKjj7Zon9^fXNP&WZnajhWH>nF z83+4wm=oEEvGmm(ALTHw#=~2{7fHeVt8bB?AWs{+rtEW{!bN{2p`8-Iy5-6G*f=9o z15))x-l>#uXpwLc$^`}PS2 zC1)czR35i)TAE$~`due}M+b%B1eCYMjn@WQ^`QTfF~I!PPmZyeIWsm{#W$T~8FzDm ze=mxn+6UUlR@)onW*r#yL27xcT&G#T94ve3 za~>~N7Ol41ek|s#{2SI+)U)cBe(v#$$(r%1`O7a7+EUtXqeHjl3D-Xoq|2)4P0&yCX3 zA+gUO$60~x2w`y!CYta^SXKBSLF5r(3JqA1yhJ9uw|6kl>jFq=9QPTpB`Uyl4tdJ!k?95SQ%NyoQfqY;O|Ms zxvpACD^$m*DW$9wD+aK)i>wJPoEFT$x{)P72A zOG8_?w&DfdV>A=H23ExL&K=Vp05PnhT(_1y_lx|_Lv7upw)(IK^c{KM=14Q#zzW& zEw1oZW5}42LEx$rBuB3-to1`P-G=xX(wRk|)PC(DkoIK(q{2%D?z3O3r0g>Emnb6K@BganU)csDn7G zae3&+Q2V>=x`O(?Jla%aUVq9S=TDLmt;lsp($O_$RP?m@bj5UlAF>g@6Ry>uQ5ULR zt`_P$R~JnyjLJ-4i}Tv)V=rm|1nFzy>&E{7)P;(cM<uAGr4}c+qn?mbD+&<8{Z`IQ$@ek2b(H0s6vwg`oa`3 z)}UIUtB{izBmxGV6ns&w$XGVWBk8^fxwA_*|6`xxa^O24W}NVRe^sLDk;-&xm+yx0bFlUu=9|kRzCKRUqNBnKg8O zdxDE(2Yqfeg?j2gziu{jL+SFOYr`i_((>w_Et*lJQS@X0b5GrDrE}Bf0HwOUmV68; zW{(+LzgKN`IlL8W17dcz8nex=^vwp#o1&O0camZCT3@!-Lh{HtJIGH6cAI&<8p>u) z_OvLvcSRvWkK-LJn_nA#!+cZE*sL#q5WqT6cemjkw?!?f)~Lo@Y_7UvGar8j#BH8M z?Vj+49eyC&h?H??LkC%tvPO(Y=kYPeMPRUsx!MJ1N;C{ zs~OtqR%i*`ul8$;%dh~}bJe2hd)Qtp-s)%j%glo==1;KA!`epIFb!g9GDZTyrdW~i zAG8W?KSB~=7KoM;$|w_h*nV^LreUp2@>{<9$_Mtq72b(OXSC&Hg774eV$ZeQ84_m< zP_)1x(doqu^Z{r>9{Hl%-tTcAzY4%JnF+s9EyoDV62kQxojdZ7YO0iv3n9Q+52fv>ogG(9mA37gWT`S#Z6b7Rji?7ivG-~oy-#g55qt9&<)bdyRaL@E+oB({PvT-txWixjLe|VyAgbvK!eo@uh~Y zR9VO$y&*a|4PVzHK=<0?FO|NoQQ-Z|BN@eMcR072FHYpA8j*jT+d&3&N925MDb+pW zT5Fdp`q$(rIn#X6wsuks>HH>p{CCVQ`C9cfS{J_$j14T}uOE1=4etJ9y^&)}3*HlQ z2e#;Iv^|waYGXz?*I0IcGp?;l*<6>fr?Hx4&tWw%%txRPRug8N89TsI@xsq5y~XR% z5bbHB#d{{r_JLK<-)yTIG@=8K9x6RK_KJhw^sB|1gfs+jt>;6@A29n)t(x6P<~P1i zh`zk2N1q3n0RKMirr|AK7~$MnYqaMl`ix5vU*+S{oO5Jf|LnBRx=L~xQ1uYp>_T5x zzS@4UqBTv~ukXrY>5b;4v(WC8z>#xHUCwRUN6RLa#ox(;RdsVM`iXT5S#4 zX5M6{Xy(8y1ibid@AQd9tJ?o|$LYLRi^%FbbVnEZ5t>#9+qq^sYue3>mF~>j_M6qs z33;Y+nblxXH+rZdu;ae4CLQgra}Kw zu8P#J9#5s6zswQK=X`nDaQ_IN7V7eUHp zs%|EySTP0%c`*P{N|51J@_7Pzb4|jW$mF$aT_fa3y z@Ad}&y*g5SyE|QNN`L)4nj+f!e~YukA@uFxhsQfMZQnXN{RXJ3TY^WNioFtkdX?&{ zQ!+DrhFvNiwJDmwhPn?_THkmn82`YJw7+-l0YB;WEiVb9+o$@RKfZNxbbOmJ-TzwZ z+ejFg%mmJU6yaE5L>Q4X4U;itvk4M+OlWRg?=IUe(i^QWg`nZ>o4GeoGKCp+CAO~z zBWMX+PZzFRtHRL0!#7&$fBH@vkW#05G&{Ng9+M@!A2e8H5h1E_8-Fi1=|iu2y?wwz z;($Q+#<9X>`04su2kV@*o<377HNf8UJ?x{4*N z)3)u?=??BAuI?=7BD!{WVDg7>6}QJfO6vc`(*Ns2-ptK|Cv2N{ncgEzc0AfT{ABXH z#_r_KvyOZdQda4FMMY&El}{`qZd*ZOw|Ni4C$U~GC58BxIJ@10C8alOqgmvJ_7a~T zX~?xYFBMX4o%Dhj0||XI@cbfqvjDGFE6YBHRJu)`SjzoMe{O)5W8Nvi4op@*sU>MP zE(jpRvjC(K2GT4spWEmto1 z0^LU(sg@B^)zT{(+lj}!WvC5@+}Dce!d%epHak3Vo9sPSK>mQh@Kwpa@9ASD>{L<6 z7j|tz-CAW_FObl&-DUPCpPV!Cd=*1we!&BJBYX|%EGt3Tq+KfeH(_+L{)q_%yWz9S z>kLGj-M%CUbfYOD0irHmuX!h@D-0Ep%?(+~?zeI!QX*FC`@%1zFt*p1=mK#8TQP}l zgvMU5p881*VCUiGR~X`VS0~^EdD&IMXc1it_(Yhys4BCvc7JG*zX)2KUQ|W3%fKKi z?JY~l-;`uM-EJiR>M^t)!Jf!Ax?pNjxG#KC;J4IcqHsR3w>(-*;7ha&7?Ma!Mb2t z5}l8F=SV*?k{T9hGvo?wUqmhPt@DXo2-kW*5J(nQ#pD9mU8ZG#Zu4#q>oXA%QnzUX zn+_xf>UtmNZL085WE<-52;x9kcWrh&-!J4Cqlj18i!cF1ptg7<%>>HbG?PYlIXs{SE<4eqy5K zSV$PDrAC9&cK60Vx)Y1sQK<6GlkJv+qBEew$`6j*_Bh5==H7U8R3H z;cfP(rZ=}A9=QSrImEz+QXQ_Fb1st2BjLH9MO`yY(f~yPP=KM|dS@#aEp5ETaW^xG zBY(KkAf@!j$ly>(er{{_eXjn?qhns}`83E3&#fQ1p8uWZNlv`k)bKkcH+_-ZA{~~YsAD@m7b9iyxAu-~QmYwR_sX~4H z+i*=2Nk9iHumNq)5%H4EZJ8lY4Cwb)uP;c-H7Tw#$6h3*wMz$-pj}vk3hltv@xyHFBE#wWg~;JX510Gd*oLwj)fsW zhg(E8`R&Kky8+v2^GDMovhlN_MlvlxoUG;U=~aTKL!!P;$A8(c zDw8fic4dt%!!=TJV~Ng-5#Luj!q=K}wlyk7`R;ByjZNFKP0EP|kk>!kj{&a|uoA}} zqj86^?XHqhwGI~M)-+A~w?^&<)f%NpVGqSJbM9! zSpT=dQkvxo6aH#4jcZO*oI+on9OiftniGXOO!M8SDSKAiM7wG=?iy}B>#z+nAX!|#2dg6n} zN$QlcA>R9$Ae|=&cUON2=5eO6-RuLG$a*~$*}3SF5S6fvTLN>1MDMxd3>BrWr1U#T ztuW)TzfFM>^p3dlf7F_c%GGk?N9V5gc8G6iRr=*P685Qqh^RX?&O{}94|B-Rb2agk zucks9w^h__PIUMmBsLq5%w3P4aoRds?>9bdG=Bw{n86e+1FU0!rcXlT{hI82Tc80O<1o=J*J(uek= z(kAHtw@2#o2OTuZP!-<*{LblZaD4!4%lT?ox29QmFD=JMYpO=!UC!6w`bW}#RIXlk zJDu9)SE}}I+%x^F*E_%FL@LpISjB`*yPxrTqA#T`-no7S!p5s%vPp$#RSG9uw1Wft zfbp17tq)ulxn`InQh(TOv;#6gs{uc{rhn*6+j_KA{wf~`ehXN*`ipVGhyhzFmB?+8 zQ0~%qAx#6svGb$A9GF9&2I8YMf4}9{jghUdKbus0=iU7-VeblW`B8R$2Bh3xDC6r> zYcMUf@0E-{434!cLN;$9FvSalnNiRpLJvj(Fk`=}zQ}3?5tiDo(JMU*H@D7&rQ_1Ihm170EVsb?y^Cn-I*Z@PK$kL+_Au(^`BxG&$=& zAhoh5I;mQWx;XUJ-TT)!`>yj6K7I*Vq@^l`Mu#id$aGX?X-bvkSzVJn+1}j6$~X+H zI19lBfRD0UVL_O_)jzgVlq&bB#2LSWZ16g0kmv>v(Q5(4zGa(gRTgwi^$j7*dM?@N z_b?OW3TU!Rl`mtD(h``y0mSzVLy}ZkGEqIP>wF+ZJR1I?=@icsd}LB<6!?$t6I#P2 zlIs0OH0%ES19Et@FPUKUU_UB3`eMFYMq#?(l2KU> zUZ`T6k%tY{veU=0TF;?EFBjH}wk`8kPg4Md4w)?6sBOeWU2jr^JVtCkZaU1Ya?!B= z5l{i^atzccK2_?b9rC@xIv0OBy~}jIA-&~P@*|V#3yhE^1BX`q?51zHgoGVk_QqI8 zw1s2yF=4DX@DR`*Z>M_7=A&iz2b)&vQJ1#rv1Tt?xv=l4i|T!9Hm+^w8gZdyJaqa5 z_OU&l6uq|d#2t(K_=e~zmSuODHmUKw< zx7voktKRZKwfA~QIc{xk>7d%Jt)dmyx~miEPrR9`%8eM9l-6~ocl5JgfCOIK@0xu> z5rN8<6)_fvc_V-X$`FiZqpC9skj-VgOa@XD7A{yX_|6+FDwMcaZstrj+0Dlp6t0L0 zDzk=iyhDS~OP=4@b5EETNe|t0jmrN;DqDs2hbG~4GOJIepJabvIQ#_S{eFcT@`l81 zKH7YsE*38);}T@I_Ug_Kx-^;NGVUPK(M!r@a|x3q1B@(Qqq?#({1PMdWU*t9Y1x9N z-)yj*zb3(}`sGZ@SnR&q9vnJQElvrX6&)s{wZ*-r+KQMaK6L4>-!U~RH+}0|lbZn; zOOvgPg_fUvo2Icf!8Ze2FRTMQ1^gJx5-Gn_UbjF_hH@R3%-%X_w*~TBGMj8|fk@%c zVKihHPC(vl+<~;)l#shz2RMmnjTD>R2L2%Uar^fgQW2)x_tM5ShV}E;80|pC!GW-_ zYrC#9jIjBTZt8+7&ZR*PyJVBz;|NRv>;l)VYCbsEBpp@WzVDxl%Ss6VyFHd?jCK`v z7H+Do!WOl|l+!j8@QoFd-Oqg&4&77xFg2EDF2}jb@;C{gsJL_=bs?IT%_$aa+l=-o z#N+*Bk8SLQ9A>)NcQ7(^W|MYHOu%<)jNbB=2O;m5Dbp>1)=N{_&EPF8KV7Ld%`B`G zMO6o8AoD$C=iXeLO4srGbr0Y8WXvdEjxlju| z6=o&)z8VR+Rs>dNz9r2)P4=|VL)HmEcgfA`lTRU|?djiwnJtS&(_J_kFthMD{ll^? z#)E%9ECvzw1!|sY5Bv9&TZ^+vY{*!l9STzRG30bM6!+kl?(i%#eMNS-)C%b<{MCvo zZ8z%T&aJ48L$SCxtuca<>@~OD@nCFp=RnwBDG$NU$*ctKTFVgN<9eFzR}ktyy#$k! z6?hlbp0lg$fS26c_!8kST#}jw@cY?bGk2lU+IL8v8l;5oTtar%H0n;`b~gmGuf9+StY*W&Za|fg7nCoW zcHzX$N!YT<`isp+Btz+?zIiF8V(toOj?oGuX(K+Qa1rDdxb?HwlvD%}A2R@Jgn=k! zY?BQMOtG-#4k#_V#Vrt&g(SY3uBR;#n#rj_YNMDpq2!RuC`)`Zz3I>{KZ0Rzin-mQ`a;$REcVgEq~o2Qsrc|yiryf-p7jH&z`Jqhy={%@ub^e4jqVVlBV8%OpW zdUNC8p+nl|{%w8rtp7;c%H1mow|^!w-+uY|^!$z2mrj|!IAeM3^l{&74~AYnJ8`gE z{o1QT``TYAzHKV{_nT~@{?D@(XW{oV$BU3_(2UxU0uIH9oC~9yr%XW!Q%|1oDNz3W zW1-cJjvwwzkDFr0#b0TG4k>qBT6fKnCwOaE_1r%{djYZ@5ghMbo|t1JCg%k@y5^Xx zC?9W@CQcFP8t3pFoeoX5h_PG_Au=ggspPrO$L+=FhwT$!CdtTLnU4uQZEg<=GK?bTV zdPkq1lks{+qMZ0undFRtiRLWUW@I|D{@|C;nk|Zx>~Z(&Pf26Cehc#BA*FW&*~aSR zO=_#f$bL(`l-lfeBvI{*-+UyqY;-ex{im|i(cZx6zaU=(Z;YLRiQbz*xm}0&zbV%L z06gf@O#`?z_J&XLcbVKCC6h>_fcedciKR-7xr#=?fQLbiFdb6SItL6>&N!CPgX=cx{@l{GQy z5Gi4%gi-m~KK7UotXz#W6YYD8ap%&O+GNY_Z=XMNR@5;7Z`!-*?dt{Y;4whc-E5AS zxSvFB<3tsG=I*+E;6dovJ1*yn3sDo_L(2GRX#67D_#MUnNJpS?he1lMa^F=*+l5?G zVNJ5y*ES{2Gd+dzf987JWO8*;+lvp>yx~r`Q|Up)vH<{8enat2r~7X=M7A;JvB|{d zEx#eWGcFhKA9NNnVw^h>`-GI z%2aQ%W_o0BwMRUW!}?}J3IX`6Rw+iy+b!?dfQC%h?fJY((u~sm=ecWKnoOC~KfoP# z|E-oLr%`!okKrnDFZ|ih@Qppp@uREwgPYc)gn!M4=J1cqA3O%7FnD`)7alH6oL?FY z361B83d2f1NcP!Agx#{(xKCPvt)nTyVP>G}KZtnpM-1d~0>YrDMwP~!ubIvl>M3jhbmaMFy)ImJ!Z7 zn3_4jE%j1UDPP-r-nrYp$RC64 zkc`VbT9ODqR~%La9F4OLJr8x)PlG97=ImGxwY&m!05hkBk=32W=tU*p$8Mb9!{Awn zFfkU_k28uK99(U5FcMlJ_#cOMzE*|PBHa%&_`9|yTWMQ-L*Kc8Eu_9t;gTqEivI?q zKXM%{=N%uh6`DNrXX$PHoLOta-~%lUk||VLz9RkSWUK68$sNNkp97l{bF#`Q!Mo?+ zUvto3!k{{YKzyAxN_VB(7+`(GO@}ti3+(d_nC>>DKgn{l_J@2!)Fv7ASbA=?q%eE5 zqT;AT_%qV%r(LV_kJL;GuZ6CfD>CJyQs&$rq0Z^-63IXJYJ3}Y^g}%}ve8KuDOogp z$X>&!6e2sl7=6_s}~~ zb-yD>))AOZATKk%4rp>SA{#sp{19pry+9@{bXB`}tBoEVEz~L~O-qb!f$zklyuVZ4 z#Dp6wd~2{%(d&zFdMqULz}MU`+z7eFXiCk{&iaO`?DxtG%%0nVldQpO=0|uwOOrFl z;WlxMj$-fshQa18Zra{II+^T2?0?ZWUFfah-gsX3!_gy~K)BVt%t41vf$y-*M9ps` zeN$D* zZ%KX!>=F`cKF|ZxQ2om6q%borCA7isx#;%!wAFW<075G7&wn`D%?a_O_4;kXL}Hu* zE=$74WWtz`pk0$oF2Af=^Ey^%ZjUg&uuEQ^Vc)(O!GGnsws3d;mm|;$7$3no={%46 zQnz@3d8072Y-hMCJf8qm9gU=P(pz?rxlfbk zBp~Cv021&>rPdPUe1>r3@6_}VGbRJNf^o%lOcEJ%kXJx^3O-OJh1&Se@;=GzwCwi0%Y5l? zW2Yy|*<~0KTm%om7(NGMhv4HzRwLn1dJH2~HP_aSZPo>Ytc6Uo8o(hU@K%E>!q46b zUzUmv=}zO&*poHWFttsQn94NeeEXF`>N?F-{KANR1u79f^Njo4Mc%uM9Y6--jhKGz zv>h~%!&DL!b>Xk))fIE_GgsP?v3nUlP=@z6&d(vBQ~M3t%%x*`l-VIh`?9FGH;xik z);G63gdSrxp9YG7V@AzI;PLpWQ{Jz9{UT+X1sid$%|AEp9gnL8 z9I$MPluNY43$HK5*1M}C7L0mjNlkO9&CkmfG-r?Q=PS+DDIpFUKY`3 z`qREPlsoT;g^&JQUmMMucvF}MmR1-))cLp{BY0=#r?D1IZ|>I|$T~59dqH9rFKCWV zYJTk|Arg~^ch+S4#TEEg>j|x9)np|ilwwqR<>OM1vr~`Fx@Ywq5FYQK`*q-3Dn<`< za`KHMS*Jo(ZW^_Ks|*s?Zqyass3sF{rH zawj4Q*nyX6>DoabdLXhFIlM++Z1JgJ=o!n@FFo$qL>R&9H!OdEvf`%iI;IH37%4Z% zMtm4F^m9bGG6VOIXTvsN5%KP5 z^Q?`8TxZ;7+R1F^PzjetltTyq+=xep>@oLhMdG)QjEVbNB|~s^_Rv9_Q3Dj#Uy2g+ zPwfh&M9%K8{XX%STJhM7Z0`dfD?|p;Yx0?zvnMtg^2eKHu>AxHlba$1zFxiag6$6S zkH_p+I}fFG%r4R9^G1=sWmb>0|MA|?c28ktv$p>+VZ~m&EIE2{rz^ZDtnkp195`!c z&(0Ct%4oBk-k!?Mj(F7s52@fr4+x(uO^-5qlXj_jVwUc)D-VQPxtr;{RHSHmyb49{ z1<6XosgfHch-;P=Bum^V6{Gnk?IP6Ia$44{z%?wBbq?zXlyUAffU2XVq&F+`uhfVU z<5sINGth9^yVD1$CeeMB-9oQK(b zxZ{&ZZ+$hI(Mk>8>hoM0taGx?9^-kMXA;6UQ{^k7mu4TA(2usOw4wC3?gtj%WxyLv z&pC8l*jP8O<)U#ER?>2u24 zsM_PXEh*$jZsF+h9+O0OerB*ojB$URg{$Gp&Y-;mrO_rfsn_ja5a(3{CI=v8QQ7|? zZ?XAqetCBI-SSBIiMUG#<+5VU^^)jXi})v1xtIdo7)Pk$?G6-gnI5^X{6n2$*t@V# zO)`7nUXrXaX@hTB2Hy-Gc0Swb@H5U}KD_6~t$2Krxl5wNWV+b>rxJOzb@*`l=-e;w zlN4L6%p!G;|3%+8jb%^pdH!Ev=b4XB!%xWbSaJZ$Y@GkTfd0MYxExhds`y26N}Qld zq=Y&oYEUg`saz&qRUHY!a(JrrCQe4D+W<5%c zawqpb1X&T5qMc{GHxx(ouRV2&FSObbPmS8}L9k>%N??ifybhaCGlEz0l~ z5Bnu9DlI_k2)MM2W)vyjZA_CWIKt7W9Cs{KXqElWLA?iNe8S)8vUik5q`>;?UNqc3 zAmdNu>N>ZC-JvK$uIFAw-MKGMK8;>Bw`DX!IfN^8aP3%DL~QMCmu0h)-L?0{*GFq8 zPiojo#hZA!de;vA6@_rHm+IiC<5%&hUv zvsRAc3eUuLJflZBe^WBtnbp{p0E@Ky?B@6$bKBBL`%wDJ0KHTk+JK)PT&m{SI;gG} zg9a}x3Y^A9R(?qOwP3yfLFfCcqrwm8z7R!aj#AxCIp$*Y6U5|Gqw4g5U}I@8WO+D} z(88YCWxXgX7+2M97>;94_)O#DLwDyAnMkn|tNQVk!@<8{lU=CCU%Yi^QdUWdqdxO8 z=Q({No90YjFuy8QAp9VhY!AuYj8k(TJ;2@qZ9P58F0&r-rc~$()FLB(;C;4TZx95p zm_g;qVtk?P2$qg&pnt3&Nlucs@%KBp`HuSnwaA)~|kC z-=#OC%GL8J93k^{%ANc^M=g+I>qx2W+;g$Etc3A(;Z%x7qH|)R+TR+gEA|mQlzT17 zX?Rf7Bwr`+`Zj?L9u6*kVD=sKBP>1mct7Tc(fWV%%giC+m^!XkeSOc5djfhrxw6NF z%ergk*uKACr_gmhUK!OnA7~H0n*oys1TX&kx5*rv~l? zMq=H*zQmuY{#|_EQ@c7TAo6G0LnP581~rsrKk;F_EO?L}(-1bKd+13q%Ynv# zFn43LsrIy8-MZa+)oact=0ef9q{)L@=x@c?#C}!R#oxdEZn>Hq+?OIT?A8}DoLf8< z{F6svasEemj!8f7KjCmBcK^QJB>lhilK`*(<678viAMOXxyzr7dbyh-qh7xJzk6i8 znb6vcmJ$4GAqzGw2zy6Ppk2Hv6xa(~_;Ftavz>}lc@r4*RJY_3)M?eJFOm+kqsyu? zJJE=sdvDp=NK}$3?<`l9+^ondNY#3~pLsASwycWCkXa>xBIZ`L0$jOo!)>~4fxhRh z=^DyqduDj0{ zmB)2CKH1|uEQ+o}U(0D!{H4cBHBN67l8$3^Hb2Cv4$*a1uTsagn78;NyfYA9IVyUK z_@!)JV7Jp{!i%xuH*n7+lk-max!f4p84fFO8GS_ig+n3YbASjw7dd$tRbeM zZ3PI<)n?94u0NDD|1y}coM3{IP$LEJ1^;!#lAV8lI;;fnt9!JT z@Jcx;DK~m&4O>&jfC!H|HZJies9Q?g_t^(Zd2d#6GgRgL;IbPd@Z`ZXOHDu?(ZkE7 zS?pJNjQOPVM*$K>$U>RDw*7%eCayh(kPc7Sa=+Lr^3fg^R9j)hGPR`R&i;JtrY$1Yt>2P8uYeG9I=J=51^#ahaJy|6&=BcUQ~MfzA5S4T(BPOX#HcxY3nK>wl=W&z5WvH+~Ip)fp zwXCUYG^~0;R%eEOZ9H7we{Wj5vh}RuFaO8P>hd92y~b;+r#o$&i^Izl-Xy|pH2Or@m!lEO28dR z>_gd0?X?v@@Xn9Dk@ONekz3YBZfqKJ5{U-|Mm)i?VM^5e<$YWTopNbp6qh+~1AW{u zcWJ~dR?cDC$+fQ|Q)yG)4!YmlUuM+K9=3P`x!S3L@_|>Ezf2m&OaP0x4Ragx{uG94 zI5c3+{lVlOO==D5wKet>QnfdJkZ*k5yZx~Bh`t+aPMHv8TMV|%UNT4Yy;T~_l=bQJ zF2NEE0Ji`-HbWv==FlIDzQ}z;E(OepB9rr+Y_Y51+>p)x4J?R{fCpcw$KoX9 zq{N~l-Sv(i_`mGLZq_UjBk}h>kG)No(;H2Eh*G;94=Cnd^WV*X|Nj-DoBm(DsQ=4o z4LuYSpN5E)d?2-&jbgL$WDHp|jYr3Be%l5w9CLH4*=9@HyVEf8OS6YvI9jC>2jQ!l zoW0>ux^bp(iRruc7V_Z2i;&2NV|uEqPkN9|IweX7YwAlH1@?Vnq~+eSQ6Wea3yVXo zRtPLG&1pdbosz5;ZR6O4erz|_Zn<*kCa>fZOpkn%=UJk*f81N;SPNGlt`Vf*7t7UN zJ-4h_B0lw^^i$<0n<>jIkpET0GU}BZ{J!g?}odAnVkgBwVhsjC!%04-Cb z)C}JZqLth74BCHeO17lQgee^~MODR@ui$679+@N&v$@%0oDh@_>ENFYKeDPxV<**B z@Ibej(!T#-Tf}&o;nriCVBW_O&sMc~*#XHQ8c))GrqAQMrz){;9@9q04k8SP9=aQr z-*Kh-IC+FCrO)DCNNvx6K-V^-~|6?u?< z6!$XiWEt4TV#@Vnd#U!{L>zrN0+Rq*WLyP@>0-<__t(87!rds9q=#flgyqy>mq;%6 zoDgU2fXZ^0pzKV=Ut#j<8wzRz&tqz$qa>7hY2OynXPhv%@6V%=1dlP0D zJ~H|Vk9bk`#it1h4j!!2Tnie+)v1g~&#a_WSrb&hSc3P)W8k)>1k8juWJi@FytjK= zm^vC)N?0jia=E4SB(kIv7{7`qnhb&I1KeeGu7oZQx>wphlxZQ4Z#}sG3BDAnDa;x`m6| zq$T!;;9LOy!R?aHZuJdMRWlR)nZVjwu;Wn8?EKu znA$(2#lVkFQ}P~=L(vGex@QQkn233O`x1BdOg_l*Wdy3w@|&=wb~YjkLTe~j+y-%@ zVKJdC^oF#+qe~t=CWoq+tSKo@DMXQOR_OjVRKhQ=&UG6=m*j>RxmJradk%7e+uxe% zC?TSa6U&-IMh(`IsHjxGZWLe&SVwTM@M9 z;T(6{Z2MqIOr2qR9JgHPd;%|{bdoS-^G%liDa7N@FAKbs0qM{jcO#dwrL4#O3364( zy3zBPRNLKB>FrwBeu4hR?^;^zBmf6fHBoy7j;Rrv1gZJYf(E!N3fwM}s1X|&Dy5Y< zXtmwSKDqO3C}gM)A#8X+j^hJcnO4XVzFepHL4FO!2<#X2>bz3L73&pZ3Fp+<0TmTWbiD z$0TcR+R$1kt-R4+HV*VUDU{Su+`2c$&Hn(p1?7M~Xt|;D6gi5T?`Q9|-rFz@|0I9{ zwQ#ZQhKn?&s=yD0CsN0>mc@;Ky4B>u)C=h`R8TCa49zlGRYRqrQaTpMpQ!eUad2Yl z;(V2#v?=;YZVk+9-q@8OA$gMUjr=LWU+XEQO}FmYHsqBVAX|K?xcnyWWwMZb0`(UY z4JUK{&T18ZiXh;#=AP+j72+TIp3Jh^<(xAC0IOT)34^EG=7>d$J;a3Qy-Ml-wcyV!C+Nm}Ex zt@Sq{QVH284d48?$D*eUgqZEukzo8$`VrvGMm>|vHfZ@(rXc-`e(RAyd^l4 z-io=(SHSP&G+3^7Ojsm0X>NX)x|kaqR&yP7*fpm1u6>l*5a|oWJ#FW#jvOYAG7aGF zMN0Uz7W*F>*{4)as?+3(OGqh&h*%M>R!?o?Y>l6ZCOS~;hWGZZOiAQiG#!ebfU+9cimSZH zYL6V@9FQCa*i}P;p0XoiWjFfhHJCscV2Y53T`%ly3NThkkK12FT2?b?P4L%UK0E|I z)?ZmJ#e5qUw14CiULDGe*xDyJSV|unkRFrb4v6+wp{kN0krQ{(Xx2(J?|Mm2<-WG=b}#IVW2GPX#-xKy425g zIa(@u*pC#+_cP0BUVk&ef(m$g;L%m@tYvBXq2RqX$dt>-l{V3#xrWQgz$yAX@DuYU zX;f?RC)tK@m6{6jc2tw7OTotu*o(K)*UUs6{jzu64DtW4u;U_iVua~!(jXghmH&s1 zdb4E+v@u+xqRLW)3@@@-9Eu$MzWVcYT?O%tLg-P%ZF0G;WQT{0wU~9|Gvob|cL~~G zz{~T?8I6eDPVDdyX2@pwLbxh1HvF03Q4#hEvh462H;wx7YQx2{6vO_$%gB;N9Uk>q%NcWw5NjQgQYer>Z2%V%~JLkC=xKo zUVcvbn!43RR~Rc0?w`6&;G&i*4}n50a)beU3@mq>O3w!WPu_caYYsy>fPz#m#n#YN z*MWaJ!nTMO+1O`Wl_-1OtIz@FZe+4@KGmvx26e^0g&$^}!EZiL2h~_}j)j%W$Pcqh z849Zlfkn{RaK`zXk(;&Fh<#;dZtd$G|3IyHeIRujFlYaBp)zacDE}|s#yBc6WTcXO zVqw=xgR3C3eRjL&)s9)Oa^X0PH#?c-Kb^{G45v)gFa%GLTILi5^LDOsP_ov5ZMlDT zd!ff6Vq>-S_r8>t_{PK8vD`-APEu3F#`K>J7o)h9T5gPR21QI_+}EVxbUyibpq8#8 zO_p!DA06?C<|@|3`zaT?NCgQ3`%BB|2g4;Aju0IssU_qW#h?9-`Z+_VYo)?!^9stM zK?Z6|^%3uvNVA^(DyzEvqZ2U zrKRBT?|C+b9FXs zju9FAX$rk-Z+olX&{$G_pOMKZ2(p!H{hRVVWvuW}kkJt4CDJ*PwRtdnUl|9{U%Tt# z9l$&{jv~wOeD?>tXJ^rFexK?H`?DF=43ghCZ0ha(8BeL*2yYFakDk9cEs5LY%;b>h z$iIFM@d+1Xd6osUOpc|%LVN^eu+L2q{^wX^U?j_7PlEJ3c9RpmQuQ*yh>h+_NUQjCm-_i%tTuMlQfT_uT3F$!B?j< zb{UX2FBsg^Ox=YXzuN^t?qVTRZ(q3i?xyC=cfF?v2Z@}IyNu)1-HKjb|Hn4IaMMe( z3mCDDR|Td0L_^9*^j-F6y~b%iXYk@ZuA0R8ogc4~^ zGT=8y@M)nFTYC6kf_dXeeS;2Mw1Ke~Woe>zzj4CbB%2JV{wVEi+XXZ1VT!-1+C*63 z9;-E%oIzg^9y-phc$H_I^#9TH-eF0%@BjbZw6rv{w9=$q&5`ELZI;^z zH&D5?q%y^AWv(2!C&O({Dit*q6jSa%MI}I{Ki;43@q^>V0lfGJUKiJSJLerLZ{n-{bhvXNcbm|h%?8=q~3Y#)PL7Dfh<`Ca??#&d>5 z1}KJxP{qPE^xH!zJhu@JKbK{q9vuPxh4JBdAvVpwAUyHejvw(dc`B5 zG>V8ymZ(3b7PPCNt~au^2cLIz)hDR$UeJJw(;Mr0@j1&v`jPy)i8a00I^3k;S%Z{E z2Cw)#!}z1ifv=bLTPhw`EycunlR;p%uo3_TvzK{>w6sy{;eYV~fUes5@%<}blL_3Kj}euY&ruHFm> z)qSp91dNvkEbf|kfiT62EPV8Mb4xR^*E zZ-C=Ia`Fj{Y4oROvxx8m$!-4sLKLJs{K&B0+w(2-$S~ZvBLKgnGOsVO zc?>&;-u||M=xhsORRX9*fSuWKZlX#BFix7=d3Z|dLv(8M_==pSaL?<%m#rI`jMHuLHj40+p|Do;i%*Zc?P`?bEhM${U21y9|_t=R#7u+7Q_V2ecy+)SRD{Hh(jij&NFh1S*S*nC@X zB9V4i8BhgyYrO_ZWoArX9G(95)HVwD<|0bPM3nX}H3E0Fa}b?K$>i)ljrbecs4Wuu z%dl0)jv+nqP$d`F2%-lUtAA(vGJ0-* z^+cU*KUnoyNMv?crgYxs#8IqAr+*2KQ}Y?G^}XUNF<%9<-=cJZ-3}uZB%HJqQ!}xn z`%E_CKlEtiouv-Vph0=acvKq_u@%E;y=ZI=u_J?BHhKjYjcHGLG-tje`N%KB_=qCT zcHQcb)(|CG;WxsU(QGS3L=S!r13sp@zf<{UM=7y2kZ+9k&`+E&kdXi-P$G4G8A!wJ zG|oBpx{{`|d!O}In4ppI&Tk?9D~(nXR=6$VrvDJ9Z?6KzLIr<8Pr0?rk56pu25?)) zj#R;)4Kis|klSTwMMnxzXL{VIyToE3a%>+j)!zYu)A8Ewk?Yh?-Rc|KbT2ILfMl^B zR89CtSRYoNU;5{4XK;r)N1$5I%4hJ1x@n^dZV~YlH?P1q9_vkB4ZZjL;<$G;{ z^e2qa)aE(*V&u-)*vqOilOlimb~7^UsPvii#cT5kN&^p;HF<}zy(UhzLXN#NX75Jt zy{Lbxmd;oIV83YIJmDa0W08!My9Ez4gj{R5f_0NEo7+PsgHb=l7xm&m=v z19FtFomDn~2mhW(X?2Atk6wPunjgbwxh=@#vbh!}NVO%+C_KZ?r9jZb^oB zJa9T<;d%N)@%;4>M2N}_;G1NKw-Bwot>vFJwd;L0;0Jg!+PJ#vrI7adykslrvaj8R zY6MnQ(=^}?79V{RYi8OM!~S_B?!%$wv#D3(hA(DQ(Iq18QC>3jN3d*iCq>Uc6y7UToN z`uL@T^OrAa7SHGbwm8q)N@8p1`(Xbr&>_o@+Wd`w8onG9*1Spy8^Q9mE_#GQwqKgo z&F=i;e#Xbnk#|C(c_a3+3yWXBuzO|OT>Ip($j=`OLNc*zotot3^r(X$tbI#BUJ_e3 zp6~ep|Lux8G;DUzQ)laVlC3NOu?{kPjuIfvSBxM7+TvH_4A#VR*yC3i*j7Zcf;aZjYmx`HP< z9T2`Q3{&K%I29>qvdF;M2_X5<#_YV^2%uNDMgo=4>ZvXYE}A-dYQ=HL_S=b^Gl}3x z&s?^{HSl)H=*8C~h|Ax%i-VqL)DyP1Wmf23n(D6-H!(aHn5p`Aj+0x5u_*VFr;@sG zk9oT?gpFi4y28#@HybiGi|``i+Kz&WQ;9Bgk0I8NF&B}1Vn9dt&OgH{#j}w{o>FnX z9GwqX@F&;LHm$O;o}nk8t<#t}eg4_4sv|i*XOugZ<4MxZjq@}>`^-56UVaw6(7hyhQO;!7}EQv3k5+oRcdHb`Y4N=OYNv9nUf#3t1(&`C@!)8myXp7qu=V^DA zjO%AsEf9CSJW~6S6EQL&Y7#ULDTD{&elltwBjaxCr;#7q3!=|Up-5ZE)rs>{`ko+) zXVzGy9`F-#j|MUHmi~1%ny}}O^mhDzE;Z9vgLGPYMC#5C(@KdY0GCH1ld+rQln=#9 znx-2UG|w)GU%_YV|;U(Y=;Neo4;+xuH}IgM7es+g#R>ZjACR>QUqm@ z6Bso>Oey#(?9`pX#kb-6Gu(R>b3{D?O{+uXGP+w=b$#?y9$~!s&iGw!KnQHTl`LQDj zZK1`z92o!?T5x0a)-cE}t3pr-2jIFJxgbR)CK`39Fj+yeoi(Aj)e#xy(s|?Ww5i>j z-_7*=ahzN1K2_r+^5z59khu9{>5P-0k^GTaf7ez}<{$Q$W!S^n{d_j`a0) z3wiazN`cJ(QhN#baG@#^azuRJ3qz9fkgu{(?+7DLuJGZ1acXGPQYecug(7LlcZ0vs zDGX7$mX~#hgs&~%=Ni9PjAqVo>4U5iYP2BQkQ|Hg$Dvs)qw=OE)7_Opia?=eUcIsH zxLTd4n7U^71@(TH>Xw~@dO6pysjYRA`Ib}7i@`wy5sfE}G>Dl!z%_mD=yg>3&D9qW z32-(xlpV`7skAl$*3nkH(r~6hY%_y29|t6jtYhU=7}RUd1r~dY02@&S1E&j`c}*++ zqdA2mw=G?G(uj4pEfG70ngdIc=*rKVf;GgnhcIM!PGd91(O~E}6lKuN~`<_Pa zX(V}>qRrsd)>g)And!3z@?zXdciJP&f*pD?*10R%%lI|jF6uOrl<9QJy8nhnHLTJ( z_|pV@ zG~*L70~u>{-+o7sAz`9UMe?m-h6$0I@`P3lf9IG;*nYq)Ux%ujA@Ntv6?+&Bi-4U_ zsln+|b^RbkRCa%POo$~Tw;2e+lS_+aI!yz^M>otOOjGF`Ncay5qM87Sr&SBkg-9pC zzFJZq`|$LZLdXm{afV&bd(6j>vMVvadM)bf+#xODQZN_5`dnn2KZ_YYy@C7%oI(?$ zUL=<>ODP%Ef>YL`Fl`M{?o(Pwpy@m8u|)pm6zf#2vXqIEP2vyW_<6#c#7js)droS! z?Tjg)F{~IkYdd2d>%tOSgW9G!@t^NH#ir12pdPdCZQeV9_h{u@uF@J5odhB;)V9QC zIfddWu_UOxds;GC|MMnKIlKfY!S47k4vfv|P=;vrjrD2R3Txc+rkcG)TAb(KJemn) z1J}B*%UymLDFGlsplnH5;azq^j1 z;qlD#TNXvGeDp`C?#|wFMuF|Lv;=i^Qi8!sVsZ2Z&}~Xy$U-)YucGle)~N7#UEajYl8lRpYAKYjKhik5qO~ z>es-Tn|fQ>tF==|r$XLK)Ab_eX2$x>{?18$3-?zhcG4qOSsotd@n{#^8Lx{ge`p;o^|s}{uy+|;_-8B_qd1Ic!O ze`w0R;s^8`%tUg4;`;Ka9&QSo2U>r5hUEHgK>>;W#D*$J4gguQV2P`{p-MMoM;}kR zzb)iM8cai<*qQ`rHGLJQEk0W7-9w=TWXzhdrUaum zRa+}-T9DTSV^vPwe+oSgUo^1#$b2zrT-@peVym*GQ_53_Pb4I*UEKqKIOTCiA>t^2 zK|j@dbzR1L%yH_r12%H2+FB|y_+>>Kq)Rguald%oT^QjAgdswx$mM5NPI&| zB1tm5*D??Kl7Ff6<>lu!5`#0Ky&4elc`L7s{#ZRnkjC!FYMF7D+Apze(<@g+;ME&5 ztDm<^qrT!o>p5Rkc3nc~^$tWSa-M(gkjUz8+_Vjfdh+VD2Ss1y9C3RmRIbH7^R44FG6#YzLuyViZC%IM}8@}OlbfBJ~!pyg--XiT>-5b7rt2wcI4)AM`` z`|j%zuMBP*OwV^%R=}c*W`=+-~Q5Mbk5lSG3jTgQx(@d-5%+N_zMG+Bt)#Eg+NEbu$akJeW3)I-A0^vN=g&{O zeS^ZbNjBe^)mkbN7b10%mnb&h-&Kby!OtO^`C~1ncd)Hc)7KNUq|}1B_{??G#>1jS z-SE(hQADq24Tf3#_89S;&Er+NT4y1C;CuUIvD zxCYqi-WXt;B+Lu;X5GUdf`*0~A)ZiMD~R_98Lc9Y zuA==bJ2w+N_QTD0%(RB=!@n*UK-YWE*oYzgmjBKB{c5M8($Fo%_?%!DYbMDwa>28P zWW~SIs;)8EKE8}lo$ckNMQFIX7nibpQRt}u#&6Sn((R&|W~f77gVW(Da@LS}_Cv>h zN>y?^I8W?qwcz7apa3*Y^8d!rsH#0rwf5S_*i+`TFhLP} z-K|_zj4|Wc2)S`i60o&sX8d-(II*l^O6pK#i<{H}YH6t6)`2QB`(O+2ydk_@)jQ z2bJWjo-%6*RoV$&mUS3Jl~4}6 z^!U8mea$VDU)ynXhDgy{x;y{cHSAmfP?411HpT%P329VwFY~0#%kYs)A(OlrpAh}X zJW9DaUW9`5r7BdiVzrb{v z)0-gP0%uDCm7%W@+9$iCLg>M6>V@hFXQf_!1qyji^kM&@*>7q? z5^q6XMG1=?1myg0ku4QGeYS(pi29wpd7LVdsg)f6b>ouZd$(is<&w%BS+e|js)?qh zX436?n@i4&KtqoN-hNC7;(jV5}hwq)d@yd6t%&V)E)5*w}$eZ#%K0Q$c1 zgWW5{jV#*Qk>ShdjlEa}eF{-WtaCe5`h}--qt4)#oO$CEP0xZ#@R-AKkRcn%nUAjsg>EzS3{%@-&VJh-DJW?o%`Uu{A1f83QPR8~T0^l=MlhyZa z^MA!oKY920Ua<%CP$hWn>zU@04=2B#j8*(qgrNa&4rKYqS>0P}&dz9XvQc?ENlxETAF-iE8^8NKdKnC!O*Qr>Q3sVG~$Nd5-M z8-#@xDPINg%h=3^sTsByG}Vr!#zTX}$(;UNNdlWb*Ov+H2Dp_1(KOhjcw1hVu1rWA&+hkHvC5 zMp}Eao$R-3{Az!BB}^vo)Wwflo8^{Rc_%!fpHLP8d1v-@j-Y0Z!MzPLV!;_PK7cj2 zwI7s2^1p1YXSOfwocJB?u20JEWFuK`Mb-GK6U5uy#ogLSrRXJ(W&jSt;f=7lY)JK=#lOGAn@wBINBg2 z>L1p<1$6*8S*eA#d`P~xxJ=ck7N7Wi!CS| z5DD}-U#-FlWVzp3EdlEF-Elf1JAzKSi`k>s{TRqQWnm5xQ-7&ZTH8FCcn_m-$5S>J zFfv#0p_kc!Z5*{tn2dbaUe8@q1Wnqmb~9)Bliju6kNyNgoN3CeNt^AldLw36*^ZF; z<^Et=G?rTjUu$f8^P9U|{*wqb_;-9=jUDm6mHsO|KCEsHpiYfIo>e587X^NVvs&m$ zi(zuATNmZhJW@*f!VL}%ru&3{p0w^7`aE^N-@E~MREQRdCj2pQA%segOZtz{XXs;@ z9qk4OWbOswnol9_q7EU4Q9wTg zupp{KFF}m8qN%Rce{md!T=5bZfa!DGktQw)d+fG$_V7^~5J4ZZ6!>m>ec@tjgw+Ei zm*?xwYJYrON9h;DDF|YvR?jdz$#zPe@VsUTxBjxb=XVXxA(W51E0>bHd4TGi5{zk- z^k;PVbixfR{{GjJ}UTYTKt4R20x&!qC9ZU@;n1iewA}Z%;!b5h|l@@9H;#? zu=797TyZaQ>p%RR<;WzJmU=|jRX<^GJMB?R!w=qba`vX$owU^CYp4i~KgF`+Y=3Yb z+HrjG12)wgM|WlaFU>aP_hHKKME}zDGf&^0c>3kt#+iRRZgyPn==|R;Fe&8eoI^g5=rU=OWsx+EJ;@?lv34N4 zy-_nv_~Q8j&tlmzAJW%47=^OveFVWJlK6;e67D<&`FkVNdf+A+2#FMBr zL|E;Z#~^$4KI&y_5bWLht~ba+I7*vw^-S6Tq{v0j6+C?Uw6m9xShrxslZ9V3;XAx`OTlRQHWdUSpe8!h?@?dh8eT)|PG|2h?87 zu8S^I13dJoL#f}yesIQ9o;m%PoWEM+sQP=^q0VH*;~`~kaw^E3U22T-$3LzW2Y&HD zxI{mM3yQ@n&dK8Io6Sw3Yyu8O_0WFQx+ z+-<&dAfq{^!Nfn!#Q&029rX{A4FdI=*bqAl4iGG z+pt?k;F{qtk5rD}J8Rg*GLfnyR@Qg4O>!ciBXIH$8K}k+UvYr5Y3D0w@n>`P-K@bL zWkBj=v#1BcR5os`#OchZ_lE!klOciq?uCAO!1?XJ~^|qr+Uz*nXgpsNBv7j6AP8#{Bpxy}0gxRu$W`T*l z=5EHmb>2(HZr7)ZdB|()^|<}OZht&1Lo4hxBP&pA>#9|+BYxND1#HQv08Zc3IG6~H z)0E?Hw)HWa%MDlT6)A_>@&qalW}h6!FCsqwaNM|6O1O14-lhFm;Wgqg<-RuI{`~v?Pu*oVx#Smek?O%*FGZ)EZddGet>$$)v{vl|i4sb`Ml~Pvrax zSV`Mf)Zim+*d=jyZ<_9N|5BWIO{%C78Z&z8-<2Uhl=L~r5KnRD2Zh-R(C2Lh8E^=1 zXj?&xU#tQ6Aa>wJFO%j9Jh93<4?a&Zi@>G-&`KLlT>M@K>c81Lj<~gw5EnuxdLFii z-d%aMI_&Ap%cScINB@+TS&iF8YkpD3aj+j%P2_{r!@5fppxG4#A8>Ur{`vx|BLW9T zQoU{ly$Y|vLqgIz2FEr*K^Yx54Q&j=)hnoWi_ch zzJn#A>#-}n|5zqJs!v{kO?3<|Xo$qj@&PG`b$N+_>lLv^`;$L!P{ZWBGDNlY&kTA4 zspLVOida)g70>GhuZQE!C+)&TrR&*$4EFi|5|)40jb+ub4V{Lcd2415u!YOQS+tfv z+3)@WU9|0xkQ!H=GNLZ>bxD+JvC@6dUQ@V}tEV!(oY-JC);c=!aMn%z&70!?FH@E<=@*ve zcx+(npTzxQn*FNX3#vAUvKRM9mft;p1b;&Gz`b*CNz(JB22EY)_BLsajh~Be7p2{P z{ehXHa98XwyvMAy4L?Fbqq{q7w{vxSR|H9ok_z=SxZ`yyquccvP@cBvRFDw4C2uuw z>UGy212O;QeQ^o&EuHaRe*;H~`=Z5>J|{yDMX=b`QQ@C+$EB$wQW&I{MGZYNio>o# zKg8{A)n#4?xhDrVkgQd}UT;F_gJn}8DVd($&pQj)V}0hSnHEqn&U@>nh}E&0oHY7m zTRbnq(i~bo;*5}<@QN9I!F3zwA%qG>qN9L48kNJ79K9hp6&{gl?Wx&1VW(N%K2)5= zjvgZSiv89armb|3{1h&SXdUO+dv_2h$5>ixy*8K$6_cFnJe%DAO(xQa8)PL(I)3Ut zrebaupg(Evl*i}kva$=pX_Qdr_cN-z;T5UP_q=Si#e#E4^?yQRbcwhMA54>Z%!@Zo+GE1hNSjIU@YCzu-8MoBH`qM34jAxkZ6#UX1 z!)X)hfX1m**Lrlp9B@8kF0A}7xYz1I>%L&?jdud{Poh+$1s{4O8v~hfrHFf)8oz4M zlJH6?01Wy(;nJ<;QdGjY~F%?kdV!N%7_3&E}b13OkwrM?$~UU z7tWz$U%)q0|DOE->V(6$RDpvsB(FGSmaeqNQeZCqIC0T6PG-=kE?UKxpz?>SC^UE~ z`R^nfdAKhs=h(W56M@hz5-p;K+dz&PnZ>DzuR~{u#C*)HQ|l1}gwOCv=W3W~x)dk` zhERMrj_NnpIsJ=hMrWEVTdY|W+_Ox6N;1H0nnH3F$1l(uyzl8W7x?$C<=8g0w`__Z34lTKfN&M6!5fR!MtN*k9`{v!)r*EB~IRbkJg6hP(978vMKvwmpQ_ z8yQ&g%r&~TDmW)T_~|&}eY8S7%HYB3oA-u7RZhr4mxtvpYi()0XCY8yfb^2^*C-=y z;nsFY(D3wEb^Q-&C6=A=ctgph8P8W2dui&-9|QTY8OehS;<@*35e>G@D)M zOAvqESNIbv*6Jk^jvSp;fvn0m@j*6Cn43}iCGHY!jgw4toW|ikp~k}C-xPI_o8B^= zv;?0K(OSH{by@tR**EsX+`#(vM72|wXh!!4r`ma&tYa9BMq+;3k(9P8O~x_y zrQ?edLegK|K zsajljddS}Ef=v4J6)TB!eB>lW>+<1cxVUH~G}mhrQU_-pi+41u(<6QM1*N?4l?p10 zvkS`5sB=ndOF+rEE1qI0*s=TH%P#BQ^hO zHRu-{O;igeg(fRQ__U;`%Icg7^-Yn0M2{6h3%kFP?8|Ae2As#Eo9&pc4!K+LU8VnT6&5~W0;@BYK`Qsw#oa&ub%xxl_oZwXdKw_CWM=yM>!GkI3Km#SQ_lAyNSN`B)!Vp|yqF zM}zV6s|JUX7j5KT!WaLQOFcX3uMK=rGD)*tNgff8ai0X+E}R;xPu@1kf=9_Qd$;le zJ%p*w@V!=6UTgUor}N0#g*VsoQ|-d@IHP#O(I31LqFbCB#7EwmBxN97+*5uPUd|w# zrs!Hz>EU~|N3bIKyry8E-ntDNbWmZ5$EQv=18gxlJ4& zqUsE)|MtlsOAg9ORA~lYXy1sN@>jw9>wZbArzCf1pnb)Ye;KtOX;W-4P1AO~U^sq1 zPRad^;no=j-yO2;4IC}$Fd%y9W>V2KMJjgr=x@5u9`%%IpHH`*LHZJ#Y0Bzpw>Pig zIui{x?6z(_!?ba-ZHSwXO~~r}G*xl#h>ggXzFvnfvSwP7x{gzf_Yt#Oqk1ti^D0UGW+c zv+p@h!Sq=2;<>eS$fOo!nVYhUjbAyJd!L`Qd{^#eZ`cuFQi%{9-+$P^J^XL}>yp0< zzf@xg_9mfu9P7a&1uwT?B)!u@haX}PBR^g@JmdoZ|A(2-N)mFDGKGzVT~7)UOUEh=<_P)m6XD9^`W8!Y zCP;dwQ*3?Vwt);{#%RP6-8xTj^`h1EJ#4}LVouKp?#)f`->xTzo76VT#mkP>wfAoX z_aALL47;qqEFSBxveCf$(7G&dM_X%*WX|#TwaH4{j^Db-JU^SO$VB z+XZ|ZTKO{XVZk8VJ8pLMkIv2gQ$m0Cs?ce#JFBzW78lzPS*Y#}^i$Sk$?TA!w#rvr zi?j9c{HI-gtqng~iU9b_jsG`&eZ{8;Am)-iIICqTm}*e>E%HL1YBz9SM1AqA6xaeP zBR}8lj;^$^VOX4g=4_Aspi)&V?7t7Mg;xFx1x(4D9HJ;OK5%YwVb0d}OKy;@a`qlN zrNX`9x&y#`z0whQVY&xiFFw%isfhDcv@@L!rTk5`2_0y_27Pdh5P&ya=tCPLViAJeJ##N zkU;4dZ`)_LY-O*t(PJ`maw?M2?;iCJYx%ly0)LIC{k1sbW6U3a#C}~DL=_StZgiLmZ$y|dnZRGC{)q?2BVM@_-dguNbtfj*aQ9i0P<6exe55} zl$n0m*FxfD+G6ksCBM^P&K@`4%WXRaSdO!cr5s>%+t~w*8&Q)OZp9{S;H^($JWahd zve-wC=`d@=sa<}z>@94^S=pbXEf;4hN$H&Cnj2UrnFnj>MCY%ov_cq`_wuU%58m2+ z;@otGY#ldzQz^J>VU@gYXdOzXAP_^8+#|k>H}mP8I=Zoxe9Pa{TQAoATG$A@*{lKX zC8b3Fn_+ORAVyd2Zw}-A#!B~mj+k}AD{{0gBnw^*z4R}W@W2Dz%e%ssD;m5pDn{z8 zaK9uczHzembA@25THX$j)x_=Z?FRji=zYm6_J`8|lc+oLDW-aF`-QLACYbIC``D~t z4-muc>CG=6sm`KKGko)^+0^D%6yfyxFC*JXsul|`+b!n z%eb*G$d_#wOe*Qw^>fX$r?=kx2=mAdi zl(8pP;;#8bjy$SIj5T^o@a~}#o!5*r7pUt_nN^!$%~%$0P$vEoCVsK z^?}$@E#QhL=Tf?tDg<(G2ndQf!v`vt?(;o1R8IP`%JMBczQG<9FP)KzVC13kF4dND z`p;F%5x-H*{=)a>eS`}Pbx=i$u?_!twQitq6g;^H$XRVP<(*u$dX)pr@@v&oBz| zAo4Xw_-ma+uZ`~OZBmgX98awcUGVNPp}bNkVYDUl&V`mb6|xA8_N?jnDhfAF`GD zk*X*8n%Q&=t#qsP??p)^N^IyYWXYXF4k?-)KP=v7(XzqNk$f01kk-hGW)(HkqKtQW zg{+4h8Jr&~p)stZdN*-;>mZ>oFiMQPX#5AO0nt|sdNxx2r3$u8An@zuHdb?jZH_3ucQ#8xLa`M9Zyc;?K_f2Dzqd@i{ygO*RU4U?HjW_!r737gi`87+3xe+tFpG5c;(TtfmWC4E08_;48>X{2xCR=%-!OeIm0W*)l%NXKOsMK z{-3l`!uL6N2SyWrH4vmtg_(fs_&Fc5Xq;vP!JN=4tM{QzO|O4rM#`s7SFhWBM%dv1 z_>uz&w9dk8bS_SC0)zKzI=e)0~=r%++F=f;k7w$2kM;Tuj>DlQDM0HZUjNpLc|`l zo{e1G|3_AZs#k6lju>5+uWU3FNSBkKsS@Ah^0$7%j+K9Na}^vL@9u50UY(`{$-_zB z#z|sZZBM`|z8lu02hRGz!aZ=zonsTiuCaU*{>Jtr467AftW4;nGc#3jx4-=AEd zce34b_JQs}@b9R*4z6wI!ruX8N1QaNQ&c_Y=5RZIE?@`abT-iQzHmzQEo%JCFRs<(PWH!;%t(VX$7E9h!;zj` z=mqYT?t?QYKt4XXBho*o?YGD3N}oh?F`~n)$$Q(k6?Y9=20nX(qQ`j+SjL=OYyY#$ ztaU&1*@(C7=D6E`sEUljdIjjqN4}+(eJniZ30UWW z{$8wf@(92GE+n)Po`tbBkRDt#kb_Hwzk0&R3{R`J?x%&H8Sgu7AX_e6T5J3QjlU-s zsM2(;i(=1f9;*ofTD|Ao7Ur&oxtb@}O%RLEgheGv?#ke*a1DXtFU~c$cxq{ANt^q8 z0`$nY_Fw2x$#r*9m}W>8XkMB8nEZs?v^R3e$`D`#H)-=A?c2u4h5-gFP^Tq^Vo<+p zHY$F@myl6zyrb6l7F2&w1YJ^54ixp4*qK-4tUH4&-ISD<78aDJnuJ>s0>dvffh5iY@1L!ori>36{$fA+41CS8 zp-3%1r1U5j?+*f#plJkj3? z?rGBVh*cJWn+}YIyM~fE+XWLp5gDgU-krL@z0*O(BV(F0?Kf28W3}9kXqL4R8(P#7 zZCz?^pZZT3&FGE({4B;3(i45AuR$JU{7WyfNQmS9P^7cy4sF-#* zQD5KLDRr{Ws9RjFv(6@HaLbT3itfDxD>5V(aiMGDk(xQV(dq3|OkDBU;%ZpoT?Fy? zg6AxzxkrWph5VHUk46tpkfUR8dbdIkH%iOC4~-8wLC2rbOA1y%gSQzOtM@kuTT1 z2|MgZ9eWq9{%lE&u6nJGMTkE|UKpDzmjhAr1oDqQhc4te4zx$Yn=UyWja76gH9=R! z;rjBf@qlZL+v$ALJg0Y0>Tk%upP3>89A-Oy>EqvwzsH1?$}@bdGgRv#*rwgf23x*P zq7h5YzPQ~lKoErh;MRAektt0-{{+!{us;RsQ z5Mze{tVM?!oPWA*ZAtq=Lj+5LPRPIAP1*)xp_5W`C`OjHZVnmo4JM!20zgv!iAOk~;&(2CwK|D}@Vy=vq<4?UIr8iZFH;g{ysvyWKKa7~$J9 zk)7oDvi@Wl3KnZ|p%-gqda{n=KgZncu%3>ic=rW9H~M$u$%_4~sWDz_W2Nw~_}{|Z z5Th2C!KRI#vX@CHidlvfZBtfbMu(xSCYi7ul)y%%R(ex@W zdy7TL|HOWWq_qi6ME$dh>aoO#kWa%{aXhxwb=Klsu2Jt2#obJrghK}F@}fcY;uc4; z!RawCO}*3g@uvoVV51nPhhvZjSHJ%U77T@b#KhMb5zpgK_rBk_UMsq|ZoH#oFYomV#;!4s~?5k4{2v!{Wv+uVXDAOeYEc6@2iW{eJ2aXUy9@ z{Fj`~9|bM6?YzrkU_#IWUMXso`i^wX+(rQbHNTDK#$05u`jh*UGw;~PaLx}ZCnAUP zl_v=gfDhOg2UjpL@%BxTWwkumJK_x@(|Fr>FRK-(`Uo{Y*3*XF#9xU*IBewo%`pyd zm225eV$3vM#b7x(JL&HM$;fF17e(g{Ay#`+0_oCpIv_LtJA2c+YsH-->AcYoy&mo* zVjK;VM)36af3LfglR2j3d@_bF2wOyrV|zZq?DmX)a7ZewmN$9P8#c9S=wFVrm>#*) zd>|)opn6PgdYM}i3T$24bbJytZ{;Ed3qNGC8v+^Ro*8y?%I0vdB-e@FXHMVoZZhGm z>IE^E1?y@wIEmq7Z{_YYs;*PNi;X??w|3ij5k37f5>6U49sTDUX;rByd9~mSj0;N- zAGX>hwYis&KT#=_)dz0DXl{2AOo?@c=G1qQ6B!N5jM~Nh(~$@Ez(?NOBmT^)eb34W zp?&9?G_6dl?g68q>8^grsvlx`aJ7J;(PI?1suFXP-yj&NUt^3JlD>*^|_$Mz(@C0d!NNu|T^s1`i7wTltx8%?Uyb4)+$MJg2< zCOJ@<|J{N`5c^ki9N(9CE-V^dL9D#(7}VZ1A871v{D5t$4T;GFZpW>9gG0FQBLyG* zyOu5SytCT!I{o)wm9Idnn?doP^CR_+ibL-D2dWboEjGIKP@BH6{~9gp z8DFd;eTq7L!%~0fbz=WRRWDK#m1U}KUxty07XZmvE^dW=25+(yesvdq-Qq4^`53G; zDau`e72xNT*F>n&!cv(#*6YwGjh)F|*X$5WySzzVoTje19`hh6ER~D9^7jgy2TkYw zkG}DI$R&7W6E=HN-~Wvr zaJOPGXb7z*`o^ zj@@wF=GHQ>ni$CIRrF9FB;Sa#rKmxMHA9W92<|Q}aRp zVa}zkgZ1uI1H*b|WP0^DbJy)5x)Hh#DELFZ6C%26=s0G2=QBXgxy7qwnbBmW9ol;i zM>WSfz^Lpn*Q=ON&o?gk;Va;&r`>OYg7Ff*GvUJ~T#Fy}F(Z!Ws|T5#?|Zjf3i@nV zrUM+e4fCv)X>T@;l*R8m%Z}=xaM(kpgY16x-A5y)!somd46y8`goX~^4TJBvhq@)~ z(W#p*L{^pT0Nm%V6Wbo zuP8i1G|)FNnF4;up1_<3R?mg)O}e216sz3Ho4MT~3GBjceysz$E_6uRUHv7+dZn2-o5SOrxh%|XIy zQH8}-86)|!-}~^>I8BUj^VO!}@Or|^j9auItIoKw+p$w%^cP!%Si}0rqP>mDd8){? zXEr@1V(X)Z%*7WlG_k!c;FtZ&AYta70ih=?7VvR1sfIJ7>faXA1Z%s~R^fEXPlC&rnb^p=4A>9Vfwo zHNT-Um`<%lSfnIO?LJIHB)?^A^12ITjK5(KCKrD0@d@Y!cHo9U6bdf1#l4w(zn!wca?*(oggH9@Tcb*slPaw@+XZO^V=A~zqApr%1V|)2QplmyHKEKMIz0&Z?IR_2- zhB53z?e$$5-ITAG$=NzRDG?cToT2TyP5!_NGeJ1e9+S1cAl|GlLqkJH+ZpyY{jU!xQ&}3n#n6 z3#y!cse_)kIPK@$lyr=MQXbU^P~9R#X zflG|b?$lNM73&1|tB@`!m!;rD6dY+v0feM*b&Q5%rclSweyvMfVdeJV@GX!IL1T2? ztv7PD(kc7^b7Yl|iO~+u*i~^wK|{LU`W#UBTkS0oNO%#}RQa0fv47sAKOSVTzbnp5 z{`_uhs1Lx22#~Z1;;Su-2Pu%TG;^>WS{C_AaZEEOE2@0Uo#!5+POG~KNbPk(``*WH~yp>=bc~c9?()&)5~NBiv|*;Es}|zFX{IuGS+^(n?3hc z$Z9Fg`>*hszMhu><)Pttq|i@qfGq92`?JuRV$E7Wy4T3(#j_zwNE;wY4V}jG*@^>Y z*V40SJvX}w81=!wYEwcLf)4>(DksQCwu~kE35VA{;d40$YOPTM5;f6tv7MID2f`OD z@_E-Q4m*00S~`(=SqPjIwDnulqVrod?C&i|rUTrBd8G$arEZ+Sv)>cgG2D2Mmt$#q z`)Vy6WCANlM|EmLuMOwnj#JoK>$(^#ixinJV_#;1SY;}})5O!^8TI8a_pZiNgUI!nv-A8~gdBy$Gi7=Qg`{YLBNlHza3GynO^pmO!Y$maRwk z8JT_FW}UJlzs+>#AAa{yCj>*AhhQQKjjTCSTVKgbS3BT0Iqe zA8`bV%dO_?^N{(mHCYnDh7y~I?~9LI_`GPl(G`w1X|iL@~`_qG`+4O$2YVB8}YMZsg_jF{#l;3FW^c(MVi_%}jUb zRQ_KFYy!7n{9^9jc%*HNj|+ugG2_l}oU%;oYdizr_@sCOY&3FhLxuGUn-i45?uc3H zNZxhXCYSAtXw~{T+r=7_MyW=tfUAtEJ>pU<+~J)5@8OXRd9C#MT#vW4;fEm|Y{I0G zij$#zlWA^Ct&X>tHdSQQ{)nO7_VjR#!QO$bCqLLrr4KgV$P%+fL?=eL0-xDnhlZ&5 zQYbMo&veLS(uYwgP2oApC;Jhukra$rD5__l!0*Fh+h|kpU)RsdMNvlp6@3@wthp^4 zp8nfMKUZ=wxV^)ph}NPFPceVnXG6(cD0T9;4pk>=3S|g<;nLf;QKFlKA?+pYAPuGr zjB@oMR8Hh){t3=*!>lXY#A3zO5NGil=^O%my%N>^X{s&8_13B~SsZ!RiBY^`ZUAi~ z`oF4-!K7{YT0Y=39X6h8gF>i8U4C%e+d#N>E2rcm9w&{{ZM5Ss zRL`RxXJxxdFnBL*B%tefkJq_LQ@_G|An+xm6WcZUW-jRqY>q$47gKP~I8Wql{C-?) z*CB`a$~^AcF0i4E=<|$GbI^_jd&*Wi_q+*c>O%2enU(^)Y-7TIlB*PdiS)QB>C7h` zp=L`=j^R`T!)1eYAeFDO?M$(EEmQ&X;r>CA|A@n@uK5o$fA+htAcU^F{KoO8euDOEa)D5cp`vB23q`2$}BGth)@KTnwr$m@WfkM|HH+W+Xee zLUyDmJ9_D-IaRgO&e32!2uGd&6<>FjH!ZK&SrReK8@LTGLghy*jj1oE4%H;NICYsv z=V>8Y9FW)X*9!^irE`Hzzt@vca{Ru9q^7UN3kP=DIrF=cdE;Zxa&SS-dB%m%@*Sb* z1OUwqMS$g++93J^qvO!HAS3pQ5aJZL%Ho!VhS8Qd*Jw*;_xeSnrK@);tUkbcbq69f zcJ9rao669~I-=xzT^#kmdg0TbuuGwPE)gf|Yrt=@O+oyYtt^gGLI{XD3o-izjmW@k z>F*Q4I4}J2k_)@5r4c07cz0xYVLt>hsqWgxoNDDJn#FdVKbS`@V-s1T9c+v~>;zS(TnH_z2s zQf_K*nd-$xWI!hTZOvdh;8&ZLugi7x!#LERxEIpQwskaHNaBn5= zMj-~(LIAb$Mj?kME0l^i56Z%^bln`=iPXlLS3x1-K-z|8Z&p!s$KIF@`O42fvejbs zTPK&{Ahvo#Qgw*5wzTfTjSWu;#Qgn2v*!gn7mesKylf$v+I{ngK7D=&d4yOw6aR>5 z=XS-9na|z1m&N>NhhrcPo@KQd&A&>#mz!-MLWvFH9SoLs{fX(chz$U1-+VHt+}j7veC1zIBJG^ov&S)n+-rqfI!us^4|`(&aXv zE)%Hz&?mwPFTG_&XYUR>sRxoD+}}t`OB+BEUnS;#`2tORBFdOEE}TD~uBICQ{Lt{4 z))iyrn~!zFe-hb4#;n327?!@fZ>eQ&He#q`cH8-*EgZ|Np&d;6JBfG~1Dm;k{N${^ zId+^6>yhbq4dyq)e_($W`k7s0cjqQezSTaS(c!d_D2TM{r}v=#Z`(_3i2KWN_p^IzG7EZACGZiH-eEO~L^>@jZp7=4 zgT#w-$SQ?Lt^44U^`3ph50ku|E}V~r&mzbtGu zpdiXCK|RN!9FzL2^;9lDE)pm*lEhXj2ldWI%cJ9y;VT`|4t5*Ww;6xheRs6yj}>-D zUpv~f6us6usx*~eb5t$-1w8lqndPFQe@hql#IVUX6oG1Cb1(2A9H7@lxJo;X`xvis zXI&a_R+dXTW_4bSo?OaZ_7+?>09o_*rsp%I_q_GUsf!UO*X3(O3!)+{_I#x%;n*>{ zW>~P(N^)pdnMpwHwhE3v5r_~=2%wF(m;v02&2vG=09HWp*$Fi-iIaw=-&(Po zN8INl25%Gs56VX4IdWeE#`vOJ&Ju=(&sE;zc?kW4T9UzZ(}Jsu)0LF(nLFAwZJv|M zq9Oi>iaVVn__W_Xw6Jo;tQ+nI`Q!mw01hsn9F8`4I{uYpB-`&E=mHch|E}j$eQ5T6 z{)^61+o|zq0w8O!+nBY7yh#mA40)M;|B$@~@wunYVNZa2>-u7m_KB-J8Xd$d}!jMkWYdHO*H{vAIlJgu45$(hgQ_yFs2O2!Lf|XyJHUbpNHs>|TV?e=`PE=*&l?Z*Mp|Aokh1v|+QF zRL*fb_Jd9+X-UP6I5Piay`J-gTKbkYV;NJl5C*nrBVFTTKcXc7+g7F#Gnhf;&gif7 z{(CcyEYHV)ODvfm_M*SUn}~v2uJ{>r*898d+fd44s{)1Rsn=oAa>V9D}vR21St01hm_y6wQddFMM!n zTN>k=k7;rLWBVoiTUVP|6X{cHLA0FKutCcSJM*Cz=3m(D$X44#+eB{Cm{--P<#>C< z+5p$9r#U-?e8{edJ1SM8L0bCf-sHA<{igJ`x55H&+BZ}+ur2QkJ4*qcyv`4l=Rt~P2GWOZMqx@i>peNlA%gb%0Mqw8(KlJL-CLIqvzy@0jZ;* z`Md8R^ApjpBO%1nOld4N6^&X~+Ps`}B#it`LJba$}aaQWc2lEbrOPTn{=&NmI{-s|| zgr-^%%jqZTTq4r~Dp-_MltpztSAU~0YMM>wMuYJ)U@%OP0H5-HY3KL6Y!hUr^|%RT zy=eBH4&n&93bjB*>qkY@jyF$Totx0`w5&XDsKZ&Ym~&COL{w-lONcvni51>6RDCm7 zon9kTq{@cL9?r!|e;yVUQiy}FL`mS&0bYe~f{qYudf<63&y~;~m=u?`XwjG587$_fQR}0sB{KNIRmA5vd;YzHH!MR09rIAz^MFiC~ z{iDgaA=`X%!p@^L<+-f$BH*T@5*~iqbN@WXg)`M8w&&v>l#3U}$8LUZY`zjKZq`kY z?a;?jearVFkNx5{roLDf3)ep^f|=TVh&f{Sv~tdUPcQ>8OvZ{jw$yHl?;N8A8U-YH zmrst!)_Zn%ncAIlw|gSSQMDAbzCy_ovOp19M`nz2`Z?g|Y8jG=f?& zh&lSEZ-n@EGbK?XR<+(pO>>?)A&YLOJ7$>9DT8|G_-4@7ME;kKli=lnrYE3_0F5Dw zw)yGJ8$0q`tan2&uAimgsiD|TtllT?0#+p^#&4@MNQiH`*R=acp_Ko4h8*Wjz1t-l z%pp0EfbHC5Zm%^FGT<$dpQ`MrXt?w^H*uz7E+@aT{bh3Nbi~$x=1!;WC06|n1P5zZ ze`19H58O0;XD_hPI8c%7*n%_<*mcfalISjHU0wvQbv$}LG(e81Icop8Nvq_d?-db1aTGT@-%Q$1Sx@=y!$>qhaN#c#n7 z`WZWQw5+9^cov{>L?a6{R#nx^THSZEwhV1vNSTMsL^>$XBlXrRJ<|Sma>H&dRzCo? zN}T+XbNHobxeEa0{2bPF;=QCV5VYm;`1+li zBRqkyj3E9Yd>npS9DS(xw}v)W!z+Apc3M^@(YDe7_OBKlKN32sH`r2hUs4Q40O|OCfHM8U7*A7R(tx9RVRF# zJC0BimJoC85>I)m71`@elBmRMCP`H7_zG<|ewy()x{VWS)O-hZBm2y^1uU1mv$u8X?ii)9g?wdRQq`$bBe@dCWmS*RU~Em(s9+?VrI6&oddD)Bn=4m+&o97LNGN{D+2{coy=1HM*r@y&Hp884h50s? zhZ|F2C}3IMTQ7?3PY5Y(Sxe$+szlXv%@4)iX3(@FS@&6&df5*aQy+qqB0B-Q!FqNR zy*0rCyK2wfdY%;Dwd-r)!D0a|jlpH1zB;%m5{r^Hw-_!jitQe%&;gQ19ns5=KVrHl^lkaZ&tE5~Zi zDvuu~sS{gef^N<#&fA-8g=EQE&@7+GOdlfR-A%JbU+b-&bF&K9P-ePaw%n|>9c~F`~jW0s(b25fG z8Y(Ea$9!3IRj8MrU&;1kl(5R6i9mQMu(0M0B&Lk{bu??0zY49c zkQiYd>f^(9Vwcxl*FMS4H17q@H!x;CL{28oFrqvkJ?$ri!_t@Ez~1zzVk1DBBy610 zr%T1H(H2i;7RL0&DSw|jto(U7 zFjs-|FIBW3(zI_bg2l?rs&<4QCvSNGwxF>S-#=2vvR`BB?Z~V#gx8*Q zwjw09^U@j)7!DQ21Ayi}U5$5xnuTx+pEi}(YWunbFfPa^QE~c8X@sC~XWE`Eg@4fs z(i8K|oNpGem7ZT*XtgN+{tp)AH)!(V$FmgCf0V zOXps(C9x`ldMVR)EDE~nn0zVAdHkNE8D-5A{ARB)Z~Md-+HLwP$GuuaQppOWhYM}9 z_{Lzj+dJ4>@zg0Us9!$2BN1jBM=pHl%-g(^)UH=apwO6D7 literal 0 HcmV?d00001 From 2b2b53ae511138f748cda8e3b55eed4e00960a68 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sat, 4 Nov 2023 15:18:04 +0100 Subject: [PATCH 20/24] Update of Example_VSDFullBodyBoneModels.m --- Example_VSDFullBodyBoneModels.m | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index d72e058..5168365 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -44,13 +44,14 @@ end %% Convert VSD to STAPLE format -vsdSubjectXLSX = fullfile('VSD', 'MATLAB\res\VSD_Subjects.xlsx'); -[~, ~, rawXLSXsdta] = xlsread(vsdSubjectXLSX); -vsdSubjects = cell2table(rawXLSXsdta(2:end,:),'VariableNames',rawXLSXsdta(1,:)); +vsdSubjects = readtable(fullfile('VSD\MATLAB\res\', 'VSD_Subjects.xlsx')); % Remove subjects with incomplete skeletal anatomy vsdSubjects = vsdSubjects(cellfun(@(x) isempty(strfind(x,'cut off')), vsdSubjects.Comment),:); %#ok -for n_sub = 4%:size(vsdSubjects,1) +% Select subjects to be processed +subs = 1;%1:size(vsdSubjects,1); + +for n_sub = subs load(fullfile('VSD', 'Bones', [vsdSubjects.ID{n_sub} '.mat']),'B','M') subFolder = fullfile(datasets_folder, ['VSD_' vsdSubjects.ID{n_sub}] , input_geom_format); if ~isfolder(subFolder) @@ -120,7 +121,7 @@ % create model folder if required if ~isfolder(output_models_folder); mkdir(output_models_folder); end -for n_d = 4%:numel(datasets) +for n_d = subs % current dataset being processed cur_dataset = datasets{n_d}; @@ -138,9 +139,12 @@ [sign_side , cur_side] = bodySide2Sign(sides{n_side}); % cell array with the bone geometries that you would like to process - bones_list = {'pelvis_no_sacrum', ['femur_', cur_side],... - ['tibia_', cur_side], ['talus_', cur_side],... - ['calcn_', cur_side]}; + bones_list = {... + 'pelvis_no_sacrum', ... + ['femur_', cur_side],... + ['tibia_', cur_side], ... + ['talus_', cur_side],... + ['calcn_', cur_side]}; % model and model file naming cur_model_name = ['auto_',datasets{n_d},'_',upper(cur_side)]; From d6213b52a20ac5d9e858d0dbccbee28d94e1a2f0 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sat, 4 Nov 2023 16:45:03 +0100 Subject: [PATCH 21/24] Bug fix in fitQuadriTalus.m --- .../SubFunctions/FittingFun/fitQuadriTalus.m | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m index 3da026d..c8ff859 100644 --- a/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m +++ b/STAPLE/GIBOC-core/SubFunctions/FittingFun/fitQuadriTalus.m @@ -100,17 +100,19 @@ % Get the length of the edges of the quadrilateral edgesLength = zeros(4,1); -for i=1:4 - diff1 = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); - diff2 = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); - edgesLength(i) = sqrt(diff1^2+diff2^2); +for i=1:4 + dy = Pts_proj_2D(quadriV(i+1),1)-Pts_proj_2D(quadriV(i),1); + dz = Pts_proj_2D(quadriV(i+1),2)-Pts_proj_2D(quadriV(i),2); + edgesLength(i) = sqrt(dy^2+dz^2); end [~,Imax] = max(edgesLength); -% Index of the start vertex of the quadrilateral -I_V_sup = mod(Imax+2,4); -% Edge corresponding to the superior part of the bone is assumed to be the -% one opposing the largest one +% The edge corresponding to the superior part of the bone is assumed to be +% the one opposing the largest one +I_V_sup = mod(Imax+2,4); % Index of the start vertex of the superior edge +if I_V_sup == 0 + I_V_sup = 4; +end Edge_sup = quadriV(I_V_sup:I_V_sup+1); % Get the direction of the edge @@ -138,5 +140,4 @@ figure(projFig) end -end - +end \ No newline at end of file From a4ab807baaf58d7b9c054797524feed13b11a635 Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sun, 5 Nov 2023 11:47:36 +0100 Subject: [PATCH 22/24] Update of Example_VSDFullBodyBoneModels.m --- .gitignore | 7 +++++-- Example_VSDFullBodyBoneModels.m | 25 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index c80c42b..676e8e4 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,9 @@ tests/models_from_tests/ *.zip /*_safe/ *ISSUE*/ +# Cloned repositories from Example_VSDFullBodyBoneModels +/VSD +/matGeom # openSim files *.log @@ -31,7 +34,7 @@ tests/models_from_tests/ # used for checking intermediate steps of modelling *.xml -#vim files +# vim files *.*~ -/VSD + diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index 5168365..46e3d7e 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -10,8 +10,6 @@ % STAPLE library addpath(genpath('STAPLE')); -% Additional libraries -addpath(genpath('C:\dev\matGeom')) % https://github.com/mattools/matGeom %% SETTINGS ------------------------------------------------------------- % output_models_folder = 'opensim_models_examples'; @@ -28,12 +26,12 @@ joint_defs = 'Modenese2018'; % ----------------------------------------------------------------------- % -%% VSDFullBodyBoneModels +%% Download VSDFullBodyBoneModels % Clone example data if ~exist('VSD', 'dir') try - !git clone https://github.com/MCM-Fischer/VSDFullBodyBoneModels VSD - rmdir('VSD/.git', 's') + !git clone https://github.com/MCM-Fischer/VSDFullBodyBoneModels VSD + rmdir('VSD/.git', 's') catch warning([newline 'Clone (or copy) the example data from: ' ... 'https://github.com/MCM-Fischer/VSDFullBodyBoneModels' newline 'to: ' ... @@ -43,13 +41,28 @@ end end +% Download matGeom +if ~exist('matGeom', 'dir') + try + !git clone https://github.com/mattools/matGeom matGeom + rmdir('matGeom/.git', 's') + catch + warning([newline 'Clone (or copy) the example data from: ' ... + 'https://github.com/mattools/matGeom' newline 'to: ' ... + fileparts([mfilename('fullpath'), '.m']) '\matGeom' ... + ' and try again!' newline]) + return + end +end +addpath(genpath('matGeom')) + %% Convert VSD to STAPLE format vsdSubjects = readtable(fullfile('VSD\MATLAB\res\', 'VSD_Subjects.xlsx')); % Remove subjects with incomplete skeletal anatomy vsdSubjects = vsdSubjects(cellfun(@(x) isempty(strfind(x,'cut off')), vsdSubjects.Comment),:); %#ok % Select subjects to be processed -subs = 1;%1:size(vsdSubjects,1); +subs = 1; %1:size(vsdSubjects,1); for n_sub = subs load(fullfile('VSD', 'Bones', [vsdSubjects.ID{n_sub} '.mat']),'B','M') From b5b91aba21284a5ef8bce13c9de13f71c3f9874c Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sun, 5 Nov 2023 12:14:56 +0100 Subject: [PATCH 23/24] Toes were missing in Example_VSDFullBodyBoneModels.m --- Example_VSDFullBodyBoneModels.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index 46e3d7e..7bced19 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -157,7 +157,8 @@ ['femur_', cur_side],... ['tibia_', cur_side], ... ['talus_', cur_side],... - ['calcn_', cur_side]}; + ['calcn_', cur_side],... + ['toes_', cur_side]}; % model and model file naming cur_model_name = ['auto_',datasets{n_d},'_',upper(cur_side)]; From b424633b3cffa8b470b0dc27e75b19209b1260db Mon Sep 17 00:00:00 2001 From: MCMF <> Date: Sun, 5 Nov 2023 12:45:37 +0100 Subject: [PATCH 24/24] Remove matGeom from path after execution of Example_VSDFullBodyBoneModels.m --- Example_VSDFullBodyBoneModels.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Example_VSDFullBodyBoneModels.m b/Example_VSDFullBodyBoneModels.m index 7bced19..4be9f37 100644 --- a/Example_VSDFullBodyBoneModels.m +++ b/Example_VSDFullBodyBoneModels.m @@ -219,4 +219,5 @@ logConsolePrintout('off'); end % remove paths +rmpath(genpath('matGeom')); rmpath(genpath('STAPLE')); \ No newline at end of file