./PaxHeaders.6153/opari2-2.0.60000644000000000000000000000013214015716532012452 xustar0030 mtime=1614257498.224005429 30 atime=1614257501.248015057 30 ctime=1614257498.224005429 opari2-2.0.6/0000755000175100001440000000000014015716532013565 5ustar00builderusers00000000000000opari2-2.0.6/PaxHeaders.6153/include0000644000000000000000000000013214015716532013740 xustar0030 mtime=1614257498.224005429 30 atime=1614257501.248015057 30 ctime=1614257498.224005429 opari2-2.0.6/include/0000755000175100001440000000000014015716532015210 5ustar00builderusers00000000000000opari2-2.0.6/include/PaxHeaders.6153/opari20000644000000000000000000000013014015716532015132 xustar0029 mtime=1614257498.28400562 30 atime=1614257501.248015057 29 ctime=1614257498.28400562 opari2-2.0.6/include/opari2/0000755000175100001440000000000014015716532016404 5ustar00builderusers00000000000000opari2-2.0.6/include/opari2/PaxHeaders.6153/pomp2_user_lib.h0000644000000000000000000000013114015716531020301 xustar0030 mtime=1614257497.200002169 30 atime=1614257497.328002576 29 ctime=1614257498.28400562 opari2-2.0.6/include/opari2/pomp2_user_lib.h0000644000175100001440000001035714015716531021503 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_USER_LIB_H #define POMP2_USER_LIB_H #include #include #ifdef __cplusplus extern "C" { #endif /** @file * * @brief This file contains the declarations of all * POMP2 functions. * */ /* Avoid warnings from Orcale Studio Compiler if nowait clauses are added * to reduction loops. Opari always inserts a barrier after such loops, so * the nowait is save.*/ #if defined( __SUNPRO_C ) #pragma error_messages (off, E_NOWAIT_REDUCTION_USE) #endif /** Handles to identify OpenMP regions. */ /** To avoid multiple typedefs of OPARI2_Region_handle*/ #ifndef __opari2_region_handle typedef void* OPARI2_Region_handle; #define __opari2_region_handle #endif typedef OPARI2_Region_handle POMP2_USER_Region_handle; /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. * @return number of instrumented regions */ extern size_t POMP2_USER_Get_num_regions( void ); /** * Init all OPARI2-created regions.@n * The instrumentor scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines these functions by calling all grepped functions. */ extern void POMP2_USER_Init_regions( void ); /** * Returns the OPARI2 version. * @return version string */ extern const char* POMP2_Get_opari2_version( void ); /** Finalizes the POMP2 adapter. It is inserted at the #%pragma pomp inst end. */ extern void POMP2_Finalize( void ); /** Initializes the POMP2 adapter. It is inserted at the #%pragma pomp inst begin. */ extern void POMP2_Init( void ); /** Disables the POMP2 adapter. */ extern void POMP2_Off( void ); /** Enables the POMP2 adapter. */ extern void POMP2_On( void ); /** Called at the begin of a user defined POMP2 region. @param pomp2_handle The handle of the started region. @param ctc_string A string containing the region data. */ extern void POMP2_Begin( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the begin of a user defined POMP2 region. @param pomp2_handle The handle of the started region. */ extern void POMP2_End( POMP2_USER_Region_handle* pomp2_handle ); /** Registers a POMP2 region and returns a region handle. @param pomp2_handle Returns the handle for the newly registered region. @param ctc_string A string containing the region data. */ extern void POMP2_USER_Assign_handle( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ); #ifdef __cplusplus } #endif #endif opari2-2.0.6/include/opari2/PaxHeaders.6153/pomp2_lib.h0000644000000000000000000000013114015716531017243 xustar0030 mtime=1614257497.180002105 30 atime=1614257497.324002564 29 ctime=1614257498.28400562 opari2-2.0.6/include/opari2/pomp2_lib.h0000644000175100001440000005363414015716531020452 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2019, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_LIB_H #define POMP2_LIB_H #ifdef _OPENMP #include #endif #include #include #ifdef __cplusplus extern "C" { #endif /** @file * * @brief This file contains the declarations of all * POMP2 functions. * */ /* Avoid warnings from Orcale Studio Compiler if nowait clauses are added * to reduction loops. Opari always inserts a barrier after such loops, so * the nowait is save.*/ #if defined( __SUNPRO_C ) #pragma error_messages (off, E_NOWAIT_REDUCTION_USE) #endif /** Handles to identify OpenMP regions. */ /** To avoid multiple typedefs of OPARI2_Region_handle*/ #ifndef __opari2_region_handle typedef void* OPARI2_Region_handle; #define __opari2_region_handle #endif typedef OPARI2_Region_handle POMP2_Region_handle; typedef int64_t POMP2_Task_handle; /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. * @return number of instrumented regions */ extern size_t POMP2_Get_num_regions( void ); /** * Init all OPARI2-created regions.@n * The instrumentor scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines these functions by calling all grepped functions. */ extern void POMP2_Init_regions( void ); /** * Returns the OPARI2 version. * @return version string */ extern const char* POMP2_Get_opari2_version( void ); /*@}*/ /** Function that returns a new task handle. * @return new task handle */ extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); /** Create a unique mapping between @a ctc_string and the implementation-defined @a pomp2_handle. Be aware that POMP2_Assign_handle() is called from POMP2_Init_regions() in a serial context but might get called concurrently as well. */ extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); #ifdef _OPENMP /** Called before an atomic statement. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an atomic statement. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a barrier. \n \e OpenMP \e 3.0: Barriers can be used as scheduling points for tasks. When entering a barrier the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a barrier. \n \e OpenMP \e 3.0: When a task exits a barrier the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the barrier. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the ended region. @param pomp2_old_task "Taskprivate" variable storing the id of the task the barrier is located in. */ extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called before an implicit barrier. \e OpenMP \e 3.0: Barriers can be used as scheduling points for tasks. When entering a barrier the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. */ extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); /** Called after an implicit barrier. \e OpenMP \e 3.0: When a task exits a barrier the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the barrier. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the started region. @param pomp2_old_task "Taskprivate" variable storing the id the task the implicit barrier is used in. */ extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called before an flush. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an flush. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a critical region. @param pomp2_handle The handle of the started region. */ extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a critical region. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); /** Called before a critical region. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a critical region. @param pomp2_handle The handle of the region. */ extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a for loop. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a for loop. @param pomp2_handle The handle of the region. */ extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a master region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the end of a master region. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a parallel region. \e OpenMP \e 3.0: When a new parallel region is entered, each thread taking part in that region is executed as a task. These tasks are assigned a new unique task id which is stored in \e pomp2_current_task. @param pomp2_handle The handle of the region. */ extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a parallel region. @param pomp2_handle The handle of the region. */ extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); /** Called before a parallel region. \e OpenMP \e 3.0: The task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. In each of the threads taking part in the following parallel region a newly defined unique task id is assigned (see \ref POMP2_Parallel_begin) @param pomp2_handle The handle of the region. @param if_clause Value of the argument of an if clause (if present). @param num_threads Upper bound for number of child threads. @param pomp2_old_task The task id of the region from which the parallel region was started. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a parallel region. \e OpenMP \e 3.0: When a task exits a parallel region the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the region. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the region. @param pomp2_old_task The task id of the region inside of which the parallel region was executed. */ extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called at the start of a section. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the end of a section. @param pomp2_handle The handle of the region. */ extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); /** Called before a set of sections. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a set of sections. @param pomp2_handle The handle of the region. */ extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); /** Called before a single region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a workshare region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a workshare region. @param pomp2_handle The handle of the region. */ extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); /** Called before an ordered region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. Ignored. */ extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); /** \e OpenMP \e 3.0: When a task encounters a task construct it creates a new task. The task may be scheduled for later execution or executed immediately. In both cases the pomp-adapter assigns the id of the currently active task to \e pomp2_old_task which is defined in the instrumented user code. @param pomp2_handle The handle of the region. @param pomp2_old_task Pointer to the task id in the instrumented user code @param pomp2_if If an if clause is present on the task directive this variable holds the evaluated result of the argument of the if clause. Else it is 1. @param ctc_string The initialization string. */ extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); /** \e OpenMP \e 3.0: After the code region which is executed as a separate task, the task id of the creating task is restored from \e pomp2_old_task (defined in the instrumented user code) and stored in \e pomp2_current_task inside the adapter. @param pomp2_handle The region handle. @param pomp2_old_task The task id of the task inside of which the task was created. This is stored inside the instrumented user code. */ extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** \e OpenMP \e 3.0: Marks the beginning of the execution of a task. @param pomp2_handle The region handle. @param pomp2_task handle of task. */ extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); /** \e OpenMP \e 3.0: Marks the end of the execution of a task. @param pomp2_handle The region handle. */ extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); /** \e OpenMP \e 3.0: When a task encounters a task construct it creates a new task. If the untied clause is specified the task is executed as an untied task. The task may be scheduled for later execution or executed immediately. In both cases the pomp-adapter assigns the id of the currently active task to \e pomp2_old_task which is defined in the instrumented user code. @param pomp2_handle The handle of the region. @param pomp2_old_task Pointer to the task id in the instrumented user code. @param pomp2_if If an if clause is present on the task directive this variable holds the evaluated result of the argument of the if clause. Else it is 1. @param ctc_string The initialization string. */ extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); /** \e OpenMP \e 3.0: After the code region which is executed as a separate untied task, the task id of the creating task is restored from \e pomp2_old_task (defined in the instrumented user code) and stored in \e pomp2_current_task inside the adapter. @param pomp2_handle The region handle. @param pomp2_old_task The id of the task from which the untied task was created. This is stored in the instrumented user code. */ extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** \e OpenMp \e 3.0: Marks the beginning of the execution of an untied task. @param pomp2_handle The region handle. @param pomp2_task Handle of this task. */ void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); /** \e OpenMP \e 3.0: Marks the end of the execution of a task. @param pomp2_handle The region handle. */ extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); /** Called before a taskwait. \n \e OpenMP \e 3.0: Taskwait directives can be used as scheduling points for tasks. When entering a taskwait region the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a barrier. \n \e OpenMP \e 3.0: When a task exits a taskwait region the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the taskwait. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the ended region. @param pomp2_old_task "Taskprivate" variable storing the id of the task the barrier is located in. */ extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Wraps the omp_get_max_threads function. * * Needed for the instrumentation of parallel regions * where the num_threads clause is used with the return * value of the omp_get_max_threads function. This can't * be used directly because the user may have declared * it himself. Double declarations are not allowed. */ extern int POMP2_Lib_get_max_threads( void ); /** Wraps the omp_init_lock function. * @param s The OpenMP lock to initialize.*/ extern void POMP2_Init_lock( omp_lock_t* s ); /** Wraps the omp_destroy_lock function. * @param s The OpenMP lock to destroy. */ extern void POMP2_Destroy_lock( omp_lock_t* s ); /** Wraps the omp_set_lock function. * @param s The OpenMP lock to set. */ extern void POMP2_Set_lock( omp_lock_t* s ); /** Wraps the omp_unset_lock function. * @param s the OpenMP lock to unset. */ extern void POMP2_Unset_lock( omp_lock_t* s ); /** Wraps the omp_test_lock function * @param s the OpenMP lock to test for. * @return result of omp_test_lock*/ extern int POMP2_Test_lock( omp_lock_t* s ); /** Wraps the omp_init_nest_lock function. * @param s The nested OpenMP lock to initialize. */ extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_destroy_nest_lock function. * @param s The nested OpenMP lock to destroy. */ extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_set_nest_lock function * @param s The nested OpenMP lock to set.*/ extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_unset_nest_lock function * @param s The nested OpenMP lock to unset.*/ extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_test_nest_lock function * @param s The nested OpenMP lock to test for. * @return result of omp_test_nest_lock*/ extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); #endif /* _OPENMP */ #ifdef __cplusplus } #endif #endif opari2-2.0.6/PaxHeaders.6153/build-includes0000644000000000000000000000013214015716532015220 xustar0030 mtime=1614257498.232005455 30 atime=1614257501.248015057 30 ctime=1614257498.232005455 opari2-2.0.6/build-includes/0000755000175100001440000000000014015716532016470 5ustar00builderusers00000000000000opari2-2.0.6/build-includes/PaxHeaders.6153/frontend-only.am0000644000000000000000000000013214015716474020417 xustar0030 mtime=1614257468.223909931 30 atime=1614257468.283910123 30 ctime=1614257498.232005455 opari2-2.0.6/build-includes/frontend-only.am0000644000175100001440000000035314015716474021613 0ustar00builderusers00000000000000## -*- mode: makefile -*- include ../src/opari/Makefile.inc.am include ../src/opari-lib-dummy/Makefile.inc.am include ../doc/example/openmp/Makefile.inc.am include ../doc/example/pomp/Makefile.inc.am include ../test/Makefile.inc.am opari2-2.0.6/build-includes/PaxHeaders.6153/common.am0000644000000000000000000000013214015716474017111 xustar0030 mtime=1614257468.223909931 30 atime=1614257468.283910123 30 ctime=1614257498.228005441 opari2-2.0.6/build-includes/common.am0000644000175100001440000000173514015716474020312 0ustar00builderusers00000000000000# -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen, Germany ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## Technische Universitaet Dresden, Germany ## University of Oregon, Eugene, USA ## Forschungszentrum Juelich GmbH, Germany ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## Technische Universitaet Muenchen, Germany ## ## See the COPYING file in the package base directory for details. ## ## file build-includes/common.am ## Intended to be included by the components ## build-(front|back)end/Makefile.am. Defines "common" entities ## that all build-* Makefiles rely on. include ../build-config/common/common.am ## Convenience variable for referencing public headers that will be ## installed. Use e.g. with the primary nobase_include_HEADERS PUBLIC_INC_SRC = $(SRC_ROOT)include/opari2/ opari2-2.0.6/PaxHeaders.6153/OPEN_ISSUES0000644000000000000000000000013214015716474014156 xustar0030 mtime=1614257468.215909906 30 atime=1614257468.271910084 30 ctime=1614257498.128005123 opari2-2.0.6/OPEN_ISSUES0000644000175100001440000002352214015716474015355 0ustar00builderusers00000000000000 OPARI2 2.0.6 OPEN ISSUES ======================== Effective: Feb 2021 This file lists known limitations and unimplemented features of the OPARI2 component. ------------------------------------------------------------------------------ * Platform support - OPARI2 has been tested on the following platforms: + Cray XC systems with all available PrgEnvs + various Linux/Intel (x86_64/Power9/ARM AArch64) clusters with GNU, Intel, Nvidia, and IBM compilers. Note that some compilers are based on Clang. The provided configure options (see INSTALL) may provide a good basis for building and testing the toolset on other systems. - The following platforms have not been tested recently: + IBM Blue Gene/Q + Cray XT, XE, XK However the supplied buildsystem might still work on these systems. - The following platforms have not been tested: + NEC systems -------------------------------------------------------------------------------- Known issues ------------ - All languages + OPARI2, per default, processes source files before the compiler preprocessor, so macros and included files are not processed. Conditionally compiled source code is also not resolved and can therefore result in erroneous instrumentation of partial OpenMP directives. These limitation can be resolved by passing preprocessed code to OPARI2 using the --preprocessed flag. + The instrumented source files generated by OPARI2 may confuse automatic dependency tracking by "make", "autotools", etc. For autotools, configure with "--disable-dependency-tracking". + Literal file-filter rules like "INCLUDE bt.f" for files that will be processed by OPARI2 do not work, as OPARI2 changes the file name (e.g., to bt.opari.f). + Some OpenMP compilers (e.g. PGI) are non-standard-conforming in the way they process OpenMP directives by not allowing macro replacement of OpenMP directive parameters. This results in error messages containing references to POMP_DLIST_##### where ##### is a five-digit number. In this case, try to use the OPARI2 option "--nodecl". This is unfortunately not a perfect workaround, as this can trigger other errors in some rare cases. + When compiling with the PGI compiler version 10.1, local variables that are defined after an OpenMP for directive share the same memory address. This breaks the OPARI2 instrumentation for task tracking. Our recommendation is to use a newer compiler version, According to our tests, later compiler versions have fixed this issues. We tested with PGI compiler version 11.7. + Sometimes instrumentation of OpenMP source files work, but the traces get enormously large because the application is using large numbers (millions) of small OpenMP synchronization operations like atomic, locks or flushes which are instrumented by default. Also, in that case, the instrumentation overhead might become excessive. In that case, you can tell OPARI2 not to instrument these directives by using the "--disable=omp[:directive|group[:inner],...]" option. Valid values for directive are: atomic, critical, flush, locks, master, ordered, single or "sync" which disables all of the above. Of course, then these directives are not measured and you should keep this in mind, when you analyze the results. Although they do not show up in the analysis report that the application might still have some performance problem because. This may especially be the case, because of too many OpenMP synchronization calls! + Instrumented Intel Xeon-Phi offload regions cause compile errors. You need to manually guard the instrumented POMP2 calls by "#ifndef __INTEL_OFFLOAD" preprocessor statements to prevent them from being compiled. The next OPARI2 release will automate this process. + Object files created by the Intel compiler with interprocedural optimization (-ipo) cannot be analyzed by nm for startup initialization of the OpenMP region handles. Workaround is to use only -ip during compilation or to use runtime initialization of the OpenMP region handles inside of the analysis tool. + The option --omp-tpd cannot be used on Fujitsu systems (K, FX10, FX100). + Parentheses used in chunksize calculations within a schedule clause, e.g., schedule(dynamic, (a)*(b)), will cause a compilation error. As a workaround, you can calculate the chuncksize into a temporary variable prior to its usage in the schedule clause. + For combined constructs (like 'omp parallel '), some clauses not yet handled by OPARI2 (such as 'simd') may be incorrectly added to the 'omp parallel' clause during the source-to-source translation. As a workaround, the combined construct can be manually split into an 'omp parallel' region and the remaining construct. - Fortran: + The !$OMP END DO and !$OMP END PARALLEL DO directives are required (and are not optional as described in the OpenMP specification) for F77 style do loops which end with a lable and continue statement. + The atomic expression controlled by a !$OMP ATOMIC directive has to be on a line all by itself in fixed form source files. + The !$OMP END ATOMIC directive must not be used if it is optional. This directive is optional except if the capture clause is used. In this case the instrumentation of atomic directives needs to be disabled via by passing --disable=omp:atomic to opari2. + The Fortran95 statement terminator (";") is not handled correctly when it is used within parallel loops. + If an #ifdef block is used at the beginning of the variable definition part, instrumentation is incorrectly inserted within the block and not compiled later when the evaluation is false. + Some Fortran compilers (e.g., Sun) don't fully support C preprocessor commands, especially the "#line" commands. In case you track a compilation error on a OPARI2 modified/instrumented file down to such a statement, try using "--nosrc" as this suppresses the generation of "#line" statements. (With the Sun Fortran compiler, using "-xpp=cpp" is a better workaround.) + The first SECTION directive inside a SECTIONS workshare directive is required (and is not optional as described in the OpenMP specification). + Fortran .f files are identified as Fortran77 files even if they contain Fortran90 code. You need to manually add the --f90 option to process these files successfully if renaming is not an option. + If you use a fixed form Fortran and override the fixed form requirement by a compiler switch you might need to add --free-form to the OPARI2 commandline to get a compilable instrumentation. Use --fix-form analogously. + OPARI2 requires that the program is included in a PROGRAM block. Using the compilation unit as implicit PROGRAM block will result in erroneous code. + Compiler specific directives starting with "!DIR$" need to be followed by a whitespace character before the directive keyword. + The clauses 'num_threads' and 'if' to the parallel directive must not reside as a sole clause on a line. + OpenMP directives that span over several lines must not contain preprocessor directives. This is a regression from OPARI2 version 1.1.4. + The default(none) clause to the parallel directive must not be used in a continuation line but on the same line as the parallel directive. + Strings within a pair of parenthesis, e.g., (..., msg="my msg"), must either appear on a single line or the closing parenthesis needs to appear on a line following the end quotation mark of the string. Otherwise, include statements might appear not at the correct place. + Instrumented OpenMP directives inside 'associate' constructs fail to compile with gfortran ('pomp2_lib_get_max_threads' is not a function). Compilation works fine with other compilers. + OPARI2 does not handle 'interface ... end interface' correctly. If the name 'interface' (case-insensitive) appears in a variable name, OPARI2 might produce non-functional code. As a workaround, rename this variable. - C/C++: + Structured blocks describing the extent of an OpenMP pragma need to be either compound statements {....}, while loops, or simple statements. In addition, for loops are supported after and . Complex statements like if-then-else or do-while need to be enclosed in a block ( {....} ). + C99 6.10.9 _Pragma operators are not supported. + Codes relying on the definition of macros to select specific features from system header files, e.g., __STDC_CONSTANT_MACROS or _GNU_SOURCE, need to define these macros on the compiler command line rather than in header or source files. + OPARI2 does not handle C++14 integer literal with single quotes correctly. As a workaround, use C++98 integer literals. It is planned to address these limitations in future releases. -------------------------------------------------------------------------------- Please report bugs, wishes, and suggestions to . opari2-2.0.6/PaxHeaders.6153/THANKS0000644000000000000000000000013214015716474013312 xustar0030 mtime=1614257468.215909906 30 atime=1614257468.271910084 30 ctime=1614257497.856004258 opari2-2.0.6/THANKS0000644000175100001440000000123014015716474014501 0ustar00builderusers00000000000000OPARI2 THANKS file OPARI2 has originally been written by authors in AUTHORS file. Many people further contributed to OPARI2 by reporting problems, suggesting various improvements or submitting actual code. Here is a list of these people. Help me keep it complete and exempt of errors. Chee Wai Lee Hendryk Bockelmann Orion Poplawski Piero Lanucara Aleksandr Drozd Sally Bridgwater Xavier Le Vaillant Samuel Thibault Nikhil Jain opari2-2.0.6/PaxHeaders.6153/README0000644000000000000000000000013214015716474013257 xustar0030 mtime=1614257468.215909906 30 atime=1614257468.271910084 30 ctime=1614257497.852004244 opari2-2.0.6/README0000644000175100001440000000070314015716474014452 0ustar00builderusers00000000000000OPARI2 ------ OPARI2 is a source-to-source instrumentation tool for directive based programming models, such as OpenMP. To build OPARI2 you usually just need to do ./configure make make install Please have a look at INSTALL for further configure and build options. After make install you will find html and pdf documentation as well as usage examples under $(prefix)/share/doc/opari. Have fun! Please report bugs to . opari2-2.0.6/PaxHeaders.6153/INSTALL0000644000000000000000000000013214015716474013430 xustar0030 mtime=1614257468.215909906 30 atime=1614257468.271910084 30 ctime=1614257497.852004244 opari2-2.0.6/INSTALL0000644000175100001440000004545214015716474014635 0ustar00builderusers00000000000000For generic installation instructions see below. Configuration of OPARI2 *********************** Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --disable-libtool-lock avoid locking (might break parallel builds) --disable-openmp do not use OpenMP --disable-option-checking ignore unrecognized --enable/--with options --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-compiler-suite=(gcc|ibm|intel|pgi|studio) The compiler suite to build this package with. Needs to be in $PATH [gcc]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: (note that the _FOR_BUILD variables take precedence, e.g. if you call OPARI2's configure from a top level configure in a cross-compile environment that defines CC as well as CC_FOR_BUILD etc.) CC_FOR_BUILD C compiler command for the frontend build CXX_FOR_BUILD C++ compiler command for the frontend build F77_FOR_BUILD Fortran 77 compiler command for the frontend build FC_FOR_BUILD Fortran compiler command for the frontend build CPPFLAGS_FOR_BUILD (Objective) C/C++ preprocessor flags for the frontend build, e.g. -I if you have headers in a nonstandard directory CFLAGS_FOR_BUILD C compiler flags for the frontend build CXXFLAGS_FOR_BUILD C++ compiler flags for the frontend build FFLAGS_FOR_BUILD Fortran 77 compiler flags for the frontend build FCFLAGS_FOR_BUILD Fortran compiler flags for the frontend build LDFLAGS_FOR_BUILD linker flags for the frontend build, e.g. -L if you have libraries in a nonstandard directory LIBS_FOR_BUILD libraries to pass to the linker for the frontend build, e.g. -l CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Please report bugs to . Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. opari2-2.0.6/PaxHeaders.6153/ChangeLog0000644000000000000000000000013214015716474014151 xustar0030 mtime=1614257468.215909906 30 atime=1614257468.271910084 30 ctime=1614257497.848004232 opari2-2.0.6/ChangeLog0000644000175100001440000003242414015716474015351 0ustar00builderusers00000000000000------------------- Released version 2.0.6 --------------------------- - make check's test/awk_script_test.sh was reported to fail due to wrong ordering of regions provided by pomp2_parse_init_regions.awk. Fixed. - Handle C++11 multi line strings literals with arbitrary delimiter ------------------- Released version 2.0.5 --------------------------- - The number of regions reported by POMP2_Get_num_regions() was too small if OpenMP barrier, flush, or taskwait constructs were present in the code. As a consequence opari-lib-dummy crashed; Score-P handled this situation gracefully. Fixed. - When working on preprocessed Fortran files, opari2 duplicated line directives. Compiling these files triggered warnings with certain compilers. Fixed. ------------------- Released version 2.0.4 --------------------------- - Fixed some bad string accesses, thanks to Orion Poplawski. ------------------- Released version 2.0.3 --------------------------- - The instrumentation of OpenMP sections, more precisely the region variable passed to POMP2_Section_end, was potentially invalid. Invalid values were observed in case the environment variable MALLOC_PERTURB_ was set to a non-zero value. Fixed. ------------------- Released version 2.0.2 --------------------------- - Opari2 usually adds nowait and an explicit barrier after the single construct to measure the implicit barrier overhead caused by the single construct. If copyprivate is given, neither nowait nor the explicit barrier must be instrumented. Opari2 complies for C/C++. For Fortran it added nowait and the explicit barrier even if copyprivate is present. This results in a compilation error. Fixed. - When creating the 'pomp2_init_regions.c' file, ignore symbols that contain '.ITC.' but keep symbols of type 'D' (see below). These symbols are created by Intel compilers and were considered as POMP2 region when the compilation flags '-ipo' or '-O3' were used. These symbols caused linker errors during Score-P's link step. ------------------- Released version 2.0.1 --------------------------- - Ignore symbols of type 'D' (symbols in the initialized data section) when creating the 'pomp2_init_regions.c' file. These symbols caused linker errors during Score-P's link step. - The option --disable=omp is supposed to only instrument parallel regions; these are necessary for the thread management of tools building upon OPARI2. But the implicit barrier at the end of parallel regions was instrumented as well. This is fixed now. - Empty lines between continuation lines of directives (e.g., due to conditional compilation) caused OPARI2 to fail. Fixed. ------------------- Released version 2.0 ----------------------------- - Opari2 was modularized. This means, all functionality directly related to OpenMP was encapsulated, thus enabling the support of new paradigms by adding the respective classes. - Parallel loop bodies consisting of if+else were incorrectly instrumented with the "end-loop-instrumentation" inserted before the (first) else. Fixed. - Compilation of instrumented code failed if 'default(none)' was specified in the outmost parallel region and tasking and/or nesting was used. Fixed. - The use of if- or num_threads-clauses with trailing comma caused the compilation of instrumented code to fail. Fixed. - In Fortran one can expose only selected symbols of a used module, e.g., 'use omp_lib, only: '. If is one of the OpenMP lock API calls, OPARI2 would instrument it and compilation would fail. Fixed. ------------------- Released version 1.1.4 --------------------------- - For free form Fortran source files, atomic operations which are written over multiple lines are now supported. - When an asterisk occurs in a schedule clause, this asterisk is substituted in the CTC String by an @ to avoid collision with the asterisk as CTC String delimiter. opari2_ctc_parser.c transforms this back, when the CTC String is read. - Fix in handling of continuation lines in openmp directives in Fortran. - Fixed detection of function keyword in Fortran. - Fixed handling of variables named num_threads, so that they are no longer detected as a num_threads clause ------------------- Released version 1.1.3 --------------------------- - Blank lines between continuation lines that can occur during preprocessing caused OPARI2 to fail. Fixed. - Changes to support Fujitsu's K Computer and FX10/FX100 systems. - Fixed conditional jumps that depend on uninitialized values. - Fixed handling if inode numbers for very large numbers - Fixed generation of output file names for *.cuf and *.CUF files ------------------- Released version 1.1.2 --------------------------- - If num_threads-clauses or if-clauses are the only clause in a continuation line, OPARI2 instrumentation resulted in empty continuation lines, which causes compilation errors. Fixed this by removing empty continuation lines in OpenMP directives. - Install helper scripts that are not intended to be used directly in /libexec as opposed to /bin. - Support the --includedir and --bindir configure options. - Prevent creation of empty '!$omp' lines during instrumentation. These cause compilation errors at least for gfortran. - Prevent insertion of a newline after the 'copyin(pomp_tpd)' instrumentation. - OPARI2 erroneously complained about a 'missing continuation line' in Fortran codes where '!$OMP PARALLEL' directive spans several lines that use conditional compilation. - On some systems the compiled output of pomp2-parse-init-regions.awk caused undefined symbol linker failures due to an ambiguous regular expression in the AWK script. Fixed. ------------------- Released version 1.1.1 --------------------------- - if-else-statements preceded by #pragma omp parallel were instrumented erroneously. Fixed. - OpenMP regions are reported with incorrect source filenames, both in the region name (e.g., "!$omp parallel @rhs.prep.f:28" or "!$omp parallel @rhs.input.F:28" rather than "!$omp parallel @rhs.f:28") and associated attributes. Although not all compilers seem to be affected, this issue is seen with GNU, Intel and IBM XL compilers. Fixed. - Blank lines (often the result of preprocessing) which occur within Fortran directive continuation are ignored by compilers but treated by Opari2 as missing continuation line errors. Fixed. - Do not instrument an if(true) clause if the user hasn't specified one. Although the previously instrumented if(true) clauses usually do no harm, they prevent the CRAY compiler from generating parallel code. This compiler bug was reported to CRAY. - Instrumenting "parallel for" with "firstprivate(x) lastprivate(x)" caused compilation errors. Fixed. ------------------- Released version 1.1 ----------------------------- - The '--preprocess' flag was added to opari2, which indicates that a file has already been preprocessed. This helps to handle OpenMP constructs in header files or constructs dependent on preprocessor defines. Using this option requires that pomp2_lib.h is already included. Furthermore, it requires the marker ___POMP2_INCLUDE___ immediately after the included pomp2_lib.h file. - Fixed enddo detection in Fortran programs when multiple commands are placed on one line separated by a semicolon. - The '--cflags' argument from opari2-config now allows to specify a compiler '--cflags[=(gnu|intel|sun|pgi|ibm|cray)]'. Special compiler dependent options to avoid warnings caused by the instrumentation are added if a compiler is specified. - Added a ctc_string argument to the POMP2_Begin function. Note: This change breaks compatibility to previous opari2 versions. - If Intel's Language Extensions for Offload are used to offload code to a Xeon Phi coprocessor, opari2 no longer instruments OpenMP code in these regions or functions marked for execution on the coprocessor. This allows handling OpenMP code on the host, when the measurement system does not support the offload model. ------------------- Released version 1.0.7 --------------------------- - Fixed broken option --disable=atomic in Fortran and C/C++. - Improving options --free-form and --fix-form. - Note that within the context of providing the new opari2-config option '--region-initialization' introduced in 1.0.7-rc1, the script pomp2-parse-init-regions.awk was changed into an executable command. The old options '--awk-cmd', '--awk-script', and '--egrep' are still available but deprecated. - Fixed problem parsing escaped characters in C source code which caused opari2 to crash. - Provide POMP2_Init_regions functions with a unique suffix (formerly used gettimeofday was not "unique enough") to prevent duplicate definition linker failures. - Improved instrumentation for parallel regions that the default(none) clause by replacing the pomp2_ctc_XX constant variable by preprocessor defines. - Fixed bug in instrumenting comments in macros which caused "ERROR: unbalanced pragma/directive nesting for $END$ directive". - Fix instrumentation by adding opari2 options --free-form and --fix-form for cases where opari2's assumptions based on the file extension (.f fixed-form) do not hold because the user specified otherwise (e.g. by compiling with --ffree-form ). - Resurrect the hidden feature "manually prevent OpenMP directives from being instrumented" by documenting it. Parallel regions still get instrumented as this a prerequisite of measurement tools to get the internal thread handling correct. - Improved parsing of the nm output in order to generate the region initialization file in cases where the the POMP2_Init_reg routines were generated with absolute addresses (e.g. using the Open64 compiler with inter-procedural analysis). - Do not add any POMP2 statements in Fortran pure subroutines/functions as this leads to compile errors. - Simplify the generation the POMP2 init region file. Previously opari2-config had to be called in a sequence (--egrep, --egrep, --awk-cmd, --awk-script). This sequence is replaced by opari2-config --region-initialization. - Comments in macros are now ignored when processing. ------------------- Released version 1.0.6 --------------------------- - Changed opari-config option --pomp2-api-version to --interface-version to make it consistent with otf2-config and cube-config. ------------------- Released version 1.0.5 --------------------------- - Fix invalid insertion of .opari.inc in conjunction with continued 'dimension' statements. - Improved Fortran 'end do' detection. - CTC-strings grew to long for Fortran77. Size reduced. - Use inode instead of gettimeofday as unique region identifier. In very special circumstances gettimeofday resolution leads to non-unique identifiers. - CTC-strings contained wrong line-number information. - Create temporary files in the directory of the output file. - Detection of conditional compilation in free form Fortran improved. ------------------- Released version 1.0.4 --------------------------- - Provide correct region line numbers also for lazy initialization during runtime. Previously the region end line was always 0 for lazy initialization. - Improved region end line number handling in conjunction with omitted Fortran '!$omp end do' or '!$omp end parallel do' directives. - Fix invalid insertion of .opari.inc in Fortran77 codes with arbitrary continuation line characters in column 6. - Fix invalid insertion of .opari.inc in Fortran codes in conjunction with subroutine calls that distribute their arguments over several lines. ------------------- Released version 1.0.3 --------------------------- - Prevent OPARI2 from instrumenting Fortran 'abstract interfaces'. - Fix invalid insertion of .opari.inc in conjunction with Fortran 'USE' statements that contain line continuations. - Fix invalid insertion of .opari.inc in conjunction with user-defined operators containing '=' in Fortran 'USE' statements. - Fix instrumentation of .c files that produce a linker/mangling error when compiled with a C++ compiler. - Support for out-of-place a.k.a. VPATH builds. Generate .opari.inc in the directory of the output file. - Fix instrumentation bug (C++ files only) where IBM and PGI compilers expect threadprivate variables in different locations. ------------------- Released version 1.0.2 --------------------------- - Renaming of the configure related variable LD_FLAGS_FOR_BUILD to LDFLAGS_FOR_BUILD for consistency. - Renaming of the installed script pomp2_parse_init_regions.awk to pomp2-parse-init-regions.awk for consistency. - In Fortran, improved parsing of function and subroutine keywords. - In in-place builds, the [dist]clean targets accidentally removed files. - Create task events only for tasks that actually get created. - In Fortran, added `integer ( kind=4 )' to all integer variables instrumented by opari2. - In Fortran, continuation lines ending with comments were not detected as continuation lines (Ticket 77). ------------------- Released version 1.0.1 --------------------------- - In Fortran, continued format descriptors resulted in invalid include of the opari.inc file (Ticket 76). - In Fortran, rename lists resulted in premature include of the opari.inc file (Ticket 75). ------------------- Released version 1.0 ----------------------------- opari2-2.0.6/PaxHeaders.6153/COPYING0000644000000000000000000000013214015716474013432 xustar0030 mtime=1614257468.211909893 30 atime=1614257468.271910084 30 ctime=1614257497.848004232 opari2-2.0.6/COPYING0000644000175100001440000000522414015716474014630 0ustar00builderusers00000000000000The entire code of Score-P is licensed under the BSD-style license agreement given below, except for the third-party code distributed in the 'vendor/' subdirectory. See the corresponding COPYING files in 'vendor/*' of the distribution tarball for details. ----------------------------------------------------------------------------- OPARI2 LICENSE AGREEMENT ======================== Copyright (c) 2009-2016, RWTH Aachen University, Germany Copyright (c) 2009-2013, Gesellschaft fuer numerische Simulation mbH, Braunschweig, Germany Copyright (c) 2009-2013, 2016, 2018-2020, Technische Universitaet Dresden, Germany Copyright (c) 2009-2013, University of Oregon, Eugene, USA Copyright (c) 2009-2021, Forschungszentrum Juelich GmbH, Germany Copyright (c) 2009-2014, German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany Copyright (c) 2009-2013, Technische Universitaet Muenchen, Germany All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of RWTH Aachen University, Gesellschaft fuer numerische Simulation mbH Braunschweig, Technische Universitaet Dresden, University of Oregon, Eugene, Forschungszentrum Juelich GmbH, German Research School for Simulation Sciences GmbH, or the Technische Universitaet Muenchen, nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. opari2-2.0.6/PaxHeaders.6153/AUTHORS0000644000000000000000000000013214015716474013447 xustar0030 mtime=1614257468.211909893 30 atime=1614257468.271910084 30 ctime=1614257497.844004219 opari2-2.0.6/AUTHORS0000644000175100001440000000103714015716474014643 0ustar00builderusers00000000000000Authors of OPARI and OPARI2, in chronological order: Bernd Mohr Brian Wylie Felix Wolf Markus Geimer Christian Feld Daniel Lorenz Dirk Schmidl Peter Philippen Jie Jiang opari2-2.0.6/PaxHeaders.6153/aclocal.m40000644000000000000000000000013114015716477014241 xustar0030 mtime=1614257471.315919773 29 atime=1614257471.59192065 30 ctime=1614257497.824004156 opari2-2.0.6/aclocal.m40000644000175100001440000007315214015716477015445 0ustar00builderusers00000000000000# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([build-config/common/m4/ac_common_package.m4]) m4_include([build-config/common/m4/ac_scorep_doxygen.m4]) m4_include([build-config/common/m4/ac_scorep_git_controlled.m4]) m4_include([build-config/common/m4/ac_scorep_sys_detection.m4]) m4_include([build-config/common/m4/ac_scorep_toplevel_args.m4]) m4_include([build-config/common/m4/ac_scorep_uncrustify.m4]) m4_include([build-config/common/m4/ac_scorep_version_and_revision.m4]) m4_include([build-config/common/m4/afs_compiler_backend.m4]) m4_include([build-config/common/m4/afs_maintainer_mode.m4]) m4_include([build-config/common/m4/afs_summary.m4]) m4_include([build-config/common/m4/ax_config_subdir.m4]) m4_include([build-config/m4/opari2_compiler_and_flags.m4]) opari2-2.0.6/PaxHeaders.6153/configure.ac0000644000000000000000000000013214015716474014665 xustar0030 mtime=1614257468.227909944 30 atime=1614257468.287910135 30 ctime=1614257497.820004143 opari2-2.0.6/configure.ac0000644000175100001440000000714714015716474016071 0ustar00builderusers00000000000000AC_PREREQ([2.69]) AC_INIT([OPARI2], m4_esyscmd([build-config/common/generate-package-version.sh build-config/VERSION]), [support@score-p.org], [opari2]) AFS_PACKAGE_INIT AC_SCOREP_REVISION AC_SCOREP_TOPLEVEL_ARGS ## Packages that do manual configuration or use the install program might need ## to tell configure where to find some other shell scripts by calling ## AC_CONFIG_AUX_DIR, though the default places it looks are correct for most ## cases. ## Need to be called early on configure.ac because other macros search tools ## in this directory. AC_CONFIG_AUX_DIR([build-config]) ## See also ACLOCAL_AMFLAGS in Makefile.am. AC_CONFIG_MACRO_DIRS([build-config/m4 build-config/common/m4]) ## Set the default installation prefix to /opt/opari2 instead of /usr/local AC_PREFIX_DEFAULT([/opt/opari2]) AC_SCOREP_GIT_CONTROLLED ## Call not before AC_CONFIG_MACRO_DIR AM_INIT_AUTOMAKE([foreign color-tests 1.13.4 -Wall tar-pax]) AM_SILENT_RULES([yes]) AFS_MAINTAINER_MODE AC_SCOREP_DETECT_PLATFORMS AFS_CROSSCOMPILING # don't detect and load defaults in nested configures (e.g. otf2) AS_IF([test "x$ac_scorep_platform_data_provided" = "x" || test "${ac_scorep_platform_data_provided}" = "no"], [AFS_CUSTOM_COMPILERS AS_IF([test "x${afs_custom_compilers_given}" = "xno"], [AC_SCOREP_WITH_NOCROSS_COMPILER_SUITE]) # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ $ac_scorep_compilers_backend \ $ac_scorep_compilers_frontend \ user_provided_configure_args`" AS_IF([test $? -ne 0], [AC_MSG_ERROR([cannot process provided and/or autodetected arguments. Please contact and provide the above output. Thanks.])]) ], [AC_MSG_NOTICE([platform data provided by toplevel configure.]) # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ user_provided_configure_args`" AS_IF([test $? -ne 0], [AC_MSG_ERROR([cannot process provided arguments. Please contact and provide the above output. Thanks.])]) ]) AC_SCOREP_UNCRUSTIFY AC_SCOREP_DOXYGEN AS_IF([test "x${ac_scorep_git_controlled}" = xyes], [AC_CONFIG_FILES([doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in]) AC_CONFIG_FILES([doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in])]) ## Autoconf supports changing the names of programs when installing them. In ## order to use these transformations, configure.ac must call the macro ## AC_ARG_PROGRAM. # implicitly called by ? #AC_ARG_PROGRAM # used for EXTRA_DIST in Makefile.am AM_CONDITIONAL([CROSS_BUILD], [test "x${ac_scorep_cross_compiling}" = "xyes"]) # handle own package's subdir configures AX_CONFIG_SUBDIR([build-frontend], [${args} ac_scorep_platform=${ac_scorep_platform}]) #sed is needed for check target AC_PROG_SED AC_SUBST([OPARI2_AWK], [`which ${AWK}`]) AC_CONFIG_FILES([ Makefile src/config-common.h:build-config/common/config-common.h ]) AC_CONFIG_FILES([test/c_test.sh], [chmod +x test/c_test.sh]) AC_CONFIG_FILES([test/f90_test.sh], [chmod +x test/f90_test.sh]) AC_CONFIG_FILES([test/f77_test.sh], [chmod +x test/f77_test.sh]) AC_CONFIG_FILES([test/awk_script_test.sh], [chmod +x test/awk_script_test.sh]) AC_CONFIG_FILES([test/awk_script_test.output:test/data/awk_script_test.out.in]) AC_CONFIG_FILES([build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in], \ [chmod +x build-frontend/pomp2-parse-init-regions.awk]) AC_OUTPUT opari2-2.0.6/PaxHeaders.6153/configure0000644000000000000000000000013214015716500014271 xustar0030 mtime=1614257472.079922204 30 atime=1614257486.803969072 30 ctime=1614257497.792004053 opari2-2.0.6/configure0000755000175100001440000050225514015716500015500 0ustar00builderusers00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for OPARI2 2.0.6. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # need to catch these variables, before unsetting them later : ${AS_COLOR:=$CLICOLOR}; export AS_COLOR : ${AS_COLOR_FORCE:=$CLICOLOR_FORCE}; export AS_COLOR_FORCE as__red= as__grn= as__yel= as__blu= as__mag= as__cya= as__gry= as__std= as__color=no if test "X$AS_COLOR_FORCE" = X0; then as__color=no; elif test "X$AS_COLOR_FORCE" = X1; then as__color=yes elif { test "X$TERM" != Xdumb || test "X$AS_COLOR" = X1; } && { test -t 1; } 2>/dev/null; then as__color=yes fi if test $as__color = yes; then as__red='' as__grn='' as__yel='' as__blu='' as__mag='' as__cya='' as__gry='' as__std='' fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: support@score-p.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # ax_fn_config_subdir # ------------------- # trigger configure in ax_subdir with arguments ax_subdir_args. Adjusts # parameters by updating --cache-file, --srcdir, --prefix, and adding # --disable-option-checking as in AC_CONFIG_SUBIRS. ax_fn_config_subdir () { ax_subdir="$1" ax_subdir_args="$2" # BEGIN: slightly modified snippet from status.m4 # Remove --cache-file, --srcdir, --prefix, and # --disable-option-checking arguments so they do not pile up. # Input: ax_subdir_args; output: ax_sub_configure_args ax_sub_configure_args= ac_prev= eval "set x $ax_subdir_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ax_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ax_sub_configure_args="'$ac_arg' $ax_sub_configure_args" # Pass --silent if test "$silent" = yes; then ax_sub_configure_args="--silent $ax_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ax_sub_configure_args="--disable-option-checking $ax_sub_configure_args" ax_popdir=`pwd` ac_msg="=== configuring in $ax_subdir (`pwd`/$ax_subdir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ax_subdir"; as_fn_mkdir_p ac_builddir=. case "$ax_subdir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ax_subdir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ax_subdir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ax_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ax_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ax_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ax_subdir" >&5 $as_echo "$as_me: ${as__yel}WARNING: no configuration information is in $ax_subdir${as__std}" >&2;} ax_sub_configure= fi # The recursion is here. if test -n "$ax_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: info: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: ${as__blu}info: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir${as__std}" >&2;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ax_sub_configure\" $ax_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ax_sub_configure failed for $ax_subdir" "$LINENO" 5 fi cd "$ax_popdir" # END: slightly modified snippet from status.m4 } # ax_fn_config_subdir # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: ${as__red}error: $2${as__std}" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OPARI2' PACKAGE_TARNAME='opari2' PACKAGE_VERSION='2.0.6' PACKAGE_STRING='OPARI2 2.0.6' PACKAGE_BUGREPORT='support@score-p.org' PACKAGE_URL='' ac_default_prefix=/opt/opari2 enable_option_checking=no ax_config_subdir_dir_1= ax_config_subdir_args_1= ac_subst_vars='LTLIBOBJS LIBOBJS OPARI2_AWK ax_config_subdirs CROSS_BUILD_FALSE CROSS_BUILD_TRUE ac_scorep_doxygen_distdir HAVE_DOXYGEN_LATEX_FALSE HAVE_DOXYGEN_LATEX_TRUE have_doxygen_latex have_makeindex have_pdflatex have_dot HAVE_DOXYGEN_FALSE HAVE_DOXYGEN_TRUE DOXYGEN HAVE_UNCRUSTIFY_FALSE HAVE_UNCRUSTIFY_TRUE ac_scorep_have_uncrustify has_ftn has_CC has_cc build_os build_vendor build_cpu build MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SED GIT_CONTROLLED_FALSE GIT_CONTROLLED_TRUE LIBRARY_AGE LIBRARY_REVISION LIBRARY_CURRENT PACKAGE_SUFFIX PACKAGE_BUGFIX PACKAGE_MINOR PACKAGE_MAJOR afs_srcdir AFS_PACKAGE_NAME AFS_PACKAGE_name target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_platform_mic with_custom_compilers with_compiler_suite ' ac_precious_vars='build_alias host_alias target_alias' ac_subdirs_all='build-frontend' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: ${as__yel}WARNING: you should use --build, --host, --target${as__std}" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: ${as__yel}WARNING: invalid host type: $ac_option${as__std}" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: ${as__yel}WARNING: unrecognized options: $ac_unrecognized_opts${as__std}" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures OPARI2 2.0.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/opari2] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of OPARI2 2.0.6:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-platform-mic Force build for Intel Xeon Phi co-processors [no]. This option is only needed for Xeon Phi co-processors, like the Knights Corner (KNC). It is not needed for self-hosted Xeon Phis, like the Knights Landing (KNL); for these chips no special treatment is required. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-custom-compilers Customize compiler settings by 1. copying the files /build-config/common/platforms/platform-*-user-provided to the directory where you run configure , 2. editing those files to your needs, and 3. running configure. Alternatively, edit the files under directly. Files in take precedence. You are entering unsupported terrain. Namaste, and good luck! --with-compiler-suite=(gcc|ibm|intel|pgi|studio|clang) The compiler suite used to build this package. Needs to be in $PATH [gcc]. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: ${as__yel}WARNING: no configuration information is in $ac_dir${as__std}" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF OPARI2 configure 2.0.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by OPARI2 $as_me 2.0.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: ${as__yel}WARNING: cache variable $ac_var contains a newline${as__std}" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: loading site script $ac_site_file" >&5 $as_echo "$as_me: ${as__blu}info: loading site script $ac_site_file${as__std}" >&2;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: ${as__red}error: in \`$ac_pwd':${as__std}" >&2;} as_fn_error $? "failed to load site script $ac_site_file" "$LINENO" 5 as_fn_error $? "See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: loading cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: loading cache $cache_file${as__std}" >&2;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: creating cache $cache_file${as__std}" >&2;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu AFS_PACKAGE_name=opari2 AFS_PACKAGE_NAME=OPARI2 afs_srcdir=$srcdir { $as_echo "$as_me:${as_lineno-$LINENO}: checking Git controlled" >&5 $as_echo_n "checking Git controlled... " >&6; } ac_scorep_git_controlled="no" # test if ${afs_srcdir} is a git top-level, not any parent directory: # * if ${afs_srcdir} is a top-level, than the prefix is empty (e.g., we are git controlled) # * if ${afs_srcdir} is below a top-level, than it wont be empty (e.g., we operate in a # tarball, which was extracted below a top-level) # * if git could not find any top-level, it prints an error to stderr and stop, # we catch this error, which makes the test also fail (e.g., we operate in a # tarball which is *not* below any top-level) if test -z "$( unset $(git rev-parse --local-env-vars 2>/dev/null) && cd ${afs_srcdir} && git rev-parse --show-prefix 2>&1)"; then : ac_scorep_git_controlled="yes" $as_echo "#define SCOREP_IN_DEVELOPEMENT /**/" >>confdefs.h else $as_echo "#define SCOREP_IN_PRODUCTION /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_git_controlled" >&5 case "$ac_scorep_git_controlled" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_git_controlled${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_git_controlled${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_git_controlled${as__std}" >&6 ;; esac; } PACKAGE_MAJOR=2 PACKAGE_MINOR=0 PACKAGE_BUGFIX=6 PACKAGE_SUFFIX= LIBRARY_CURRENT=3 LIBRARY_REVISION=0 LIBRARY_AGE=0 # When in a working copy, write REVISION* files. The REVISION* files # are updated during each configure call and also at make # doxygen-user. # When working with a make-dist-generated tarball, the REVISION* files # are provided. component_revision="invalid" if test "x${ac_scorep_git_controlled}" = xyes && component_revision=$( unset $(git rev-parse --local-env-vars 2>/dev/null) && cd ${afs_srcdir} && git describe --always --dirty 2>/dev/null); then : echo "$component_revision" >${afs_srcdir}/build-config/REVISION else component_revision=external fi # Warn if the REVISION files contain -dirty prefix or is external. case `cat ${afs_srcdir}/build-config/REVISION` in #( *-dirty|external|invalid) : component_revision=`cat ${afs_srcdir}/build-config/REVISION` { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: distribution does not match a single, unmodified revision, but $component_revision." >&5 $as_echo "$as_me: ${as__yel}WARNING: distribution does not match a single, unmodified revision, but $component_revision.${as__std}" >&2;} ;; #( *) : ;; esac # Quote arguments with shell meta characters. TOPLEVEL_CONFIGURE_ARGUMENTS= set -- "$progname" "$@" for ac_arg do case "$ac_arg" in #( *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\']*) : ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` # if the argument is of the form -foo=baz, quote the baz part only ac_arg=`echo "'$ac_arg'" | sed "s/^'\([-a-zA-Z0-9]*=\)/\\1'/"` ;; #( *) : ;; esac # Add the quoted argument to the list. TOPLEVEL_CONFIGURE_ARGUMENTS="$TOPLEVEL_CONFIGURE_ARGUMENTS $ac_arg" done # Remove the initial space we just introduced. TOPLEVEL_CONFIGURE_ARGUMENTS=`echo "x$TOPLEVEL_CONFIGURE_ARGUMENTS" | sed -e 's/^x *//'` echo "$TOPLEVEL_CONFIGURE_ARGUMENTS" > ./user_provided_configure_args ## Packages that do manual configuration or use the install program might need ## to tell configure where to find some other shell scripts by calling ## AC_CONFIG_AUX_DIR, though the default places it looks are correct for most ## cases. ## Need to be called early on configure.ac because other macros search tools ## in this directory. ac_aux_dir= for ac_dir in build-config "$srcdir"/build-config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-config \"$srcdir\"/build-config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ## See also ACLOCAL_AMFLAGS in Makefile.am. ## Set the default installation prefix to /opt/opari2 instead of /usr/local { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 case "$ac_cv_path_SED" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_path_SED${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_path_SED${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_path_SED${as__std}" >&6 ;; esac; } SED="$ac_cv_path_SED" rm -f conftest.sed # afs_fn_summary DESCR VALUE INDENT WRAP-MARGIN=128 # ---------------------------------------------------------------------- # Produces a line-wrapped summary line with DESCR and VALUE, indented by # INDENT and wrapped at WRAP-MARGIN. afs_fn_summary () { _afs_summary_wrap_width=${4-128} _afs_summary_column_width=32 _afs_summary_prefix="${3-} ${1-}:" printf "%s" "${_afs_summary_prefix}" _afs_summary_padding="$(printf "%-${_afs_summary_column_width}s" "")" _afs_summary_value="$(echo "${2-}" | $SED -e 's/ */ /g' -e 's/^ //' -e 's/ $//')" if test ${#_afs_summary_prefix} -ge ${#_afs_summary_padding}; then : _afs_summary_nl=" \\$as_nl${_afs_summary_padding}" else as_fn_arith ${#_afs_summary_padding} - ${#_afs_summary_prefix} && _afs_summary_nl="$(printf "%-${as_val}s" "")" fi _afs_summary_sep="" as_fn_arith ${#_afs_summary_padding} + 1 && _afs_summary_column=$as_val while test -n "${_afs_summary_value}" do _afs_summary_entry="${_afs_summary_value%% *}" printf "%s" "${_afs_summary_nl}${_afs_summary_sep}${_afs_summary_entry}" case "${_afs_summary_value}" in (*" "*) _afs_summary_value="${_afs_summary_value#* }" ;; (*) _afs_summary_value="" ;; esac as_fn_arith ${_afs_summary_column} + ${#_afs_summary_entry} + ${#_afs_summary_sep} && _afs_summary_column=$as_val if test ${_afs_summary_column} -ge ${_afs_summary_wrap_width}; then : _afs_summary_nl=" \\$as_nl${_afs_summary_padding}" _afs_summary_sep="" as_fn_arith ${#_afs_summary_padding} + 1 && _afs_summary_column=$as_val else _afs_summary_sep=" " _afs_summary_nl="" fi done echo { _afs_summary_column_width=; unset _afs_summary_column_width;} { _afs_summary_wrap_width=; unset _afs_summary_wrap_width;} { _afs_summary_prefix=; unset _afs_summary_prefix;} { _afs_summary_padding=; unset _afs_summary_padding;} { _afs_summary_value=; unset _afs_summary_value;} { _afs_summary_nl=; unset _afs_summary_nl;} { _afs_summary_sep=; unset _afs_summary_sep;} { _afs_summary_column=; unset _afs_summary_column;} { _afs_summary_entry=; unset _afs_summary_entry;} { _afs_summary_tag=; unset _afs_summary_tag;} { _afs_summary_tag_final=; unset _afs_summary_tag_final;} } # afs_fn_summary rm -f opari2.summary LC_ALL=C find . -name 'config.summary*' -exec rm -f '{}' \; afs_fn_summary \ "OPARI2 2.0.6" \ "" \ "" \ >config.summary if test "x${ac_scorep_git_controlled}" = xyes; then GIT_CONTROLLED_TRUE= GIT_CONTROLLED_FALSE='#' else GIT_CONTROLLED_TRUE='#' GIT_CONTROLLED_FALSE= fi if test "x${verbose}" = "xyes"; then : afs_fn_summary "Git controlled" "$ac_scorep_git_controlled" " " >>config.summary fi ## Call not before AC_CONFIG_MACRO_DIR am__api_version='1.13' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 case "$INSTALL" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$INSTALL${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$INSTALL${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$INSTALL${as__std}" >&6 ;; esac; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "${as__grn}yes${as__std}" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: ${as__yel}WARNING: 'missing' script is too old or missing${as__std}" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 case "$STRIP" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$STRIP${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$STRIP${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$STRIP${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 case "$ac_ct_STRIP" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_ct_STRIP${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_ct_STRIP${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_ct_STRIP${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: ${as__yel}WARNING: using cross tools not prefixed with host triplet${as__std}" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 case "$MKDIR_P" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$MKDIR_P${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$MKDIR_P${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$MKDIR_P${as__std}" >&6 ;; esac; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 case "$AWK" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$AWK${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$AWK${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$AWK${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "${as__grn}yes${as__std}" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 case "$am_cv_make_support_nested_variables" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_make_support_nested_variables${as__std}" >&6 ;; esac; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='opari2' VERSION='2.0.6' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 $as_echo_n "checking how to create a pax tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_pax-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x pax -w "$$tardir"' am__tar_='pax -L -x pax -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H pax -L' am__tar_='find "$tardir" -print | cpio -o -H pax -L' am__untar='cpio -i -H pax -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_pax}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_pax+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_pax=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 case "$am_cv_prog_tar_pax" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_prog_tar_pax${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_prog_tar_pax${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_prog_tar_pax${as__std}" >&6 ;; esac; } # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 case "$am_cv_make_support_nested_variables" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_make_support_nested_variables${as__std}" >&6 ;; esac; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "x${ac_scorep_git_controlled}" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 case "$USE_MAINTAINER_MODE" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$USE_MAINTAINER_MODE${as__std}" >&6 ;; esac; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 case "$USE_MAINTAINER_MODE" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$USE_MAINTAINER_MODE${as__std}" >&6 ;; esac; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 case "$ac_cv_build" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_build${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_build${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_build${as__std}" >&6 ;; esac; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac # Notes about platform detection on Cray systems: # First, we check for x86-64 CPU type and an existing /opt/cray/pmi/default link. # This test should succeed for all supported Cray systems (Cray XT, XE, XK, XC). # In the second step we will classify the systems depending on their network. # Therefore, we use the link /opt/cray/pmi/default. We determine the link target # and select the network. For example, /opt/cray/pmi/default points to # /opt/cray/pmi/4.0.1-1.0000.9421.73.3.gem. 'gem' signifies the Gemini network. # As a result we can classify the following systems: # ss (SeaStar) Cray XT # gem (Gemini) Cray XE, XK # ari (Aries) Cray XC # To distinguish Cray XE and XK systems we determine whether the system uses GPU # accelerators (Cray XK) or not (Cray XE). # # Newer software stacks do not encode the network name in their files, e.g., # /opt/cray/pmi/5.0.11 # Therefore, we need a fall-back solution. We will test for several directories # including the network name. # # Even newer software stacks on Cray XC systems (Cori, Piz Daint) # don't provide the /opt/cray/pmi/default link but instead # /opt/cray/pe/pmi/default. They still provide the network via # /opt/cray/ari/modulefiles. # # Check whether --enable-platform-mic was given. if test "${enable_platform_mic+set}" = set; then : enableval=$enable_platform_mic; case ${enableval} in #( yes) : ac_scorep_platform=mic ;; #( no) : ;; #( *) : as_fn_error $? "value '$enableval' unsupported for '--enable-platform-mic'" "$LINENO" 5 ;; esac fi if test "x${ac_scorep_platform}" = "x"; then : case ${build_os} in #( linux*) : if test "x${build_cpu}" = "xia64" && test -f /etc/sgi-release; then : ac_scorep_platform="altix" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgl/BlueLight; then : ac_scorep_platform="bgl" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgsys/drivers/ppcfloor/hwi; then : ac_scorep_platform="bgq" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgsys; then : ac_scorep_platform="bgp" elif (test "x${build_cpu}" = "xx86_64" || test "x${build_cpu}" = "xaarch64") && test -d /opt/cray; then : ac_scorep_platform="crayunknown" if test -L /opt/cray/pmi/default; then : if test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q ss && echo TRUE`" = "xTRUE"; then : ac_scorep_platform="crayxt" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q gem && echo TRUE`" = "xTRUE" && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x1"; then : ac_scorep_platform="crayxe" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q gem && echo TRUE`" = "xTRUE" && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x0"; then : ac_scorep_platform="crayxk" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q ari && echo TRUE`" = "xTRUE"; then : ac_scorep_platform="crayxc" elif test -d /opt/cray/ari/modulefiles; then : ac_scorep_platform="crayxc" elif test -d /opt/cray/gem/modulefiles && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x0"; then : ac_scorep_platform="crayxk" elif test -d /opt/cray/gem/modulefiles && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x1"; then : ac_scorep_platform="crayxe" fi elif test -L /opt/cray/pe/pmi/default; then : if test -d /opt/cray/ari/modulefiles; then : ac_scorep_platform="crayxc" fi fi if test "x${ac_scorep_platform}" = "xcrayunknown"; then : # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_cc+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_cc"; then ac_cv_prog_has_cc="$has_cc" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_cc="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_cc" && ac_cv_prog_has_cc="no" fi fi has_cc=$ac_cv_prog_has_cc if test -n "$has_cc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_cc" >&5 case "$has_cc" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_cc${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_cc${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_cc${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "CC", so it can be a program name with args. set dummy CC; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_CC"; then ac_cv_prog_has_CC="$has_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_CC="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_CC" && ac_cv_prog_has_CC="no" fi fi has_CC=$ac_cv_prog_has_CC if test -n "$has_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_CC" >&5 case "$has_CC" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_CC${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_CC${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_CC${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "ftn", so it can be a program name with args. set dummy ftn; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_ftn+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_ftn"; then ac_cv_prog_has_ftn="$has_ftn" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_ftn="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_ftn" && ac_cv_prog_has_ftn="no" fi fi has_ftn=$ac_cv_prog_has_ftn if test -n "$has_ftn"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_ftn" >&5 case "$has_ftn" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_ftn${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_ftn${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_ftn${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "${has_cc}${has_CC}${has_ftn}" != yesyesyes; then : # System seems to be a Cray, but doensn't provide # compiler wrappers cc, CC, ftn. Try 'linux' as fallback. ac_scorep_platform=linux { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unknown Cray platform, no compiler wrappers provided, assume linux. Please contact ." >&5 $as_echo "$as_me: ${as__yel}WARNING: Unknown Cray platform, no compiler wrappers provided, assume linux. Please contact .${as__std}" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unknown Cray platform, please contact ." >&5 $as_echo "$as_me: ${as__yel}WARNING: Unknown Cray platform, please contact .${as__std}" >&2;} fi fi elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVtclang; then : ac_scorep_platform="k" elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVfxlang; then : ac_scorep_platform="fx10" elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVmxlang; then : ac_scorep_platform="fx100" else ac_scorep_platform=linux fi ;; #( sunos* | solaris*) : ac_scorep_platform="solaris" ;; #( darwin*) : ac_scorep_platform="mac" ;; #( aix*) : ac_scorep_platform="aix" ;; #( superux*) : ac_scorep_platform="necsx" ;; #( mingw*) : ac_scorep_platform="mingw" ;; #( *) : ac_scorep_platform="unknown" ;; esac # Keep 'checking' and 'result' close to each other in oder to not interfere with CICD platform check { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } if test "x${ac_scorep_platform}" = "xunknown"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform, please contact if you encounter any problems." >&5 case "$ac_scorep_platform, please contact if you encounter any problems." in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform (auto detected)" >&5 case "$ac_scorep_platform (auto detected)" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; esac; } afs_fn_summary "Platform" "$ac_scorep_platform (auto detected)" " " >>config.summary fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform (provided)" >&5 case "$ac_scorep_platform (provided)" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform (provided)${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform (provided)${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform (provided)${as__std}" >&6 ;; esac; } afs_fn_summary "Platform" "$ac_scorep_platform (provided)" " " >>config.summary fi if test "x${ac_scorep_cross_compiling}" = "x"; then : case ${ac_scorep_platform} in #( altix) : ac_scorep_cross_compiling="no" ;; #( bgl) : ac_scorep_cross_compiling="yes" ;; #( bgp) : ac_scorep_cross_compiling="yes" ;; #( bgq) : ac_scorep_cross_compiling="yes" ;; #( crayxt) : ac_scorep_cross_compiling="yes" ;; #( crayxe) : ac_scorep_cross_compiling="yes" ;; #( crayxk) : ac_scorep_cross_compiling="yes" ;; #( crayxc) : ac_scorep_cross_compiling="yes" ;; #( crayunknown) : ac_scorep_cross_compiling="yes" ;; #( k) : ac_scorep_cross_compiling="yes" ;; #( fx10) : ac_scorep_cross_compiling="yes" ;; #( fx100) : ac_scorep_cross_compiling="yes" ;; #( linux) : ac_scorep_cross_compiling="no" ;; #( solaris) : ac_scorep_cross_compiling="no" ;; #( mac) : ac_scorep_cross_compiling="no" ;; #( mic) : ac_scorep_cross_compiling="yes" ;; #( mingw) : ac_scorep_cross_compiling="no" ;; #( aix) : ac_scorep_cross_compiling="no" ;; #( necsx) : ac_scorep_cross_compiling="yes" ;; #( unknown) : ac_scorep_cross_compiling="no" ;; #( *) : as_fn_error $? "provided platform '${ac_scorep_platform}' unknown." "$LINENO" 5 ;; esac afs_fn_summary "Cross compiling" "$ac_scorep_cross_compiling (auto detected)" " " >>config.summary else # honor ac_scorep_cross_compiling from the commandline if test ${ac_scorep_cross_compiling} != "yes" && \ test ${ac_scorep_cross_compiling} != "no" ; then : as_fn_error $? "invalid value '${ac_scorep_cross_compiling}' for provided 'ac_scorep_cross_compiling'" "$LINENO" 5 fi afs_fn_summary "Cross compiling" "$ac_scorep_cross_compiling (provided)" " " >>config.summary fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross compilation" >&5 $as_echo_n "checking for cross compilation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_cross_compiling" >&5 case "$ac_scorep_cross_compiling" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_cross_compiling${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_cross_compiling${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_cross_compiling${as__std}" >&6 ;; esac; } # don't detect and load defaults in nested configures (e.g. otf2) if test "x$ac_scorep_platform_data_provided" = "x" || test "${ac_scorep_platform_data_provided}" = "no"; then : # Check whether --with-custom-compilers was given. if test "${with_custom_compilers+set}" = set; then : withval=$with_custom_compilers; afs_custom_compilers_given="yes" case ${withval} in #( "yes") : if test -f ./platform-backend-user-provided && \ test -f ./platform-frontend-user-provided && \ test -f ./platform-mpi-user-provided && \ test -f ./platform-shmem-user-provided; then : { $as_echo "$as_me:${as_lineno-$LINENO}: info: Using compiler specification from ./platform-*-user-provided files." >&5 $as_echo "$as_me: ${as__blu}info: Using compiler specification from ./platform-*-user-provided files.${as__std}" >&2;} ac_scorep_compilers_backend="./platform-backend-user-provided" ac_scorep_compilers_frontend="./platform-frontend-user-provided" ac_scorep_compilers_mpi="./platform-mpi-user-provided" ac_scorep_compilers_shmem="./platform-shmem-user-provided" else { $as_echo "$as_me:${as_lineno-$LINENO}: info: Using compiler specification from $srcdir/build-config/common/platforms/platform-*-user-provided files." >&5 $as_echo "$as_me: ${as__blu}info: Using compiler specification from $srcdir/build-config/common/platforms/platform-*-user-provided files.${as__std}" >&2;} ac_scorep_compilers_backend="$srcdir/build-config/common/platforms/platform-backend-user-provided" ac_scorep_compilers_frontend="$srcdir/build-config/common/platforms/platform-frontend-user-provided" ac_scorep_compilers_mpi="$srcdir/build-config/common/platforms/platform-mpi-user-provided" ac_scorep_compilers_shmem="$srcdir/build-config/common/platforms/platform-shmem-user-provided" fi ;; #( *) : as_fn_error $? "'${withval}' not supported by --with-custom-compilers." "$LINENO" 5 ;; esac else afs_custom_compilers_given="no" fi if test "x${afs_custom_compilers_given}" = "xno"; then : ac_scorep_compilers_frontend="platform-frontend-${ac_scorep_platform}" ac_scorep_compilers_backend="platform-backend-${ac_scorep_platform}" if test "x${ac_scorep_compiler_suite_called}" != "x"; then # We need m4 quoting magic here ... as_fn_error $? "cannot use AC_SCOREP_WITH_COMPILER_SUITE and AC_SCOREP_WITH_NOCROSS_COMPILER_SUITE in one configure.ac." "$LINENO" 5 else ac_scorep_compiler_suite_called="yes" fi # Check whether --with-compiler-suite was given. if test "${with_compiler_suite+set}" = set; then : withval=$with_compiler_suite; case $withval in #( "gcc") : ac_scorep_compilers_frontend="compiler-nocross-gcc" ;; #( "ibm") : ac_scorep_compilers_frontend="compiler-nocross-ibm" ;; #( "intel") : ac_scorep_compilers_frontend="compiler-nocross-intel" ;; #( "pgi") : ac_scorep_compilers_frontend="compiler-nocross-pgi" ;; #( "studio") : ac_scorep_compilers_frontend="compiler-nocross-studio" ;; #( "clang") : ac_scorep_compilers_frontend="compiler-nocross-clang" ;; #( "no") : as_fn_error $? "option --without-compiler-suite makes no sense." "$LINENO" 5 ;; #( *) : as_fn_error $? "compiler suite \"${withval}\" not supported by --with-compiler-suite." "$LINENO" 5 ;; esac fi if test -f "$srcdir/build-config/platforms/${ac_scorep_compilers_frontend}"; then : ac_scorep_compilers_frontend="$srcdir/build-config/platforms/${ac_scorep_compilers_frontend}" else ac_scorep_compilers_frontend="$srcdir/build-config/common/platforms/${ac_scorep_compilers_frontend}" fi if test -f "$srcdir/build-config/platforms/${ac_scorep_compilers_backend}"; then : ac_scorep_compilers_backend="$srcdir/build-config/platforms/${ac_scorep_compilers_backend}" else ac_scorep_compilers_backend="$srcdir/build-config/common/platforms/${ac_scorep_compilers_backend}" fi fi # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ $ac_scorep_compilers_backend \ $ac_scorep_compilers_frontend \ user_provided_configure_args`" if test $? -ne 0; then : as_fn_error $? "cannot process provided and/or autodetected arguments. Please contact and provide the above output. Thanks." "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: platform data provided by toplevel configure." >&5 $as_echo "$as_me: ${as__blu}info: platform data provided by toplevel configure.${as__std}" >&2;} # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ user_provided_configure_args`" if test $? -ne 0; then : as_fn_error $? "cannot process provided arguments. Please contact and provide the above output. Thanks." "$LINENO" 5 fi fi # Extract the first word of "uncrustify", so it can be a program name with args. set dummy uncrustify; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_scorep_have_uncrustify+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_scorep_have_uncrustify"; then ac_cv_prog_ac_scorep_have_uncrustify="$ac_scorep_have_uncrustify" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_scorep_have_uncrustify="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ac_scorep_have_uncrustify" && ac_cv_prog_ac_scorep_have_uncrustify="no" fi fi ac_scorep_have_uncrustify=$ac_cv_prog_ac_scorep_have_uncrustify if test -n "$ac_scorep_have_uncrustify"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_have_uncrustify" >&5 case "$ac_scorep_have_uncrustify" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_have_uncrustify${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_have_uncrustify${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_have_uncrustify${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${ac_scorep_have_uncrustify}" = "xyes"; then HAVE_UNCRUSTIFY_TRUE= HAVE_UNCRUSTIFY_FALSE='#' else HAVE_UNCRUSTIFY_TRUE='#' HAVE_UNCRUSTIFY_FALSE= fi #if test -z "$have_svnversion"; then # AC_CHECK_PROG([have_svnversion], [svnversion], [yes], [no],,) #fi # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DOXYGEN+:} false; then : $as_echo_n "(cached) " >&6 else case $DOXYGEN in [\\/]* | ?:[\\/]*) ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi DOXYGEN=$ac_cv_path_DOXYGEN if test -n "$DOXYGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 case "$DOXYGEN" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$DOXYGEN${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$DOXYGEN${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$DOXYGEN${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${DOXYGEN}" != "x"; then HAVE_DOXYGEN_TRUE= HAVE_DOXYGEN_FALSE='#' else HAVE_DOXYGEN_TRUE='#' HAVE_DOXYGEN_FALSE= fi have_doxygen_latex="no" if test -z "$HAVE_DOXYGEN_TRUE"; then : # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_dot+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_dot"; then ac_cv_prog_have_dot="$have_dot" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_dot="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_dot" && ac_cv_prog_have_dot="no" fi fi have_dot=$ac_cv_prog_have_dot if test -n "$have_dot"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_dot" >&5 case "$have_dot" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_dot${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_dot${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_dot${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_pdflatex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_pdflatex"; then ac_cv_prog_have_pdflatex="$have_pdflatex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_pdflatex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_pdflatex" && ac_cv_prog_have_pdflatex="no" fi fi have_pdflatex=$ac_cv_prog_have_pdflatex if test -n "$have_pdflatex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pdflatex" >&5 case "$have_pdflatex" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_pdflatex${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_pdflatex${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_pdflatex${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "makeindex", so it can be a program name with args. set dummy makeindex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_makeindex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_makeindex"; then ac_cv_prog_have_makeindex="$have_makeindex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_makeindex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_makeindex" && ac_cv_prog_have_makeindex="no" fi fi have_makeindex=$ac_cv_prog_have_makeindex if test -n "$have_makeindex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_makeindex" >&5 case "$have_makeindex" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_makeindex${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_makeindex${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_makeindex${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${have_pdflatex}" = xyes && test "x${have_makeindex}" = xyes; then have_doxygen_latex="yes" fi fi if test "x${have_doxygen_latex}" = xyes; then HAVE_DOXYGEN_LATEX_TRUE= HAVE_DOXYGEN_LATEX_FALSE='#' else HAVE_DOXYGEN_LATEX_TRUE='#' HAVE_DOXYGEN_LATEX_FALSE= fi # ac_scorep_doxygen_distdir may be passed in from upper level configure # will end up in 'USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc' if test ! -n "$ac_scorep_doxygen_distdir"; then ac_scorep_doxygen_distdir="" fi if test "x${ac_scorep_git_controlled}" = xyes; then : ac_config_files="$ac_config_files doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in" ac_config_files="$ac_config_files doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in" fi ## Autoconf supports changing the names of programs when installing them. In ## order to use these transformations, configure.ac must call the macro ## AC_ARG_PROGRAM. # implicitly called by ? #AC_ARG_PROGRAM # used for EXTRA_DIST in Makefile.am if test "x${ac_scorep_cross_compiling}" = "xyes"; then CROSS_BUILD_TRUE= CROSS_BUILD_FALSE='#' else CROSS_BUILD_TRUE='#' CROSS_BUILD_FALSE= fi # handle own package's subdir configures ax_config_subdir_dir_1="build-frontend" ax_config_subdir_args_1="${args} ac_scorep_platform=${ac_scorep_platform}" ax_config_subdirs="${ax_config_subdirs} build-frontend" #sed is needed for check target { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 case "$ac_cv_path_SED" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_path_SED${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_path_SED${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_path_SED${as__std}" >&6 ;; esac; } SED="$ac_cv_path_SED" rm -f conftest.sed OPARI2_AWK=`which ${AWK}` ac_config_files="$ac_config_files Makefile src/config-common.h:build-config/common/config-common.h" ac_config_files="$ac_config_files test/c_test.sh" ac_config_files="$ac_config_files test/f90_test.sh" ac_config_files="$ac_config_files test/f77_test.sh" ac_config_files="$ac_config_files test/awk_script_test.sh" ac_config_files="$ac_config_files test/awk_script_test.output:test/data/awk_script_test.out.in" ac_config_files="$ac_config_files build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: ${as__yel}WARNING: cache variable $ac_var contains a newline${as__std}" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: updating cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: updating cache $cache_file${as__std}" >&2;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: not updating unwritable cache $cache_file${as__std}" >&2;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${GIT_CONTROLLED_TRUE}" && test -z "${GIT_CONTROLLED_FALSE}"; then as_fn_error $? "conditional \"GIT_CONTROLLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 case "done" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}done${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}done${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}done${as__std}" >&6 ;; esac; } if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_UNCRUSTIFY_TRUE}" && test -z "${HAVE_UNCRUSTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_UNCRUSTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_LATEX_TRUE}" && test -z "${HAVE_DOXYGEN_LATEX_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN_LATEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CROSS_BUILD_TRUE}" && test -z "${CROSS_BUILD_FALSE}"; then as_fn_error $? "conditional \"CROSS_BUILD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: ${as__blu}info: creating $CONFIG_STATUS${as__std}" >&2;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # need to catch these variables, before unsetting them later : ${AS_COLOR:=$CLICOLOR}; export AS_COLOR : ${AS_COLOR_FORCE:=$CLICOLOR_FORCE}; export AS_COLOR_FORCE as__red= as__grn= as__yel= as__blu= as__mag= as__cya= as__gry= as__std= as__color=no if test "X$AS_COLOR_FORCE" = X0; then as__color=no; elif test "X$AS_COLOR_FORCE" = X1; then as__color=yes elif { test "X$TERM" != Xdumb || test "X$AS_COLOR" = X1; } && { test -t 1; } 2>/dev/null; then as__color=yes fi if test $as__color = yes; then as__red='' as__grn='' as__yel='' as__blu='' as__mag='' as__cya='' as__gry='' as__std='' fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: ${as__red}error: $2${as__std}" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by OPARI2 $as_me 2.0.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ OPARI2 config.status 2.0.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "doc/doxygen-user.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in" ;; "doc/doxygen-dev.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/config-common.h") CONFIG_FILES="$CONFIG_FILES src/config-common.h:build-config/common/config-common.h" ;; "test/c_test.sh") CONFIG_FILES="$CONFIG_FILES test/c_test.sh" ;; "test/f90_test.sh") CONFIG_FILES="$CONFIG_FILES test/f90_test.sh" ;; "test/f77_test.sh") CONFIG_FILES="$CONFIG_FILES test/f77_test.sh" ;; "test/awk_script_test.sh") CONFIG_FILES="$CONFIG_FILES test/awk_script_test.sh" ;; "test/awk_script_test.output") CONFIG_FILES="$CONFIG_FILES test/awk_script_test.output:test/data/awk_script_test.out.in" ;; "build-frontend/pomp2-parse-init-regions.awk") CONFIG_FILES="$CONFIG_FILES build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating $ac_file" >&5 $as_echo "$as_me: ${as__blu}info: creating $ac_file${as__std}" >&2;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: ${as__yel}WARNING: $ac_file_inputs seems to ignore the --datarootdir setting${as__std}" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: ${as__yel}WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined${as__std}" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac case $ac_file$ac_mode in "test/c_test.sh":F) chmod +x test/c_test.sh ;; "test/f90_test.sh":F) chmod +x test/f90_test.sh ;; "test/f77_test.sh":F) chmod +x test/f77_test.sh ;; "test/awk_script_test.sh":F) chmod +x test/awk_script_test.sh ;; "build-frontend/pomp2-parse-init-regions.awk":F) \ chmod +x build-frontend/pomp2-parse-init-regions.awk ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # Execute subdir configures defined via AX_CONFIG_SUBDIR. # # Do not complain if ax_config_subdir_dir is missing, so a configure # script can configure whichever parts of a large source tree are # present. if test "x${no_recursion}" != xyes && test "x${ax_config_subdir_dir_1}" != x && test -d "${srcdir}/${ax_config_subdir_dir_1}"; then : ax_fn_config_subdir "${ax_config_subdir_dir_1}" "${ax_config_subdir_args_1}" fi # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: ${as__yel}WARNING: unrecognized options: $ac_unrecognized_opts${as__std}" >&2;} fi opari2-2.0.6/PaxHeaders.6153/Makefile.am0000644000000000000000000000013214015716474014433 xustar0030 mtime=1614257468.215909906 30 atime=1614257468.271910084 30 ctime=1614257497.792004053 opari2-2.0.6/Makefile.am0000644000175100001440000001501714015716474015632 0ustar00builderusers00000000000000## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, 2019-2020, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2014-2015, 2017, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## file Makefile.am ## The SUBDIRS variable holds a list of subdirectories automake (recursivly) ## must build. SUBDIRS = $(subdirs) $(ax_config_subdirs) ## Options passed to aclocal to specify local macro directories. Although ## ACLOCAL_AMFLAGS should be replaced by AC_CONFIG_MACRO_DIRS, aclocal-1.13.4 ## doesn't honor the paths provided to AC_CONFIG_MACRO_DIRS. See ## https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21352 ACLOCAL_AMFLAGS = -I build-config/m4 -I build-config/common/m4 include build-config/common/Makefile.inc.am include doc/Makefile.inc.am include build-config/common/platforms.am ## Still, sometimes there are files that must be distributed, but which are not ## covered in the automatic rules. These files should be listed in the ## EXTRA_DIST variable. You can mention files from subdirectories in EXTRA_DIST. ## ## You can also mention a directory in EXTRA_DIST. In this case the entire ## directory will be recursively copied into the distribution. Please note that ## this will also copy everything in the directory, including CVS/RCS version ## control files. We recommend against using this feature. EXTRA_DIST += $(srcdir)/src/config.h \ $(srcdir)/src/config-custom.h \ $(srcdir)/test/replacePaths_c.awk \ $(srcdir)/test/replacePaths_f77.awk \ $(srcdir)/test/replacePaths_f90.awk \ $(srcdir)/doc/example/openmp/example.c \ $(srcdir)/doc/example/openmp/example.f90 \ $(srcdir)/doc/example/pomp/example.c \ $(srcdir)/doc/example/pomp/example.f90 \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in \ $(srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(srcdir)/test/data \ $(srcdir)/THANKS \ $(srcdir)/OPEN_ISSUES if ! CROSS_BUILD EXTRA_DIST += $(srcdir)/build-frontend/configure.ac \ $(srcdir)/build-frontend/aclocal.m4 \ $(srcdir)/build-frontend/Makefile.am \ $(srcdir)/build-frontend/Makefile.in \ $(srcdir)/build-frontend/configure \ $(srcdir)/src/config-frontend.h.in endif doc_DATA = $(srcdir)/OPEN_ISSUES \ $(srcdir)/ChangeLog CLEANFILES += doc/doxygen-user/main.dox .PHONY: doc/doxygen-user/main.dox if GIT_CONTROLLED doc/doxygen-user/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ doc/doxygen-user/main_user_usage.dox \ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ doc/doxygen-user/main_user_linking.dox \ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ > doc/doxygen-user/main.dox ## The developer documentation is compiled of the user documentation ## and additional information for developers doc/doxygen-dev/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox $(AM_V_GEN)$(MKDIR_P) doc/doxygen-dev && \ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev.dox.in \ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ doc/doxygen-user/main_user_usage.dox \ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ doc/doxygen-user/main_user_linking.dox \ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev_parser.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev_new-paradigm.dox.in \ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ > doc/doxygen-dev/main.dox doc/doxygen-user/main_user_usage.dox: $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ cat $(srcdir)/doc/doxygen-user/main_user_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/main_user_usage-end.dox.in \ > doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox: $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ ( \ cat $(srcdir)/doc/doxygen-user/main_user_linking.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in; \ echo "\endverbatim"; \ ) > doc/doxygen-user/main_user_linking.dox else doc/doxygen-user/main.dox: # touch doc/doxygen-user/main.dox doc/doxygen-dev/main.dox: # touch doc/doxygen-dev/main.dox endif doxygen-dev: doc/doxygen-dev/main.dox $(MKDIR_P) doxygen-dev-doc/opari2/tags $(DOXYGEN) doc/doxygen-dev.cfg dist-hook: doc/doxygen-user/main.dox doxygen-user-generate $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2_usage.h $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2-config_usage.h clean-local: doxygen-user-clean rm -rf test/tmp uninstall-hook: doxygen-uninstall common-uninstall libexec_SCRIPTS = build-frontend/pomp2-parse-init-regions.awk # non-color automake only provides $(am__tty_colors) if tests are in use TESTS = opari2-2.0.6/PaxHeaders.6153/Makefile.in0000644000000000000000000000013214015716500014432 xustar0030 mtime=1614257472.871924725 30 atime=1614257497.512003162 30 ctime=1614257497.788004041 opari2-2.0.6/Makefile.in0000644000175100001440000020766014015716500015640 0ustar00builderusers00000000000000# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ############################################################################### # Create platform entries for EXTRA_DIST using e.g.: # cd build-config/common/platforms # for i in *; do echo " \$(srcdir)/build-config/common/platforms/$i \\"; done VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } DIST_COMMON = $(srcdir)/build-config/common/Makefile.inc.am \ $(srcdir)/doc/Makefile.inc.am \ $(srcdir)/build-config/common/platforms.am \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(top_srcdir)/doc/doxygen-user/doxygen-user.cfg.in \ $(top_srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(top_srcdir)/build-config/common/config-common.h \ $(top_srcdir)/test/c_test.sh.in \ $(top_srcdir)/test/f90_test.sh.in \ $(top_srcdir)/test/f77_test.sh.in \ $(top_srcdir)/test/awk_script_test.sh.in \ $(top_srcdir)/test/data/awk_script_test.out.in \ $(top_srcdir)/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in \ $(top_srcdir)/build-config/test-driver AUTHORS COPYING \ ChangeLog INSTALL README THANKS build-config/config.guess \ build-config/config.sub build-config/install-sh \ build-config/missing $(top_srcdir)/build-config/config.guess \ $(top_srcdir)/build-config/config.sub \ $(top_srcdir)/build-config/install-sh \ $(top_srcdir)/build-config/missing @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@am__append_1 = beautify-recursive @GIT_CONTROLLED_TRUE@am__append_2 = doc/doxygen-project-number.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@am__append_3 = doc/doxygen-user-html.cfg doc/doxygen-user-at-make-time.cfg doxygen.err @CROSS_BUILD_FALSE@am__append_4 = $(srcdir)/build-frontend/configure.ac \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/aclocal.m4 \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/Makefile.am \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/Makefile.in \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/configure \ @CROSS_BUILD_FALSE@ $(srcdir)/src/config-frontend.h.in TESTS = subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/build-config/common/m4/ac_common_package.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_doxygen.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_git_controlled.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_sys_detection.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_toplevel_args.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_uncrustify.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_version_and_revision.m4 \ $(top_srcdir)/build-config/common/m4/afs_compiler_backend.m4 \ $(top_srcdir)/build-config/common/m4/afs_maintainer_mode.m4 \ $(top_srcdir)/build-config/common/m4/afs_summary.m4 \ $(top_srcdir)/build-config/common/m4/ax_config_subdir.m4 \ $(top_srcdir)/build-config/m4/opari2_compiler_and_flags.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = doc/doxygen-user.cfg doc/doxygen-dev.cfg \ src/config-common.h test/c_test.sh test/f90_test.sh \ test/f77_test.sh test/awk_script_test.sh \ test/awk_script_test.output \ build-frontend/pomp2-parse-init-regions.awk CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(docdir)" SCRIPTS = $(libexec_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @$(am__tty_colors); echo " GEN $${mgn}$@$$std"; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = .test am__test_logs1 = $(TESTS:=.log) TEST_LOGS = $(am__test_logs1:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-config/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AFS_PACKAGE_NAME = @AFS_PACKAGE_NAME@ AFS_PACKAGE_name = @AFS_PACKAGE_name@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN = @DOXYGEN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OPARI2_AWK = @OPARI2_AWK@ PACKAGE = @PACKAGE@ PACKAGE_BUGFIX = @PACKAGE_BUGFIX@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_MAJOR = @PACKAGE_MAJOR@ PACKAGE_MINOR = @PACKAGE_MINOR@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_SUFFIX = @PACKAGE_SUFFIX@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_scorep_doxygen_distdir = @ac_scorep_doxygen_distdir@ ac_scorep_have_uncrustify = @ac_scorep_have_uncrustify@ afs_srcdir = @afs_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ ax_config_subdirs = @ax_config_subdirs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ has_CC = @has_CC@ has_cc = @has_cc@ has_ftn = @has_ftn@ have_dot = @have_dot@ have_doxygen_latex = @have_doxygen_latex@ have_makeindex = @have_makeindex@ have_pdflatex = @have_pdflatex@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = $(subdirs) $(ax_config_subdirs) ACLOCAL_AMFLAGS = -I build-config/m4 -I build-config/common/m4 # Testing framework EXTRA_DIST = $(srcdir)/build-config/common/generate-config-backend-for-frontend.sh \ $(srcdir)/build-config/common/generate-library-dependencies.sh \ $(srcdir)/build-config/common/generate-library-dependencies-la-object.hpp \ $(srcdir)/build-config/common/generate-library-version.sh \ $(srcdir)/build-config/common/generate-package-version.sh \ $(srcdir)/common/utils/test/cutest/CuTest.c \ $(srcdir)/common/utils/test/cutest/CuTest.h \ $(srcdir)/common/utils/test/cutest/license.txt \ $(srcdir)/common/utils/test/cutest/README.txt \ $(srcdir)/build-config/common/process_arguments.awk \ $(srcdir)/build-config/common/platforms/compiler-frontend-gcc \ $(srcdir)/build-config/common/platforms/compiler-frontend-ibm \ $(srcdir)/build-config/common/platforms/compiler-frontend-intel \ $(srcdir)/build-config/common/platforms/compiler-frontend-pgi \ $(srcdir)/build-config/common/platforms/compiler-frontend-studio \ $(srcdir)/build-config/common/platforms/compiler-frontend-clang \ $(srcdir)/build-config/common/platforms/compiler-frontend-aocc \ $(srcdir)/build-config/common/platforms/compiler-mpi-bullxmpi \ $(srcdir)/build-config/common/platforms/compiler-mpi-hp \ $(srcdir)/build-config/common/platforms/compiler-mpi-ibmpoe \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-intelpoe \ $(srcdir)/build-config/common/platforms/compiler-mpi-lam \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpibull2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-openmpi \ $(srcdir)/build-config/common/platforms/compiler-mpi-openmpi3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-platform \ $(srcdir)/build-config/common/platforms/compiler-mpi-scali \ $(srcdir)/build-config/common/platforms/compiler-mpi-sgimpt \ $(srcdir)/build-config/common/platforms/compiler-mpi-sgimptwrapper \ $(srcdir)/build-config/common/platforms/compiler-mpi-spectrum \ $(srcdir)/build-config/common/platforms/compiler-mpi-sun \ $(srcdir)/build-config/common/platforms/compiler-mpi-without \ $(srcdir)/build-config/common/platforms/compiler-shmem-openmpi \ $(srcdir)/build-config/common/platforms/compiler-shmem-openmpi3 \ $(srcdir)/build-config/common/platforms/compiler-shmem-openshmem \ $(srcdir)/build-config/common/platforms/compiler-shmem-sgimpt \ $(srcdir)/build-config/common/platforms/compiler-shmem-sgimptwrapper \ $(srcdir)/build-config/common/platforms/compiler-shmem-spectrum \ $(srcdir)/build-config/common/platforms/compiler-shmem-without \ $(srcdir)/build-config/common/platforms/compiler-nocross-gcc \ $(srcdir)/build-config/common/platforms/compiler-nocross-ibm \ $(srcdir)/build-config/common/platforms/compiler-nocross-intel \ $(srcdir)/build-config/common/platforms/compiler-nocross-pgi \ $(srcdir)/build-config/common/platforms/compiler-nocross-studio \ $(srcdir)/build-config/common/platforms/compiler-nocross-clang \ $(srcdir)/build-config/common/platforms/compiler-nocross-aocc \ $(srcdir)/build-config/common/platforms/platform-backend-altix \ $(srcdir)/build-config/common/platforms/platform-backend-bgl \ $(srcdir)/build-config/common/platforms/platform-backend-bgp \ $(srcdir)/build-config/common/platforms/platform-backend-bgq \ $(srcdir)/build-config/common/platforms/platform-backend-crayxt \ $(srcdir)/build-config/common/platforms/platform-backend-crayxe \ $(srcdir)/build-config/common/platforms/platform-backend-crayxk \ $(srcdir)/build-config/common/platforms/platform-backend-crayxc \ $(srcdir)/build-config/common/platforms/platform-backend-crayunknown \ $(srcdir)/build-config/common/platforms/platform-backend-aix \ $(srcdir)/build-config/common/platforms/platform-backend-linux \ $(srcdir)/build-config/common/platforms/platform-backend-mac \ $(srcdir)/build-config/common/platforms/platform-backend-mic \ $(srcdir)/build-config/common/platforms/platform-backend-mingw \ $(srcdir)/build-config/common/platforms/platform-backend-necsx \ $(srcdir)/build-config/common/platforms/platform-backend-solaris \ $(srcdir)/build-config/common/platforms/platform-backend-k \ $(srcdir)/build-config/common/platforms/platform-backend-fx10 \ $(srcdir)/build-config/common/platforms/platform-backend-fx100 \ $(srcdir)/build-config/common/platforms/platform-backend-user-provided \ $(srcdir)/build-config/common/platforms/platform-frontend-altix \ $(srcdir)/build-config/common/platforms/platform-frontend-bgl \ $(srcdir)/build-config/common/platforms/platform-frontend-bgp \ $(srcdir)/build-config/common/platforms/platform-frontend-bgq \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxt \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxe \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxk \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxc \ $(srcdir)/build-config/common/platforms/platform-frontend-crayunknown \ $(srcdir)/build-config/common/platforms/platform-frontend-aix \ $(srcdir)/build-config/common/platforms/platform-frontend-linux \ $(srcdir)/build-config/common/platforms/platform-frontend-mac \ $(srcdir)/build-config/common/platforms/platform-frontend-mic \ $(srcdir)/build-config/common/platforms/platform-frontend-mingw \ $(srcdir)/build-config/common/platforms/platform-frontend-necsx \ $(srcdir)/build-config/common/platforms/platform-frontend-solaris \ $(srcdir)/build-config/common/platforms/platform-frontend-k \ $(srcdir)/build-config/common/platforms/platform-frontend-fx10 \ $(srcdir)/build-config/common/platforms/platform-frontend-fx100 \ $(srcdir)/build-config/common/platforms/platform-frontend-user-provided \ $(srcdir)/build-config/common/platforms/platform-mpi-altix \ $(srcdir)/build-config/common/platforms/platform-mpi-bgl \ $(srcdir)/build-config/common/platforms/platform-mpi-bgp \ $(srcdir)/build-config/common/platforms/platform-mpi-bgq \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxt \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxe \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxk \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxc \ $(srcdir)/build-config/common/platforms/platform-mpi-crayunknown \ $(srcdir)/build-config/common/platforms/platform-mpi-aix \ $(srcdir)/build-config/common/platforms/platform-mpi-linux \ $(srcdir)/build-config/common/platforms/platform-mpi-mac \ $(srcdir)/build-config/common/platforms/platform-mpi-mic \ $(srcdir)/build-config/common/platforms/platform-mpi-necsx \ $(srcdir)/build-config/common/platforms/platform-mpi-solaris \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxk \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxe \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxt \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxc \ $(srcdir)/build-config/common/platforms/platform-shmem-crayunknown \ $(srcdir)/build-config/common/platforms/platform-shmem-user-provided \ $(srcdir)/build-config/common/platforms/platform-mpi-k \ $(srcdir)/build-config/common/platforms/platform-mpi-fx10 \ $(srcdir)/build-config/common/platforms/platform-mpi-fx100 \ $(srcdir)/build-config/common/platforms/platform-mpi-user-provided \ $(srcdir)/src/config.h $(srcdir)/src/config-custom.h \ $(srcdir)/test/replacePaths_c.awk \ $(srcdir)/test/replacePaths_f77.awk \ $(srcdir)/test/replacePaths_f90.awk \ $(srcdir)/doc/example/openmp/example.c \ $(srcdir)/doc/example/openmp/example.f90 \ $(srcdir)/doc/example/pomp/example.c \ $(srcdir)/doc/example/pomp/example.f90 \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in \ $(srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(srcdir)/test/data $(srcdir)/THANKS $(srcdir)/OPEN_ISSUES \ $(am__append_4) BUILT_SOURCES = CLEANFILES = $(am__append_2) $(am__append_3) \ $(builddir)/user_provided_configure_args \ $(builddir)/mpi_compiler_suite \ $(builddir)/mpi_compiler_suite_to_source \ doc/doxygen-user/main.dox DISTCLEANFILES = $(builddir)/config.summary \ $(builddir)/@PACKAGE@.summary CONFIG_STATUS_DEPENDENCIES = $(srcdir)/build-config/VERSION CONFIGURE_DEPENDENCIES = $(srcdir)/build-config/VERSION SCOREP_RECURSIVE_TARGETS = $(am__append_1) check-build-recursive DOC_SRC_DIR = $(srcdir)/doc @GIT_CONTROLLED_TRUE@USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@OPARI2_V_DOXYGEN = $(opari2__v_DOXYGEN_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_ = $(opari2__v_DOXYGEN_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_0 = @$(am__tty_colors); echo " DOXYGEN $${blu}$@$$std"; @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_1 = @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@OPARI2_V_DEVNULL = $(opari2__v_DEVNULL_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_ = $(opari2__v_DEVNULL_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_0 = >/dev/null 2>&1 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_1 = @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@OPARI2_V_pdflatex = $(opari2__v_pdflatex_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_ = $(opari2__v_pdflatex_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_0 = -interaction batchmode @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_1 = -interaction nonstopmode doc_DATA = $(srcdir)/OPEN_ISSUES \ $(srcdir)/ChangeLog libexec_SCRIPTS = build-frontend/pomp2-parse-init-regions.awk all: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .log .test .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/build-config/common/Makefile.inc.am $(srcdir)/doc/Makefile.inc.am $(srcdir)/build-config/common/platforms.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ if $(AM_V_P); then echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; fi; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ if $(AM_V_P); then echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; fi; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ if $(AM_V_P); then echo ' $(SHELL) ./config.status'; fi; \ $(SHELL) ./config.status;; \ *) \ if $(AM_V_P); then echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; fi; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/build-config/common/Makefile.inc.am $(srcdir)/doc/Makefile.inc.am $(srcdir)/build-config/common/platforms.am: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(AM_V_at)$(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_at)$(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(AM_V_at)$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): doc/doxygen-user.cfg: $(top_builddir)/config.status $(top_srcdir)/doc/doxygen-user/doxygen-user.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $@ doc/doxygen-dev.cfg: $(top_builddir)/config.status $(top_srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/config-common.h: $(top_builddir)/config.status $(top_srcdir)/build-config/common/config-common.h cd $(top_builddir) && $(SHELL) ./config.status $@ test/c_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/c_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/f90_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/f90_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/f77_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/f77_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/awk_script_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/awk_script_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/awk_script_test.output: $(top_builddir)/config.status $(top_srcdir)/test/data/awk_script_test.out.in cd $(top_builddir) && $(SHELL) ./config.status $@ build-frontend/pomp2-parse-init-regions.awk: $(top_builddir)/config.status $(top_srcdir)/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libexecSCRIPTS: $(libexec_SCRIPTS) @$(NORMAL_INSTALL) @$(am__tty_colors); \ list='$(libexec_SCRIPTS)'; test -n "$(libexecdir)" || list=; \ if test -n "$$list"; then \ if $(AM_V_P); then echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ else echo " MKDIR $${mgn}$(DESTDIR)$(libexecdir)$$std"; fi; \ $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { for p in $$files; do \ $(am__strip_dir) \ if $(AM_V_P); then echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ else echo " INSTALL $${grn}$(DESTDIR)$(libexecdir)$$dir/$$f$$std"; fi; \ $(INSTALL_SCRIPT) $$p "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ done; } \ ; done uninstall-libexecSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(libexec_SCRIPTS)'; test -n "$(libexecdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(libexecdir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @$(am__tty_colors); \ list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ if $(AM_V_P); then echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ else echo " MKDIR $${mgn}$(DESTDIR)$(docdir)$$std"; fi; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ $(am__strip_dir) \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if $(AM_V_P); then echo " $(INSTALL_DATA) $$d$$p '$(DESTDIR)$(docdir)'"; \ else echo " INSTALL $${blu}$(DESTDIR)$(docdir)/$$f$$std"; fi; \ $(INSTALL_DATA) $$d$$p "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ if $(AM_V_P); then echo "Making $$target in $$subdir"; fi; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) $(AM_V_at)$(am__remove_distdir) $(AM_V_at)test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ if $(AM_V_P); then \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ fi; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -$(AM_V_at)test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz"; \ else echo " DIST $${grn}$(distdir).tar.gz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(AM_V_at)$(am__post_remove_distdir) dist-bzip2: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2"; \ else echo " DIST $${grn}$(distdir).tar.bz2$$std"; fi; \ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(AM_V_at)$(am__post_remove_distdir) dist-lzip: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz"; \ else echo " DIST $${grn}$(distdir).tar.lz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(AM_V_at)$(am__post_remove_distdir) dist-xz: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz"; \ else echo " DIST $${grn}$(distdir).tar.xz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(AM_V_at)$(am__post_remove_distdir) dist-tarZ: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z"; \ else echo " DIST $${grn}$(distdir).tar.Z$$std"; fi; \ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(AM_V_at)$(am__post_remove_distdir) dist-shar: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz"; \ else echo " DIST $${grn}$(distdir).shar.gz$$std"; fi; \ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(AM_V_at)$(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip @$(am__tty_colors); \ if $(AM_V_P); then echo "zip -rq $(distdir).zip '$(distdir)'"; \ else echo " DIST $${grn}$(distdir).zip$$std"; fi; \ zip -rq $(distdir).zip $(distdir) $(AM_V_at)$(am__post_remove_distdir) dist dist-all: $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir=':' $(AM_V_at)$(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(AM_V_at)$(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(AM_V_at)if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-docDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libexecSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-docDATA uninstall-libexecSCRIPTS @$(NORMAL_INSTALL) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-TESTS check-am clean clean-cscope \ clean-generic clean-local cscope cscopelist-am ctags ctags-am \ dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libexecSCRIPTS install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-docDATA uninstall-hook \ uninstall-libexecSCRIPTS common-uninstall: rm -rf $(DESTDIR)$(datadir)/@PACKAGE@ ############################################################################### @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify-sp: @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@ @$(am__cd) $(srcdir) && ./common/beautifier/beautify @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify: beautify-recursive @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify-clean: ############################################################################### ############################################################################### check-build-sp: $(BUILT_SOURCES) all-am $(check_PROGRAMS) $(check_LTLIBRARIES) check-build: check-build-recursive ############################################################################### $(SCOREP_RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-sp"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-sp" || exit 1; \ fi; test -z "$$fail" doxygen-uninstall: rm -rf $(DESTDIR)$(docdir) @GIT_CONTROLLED_TRUE@doxygen-user-install: @GIT_CONTROLLED_TRUE@doxygen-user-generate: doxygen-user-pdf doxygen-user-html-compress copy-revision-file-to-dist @GIT_CONTROLLED_TRUE@update-revision: @GIT_CONTROLLED_TRUE@ @$(am__tty_colors); \ @GIT_CONTROLLED_TRUE@ if $(AM_V_P); then echo "cd $(srcdir) && git describe --always --dirty > 'build-config/REVISION'"; \ @GIT_CONTROLLED_TRUE@ else echo " GEN $${mgn}$(srcdir)/build-config/REVISION$$std"; fi; \ @GIT_CONTROLLED_TRUE@ cd $(srcdir) && git describe --always --dirty > "build-config/REVISION" @GIT_CONTROLLED_TRUE@copy-revision-file-to-dist: @GIT_CONTROLLED_TRUE@ @$(MKDIR_P) "$(distdir)/build-config/" @GIT_CONTROLLED_TRUE@ @cp -p "$(srcdir)/build-config/REVISION" "$(distdir)/build-config/" @GIT_CONTROLLED_TRUE@ @case `cat "$(distdir)/build-config/REVISION"` in *-dirty) \ @GIT_CONTROLLED_TRUE@ echo >&2 "WARNING: distribution does not match a single, unmodified revision.";; \ @GIT_CONTROLLED_TRUE@ esac @GIT_CONTROLLED_TRUE@doxygen-user-html-compress: @GIT_CONTROLLED_TRUE@ $(AM_V_at)if test -d "$(USER_DOC_DIR)/html"; then \ @GIT_CONTROLLED_TRUE@ cd "$(USER_DOC_DIR)"; tar czf html.tar.gz html; rm -rf html/; \ @GIT_CONTROLLED_TRUE@ fi @GIT_CONTROLLED_TRUE@doxygen-project-number: update-revision @GIT_CONTROLLED_TRUE@ $(AM_V_at)echo "PROJECT_NUMBER = \"@PACKAGE_VERSION@ (revision `cat $(srcdir)/build-config/REVISION`)\"" > doc/doxygen-project-number.cfg @GIT_CONTROLLED_TRUE@doxygen-user-clean: @GIT_CONTROLLED_TRUE@ rm -rf $(USER_DOC_DIR)/* @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@doxygen-user: doxygen-project-number doc/doxygen-user/main.dox doc/doxygen-user.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/tags" @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)echo "OUTPUT_DIRECTORY = $(USER_DOC_DIR)" > doc/doxygen-user-at-make-time.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)echo "GENERATE_TAGFILE = $(USER_DOC_DIR)/tags/@PACKAGE@.tag" >> doc/doxygen-user-at-make-time.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)cat doc/doxygen-project-number.cfg doc/doxygen-user-at-make-time.cfg doc/doxygen-user.cfg > doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/html" @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)cp $(abs_srcdir)/doc/images/* $(USER_DOC_DIR)/html @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ else echo "QUIET = YES"; fi >>doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_FALSE@doxygen-user: @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_FALSE@ echo "WARNING: doxygen not available. Cannot generate documentation." >&2 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@doxygen-user-pdf: doxygen-user @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cat doc/doxygen-user-html.cfg > doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "ENABLED_SECTIONS = LATEX" >> doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "GENERATE_HTML = NO" >> doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cp $(DOC_SRC_DIR)/license.tex $(USER_DOC_DIR)/pdf/ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ -$(AM_V_at)cp $(DOC_SRC_DIR)/images/project_logo.pdf $(USER_DOC_DIR)/pdf/ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "LATEX_CMD_NAME = \"pdflatex -file-line-error $(OPARI2_V_pdflatex)\"" >>doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ else echo "QUIET = YES"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ echo "MAKEINDEX_CMD_NAME = \"makeindex -q\""; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ fi >>doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cd "$(USER_DOC_DIR)/pdf" && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ make $(OPARI2_V_DEVNULL) && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ mv refman.pdf ../ && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ rm -f * && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ mv ../refman.pdf @PACKAGE@.pdf @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@doxygen-user-pdf: doxygen-user @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@ echo "WARNING: pdflatex not available. Cannot generate doxygen pdf documentation." >&2 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@ if test -d "$(USER_DOC_DIR)/pdf"; then rm -rf "$(USER_DOC_DIR)/pdf"; fi @GIT_CONTROLLED_FALSE@doxygen-user-clean: @GIT_CONTROLLED_FALSE@doxygen-user-generate: @GIT_CONTROLLED_FALSE@doxygen-user-pdf: @GIT_CONTROLLED_FALSE@doxygen-user-install: @GIT_CONTROLLED_FALSE@ $(AM_V_at)if test -f "$(DOC_SRC_DIR)/html.tar.gz"; then \ @GIT_CONTROLLED_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir); \ @GIT_CONTROLLED_FALSE@ $(INSTALL_DATA) $(DOC_SRC_DIR)/html.tar.gz $(DESTDIR)$(docdir)/html.tar.gz; \ @GIT_CONTROLLED_FALSE@ cd $(DESTDIR)$(docdir); \ @GIT_CONTROLLED_FALSE@ tar xzf html.tar.gz; \ @GIT_CONTROLLED_FALSE@ rm -f html.tar.gz; \ @GIT_CONTROLLED_FALSE@ fi @GIT_CONTROLLED_FALSE@ $(AM_V_at)if test -d "$(DOC_SRC_DIR)"; then \ @GIT_CONTROLLED_FALSE@ cd $(DOC_SRC_DIR); \ @GIT_CONTROLLED_FALSE@ dirs="pdf tags"; \ @GIT_CONTROLLED_FALSE@ cd -; \ @GIT_CONTROLLED_FALSE@ for i in $$dirs; do \ @GIT_CONTROLLED_FALSE@ if test -d "$(DOC_SRC_DIR)/$$i"; then \ @GIT_CONTROLLED_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir)/$$i; \ @GIT_CONTROLLED_FALSE@ cd $(DOC_SRC_DIR)/$$i; \ @GIT_CONTROLLED_FALSE@ files=`find . -type f`; \ @GIT_CONTROLLED_FALSE@ cd -; \ @GIT_CONTROLLED_FALSE@ for j in $$files; do \ @GIT_CONTROLLED_FALSE@ $(INSTALL_DATA) $(DOC_SRC_DIR)/$$i/$$j $(DESTDIR)$(docdir)/$$i/$$j; \ @GIT_CONTROLLED_FALSE@ done; \ @GIT_CONTROLLED_FALSE@ fi; \ @GIT_CONTROLLED_FALSE@ done; \ @GIT_CONTROLLED_FALSE@ fi @GIT_CONTROLLED_FALSE@copy-revision-file-to-dist: ############################################################################### .PHONY: doc/doxygen-user/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_usage.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_linking.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-user/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-dev/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-dev && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_usage.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_linking.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev_parser.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev_new-paradigm.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-dev/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main_user_usage.dox: @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_usage.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_usage-end.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-user/main_user_usage.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main_user_linking.dox: @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ ( \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_linking.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in; \ @GIT_CONTROLLED_TRUE@ echo "\endverbatim"; \ @GIT_CONTROLLED_TRUE@ ) > doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_FALSE@doc/doxygen-user/main.dox: # touch doc/doxygen-user/main.dox @GIT_CONTROLLED_FALSE@doc/doxygen-dev/main.dox: # touch doc/doxygen-dev/main.dox doxygen-dev: doc/doxygen-dev/main.dox $(MKDIR_P) doxygen-dev-doc/opari2/tags $(DOXYGEN) doc/doxygen-dev.cfg dist-hook: doc/doxygen-user/main.dox doxygen-user-generate $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2_usage.h $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2-config_usage.h clean-local: doxygen-user-clean rm -rf test/tmp uninstall-hook: doxygen-uninstall common-uninstall # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: opari2-2.0.6/PaxHeaders.6153/test0000644000000000000000000000013214015716532013274 xustar0030 mtime=1614257498.276005595 30 atime=1614257501.248015057 30 ctime=1614257498.276005595 opari2-2.0.6/test/0000755000175100001440000000000014015716532014544 5ustar00builderusers00000000000000opari2-2.0.6/test/PaxHeaders.6153/jacobi_f77_test.sh.in0000644000000000000000000000013214015716474017270 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.276005595 opari2-2.0.6/test/jacobi_f77_test.sh.in0000644000175100001440000000422714015716474020470 0ustar00builderusers00000000000000#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" F77="@F77@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" FFLAGS="@FFLAGS@" OPENMP="@OPENMP_FFLAGS@" rm -rf $test_dir/jacobi/F77 mkdir -p $test_dir/jacobi/F77 cp -r $test_data_dir/jacobi/F77/jacobi.f $test_dir/jacobi/F77 cp -r $test_data_dir/jacobi/F77/main.f $test_dir/jacobi/F77 cd $test_dir/jacobi/F77 #make instrument $OPARI2 main.f $OPARI2 jacobi.f #make compile $F77 -I$INCDIR $OPENMP $FFLAGS -c jacobi.mod.F $F77 -I$INCDIR $OPENMP $FFLAGS -c main.mod.F #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $F77 $OPENMP $FFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/F77/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.6/test/PaxHeaders.6153/jacobi_f90_test.sh.in0000644000000000000000000000013214015716474017263 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.272005581 opari2-2.0.6/test/jacobi_f90_test.sh.in0000644000175100001440000000466014015716474020464 0ustar00builderusers00000000000000#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" FC="@FC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" FCFLAGS="@FCFLAGS@" OPENMP="@OPENMP_FCFLAGS@" rm -rf $test_dir/jacobi/F mkdir -p $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/jacobi.F90 $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/main.F90 $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/VariableDef.f90 $test_dir/jacobi/F #cp @srcdir@/../src/opari-lib-dummy/pomp_lib.h $test_dir/jacobi/F/ #cp @srcdir@/../src/opari-lib-dummy/opari_omp.h $test_dir/jacobi/F/ cd $test_dir/jacobi/F #make instrument $OPARI2 main.F90 $OPARI2 jacobi.F90 $OPARI2 VariableDef.f90 #make compile $FC -I$INCDIR $OPENMP $FCFLAGS -c VariableDef.mod.F90 $FC -I$INCDIR $OPENMP $FCFLAGS -c jacobi.mod.F90 $FC -I$INCDIR $OPENMP $FCFLAGS -c main.mod.F90 #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $FC $OPENMP $FCFLAGS pomp_init_file.o jacobi.mod.o main.mod.o VariableDef.mod.o $LDFLAGS -o jacobi$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/F/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.6/test/PaxHeaders.6153/jacobi_c++_test.sh.in0000644000000000000000000000013214015716474017235 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.272005581 opari2-2.0.6/test/jacobi_c++_test.sh.in0000644000175100001440000000456014015716474020435 0ustar00builderusers00000000000000#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CXX="@CXX@" CC="@CC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" OPENMP="@OPENMP_CXXFLAGS@" CXXFLAGS="@CXXFLAGS@" rm -rf $test_dir/jacobi/C++ mkdir -p $test_dir/jacobi/C++ mkdir -p $test_dir/jacobi/C++/opari2 cp -r $test_data_dir/jacobi/C++/jacobi.cpp $test_dir/jacobi/C++/ cp -r $test_data_dir/jacobi/C++/jacobi.h $test_dir/jacobi/C++/ cp -r $test_data_dir/jacobi/C++/main.cpp $test_dir/jacobi/C++/ cp @abs_srcdir@/../include/opari2/pomp2_lib.h $test_dir/jacobi/C++/opari2/ cd $test_dir/jacobi/C++ #make instrument $OPARI2 main.cpp $OPARI2 jacobi.cpp #make compile $CXX -I$INCDIR $OPENMP $CXXFLAGS -c main.mod.cpp $CXX -I$INCDIR $OPENMP $CXXFLAGS -c jacobi.mod.cpp #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script` > pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $CXX $OPENMP $CXXFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi.$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi.$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/C++/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.6/test/PaxHeaders.6153/jacobi_c_test.sh.in0000644000000000000000000000013214015716474017107 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.272005581 opari2-2.0.6/test/jacobi_c_test.sh.in0000644000175100001440000000445714015716474020314 0ustar00builderusers00000000000000#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" OPENMP="@OPENMP_CFLAGS@" CFLAGS="@CFLAGS@" NM="`$OPARI2_CONFIG --nm`" rm -rf $test_dir/jacobi/C mkdir -p $test_dir/jacobi/C mkdir -p $test_dir/jacobi/C/opari2 cp -r $test_data_dir/jacobi/C/jacobi.c $test_dir/jacobi/C/ cp -r $test_data_dir/jacobi/C/jacobi.h $test_dir/jacobi/C/ cp -r $test_data_dir/jacobi/C/main.c $test_dir/jacobi/C/ cp @abs_srcdir@/../include/opari2/pomp2_lib.h $test_dir/jacobi/C/opari2 cd $test_dir/jacobi/C # instrument $OPARI2 main.c $OPARI2 jacobi.c # compile $CC -I$INCDIR $OPENMP $CFLAGS -c main.mod.c $CC -I$INCDIR $OPENMP $CFLAGS -c jacobi.mod.c #build $NM jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $CC $OPENMP $CFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi$EXEEXT #run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/C/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.6/test/PaxHeaders.6153/Makefile.inc.am0000644000000000000000000000013114015716474016161 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 29 ctime=1614257498.24000548 opari2-2.0.6/test/Makefile.inc.am0000644000175100001440000000204614015716474017357 0ustar00builderusers00000000000000# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. ## -*- mode: makefile -*- #check_PROGRAMS += TESTS += $(SRC_ROOT)test/c_test.sh TESTS += $(SRC_ROOT)test/f90_test.sh TESTS += $(SRC_ROOT)test/f77_test.sh TESTS += $(SRC_ROOT)test/awk_script_test.sh if HAVE_OPENMP_SUPPORT TESTS += $(SRC_ROOT)test/jacobi_c_test.sh TESTS += $(SRC_ROOT)test/jacobi_c++_test.sh if FORTRAN_SUPPORT_ALLOCATABLE if SCOREP_HAVE_FC TESTS += $(SRC_ROOT)test/jacobi_f90_test.sh endif if SCOREP_HAVE_F77 TESTS += $(SRC_ROOT)test/jacobi_f77_test.sh endif endif endif opari2-2.0.6/test/PaxHeaders.6153/replacePaths_f90.awk0000644000000000000000000000013214015716474017153 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.319910237 30 ctime=1614257498.096005022 opari2-2.0.6/test/replacePaths_f90.awk0000755000175100001440000000504314015716474020353 0ustar00builderusers00000000000000# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ source = $i if(match($i,"\"//&")){ # ^\"")){ # opari2 splits the ctc-string into multiple lines, for # comparison to reference data we put this into one line while(match(source, "\"//&")){ # this is nasty, by getting a new line, we have to reset # the record counter i to 1 so we don't miss the closing # bracket at the end of the last line getline i = 1 sub(" \"", "", $1) source = source $1 sub("\"//&\"", "", source) } #remove full path gsub("escl=([^/]*/)*","escl=",source) gsub("sscl=([^/]*/)*","sscl=",source) #remove old length sub("\"[0-9a-z]*","\"", source) #insert new length sub("\"", "\""length(source)-2, source) line = line " " source } else{ line = line " " $i } } print line } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } # else if(match($0,"get_max_threads")){ #remove timestamp based function specifier # gsub("pomp_get_max_threads[0-9a-z_]*", "pomp_get_max_threads000", $0) # print $0 # } else if(match($0,"/cb")){ #remove timestamp based common block identifier gsub("cb[0-9a-z_]*", "cb000", $0) print $0 } else if(match($0,"LEN=")){ gsub("LEN=[0-9a-z]*", "LEN=999", $0) print $0 } else{ print $0 } } opari2-2.0.6/test/PaxHeaders.6153/replacePaths_f77.awk0000644000000000000000000000013214015716474017160 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.319910237 30 ctime=1614257498.096005022 opari2-2.0.6/test/replacePaths_f77.awk0000755000175100001440000000572114015716474020363 0ustar00builderusers00000000000000# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ source = $i if(match($i,"\"//")){ # opari2 splits the ctc-string into multiple lines, for # comparison to reference data we put this into one line while(match(source, "\"//")){ # this is nasty, by getting a new line, we have to reset # the record counter i to 1 so we don't miss the closing # bracket at the end of the last line getline i = 1 sub(" \"", "", $1) source = source $1 sub("\"//&\"", "", source) } # remove full path gsub("escl=([^/]*/)*","escl=",source) gsub("sscl=([^/]*/)*","sscl=",source) # remove old length sub("\"[0-9a-z]*","\"", source) # insert new length sub("\"", "\""length(source)-2, source) line = line " " source } else{ line = line " " $i } } # now for fortran77 we split the line again while(length(line) > 66){ subline = substr(line, 1, 66) print subline"\"//" line = " &\"" substr(line, 67) } print line # splitindex = match(line,"Type=")+5 # print "splitindex=" splitindex "for " line # lineRepl = substr(line, 0, splintindex-1) "\"//\n &\"" substr(line, splitindex) # line = lineRepl # print lineRepl } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } # else if(match($0,"get_max_threads")){ #remove timestamp based function specifier # gsub("pomp_get_max_threads[0-9a-z_]*", "pomp_get_max_threads000", $0) # print $0 # } else if(match($0,"/cb")){ #remove timestamp based common block identifier gsub("cb[0-9a-z_]*", "cb000", $0) print $0 } else if(match($0,"CHARACTER*")){ gsub("CHARACTER\\*[0-9a-z]*", "CHARACTER*999", $0) print $0 } else{ print $0 } } opari2-2.0.6/test/PaxHeaders.6153/replacePaths_c.awk0000644000000000000000000000013214015716474016777 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.319910237 30 ctime=1614257498.096005022 opari2-2.0.6/test/replacePaths_c.awk0000755000175100001440000000303514015716474020176 0ustar00builderusers00000000000000# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ if(match($i,"^\"")){ #remove full path gsub("escl=([^/]*/)*","escl=",$i) gsub("sscl=([^/]*/)*","sscl=",$i) #remove old length sub("\"[0-9a-z]*","\"", $i) #insert new length sub("\"", "\""length($i)-1, $i) } line = line " " $i } print line } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } else if(match($0,"#include") && match($0,"opari.inc")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } else{ print $0 } } opari2-2.0.6/test/PaxHeaders.6153/awk_script_test.sh.in0000644000000000000000000000013214015716474017524 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257497.840004207 opari2-2.0.6/test/awk_script_test.sh.in0000644000175100001440000000100214015716474020710 0ustar00builderusers00000000000000#!/bin/sh set -e test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data AWK_SCRIPT="@abs_builddir@/../build-frontend/pomp2-parse-init-regions.awk" $AWK_SCRIPT < $test_data_dir/awk_script_test.input > $test_dir/awk_script.out if diff $test_dir/../awk_script_test.output $test_dir/awk_script.out > /dev/null then true else echo "-------- ERROR: in awk script output --------" diff $test_dir/../awk_script_test.output $test_dir/awk_script.out cd $opari_dir exit fi opari2-2.0.6/test/PaxHeaders.6153/f77_test.sh.in0000644000000000000000000000013214015716474015761 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257497.836004193 opari2-2.0.6/test/f77_test.sh.in0000755000175100001440000000605714015716474017167 0ustar00builderusers00000000000000#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ cp $test_data_dir/test*.f $test_dir/ if [ ! -f $test_dir/replacePaths_f77.awk ]; then cp $test_data_dir/../replacePaths_f77.awk $test_dir/ fi cd $test_dir for file in test*.f do base=`basename $file .f` if [ -n "`echo $file | grep free`" ] then echo " $file ..." $opari_dir/opari2 --free-form $file || exit bases=$base elif [ -n "`echo $file | grep disable`" ] then for disable_construct in atomic critical flush locks master ordered single sync task all do echo " $file testing --disable=omp:"$disable_construct" ..." $opari_dir/opari2 --disable=omp:$disable_construct $file $base.$disable_construct.mod.F || exit mv $base.f.opari.inc $base.$disable_construct.f.opari.inc bases=$bases" "$base.$disable_construct done echo " $file testing --disable=omp ..." $opari_dir/opari2 --disable=omp $file $base.omp.mod.F || exit mv $base.f.opari.inc $base.omp.f.opari.inc bases=$bases" "$base.omp elif [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file $base.mod.F || exit bases=$bases" "$base else echo " $file ..." $opari_dir/opari2 $file || exit bases=$base fi for base in $bases do # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_f77.awk $base.mod.F > $base.mod.F.tmp` `mv $base.mod.F.tmp $base.mod.F` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_f77.awk $base.f.opari.inc > $base.f.opari.inc.tmp` `mv $base.f.opari.inc.tmp $base.f.opari.inc` if diff -u $test_data_dir/$base.f.out $base.mod.F > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.f.out $base.mod.F error="true" continue fi if diff -u $test_data_dir/$base.f.opari.inc.out $base.f.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.f.opari.inc.out $base.f.opari.inc error="true" continue fi done done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.6/test/PaxHeaders.6153/f90_test.sh.in0000644000000000000000000000013214015716474015754 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257497.836004193 opari2-2.0.6/test/f90_test.sh.in0000755000175100001440000000434114015716474017154 0ustar00builderusers00000000000000#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ cp $test_data_dir/test*.f90 $test_dir/ if [ ! -f $test_dir/replacePaths_f90.awk ]; then cp $test_data_dir/../replacePaths_f90.awk $test_dir/ fi cd $test_dir for file in test*.f90 do base=`basename $file .f90` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file $base.mod.F90 || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_f90.awk $base.mod.F90 > $base.mod.F90.tmp` `mv $base.mod.F90.tmp $base.mod.F90` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_f90.awk $base.f90.opari.inc > $base.f90.opari.inc.tmp` `mv $base.f90.opari.inc.tmp $base.f90.opari.inc` if diff -u $test_data_dir/$base.f90.out $base.mod.F90 > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.f90.out $base.mod.F90 error="true" continue fi if diff -u $test_data_dir/$base.f90.opari.inc.out $base.f90.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.f90.opari.inc.out $base.f90.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.6/test/PaxHeaders.6153/c_test.sh.in0000644000000000000000000000013214015716474015600 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257497.832004181 opari2-2.0.6/test/c_test.sh.in0000644000175100001440000000474114015716474017001 0ustar00builderusers00000000000000#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ #echo $test_data_dir #echo $test_dir cp $test_data_dir/test*.c $test_dir/ if [ ! -f $test_dir/replacePaths_c.awk ]; then cp $test_data_dir/../replacePaths_c.awk $test_dir/ fi cd $test_dir for file in `ls *.c | grep -v mod` do base=`basename $file .c` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file || exit elif [ -n "`echo $file | grep prep`" ] then echo " $file testing --preprocessed ..." $opari_dir/opari2 --preprocessed $file || exit elif [ -n "`echo $file | grep remove-task`" ] then echo " $file testing --omp-task=remove ..." $opari_dir/opari2 --omp-task=remove --omp-task-untied=no-warn $file || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_c.awk $base.mod.c > $base.mod.c.tmp` `mv $base.mod.c.tmp $base.mod.c` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_c.awk $base.c.opari.inc > $base.c.opari.inc.tmp` `mv $base.c.opari.inc.tmp $base.c.opari.inc` if diff -u $test_data_dir/$base.c.out $base.mod.c > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.c.out $base.mod.c error="true" continue fi if diff -u $test_data_dir/$base.c.opari.inc.out $base.c.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.c.opari.inc.out $base.c.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.6/test/PaxHeaders.6153/data0000644000000000000000000000013214015716474014212 xustar0030 mtime=1614257468.263910058 30 atime=1614257501.248015057 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/0000755000175100001440000000000014015716474015462 5ustar00builderusers00000000000000opari2-2.0.6/test/data/PaxHeaders.6153/test9.f90.out0000644000000000000000000000013214015716474016465 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test9.f90.out0000644000175100001440000000050614015716474017661 0ustar00builderusers00000000000000 #line 1 "test9.f90" PROGRAM PROGRAM include 'test9.f90.opari.inc' #line 3 "test9.f90" CALL SUBROUTINE END PROGRAM SUBROUTINE SUBROUTINE include 'test9.f90.opari.inc' #line 9 "test9.f90" CHARACTER(len=32), PARAMETER :: FUNCTION = 'Check whether OPARI2 is broken' PRINT*, FUNCTION END SUBROUTINE opari2-2.0.6/test/data/PaxHeaders.6153/test9.f90.opari.inc.out0000644000000000000000000000013214015716474020346 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test9.f90.opari.inc.out0000644000175100001440000000021114015716474021533 0ustar00builderusers00000000000000 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock opari2-2.0.6/test/data/PaxHeaders.6153/test9.f900000644000000000000000000000013214015716474015657 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test9.f900000644000175100001440000000030114015716474017044 0ustar00builderusers00000000000000PROGRAM PROGRAM CALL SUBROUTINE END PROGRAM SUBROUTINE SUBROUTINE CHARACTER(len=32), PARAMETER :: FUNCTION = 'Check whether OPARI2 is broken' PRINT*, FUNCTION END SUBROUTINE opari2-2.0.6/test/data/PaxHeaders.6153/test9.c.out0000644000000000000000000000013214015716474016311 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test9.c.out0000644000175100001440000001154714015716474017514 0ustar00builderusers00000000000000#include "test9.c.opari.inc" #line 1 "test9.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * @brief Tests proper treatment of offload regions. */ __declspec( target( mic ) ) int global_1 = 5; __declspec( target( mic ) ) int bar(); __declspec( target( mic ) ) int foo() { int i = 0; #pragma omp parallel { i++; } return ++global_1; } __attribute__( ( target( mic ) ) ) int global_2 = 0; __attribute__( ( target( mic ) ) ) int f() { int i = 0; { POMP2_Atomic_enter( &opari2_region_1, opari2_ctc_1 ); #line 35 "test9.c" #pragma omp atomic global_2 += 1; POMP2_Atomic_exit( &opari2_region_1 ); } #line 37 "test9.c" } __attribute__( ( target( mic ) ) ) void g(); #pragma offload_attribute( push, target( mic ) ) void test(); #pragma offload_attribute( pop ) void test() { int i; { POMP2_Sections_enter( &opari2_region_2, opari2_ctc_2 ); #line 51 "test9.c" #pragma omp sections nowait { i++; #line 54 "test9.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 55 "test9.c" i++; POMP2_Section_end( &opari2_region_2 ); } #line 56 "test9.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 57 "test9.c" i++; POMP2_Section_end( &opari2_region_2 ); } #line 58 "test9.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_2 ); } #line 59 "test9.c" } int main( int argc, char** argv ) { int i, j, k; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 67 "test9.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); { POMP2_For_enter( &opari2_region_3, opari2_ctc_3 ); #line 67 "test9.c" #pragma omp for nowait for ( i = 0; i < 10; i++ ) { j++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_For_exit( &opari2_region_3 ); } POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 72 "test9.c" #pragma offload target( mic ) in( global ) out( i, global ) { i = foo(); #pragma omp for for ( j = 0; j < 10; j++ ) { k ++; } } #pragma offload target( mic ) in( global ) out( i, global ) { i = bar(); } #pragma offload_attribute( push, target( mic ) ) { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 90 "test9.c" #pragma omp parallel POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #line 91 "test9.c" { i = f(); g(); test(); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 96 "test9.c" #pragma offload_attribute( pop ) { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_5, &pomp2_old_task, opari2_ctc_5 ); #line 100 "test9.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_5, pomp2_old_task ); } #line 101 "test9.c" printf( "Hello world!\n" ); return 0; } int bar() { { POMP2_Single_enter( &opari2_region_6, opari2_ctc_6 ); #line 109 "test9.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_6 ); #line 110 "test9.c" global_1++; POMP2_Single_end( &opari2_region_6 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_6 ); } #line 111 "test9.c" return global_1; } void g() { #line 117 "test9.c" #pragma omp master { POMP2_Master_begin( &opari2_region_7, opari2_ctc_7 ); #line 118 "test9.c" global_2 = 0; POMP2_Master_end( &opari2_region_7 ); } #line 119 "test9.c" } opari2-2.0.6/test/data/PaxHeaders.6153/test9.c.opari.inc.out0000644000000000000000000000013214015716474020172 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test9.c.opari.inc.out0000644000175100001440000000313714015716474021371 0ustar00builderusers00000000000000#include static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "59*regionType=atomic*sscl=test9.c:35:35*escl=test9.c:36:36**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "75*regionType=sections*sscl=test9.c:51:51*escl=test9.c:58:58*numSections=2**" #define POMP2_DLIST_00003 shared(opari2_region_3) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "64*regionType=parallelfor*sscl=test9.c:67:67*escl=test9.c:71:71**" #define POMP2_DLIST_00004 shared(opari2_region_4) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "61*regionType=parallel*sscl=test9.c:90:90*escl=test9.c:95:95**" static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "64*regionType=barrier*sscl=test9.c:100:100*escl=test9.c:100:100**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "63*regionType=single*sscl=test9.c:109:109*escl=test9.c:110:110**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "63*regionType=master*sscl=test9.c:117:117*escl=test9.c:118:118**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test9.c0000644000000000000000000000013214015716474015503 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test9.c0000644000175100001440000000324414015716474016701 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * @brief Tests proper treatment of offload regions. */ __declspec( target( mic ) ) int global_1 = 5; __declspec( target( mic ) ) int bar(); __declspec( target( mic ) ) int foo() { int i = 0; #pragma omp parallel { i++; } return ++global_1; } __attribute__( ( target( mic ) ) ) int global_2 = 0; __attribute__( ( target( mic ) ) ) int f() { int i = 0; #pragma omp atomic global_2 += 1; } __attribute__( ( target( mic ) ) ) void g(); #pragma offload_attribute( push, target( mic ) ) void test(); #pragma offload_attribute( pop ) void test() { int i; #pragma omp sections { i++; #pragma omp section i++; #pragma omp section i++; } } int main( int argc, char** argv ) { int i, j, k; #pragma omp parallel for for ( i = 0; i < 10; i++ ) { j++; } #pragma offload target( mic ) in( global ) out( i, global ) { i = foo(); #pragma omp for for ( j = 0; j < 10; j++ ) { k ++; } } #pragma offload target( mic ) in( global ) out( i, global ) { i = bar(); } #pragma offload_attribute( push, target( mic ) ) #pragma omp parallel { i = f(); g(); test(); } #pragma offload_attribute( pop ) #pragma omp barrier printf( "Hello world!\n" ); return 0; } int bar() { #pragma omp single global_1++; return global_1; } void g() { #pragma omp master global_2 = 0; } opari2-2.0.6/test/data/PaxHeaders.6153/test8.f90.out0000644000000000000000000000013214015716474016464 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.f90.out0000644000175100001440000002407714015716474017671 0ustar00builderusers00000000000000 #line 1 "test8.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 include 'test8.f90.opari.inc' #line 20 "test8.f90" integer i integer k integer num_threads integer, save :: j #line 25 "test8.f90" !$omp threadprivate(j) pomp2_num_threads = 4 pomp2_if = ( k.eq.0 ) call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 27 "test8.f90" !$omp parallel reduction(+:k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 28 "test8.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 30 "test8.f90" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 35 "test8.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 36 "test8.f90" call POMP2_Sections_enter(opari2_region_3, & opari2_ctc_3 ) #line 37 "test8.f90" !$omp sections reduction(+:k) #line 38 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 39 "test8.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_3) #line 40 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 41 "test8.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_3) #line 42 "test8.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Sections_exit(opari2_region_3) #line 43 "test8.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 44 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 45 "test8.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 46 "test8.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 47 "test8.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Untied_task_create_begin(opari2_region_5, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_5 ) end if #line 47 "test8.f90" !$omp task untied if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Untied_task_begin(opari2_region_5, pomp2_new_task) end if #line 48 "test8.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Untied_task_end(opari2_region_5) end if #line 49 "test8.f90" !$omp end task if (pomp2_if) then call POMP2_Untied_task_create_end(opari2_region_5, pomp2_old_task) end if #line 50 "test8.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 50 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 51 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_6,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_6 ) #line 52 "test8.f90" !$omp parallel reduction(+:k) default(private) shared(i,k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) & !$omp shared(/cb000/) & !$omp private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) call POMP2_Do_enter(opari2_region_6, & opari2_ctc_6 ) #line 52 "test8.f90" !$omp do schedule(static,chunkif) collapse(1) ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_7, & opari2_ctc_7 ) #line 54 "test8.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test8.f90" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_7) #line 56 "test8.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test8.f90" k = k + 1 enddo #line 59 "test8.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, pomp2_old_task) call POMP2_Do_exit(opari2_region_6) call POMP2_Parallel_end(opari2_region_6) #line 59 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, pomp2_old_task) #line 60 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( (i+k)>5 ) call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 61 "test8.f90" !$omp parallel reduction(+:k) default(none) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) & !$omp shared(/cb000/) & !$omp private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Sections_enter(opari2_region_8) #line 61 "test8.f90" !$omp sections #line 62 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_8, & opari2_ctc_8 ) #line 63 "test8.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_8) #line 64 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_8, & opari2_ctc_8 ) #line 65 "test8.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_8) #line 66 "test8.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Sections_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 66 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 67 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 68 "test8.f90" !$omp parallel reduction(+:k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Workshare_enter(opari2_region_9, & opari2_ctc_9 ) #line 68 "test8.f90" !$omp workshare write(*,*) "workshare" #line 70 "test8.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 70 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 71 "test8.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 72 "test8.f90" !$omp parallel shared(num_threads) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 73 "test8.f90" write(*,*) num_threads call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 74 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 75 "test8.f90" end program test8 subroutine POMP2_Init_reg_000() include 'test8.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test8.f90.opari.inc.out0000644000000000000000000000013214015716474020345 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.f90.opari.inc.out0000644000175100001440000000530514015716474021543 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "104*regionType=parallel*sscl=test8.f90:27:27*escl=test8.f90:44:44*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "109*regionType=do*sscl=test8.f90:30:30*escl=test8.f90:35:35*hasCollapse=1*hasReduction=1*hasSchedule=dynamic,5**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "93*regionType=sections*sscl=test8.f90:37:37*escl=test8.f90:42:42*numSections=2*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test8.f90:46:46*escl=test8.f90:50:50**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "72*regionType=task*sscl=test8.f90:47:47*escl=test8.f90:49:49*hasUntied=1**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "191*regionType=paralleldo*sscl=test8.f90:52:52*escl=test8.f90:59:59*hasCollapse=1*hasDefault=private*hasIf=1*hasNum_threads=1*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif*hasShared=1**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "63*regionType=ordered*sscl=test8.f90:54:54*escl=test8.f90:56:56**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "128*regionType=parallelsections*sscl=test8.f90:61:61*escl=test8.f90:66:66*hasDefault=none*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "113*regionType=parallelworkshare*sscl=test8.f90:68:68*escl=test8.f90:70:70*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "76*regionType=parallel*sscl=test8.f90:72:72*escl=test8.f90:74:74*hasShared=1**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test8.f900000644000000000000000000000013214015716474015656 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.f900000644000175100001440000000364714015716474017063 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 integer i integer k integer num_threads integer, save :: j !$omp threadprivate(j) !$omp parallel if(k.eq.0) num_threads(4) reduction(+:k) write(*,*) "parallel" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp sections reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp end parallel !$omp parallel !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel !$omp parallel do num_threads(4) reduction(+:k) schedule(static,chunkif) collapse(1) ordered if(.true.) default(private) shared(i,k) do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered k = k + 1 enddo !$omp end parallel do !$omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) default(none) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end parallel sections !$omp parallel workshare if(.true.) num_threads(4) reduction(+:k) write(*,*) "workshare" !$omp end parallel workshare !$omp parallel shared(num_threads) write(*,*) num_threads !$omp end parallel end program test8 opari2-2.0.6/test/data/PaxHeaders.6153/test8.f.out0000644000000000000000000000013214015716474016313 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.f.out0000644000175100001440000002204714015716474017513 0ustar00builderusers00000000000000 #line 1 "test8.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 include 'test8.f.opari.inc' #line 20 "test8.f" integer i integer k integer, save :: j #line 24 "test8.f" !$omp threadprivate(j) pomp2_num_threads = 4 pomp2_if = ( k.eq.0 ) call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test8.f" !$omp parallel reduction(+:k) !$omp& default(private) shared(i,k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) !$omp& shared(/cb000/) !$omp& private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 28 "test8.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 30 "test8.f" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 35 "test8.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 36 "test8.f" call POMP2_Sections_enter(opari2_region_3, &opari2_ctc_3 ) #line 37 "test8.f" !$omp sections reduction(+:k) #line 38 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 39 "test8.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_3) #line 40 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 41 "test8.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_3) #line 42 "test8.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_3) #line 43 "test8.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 44 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 45 "test8.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 46 "test8.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 47 "test8.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_5, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_5 ) end if #line 47 "test8.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_5, pomp2_new_task) end if #line 48 "test8.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_5) end if #line 49 "test8.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_5, &pomp2_old_task) end if #line 50 "test8.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 50 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 51 "test8.f" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_6, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_6 ) #line 52 "test8.f" !$omp parallel reduction(+:k) !$omp+ default(none) shared(i,k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) !$omp& shared(/cb000/) !$omp& private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test8.f" !$omp do !$omp+ schedule(static,chunkif) collapse(1) ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 56 "test8.f" !$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 57 "test8.f" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_7) #line 58 "test8.f" !$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 59 "test8.f" k = k + 1 enddo #line 61 "test8.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) call POMP2_Parallel_end(opari2_region_6) #line 61 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, &pomp2_old_task) #line 62 "test8.f" pomp2_num_threads = 4 pomp2_if = ( (i+k)>5 ) call POMP2_Parallel_fork(opari2_region_8, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_8 ) #line 63 "test8.f" !$omp parallel reduction(+:k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Sections_enter(opari2_region_8) #line 63 "test8.f" !$omp sections #line 64 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_8, &opari2_ctc_8 ) #line 65 "test8.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_8) #line 66 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_8, &opari2_ctc_8 ) #line 67 "test8.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_8) #line 68 "test8.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 68 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, &pomp2_old_task) #line 69 "test8.f" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_9, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_9 ) #line 70 "test8.f" !$omp parallel reduction(+:k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Workshare_enter(opari2_region_9, &opari2_ctc_9 ) #line 70 "test8.f" !$omp workshare write(*,*) "workshare" #line 72 "test8.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_9, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 72 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, &pomp2_old_task) #line 73 "test8.f" end program test2 subroutine POMP2_Init_reg_000() include 'test8.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test8.f.opari.inc.out0000644000000000000000000000013214015716474020174 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.f.opari.inc.out0000644000175100001440000000476514015716474021403 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"133*regionType=parallel*sscl=test8.f:26:27*escl=test8.f:44:"// &"44*hasDefault=private*hasIf=1*hasNum_threads=1*hasReduction"// &"=1*hasShared=1**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"107*regionType=do*sscl=test8.f:30:30*escl=test8.f:35:35*has"// &"Collapse=1*hasReduction=1*hasSchedule=dynamic,5**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"91*regionType=sections*sscl=test8.f:37:37*escl=test8.f:42:4"// &"2*numSections=2*hasReduction=1**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test8.f:46:46*escl=test8.f:50:5"// &"0**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"70*regionType=task*sscl=test8.f:47:47*escl=test8.f:49:49*ha"// &"sUntied=1**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"186*regionType=paralleldo*sscl=test8.f:52:54*escl=test8.f:6"// &"1:61*hasCollapse=1*hasDefault=none*hasIf=1*hasNum_threads=1"// &"*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif*has"// &"Shared=1**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"61*regionType=ordered*sscl=test8.f:56:56*escl=test8.f:58:58"// &"**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"110*regionType=parallelsections*sscl=test8.f:63:63*escl=tes"// &"t8.f:68:68*hasIf=1*hasNum_threads=1*hasReduction=1**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"111*regionType=parallelworkshare*sscl=test8.f:70:70*escl=te"// &"st8.f:72:72*hasIf=1*hasNum_threads=1*hasReduction=1**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test8.f0000644000000000000000000000013214015716474015505 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.f0000644000175100001440000000357614015716474016713 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel if(k.eq.0) num_threads(4) reduction(+:k) !$omp& default(private) shared(i,k) write(*,*) "parallel" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp sections reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp end parallel !$omp parallel !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel !$omp parallel do num_threads(4) reduction(+:k) !$omp+ schedule(static,chunkif) collapse(1) ordered if(.true.) !$omp+ default(none) shared(i,k) do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered k = k + 1 enddo !$omp end parallel do !$omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end parallel sections !$omp parallel workshare if(.true.) num_threads(4) reduction(+:k) write(*,*) "workshare" !$omp end parallel workshare end program test2 opari2-2.0.6/test/data/PaxHeaders.6153/test8.c.out0000644000000000000000000000013214015716474016310 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.c.out0000644000175100001440000001754014015716474017512 0ustar00builderusers00000000000000#include "test8.c.opari.inc" #line 1 "test8.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests whether specific clauses are found and inserted into the CTC string. */ #include #ifdef _OPENMP #endif int j; #line 27 "test8.c" #pragma omp threadprivate(j) int main() { int i = 5; int k = 0; { int pomp2_num_threads = 4; int pomp2_if = (int)( k==0 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 35 "test8.c" #pragma omp parallel reduction(+:k) POMP2_DLIST_00001 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 36 "test8.c" { printf( "parallel\n" ); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 39 "test8.c" #pragma omp for reduction(+:k) schedule(dynamic, 5 ) collapse(1) nowait for ( i = 0; i < 4; ++i ) { printf( "for %d\n", i ); k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 45 "test8.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 46 "test8.c" #pragma omp sections reduction(+:k) nowait { #line 48 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 49 "test8.c" printf( "section 1\n" ); POMP2_Section_end( &opari2_region_3 ); } #line 50 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 51 "test8.c" { printf( "section 2\n" ); } POMP2_Section_end( &opari2_region_3 ); } #line 53 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_3 ); } #line 54 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test8.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 56 "test8.c" #pragma omp parallel default(private) POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #line 57 "test8.c" { { int pomp2_if = (int)( true ); { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Untied_task_create_begin( &opari2_region_5, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_5 ); #line 58 "test8.c" #pragma omp task untied POMP2_DLIST_00005 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Untied_task_begin( &opari2_region_5, pomp2_new_task ); #line 59 "test8.c" { printf( "task\n" ); } if (pomp2_if) POMP2_Untied_task_end( &opari2_region_5 ); } if (pomp2_if) POMP2_Untied_task_create_end( &opari2_region_5, pomp2_old_task ); } } #line 62 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 63 "test8.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_6, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_6 ); #line 64 "test8.c" #pragma omp parallel shared(num_threads) POMP2_DLIST_00006 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_6 ); #line 65 "test8.c" { printf("num_threads variable is %d\n",num_threads); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_6 ); } POMP2_Parallel_join( &opari2_region_6, pomp2_old_task ); } #line 68 "test8.c" } { int pomp2_num_threads = 4; int pomp2_if = (int)( 1 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_7, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_7 ); #line 70 "test8.c" #pragma omp parallel reduction(+:k) default(none) POMP2_DLIST_00007 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_7 ); { POMP2_For_enter( &opari2_region_7, opari2_ctc_7 ); #line 70 "test8.c" #pragma omp for schedule(static,chunkif) collapse(1) ordered nowait for ( i = 0; i < 4; ++i ) { { POMP2_Ordered_enter( &opari2_region_8, opari2_ctc_8 ); #line 73 "test8.c" #pragma omp ordered { POMP2_Ordered_begin( &opari2_region_8 ); #line 74 "test8.c" printf( "for %d\n", i ); POMP2_Ordered_end( &opari2_region_8 ); } POMP2_Ordered_exit( &opari2_region_8 ); } #line 75 "test8.c" k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_For_exit( &opari2_region_7 ); } POMP2_Parallel_end( &opari2_region_7 ); } POMP2_Parallel_join( &opari2_region_7, pomp2_old_task ); } #line 78 "test8.c" { int pomp2_num_threads = 4; int pomp2_if = (int)( (i+k)>5 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_9, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_9 ); #line 79 "test8.c" #pragma omp parallel reduction(+:k) POMP2_DLIST_00009 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_9 ); { POMP2_Sections_enter( &opari2_region_9, opari2_ctc_9 ); #line 79 "test8.c" #pragma omp sections nowait { #line 81 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_9, opari2_ctc_9 ); #line 82 "test8.c" printf( "section 1\n" ); POMP2_Section_end( &opari2_region_9 ); } #line 83 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_9, opari2_ctc_9 ); #line 84 "test8.c" { printf( "section 2\n" ); } POMP2_Section_end( &opari2_region_9 ); } #line 86 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_9, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_9, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_9 ); } POMP2_Parallel_end( &opari2_region_9 ); } POMP2_Parallel_join( &opari2_region_9, pomp2_old_task ); } #line 87 "test8.c" opari2-2.0.6/test/data/PaxHeaders.6153/test8.c.opari.inc.out0000644000000000000000000000013214015716474020171 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.c.opari.inc.out0000644000175100001440000000505114015716474021365 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "101*regionType=parallel*sscl=test8.c:35:35*escl=test8.c:54:54*hasIf=1*hasNum_threads=1*hasReduction=1**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "107*regionType=for*sscl=test8.c:39:39*escl=test8.c:44:44*hasCollapse=1*hasReduction=1*hasSchedule=dynamic,5**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "90*regionType=sections*sscl=test8.c:46:46*escl=test8.c:53:53*numSections=2*hasReduction=1**" #define POMP2_DLIST_00004 shared(opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "80*regionType=parallel*sscl=test8.c:56:56*escl=test8.c:62:62*hasDefault=private**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "77*regionType=task*sscl=test8.c:58:58*escl=test8.c:61:61*hasIf=1*hasUntied=1**" #define POMP2_DLIST_00006 shared(opari2_region_6) static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "73*regionType=parallel*sscl=test8.c:64:64*escl=test8.c:67:67*hasShared=1**" #define POMP2_DLIST_00007 shared(opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "174*regionType=parallelfor*sscl=test8.c:70:70*escl=test8.c:77:77*hasCollapse=1*hasDefault=none*hasIf=1*hasNum_threads=1*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "60*regionType=ordered*sscl=test8.c:73:73*escl=test8.c:74:74**" #define POMP2_DLIST_00009 shared(opari2_region_9) static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "109*regionType=parallelsections*sscl=test8.c:79:79*escl=test8.c:86:86*hasIf=1*hasNum_threads=1*hasReduction=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test8.c0000644000000000000000000000013214015716474015502 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test8.c0000644000175100001440000000365214015716474016703 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests whether specific clauses are found and inserted into the CTC string. */ #include #ifdef _OPENMP #include #endif int j; #pragma omp threadprivate(j) int main() { int i = 5; int k = 0; #pragma omp parallel if(k==0) num_threads(4) reduction(+:k) { printf( "parallel\n" ); #pragma omp for reduction(+:k) schedule(dynamic, 5 ) collapse(1) for ( i = 0; i < 4; ++i ) { printf( "for %d\n", i ); k++; } #pragma omp sections reduction(+:k) { #pragma omp section printf( "section 1\n" ); #pragma omp section { printf( "section 2\n" ); } } } #pragma omp parallel default(private) { #pragma omp task if(true) untied { printf( "task\n" ); } } #pragma omp parallel shared(num_threads) { printf("num_threads variable is %d\n",num_threads); } } #pragma omp parallel for num_threads(4) reduction(+:k) schedule(static,chunkif) collapse(1) ordered if(1) default(none) for ( i = 0; i < 4; ++i ) { #pragma omp ordered printf( "for %d\n", i ); k++; } #pragma omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) { #pragma omp section printf( "section 1\n" ); #pragma omp section { printf( "section 2\n" ); } } opari2-2.0.6/test/data/PaxHeaders.6153/test7.f90.out0000644000000000000000000000013214015716474016463 xustar0030 mtime=1614257468.263910058 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.f90.out0000644000175100001440000001066414015716474017665 0ustar00builderusers00000000000000 #line 1 "test7.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives. program test7 include 'test7.f90.opari.inc' #line 20 "test7.f90" call POMP2_Init() #line 21 "test7.f90" call POMP2_Off() #line 23 "test7.f90" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 25 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 26 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) #line 27 "test7.f90" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Parallel_end(opari2_region_2) #line 28 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 29 "test7.f90" call POMP2_End(opari2_region_1) #line 31 "test7.f90" call POMP2_On() #line 33 "test7.f90" #line 35 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 35 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 36 "test7.f90" !$omp do do i = 1,2 write(*,*) i end do !$omp end do call POMP2_Parallel_end(opari2_region_3) !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 42 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 43 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp do do i = 1,2 write(*,*) i end do #line 47 "test7.f90" !$omp end do call POMP2_Parallel_end(opari2_region_4) #line 47 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 48 "test7.f90" #line 49 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_5 ) #line 50 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 51 "test7.f90" i = 3 call POMP2_Implicit_barrier_enter(opari2_region_5,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 52 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, pomp2_old_task) #line 53 "test7.f90" call POMP2_Finalize() #line 55 "test7.f90" end program test7 subroutine POMP2_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) end subroutine POMP2_USER_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test7.f90.opari.inc.out0000644000000000000000000000013214015716474020344 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.f90.opari.inc.out0000644000175100001440000000250514015716474021541 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "85*regionType=userRegion*sscl=test7.f90:24:24*escl=test7.f90:30:30*userRegionName=foo**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "64*regionType=parallel*sscl=test7.f90:26:26*escl=test7.f90:28:28**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "64*regionType=parallel*sscl=test7.f90:35:35*escl=test7.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "66*regionType=paralleldo*sscl=test7.f90:43:43*escl=test7.f90:47:47**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "64*regionType=parallel*sscl=test7.f90:50:50*escl=test7.f90:52:52**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test7.f900000644000000000000000000000013214015716474015655 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.f900000644000175100001440000000220114015716474017043 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives. program test7 !$POMP INST INIT !$POMP INST OFF !$POMP INST BEGIN(foo) !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$POMP INST END(foo) !$POMP INST ON !$POMP NOINSTRUMENT !$OMP PARALLEL !$OMP DO do i = 1,2 write(*,*) i end do !$OMP END DO !$OMP END PARALLEL !$OMP PARALLEL DO do i = 1,2 write(*,*) i end do !$OMP end PARALLEL DO !$POMP INSTRUMENT !$OMP PARALLEL i = 3 !$OMP end PARALLEL !$POMP INST FINALIZE end program test7 opari2-2.0.6/test/data/PaxHeaders.6153/test7.f.out0000644000000000000000000000013214015716474016312 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.f.out0000644000175100001440000001065414015716474017513 0ustar00builderusers00000000000000 #line 1 "test7.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives and selective instrumentation. program test7 include 'test7.f.opari.inc' #line 20 "test7.f" call POMP2_Init() #line 21 "test7.f" call POMP2_Off() #line 23 "test7.f" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 25 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_2 ) #line 26 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) #line 27 "test7.f" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_2) #line 28 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, &pomp2_old_task) #line 29 "test7.f" call POMP2_End(opari2_region_1) #line 31 "test7.f" call POMP2_On() #line 33 "test7.f" #line 35 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 35 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 36 "test7.f" !$omp do do i = 1,2 write(*,*) i end do !$omp end do call POMP2_Parallel_end(opari2_region_3) !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 42 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 43 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp do do i = 1,2 write(*,*) i end do #line 47 "test7.f" !$omp end do call POMP2_Parallel_end(opari2_region_4) #line 47 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 48 "test7.f" #line 49 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_5 ) #line 50 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 51 "test7.f" i = 3 call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 52 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, &pomp2_old_task) #line 53 "test7.f" call POMP2_Finalize() #line 55 "test7.f" end program test7 subroutine POMP2_Init_reg_000() include 'test7.f.opari.inc' call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) end subroutine POMP2_USER_Init_reg_000() include 'test7.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test7.f.opari.inc.out0000644000000000000000000000013214015716474020173 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.f.opari.inc.out0000644000175100001440000000243514015716474021372 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"83*regionType=userRegion*sscl=test7.f:24:24*escl=test7.f:30"// &":30*userRegionName=foo**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"62*regionType=parallel*sscl=test7.f:26:26*escl=test7.f:28:2"// &"8**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"62*regionType=parallel*sscl=test7.f:35:35*escl=test7.f:41:4"// &"1**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"64*regionType=paralleldo*sscl=test7.f:43:43*escl=test7.f:47"// &":47**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"62*regionType=parallel*sscl=test7.f:50:50*escl=test7.f:52:5"// &"2**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test7.f0000644000000000000000000000013214015716474015504 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.f0000644000175100001440000000225014015716474016676 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives and selective instrumentation. program test7 C$POMP INST INIT *$POMP INST OFF !$POMP INST BEGIN(foo) !$OMP PARALLEL i = 1 !$OMP end PARALLEL CPOMP$ INST END(foo) *POMP$ INST ON !POMP$ NOINSTRUMENT !$OMP PARALLEL !$OMP DO do i = 1,2 write(*,*) i end do !$OMP END DO !$OMP END PARALLEL !$OMP PARALLEL DO do i = 1,2 write(*,*) i end do !$OMP END PARALLEL DO !$POMP INSTRUMENT !$OMP PARALLEL i = 3 !$OMP end PARALLEL !$POMP INST FINALIZE end program test7 opari2-2.0.6/test/data/PaxHeaders.6153/test7.c.out0000644000000000000000000000013214015716474016307 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.c.out0000644000175100001440000001206514015716474017506 0ustar00builderusers00000000000000#include "test7.c.opari.inc" #line 1 "test7.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests user instrumentation directives and selective instrumentation. */ int main() { int i; int b = 1; POMP2_Init(); #line 40 "test7.c" POMP2_Off(); #line 42 "test7.c" POMP2_Begin(&opari2_region_1, opari2_ctc_1); #line 44 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 45 "test7.c" #pragma omp parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 46 "test7.c" i = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 47 "test7.c" POMP2_On(); #line 49 "test7.c" #line 51 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 51 "test7.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); #line 52 "test7.c" #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 55 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 56 "test7.c" #pragma omp parallel POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 59 "test7.c" #line 60 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_5, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_5 ); #line 61 "test7.c" #pragma omp parallel POMP2_DLIST_00005 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_5 ); #line 62 "test7.c" i = 3; { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_5 ); } POMP2_Parallel_join( &opari2_region_5, pomp2_old_task ); } #line 63 "test7.c" if (b) { POMP2_End(&opari2_region_1); #line 66 "test7.c" return 0; } { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_6, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_6 ); #line 69 "test7.c" #pragma omp parallel POMP2_DLIST_00006 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_6 ); #line 70 "test7.c" { POMP2_Begin(&opari2_region_7, opari2_ctc_7); #line 72 "test7.c" i = 4; { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_8, &pomp2_old_task, opari2_ctc_8 ); #line 73 "test7.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_8, pomp2_old_task ); } #line 74 "test7.c" i = 5; POMP2_End(&opari2_region_7); #line 76 "test7.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_6 ); } POMP2_Parallel_join( &opari2_region_6, pomp2_old_task ); } #line 77 "test7.c" if (b) { POMP2_End(&opari2_region_1); #line 80 "test7.c" return 0; } POMP2_End(&opari2_region_1); #line 84 "test7.c" POMP2_Finalize(); #line 86 "test7.c" return 0; } opari2-2.0.6/test/data/PaxHeaders.6153/test7.c.opari.inc.out0000644000000000000000000000013214015716474020170 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.c.opari.inc.out0000644000175100001440000000416114015716474021365 0ustar00builderusers00000000000000#include #include static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "82*regionType=userRegion*sscl=test7.c:43:43*escl=test7.c:83:83*userRegionName=foo**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "61*regionType=parallel*sscl=test7.c:45:45*escl=test7.c:46:46**" #define POMP2_DLIST_00003 shared(opari2_region_3) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "61*regionType=parallel*sscl=test7.c:51:51*escl=test7.c:54:54**" #define POMP2_DLIST_00004 shared(opari2_region_4) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "64*regionType=parallelfor*sscl=test7.c:56:56*escl=test7.c:58:58**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "61*regionType=parallel*sscl=test7.c:61:61*escl=test7.c:62:62**" #define POMP2_DLIST_00006 shared(opari2_region_6,opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "61*regionType=parallel*sscl=test7.c:69:69*escl=test7.c:76:76**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "85*regionType=userRegion*sscl=test7.c:71:71*escl=test7.c:75:75*userRegionName=phase1**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "60*regionType=barrier*sscl=test7.c:73:73*escl=test7.c:73:73**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); } #ifdef __cplusplus extern "C" #endif void POMP2_USER_Init_reg_000() { POMP2_USER_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_USER_Assign_handle( &opari2_region_7, opari2_ctc_7 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test7.c0000644000000000000000000000013214015716474015501 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test7.c0000644000175100001440000000320214015716474016671 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests user instrumentation directives and selective instrumentation. */ int main() { int i; int b = 1; #pragma pomp inst init #pragma pomp inst off #pragma pomp inst begin(foo) #pragma omp parallel i = 1; #pragma pomp inst on #pragma pomp noinstrument #pragma omp parallel #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; #pragma omp parallel for for ( i = 0; i < 2; ++i) b = b + i; #pragma pomp instrument #pragma omp parallel i = 3; if (b) { #pragma pomp inst altend(foo) return 0; } #pragma omp parallel { #pragma pomp inst begin(phase1) i = 4; #pragma omp barrier i = 5; #pragma pomp inst end(phase1) } if (b) { #pragma pomp inst altend(foo) return 0; } #pragma pomp inst end(foo) #pragma pomp inst finalize return 0; } opari2-2.0.6/test/data/PaxHeaders.6153/test6.f90.out0000644000000000000000000000013214015716474016462 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.f90.out0000644000175100001440000000523514015716474017662 0ustar00builderusers00000000000000 #line 1 "test6.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 use omp_lib include 'test6.f90.opari.inc' #line 23 "test6.f90" integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call POMP2_Init_lock(lock1); call POMP2_Init_nest_lock(lock2) call POMP2_Set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call POMP2_Set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call POMP2_Unset_lock(lock1); !omp_unset_lock(lock1); call POMP2_Unset_nest_lock(lock2) !$ mod = POMP2_Test_lock(lock1) !$ mod = POMP2_Test_nest_lock(lock2) mod = POMP2_Test_lock(lock1) mod = POMP2_Test_nest_lock(lock2) call POMP2_Destroy_lock(lock1) call POMP2_Destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", "omp_init_lock(i)""", """", """""""", & "omp_init_lock(i) ",& ! ",& " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) !$C99 call omp_init_lock(i) !$DOMP call omp_init_lock(i) end program test6 opari2-2.0.6/test/data/PaxHeaders.6153/test6.f90.opari.inc.out0000644000000000000000000000013214015716474020343 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.f90.opari.inc.out0000644000175100001440000000021114015716474021530 0ustar00builderusers00000000000000 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock opari2-2.0.6/test/data/PaxHeaders.6153/test6.f900000644000000000000000000000013214015716474015654 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.f900000644000175100001440000000506714015716474017057 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 use omp_lib integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call omp_init_lock(lock1); call omp_init_nest_lock(lock2) call omp_set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call omp_set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call omp_unset_lock(lock1); !omp_unset_lock(lock1); call omp_unset_nest_lock(lock2) !$ mod = omp_test_lock(lock1) !$ mod = omp_test_nest_lock(lock2) !P$ mod = omp_test_lock(lock1) !P$ mod = omp_test_nest_lock(lock2) call omp_destroy_lock(lock1) call omp_destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", "omp_init_lock(i)""", """", """""""", & "omp_init_lock(i) ",& ! ",& " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) !$C99 call omp_init_lock(i) !$DOMP call omp_init_lock(i) end program test6 opari2-2.0.6/test/data/PaxHeaders.6153/test6.f.out0000644000000000000000000000013214015716474016311 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.f.out0000644000175100001440000000607114015716474017510 0ustar00builderusers00000000000000 #line 1 "test6.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 include 'omp_lib.h' include 'test6.f.opari.inc' #line 22 "test6.f" integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call POMP2_Init_lock(lock1); call POMP2_Init_nest_lock(lock2) call POMP2_Set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call POMP2_Set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call POMP2_Unset_lock(lock1); !omp_unset_lock(lock1); call POMP2_Unset_nest_lock(lock2) !$ mod = POMP2_Test_lock(lock1) *$ mod = POMP2_Test_nest_lock(lock2) mod = POMP2_Test_lock(lock1) mod = POMP2_Test_nest_lock(lock2) call POMP2_Destroy_lock(lock1) call POMP2_Destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) c call omp_init_lock(i) * call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", &"omp_init_lock(i)""", """", """""""","omp_init_lock(i) ", ! ",& & " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) end program test6 ! Simulation of included header file, nothing should be replaced #line 1 omp_lib.h call omp_init_lock(lock1) call omp_init_nest_lock(lock2) call omp_set_lock(lock1) call omp_set_nest_lock(lock2) call omp_unset_lock(lock1) call omp_unset_nest_lock(lock2) opari2-2.0.6/test/data/PaxHeaders.6153/test6.f.opari.inc.out0000644000000000000000000000013214015716474020172 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.f.opari.inc.out0000644000175100001440000000015614015716474021367 0ustar00builderusers00000000000000 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock opari2-2.0.6/test/data/PaxHeaders.6153/test6.f0000644000000000000000000000013214015716474015503 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.f0000644000175100001440000000576414015716474016712 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 include 'omp_lib.h' integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call omp_init_lock(lock1); call omp_init_nest_lock(lock2) call omp_set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call omp_set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call omp_unset_lock(lock1); !omp_unset_lock(lock1); call omp_unset_nest_lock(lock2) !$ mod = omp_test_lock(lock1) *$ mod = omp_test_nest_lock(lock2) !P$ mod = omp_test_lock(lock1) cP$ mod = omp_test_nest_lock(lock2) call omp_destroy_lock(lock1) call omp_destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) c call omp_init_lock(i) * call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", &"omp_init_lock(i)""", """", """""""","omp_init_lock(i) ", ! ",& & " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) end program test6 ! Simulation of included header file, nothing should be replaced #line 1 /some/path/to/include/file/omp_lib.h call omp_init_lock(lock1) call omp_init_nest_lock(lock2) call omp_set_lock(lock1) call omp_set_nest_lock(lock2) call omp_unset_lock(lock1) call omp_unset_nest_lock(lock2) opari2-2.0.6/test/data/PaxHeaders.6153/test6.c.out0000644000000000000000000000013214015716474016306 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.c.out0000644000175100001440000000600014015716474017475 0ustar00builderusers00000000000000#include "test6.c.opari.inc" #line 1 "test6.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. */ int main() { omp_lock_t lock1; omp_nest_lock_t lock2; omp_sched_t sched; int mod; //************************************************** //* Should be replaced by wrapper functions * //* regardless of "distractions" * //************************************************** POMP2_Init_lock(&lock1); POMP2_Init_nest_lock(&lock2); POMP2_Set_lock(&lock1); POMP2_Set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); POMP2_Unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ POMP2_Unset_nest_lock(&lock2); POMP2_Test_lock(&lock1);/* omp_test_lock(&lock1); */ POMP2_Test_nest_lock(&lock2); POMP2_Destroy_lock(&lock1); POMP2_Destroy_nest_lock(&lock2); //************************************************** //* Not now, but planned for the future! * //************************************************** omp_set_num_threads(4); omp_set_dynamic(0); omp_set_schedule(omp_sched_static, 1); omp_set_nested(0); omp_set_max_active_levels(2); //************************************************** //* No replacement beyond this point! * //************************************************** omp_get_num_threads(); omp_get_max_threads(); omp_get_thread_num(); omp_get_num_procs(); omp_in_parallel(); omp_get_nested(); omp_get_dynamic(); omp_get_schedule(&sched, &mod); omp_get_thread_limit(); omp_get_max_active_levels(); omp_get_level(); omp_get_ancestor_thread_num(0); omp_get_team_size(0); omp_get_active_level(); omp_get_wtime(); omp_get_wtick(); // omp_init_lock(i) /* -- omp_init_lock(i) -- */ /* -- omp_init_lock(i) -- */ printf("omp_init_lock(i) \n"); // omp_init_lock(i) printf("omp_init_lock(i)\"test\"omp_init_lock(i)omp_init_lock(i)\"\"\"\n"); } /* Simulate preincluded definitions. Nothing beyond this point should be replaced */ #line 1 "omp.h" omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); opari2-2.0.6/test/data/PaxHeaders.6153/test6.c.opari.inc.out0000644000000000000000000000013214015716474020167 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.c.opari.inc.out0000644000175100001440000000003714015716474021362 0ustar00builderusers00000000000000#include opari2-2.0.6/test/data/PaxHeaders.6153/test6.c0000644000000000000000000000013214015716474015500 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test6.c0000644000175100001440000000576214015716474016705 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. */ #include int main() { omp_lock_t lock1; omp_nest_lock_t lock2; omp_sched_t sched; int mod; //************************************************** //* Should be replaced by wrapper functions * //* regardless of "distractions" * //************************************************** omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); //************************************************** //* Not now, but planned for the future! * //************************************************** omp_set_num_threads(4); omp_set_dynamic(0); omp_set_schedule(omp_sched_static, 1); omp_set_nested(0); omp_set_max_active_levels(2); //************************************************** //* No replacement beyond this point! * //************************************************** omp_get_num_threads(); omp_get_max_threads(); omp_get_thread_num(); omp_get_num_procs(); omp_in_parallel(); omp_get_nested(); omp_get_dynamic(); omp_get_schedule(&sched, &mod); omp_get_thread_limit(); omp_get_max_active_levels(); omp_get_level(); omp_get_ancestor_thread_num(0); omp_get_team_size(0); omp_get_active_level(); omp_get_wtime(); omp_get_wtick(); // omp_init_lock(i) /* -- omp_init_lock(i) -- */ /* -- omp_init_lock(i) -- */ printf("omp_init_lock(i) \n"); // omp_init_lock(i) printf("omp_init_lock(i)\"test\"omp_init_lock(i)omp_init_lock(i)\"\"\"\n"); } /* Simulate preincluded definitions. Nothing beyond this point should be replaced */ #line 1 "/some/path/to/presumed/include/file/omp.h" omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); opari2-2.0.6/test/data/PaxHeaders.6153/test5.f90.out0000644000000000000000000000013214015716474016461 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.f90.out0000644000175100001440000001223614015716474017660 0ustar00builderusers00000000000000 #line 1 "test5.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 include 'test5.f90.opari.inc' #line 20 "test5.f90" integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t #line 25 "test5.f90" !$omp threadprivate(t) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 28 "test5.f90" !$omp parallel & !$omp & private(i,j) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) call POMP2_Do_enter(opari2_region_1, & opari2_ctc_1 ) #line 28 "test5.f90" !$omp do & !$omp & lastprivate(k) & !$omp & lastprivate & !$omp & ( & !$omp & l & !$omp & ) schedule(dynamic & !$omp & ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do #line 41 "test5.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Do_exit(opari2_region_1) call POMP2_Parallel_end(opari2_region_1) #line 41 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 42 "test5.f90" if(k .gt. 0) l = .true. pomp2_num_threads = 2 pomp2_if = ( l ) call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 44 "test5.f90" !$omp parallel default(shared) & !$omp &firstprivate(j) copyin(t) reduction(+:l) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) call POMP2_Sections_enter(opari2_region_2) #line 44 "test5.f90" !$omp sections & !$omp & lastprivate(i) #line 46 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 47 "test5.f90" write(*,*) "section1" call POMP2_Section_end(opari2_region_2) #line 48 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 49 "test5.f90" write(*,*) "section2" call POMP2_Section_end(opari2_region_2) #line 50 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 51 "test5.f90" write(*,*) "section3" call POMP2_Section_end(opari2_region_2) #line 52 "test5.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Sections_exit(opari2_region_2) call POMP2_Parallel_end(opari2_region_2) #line 52 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 53 "test5.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 54 "test5.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Workshare_enter(opari2_region_3, & opari2_ctc_3 ) #line 54 "test5.f90" !$omp workshare AA = BB BB = CC #line 57 "test5.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 57 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 58 "test5.f90" end program test5 subroutine POMP2_Init_reg_000() include 'test5.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test5.f90.opari.inc.out0000644000000000000000000000013214015716474020342 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.f90.opari.inc.out0000644000175100001440000000173214015716474021540 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "86*regionType=paralleldo*sscl=test5.f90:28:36*escl=test5.f90:41:41*hasSchedule=dynamic**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "112*regionType=parallelsections*sscl=test5.f90:44:45*escl=test5.f90:52:52*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "73*regionType=parallelworkshare*sscl=test5.f90:54:54*escl=test5.f90:57:57**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test5.f900000644000000000000000000000013214015716474015653 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.f900000644000175100001440000000317514015716474017054 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t !$omp threadprivate(t) !$omp parallel & !parallel !$omp & do & !do !$omp & lastprivate(k) & !comment !$omp & private(i,j), & !schedule !$omp & lastprivate & !$omp & ( & !$omp & l & !comment inside argument !$omp & ), schedule(dynamic & !$omp & ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do !$omp end parallel do if(k .gt. 0) l = .true. !$omp parallel sections if(l) num_threads(2) default(shared) & !$omp &firstprivate(j) lastprivate(i) copyin(t) reduction(+:l) !$omp section write(*,*) "section1" !$omp section write(*,*) "section2" !$omp section write(*,*) "section3" !$omp end parallel sections !$omp parallel workshare AA = BB BB = CC !$omp end parallel workshare end program test5 opari2-2.0.6/test/data/PaxHeaders.6153/test5.f.out0000644000000000000000000000013214015716474016310 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.f.out0000644000175100001440000001173114015716474017506 0ustar00builderusers00000000000000 #line 1 "test5.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 include 'test5.f.opari.inc' #line 20 "test5.f" integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t #line 25 "test5.f" !$omp threadprivate(t) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 28 "test5.f" !$omp parallel !$omp+ private(i,j) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) call POMP2_Do_enter(opari2_region_1, &opari2_ctc_1 ) #line 28 "test5.f" !$omp do !$omp+ lastprivate(k) !$omp+ lastprivate !$omp+ ( !$omp+ l !$omp+ ) schedule(dynamic !$omp+ ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do #line 41 "test5.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Do_exit(opari2_region_1) call POMP2_Parallel_end(opari2_region_1) #line 41 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 42 "test5.f" if(k .gt. 0) l = .true. pomp2_num_threads = 2 pomp2_if = ( l ) call POMP2_Parallel_fork(opari2_region_2, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_2 ) #line 44 "test5.f" !$omp parallel default(shared) !$omp+ firstprivate(j) copyin(t) reduction(+:l) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) call POMP2_Sections_enter(opari2_region_2) #line 44 "test5.f" !$omp sections !$omp+ lastprivate(i) #line 46 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 47 "test5.f" write(*,*) "section1" call POMP2_Section_end(opari2_region_2) #line 48 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 49 "test5.f" write(*,*) "section2" call POMP2_Section_end(opari2_region_2) #line 50 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 51 "test5.f" write(*,*) "section3" call POMP2_Section_end(opari2_region_2) #line 52 "test5.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_2) call POMP2_Parallel_end(opari2_region_2) #line 52 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, &pomp2_old_task) #line 53 "test5.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 54 "test5.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Workshare_enter(opari2_region_3, &opari2_ctc_3 ) #line 54 "test5.f" !$omp workshare AA = BB BB = CC #line 57 "test5.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 57 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 58 "test5.f" end program test5 subroutine POMP2_Init_reg_000() include 'test5.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test5.f.opari.inc.out0000644000000000000000000000013214015716474020171 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.f.opari.inc.out0000644000175100001440000000165414015716474021372 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"84*regionType=paralleldo*sscl=test5.f:28:36*escl=test5.f:41"// &":41*hasSchedule=dynamic**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"110*regionType=parallelsections*sscl=test5.f:44:45*escl=tes"// &"t5.f:52:52*hasIf=1*hasNum_threads=1*hasReduction=1**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"71*regionType=parallelworkshare*sscl=test5.f:54:54*escl=tes"// &"t5.f:57:57**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test5.f0000644000000000000000000000013214015716474015502 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.f0000644000175100001440000000276214015716474016704 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t !$omp threadprivate(t) !$omp parallel !$omp+ do !$omp+ lastprivate(k) !$omp+ private(i,j), !$omp+ lastprivate !$omp+ ( !$omp+ l !random comment !$omp+ ), schedule(dynamic !$omp+ ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do !$omp end parallel do if(k .gt. 0) l = .true. !$omp parallel sections if(l) num_threads(2) default(shared) !$omp+ firstprivate(j) lastprivate(i) copyin(t) reduction(+:l) !$omp section write(*,*) "section1" !$omp section write(*,*) "section2" !$omp section write(*,*) "section3" !$omp end parallel sections !$omp parallel workshare AA = BB BB = CC !$omp end parallel workshare end program test5 opari2-2.0.6/test/data/PaxHeaders.6153/test5.c.out0000644000000000000000000000013214015716474016305 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.c.out0000644000175100001440000000741614015716474017510 0ustar00builderusers00000000000000#include "test5.c.opari.inc" #line 1 "test5.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the splitting of combined parallel clauses. */ #include int t; #line 24 "test5.c" #pragma omp threadprivate(t) int main() { int i, j, k, l; l=0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 30 "test5.c" #pragma omp parallel \ private(i,j) \ POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); { POMP2_For_enter( &opari2_region_1, opari2_ctc_1 ); #line 30 "test5.c" #pragma omp \ for \ lastprivate(k) \ lastprivate \ ( \ l \ ) schedule(dynamic \ ) nowait for(i=0; i<4;++i) { printf("parallel for %d\n", i); k+=i; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_For_exit( &opari2_region_1 ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 43 "test5.c" { int pomp2_num_threads = 2; int pomp2_if = (int)( k ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 44 "test5.c" #pragma omp parallel firstprivate(j) default(shared) copyin(t) reduction(+:l) POMP2_DLIST_00002 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); { POMP2_Sections_enter( &opari2_region_2, opari2_ctc_2 ); #line 44 "test5.c" #pragma omp sections lastprivate(i) nowait { #line 46 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 47 "test5.c" { printf("Section 1\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 50 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 51 "test5.c" { printf("Section 2\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 54 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 55 "test5.c" { printf("Section 3\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 58 "test5.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_2 ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 59 "test5.c" } opari2-2.0.6/test/data/PaxHeaders.6153/test5.c.opari.inc.out0000644000000000000000000000013214015716474020166 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.c.opari.inc.out0000644000175100001440000000124414015716474021362 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "84*regionType=parallelfor*sscl=test5.c:30:38*escl=test5.c:42:42*hasSchedule=dynamic**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "109*regionType=parallelsections*sscl=test5.c:44:44*escl=test5.c:58:58*hasIf=1*hasNum_threads=1*hasReduction=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test5.c0000644000000000000000000000013214015716474015477 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test5.c0000644000175100001440000000277514015716474016705 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the splitting of combined parallel clauses. */ #include int t; #pragma omp threadprivate(t) int main() { int i, j, k, l; l=0; #pragma omp parallel /* parallel */ \ for /* for */ \ lastprivate(k) /* for */ \ private(i,j), /* parallel */ \ lastprivate /* for */ \ ( /* for */ \ l /* for */ \ ), schedule(dynamic /* for */ \ ) for(i=0; i<4;++i) { printf("parallel for %d\n", i); k+=i; } #pragma omp parallel sections if(k) num_threads(2) lastprivate(i) firstprivate(j) default(shared) copyin(t) reduction(+:l) { #pragma omp section { printf("Section 1\n"); } #pragma omp section { printf("Section 2\n"); } #pragma omp section { printf("Section 3\n"); } } } opari2-2.0.6/test/data/PaxHeaders.6153/test4.remove-task.c.out0000644000000000000000000000013214015716474020540 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.remove-task.c.out0000644000175100001440000000573214015716474021742 0ustar00builderusers00000000000000#include "test4.remove-task.c.opari.inc" #line 1 "test4.remove-task.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #endif int main() { int i; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 29 "test4.remove-task.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 30 "test4.remove-task.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 32 "test4.remove-task.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } POMP2_For_exit( &opari2_region_2 ); } #line 36 "test4.remove-task.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 37 "test4.remove-task.c" #pragma omp sections nowait { #line 39 "test4.remove-task.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 40 "test4.remove-task.c" printf("section nowait 1\n"); POMP2_Section_end( &opari2_region_3 ); } #line 41 "test4.remove-task.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 42 "test4.remove-task.c" { printf("section nowait 2\n"); } POMP2_Section_end( &opari2_region_3 ); } #line 43 "test4.remove-task.c" } POMP2_Sections_exit( &opari2_region_3 ); } #line 44 "test4.remove-task.c" { POMP2_Single_enter( &opari2_region_4, opari2_ctc_4 ); #line 45 "test4.remove-task.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_4 ); #line 46 "test4.remove-task.c" { printf("single nowait\n"); } POMP2_Single_end( &opari2_region_4 ); } POMP2_Single_exit( &opari2_region_4 ); } #line 49 "test4.remove-task.c" //!!! Removed task directive due to user option "--task=remove"! #line 51 "test4.remove-task.c" { printf("task untied\n"); } #line 54 "test4.remove-task.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test4.remove-task.c" } opari2-2.0.6/test/data/PaxHeaders.6153/test4.remove-task.c.opari.inc.out0000644000000000000000000000013214015716474022421 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.remove-task.c.opari.inc.out0000644000175100001440000000264314015716474023621 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "85*regionType=parallel*sscl=test4.remove-task.c:29:29*escl=test4.remove-task.c:54:54**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "92*regionType=for*sscl=test4.remove-task.c:32:32*escl=test4.remove-task.c:35:35*hasNowait=1**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "111*regionType=sections*sscl=test4.remove-task.c:37:37*escl=test4.remove-task.c:43:43*numSections=2*hasNowait=1**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "95*regionType=single*sscl=test4.remove-task.c:45:45*escl=test4.remove-task.c:48:48*hasNowait=1**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "93*regionType=task*sscl=test4.remove-task.c:50:50*escl=test4.remove-task.c:53:53*hasUntied=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test4.remove-task.c0000644000000000000000000000013214015716474017732 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.remove-task.c0000644000175100001440000000224214015716474021125 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #include #endif int main() { int i; #pragma omp parallel { printf("parallel\n"); #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } #pragma omp sections nowait { #pragma omp section printf("section nowait 1\n"); #pragma omp section { printf("section nowait 2\n"); } } #pragma omp single nowait { printf("single nowait\n"); } #pragma omp task untied { printf("task untied\n"); } } } opari2-2.0.6/test/data/PaxHeaders.6153/test4.f90.out0000644000000000000000000000013214015716474016460 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.f90.out0000644000175100001440000001037114015716474017655 0ustar00builderusers00000000000000 #line 1 "test4.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 include 'test4.f90.opari.inc' #line 20 "test4.f90" integer i real a(5,5), b(5,5), c(5,5) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 24 "test4.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test4.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 26 "test4.f90" !$omp do do i=1,4 write(*,*) "do nowait",i enddo #line 30 "test4.f90" !$omp enddo nowait call POMP2_Do_exit(opari2_region_2) #line 31 "test4.f90" call POMP2_Sections_enter(opari2_region_3, & opari2_ctc_3 ) #line 32 "test4.f90" !$omp sections #line 33 "test4.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 34 "test4.f90" write(*,*) "section nowait 1" call POMP2_Section_end(opari2_region_3) #line 35 "test4.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 36 "test4.f90" write(*,*) "section nowait 2" call POMP2_Section_end(opari2_region_3) #line 37 "test4.f90" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_3) #line 38 "test4.f90" call POMP2_Single_enter(opari2_region_4, & opari2_ctc_4 ) #line 39 "test4.f90" !$omp single call POMP2_Single_begin(opari2_region_4) #line 40 "test4.f90" write(*,*) "single nowait" call POMP2_Single_end(opari2_region_4) #line 41 "test4.f90" !$omp end single nowait call POMP2_Single_exit(opari2_region_4) #line 42 "test4.f90" call POMP2_Workshare_enter(opari2_region_5, & opari2_ctc_5 ) #line 43 "test4.f90" !$omp workshare a = b + c #line 45 "test4.f90" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_5) #line 46 "test4.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Untied_task_create_begin(opari2_region_6, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_6 ) end if #line 47 "test4.f90" !$omp task untied if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Untied_task_begin(opari2_region_6, pomp2_new_task) end if #line 48 "test4.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Untied_task_end(opari2_region_6) end if #line 49 "test4.f90" !$omp end task if (pomp2_if) then call POMP2_Untied_task_create_end(opari2_region_6, pomp2_old_task) end if #line 50 "test4.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 51 "test4.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 52 "test4.f90" end program test4 subroutine POMP2_Init_reg_000() include 'test4.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test4.f90.opari.inc.out0000644000000000000000000000013214015716474020341 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.f90.opari.inc.out0000644000175100001440000000301714015716474021535 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test4.f90:24:24*escl=test4.f90:51:51**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test4.f90:26:26*escl=test4.f90:30:30**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "78*regionType=sections*sscl=test4.f90:32:32*escl=test4.f90:37:37*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "62*regionType=single*sscl=test4.f90:39:39*escl=test4.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "65*regionType=workshare*sscl=test4.f90:43:43*escl=test4.f90:45:45**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "72*regionType=task*sscl=test4.f90:47:47*escl=test4.f90:49:49*hasUntied=1**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test4.f900000644000000000000000000000013214015716474015652 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.f900000644000175100001440000000231314015716474017044 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 integer i real a(5,5), b(5,5), c(5,5) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do nowait",i enddo !$omp enddo nowait !$omp sections !$omp section write(*,*) "section nowait 1" !$omp section write(*,*) "section nowait 2" !$omp end sections nowait !$omp single write(*,*) "single nowait" !$omp end single nowait !$omp workshare a = b + c !$omp end workshare nowait !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel end program test4 opari2-2.0.6/test/data/PaxHeaders.6153/test4.f.out0000644000000000000000000000013214015716474016307 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.f.out0000644000175100001440000001035314015716474017504 0ustar00builderusers00000000000000 #line 1 "test4.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 include 'test4.f.opari.inc' #line 20 "test4.f" integer i real a(5,5), b(5,5), c(5,5) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 24 "test4.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test4.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 26 "test4.f" !$omp do do i=1,4 write(*,*) "do nowait",i enddo #line 30 "test4.f" !$omp enddo nowait call POMP2_Do_exit(opari2_region_2) #line 31 "test4.f" call POMP2_Sections_enter(opari2_region_3, &opari2_ctc_3 ) #line 32 "test4.f" !$omp sections #line 33 "test4.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 34 "test4.f" write(*,*) "section nowait 1" call POMP2_Section_end(opari2_region_3) #line 35 "test4.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 36 "test4.f" write(*,*) "section nowait 2" call POMP2_Section_end(opari2_region_3) #line 37 "test4.f" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_3) #line 38 "test4.f" call POMP2_Single_enter(opari2_region_4, &opari2_ctc_4 ) #line 39 "test4.f" !$omp single call POMP2_Single_begin(opari2_region_4) #line 40 "test4.f" write(*,*) "single nowait" call POMP2_Single_end(opari2_region_4) #line 41 "test4.f" !$omp end single nowait call POMP2_Single_exit(opari2_region_4) #line 42 "test4.f" call POMP2_Workshare_enter(opari2_region_5, &opari2_ctc_5 ) #line 43 "test4.f" !$omp workshare a = b + c #line 45 "test4.f" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_5) #line 46 "test4.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_6, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_6 ) end if #line 47 "test4.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_6, pomp2_new_task) end if #line 48 "test4.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_6) end if #line 49 "test4.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_6, &pomp2_old_task) end if #line 50 "test4.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 51 "test4.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 52 "test4.f" end program test4 subroutine POMP2_Init_reg_000() include 'test4.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test4.f.opari.inc.out0000644000000000000000000000013214015716474020170 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.f.opari.inc.out0000644000175100001440000000273714015716474021374 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test4.f:24:24*escl=test4.f:51:5"// &"1**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test4.f:26:26*escl=test4.f:30:30**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"76*regionType=sections*sscl=test4.f:32:32*escl=test4.f:37:3"// &"7*numSections=2**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"60*regionType=single*sscl=test4.f:39:39*escl=test4.f:41:41*"// &"*") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"63*regionType=workshare*sscl=test4.f:43:43*escl=test4.f:45:"// &"45**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"70*regionType=task*sscl=test4.f:47:47*escl=test4.f:49:49*ha"// &"sUntied=1**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test4.f0000644000000000000000000000013214015716474015501 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.f0000644000175100001440000000237614015716474016704 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 integer i real a(5,5), b(5,5), c(5,5) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do nowait",i enddo !$omp enddo nowait !$omp sections !$omp section write(*,*) "section nowait 1" !$omp section write(*,*) "section nowait 2" !$omp end sections nowait !$omp single write(*,*) "single nowait" !$omp end single nowait !$omp workshare a = b + c !$omp end workshare nowait !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel end program test4 opari2-2.0.6/test/data/PaxHeaders.6153/test4.c.out0000644000000000000000000000013214015716474016304 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.124005111 opari2-2.0.6/test/data/test4.c.out0000644000175100001440000000634414015716474017506 0ustar00builderusers00000000000000#include "test4.c.opari.inc" #line 1 "test4.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #endif int main() { int i; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 29 "test4.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 30 "test4.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 32 "test4.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } POMP2_For_exit( &opari2_region_2 ); } #line 36 "test4.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 37 "test4.c" #pragma omp sections nowait { #line 39 "test4.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 40 "test4.c" printf("section nowait 1\n"); POMP2_Section_end( &opari2_region_3 ); } #line 41 "test4.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 42 "test4.c" { printf("section nowait 2\n"); } POMP2_Section_end( &opari2_region_3 ); } #line 43 "test4.c" } POMP2_Sections_exit( &opari2_region_3 ); } #line 44 "test4.c" { POMP2_Single_enter( &opari2_region_4, opari2_ctc_4 ); #line 45 "test4.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_4 ); #line 46 "test4.c" { printf("single nowait\n"); } POMP2_Single_end( &opari2_region_4 ); } POMP2_Single_exit( &opari2_region_4 ); } #line 49 "test4.c" { int pomp2_if = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Untied_task_create_begin( &opari2_region_5, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_5 ); #line 50 "test4.c" #pragma omp task untied POMP2_DLIST_00005 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Untied_task_begin( &opari2_region_5, pomp2_new_task ); #line 51 "test4.c" { printf("task untied\n"); } if (pomp2_if) POMP2_Untied_task_end( &opari2_region_5 ); } if (pomp2_if) POMP2_Untied_task_create_end( &opari2_region_5, pomp2_old_task ); } } #line 54 "test4.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test4.c" } opari2-2.0.6/test/data/PaxHeaders.6153/test4.c.opari.inc.out0000644000000000000000000000013214015716474020165 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test4.c.opari.inc.out0000644000175100001440000000245214015716474021363 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test4.c:29:29*escl=test4.c:54:54**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "68*regionType=for*sscl=test4.c:32:32*escl=test4.c:35:35*hasNowait=1**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "87*regionType=sections*sscl=test4.c:37:37*escl=test4.c:43:43*numSections=2*hasNowait=1**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "71*regionType=single*sscl=test4.c:45:45*escl=test4.c:48:48*hasNowait=1**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "69*regionType=task*sscl=test4.c:50:50*escl=test4.c:53:53*hasUntied=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test4.c0000644000000000000000000000013214015716474015476 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test4.c0000644000175100001440000000224214015716474016671 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #include #endif int main() { int i; #pragma omp parallel { printf("parallel\n"); #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } #pragma omp sections nowait { #pragma omp section printf("section nowait 1\n"); #pragma omp section { printf("section nowait 2\n"); } } #pragma omp single nowait { printf("single nowait\n"); } #pragma omp task untied { printf("task untied\n"); } } } opari2-2.0.6/test/data/PaxHeaders.6153/test3.f90.out0000644000000000000000000000013214015716474016457 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.f90.out0000644000175100001440000003521214015716474017655 0ustar00builderusers00000000000000 #line 1 "test3.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 include 'test3.f90.opari.inc' #line 20 "test3.f90" integer i, j, k pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 22 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 23 "test3.f90" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 23 "test3.f90" !$omp do do 12,i = 1,8 a=a+1 12 continue #line 26 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 27 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 27 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 28 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 29 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Do_enter(opari2_region_3, & opari2_ctc_3 ) #line 29 "test3.f90" !$omp do do 13,i = 1,8 a=a+1 13 continue #line 33 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Do_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 33 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 34 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 34 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 35 "test3.f90" call POMP2_Do_enter(opari2_region_5, & opari2_ctc_5 ) #line 35 "test3.f90" !$omp do do 14,i = 1,8 a=a+1 14 continue #line 38 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 39 "test3.f90" call POMP2_Atomic_enter(opari2_region_6, & opari2_ctc_6 ) #line 39 "test3.f90" !$omp atomic me = me + omp_get_thread_num() call POMP2_Atomic_exit(opari2_region_6) #line 41 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 41 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 42 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_7 ) #line 43 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, & opari2_ctc_7 ) #line 43 "test3.f90" !$omp do do 15,i = 1,8 15 a=a+1 #line 45 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 45 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, pomp2_old_task) #line 46 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 46 "test3.f90" !$omp parallel private(me,glob) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) #line 47 "test3.f90" me = omp_get_thread_num() call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Parallel_end(opari2_region_8) #line 48 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 49 "test3.f90" ! ********************** ! * nested parallelism * ! ********************** pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 54 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) #line 55 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 55 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 56 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_11,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_11 ) #line 56 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_11) #line 57 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_12,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_12 ) #line 57 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_12) call POMP2_Do_enter(opari2_region_12, & opari2_ctc_12 ) #line 57 "test3.f90" !$omp do do i = 1,8 a=a+1 enddo #line 61 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_12,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, pomp2_old_task) call POMP2_Do_exit(opari2_region_12) call POMP2_Parallel_end(opari2_region_12) #line 61 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_12, pomp2_old_task) #line 62 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_11,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, pomp2_old_task) call POMP2_Parallel_end(opari2_region_11) #line 62 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_11, pomp2_old_task) #line 63 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 63 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 64 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Parallel_end(opari2_region_9) #line 64 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 65 "test3.f90" ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_13,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_13 ) #line 70 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_13) call POMP2_Do_enter(opari2_region_13, & opari2_ctc_13 ) #line 70 "test3.f90" !$omp do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue #line 75 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_13,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, pomp2_old_task) call POMP2_Do_exit(opari2_region_13) call POMP2_Parallel_end(opari2_region_13) #line 75 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_13, pomp2_old_task) #line 76 "test3.f90" do 17,i = 1,8 pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_14 ) #line 77 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) call POMP2_Do_enter(opari2_region_14, & opari2_ctc_14 ) #line 77 "test3.f90" !$omp do do 18, j = 1,8 a=a+1 18 continue #line 80 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_14,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, pomp2_old_task) call POMP2_Do_exit(opari2_region_14) call POMP2_Parallel_end(opari2_region_14) #line 80 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, pomp2_old_task) #line 81 "test3.f90" 17 continue pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_15,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_15 ) #line 83 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_15) call POMP2_Do_enter(opari2_region_15, & opari2_ctc_15 ) #line 83 "test3.f90" !$omp do do if (a .gt. 0) then exit endif enddo #line 89 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_15,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, pomp2_old_task) call POMP2_Do_exit(opari2_region_15) call POMP2_Parallel_end(opari2_region_15) #line 89 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_15, pomp2_old_task) #line 90 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_16,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_16 ) #line 90 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_16) call POMP2_Do_enter(opari2_region_16, & opari2_ctc_16 ) #line 90 "test3.f90" !$omp do loopLabel: do i = 1,8 a=a+1 end do loopLabel #line 94 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_16,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_16, pomp2_old_task) call POMP2_Do_exit(opari2_region_16) call POMP2_Parallel_end(opari2_region_16) #line 94 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_16, pomp2_old_task) #line 95 "test3.f90" end program test3 subroutine POMP2_Init_reg_000() include 'test3.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test3.f90.opari.inc.out0000644000000000000000000000013214015716474020340 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.f90.opari.inc.out0000644000175100001440000000711114015716474021533 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test3.f90:22:22*escl=test3.f90:27:27**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test3.f90:23:23*escl=test3.f90:26:26**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "66*regionType=paralleldo*sscl=test3.f90:29:29*escl=test3.f90:33:33**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test3.f90:34:34*escl=test3.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "58*regionType=do*sscl=test3.f90:35:35*escl=test3.f90:38:38**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "62*regionType=atomic*sscl=test3.f90:39:39*escl=test3.f90:40:40**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "66*regionType=paralleldo*sscl=test3.f90:43:43*escl=test3.f90:45:45**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "64*regionType=parallel*sscl=test3.f90:46:46*escl=test3.f90:48:48**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "64*regionType=parallel*sscl=test3.f90:54:54*escl=test3.f90:64:64**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "64*regionType=parallel*sscl=test3.f90:55:55*escl=test3.f90:63:63**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "64*regionType=parallel*sscl=test3.f90:56:56*escl=test3.f90:62:62**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "66*regionType=paralleldo*sscl=test3.f90:57:57*escl=test3.f90:61:61**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "66*regionType=paralleldo*sscl=test3.f90:70:70*escl=test3.f90:75:75**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "66*regionType=paralleldo*sscl=test3.f90:77:77*escl=test3.f90:80:80**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "66*regionType=paralleldo*sscl=test3.f90:83:83*escl=test3.f90:89:89**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "66*regionType=paralleldo*sscl=test3.f90:90:90*escl=test3.f90:94:94**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test3.f900000644000000000000000000000013214015716474015651 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.f900000644000175100001440000000375414015716474017055 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 integer i, j, k !$OMP parallel !$OMP do do 12,i = 1,8 a=a+1 12 continue !$OMP end parallel !$OMP parallel do do 13,i = 1,8 a=a+1 13 continue !$OMP parallel !$OMP do do 14,i = 1,8 a=a+1 14 continue !$OMP atomic me = me + omp_get_thread_num() !$OMP end parallel !$OMP parallel do do 15,i = 1,8 15 a=a+1 !$OMP parallel private(me,glob) me = omp_get_thread_num() !$OMP end parallel ! ********************** ! * nested parallelism * ! ********************** !$omp parallel !$omp parallel !$omp parallel !$omp parallel do do i = 1,8 a=a+1 enddo !$omp end parallel do !$omp end parallel !$omp end parallel !$omp end parallel ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* !$OMP parallel do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue do 17,i = 1,8 !$OMP parallel do do 18, j = 1,8 a=a+1 18 continue 17 continue !$omp parallel do do if (a .gt. 0) then exit endif enddo !$OMP parallel do loopLabel: do i = 1,8 a=a+1 end do loopLabel end program test3 opari2-2.0.6/test/data/PaxHeaders.6153/test3.f.out0000644000000000000000000000013214015716474016306 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.f.out0000644000175100001440000003276714015716474017520 0ustar00builderusers00000000000000 #line 1 "test3.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 include 'test3.f.opari.inc' #line 20 "test3.f" integer i, j, k real end_level, dolic pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 23 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 24 "test3.f" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 24 "test3.f" c$omp do do 12,i = 1,8 a=a+1 12 continue #line 27 "test3.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 28 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 28 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 29 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 30 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Do_enter(opari2_region_3, &opari2_ctc_3 ) #line 30 "test3.f" c$omp do do 13,i = 1,8 a=a+1 13 continue #line 34 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Do_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 34 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 35 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 35 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 36 "test3.f" call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 36 "test3.f" c$omp do do 14,i = 1,8 a=a+1 14 continue #line 39 "test3.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 40 "test3.f" call POMP2_Atomic_enter(opari2_region_6, &opari2_ctc_6 ) #line 40 "test3.f" c$omp atomic me = me + omp_get_thread_num() call POMP2_Atomic_exit(opari2_region_6) #line 42 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 42 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 43 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_7 ) #line 44 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, &opari2_ctc_7 ) #line 44 "test3.f" c$omp do do 15,i = 1,8 15 a=a+1 #line 46 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 46 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, &pomp2_old_task) #line 47 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_8 ) #line 47 "test3.f" c$omp parallel private(me,glob) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) #line 48 "test3.f" me = omp_get_thread_num() call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_8) #line 49 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_8, &pomp2_old_task) #line 50 "test3.f" ! ********************** ! * nested parallelism * ! ********************** pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_9 ) #line 55 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) #line 56 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_10 ) #line 56 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 57 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_11, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_11 ) #line 57 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_11) #line 58 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_12, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_12 ) #line 58 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_12) call POMP2_Do_enter(opari2_region_12, &opari2_ctc_12 ) #line 58 "test3.f" !$omp do do i = 1,8 end_level = end_level + dolic/i a=a+1 end do #line 63 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_12, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, &pomp2_old_task) call POMP2_Do_exit(opari2_region_12) call POMP2_Parallel_end(opari2_region_12) #line 63 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_12, &pomp2_old_task) #line 64 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_11, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_11) #line 64 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_11, &pomp2_old_task) #line 65 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_10, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 65 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, &pomp2_old_task) #line 66 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_9, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_9) #line 66 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, &pomp2_old_task) #line 67 "test3.f" ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_13, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_13 ) #line 71 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_13) call POMP2_Do_enter(opari2_region_13, &opari2_ctc_13 ) #line 71 "test3.f" c$omp do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue #line 76 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_13, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, &pomp2_old_task) call POMP2_Do_exit(opari2_region_13) call POMP2_Parallel_end(opari2_region_13) #line 76 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_13, &pomp2_old_task) #line 77 "test3.f" do 17,i = 1,8 pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_14 ) #line 78 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) call POMP2_Do_enter(opari2_region_14, &opari2_ctc_14 ) #line 78 "test3.f" c$omp do do 18, j = 1,8 a=a+1 18 continue #line 81 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_14, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, &pomp2_old_task) call POMP2_Do_exit(opari2_region_14) call POMP2_Parallel_end(opari2_region_14) #line 81 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, &pomp2_old_task) #line 82 "test3.f" 17 continue pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_15, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_15 ) #line 84 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_15) call POMP2_Do_enter(opari2_region_15, &opari2_ctc_15 ) #line 84 "test3.f" c$omp do do if (a .gt. 0) then exit endif enddo #line 89 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_15, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, &pomp2_old_task) call POMP2_Do_exit(opari2_region_15) call POMP2_Parallel_end(opari2_region_15) #line 89 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_15, &pomp2_old_task) #line 90 "test3.f" end program test3 subroutine POMP2_Init_reg_000() include 'test3.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test3.f.opari.inc.out0000644000000000000000000000013214015716474020167 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.f.opari.inc.out0000644000175100001440000000653014015716474021366 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test3.f:23:23*escl=test3.f:28:2"// &"8**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test3.f:24:24*escl=test3.f:27:27**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"64*regionType=paralleldo*sscl=test3.f:30:30*escl=test3.f:34"// &":34**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test3.f:35:35*escl=test3.f:42:4"// &"2**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"56*regionType=do*sscl=test3.f:36:36*escl=test3.f:39:39**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"60*regionType=atomic*sscl=test3.f:40:40*escl=test3.f:41:41*"// &"*") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"64*regionType=paralleldo*sscl=test3.f:44:44*escl=test3.f:46"// &":46**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"62*regionType=parallel*sscl=test3.f:47:47*escl=test3.f:49:4"// &"9**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"62*regionType=parallel*sscl=test3.f:55:55*escl=test3.f:66:6"// &"6**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"62*regionType=parallel*sscl=test3.f:56:56*escl=test3.f:65:6"// &"5**") INTEGER*8 opari2_region_11 CHARACTER*999 opari2_ctc_11 PARAMETER (opari2_ctc_11= &"62*regionType=parallel*sscl=test3.f:57:57*escl=test3.f:64:6"// &"4**") INTEGER*8 opari2_region_12 CHARACTER*999 opari2_ctc_12 PARAMETER (opari2_ctc_12= &"64*regionType=paralleldo*sscl=test3.f:58:58*escl=test3.f:63"// &":63**") INTEGER*8 opari2_region_13 CHARACTER*999 opari2_ctc_13 PARAMETER (opari2_ctc_13= &"64*regionType=paralleldo*sscl=test3.f:71:71*escl=test3.f:76"// &":76**") INTEGER*8 opari2_region_14 CHARACTER*999 opari2_ctc_14 PARAMETER (opari2_ctc_14= &"64*regionType=paralleldo*sscl=test3.f:78:78*escl=test3.f:81"// &":81**") INTEGER*8 opari2_region_15 CHARACTER*999 opari2_ctc_15 PARAMETER (opari2_ctc_15= &"64*regionType=paralleldo*sscl=test3.f:84:84*escl=test3.f:89"// &":89**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10, & opari2_region_11, & opari2_region_12, & opari2_region_13, & opari2_region_14, & opari2_region_15 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test3.f0000644000000000000000000000013214015716474015500 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.f0000644000175100001440000000371414015716474016700 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 integer i, j, k real end_level, dolic c$OMP parallel c$OMP do do 12,i = 1,8 a=a+1 12 continue c$OMP end parallel c$OMP parallel do do 13,i = 1,8 a=a+1 13 continue c$OMP parallel c$OMP do do 14,i = 1,8 a=a+1 14 continue c$OMP atomic me = me + omp_get_thread_num() c$OMP end parallel c$OMP parallel do do 15,i = 1,8 15 a=a+1 c$OMP parallel private(me,glob) me = omp_get_thread_num() c$OMP end parallel ! ********************** ! * nested parallelism * ! ********************** !$omp parallel !$omp parallel !$omp parallel !$omp parallel do do i = 1,8 end_level = end_level + dolic/i a=a+1 end do !$omp end parallel do !$omp end parallel !$omp end parallel !$omp end parallel ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* c$OMP parallel do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue do 17,i = 1,8 c$OMP parallel do do 18, j = 1,8 a=a+1 18 continue 17 continue c$omp parallel do do if (a .gt. 0) then exit endif enddo end program test3 opari2-2.0.6/test/data/PaxHeaders.6153/test3.c.out0000644000000000000000000000013214015716474016303 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.315910224 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.c.out0000644000175100001440000002530514015716474017503 0ustar00builderusers00000000000000#include "test3.c.opari.inc" #line 1 "test3.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Special tests for code blocks and nested parallel regions/loops. */ #include #ifdef _OPENMP #endif int main() { int i, j; int k = 0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 31 "test3.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 32 "test3.c" { { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 33 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 38 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 39 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 40 "test3.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); #line 41 "test3.c" { POMP2_For_enter( &opari2_region_4, opari2_ctc_4 ); #line 41 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_For_exit( &opari2_region_4 ); } #line 46 "test3.c" { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 46 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_5, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_5 ); #line 47 "test3.c" #pragma omp parallel POMP2_DLIST_00005 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_5 ); #line 48 "test3.c" { #line 49 "test3.c" #pragma omp master { POMP2_Master_begin( &opari2_region_6, opari2_ctc_6 ); #line 50 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Master_end( &opari2_region_6 ); } #line 52 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_5 ); } POMP2_Parallel_join( &opari2_region_5, pomp2_old_task ); } #line 53 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_7, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_7 ); #line 54 "test3.c" #pragma omp parallel POMP2_DLIST_00007 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_7 ); #line 55 "test3.c" { { POMP2_Single_enter( &opari2_region_8, opari2_ctc_8 ); #line 56 "test3.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_8 ); #line 57 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Single_end( &opari2_region_8 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_8, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_8, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_8 ); } #line 58 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_7 ); } POMP2_Parallel_join( &opari2_region_7, pomp2_old_task ); } #line 59 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_9, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_9 ); #line 60 "test3.c" #pragma omp parallel POMP2_DLIST_00009 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_9 ); #line 61 "test3.c" { POMP2_Critical_enter( &opari2_region_10, opari2_ctc_10 ); #line 61 "test3.c" #pragma omp critical { POMP2_Critical_begin( &opari2_region_10 ); #line 62 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Critical_end( &opari2_region_10 ); } POMP2_Critical_exit( &opari2_region_10 ); } #line 63 "test3.c" { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_9, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_9, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_9 ); } POMP2_Parallel_join( &opari2_region_9, pomp2_old_task ); } #line 63 "test3.c" // ***************************************** // * Testing of nested parallelism * // ***************************************** { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_11, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_11 ); #line 68 "test3.c" #pragma omp parallel POMP2_DLIST_00011 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_11 ); #line 69 "test3.c" { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_12, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_12 ); #line 70 "test3.c" #pragma omp parallel POMP2_DLIST_00012 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_12 ); #line 71 "test3.c" { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_13, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_13 ); #line 72 "test3.c" #pragma omp parallel POMP2_DLIST_00013 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_13 ); #line 73 "test3.c" { { POMP2_For_enter( &opari2_region_14, opari2_ctc_14 ); #line 74 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { printf("do %d\n", i); } POMP2_For_exit( &opari2_region_14 ); } #line 78 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_13, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_13, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_13 ); } POMP2_Parallel_join( &opari2_region_13, pomp2_old_task ); } #line 79 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_12, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_12, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_12 ); } POMP2_Parallel_join( &opari2_region_12, pomp2_old_task ); } #line 80 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_11, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_11, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_11 ); } POMP2_Parallel_join( &opari2_region_11, pomp2_old_task ); } #line 81 "test3.c" // ***************************************** // * Testing of nested for loops * // ***************************************** { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_15, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_15 ); #line 86 "test3.c" #pragma omp parallel POMP2_DLIST_00015 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_15 ); #line 87 "test3.c" { { POMP2_For_enter( &opari2_region_16, opari2_ctc_16 ); #line 88 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { printf("do %d\n", i); } } POMP2_For_exit( &opari2_region_16 ); } #line 94 "test3.c" { POMP2_For_enter( &opari2_region_17, opari2_ctc_17 ); #line 95 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { for (k=0; k<4; ++k) { printf("do %d\n", i); } } } POMP2_For_exit( &opari2_region_17 ); } #line 103 "test3.c" { POMP2_For_enter( &opari2_region_18, opari2_ctc_18 ); #line 104 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) printf("do %d\n", i); POMP2_For_exit( &opari2_region_18 ); } #line 108 "test3.c" { POMP2_For_enter( &opari2_region_19, opari2_ctc_19 ); #line 109 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) printf("do %d\n", i); POMP2_For_exit( &opari2_region_19 ); } #line 114 "test3.c" { POMP2_For_enter( &opari2_region_20, opari2_ctc_20 ); #line 115 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) { printf("do %d\n", i); } POMP2_For_exit( &opari2_region_20 ); } #line 120 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_15, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_15, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_15 ); } POMP2_Parallel_join( &opari2_region_15, pomp2_old_task ); } #line 121 "test3.c" } opari2-2.0.6/test/data/PaxHeaders.6153/test3.c.opari.inc.out0000644000000000000000000000013214015716474020164 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.c.opari.inc.out0000644000175100001440000001150414015716474021360 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test3.c:31:31*escl=test3.c:38:38**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "56*regionType=for*sscl=test3.c:33:33*escl=test3.c:37:37**" #define POMP2_DLIST_00003 shared(opari2_region_3,opari2_region_4) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "61*regionType=parallel*sscl=test3.c:40:40*escl=test3.c:45:45**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "56*regionType=for*sscl=test3.c:41:41*escl=test3.c:45:45**" #define POMP2_DLIST_00005 shared(opari2_region_5,opari2_region_6) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "61*regionType=parallel*sscl=test3.c:47:47*escl=test3.c:52:52**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "59*regionType=master*sscl=test3.c:49:49*escl=test3.c:51:51**" #define POMP2_DLIST_00007 shared(opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "61*regionType=parallel*sscl=test3.c:54:54*escl=test3.c:58:58**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "59*regionType=single*sscl=test3.c:56:56*escl=test3.c:57:57**" #define POMP2_DLIST_00009 shared(opari2_region_9,opari2_region_10) static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "61*regionType=parallel*sscl=test3.c:60:60*escl=test3.c:62:62**" static OPARI2_Region_handle opari2_region_10 = NULL; #define opari2_ctc_10 "61*regionType=critical*sscl=test3.c:61:61*escl=test3.c:62:62**" #define POMP2_DLIST_00011 shared(opari2_region_11,opari2_region_12,opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_11 = NULL; #define opari2_ctc_11 "61*regionType=parallel*sscl=test3.c:68:68*escl=test3.c:80:80**" #define POMP2_DLIST_00012 shared(opari2_region_12,opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_12 = NULL; #define opari2_ctc_12 "61*regionType=parallel*sscl=test3.c:70:70*escl=test3.c:79:79**" #define POMP2_DLIST_00013 shared(opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_13 = NULL; #define opari2_ctc_13 "61*regionType=parallel*sscl=test3.c:72:72*escl=test3.c:78:78**" static OPARI2_Region_handle opari2_region_14 = NULL; #define opari2_ctc_14 "68*regionType=for*sscl=test3.c:74:74*escl=test3.c:77:77*hasNowait=1**" #define POMP2_DLIST_00015 shared(opari2_region_15,opari2_region_16,opari2_region_17,opari2_region_18,opari2_region_19,opari2_region_20) static OPARI2_Region_handle opari2_region_15 = NULL; #define opari2_ctc_15 "63*regionType=parallel*sscl=test3.c:86:86*escl=test3.c:120:120**" static OPARI2_Region_handle opari2_region_16 = NULL; #define opari2_ctc_16 "68*regionType=for*sscl=test3.c:88:88*escl=test3.c:93:93*hasNowait=1**" static OPARI2_Region_handle opari2_region_17 = NULL; #define opari2_ctc_17 "70*regionType=for*sscl=test3.c:95:95*escl=test3.c:102:102*hasNowait=1**" static OPARI2_Region_handle opari2_region_18 = NULL; #define opari2_ctc_18 "72*regionType=for*sscl=test3.c:104:104*escl=test3.c:107:107*hasNowait=1**" static OPARI2_Region_handle opari2_region_19 = NULL; #define opari2_ctc_19 "72*regionType=for*sscl=test3.c:109:109*escl=test3.c:113:113*hasNowait=1**" static OPARI2_Region_handle opari2_region_20 = NULL; #define opari2_ctc_20 "72*regionType=for*sscl=test3.c:115:115*escl=test3.c:119:119*hasNowait=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); POMP2_Assign_handle( &opari2_region_10, opari2_ctc_10 ); POMP2_Assign_handle( &opari2_region_11, opari2_ctc_11 ); POMP2_Assign_handle( &opari2_region_12, opari2_ctc_12 ); POMP2_Assign_handle( &opari2_region_13, opari2_ctc_13 ); POMP2_Assign_handle( &opari2_region_14, opari2_ctc_14 ); POMP2_Assign_handle( &opari2_region_15, opari2_ctc_15 ); POMP2_Assign_handle( &opari2_region_16, opari2_ctc_16 ); POMP2_Assign_handle( &opari2_region_17, opari2_ctc_17 ); POMP2_Assign_handle( &opari2_region_18, opari2_ctc_18 ); POMP2_Assign_handle( &opari2_region_19, opari2_ctc_19 ); POMP2_Assign_handle( &opari2_region_20, opari2_ctc_20 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test3.c0000644000000000000000000000013214015716474015475 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test3.c0000644000175100001440000000442014015716474016670 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Special tests for code blocks and nested parallel regions/loops. */ #include #ifdef _OPENMP #include #endif int main() { int i, j; int k = 0; #pragma omp parallel { #pragma omp for for (i=0; i<4; ++i) { k++; } } #pragma omp parallel #pragma omp for for (i=0; i<4; ++i) { k++; } #pragma omp parallel { #pragma omp master for (i=0; i<4; ++i) k++; } #pragma omp parallel { #pragma omp single for (i=0; i<4; ++i) k++; } #pragma omp parallel #pragma omp critical for (i=0; i<4; ++i) k++; // ***************************************** // * Testing of nested parallelism * // ***************************************** #pragma omp parallel { #pragma omp parallel { #pragma omp parallel { #pragma omp for nowait for (i=0; i<4; ++i) { printf("do %d\n", i); } } } } // ***************************************** // * Testing of nested for loops * // ***************************************** #pragma omp parallel { #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { printf("do %d\n", i); } } #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { for (k=0; k<4; ++k) { printf("do %d\n", i); } } } #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) printf("do %d\n", i); #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) printf("do %d\n", i); #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) { printf("do %d\n", i); } } } opari2-2.0.6/test/data/PaxHeaders.6153/test2.f90.out0000644000000000000000000000013214015716474016456 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.f90.out0000644000175100001440000002177614015716474017666 0ustar00builderusers00000000000000 #line 1 "test2.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 include 'test2.f90.opari.inc' #line 20 "test2.f90" integer i integer k integer, save :: j #line 24 "test2.f90" !$omp threadprivate(j) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 26 "test2.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test2.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 28 "test2.f90" !$omp do do i=1,4 write(*,*) "do",i enddo #line 32 "test2.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 33 "test2.f90" call POMP2_Flush_enter(opari2_region_3, & opari2_ctc_3 ) #line 34 "test2.f90" !$omp flush(k) call POMP2_Flush_exit(opari2_region_3) #line 35 "test2.f90" call POMP2_Do_enter(opari2_region_4, & opari2_ctc_4 ) #line 36 "test2.f90" !$omp do ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_5, & opari2_ctc_5 ) #line 38 "test2.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_5) #line 39 "test2.f90" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_5) #line 40 "test2.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_5) #line 41 "test2.f90" enddo #line 42 "test2.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Do_exit(opari2_region_4) #line 43 "test2.f90" call POMP2_Barrier_enter(opari2_region_6,& pomp2_old_task, opari2_ctc_6 ) #line 44 "test2.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_6, pomp2_old_task) #line 45 "test2.f90" call POMP2_Sections_enter(opari2_region_7, & opari2_ctc_7 ) #line 46 "test2.f90" !$omp sections #line 47 "test2.f90" !$omp section call POMP2_Section_begin(opari2_region_7, & opari2_ctc_7 ) #line 48 "test2.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_7) #line 49 "test2.f90" !$omp section call POMP2_Section_begin(opari2_region_7, & opari2_ctc_7 ) #line 50 "test2.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_7) #line 51 "test2.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Sections_exit(opari2_region_7) #line 52 "test2.f90" #line 53 "test2.f90" !$omp master call POMP2_Master_begin(opari2_region_8, & opari2_ctc_8 ) #line 54 "test2.f90" write(*,*) "master" call POMP2_Master_end(opari2_region_8) #line 55 "test2.f90" !$omp end master call POMP2_Critical_enter(opari2_region_9, & opari2_ctc_9 ) #line 57 "test2.f90" !$omp critical call POMP2_Critical_begin(opari2_region_9) #line 58 "test2.f90" write(*,*) "critical" call POMP2_Critical_end(opari2_region_9) #line 59 "test2.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_9) #line 60 "test2.f90" call POMP2_Critical_enter(opari2_region_10, & opari2_ctc_10 ) #line 61 "test2.f90" !$omp critical(foobar) call POMP2_Critical_begin(opari2_region_10) #line 62 "test2.f90" write(*,*) "critical(foobar)" call POMP2_Critical_end(opari2_region_10) #line 63 "test2.f90" !$omp end critical(foobar) call POMP2_Critical_exit(opari2_region_10) #line 64 "test2.f90" call POMP2_Atomic_enter(opari2_region_11, & opari2_ctc_11 ) #line 65 "test2.f90" !$omp atomic ! do this atomic i = i + 1 call POMP2_Atomic_exit(opari2_region_11) #line 68 "test2.f90" call POMP2_Single_enter(opari2_region_12, & opari2_ctc_12 ) #line 69 "test2.f90" !$omp single call POMP2_Single_begin(opari2_region_12) #line 70 "test2.f90" write(*,*) "single" call POMP2_Single_end(opari2_region_12) #line 71 "test2.f90" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_12,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, pomp2_old_task) call POMP2_Single_exit(opari2_region_12) #line 72 "test2.f90" call POMP2_Workshare_enter(opari2_region_13, & opari2_ctc_13 ) #line 73 "test2.f90" !$omp workshare a = b + c #line 75 "test2.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_13,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_13) #line 76 "test2.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 77 "test2.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 78 "test2.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_14 ) #line 79 "test2.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) #line 80 "test2.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_15, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_15 ) end if #line 80 "test2.f90" !$omp task if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_15, pomp2_new_task) end if #line 81 "test2.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_15) end if #line 82 "test2.f90" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_15, pomp2_old_task) end if #line 83 "test2.f90" call POMP2_Taskwait_begin(opari2_region_16,& pomp2_old_task, opari2_ctc_16 ) #line 84 "test2.f90" !$omp taskwait call POMP2_Taskwait_end(opari2_region_16, pomp2_old_task) #line 85 "test2.f90" call POMP2_Implicit_barrier_enter(opari2_region_14,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, pomp2_old_task) call POMP2_Parallel_end(opari2_region_14) #line 85 "test2.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, pomp2_old_task) #line 86 "test2.f90" ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 subroutine POMP2_Init_reg_000() include 'test2.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test2.f90.opari.inc.out0000644000000000000000000000013214015716474020337 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.f90.opari.inc.out0000644000175100001440000000713614015716474021541 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test2.f90:26:26*escl=test2.f90:77:77**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test2.f90:28:28*escl=test2.f90:32:32**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "61*regionType=flush*sscl=test2.f90:34:34*escl=test2.f90:34:34**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "71*regionType=do*sscl=test2.f90:36:36*escl=test2.f90:42:42*hasOrdered=1**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "63*regionType=ordered*sscl=test2.f90:38:38*escl=test2.f90:40:40**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "63*regionType=barrier*sscl=test2.f90:44:44*escl=test2.f90:44:44**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "78*regionType=sections*sscl=test2.f90:46:46*escl=test2.f90:51:51*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "62*regionType=master*sscl=test2.f90:53:53*escl=test2.f90:55:55**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "64*regionType=critical*sscl=test2.f90:57:57*escl=test2.f90:59:59**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "84*regionType=critical*sscl=test2.f90:61:61*escl=test2.f90:63:63*criticalName=foobar**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "62*regionType=atomic*sscl=test2.f90:65:65*escl=test2.f90:67:67**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "62*regionType=single*sscl=test2.f90:69:69*escl=test2.f90:71:71**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "65*regionType=workshare*sscl=test2.f90:73:73*escl=test2.f90:75:75**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "64*regionType=parallel*sscl=test2.f90:79:79*escl=test2.f90:85:85**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "60*regionType=task*sscl=test2.f90:80:80*escl=test2.f90:82:82**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "64*regionType=taskwait*sscl=test2.f90:84:84*escl=test2.f90:84:84**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test2.f900000644000000000000000000000013214015716474015650 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.f900000644000175100001440000000333714015716474017051 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do",i enddo !$omp end do !$omp flush(k) !$omp do ordered do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered enddo !$omp end do !$omp barrier !$omp sections !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp master write(*,*) "master" !$omp end master !$omp critical write(*,*) "critical" !$omp end critical !$omp critical(foobar) write(*,*) "critical(foobar)" !$omp end critical(foobar) !$omp atomic ! do this atomic i = i + 1 !$omp single write(*,*) "single" !$omp end single !$omp workshare a = b + c !$omp end workshare !$omp end parallel !$omp parallel !$omp task write(*,*) "task" !$omp end task !$omp taskwait !$omp end parallel ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 opari2-2.0.6/test/data/PaxHeaders.6153/test2.f.out0000644000000000000000000000013214015716474016305 xustar0030 mtime=1614257468.259910046 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.f.out0000644000175100001440000002207014015716474017501 0ustar00builderusers00000000000000 #line 1 "test2.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 include 'test2.f.opari.inc' #line 20 "test2.f" integer i integer k integer, save :: j #line 24 "test2.f" !$omp threadprivate(j) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test2.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test2.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 29 "test2.f" !$omp do do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 34 "test2.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 35 "test2.f" call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 36 "test2.f" !$omp flush(k) call POMP2_Flush_exit(opari2_region_3) #line 37 "test2.f" call POMP2_Barrier_enter(opari2_region_4, &pomp2_old_task, &opari2_ctc_4 ) #line 38 "test2.f" !$omp barrier call POMP2_Barrier_exit(opari2_region_4, &pomp2_old_task) #line 39 "test2.f" call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 40 "test2.f" !$omp do ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 42 "test2.f" !$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 43 "test2.f" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_6) #line 44 "test2.f" !$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 45 "test2.f" enddo #line 46 "test2.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 47 "test2.f" call POMP2_Sections_enter(opari2_region_7, &opari2_ctc_7 ) #line 48 "test2.f" !$omp sections #line 49 "test2.f" !$omp section call POMP2_Section_begin(opari2_region_7, &opari2_ctc_7 ) #line 50 "test2.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_7) #line 51 "test2.f" !$omp section call POMP2_Section_begin(opari2_region_7, &opari2_ctc_7 ) #line 52 "test2.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_7) #line 53 "test2.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_7) #line 54 "test2.f" #line 55 "test2.f" !$omp master call POMP2_Master_begin(opari2_region_8, &opari2_ctc_8 ) #line 56 "test2.f" write(*,*) "master" call POMP2_Master_end(opari2_region_8) #line 57 "test2.f" !$omp end master call POMP2_Critical_enter(opari2_region_9, &opari2_ctc_9 ) #line 59 "test2.f" !$omp critical call POMP2_Critical_begin(opari2_region_9) #line 60 "test2.f" write(*,*) "critical" call POMP2_Critical_end(opari2_region_9) #line 61 "test2.f" !$omp end critical call POMP2_Critical_exit(opari2_region_9) #line 62 "test2.f" call POMP2_Critical_enter(opari2_region_10, &opari2_ctc_10 ) #line 63 "test2.f" !$omp critical(foobar) call POMP2_Critical_begin(opari2_region_10) #line 64 "test2.f" write(*,*) "critical(foobar)" call POMP2_Critical_end(opari2_region_10) #line 65 "test2.f" !$omp end critical(foobar) call POMP2_Critical_exit(opari2_region_10) #line 66 "test2.f" ! do this atomic call POMP2_Atomic_enter(opari2_region_11, &opari2_ctc_11 ) #line 68 "test2.f" !$omp atomic i = i + 1 call POMP2_Atomic_exit(opari2_region_11) #line 70 "test2.f" call POMP2_Single_enter(opari2_region_12, &opari2_ctc_12 ) #line 71 "test2.f" !$omp single call POMP2_Single_begin(opari2_region_12) #line 72 "test2.f" write(*,*) "single" call POMP2_Single_end(opari2_region_12) #line 73 "test2.f" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_12, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, &pomp2_old_task) call POMP2_Single_exit(opari2_region_12) #line 74 "test2.f" call POMP2_Workshare_enter(opari2_region_13, &opari2_ctc_13 ) #line 75 "test2.f" !$omp workshare a = b + c #line 77 "test2.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_13, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_13) #line 78 "test2.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 79 "test2.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 80 "test2.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_14 ) #line 81 "test2.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) #line 82 "test2.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_15, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_15 ) end if #line 82 "test2.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_15, pomp2_new_task) end if #line 83 "test2.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_15) end if #line 84 "test2.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_15, &pomp2_old_task) end if #line 85 "test2.f" !$omp this should be ignored by opari and the compiler call POMP2_Taskwait_begin(opari2_region_16, &pomp2_old_task, &opari2_ctc_16 ) #line 88 "test2.f" !$omp taskwait call POMP2_Taskwait_end(opari2_region_16, &pomp2_old_task) #line 89 "test2.f" call POMP2_Implicit_barrier_enter(opari2_region_14, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_14) #line 89 "test2.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, &pomp2_old_task) #line 90 "test2.f" ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 subroutine POMP2_Init_reg_000() include 'test2.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test2.f.opari.inc.out0000644000000000000000000000013214015716474020166 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.f.opari.inc.out0000644000175100001440000000712314015716474021364 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test2.f:26:26*escl=test2.f:79:7"// &"9**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test2.f:29:29*escl=test2.f:34:34**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"59*regionType=flush*sscl=test2.f:36:36*escl=test2.f:36:36**"// &"") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"61*regionType=barrier*sscl=test2.f:38:38*escl=test2.f:38:38"// &"**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"69*regionType=do*sscl=test2.f:40:40*escl=test2.f:46:46*hasO"// &"rdered=1**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"61*regionType=ordered*sscl=test2.f:42:42*escl=test2.f:44:44"// &"**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=sections*sscl=test2.f:48:48*escl=test2.f:53:5"// &"3*numSections=2**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"60*regionType=master*sscl=test2.f:55:55*escl=test2.f:57:57*"// &"*") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"62*regionType=critical*sscl=test2.f:59:59*escl=test2.f:61:6"// &"1**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"82*regionType=critical*sscl=test2.f:63:63*escl=test2.f:65:6"// &"5*criticalName=foobar**") INTEGER*8 opari2_region_11 CHARACTER*999 opari2_ctc_11 PARAMETER (opari2_ctc_11= &"60*regionType=atomic*sscl=test2.f:68:68*escl=test2.f:69:69*"// &"*") INTEGER*8 opari2_region_12 CHARACTER*999 opari2_ctc_12 PARAMETER (opari2_ctc_12= &"60*regionType=single*sscl=test2.f:71:71*escl=test2.f:73:73*"// &"*") INTEGER*8 opari2_region_13 CHARACTER*999 opari2_ctc_13 PARAMETER (opari2_ctc_13= &"63*regionType=workshare*sscl=test2.f:75:75*escl=test2.f:77:"// &"77**") INTEGER*8 opari2_region_14 CHARACTER*999 opari2_ctc_14 PARAMETER (opari2_ctc_14= &"62*regionType=parallel*sscl=test2.f:81:81*escl=test2.f:89:8"// &"9**") INTEGER*8 opari2_region_15 CHARACTER*999 opari2_ctc_15 PARAMETER (opari2_ctc_15= &"58*regionType=task*sscl=test2.f:82:82*escl=test2.f:84:84**""// &") INTEGER*8 opari2_region_16 CHARACTER*999 opari2_ctc_16 PARAMETER (opari2_ctc_16= &"62*regionType=taskwait*sscl=test2.f:88:88*escl=test2.f:88:8"// &"8**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10, & opari2_region_11, & opari2_region_12, & opari2_region_13, & opari2_region_14, & opari2_region_15, & opari2_region_16 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test2.f0000644000000000000000000000013214015716474015477 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.f0000644000175100001440000000353414015716474016677 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp flush(k) !$omp barrier !$omp do ordered do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered enddo !$omp end do !$omp sections !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp master write(*,*) "master" !$omp end master !$omp critical write(*,*) "critical" !$omp end critical !$omp critical(foobar) write(*,*) "critical(foobar)" !$omp end critical(foobar) ! do this atomic !$omp atomic i = i + 1 !$omp single write(*,*) "single" !$omp end single !$omp workshare a = b + c !$omp end workshare !$omp end parallel !$omp parallel !$omp task write(*,*) "task" !$omp end task !$omp this should be ignored by opari and the compiler !$omp taskwait !$omp end parallel ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 opari2-2.0.6/test/data/PaxHeaders.6153/test2.c.out0000644000000000000000000000013214015716474016302 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.c.out0000644000175100001440000001603414015716474017501 0ustar00builderusers00000000000000#include "test2.c.opari.inc" #line 1 "test2.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the basic instrumentation of all directives. */ #include #ifdef _OPENMP #endif int j; #line 27 "test2.c" #pragma omp threadprivate(j) int main() { int i; int k = 0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test2.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test2.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 37 "test2.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for %d\n", i); k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 42 "test2.c" { POMP2_Flush_enter( &opari2_region_3, opari2_ctc_3 ); #line 43 "test2.c" #pragma omp flush(k) POMP2_Flush_exit( &opari2_region_3 ); } #line 44 "test2.c" { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_4, &pomp2_old_task, opari2_ctc_4 ); #line 45 "test2.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_4, pomp2_old_task ); } #line 46 "test2.c" { POMP2_For_enter( &opari2_region_5, opari2_ctc_5 ); #line 47 "test2.c" #pragma omp for ordered nowait for(i=0; i<4; ++i) { { POMP2_Ordered_enter( &opari2_region_6, opari2_ctc_6 ); #line 49 "test2.c" #pragma omp ordered { POMP2_Ordered_begin( &opari2_region_6 ); #line 50 "test2.c" { printf("for %d\n", i); } POMP2_Ordered_end( &opari2_region_6 ); } POMP2_Ordered_exit( &opari2_region_6 ); } #line 53 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_For_exit( &opari2_region_5 ); } #line 54 "test2.c" { POMP2_Sections_enter( &opari2_region_7, opari2_ctc_7 ); #line 55 "test2.c" #pragma omp sections nowait { #line 57 "test2.c" #pragma omp section { POMP2_Section_begin( &opari2_region_7, opari2_ctc_7 ); #line 58 "test2.c" printf("section 1\n"); POMP2_Section_end( &opari2_region_7 ); } #line 59 "test2.c" #pragma omp section { POMP2_Section_begin( &opari2_region_7, opari2_ctc_7 ); #line 60 "test2.c" { printf("section 2\n"); } POMP2_Section_end( &opari2_region_7 ); } #line 61 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_7 ); } #line 62 "test2.c" #line 63 "test2.c" #pragma omp master { POMP2_Master_begin( &opari2_region_8, opari2_ctc_8 ); #line 64 "test2.c" { printf("master\n"); } POMP2_Master_end( &opari2_region_8 ); } #line 67 "test2.c" { POMP2_Critical_enter( &opari2_region_9, opari2_ctc_9 ); #line 68 "test2.c" #pragma omp critical { POMP2_Critical_begin( &opari2_region_9 ); #line 69 "test2.c" { printf("critical\n"); } POMP2_Critical_end( &opari2_region_9 ); } POMP2_Critical_exit( &opari2_region_9 ); } #line 72 "test2.c" { POMP2_Critical_enter( &opari2_region_10, opari2_ctc_10 ); #line 73 "test2.c" #pragma omp critical(foobar) { POMP2_Critical_begin( &opari2_region_10 ); #line 74 "test2.c" { printf("critical(foobar)\n"); } POMP2_Critical_end( &opari2_region_10 ); } POMP2_Critical_exit( &opari2_region_10 ); } #line 77 "test2.c" { POMP2_Atomic_enter( &opari2_region_11, opari2_ctc_11 ); #line 78 "test2.c" #pragma omp atomic /* -------------- */ /* do this atomic */ i += 1; POMP2_Atomic_exit( &opari2_region_11 ); } #line 82 "test2.c" /* -------------- */ { POMP2_Single_enter( &opari2_region_12, opari2_ctc_12 ); #line 84 "test2.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_12 ); #line 85 "test2.c" { printf("single\n"); } POMP2_Single_end( &opari2_region_12 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_12, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_12, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_12 ); } #line 88 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 89 "test2.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_13, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_13 ); #line 90 "test2.c" #pragma omp parallel POMP2_DLIST_00013 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_13 ); #line 91 "test2.c" { { int pomp2_if = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Task_create_begin( &opari2_region_14, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_14 ); #line 92 "test2.c" #pragma omp task POMP2_DLIST_00014 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Task_begin( &opari2_region_14, pomp2_new_task ); #line 93 "test2.c" { printf("task\n"); } if (pomp2_if) POMP2_Task_end( &opari2_region_14 ); } if (pomp2_if) POMP2_Task_create_end( &opari2_region_14, pomp2_old_task ); } } #line 96 "test2.c" { POMP2_Task_handle pomp2_old_task; POMP2_Taskwait_begin( &opari2_region_15, &pomp2_old_task, opari2_ctc_15 ); #line 97 "test2.c" #pragma omp taskwait POMP2_Taskwait_end( &opari2_region_15, pomp2_old_task ); } #line 98 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_13, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_13, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_13 ); } POMP2_Parallel_join( &opari2_region_13, pomp2_old_task ); } #line 99 "test2.c" // #pragma omp this should be ignored by opari and the compiler // #pragma this too } opari2-2.0.6/test/data/PaxHeaders.6153/test2.c.opari.inc.out0000644000000000000000000000013214015716474020163 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.c.opari.inc.out0000644000175100001440000000671014015716474021362 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5,opari2_region_6,opari2_region_7,opari2_region_8,opari2_region_9,opari2_region_10,opari2_region_11,opari2_region_12) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test2.c:33:33*escl=test2.c:88:88**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "56*regionType=for*sscl=test2.c:37:37*escl=test2.c:41:41**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "58*regionType=flush*sscl=test2.c:43:43*escl=test2.c:43:43**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "60*regionType=barrier*sscl=test2.c:45:45*escl=test2.c:45:45**" static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "69*regionType=for*sscl=test2.c:47:47*escl=test2.c:53:53*hasOrdered=1**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "60*regionType=ordered*sscl=test2.c:49:49*escl=test2.c:52:52**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "75*regionType=sections*sscl=test2.c:55:55*escl=test2.c:61:61*numSections=2**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "59*regionType=master*sscl=test2.c:63:63*escl=test2.c:66:66**" static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "61*regionType=critical*sscl=test2.c:68:68*escl=test2.c:71:71**" static OPARI2_Region_handle opari2_region_10 = NULL; #define opari2_ctc_10 "81*regionType=critical*sscl=test2.c:73:73*escl=test2.c:76:76*criticalName=foobar**" static OPARI2_Region_handle opari2_region_11 = NULL; #define opari2_ctc_11 "59*regionType=atomic*sscl=test2.c:78:78*escl=test2.c:81:81**" static OPARI2_Region_handle opari2_region_12 = NULL; #define opari2_ctc_12 "59*regionType=single*sscl=test2.c:84:84*escl=test2.c:87:87**" #define POMP2_DLIST_00013 shared(opari2_region_13,opari2_region_14,opari2_region_15) static OPARI2_Region_handle opari2_region_13 = NULL; #define opari2_ctc_13 "61*regionType=parallel*sscl=test2.c:90:90*escl=test2.c:98:98**" #define POMP2_DLIST_00014 shared(opari2_region_14) static OPARI2_Region_handle opari2_region_14 = NULL; #define opari2_ctc_14 "57*regionType=task*sscl=test2.c:92:92*escl=test2.c:95:95**" static OPARI2_Region_handle opari2_region_15 = NULL; #define opari2_ctc_15 "61*regionType=taskwait*sscl=test2.c:97:97*escl=test2.c:97:97**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); POMP2_Assign_handle( &opari2_region_10, opari2_ctc_10 ); POMP2_Assign_handle( &opari2_region_11, opari2_ctc_11 ); POMP2_Assign_handle( &opari2_region_12, opari2_ctc_12 ); POMP2_Assign_handle( &opari2_region_13, opari2_ctc_13 ); POMP2_Assign_handle( &opari2_region_14, opari2_ctc_14 ); POMP2_Assign_handle( &opari2_region_15, opari2_ctc_15 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test2.c0000644000000000000000000000013214015716474015474 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test2.c0000644000175100001440000000343214015716474016671 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the basic instrumentation of all directives. */ #include #ifdef _OPENMP #include #endif int j; #pragma omp threadprivate(j) int main() { int i; int k = 0; #pragma omp parallel { printf("parallel\n"); #pragma omp for for(i=0; i<4; ++i) { printf("for %d\n", i); k++; } #pragma omp flush(k) #pragma omp barrier #pragma omp for ordered for(i=0; i<4; ++i) { #pragma omp ordered { printf("for %d\n", i); } } #pragma omp sections { #pragma omp section printf("section 1\n"); #pragma omp section { printf("section 2\n"); } } #pragma omp master { printf("master\n"); } #pragma omp critical { printf("critical\n"); } #pragma omp critical(foobar) { printf("critical(foobar)\n"); } #pragma omp atomic /* -------------- */ /* do this atomic */ i += 1; /* -------------- */ #pragma omp single { printf("single\n"); } } #pragma omp parallel { #pragma omp task { printf("task\n"); } #pragma omp taskwait } // #pragma omp this should be ignored by opari and the compiler // #pragma this too } opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.f90.out0000644000000000000000000000013214015716474017324 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.f90.out0000644000175100001440000001033714015716474020523 0ustar00builderusers00000000000000 #line 1 "test1_tpd.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 !************************************************ !* The following pragmas should be instrumented * !************************************************ include 'test1_tpd.f90.opari.inc' #line 23 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 23 "test1_tpd.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_1) #line 24 "test1_tpd.f90" call POMP2_Barrier_enter(opari2_region_2,& pomp2_old_task, opari2_ctc_2 ) #line 24 "test1_tpd.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_2, pomp2_old_task) #line 25 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 25 "test1_tpd.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 26 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 27 "test1_tpd.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_3) #line 29 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Parallel_end(opari2_region_3) #line 29 "test1_tpd.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 31 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 32 "test1_tpd.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_4) #line 34 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 34 "test1_tpd.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 36 "test1_tpd.f90" !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 subroutine POMP2_Init_reg_000() include 'test1_tpd.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.f90.opari.inc.out0000644000000000000000000000013214015716474021205 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.f90.opari.inc.out0000644000175100001440000000233714015716474022405 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "72*regionType=parallel*sscl=test1_tpd.f90:23:23*escl=test1_tpd.f90:25:25**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "71*regionType=barrier*sscl=test1_tpd.f90:24:24*escl=test1_tpd.f90:24:24**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "72*regionType=parallel*sscl=test1_tpd.f90:27:28*escl=test1_tpd.f90:29:30**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "72*regionType=parallel*sscl=test1_tpd.f90:32:33*escl=test1_tpd.f90:34:35**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer( kind=8 ) pomp_tpd common /pomp_tpd/ pomp_tpd !$omp threadprivate(/pomp_tpd/) integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.f900000644000000000000000000000013214015716474016516 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.f900000644000175100001440000000254614015716474017720 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 !************************************************ !* The following pragmas should be instrumented * !************************************************ !$OMP PARALLEL !$OmP BaRRiEr !$omp end parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & !$OmP& parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & ! some comment !$OmP& parallel !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.f.out0000644000000000000000000000013214015716474017153 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.f.out0000644000175100001440000001377414015716474020362 0ustar00builderusers00000000000000 #line 1 "test1_tpd.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_tpd.f.opari.inc' #line 24 "test1_tpd.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_tpd.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_tpd.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_tpd.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_tpd.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_tpd.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_tpd.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_tpd.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_tpd.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_tpd.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_tpd.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_tpd.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_tpd.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_tpd.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_tpd.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_tpd.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_tpd.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_tpd.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_tpd.f" END DO #line 58 "test1_tpd.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_tpd.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_tpd.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_tpd.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_tpd.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_tpd.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_9 ) end if #line 63 "test1_tpd.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_9, pomp2_new_task) end if #line 64 "test1_tpd.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_9) end if #line 65 "test1_tpd.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_9, &pomp2_old_task) end if #line 66 "test1_tpd.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_tpd.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_tpd.f" call POMP2_Init() #line 70 "test1_tpd.f" call POMP2_Begin(opari2_region_10, opari2_ctc_10) #line 72 "test1_tpd.f" if .false. then call POMP2_End(opari2_region_10) #line 74 "test1_tpd.f" return end call POMP2_End(opari2_region_10) #line 77 "test1_tpd.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_tpd.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_tpd.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.f.opari.inc.out0000644000000000000000000000013214015716474021034 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.f.opari.inc.out0000644000175100001440000000475014015716474022235 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"70*regionType=parallel*sscl=test1_tpd.f:26:26*escl=test1_tp"// &"d.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"68*regionType=atomic*sscl=test1_tpd.f:28:28*escl=test1_tpd."// &"f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"70*regionType=critical*sscl=test1_tpd.f:31:31*escl=test1_tp"// &"d.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"67*regionType=flush*sscl=test1_tpd.f:35:35*escl=test1_tpd.f"// &":35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"68*regionType=master*sscl=test1_tpd.f:48:48*escl=test1_tpd."// &"f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"64*regionType=do*sscl=test1_tpd.f:52:52*escl=test1_tpd.f:58"// &":58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"69*regionType=ordered*sscl=test1_tpd.f:54:54*escl=test1_tpd"// &".f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"68*regionType=single*sscl=test1_tpd.f:59:59*escl=test1_tpd."// &"f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"66*regionType=task*sscl=test1_tpd.f:63:63*escl=test1_tpd.f:"// &"65:65**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"99*regionType=userRegion*sscl=test1_tpd.f:71:71*escl=test1_"// &"tpd.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp_tpd common /pomp_tpd/ pomp_tpd !$omp threadprivate(/pomp_tpd/) integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.f0000644000000000000000000000013214015716474016345 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.f0000644000175100001440000000310314015716474017535 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) INTEGER I,N,L,T c$omp parallel c$omp atomic N=0 c$omp critical N=1 c$omp end critical c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) c$omp master N=2 c$omp end master c$omp do DO I=1,5 c$omp ordered N=I c$omp end ordered END DO c$omp single N=6 c$omp end single c$omp task N=7 c$omp end task c$omp end parallel c$pomp inst init c$pomp inst begin(user_region) if .false. then c$pomp inst altend(user_region) return end c$pomp inst end(user_region) END SUBROUTINE end program test1_free opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.c.out0000644000000000000000000000013214015716474017150 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.c.out0000644000175100001440000000664114015716474020352 0ustar00builderusers00000000000000#include "test1_tpd.c.opari.inc" #line 1 "test1_tpd.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1_tpd.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) copyin(pomp_tpd) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1_tpd.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1_tpd.c" #line 36 "test1_tpd.c" //end { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 38 "test1_tpd.c" # pragma \ omp \ parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) copyin(pomp_tpd) { POMP2_Parallel_begin( &opari2_region_2 ); #line 41 "test1_tpd.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1_tpd.c" //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.c.opari.inc.out0000644000000000000000000000013214015716474021031 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.c.opari.inc.out0000644000175100001440000000133314015716474022224 0ustar00builderusers00000000000000#include #include extern int64_t __attribute__((aligned (16))) pomp_tpd; #pragma omp threadprivate(pomp_tpd) #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "69*regionType=parallel*sscl=test1_tpd.c:33:33*escl=test1_tpd.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "69*regionType=parallel*sscl=test1_tpd.c:38:40*escl=test1_tpd.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test1_tpd.c0000644000000000000000000000013214015716474016342 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_tpd.c0000644000175100001440000000372614015716474017545 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #include //just testing #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ #pragma omp parallel {{ printf("parallel 1...\n"); }} //end # /*complicated*/ pragma \ omp \ /*more*/ parallel { printf("parallel 2...\n"); } //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.6/test/data/PaxHeaders.6153/test1_free.f.out0000644000000000000000000000013214015716474017305 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_free.f.out0000644000175100001440000000202014015716474020472 0ustar00builderusers00000000000000 #line 1 "test1_free.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1_free IMPLICIT NONE SUBROUTINE foo(A,N) !The include should be inserted after this line. include 'test1_free.f.opari.inc' #line 25 "test1_free.f" REAL(q),POINTER :: A(:) INTEGER N IF (ASSOCIATED(A)) THEN ENDIF END SUBROUTINE SMART_ALLOCATE_REAL end program test1_free opari2-2.0.6/test/data/PaxHeaders.6153/test1_free.f.opari.inc.out0000644000000000000000000000013214015716474021166 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_free.f.opari.inc.out0000644000175100001440000000015614015716474022363 0ustar00builderusers00000000000000 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock opari2-2.0.6/test/data/PaxHeaders.6153/test1_free.f0000644000000000000000000000013214015716474016477 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_free.f0000644000175100001440000000167114015716474017677 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1_free IMPLICIT NONE SUBROUTINE foo(A,N) !The include should be inserted after this line. REAL(q),POINTER :: A(:) INTEGER N IF (ASSOCIATED(A)) THEN ENDIF END SUBROUTINE SMART_ALLOCATE_REAL end program test1_free opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.task.f.out0000644000000000000000000000013214015716474020730 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.task.f.out0000644000175100001440000001273514015716474022133 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_disable.f" #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.task.f.opari.inc.out0000644000000000000000000000013214015716474022611 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.task.f.opari.inc.out0000644000175100001440000000437014015716474024010 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.sync.f.out0000644000000000000000000000013214015716474020742 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.sync.f.out0000644000175100001440000000721514015716474022142 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 59 "test1_disable.f" #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_3, opari2_ctc_3) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_3) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_3) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.sync.f.opari.inc.out0000644000000000000000000000013214015716474022623 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.sync.f.opari.inc.out0000644000175100001440000000164414015716474024023 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.single.f.out0000644000000000000000000000013214015716474021247 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.single.f.out0000644000175100001440000001317614015716474022452 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.single.f.opari.inc.out0000644000000000000000000000013214015716474023130 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.single.f.opari.inc.out0000644000175100001440000000436614015716474024334 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.region.f.out0000644000000000000000000000013214015716474021251 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.region.f.out0000644000175100001440000001355214015716474022452 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(pomp2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &pomp2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(pomp2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(pomp2_region_2, &pomp2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(pomp2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(pomp2_region_3, &pomp2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(pomp2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(pomp2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(pomp2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(pomp2_region_4, &pomp2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(pomp2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(pomp2_region_5, &pomp2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(pomp2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(pomp2_region_6, &pomp2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(pomp2_region_7, &pomp2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(pomp2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(pomp2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(pomp2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(pomp2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_6, &pomp2_old_task) call POMP2_Do_exit(pomp2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(pomp2_region_8, &pomp2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(pomp2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(pomp2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(pomp2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_8, &pomp2_old_task) call POMP2_Single_exit(pomp2_region_8) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(pomp2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &pomp2_ctc_9 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(pomp2_region_9, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(pomp2_region_9) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(pomp2_region_9, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(pomp2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_1, &pomp2_old_task) call POMP2_Parallel_end(pomp2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(pomp2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" #line 71 "test1_disable.f" c$pomp inst begin(user_region) if .false. then #line 73 "test1_disable.f" c$pomp inst altend(user_region) return end #line 76 "test1_disable.f" c$pomp inst end(user_region) END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( pomp2_region_1, & pomp2_ctc_1 ) call POMP2_Assign_handle( pomp2_region_2, & pomp2_ctc_2 ) call POMP2_Assign_handle( pomp2_region_3, & pomp2_ctc_3 ) call POMP2_Assign_handle( pomp2_region_4, & pomp2_ctc_4 ) call POMP2_Assign_handle( pomp2_region_5, & pomp2_ctc_5 ) call POMP2_Assign_handle( pomp2_region_6, & pomp2_ctc_6 ) call POMP2_Assign_handle( pomp2_region_7, & pomp2_ctc_7 ) call POMP2_Assign_handle( pomp2_region_8, & pomp2_ctc_8 ) call POMP2_Assign_handle( pomp2_region_9, & pomp2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.region.f.opari.inc.out0000644000000000000000000000013214015716474023132 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.region.f.opari.inc.out0000644000175100001440000000426214015716474024331 0ustar00builderusers00000000000000 INTEGER*8 pomp2_region_1 CHARACTER*999 pomp2_ctc_1 PARAMETER (pomp2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 pomp2_region_2 CHARACTER*999 pomp2_ctc_2 PARAMETER (pomp2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 pomp2_region_3 CHARACTER*999 pomp2_ctc_3 PARAMETER (pomp2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 pomp2_region_4 CHARACTER*999 pomp2_ctc_4 PARAMETER (pomp2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 pomp2_region_5 CHARACTER*999 pomp2_ctc_5 PARAMETER (pomp2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 pomp2_region_6 CHARACTER*999 pomp2_ctc_6 PARAMETER (pomp2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 pomp2_region_7 CHARACTER*999 pomp2_ctc_7 PARAMETER (pomp2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 pomp2_region_8 CHARACTER*999 pomp2_ctc_8 PARAMETER (pomp2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 pomp2_region_9 CHARACTER*999 pomp2_ctc_9 PARAMETER (pomp2_ctc_9= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads common /cb000/ pomp2_region_1, & pomp2_region_2, & pomp2_region_3, & pomp2_region_4, & pomp2_region_5, & pomp2_region_6, & pomp2_region_7, & pomp2_region_8, & pomp2_region_9 opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.ordered.f.out0000644000000000000000000000013214015716474021412 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.ordered.f.out0000644000175100001440000001345414015716474022614 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.ordered.f.opari.inc.out0000644000000000000000000000013214015716474023273 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.ordered.f.opari.inc.out0000644000175100001440000000436514015716474024476 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.omp.f.out0000644000000000000000000000013214015716474020561 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.omp.f.out0000644000175100001440000000613614015716474021762 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_2, opari2_ctc_2) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_2) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_2) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_2, & opari2_ctc_2 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.omp.f.opari.inc.out0000644000000000000000000000013214015716474022442 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.omp.f.opari.inc.out0000644000175100001440000000130514015716474023634 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.master.f.out0000644000000000000000000000013214015716474021261 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.master.f.out0000644000175100001440000001365014015716474022461 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.master.f.opari.inc.out0000644000000000000000000000013214015716474023142 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.master.f.opari.inc.out0000644000175100001440000000436614015716474024346 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.locks.f.out0000644000000000000000000000013214015716474021101 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.locks.f.out0000644000175100001440000001416314015716474022301 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_9 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_9, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_9) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_9, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_10, opari2_ctc_10) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_10) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_10) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.locks.f.opari.inc.out0000644000000000000000000000013214015716474022762 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.locks.f.opari.inc.out0000644000175100001440000000473514015716474024166 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.flush.f.out0000644000000000000000000000013214015716474021107 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.flush.f.out0000644000175100001440000001365114015716474022310 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" #line 35 "test1_disable.f" c$omp flush CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.flush.f.opari.inc.out0000644000000000000000000000013214015716474022770 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.flush.f.opari.inc.out0000644000175100001440000000436714015716474024175 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.f0000644000000000000000000000013214015716474017161 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.f0000644000175100001440000000310314015716474020351 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) INTEGER I,N,L,T c$omp parallel c$omp atomic N=0 c$omp critical N=1 c$omp end critical c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) c$omp master N=2 c$omp end master c$omp do DO I=1,5 c$omp ordered N=I c$omp end ordered END DO c$omp single N=6 c$omp end single c$omp task N=7 c$omp end task c$omp end parallel c$pomp inst init c$pomp inst begin(user_region) if .false. then c$pomp inst altend(user_region) return end c$pomp inst end(user_region) END SUBROUTINE end program test1_free opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.critical.f.out0000644000000000000000000000013214015716474021560 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.critical.f.out0000644000175100001440000001345014015716474022756 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_3) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.critical.f.opari.inc.out0000644000000000000000000000013214015716474023441 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.critical.f.opari.inc.out0000644000175100001440000000436414015716474024643 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.atomic.f.out0000644000000000000000000000013214015716474021242 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.atomic.f.out0000644000175100001440000001364714015716474022450 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Critical_enter(opari2_region_2, &opari2_ctc_2 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_2) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_2) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_2) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_3) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.atomic.f.opari.inc.out0000644000000000000000000000013214015716474023123 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.atomic.f.opari.inc.out0000644000175100001440000000436614015716474024327 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.all.f.out0000644000000000000000000000013214015716474020536 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.all.f.out0000644000175100001440000000465714015716474021745 0ustar00builderusers00000000000000 #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T #line 26 "test1_disable.f" c$omp parallel #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task #line 67 "test1_disable.f" c$omp end parallel call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_1) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_1) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1_disable.all.f.opari.inc.out0000644000000000000000000000013214015716474022417 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_disable.all.f.opari.inc.out0000644000175100001440000000074014015716474023613 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1_a.f90.out0000644000000000000000000000013214015716474016755 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_a.f90.out0000644000175100001440000000717614015716474020163 0ustar00builderusers00000000000000 #line 1 "test1_a.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. module functions_module interface function if0(a, & ! ) a=b b ) ! end function integer(kind=4) :: if0, a end function if0 end interface interface subroutine is1(a) integer :: a end subroutine is1 end interface contains integer(kind=4) function mf0(a, & ! ) a=b b ) ! end function ! integer functionkind THIS IS TOO EVIL FOR NOW, WILL TAKE CARE OF LATER ! functionkind = 4 include 'test1_a.f90.opari.inc' #line 38 "test1_a.f90" write (*,*) "function mf0" mf0 = 5 return end function mf0 subroutine ms0 include 'test1_a.f90.opari.inc' #line 44 "test1_a.f90" write (*,*) "subroutine ms0" end subroutine ms0 end module mmm module module1 use functions_module contains subroutine r1() include 'test1_a.f90.opari.inc' #line 53 "test1_a.f90" write (*,*) "Subroutine 1" call f1() end subroutine r1 end module module1 integer function f0() implicit & none include 'test1_a.f90.opari.inc' #line 62 "test1_a.f90" double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 include 'test1_a.f90.opari.inc' #line 69 "test1_a.f90" write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface use mmm include 'test1_a.f90.opari.inc' #line 74 "test1_a.f90" integer :: a, result write (*,*) "function f1" f1 = a return end function f1 subroutine s1(a) include 'test1_a.f90.opari.inc' #line 81 "test1_a.f90" integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() contains subroutine ss1() include 'test1_a.f90.opari.inc' #line 88 "test1_a.f90" write (*,*) "subroutine ss1" end subroutine ss1 end subroutine s1 subroutine sub_bind(a) bind(c,name='sub_bind_f') include 'test1_a.f90.opari.inc' #line 93 "test1_a.f90" integer :: a write(*,*) "subroutine sub_bind(a) bind(c,name='sub_bind_f')" end subroutine sub_bind program otest use mmm use rename_test, bar => foo include 'test1_a.f90.opari.inc' #line 100 "test1_a.f90" integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) i = mf0() call s0 call s1(4) call ms0 end program otest opari2-2.0.6/test/data/PaxHeaders.6153/test1_a.f90.opari.inc.out0000644000000000000000000000013214015716474020636 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_a.f90.opari.inc.out0000644000175100001440000000021114015716474022023 0ustar00builderusers00000000000000 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock opari2-2.0.6/test/data/PaxHeaders.6153/test1_a.f900000644000000000000000000000013214015716474016147 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_a.f900000644000175100001440000000600414015716474017342 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. module functions_module interface function if0(a, & ! ) a=b b ) ! end function integer(kind=4) :: if0, a end function if0 end interface interface subroutine is1(a) integer :: a end subroutine is1 end interface contains integer(kind=4) function mf0(a, & ! ) a=b b ) ! end function ! integer functionkind THIS IS TOO EVIL FOR NOW, WILL TAKE CARE OF LATER ! functionkind = 4 write (*,*) "function mf0" mf0 = 5 return end function mf0 subroutine ms0 write (*,*) "subroutine ms0" end subroutine ms0 end module mmm module module1 use functions_module contains subroutine r1() write (*,*) "Subroutine 1" call f1() end subroutine r1 end module module1 integer function f0() implicit & none double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface use mmm integer :: a, result write (*,*) "function f1" f1 = a return end function f1 subroutine s1(a) integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() contains subroutine ss1() write (*,*) "subroutine ss1" end subroutine ss1 end subroutine s1 subroutine sub_bind(a) bind(c,name='sub_bind_f') integer :: a write(*,*) "subroutine sub_bind(a) bind(c,name='sub_bind_f')" end subroutine sub_bind program otest use mmm use rename_test, bar => foo integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) i = mf0() call s0 call s1(4) call ms0 end program otest opari2-2.0.6/test/data/PaxHeaders.6153/test1_a.f.out0000644000000000000000000000013214015716474016604 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_a.f.out0000644000175100001440000000357514015716474020011 0ustar00builderusers00000000000000 #line 1 "test1_a.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. integer function f0() implicit &none include 'test1_a.f.opari.inc' #line 23 "test1_a.f" double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 include 'test1_a.f.opari.inc' #line 30 "test1_a.f" write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface implicit >none include 'test1_a.f.opari.inc' #line 36 "test1_a.f" integer :: a, result write (*,*) "function f1" f1 = a return end function f1 recursive subroutine s1(a) implicit $none include 'test1_a.f.opari.inc' #line 45 "test1_a.f" integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() entry ss1() write (*,*) "entry ss1" end subroutine s1 program otest include 'test1_a.f.opari.inc' #line 55 "test1_a.f" integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) call s0 call s1(4) end program otest opari2-2.0.6/test/data/PaxHeaders.6153/test1_a.f.opari.inc.out0000644000000000000000000000013214015716474020465 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_a.f.opari.inc.out0000644000175100001440000000015614015716474021662 0ustar00builderusers00000000000000 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock opari2-2.0.6/test/data/PaxHeaders.6153/test1_a.f0000644000000000000000000000013214015716474015776 xustar0030 mtime=1614257468.255910034 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1_a.f0000644000175100001440000000311314015716474017167 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. integer function f0() implicit &none double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface implicit >none integer :: a, result write (*,*) "function f1" f1 = a return end function f1 recursive subroutine s1(a) implicit $none integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() entry ss1() write (*,*) "entry ss1" end subroutine s1 program otest integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) call s0 call s1(4) end program otest opari2-2.0.6/test/data/PaxHeaders.6153/test11.f90.out0000644000000000000000000000013114015716474016535 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test11.f90.out0000644000175100001440000000632414015716474017736 0ustar00builderusers00000000000000 #line 1 "test11.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Jie Jiang ! * ! * @brief Test worskshare directives. program test11 include 'test11.f90.opari.inc' #line 22 "test11.f90" call POMP2_Critical_enter(opari2_region_1, & opari2_ctc_1 ) #line 22 "test11.f90" !$omp critical call POMP2_Critical_begin(opari2_region_1) #line 23 "test11.f90" i = 2 call POMP2_Critical_end(opari2_region_1) #line 24 "test11.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_1) #line 25 "test11.f90" call POMP2_Atomic_enter(opari2_region_2, & opari2_ctc_2 ) #line 26 "test11.f90" !$omp atomic update i = 3 call POMP2_Atomic_exit(opari2_region_2) #line 28 "test11.f90" call POMP2_Workshare_enter(opari2_region_3, & opari2_ctc_3 ) #line 29 "test11.f90" !$omp workshare i = 4 !$omp critical i = 5 !$omp end critical !$omp atomic update i = 6 #line 36 "test11.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) #line 37 "test11.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 38 "test11.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) call POMP2_Workshare_enter(opari2_region_4, & opari2_ctc_4 ) #line 38 "test11.f90" !$omp workshare i = 7 !$omp critical i = 8 !$omp end critical !$omp atomic update i = 9 #line 45 "test11.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_4) call POMP2_Parallel_end(opari2_region_4) #line 45 "test11.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 46 "test11.f90" end program test11 subroutine POMP2_Init_reg_000() include 'test11.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test11.f90.opari.inc.out0000644000000000000000000000013114015716474020416 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test11.f90.opari.inc.out0000644000175100001440000000215414015716474021614 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "66*regionType=critical*sscl=test11.f90:22:22*escl=test11.f90:24:24**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "64*regionType=atomic*sscl=test11.f90:26:26*escl=test11.f90:27:27**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "67*regionType=workshare*sscl=test11.f90:29:29*escl=test11.f90:36:36**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "75*regionType=parallelworkshare*sscl=test11.f90:38:38*escl=test11.f90:45:45**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test11.f900000644000000000000000000000013114015716474015727 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test11.f900000644000175100001440000000206414015716474017125 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Jie Jiang ! * ! * @brief Test worskshare directives. program test11 !$OMP critical i = 2 !$omp end critical !$OMP atomic update i = 3 !$OMP workshare i = 4 !$OMP critical i = 5 !$omp end critical !$OMP atomic update i = 6 !$OMP end workshare !$OMP PARALLEL WORKSHARE i = 7 !$OMP critical i = 8 !$omp end critical !$OMP atomic update i = 9 !$OMP END PARALLEL WORKSHARE end program test11 opari2-2.0.6/test/data/PaxHeaders.6153/test10.f90.out0000644000000000000000000000013114015716474016534 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test10.f90.out0000644000175100001440000004044314015716474017735 0ustar00builderusers00000000000000 #line 1 "test10.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Bernd Mohr, Peter Philippen ! * ! * @brief Tests user instrumentation directives. program test10 include 'test10.f90.opari.inc' #line 22 "test10.f90" integer (kind=omp_lock_kind) lock call POMP2_Init() #line 25 "test10.f90" call POMP2_Off() #line 27 "test10.f90" #line 29 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 30 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 31 "test10.f90" i = 1 call POMP2_Parallel_end(opari2_region_1) !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 33 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 34 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) !$omp do do 100, i = 2, 50 j++ 100 continue #line 38 "test10.f90" !$omp end do call POMP2_Parallel_end(opari2_region_2) #line 38 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 39 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 40 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) !$omp do do i = 3, 50 j++ enddo #line 44 "test10.f90" !$omp end do call POMP2_Parallel_end(opari2_region_3) #line 44 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 45 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 45 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp sections !$omp section i = 4 !$omp section i = 5 #line 50 "test10.f90" !$omp end sections call POMP2_Parallel_end(opari2_region_4) #line 50 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 51 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_5 ) #line 53 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) !$omp workshare i = 6 #line 55 "test10.f90" !$omp end workshare call POMP2_Parallel_end(opari2_region_5) #line 55 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, pomp2_old_task) #line 56 "test10.f90" !$omp single i = 7 !$omp end single !$omp master i = 8 !$omp end master !$omp critical i = 9 !$omp end critical !$omp critical test i = 10 !$omp end critical test !$omp workshare i = 11 !$omp end workshare !$omp workshare i = 12 !$omp end workshare nowait !$omp ordered i = 13 !$omp end ordered !$omp task i = 14 !$omp end task !$omp taskwait !$omp atomic update i = 15 !$omp sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$omp barrier !$omp flush !$omp threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) #line 112 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_6,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_6 ) #line 113 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) #line 114 "test10.f90" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_6,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, pomp2_old_task) call POMP2_Parallel_end(opari2_region_6) #line 115 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, pomp2_old_task) #line 116 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_7 ) #line 117 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, & opari2_ctc_7 ) #line 117 "test10.f90" !$omp do do 100, i = 2, 50 j++ 100 continue #line 121 "test10.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 121 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, pomp2_old_task) #line 122 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 123 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Do_enter(opari2_region_8, & opari2_ctc_8 ) #line 123 "test10.f90" !$omp do do i = 3, 50 j++ enddo #line 127 "test10.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Do_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 127 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 128 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 128 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Sections_enter(opari2_region_9) #line 128 "test10.f90" !$omp sections #line 129 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_9, & opari2_ctc_9 ) #line 130 "test10.f90" i = 4 call POMP2_Section_end(opari2_region_9) #line 131 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_9, & opari2_ctc_9 ) #line 132 "test10.f90" i = 5 call POMP2_Section_end(opari2_region_9) #line 133 "test10.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Sections_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 133 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 134 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 136 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) call POMP2_Workshare_enter(opari2_region_10, & opari2_ctc_10 ) #line 136 "test10.f90" !$omp workshare i = 6 #line 138 "test10.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_10) call POMP2_Parallel_end(opari2_region_10) #line 138 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 139 "test10.f90" call POMP2_Single_enter(opari2_region_11, & opari2_ctc_11 ) #line 140 "test10.f90" !$omp single call POMP2_Single_begin(opari2_region_11) #line 141 "test10.f90" i = 7 call POMP2_Single_end(opari2_region_11) #line 142 "test10.f90" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_11,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, pomp2_old_task) call POMP2_Single_exit(opari2_region_11) #line 143 "test10.f90" #line 144 "test10.f90" !$omp master call POMP2_Master_begin(opari2_region_12, & opari2_ctc_12 ) #line 145 "test10.f90" i = 8 call POMP2_Master_end(opari2_region_12) #line 146 "test10.f90" !$omp end master call POMP2_Critical_enter(opari2_region_13, & opari2_ctc_13 ) #line 148 "test10.f90" !$omp critical call POMP2_Critical_begin(opari2_region_13) #line 149 "test10.f90" i = 9 call POMP2_Critical_end(opari2_region_13) #line 150 "test10.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_13) #line 151 "test10.f90" call POMP2_Critical_enter(opari2_region_14, & opari2_ctc_14 ) #line 152 "test10.f90" !$omp critical test call POMP2_Critical_begin(opari2_region_14) #line 153 "test10.f90" i = 10 call POMP2_Critical_end(opari2_region_14) #line 154 "test10.f90" !$omp end critical test call POMP2_Critical_exit(opari2_region_14) #line 155 "test10.f90" call POMP2_Workshare_enter(opari2_region_15, & opari2_ctc_15 ) #line 156 "test10.f90" !$omp workshare i = 11 #line 158 "test10.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_15,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_15) #line 159 "test10.f90" call POMP2_Workshare_enter(opari2_region_16, & opari2_ctc_16 ) #line 160 "test10.f90" !$omp workshare i = 12 #line 162 "test10.f90" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_16) #line 163 "test10.f90" call POMP2_Ordered_enter(opari2_region_17, & opari2_ctc_17 ) #line 164 "test10.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_17) #line 165 "test10.f90" i = 13 call POMP2_Ordered_end(opari2_region_17) #line 166 "test10.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_17) #line 167 "test10.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_18, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_18 ) end if #line 168 "test10.f90" !$omp task if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_18, pomp2_new_task) end if #line 169 "test10.f90" i = 14 if (pomp2_if) then call POMP2_Task_end(opari2_region_18) end if #line 170 "test10.f90" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_18, pomp2_old_task) end if #line 171 "test10.f90" call POMP2_Taskwait_begin(opari2_region_19,& pomp2_old_task, opari2_ctc_19 ) #line 172 "test10.f90" !$omp taskwait call POMP2_Taskwait_end(opari2_region_19, pomp2_old_task) #line 173 "test10.f90" call POMP2_Atomic_enter(opari2_region_20, & opari2_ctc_20 ) #line 174 "test10.f90" !$omp atomic update i = 15 call POMP2_Atomic_exit(opari2_region_20) #line 176 "test10.f90" call POMP2_Sections_enter(opari2_region_21, & opari2_ctc_21 ) #line 177 "test10.f90" !$omp sections i = 16 #line 179 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_21, & opari2_ctc_21 ) #line 180 "test10.f90" i = 17 call POMP2_Section_end(opari2_region_21) #line 181 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_21, & opari2_ctc_21 ) #line 182 "test10.f90" i = 18 call POMP2_Section_end(opari2_region_21) #line 183 "test10.f90" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_21) #line 184 "test10.f90" call POMP2_Barrier_enter(opari2_region_22,& pomp2_old_task, opari2_ctc_22 ) #line 185 "test10.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_22, pomp2_old_task) #line 186 "test10.f90" call POMP2_Flush_enter(opari2_region_23, & opari2_ctc_23 ) #line 187 "test10.f90" !$omp flush call POMP2_Flush_exit(opari2_region_23) #line 188 "test10.f90" #line 189 "test10.f90" !$omp threadprivate( i ) call POMP2_Init_lock( lock ) call POMP2_Destroy_lock( lock ) call POMP2_Finalize() #line 196 "test10.f90" end program test10 subroutine POMP2_Init_reg_000() include 'test10.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) call POMP2_Assign_handle( opari2_region_17, & opari2_ctc_17 ) call POMP2_Assign_handle( opari2_region_18, & opari2_ctc_18 ) call POMP2_Assign_handle( opari2_region_19, & opari2_ctc_19 ) call POMP2_Assign_handle( opari2_region_20, & opari2_ctc_20 ) call POMP2_Assign_handle( opari2_region_21, & opari2_ctc_21 ) call POMP2_Assign_handle( opari2_region_22, & opari2_ctc_22 ) call POMP2_Assign_handle( opari2_region_23, & opari2_ctc_23 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test10.f90.opari.inc.out0000644000000000000000000000013114015716474020415 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test10.f90.opari.inc.out0000644000175100001440000001227514015716474021620 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "66*regionType=parallel*sscl=test10.f90:30:30*escl=test10.f90:32:32**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "68*regionType=paralleldo*sscl=test10.f90:34:34*escl=test10.f90:38:38**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "68*regionType=paralleldo*sscl=test10.f90:40:40*escl=test10.f90:44:44**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "74*regionType=parallelsections*sscl=test10.f90:45:45*escl=test10.f90:50:50**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "75*regionType=parallelworkshare*sscl=test10.f90:53:53*escl=test10.f90:55:55**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "70*regionType=parallel*sscl=test10.f90:113:113*escl=test10.f90:115:115**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "72*regionType=paralleldo*sscl=test10.f90:117:117*escl=test10.f90:121:121**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "72*regionType=paralleldo*sscl=test10.f90:123:123*escl=test10.f90:127:127**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "78*regionType=parallelsections*sscl=test10.f90:128:128*escl=test10.f90:133:133**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "79*regionType=parallelworkshare*sscl=test10.f90:136:136*escl=test10.f90:138:138**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "68*regionType=single*sscl=test10.f90:140:140*escl=test10.f90:142:142**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "68*regionType=master*sscl=test10.f90:144:144*escl=test10.f90:146:146**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "70*regionType=critical*sscl=test10.f90:148:148*escl=test10.f90:150:150**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "70*regionType=critical*sscl=test10.f90:152:152*escl=test10.f90:154:154**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "71*regionType=workshare*sscl=test10.f90:156:156*escl=test10.f90:158:158**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "71*regionType=workshare*sscl=test10.f90:160:160*escl=test10.f90:162:162**" INTEGER( KIND=8 ) :: opari2_region_17 CHARACTER (LEN=999), parameter :: opari2_ctc_17 =& "69*regionType=ordered*sscl=test10.f90:164:164*escl=test10.f90:166:166**" INTEGER( KIND=8 ) :: opari2_region_18 CHARACTER (LEN=999), parameter :: opari2_ctc_18 =& "66*regionType=task*sscl=test10.f90:168:168*escl=test10.f90:170:170**" INTEGER( KIND=8 ) :: opari2_region_19 CHARACTER (LEN=999), parameter :: opari2_ctc_19 =& "70*regionType=taskwait*sscl=test10.f90:172:172*escl=test10.f90:172:172**" INTEGER( KIND=8 ) :: opari2_region_20 CHARACTER (LEN=999), parameter :: opari2_ctc_20 =& "68*regionType=atomic*sscl=test10.f90:174:174*escl=test10.f90:175:175**" INTEGER( KIND=8 ) :: opari2_region_21 CHARACTER (LEN=999), parameter :: opari2_ctc_21 =& "84*regionType=sections*sscl=test10.f90:177:177*escl=test10.f90:183:183*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_22 CHARACTER (LEN=999), parameter :: opari2_ctc_22 =& "69*regionType=barrier*sscl=test10.f90:185:185*escl=test10.f90:185:185**" INTEGER( KIND=8 ) :: opari2_region_23 CHARACTER (LEN=999), parameter :: opari2_ctc_23 =& "67*regionType=flush*sscl=test10.f90:187:187*escl=test10.f90:187:187**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16,& opari2_region_17,& opari2_region_18,& opari2_region_19,& opari2_region_20,& opari2_region_21,& opari2_region_22,& opari2_region_23 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test10.f900000644000000000000000000000013114015716474015726 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test10.f900000644000175100001440000000571014015716474017125 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Bernd Mohr, Peter Philippen ! * ! * @brief Tests user instrumentation directives. program test10 integer (kind=omp_lock_kind) lock !$POMP INST INIT !$POMP INST OFF !$POMP NOINSTRUMENT !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$OMP PARALLEL DO do 100, i = 2, 50 j++ 100 continue !$OMP END PARALLEL DO !$OMP PARALLEL DO do i = 3, 50 j++ enddo !$OMP PARALLEL SECTIONS !$OMP SECTION i = 4 !$OMP SECTION i = 5 !$OMP END PARALLEL SECTIONS !$OMP PARALLEL WORKSHARE i = 6 !$OMP END PARALLEL WORKSHARE !$OMP SINGLE i = 7 !$OMP END SINGLE !$OMP MASTER i = 8 !$OMP END MASTER !$OMP critical i = 9 !$omp end critical !$OMP critical test i = 10 !$omp end critical test !$OMP workshare i = 11 !$OMP end workshare !$OMP workshare i = 12 !$OMP end workshare nowait !$OMP ordered i = 13 !$OMP end ordered !$OMP task i = 14 !$OMP end task !$OMP taskwait !$OMP atomic update i = 15 !$OMP sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$OMP barrier !$OMP flush !$OMP threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) !$POMP INSTRUMENT !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$OMP PARALLEL DO do 100, i = 2, 50 j++ 100 continue !$OMP END PARALLEL DO !$OMP PARALLEL DO do i = 3, 50 j++ enddo !$OMP PARALLEL SECTIONS !$OMP SECTION i = 4 !$OMP SECTION i = 5 !$OMP END PARALLEL SECTIONS !$OMP PARALLEL WORKSHARE i = 6 !$OMP END PARALLEL WORKSHARE !$OMP SINGLE i = 7 !$OMP END SINGLE !$OMP MASTER i = 8 !$OMP END MASTER !$OMP critical i = 9 !$omp end critical !$OMP critical test i = 10 !$omp end critical test !$OMP workshare i = 11 !$OMP end workshare !$OMP workshare i = 12 !$OMP end workshare nowait !$OMP ordered i = 13 !$OMP end ordered !$OMP task i = 14 !$OMP end task !$OMP taskwait !$OMP atomic update i = 15 !$OMP sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$OMP barrier !$OMP flush !$OMP threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) !$POMP INST FINALIZE end program test10 opari2-2.0.6/test/data/PaxHeaders.6153/test1.prep.c.out0000644000000000000000000000013114015716474017245 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.prep.c.out0000644000175100001440000007510114015716474020445 0ustar00builderusers00000000000000# 1 "test1.input.c" # 1 "/private/peterp/work/test/scorep/prep//" # 1 "" # 1 "test1.input.c" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 1 3 4 # 1 "/usr/include/stdint.h" 1 3 4 # 25 "/usr/include/stdint.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 345 "/usr/include/features.h" 3 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 # 346 "/usr/include/features.h" 2 3 4 # 375 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 385 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 386 "/usr/include/sys/cdefs.h" 2 3 4 # 376 "/usr/include/features.h" 2 3 4 # 399 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 10 "/usr/include/gnu/stubs.h" 3 4 # 1 "/usr/include/gnu/stubs-64.h" 1 3 4 # 11 "/usr/include/gnu/stubs.h" 2 3 4 # 400 "/usr/include/features.h" 2 3 4 # 26 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wchar.h" 1 3 4 # 22 "/usr/include/bits/wchar.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 23 "/usr/include/bits/wchar.h" 2 3 4 # 27 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/stdint.h" 2 3 4 # 36 "/usr/include/stdint.h" 3 4 typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long int int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; # 65 "/usr/include/stdint.h" 3 4 typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; typedef long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; typedef unsigned long int uint_least64_t; # 90 "/usr/include/stdint.h" 3 4 typedef signed char int_fast8_t; typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; # 103 "/usr/include/stdint.h" 3 4 typedef unsigned char uint_fast8_t; typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; # 119 "/usr/include/stdint.h" 3 4 typedef long int intptr_t; typedef unsigned long int uintptr_t; # 134 "/usr/include/stdint.h" 3 4 typedef long int intmax_t; typedef unsigned long int uintmax_t; # 4 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 2 3 4 # 2 "test1.input.c" 2 # 1 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 1 # 29 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 1 3 4 # 34 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 3 4 typedef struct { unsigned char _x[4] __attribute__((__aligned__(4))); } omp_lock_t; typedef struct { unsigned char _x[16] __attribute__((__aligned__(8))); } omp_nest_lock_t; typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; extern "C" { extern void omp_set_num_threads (int) throw (); extern int omp_get_num_threads (void) throw (); extern int omp_get_max_threads (void) throw (); extern int omp_get_thread_num (void) throw (); extern int omp_get_num_procs (void) throw (); extern int omp_in_parallel (void) throw (); extern void omp_set_dynamic (int) throw (); extern int omp_get_dynamic (void) throw (); extern void omp_set_nested (int) throw (); extern int omp_get_nested (void) throw (); extern void omp_init_lock (omp_lock_t *) throw (); extern void omp_destroy_lock (omp_lock_t *) throw (); extern void omp_set_lock (omp_lock_t *) throw (); extern void omp_unset_lock (omp_lock_t *) throw (); extern int omp_test_lock (omp_lock_t *) throw (); extern void omp_init_nest_lock (omp_nest_lock_t *) throw (); extern void omp_destroy_nest_lock (omp_nest_lock_t *) throw (); extern void omp_set_nest_lock (omp_nest_lock_t *) throw (); extern void omp_unset_nest_lock (omp_nest_lock_t *) throw (); extern int omp_test_nest_lock (omp_nest_lock_t *) throw (); extern double omp_get_wtime (void) throw (); extern double omp_get_wtick (void) throw (); void omp_set_schedule (omp_sched_t, int) throw (); void omp_get_schedule (omp_sched_t *, int *) throw (); int omp_get_thread_limit (void) throw (); void omp_set_max_active_levels (int) throw (); int omp_get_max_active_levels (void) throw (); int omp_get_level (void) throw (); int omp_get_ancestor_thread_num (int) throw (); int omp_get_team_size (int) throw (); int omp_get_active_level (void) throw (); int omp_in_final (void) throw (); } # 30 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 150 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long int ptrdiff_t; # 213 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long unsigned int size_t; # 33 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 extern "C" { # 54 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" typedef void* POMP2_Region_handle; typedef int64_t POMP2_Task_handle; # 66 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern size_t POMP2_Get_num_regions( void ); extern void POMP2_Init_regions( void ); extern const char* POMP2_Get_opari2_version( void ); extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); extern void POMP2_Finalize( void ); extern void POMP2_Init( void ); extern void POMP2_Off( void ); extern void POMP2_On( void ); extern void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_End( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); # 163 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 179 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 195 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); # 211 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); # 294 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); # 318 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 336 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); # 452 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 468 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); # 505 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 523 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); # 558 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 575 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 586 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern int POMP2_Lib_get_max_threads( void ); extern void POMP2_Init_lock( omp_lock_t* s ); extern void POMP2_Destroy_lock( omp_lock_t* s ); extern void POMP2_Set_lock( omp_lock_t* s ); extern void POMP2_Unset_lock( omp_lock_t* s ); extern int POMP2_Test_lock( omp_lock_t* s ); extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); } # 3 "test1.input.c" 2 #include "test1.prep.c.opari.inc" # 1 "/private/peterp/work/test/scorep/prep/test1.c" # 21 "/private/peterp/work/test/scorep/prep/test1.c" # 1 "/usr/include/stdio.h" 1 3 4 # 29 "/usr/include/stdio.h" 3 4 extern "C" { # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 34 "/usr/include/stdio.h" 2 3 4 # 1 "/usr/include/bits/types.h" 1 3 4 # 27 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/bits/types.h" 2 3 4 typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; typedef signed long int __int64_t; typedef unsigned long int __uint64_t; typedef long int __quad_t; typedef unsigned long int __u_quad_t; # 130 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 131 "/usr/include/bits/types.h" 2 3 4 typedef unsigned long int __dev_t; typedef unsigned int __uid_t; typedef unsigned int __gid_t; typedef unsigned long int __ino_t; typedef unsigned long int __ino64_t; typedef unsigned int __mode_t; typedef unsigned long int __nlink_t; typedef long int __off_t; typedef long int __off64_t; typedef int __pid_t; typedef struct { int __val[2]; } __fsid_t; typedef long int __clock_t; typedef unsigned long int __rlim_t; typedef unsigned long int __rlim64_t; typedef unsigned int __id_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef int __daddr_t; typedef int __key_t; typedef int __clockid_t; typedef void * __timer_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef long int __blkcnt64_t; typedef unsigned long int __fsblkcnt_t; typedef unsigned long int __fsblkcnt64_t; typedef unsigned long int __fsfilcnt_t; typedef unsigned long int __fsfilcnt64_t; typedef long int __fsword_t; typedef long int __ssize_t; typedef long int __syscall_slong_t; typedef unsigned long int __syscall_ulong_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; typedef long int __intptr_t; typedef unsigned int __socklen_t; # 36 "/usr/include/stdio.h" 2 3 4 # 44 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 64 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 74 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" 1 3 4 # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" 1 3 4 # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 16 "/usr/include/_G_config.h" 2 3 4 # 1 "/usr/include/wchar.h" 1 3 4 # 82 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" 2 3 4 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 33 "/usr/include/libio.h" 2 3 4 # 50 "/usr/include/libio.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 1 3 4 # 40 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 51 "/usr/include/libio.h" 2 3 4 # 145 "/usr/include/libio.h" 3 4 struct _IO_jump_t; struct _IO_FILE; # 155 "/usr/include/libio.h" 3 4 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 178 "/usr/include/libio.h" 3 4 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 246 "/usr/include/libio.h" 3 4 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 294 "/usr/include/libio.h" 3 4 __off64_t _offset; # 303 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 339 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 435 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) throw (); extern int _IO_ferror (_IO_FILE *__fp) throw (); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) throw (); extern void _IO_funlockfile (_IO_FILE *) throw (); extern int _IO_ftrylockfile (_IO_FILE *) throw (); # 465 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) throw (); # 527 "/usr/include/libio.h" 3 4 } # 75 "/usr/include/stdio.h" 2 3 4 typedef __gnuc_va_list va_list; # 90 "/usr/include/stdio.h" 3 4 typedef __off_t off_t; typedef __off64_t off64_t; typedef __ssize_t ssize_t; typedef _G_fpos_t fpos_t; typedef _G_fpos64_t fpos64_t; # 164 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" 1 3 4 # 165 "/usr/include/stdio.h" 2 3 4 extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (const char *__filename) throw (); extern int rename (const char *__old, const char *__new) throw (); extern int renameat (int __oldfd, const char *__old, int __newfd, const char *__new) throw (); extern FILE *tmpfile (void) ; # 205 "/usr/include/stdio.h" 3 4 extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) throw () ; extern char *tmpnam_r (char *__s) throw () ; # 227 "/usr/include/stdio.h" 3 4 extern char *tempnam (const char *__dir, const char *__pfx) throw () __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 252 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 262 "/usr/include/stdio.h" 3 4 extern int fcloseall (void); extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; # 295 "/usr/include/stdio.h" 3 4 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, const char *__modes) throw () ; extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) throw () ; extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) throw () ; extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) throw (); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) throw (); extern void setlinebuf (FILE *__stream) throw (); extern int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...); extern int printf (const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, const char *__restrict __format, ...) throw (); extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw (); extern int snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) ; extern int scanf (const char *__restrict __format, ...) ; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) throw (); # 463 "/usr/include/stdio.h" 3 4 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) ; extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) ; extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__scanf__, 2, 0))); # 522 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 550 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 561 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 594 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 638 "/usr/include/stdio.h" 3 4 extern char *gets (char *__s) __attribute__ ((__deprecated__)); # 649 "/usr/include/stdio.h" 3 4 extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 665 "/usr/include/stdio.h" 3 4 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (const char *__restrict __s, FILE *__restrict __stream); extern int puts (const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s); # 726 "/usr/include/stdio.h" 3 4 extern int fputs_unlocked (const char *__restrict __s, FILE *__restrict __stream); # 737 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream); extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 773 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 792 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, const fpos_t *__pos); # 815 "/usr/include/stdio.h" 3 4 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); extern void clearerr (FILE *__stream) throw (); extern int feof (FILE *__stream) throw () ; extern int ferror (FILE *__stream) throw () ; extern void clearerr_unlocked (FILE *__stream) throw (); extern int feof_unlocked (FILE *__stream) throw () ; extern int ferror_unlocked (FILE *__stream) throw () ; extern void perror (const char *__s); # 1 "/usr/include/bits/sys_errlist.h" 1 3 4 # 26 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern const char *const sys_errlist[]; extern int _sys_nerr; extern const char *const _sys_errlist[]; # 854 "/usr/include/stdio.h" 2 3 4 extern int fileno (FILE *__stream) throw () ; extern int fileno_unlocked (FILE *__stream) throw () ; # 873 "/usr/include/stdio.h" 3 4 extern FILE *popen (const char *__command, const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) throw (); extern char *cuserid (char *__s); struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, __gnuc_va_list __args) throw () __attribute__ ((__format__ (__printf__, 2, 0))); extern void flockfile (FILE *__stream) throw (); extern int ftrylockfile (FILE *__stream) throw () ; extern void funlockfile (FILE *__stream) throw (); # 943 "/usr/include/stdio.h" 3 4 } # 22 "/private/peterp/work/test/scorep/prep/test1.c" 2 int main() { printf("before...\n"); # 33 "/private/peterp/work/test/scorep/prep/test1.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1.c" # 33 "/private/peterp/work/test/scorep/prep/test1.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1.c" # 39 "/private/peterp/work/test/scorep/prep/test1.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 39 "test1.c" #pragma omp parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 40 "test1.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1.c" # 76 "/private/peterp/work/test/scorep/prep/test1.c" { } # 88 "/private/peterp/work/test/scorep/prep/test1.c" { printf("#pragma omp parallel"); printf("\" and continuation in the next line #pragma omp parallel\" and especially strange escape character usage\n"); } printf("after...\n"); printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.6/test/data/PaxHeaders.6153/test1.prep.c.opari.inc.out0000644000000000000000000000013114015716474021126 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.311910212 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.prep.c.opari.inc.out0000644000175100001440000000114314015716474022321 0ustar00builderusers00000000000000#define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = (OPARI2_Region_handle)0; #define opari2_ctc_1 "61*regionType=parallel*sscl=test1.c:33:33*escl=test1.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = (OPARI2_Region_handle)0; #define opari2_ctc_2 "61*regionType=parallel*sscl=test1.c:39:39*escl=test1.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test1.prep.c0000644000000000000000000000013114015716474016437 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.prep.c0000644000175100001440000007232114015716474017640 0ustar00builderusers00000000000000# 1 "test1.input.c" # 1 "/private/peterp/work/test/scorep/prep//" # 1 "" # 1 "test1.input.c" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 1 3 4 # 1 "/usr/include/stdint.h" 1 3 4 # 25 "/usr/include/stdint.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 345 "/usr/include/features.h" 3 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 # 346 "/usr/include/features.h" 2 3 4 # 375 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 385 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 386 "/usr/include/sys/cdefs.h" 2 3 4 # 376 "/usr/include/features.h" 2 3 4 # 399 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 10 "/usr/include/gnu/stubs.h" 3 4 # 1 "/usr/include/gnu/stubs-64.h" 1 3 4 # 11 "/usr/include/gnu/stubs.h" 2 3 4 # 400 "/usr/include/features.h" 2 3 4 # 26 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wchar.h" 1 3 4 # 22 "/usr/include/bits/wchar.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 23 "/usr/include/bits/wchar.h" 2 3 4 # 27 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/stdint.h" 2 3 4 # 36 "/usr/include/stdint.h" 3 4 typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long int int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; # 65 "/usr/include/stdint.h" 3 4 typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; typedef long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; typedef unsigned long int uint_least64_t; # 90 "/usr/include/stdint.h" 3 4 typedef signed char int_fast8_t; typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; # 103 "/usr/include/stdint.h" 3 4 typedef unsigned char uint_fast8_t; typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; # 119 "/usr/include/stdint.h" 3 4 typedef long int intptr_t; typedef unsigned long int uintptr_t; # 134 "/usr/include/stdint.h" 3 4 typedef long int intmax_t; typedef unsigned long int uintmax_t; # 4 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 2 3 4 # 2 "test1.input.c" 2 # 1 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 1 # 29 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 1 3 4 # 34 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 3 4 typedef struct { unsigned char _x[4] __attribute__((__aligned__(4))); } omp_lock_t; typedef struct { unsigned char _x[16] __attribute__((__aligned__(8))); } omp_nest_lock_t; typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; extern "C" { extern void omp_set_num_threads (int) throw (); extern int omp_get_num_threads (void) throw (); extern int omp_get_max_threads (void) throw (); extern int omp_get_thread_num (void) throw (); extern int omp_get_num_procs (void) throw (); extern int omp_in_parallel (void) throw (); extern void omp_set_dynamic (int) throw (); extern int omp_get_dynamic (void) throw (); extern void omp_set_nested (int) throw (); extern int omp_get_nested (void) throw (); extern void omp_init_lock (omp_lock_t *) throw (); extern void omp_destroy_lock (omp_lock_t *) throw (); extern void omp_set_lock (omp_lock_t *) throw (); extern void omp_unset_lock (omp_lock_t *) throw (); extern int omp_test_lock (omp_lock_t *) throw (); extern void omp_init_nest_lock (omp_nest_lock_t *) throw (); extern void omp_destroy_nest_lock (omp_nest_lock_t *) throw (); extern void omp_set_nest_lock (omp_nest_lock_t *) throw (); extern void omp_unset_nest_lock (omp_nest_lock_t *) throw (); extern int omp_test_nest_lock (omp_nest_lock_t *) throw (); extern double omp_get_wtime (void) throw (); extern double omp_get_wtick (void) throw (); void omp_set_schedule (omp_sched_t, int) throw (); void omp_get_schedule (omp_sched_t *, int *) throw (); int omp_get_thread_limit (void) throw (); void omp_set_max_active_levels (int) throw (); int omp_get_max_active_levels (void) throw (); int omp_get_level (void) throw (); int omp_get_ancestor_thread_num (int) throw (); int omp_get_team_size (int) throw (); int omp_get_active_level (void) throw (); int omp_in_final (void) throw (); } # 30 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 150 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long int ptrdiff_t; # 213 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long unsigned int size_t; # 33 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 extern "C" { # 54 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" typedef void* POMP2_Region_handle; typedef int64_t POMP2_Task_handle; # 66 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern size_t POMP2_Get_num_regions( void ); extern void POMP2_Init_regions( void ); extern const char* POMP2_Get_opari2_version( void ); extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); extern void POMP2_Finalize( void ); extern void POMP2_Init( void ); extern void POMP2_Off( void ); extern void POMP2_On( void ); extern void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_End( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); # 163 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 179 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 195 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); # 211 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); # 294 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); # 318 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 336 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); # 452 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 468 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); # 505 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 523 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); # 558 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 575 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 586 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern int POMP2_Lib_get_max_threads( void ); extern void POMP2_Init_lock( omp_lock_t* s ); extern void POMP2_Destroy_lock( omp_lock_t* s ); extern void POMP2_Set_lock( omp_lock_t* s ); extern void POMP2_Unset_lock( omp_lock_t* s ); extern int POMP2_Test_lock( omp_lock_t* s ); extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); } # 3 "test1.input.c" 2 ___POMP2_INCLUDE___ # 1 "/private/peterp/work/test/scorep/prep/test1.c" # 21 "/private/peterp/work/test/scorep/prep/test1.c" # 1 "/usr/include/stdio.h" 1 3 4 # 29 "/usr/include/stdio.h" 3 4 extern "C" { # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 34 "/usr/include/stdio.h" 2 3 4 # 1 "/usr/include/bits/types.h" 1 3 4 # 27 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/bits/types.h" 2 3 4 typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; typedef signed long int __int64_t; typedef unsigned long int __uint64_t; typedef long int __quad_t; typedef unsigned long int __u_quad_t; # 130 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 131 "/usr/include/bits/types.h" 2 3 4 typedef unsigned long int __dev_t; typedef unsigned int __uid_t; typedef unsigned int __gid_t; typedef unsigned long int __ino_t; typedef unsigned long int __ino64_t; typedef unsigned int __mode_t; typedef unsigned long int __nlink_t; typedef long int __off_t; typedef long int __off64_t; typedef int __pid_t; typedef struct { int __val[2]; } __fsid_t; typedef long int __clock_t; typedef unsigned long int __rlim_t; typedef unsigned long int __rlim64_t; typedef unsigned int __id_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef int __daddr_t; typedef int __key_t; typedef int __clockid_t; typedef void * __timer_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef long int __blkcnt64_t; typedef unsigned long int __fsblkcnt_t; typedef unsigned long int __fsblkcnt64_t; typedef unsigned long int __fsfilcnt_t; typedef unsigned long int __fsfilcnt64_t; typedef long int __fsword_t; typedef long int __ssize_t; typedef long int __syscall_slong_t; typedef unsigned long int __syscall_ulong_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; typedef long int __intptr_t; typedef unsigned int __socklen_t; # 36 "/usr/include/stdio.h" 2 3 4 # 44 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 64 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 74 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" 1 3 4 # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" 1 3 4 # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 16 "/usr/include/_G_config.h" 2 3 4 # 1 "/usr/include/wchar.h" 1 3 4 # 82 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" 2 3 4 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 33 "/usr/include/libio.h" 2 3 4 # 50 "/usr/include/libio.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 1 3 4 # 40 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 51 "/usr/include/libio.h" 2 3 4 # 145 "/usr/include/libio.h" 3 4 struct _IO_jump_t; struct _IO_FILE; # 155 "/usr/include/libio.h" 3 4 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 178 "/usr/include/libio.h" 3 4 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 246 "/usr/include/libio.h" 3 4 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 294 "/usr/include/libio.h" 3 4 __off64_t _offset; # 303 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 339 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 435 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) throw (); extern int _IO_ferror (_IO_FILE *__fp) throw (); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) throw (); extern void _IO_funlockfile (_IO_FILE *) throw (); extern int _IO_ftrylockfile (_IO_FILE *) throw (); # 465 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) throw (); # 527 "/usr/include/libio.h" 3 4 } # 75 "/usr/include/stdio.h" 2 3 4 typedef __gnuc_va_list va_list; # 90 "/usr/include/stdio.h" 3 4 typedef __off_t off_t; typedef __off64_t off64_t; typedef __ssize_t ssize_t; typedef _G_fpos_t fpos_t; typedef _G_fpos64_t fpos64_t; # 164 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" 1 3 4 # 165 "/usr/include/stdio.h" 2 3 4 extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (const char *__filename) throw (); extern int rename (const char *__old, const char *__new) throw (); extern int renameat (int __oldfd, const char *__old, int __newfd, const char *__new) throw (); extern FILE *tmpfile (void) ; # 205 "/usr/include/stdio.h" 3 4 extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) throw () ; extern char *tmpnam_r (char *__s) throw () ; # 227 "/usr/include/stdio.h" 3 4 extern char *tempnam (const char *__dir, const char *__pfx) throw () __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 252 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 262 "/usr/include/stdio.h" 3 4 extern int fcloseall (void); extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; # 295 "/usr/include/stdio.h" 3 4 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, const char *__modes) throw () ; extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) throw () ; extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) throw () ; extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) throw (); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) throw (); extern void setlinebuf (FILE *__stream) throw (); extern int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...); extern int printf (const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, const char *__restrict __format, ...) throw (); extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw (); extern int snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) ; extern int scanf (const char *__restrict __format, ...) ; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) throw (); # 463 "/usr/include/stdio.h" 3 4 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) ; extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) ; extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__scanf__, 2, 0))); # 522 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 550 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 561 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 594 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 638 "/usr/include/stdio.h" 3 4 extern char *gets (char *__s) __attribute__ ((__deprecated__)); # 649 "/usr/include/stdio.h" 3 4 extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 665 "/usr/include/stdio.h" 3 4 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (const char *__restrict __s, FILE *__restrict __stream); extern int puts (const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s); # 726 "/usr/include/stdio.h" 3 4 extern int fputs_unlocked (const char *__restrict __s, FILE *__restrict __stream); # 737 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream); extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 773 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 792 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, const fpos_t *__pos); # 815 "/usr/include/stdio.h" 3 4 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); extern void clearerr (FILE *__stream) throw (); extern int feof (FILE *__stream) throw () ; extern int ferror (FILE *__stream) throw () ; extern void clearerr_unlocked (FILE *__stream) throw (); extern int feof_unlocked (FILE *__stream) throw () ; extern int ferror_unlocked (FILE *__stream) throw () ; extern void perror (const char *__s); # 1 "/usr/include/bits/sys_errlist.h" 1 3 4 # 26 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern const char *const sys_errlist[]; extern int _sys_nerr; extern const char *const _sys_errlist[]; # 854 "/usr/include/stdio.h" 2 3 4 extern int fileno (FILE *__stream) throw () ; extern int fileno_unlocked (FILE *__stream) throw () ; # 873 "/usr/include/stdio.h" 3 4 extern FILE *popen (const char *__command, const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) throw (); extern char *cuserid (char *__s); struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, __gnuc_va_list __args) throw () __attribute__ ((__format__ (__printf__, 2, 0))); extern void flockfile (FILE *__stream) throw (); extern int ftrylockfile (FILE *__stream) throw () ; extern void funlockfile (FILE *__stream) throw (); # 943 "/usr/include/stdio.h" 3 4 } # 22 "/private/peterp/work/test/scorep/prep/test1.c" 2 int main() { printf("before...\n"); # 33 "/private/peterp/work/test/scorep/prep/test1.c" #pragma omp parallel # 33 "/private/peterp/work/test/scorep/prep/test1.c" {{ printf("parallel 1...\n"); }} # 39 "/private/peterp/work/test/scorep/prep/test1.c" #pragma omp parallel { printf("parallel 2...\n"); } # 76 "/private/peterp/work/test/scorep/prep/test1.c" { } # 88 "/private/peterp/work/test/scorep/prep/test1.c" { printf("#pragma omp parallel"); printf("\" and continuation in the next line #pragma omp parallel\" and especially strange escape character usage\n"); } printf("after...\n"); printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.6/test/data/PaxHeaders.6153/test1.f90.out0000644000000000000000000000013114015716474016454 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.f90.out0000644000175100001440000001065114015716474017653 0ustar00builderusers00000000000000 #line 1 "test1.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 implicit none include 'test1.f90.opari.inc' #line 23 "test1.f90" integer a, b !************************************************ !* The following pragmas should be instrumented * !************************************************ pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 28 "test1.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 29 "test1.f90" call POMP2_Barrier_enter(opari2_region_2,& pomp2_old_task, opari2_ctc_2 ) #line 29 "test1.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_2, pomp2_old_task) #line 30 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 30 "test1.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 31 "test1.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 32 "test1.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 34 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Parallel_end(opari2_region_3) #line 34 "test1.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 36 "test1.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 37 "test1.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 39 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 39 "test1.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 41 "test1.f90" !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" !************************************** !* Test for handling lines with * !* multiple statements separated by ; * !************************************** a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; end program test1 subroutine POMP2_Init_reg_000() include 'test1.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1.f90.opari.inc.out0000644000000000000000000000013114015716474020335 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.f90.opari.inc.out0000644000175100001440000000213314015716474021530 0ustar00builderusers00000000000000 INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test1.f90:28:28*escl=test1.f90:30:30**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "63*regionType=barrier*sscl=test1.f90:29:29*escl=test1.f90:29:29**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "64*regionType=parallel*sscl=test1.f90:32:33*escl=test1.f90:34:35**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test1.f90:37:38*escl=test1.f90:39:40**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ) :: pomp2_lib_get_max_threads logical :: pomp2_test_lock integer ( kind=4 ) :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1.f900000644000000000000000000000013114015716474015646 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.f900000644000175100001440000000325314015716474017045 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 implicit none integer a, b !************************************************ !* The following pragmas should be instrumented * !************************************************ !$OMP PARALLEL !$OmP BaRRiEr !$omp end parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & !$OmP& parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & ! some comment !$OmP& parallel !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" !************************************** !* Test for handling lines with * !* multiple statements separated by ; * !************************************** a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; end program test1 opari2-2.0.6/test/data/PaxHeaders.6153/test1.f.out0000644000000000000000000000013114015716474016303 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.f.out0000644000175100001440000001227214015716474017503 0ustar00builderusers00000000000000 #line 1 "test1.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 include 'test1.f.opari.inc' #line 20 "test1.f" integer a !************************************************ !* The following pragmas should be instrumented * !************************************************ pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 24 "test1.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test1.f" call POMP2_Barrier_enter(opari2_region_2, &pomp2_old_task, &opari2_ctc_2 ) #line 25 "test1.f" *$omp barrier call POMP2_Barrier_exit(opari2_region_2, &pomp2_old_task) #line 26 "test1.f" call POMP2_Barrier_enter(opari2_region_3, &pomp2_old_task, &opari2_ctc_3 ) #line 26 "test1.f" !$omp barrier call POMP2_Barrier_exit(opari2_region_3, &pomp2_old_task) #line 27 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 27 "test1.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 28 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 29 "test1.f" !$omp parallel !$omp& default(shared) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 31 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 31 "test1.f" !$omp end !$omp+ parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 33 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_5 ) #line 34 "test1.f" !$omp parallel !$omp& default(shared) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 36 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 36 "test1.f" !$omp end !$omp+ !$omp+ parallel call POMP2_Parallel_join(opari2_region_5, &pomp2_old_task) #line 39 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_6, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_6 ) #line 40 "test1.f" !$omp parallel !$omp&private(a) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) #line 42 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_6) #line 45 "test1.f" !$omp end !$omp¶llel call POMP2_Parallel_join(opari2_region_6, &pomp2_old_task) #line 47 "test1.f" !************************************** !* The following should be ignored * !************************************** c $omp no !!$omp mo c comment ! $omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 subroutine POMP2_Init_reg_000() include 'test1.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.6/test/data/PaxHeaders.6153/test1.f.opari.inc.out0000644000000000000000000000013114015716474020164 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.f.opari.inc.out0000644000175100001440000000273114015716474021363 0ustar00builderusers00000000000000 INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test1.f:24:24*escl=test1.f:27:2"// &"7**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"61*regionType=barrier*sscl=test1.f:25:25*escl=test1.f:25:25"// &"**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"61*regionType=barrier*sscl=test1.f:26:26*escl=test1.f:26:26"// &"**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test1.f:29:30*escl=test1.f:31:3"// &"2**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"62*regionType=parallel*sscl=test1.f:34:35*escl=test1.f:36:3"// &"8**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"62*regionType=parallel*sscl=test1.f:40:41*escl=test1.f:45:4"// &"6**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6 integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.6/test/data/PaxHeaders.6153/test1.f0000644000000000000000000000013114015716474015475 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.f0000644000175100001440000000275514015716474016702 0ustar00builderusers00000000000000! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 integer a !************************************************ !* The following pragmas should be instrumented * !************************************************ c$OMP PARALLEL *$oMp BaRrIeR !$OmP Barrier !$omp end parallel !$OmP parallel !$OmP& default(shared) !$OmP end !$OmP+ parallel !$OmP parallel !$OmP& default(shared) !$OmP end !$OmP+ !$OmP+ parallel !$omp parallel !comment will be deleted !more comment, which will be deleted !$omp&private(a) !and some more comment... !$omp end !$omp¶llel !************************************** !* The following should be ignored * !************************************** c $omp no !!$omp mo c comment ! $omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 opari2-2.0.6/test/data/PaxHeaders.6153/test1.c.out0000644000000000000000000000013114015716474016300 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.c.out0000644000175100001440000001033614015716474017477 0ustar00builderusers00000000000000#include "test1.c.opari.inc" #line 1 "test1.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1.c" #line 36 "test1.c" //end { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 38 "test1.c" # pragma \ omp \ parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 41 "test1.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1.c" //************************************************* //* The treatment of else blocks doesn't work yet * //************************************************* /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* { */ /* printf("parallel 3 thread 0 ...\n"); */ /* } */ /* else */ /* { */ /* printf("parallel 3 other threads ...\n"); */ /* } */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* printf("parallel 4 thread 0 ...\n"); */ /* else */ /* printf("parallel 4 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 5 thread 0 ...\n"); */ /* else printf("parallel 5 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 6 thread 0 ...\n"); else printf("parallel 6 other threads ...\n"); */ //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.6/test/data/PaxHeaders.6153/test1.c.opari.inc.out0000644000000000000000000000013114015716474020161 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.120005097 opari2-2.0.6/test/data/test1.c.opari.inc.out0000644000175100001440000000113414015716474021354 0ustar00builderusers00000000000000#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test1.c:33:33*escl=test1.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "61*regionType=parallel*sscl=test1.c:38:40*escl=test1.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.6/test/data/PaxHeaders.6153/test1.c0000644000000000000000000000013114015716474015472 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/test1.c0000644000175100001440000000553114015716474016672 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #include //just testing #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ #pragma omp parallel {{ printf("parallel 1...\n"); }} //end # /*complicated*/ pragma \ omp \ /*more*/ parallel { printf("parallel 2...\n"); } //************************************************* //* The treatment of else blocks doesn't work yet * //************************************************* /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* { */ /* printf("parallel 3 thread 0 ...\n"); */ /* } */ /* else */ /* { */ /* printf("parallel 3 other threads ...\n"); */ /* } */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* printf("parallel 4 thread 0 ...\n"); */ /* else */ /* printf("parallel 4 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 5 thread 0 ...\n"); */ /* else printf("parallel 5 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 6 thread 0 ...\n"); else printf("parallel 6 other threads ...\n"); */ //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.6/test/data/PaxHeaders.6153/jacobi0000644000000000000000000000013114015716474015440 xustar0029 mtime=1614257468.25191002 30 atime=1614257501.252015069 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/0000755000175100001440000000000014015716474016711 5ustar00builderusers00000000000000opari2-2.0.6/test/data/jacobi/PaxHeaders.6153/F770000644000000000000000000000013114015716474016003 xustar0029 mtime=1614257468.25191002 30 atime=1614257501.252015069 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/0000755000175100001440000000000014015716474017254 5ustar00builderusers00000000000000opari2-2.0.6/test/data/jacobi/F77/PaxHeaders.6153/main.f0000644000000000000000000000013114015716474017153 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/main.f0000644000175100001440000001007714015716474020354 0ustar00builderusers00000000000000 program main ************************************************************ * program to solve a finite difference * discretization of Helmholtz equation : * (d2/dx2)u + (d2/dy2)u - alpha u = f * using Jacobi iterative method. * * Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998 * Author: Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998 * * Directives are used in this code to achieve paralleism. * All do loops are parallized with default 'static' scheduling. * * Input : n - grid dimension in x direction * m - grid dimension in y direction * alpha - Helmholtz constant (always greater than 0.0) * tol - error tolerance for iterative solver * relax - Successice over relaxation parameter * mits - Maximum iterations for iterative solver * * On output * : u(n,m) - Dependent variable (solutions) * : f(n,m) - Right hand side function ************************************************************* implicit none integer n,m,mits double precision tol,relax,alpha common /idat/ n,m,mits common /fdat/tol,alpha,relax * * Fix input for test cases * n=200 m=200 alpha=0.8 relax=1 tol=1e-10 mits=5 * * Calls a driver routine * call driver stop end subroutine driver ( ) ************************************************************* * Subroutine driver () * This is where the arrays are allocated and initialzed. * * Working varaibles/arrays * dx - grid spacing in x direction * dy - grid spacing in y direction ************************************************************* implicit none double precision omp_get_wtime integer n,m,mits double precision tol,relax,alpha double precision r0 double precision c0 common /idat/ n,m,mits common /fdat/tol,alpha,relax double precision u(n,m),f(n,m),dx,dy * Initialize data call initialize (n,m,alpha,dx,dy,u,f) * Solve Helmholtz equation r0 = omp_get_wtime() call jacobi (n,m,dx,dy,alpha,relax,u,f,tol,mits) r0 = omp_get_wtime() - r0 write (*,'(a,f12.6)') ' elapsed time usage ', r0 write (*,'(a,f12.6)') ' MFlop/s ', & 1d-6*mits*(m-2d0)*(n-2d0)*13d0 / r0 * Check error between exact solution call error_check (n,m,alpha,dx,dy,u,f) return end subroutine initialize (n,m,alpha,dx,dy,u,f) ****************************************************** * Initializes data * Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) * ****************************************************** implicit none integer n,m double precision u(n,m),f(n,m),dx,dy,alpha integer i,j, xx,yy double precision PI parameter (PI=3.1415926) dx = 2.0 / (n-1) dy = 2.0 / (m-1) * Initilize initial condition and RHS C$omp parallel do private(i,j) do j = 1,m do i = 1,n xx = -1.0 + dx * dble(i-1) ! -1 < x < 1 yy = -1.0 + dy * dble(j-1) ! -1 < y < 1 u(i,j) = 0.0 f(i,j) = -alpha *(1.0-xx*xx)*(1.0-yy*yy) & - 2.0*(1.0-xx*xx)-2.0*(1.0-yy*yy) enddo enddo C$omp end parallel do * return end subroutine error_check (n,m,alpha,dx,dy,u,f) implicit none ************************************************************ * Checks error between numerical and exact solution * ************************************************************ integer n,m double precision u(n,m),f(n,m),dx,dy,alpha integer i,j double precision xx,yy,temp,error dx = 2.0 / (n-1) dy = 2.0 / (m-1) error = 0.0 do j = 1,m do i = 1,n xx = -1.0d0 + dx * dble(i-1) yy = -1.0d0 + dy * dble(j-1) temp = u(i,j) - (1.0-xx*xx)*(1.0-yy*yy) error = error + temp*temp enddo enddo error = sqrt(error)/dble(n*m) print *, 'Solution Error : ',error return end opari2-2.0.6/test/data/jacobi/F77/PaxHeaders.6153/jacobi_test_3.out0000644000000000000000000000013114015716474021321 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/jacobi_test_3.out0000644000175100001440000000330614015716474022517 0ustar00builderusers00000000000000 3: begin parallel 3: enter for 3: enter implicit barrier of paralleldo 3: exit implicit barrier of paralleldo 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.6/test/data/jacobi/F77/PaxHeaders.6153/jacobi_test_2.out0000644000000000000000000000013114015716474021320 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/jacobi_test_2.out0000644000175100001440000000330614015716474022516 0ustar00builderusers00000000000000 2: begin parallel 2: enter for 2: enter implicit barrier of paralleldo 2: exit implicit barrier of paralleldo 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.6/test/data/jacobi/F77/PaxHeaders.6153/jacobi_test_1.out0000644000000000000000000000013114015716474021317 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/jacobi_test_1.out0000644000175100001440000000330614015716474022515 0ustar00builderusers00000000000000 1: begin parallel 1: enter for 1: enter implicit barrier of paralleldo 1: exit implicit barrier of paralleldo 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.6/test/data/jacobi/F77/PaxHeaders.6153/jacobi_test_0.out0000644000000000000000000000013114015716474021316 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/jacobi_test_0.out0000644000175100001440000000371614015716474022521 0ustar00builderusers00000000000000 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of paralleldo 0: exit implicit barrier of paralleldo 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.6/test/data/jacobi/F77/PaxHeaders.6153/jacobi.f0000644000000000000000000000013114015716474017456 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F77/jacobi.f0000644000175100001440000000454114015716474020656 0ustar00builderusers00000000000000 subroutine jacobi (n,m,dx,dy,alpha,omega,u,f,tol,maxit) ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tol Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** implicit none integer n,m,maxit double precision dx,dy,f(n,m),u(n,m),alpha, tol,omega * * Local variables * integer i,j,k,k_local double precision error,resid,rsum,ax,ay,b double precision error_local, uold(n,m) real ta,tb,tc,td,te,ta1,ta2,tb1,tb2,tc1,tc2,td1,td2 real te1,te2 * * Initialize coefficients ax = 1.0/(dx*dx) ! X-direction coef ay = 1.0/(dy*dy) ! Y-direction coef b = -2.0/(dx*dx)-2.0/(dy*dy) - alpha ! Central coeff error = 10.0 * tol k = 1 do while (k.le.maxit .and. error.gt. tol) error = 0.0 * Copy new solution into old C$omp parallel private(j,i) C$omp do do j=1,m do i=1,n uold(i,j) = u(i,j) enddo enddo C$omp end do * Compute stencil, residual, & update C$omp do reduction(+:error) do j = 2,m-1 do i = 2,n-1 * Evaluate residual resid = (ax*(uold(i-1,j) + uold(i+1,j)) & + ay*(uold(i,j-1) + uold(i,j+1)) & + b * uold(i,j) - f(i,j))/b * Update solution u(i,j) = uold(i,j) - omega * resid * Accumulate residual error error = error + resid*resid end do enddo C$omp end do C$omp end parallel * Error check k = k + 1 error = sqrt(error)/dble(n*m) * enddo ! End iteration loop * print *, 'Total Number of Iterations ', k print *, 'Residual ', error return end opari2-2.0.6/test/data/jacobi/PaxHeaders.6153/F0000644000000000000000000000013114015716474015625 xustar0029 mtime=1614257468.25191002 30 atime=1614257501.252015069 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/0000755000175100001440000000000014015716474017076 5ustar00builderusers00000000000000opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/main.F900000644000000000000000000000013114015716474017106 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/main.F900000644000175100001440000001713614015716474020312 0ustar00builderusers00000000000000program MAIN !*********************************************************************** ! program to solve a finite difference * ! discretization of Helmholtz equation : * ! (d2/dx2)u + (d2/dy2)u - alpha u = f * ! using Jacobi iterative method. * ! * ! Modified: Abdelali Malih, Aachen University (RWTH), 2007 * ! Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998 * ! Author : Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998 * ! * ! Directives are used in this code to achieve paralleism. * ! All do loops are parallized with default 'static' scheduling. * ! * ! Input : n - grid dimension in x direction * ! m - grid dimension in y direction * ! alpha - Helmholtz constant (always greater than 0.0) * ! tol - error tolerance for iterative solver * ! relax - Successice over relaxation parameter * ! mits - Maximum iterations for iterative solver * ! * ! On output * ! : u(n,m) - Dependent variable (solutions) * ! : f(n,m) - Right hand side function * !*********************************************************************** use VariableDef use JacobiMod #ifdef _OPENMP use omp_lib #endif implicit none double precision get_wtime TYPE(JacobiData) :: myData ! sets default values or reads from stdin ! * inits MPI and OpenMP if needed ! * distribute MPI data, calculate MPI bounds ! */ call Init(mydata) if ( allocated(myData%afU) .and. allocated(myData%afF) ) then ! /* matrix init */ call InitializeMatrix(myData) ! /* starting timer */ mydata%fTimeStart = get_wtime() ! /* running calculations */ call Jacobi(myData) ! /* stopping timer */ mydata%fTimeStop = get_wtime() ! /* error checking */ call CheckError(myData) ! /* print result summary */ call PrintResults(myData) else write (*,*) " Memory allocation failed ...\n" end if ! /* cleanup */ call Finish(myData) end program MAIN subroutine Init (myData) use VariableDef use omp_lib implicit none type(JacobiData), intent(inout) :: myData character(len=8) :: env = ' ' integer :: ITERATIONS = 5 integer :: iErr, i call get_environment_variable("ITERATIONS", env) if (len_trim(env) > 0) then read(env,*,iostat=iErr) i if ((iErr == 0) .and. (i > 0)) then ITERATIONS=i else print*, "Ignoring ITERATIONS=", env endif endif #ifdef _OPENMP write (6,*) 'Jacobi', omp_get_max_threads(), 'OpenMP-', _OPENMP, ' thread(s)' #else write (6,*) 'Jacobi (serial)' #endif !/* default medium */ myData%iCols = 2000 myData%iRows = 2000 myData%fAlpha = 0.8 myData%fRelax = 1.0 myData%fTolerance = 1e-10 myData%iIterMax = ITERATIONS write (*,327) "-> matrix size: ", myData%iCols, myData%iRows write (*,329) "-> alpha: " , myData%fAlpha write (*,329) "-> relax: ", myData%fRelax write (*,329) "-> tolerance: ", myData%fTolerance write (*,328) "-> iterations: ", myData%iIterMax flush(6) 327 format (A22, I10, ' x ', I10) 328 format (A22, I10) 329 format (A22, F10.6) ! /* MPI values, set to defaults to avoid data inconsistency */ myData%iMyRank = 0 myData%iNumProcs = 1 myData%iRowFirst = 0 myData%iRowLast = myData%iRows - 1 ! /* memory allocation for serial & omp */ allocate(myData%afU (0 : myData%iCols -1, 0 : myData%iRows -1)) allocate(myData%afF (0 : myData%iCols -1, 0 : myData%iRows -1)) ! /* calculate dx and dy */ myData%fDx = 2.0d0 / DBLE(myData%iCols - 1) myData%fDy = 2.0d0 / DBLE(myData%iRows - 1) myData%iIterCount = 0 end subroutine Init subroutine InitializeMatrix (myData) !********************************************************************* ! Initializes data * ! Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) * ! * !********************************************************************* use VariableDef implicit none type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, xx, yy !.. Intrinsic Functions .. intrinsic DBLE ! Initilize initial condition and RHS !$omp parallel do private (j, i, xx, yy) do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols -1 xx = INT(-1.0 + myData%fDx*DBLE(i)) ! -1 < x < 1 yy = INT(-1.0 + myData%fDy*DBLE(j)) ! -1 < y < 1 myData%afU(i, j) = 0.0d0 myData%afF(i, j) = - myData%fAlpha * (1.0d0 - DBLE(xx*xx)) & * (1.0d0 - DBLE(yy*yy)) - 2.0d0 * (1.0d0 - DBLE(xx*xx)) & - 2.0d0 * (1.0d0 - DBLE(yy*yy)) end do end do !$omp end parallel do end subroutine InitializeMatrix subroutine Finish(myData) use VariableDef implicit none integer :: iErr type(JacobiData), intent(inout) :: myData deallocate (myData%afU) deallocate (myData%afF) end subroutine Finish subroutine PrintResults(myData) use VariableDef implicit none type(JacobiData), intent(inout) :: myData if (myData%iMyRank == 0) then write (*,328) " Number of iterations : ", myData%iIterCount write (*,329) " Residual : ", myData%fResidual write (*,329) " Solution Error : ", myData%fError write (*,330) " Elapsed Time : ", & myData%fTimeStop - myData%fTimeStart write (*,330) " MFlops/s : ", & 0.000013 * DBLE (myData%iIterCount) & * DBLE((myData%iCols - 2) * (myData%iRows - 2)) & / (myData%fTimeStop - myData%fTimeStart) flush(6) 328 format (A, I8) 329 format (A, F15.12) 330 format (A, F15.6) end if end subroutine PrintResults subroutine CheckError(myData) use VariableDef implicit none type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, iErr double precision :: error, temp, xx, yy !.. Intrinsic Functions .. intrinsic DBLE, SQRT ! ... Executable Statements ... error = 0.0d0 do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols -1 xx = -1.0d0 + myData%fDx * DBLE(i) yy = -1.0d0 + myData%fDy * DBLE(j) temp = myData%afU(i, j) - (1.0d0-xx*xx)*(1.0d0-yy*yy) error = error + temp*temp end do end do myData%fError = sqrt(error) / DBLE(myData%iCols * myData%iRows) end subroutine CheckError double precision function get_wtime() #ifdef _OPENMP use omp_lib get_wtime = omp_get_wtime() #else real, dimension(2) :: tarray get_wtime = dtime(tarray) #endif return end function get_wtime opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/jacobi_test_3.out0000644000000000000000000000013114015716474021143 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/jacobi_test_3.out0000644000175100001440000000330614015716474022341 0ustar00builderusers00000000000000 3: begin parallel 3: enter for 3: enter implicit barrier of paralleldo 3: exit implicit barrier of paralleldo 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/jacobi_test_2.out0000644000000000000000000000013114015716474021142 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/jacobi_test_2.out0000644000175100001440000000330614015716474022340 0ustar00builderusers00000000000000 2: begin parallel 2: enter for 2: enter implicit barrier of paralleldo 2: exit implicit barrier of paralleldo 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/jacobi_test_1.out0000644000000000000000000000013114015716474021141 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/jacobi_test_1.out0000644000175100001440000000330614015716474022337 0ustar00builderusers00000000000000 1: begin parallel 1: enter for 1: enter implicit barrier of paralleldo 1: exit implicit barrier of paralleldo 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/jacobi_test_0.out0000644000000000000000000000013114015716474021140 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/jacobi_test_0.out0000644000175100001440000000371614015716474022343 0ustar00builderusers00000000000000 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of paralleldo 0: exit implicit barrier of paralleldo 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/jacobi.F900000644000000000000000000000013114015716474017411 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/jacobi.F900000644000175100001440000001026714015716474020613 0ustar00builderusers00000000000000module JacobiMod use VariableDef implicit none contains subroutine Jacobi(myData) implicit none !******************************************************************** ! Subroutine HelmholtzJ * ! Solves poisson equation on rectangular grid assuming : * ! (1) Uniform discretization in each direction, and * ! (2) Dirichlect boundary conditions * ! Jacobi method is used in this routine * ! * ! Input : n,m Number of grid points in the X/Y directions * ! dx,dy Grid spacing in the X/Y directions * ! alpha Helmholtz eqn. coefficient * ! omega Relaxation factor * ! myData%afF(n,m) Right hand side function * ! myData%afU(n,m) Dependent variable/Solution * ! tol Tolerance for iterative solver * ! maxit Maximum number of iterations * ! * ! Output : myData%afU(n,m) - Solution * !******************************************************************** !.. Formal Arguments .. type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, iErr double precision :: ax, ay, b, residual, fLRes, tmpResd !.. Local Arrays .. double precision, allocatable :: uold(:,:) !.. Intrinsic Functions .. intrinsic DBLE, SQRT allocate(uold (0 : myData%iCols -1, 0 : myData%iRows -1)) ! ... Executable Statements ... ! Initialize coefficients if (allocated(uold)) then ax = 1.0d0 / (myData%fDx * myData%fDx) ! X-direction coef ay = 1.0d0 / (myData%fDx * myData%fDx) ! Y-direction coef b = -2.0d0 * (ax + ay) - myData%fAlpha ! Central coeff residual = 10.0d0 * myData%fTolerance do while (myData%iIterCount < myData%iIterMax .and. residual > myData%fTolerance) residual = 0.0d0 ! Copy new solution into old, including the boundary. !$omp parallel private(fLRes, tmpResd, i) !$omp do do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols - 1 uold(i, j) = myData%afU(i, j) end do end do !$omp end do !$omp do reduction(+:residual) ! Compute stencil, residual, & update. ! Update excludes the boundary. do j = myData%iRowFirst + 1, myData%iRowLast - 1 do i = 1, myData%iCols - 2 ! Evaluate residual fLRes = (ax * (uold(i-1, j) + uold(i+1, j)) & + ay * (uold(i, j-1) + uold(i, j+1)) & + b * uold(i, j) - myData%afF(i, j)) / b ! Update solution myData%afU(i, j) = uold(i, j) - myData%fRelax * fLRes ! Accumulate residual error residual = residual + fLRes * fLRes end do end do !$omp end do !$omp end parallel ! Error check myData%iIterCount = myData%iIterCount + 1 residual = SQRT(residual) / DBLE(myData%iCols * myData%iRows) ! End iteration loop end do myData%fResidual = residual deallocate(uold) else write (*,*) 'Error: cant allocate memory' call Finish(myData) stop end if end subroutine Jacobi end module JacobiMod opari2-2.0.6/test/data/jacobi/F/PaxHeaders.6153/VariableDef.f900000644000000000000000000000013114015716474020366 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/F/VariableDef.f900000644000175100001440000000216414015716474021565 0ustar00builderusers00000000000000module VariableDef implicit none TYPE JacobiData integer :: iRows integer :: iCols integer :: iRowFirst integer :: iRowLast integer :: iIterMax double precision :: fAlpha double precision :: fRelax double precision :: fTolerance ! /* calculated dx & dy */ double precision :: fDx double precision :: fDy ! /* pointers to the allocated memory */ double precision, allocatable :: afU(:,:) double precision, allocatable :: afF(:,:) ! /* start and end timestamps */ double precision :: fTimeStart double precision :: fTimeStop ! /* calculated residual (output jacobi) */ double precision :: fResidual ! /* effective interation count (output jacobi) */ integer :: iIterCount ! /* calculated error (output error_check) */ double precision :: fError ! /* MPI-Variables */ integer :: iMyRank !/* current process rank (number) */ integer :: iNumProcs !/* how many processes */ END TYPE JacobiData end module VariableDef opari2-2.0.6/test/data/jacobi/PaxHeaders.6153/C0000644000000000000000000000013114015716474015622 xustar0029 mtime=1614257468.25191002 30 atime=1614257501.252015069 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/0000755000175100001440000000000014015716474017073 5ustar00builderusers00000000000000opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/main.c0000644000000000000000000000013114015716474016767 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/main.c0000644000175100001440000001346314015716474020172 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #include #include #include #include #ifdef _OPENMP #include #else #include #endif #include "jacobi.h" #define U( j, i ) data->afU[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define F( j, i ) data->afF[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] /* * setting values, init mpi, omp etc */ void Init( struct JacobiData* data, int* argc, char** argv ) { int i; int block_lengths[ 8 ]; int ITERATIONS = 5; char* env = getenv( "ITERATIONS" ); if ( env ) { int iterations = atoi( env ); if ( iterations > 0 ) { ITERATIONS = iterations; } else { printf( "Ignoring invalid ITERATIONS=%s!\n", env ); } } #ifdef _OPENMP printf( "Jacobi %d OpenMP-%u thread(s)\n", omp_get_max_threads(), _OPENMP ); #else printf( "Jacobi (serial)\n" ); #endif /* default medium */ data->iCols = 2000; data->iRows = 2000; data->fAlpha = 0.8; data->fRelax = 1.0; data->fTolerance = 1e-10; data->iIterMax = ITERATIONS; printf( "\n-> matrix size: %dx%d" "\n-> alpha: %f" "\n-> relax: %f" "\n-> tolerance: %f" "\n-> iterations: %d \n\n", data->iCols, data->iRows, data->fAlpha, data->fRelax, data->fTolerance, data->iIterMax ); /* MPI values, set to defaults to avoid data inconsistency */ data->iMyRank = 0; data->iNumProcs = 1; data->iRowFirst = 0; data->iRowLast = data->iRows - 1; /* memory allocation for serial & omp */ data->afU = ( double* )malloc( data->iRows * data->iCols * sizeof( double ) ); data->afF = ( double* )malloc( data->iRows * data->iCols * sizeof( double ) ); /* calculate dx and dy */ data->fDx = 2.0 / ( data->iCols - 1 ); data->fDy = 2.0 / ( data->iRows - 1 ); data->iIterCount = 0; return; } /* * final cleanup routines */ void Finish( struct JacobiData* data ) { free( data->afU ); free( data->afF ); return; } /* * print result summary */ void PrintResults( const struct JacobiData* data ) { if ( data->iMyRank == 0 ) { printf( " Number of iterations : %d\n", data->iIterCount ); printf( " Residual : %le\n", data->fResidual ); printf( " Solution Error : %1.12lf\n", data->fError ); printf( " Elapsed Time : %5.7lf\n", data->fTimeStop - data->fTimeStart ); printf( " MFlops : %6.6lf\n", 0.000013 * data->iIterCount * ( data->iCols - 2 ) * ( data->iRows - 2 ) / ( data->fTimeStop - data->fTimeStart ) ); } return; } /* * Initializes matrix * Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) */ void InitializeMatrix( struct JacobiData* data ) { int i, j, xx, yy, xx2, yy2; /* Initialize initial condition and RHS */ #pragma omp parallel for private(i, j, xx, yy, xx2, yy2) for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { for ( i = 0; i < data->iCols; i++ ) { xx = ( int )( -1.0 + data->fDx * i ); yy = ( int )( -1.0 + data->fDy * j ); xx2 = xx * xx; yy2 = yy * yy; U( j, i ) = 0.0; F( j, i ) = -data->fAlpha * ( 1.0 - xx2 ) * ( 1.0 - yy2 ) + 2.0 * ( -2.0 + xx2 + yy2 ); } } } /* * Checks error between numerical and exact solution */ void CheckError( struct JacobiData* data ) { double error = 0.0; int i, j; double xx, yy, temp; for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { if ( ( data->iMyRank != 0 && j == data->iRowFirst ) || ( data->iMyRank != data->iNumProcs - 1 && j == data->iRowLast ) ) { continue; } for ( i = 0; i < data->iCols; i++ ) { xx = -1.0 + data->fDx * i; yy = -1.0 + data->fDy * j; temp = U( j, i ) - ( 1.0 - xx * xx ) * ( 1.0 - yy * yy ); error += temp * temp; } } data->fError = sqrt( error ) / ( data->iCols * data->iRows ); return; } double get_wtime() { #ifdef _OPENMP return omp_get_wtime(); #else struct timeval tp; gettimeofday( &tp, 0 ); return tp.tv_sec + ( tp.tv_usec * 1.0e-6 ); #endif } int main( int argc, char** argv ) { int retVal = 0; /* return value */ struct JacobiData myData; /* sets default values or reads from stdin * inits MPI and OpenMP if needed * distribute MPI data, calculate MPI bounds */ Init( &myData, &argc, argv ); if ( myData.afU && myData.afF ) { /* matrix init */ InitializeMatrix( &myData ); /* starting timer */ myData.fTimeStart = get_wtime(); /* running calculations */ Jacobi( &myData ); /* stopping timer */ myData.fTimeStop = get_wtime(); /* error checking */ CheckError( &myData ); /* print result summary */ PrintResults( &myData ); } else { printf( " Memory allocation failed ...\n" ); retVal = -1; } /* cleanup */ Finish( &myData ); return retVal; } opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/jacobi_test_3.out0000644000000000000000000000013114015716474021140 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/jacobi_test_3.out0000644000175100001440000000333414015716474022337 0ustar00builderusers00000000000000 3: begin parallel 3: enter for 3: enter implicit barrier of parallelfor 3: exit implicit barrier of parallelfor 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/jacobi_test_2.out0000644000000000000000000000013114015716474021137 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/jacobi_test_2.out0000644000175100001440000000333414015716474022336 0ustar00builderusers00000000000000 2: begin parallel 2: enter for 2: enter implicit barrier of parallelfor 2: exit implicit barrier of parallelfor 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/jacobi_test_1.out0000644000000000000000000000013114015716474021136 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/jacobi_test_1.out0000644000175100001440000000333414015716474022335 0ustar00builderusers00000000000000 1: begin parallel 1: enter for 1: enter implicit barrier of parallelfor 1: exit implicit barrier of parallelfor 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/jacobi_test_0.out0000644000000000000000000000013114015716474021135 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/jacobi_test_0.out0000644000175100001440000000374414015716474022341 0ustar00builderusers00000000000000 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of parallelfor 0: exit implicit barrier of parallelfor 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/jacobi.h0000644000000000000000000000013114015716474017277 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/jacobi.h0000644000175100001440000000167014015716474020477 0ustar00builderusers00000000000000#ifndef _JACOBI_H #define _JACOBI_H struct JacobiData { /* input data */ int iRows; int iCols; int iRowFirst; int iRowLast; int iIterMax; double fAlpha; double fRelax; double fTolerance; /* calculated dx & dy */ double fDx; double fDy; /* pointers to the allocated memory */ double* afU; double* afF; /* start and end timestamps */ double fTimeStart; double fTimeStop; /* calculated residual (output jacobi) */ double fResidual; /* effective interation count (output jacobi) */ int iIterCount; /* calculated error (output error_check) */ double fError; /* MPI-Variables */ int iMyRank; /* current process rank (number) */ int iNumProcs; /* how many processes */ }; /* jacobi calculation routine */ void Jacobi( struct JacobiData* data ); /* final cleanup routines */ void Finish( struct JacobiData* data ); #endif opari2-2.0.6/test/data/jacobi/C/PaxHeaders.6153/jacobi.c0000644000000000000000000000013114015716474017272 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C/jacobi.c0000644000175100001440000000660114015716474020471 0ustar00builderusers00000000000000/* ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tolerance Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** */ #include #include #include #include "jacobi.h" #define U( j, i ) afU[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define F( j, i ) afF[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define UOLD( j, i ) uold[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] void Jacobi( struct JacobiData* data ) { /*use local pointers for performance reasons*/ double* afU, * afF; int i, j; double fLRes; double ax, ay, b, residual, tmpResd; double* uold = ( double* )malloc( data->iCols * data->iRows * sizeof( double ) ); afU = data->afU; afF = data->afF; if ( uold ) { ax = 1.0 / ( data->fDx * data->fDx ); /* X-direction coef */ ay = 1.0 / ( data->fDy * data->fDy ); /* Y_direction coef */ b = -2.0 * ( ax + ay ) - data->fAlpha; /* Central coeff */ residual = 10.0 * data->fTolerance; while ( data->iIterCount < data->iIterMax && residual > data->fTolerance ) { residual = 0.0; /* Copy new solution into old, including the boundary. */ #pragma omp parallel { #pragma omp for private(j, i) for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { for ( i = 0; i < data->iCols; i++ ) { UOLD( j, i ) = U( j, i ); } } /* Compute stencil, residual and update. * Update excludes the boundary. */ #pragma omp for private(j, i, fLRes) reduction(+:residual) for ( j = data->iRowFirst + 1; j <= data->iRowLast - 1; j++ ) { for ( i = 1; i < data->iCols - 1; i++ ) { fLRes = ( ax * ( UOLD( j, i - 1 ) + UOLD( j, i + 1 ) ) + ay * ( UOLD( j - 1, i ) + UOLD( j + 1, i ) ) + b * UOLD( j, i ) - F( j, i ) ) / b; /* update solution */ U( j, i ) = UOLD( j, i ) - data->fRelax * fLRes; /* accumulate residual error */ residual += fLRes * fLRes; } } } /* end omp parallel */ /* error check */ ( data->iIterCount )++; residual = sqrt( residual ) / ( data->iCols * data->iRows ); } /* while */ data->fResidual = residual; free( uold ); } else { fprintf( stderr, "Error: cant allocate memory\n" ); Finish( data ); exit( 1 ); } } opari2-2.0.6/test/data/jacobi/PaxHeaders.6153/C++0000644000000000000000000000013114015716474015750 xustar0029 mtime=1614257468.25191002 30 atime=1614257501.252015069 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/0000755000175100001440000000000014015716474017221 5ustar00builderusers00000000000000opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/main.cpp0000644000000000000000000000013114015716474017455 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/main.cpp0000644000175100001440000001266714015716474020665 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #include #include #include #include #include #ifdef _OPENMP #include #else #include #endif #include "jacobi.h" #define U( j, i ) data.afU[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define F( j, i ) data.afF[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] using namespace std; // setting values, init mpi, omp etc void Init( JacobiData &data, int & argc, char** argv ) { int ITERATIONS = 5; char* env = getenv( "ITERATIONS" ); if ( env ) { int iterations = atoi( env ); if ( iterations > 0 ) { ITERATIONS = iterations; } else { printf( "Ignoring invalid ITERATIONS=%s!\n", env ); } } #ifdef _OPENMP printf( "Jacobi %d OpenMP-%u thread(s)\n", omp_get_max_threads(), _OPENMP ); #else printf( "Jacobi (serial)\n" ); #endif // default medium data.iCols = 2000; data.iRows = 2000; data.fAlpha = 0.8; data.fRelax = 1.0; data.fTolerance = 1e-10; data.iIterMax = ITERATIONS; cout << "\n-> matrix size: " << data.iCols << "x" << data.iRows << "\n-> alpha: " << data.fAlpha << "\n-> relax: " << data.fRelax << "\n-> tolerance: " << data.fTolerance << "\n-> iterations: " << data.iIterMax << endl << endl; // MPI values, set to defaults to avoid data inconsistency data.iMyRank = 0; data.iNumProcs = 1; data.iRowFirst = 0; data.iRowLast = data.iRows - 1; // memory allocation for serial & omp data.afU = new double[ data.iRows * data.iCols ]; data.afF = new double[ data.iRows * data.iCols ]; // calculate dx and dy data.fDx = 2.0 / ( data.iCols - 1 ); data.fDy = 2.0 / ( data.iRows - 1 ); data.iIterCount = 0; return; } // final cleanup routines void Finish( JacobiData &data ) { delete[] data.afU; delete[] data.afF; return; } // print result summary void PrintResults( const JacobiData &data ) { if ( data.iMyRank == 0 ) { cout << " Number of iterations : " << data.iIterCount << endl; cout << " Residual : " << data.fResidual << endl; cout << " Solution Error : " << data.fError << endl; cout << " Elapsed Time : " << data.fTimeStop - data.fTimeStart << endl; cout << " MFlops : " << 0.000013 * data.iIterCount * ( data.iCols - 2 ) * ( data.iRows - 2 ) / ( data.fTimeStop - data.fTimeStart ) << endl; } return; } // Initializes matrix // Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) void InitializeMatrix( JacobiData &data ) { /* Initilize initial condition and RHS */ #pragma omp parallel for for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { for ( int i = 0; i < data.iCols; i++ ) { int xx = ( int )( -1.0 + data.fDx * i ); int yy = ( int )( -1.0 + data.fDy * j ); int xx2 = xx * xx; int yy2 = yy * yy; U( j, i ) = 0.0; F( j, i ) = -data.fAlpha * ( 1.0 - xx2 ) * ( 1.0 - yy2 ) + 2.0 * ( -2.0 + xx2 + yy2 ); } } } // Checks error between numerical and exact solution void CheckError( JacobiData &data ) { double error = 0.0; for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { if ( ( data.iMyRank != 0 && j == data.iRowFirst ) || ( data.iMyRank != data.iNumProcs - 1 && j == data.iRowLast ) ) { continue; } for ( int i = 0; i < data.iCols; i++ ) { double xx = -1.0 + data.fDx * i; double yy = -1.0 + data.fDy * j; double temp = U( j, i ) - ( 1.0 - xx * xx ) * ( 1.0 - yy * yy ); error += temp * temp; } } data.fError = sqrt( error ) / ( data.iCols * data.iRows ); } double get_wtime() { #ifdef _OPENMP return omp_get_wtime(); #else struct timeval tp; gettimeofday( &tp, 0 ); return tp.tv_sec + ( tp.tv_usec * 1.0e-6 ); #endif } int main( int argc, char** argv ) { int retVal = 0; // return value JacobiData myData; // sets default values or reads from stdin // inits MPI and OpenMP if needed // distribute MPI data, calculate MPI bounds Init( myData, argc, argv ); if ( myData.afU && myData.afF ) { // matrix init InitializeMatrix( myData ); // starting timer myData.fTimeStart = get_wtime(); // running calculations Jacobi( myData ); // stopping timer myData.fTimeStop = get_wtime(); // error checking CheckError( myData ); // print result summary PrintResults( myData ); } else { cout << " Memory allocation failed ...\n"; retVal = -1; } // cleanup Finish( myData ); return retVal; } opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/jacobi_test_3.out0000644000000000000000000000013114015716474021266 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/jacobi_test_3.out0000644000175100001440000000333414015716474022465 0ustar00builderusers00000000000000 3: begin parallel 3: enter for 3: enter implicit barrier of parallelfor 3: exit implicit barrier of parallelfor 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/jacobi_test_2.out0000644000000000000000000000013114015716474021265 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/jacobi_test_2.out0000644000175100001440000000333414015716474022464 0ustar00builderusers00000000000000 2: begin parallel 2: enter for 2: enter implicit barrier of parallelfor 2: exit implicit barrier of parallelfor 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/jacobi_test_1.out0000644000000000000000000000013114015716474021264 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/jacobi_test_1.out0000644000175100001440000000333414015716474022463 0ustar00builderusers00000000000000 1: begin parallel 1: enter for 1: enter implicit barrier of parallelfor 1: exit implicit barrier of parallelfor 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/jacobi_test_0.out0000644000000000000000000000013114015716474021263 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/jacobi_test_0.out0000644000175100001440000000374414015716474022467 0ustar00builderusers00000000000000 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of parallelfor 0: exit implicit barrier of parallelfor 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/jacobi.h0000644000000000000000000000013114015716474017425 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/jacobi.h0000644000175100001440000000161614015716474020625 0ustar00builderusers00000000000000#ifndef _JACOBI_H #define _JACOBI_H struct JacobiData { // input data int iRows; int iCols; int iRowFirst; int iRowLast; int iIterMax; double fAlpha; double fRelax; double fTolerance; // calculated dx & dy double fDx; double fDy; // pointers to the allocated memory double* afU; double* afF; // start and end timestamps double fTimeStart; double fTimeStop; // calculated residual (output jacobi) double fResidual; // effective interation count (output jacobi) int iIterCount; // calculated error (output error_check) double fError; // MPI-Variables int iMyRank; // current process rank (number) int iNumProcs; // how many processes }; // jacobi calculation routine void Jacobi( JacobiData &data ); // final cleanup routines void Finish( JacobiData &data ); #endif opari2-2.0.6/test/data/jacobi/C++/PaxHeaders.6153/jacobi.cpp0000644000000000000000000000013114015716474017760 xustar0029 mtime=1614257468.25191002 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/jacobi/C++/jacobi.cpp0000644000175100001440000000644014015716474021160 0ustar00builderusers00000000000000/* ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tolerance Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** */ #include #include #include #include "jacobi.h" using namespace std; #define U( j, i ) afU[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define F( j, i ) afF[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define UOLD( j, i ) uold[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] void Jacobi( JacobiData& data ) { /*use local pointers for performance reasons*/ double* afU, * afF; afU = data.afU; afF = data.afF; double* uold = new double[ data.iCols * data.iRows ]; if ( uold ) { double ax = 1.0 / ( data.fDx * data.fDx ); /* X-direction coef */ double ay = 1.0 / ( data.fDy * data.fDy ); /* Y_direction coef */ double b = -2.0 * ( ax + ay ) - data.fAlpha; /* Central coeff */ double residual = 10.0 * data.fTolerance; while ( data.iIterCount < data.iIterMax&& residual > data.fTolerance ) { residual = 0.0; /* Copy new solution into old, excluding the boundary. */ #pragma omp parallel { #pragma omp for for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { for ( int i = 0; i < data.iCols; i++ ) { UOLD( j, i ) = U( j, i ); } } double fLRes; /* Compute stencil, residual and update. * Update excludes the boundary */ #pragma omp for reduction(+:residual) for ( int j = data.iRowFirst + 1; j <= data.iRowLast - 1; j++ ) { for ( int i = 1; i < data.iCols - 1; i++ ) { fLRes = ( ax * ( UOLD( j, i - 1 ) + UOLD( j, i + 1 ) ) + ay * ( UOLD( j - 1, i ) + UOLD( j + 1, i ) ) + b * UOLD( j, i ) - F( j, i ) ) / b; /* update solution */ U( j, i ) = UOLD( j, i ) - data.fRelax * fLRes; /* accumulate residual error */ residual += fLRes * fLRes; } } } /* end omp parallel */ /* error check */ data.iIterCount++; residual = sqrt( residual ) / ( data.iCols * data.iRows ); } /* while */ data.fResidual = residual; delete[] uold; } else { cerr << "Error: cant allocate memory\n"; Finish( data ); exit( 1 ); } } opari2-2.0.6/test/data/PaxHeaders.6153/awk_script_test.input0000644000000000000000000000013214015716474020555 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/awk_script_test.input0000644000175100001440000000036114015716474021750 0ustar00builderusers000000000000000000000000000357 t _GLOBAL__sub_I_POMP2_Init_reg_kkbk2e7u08rek_1 0000000000000000 T POMP2_Init_reg_kkbk2e7u08rek_1 0000000000000357 t _GLOBAL__sub_I_POMP2_USER_Init_reg_kkbk2e7uxxrek_2 0000000000000000 T POMP2_USER_Init_reg_kkbk2e7uxxrek_2 opari2-2.0.6/test/data/PaxHeaders.6153/awk_script_test.out.in0000644000000000000000000000013214015716474020632 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.116005085 opari2-2.0.6/test/data/awk_script_test.out.in0000644000175100001440000000067214015716474022032 0ustar00builderusers00000000000000 #ifdef __cplusplus extern "C" { #endif #include extern void POMP2_Init_reg_kkbk2e7u08rek_1(); extern void POMP2_USER_Init_reg_kkbk2e7uxxrek_2(); void POMP2_Init_regions() { POMP2_Init_reg_kkbk2e7u08rek_1(); } size_t POMP2_Get_num_regions() { return 1; } void POMP2_USER_Init_regions() { POMP2_USER_Init_reg_kkbk2e7uxxrek_2(); } size_t POMP2_USER_Get_num_regions() { return 2; } #ifdef __cplusplus } #endif opari2-2.0.6/PaxHeaders.6153/src0000644000000000000000000000013214015716532013104 xustar0030 mtime=1614257498.224005429 30 atime=1614257501.252015069 30 ctime=1614257498.224005429 opari2-2.0.6/src/0000755000175100001440000000000014015716532014354 5ustar00builderusers00000000000000opari2-2.0.6/src/PaxHeaders.6153/opari0000644000000000000000000000012614015716532014221 xustar0028 mtime=1614257498.3720059 30 atime=1614257501.252015069 28 ctime=1614257498.3720059 opari2-2.0.6/src/opari/0000755000175100001440000000000014015716532015466 5ustar00builderusers00000000000000opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_config.h0000644000000000000000000000013014015716474017170 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 28 ctime=1614257498.3720059 opari2-2.0.6/src/opari/opari2_config.h0000644000175100001440000000570314015716474020372 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_config.h * * @brief */ #include #include class OPARI_Config { /* ****************************************** Implemented public methods */ public: /** Constructor */ OPARI_Config( void ); /** Destructor */ virtual ~ OPARI_Config( void ); /** Reads the configuration data from a file. To handle the read data you need to implement the AddLibDir() AddIncDir() AddLib() and SetCompilerFlags() methods. @param arg0 The first argument to the toll call. Should contain the tool name. Needed to find the executable path. @returns SCOREP_SUCCESS if the file was successfully parsed. */ void readConfigFile( std::string arg0 ); /** Changes from the install path to the build path. */ void setBuildCheck( void ); /* **************************************** Protected implmented methods */ private: /** This function gives a (key, value) pair found in a configuration file and not processed by one of the former functions. @param key The key @param value The value */ virtual void set_value( std::string key, std::string value ); /** Extracts parameter from configuration file It expects lines of the format key=value. Furthermore it truncates line at the scrpit comment character '#'. @param line input line from the config file @returns SCOREP_SUCCESS if the line was successfully parsed. Else it returns an error code. */ void read_parameter( std::string line ); /* *************************************************** Public members */ public: /**nm command*/ std::string m_nm; /** awk command*/ std::string m_awk; /** egrep command*/ std::string m_egrep; /** version information*/ std::string m_version; /** pomp2 api version information*/ std::string m_pomp2_api_version; /** awk script to use */ std::string m_script; /** include path for installed headers */ std::string m_cflags; }; opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_config.cc0000644000000000000000000000013214015716474017330 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.368005887 opari2-2.0.6/src/opari/opari2_config.cc0000644000175100001440000002476014015716474020534 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, 2019, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ /** @internal * * @file opari2_config.cc * * @brief Implementation of the OPARI2 config tool. * */ #include #include #include #include #include #include "opari2_config.h" #if HAVE( READLINK ) #include #endif #define ACTION_NM 1 #define ACTION_AWK 2 #define ACTION_SCRIPT 3 #define ACTION_EGREP 4 #define ACTION_VERSION 5 #define ACTION_NM2AWK 6 #define ACTION_CFLAGS 7 #define ACTION_POMP2_API_VERSION 8 #define ACTION_CFLAGS_GNU 9 #define ACTION_CFLAGS_INTEL 10 void opari2_print_help( char** argv ) { std::string usage = #include "opari2-config_usage.h" ; std::cout << "\n\n" << usage << std::endl; } int main( int argc, char** argv ) { int i; int action = 0; char* config_file = NULL; int n_obj_files = 0; char** obj_files = NULL; OPARI_Config app; bool fortran = false; /* parsing the command line */ for ( i = 1; i < argc; i++ ) { if ( strcmp( argv[ i ], "--help" ) == 0 || strcmp( argv[ i ], "-h" ) == 0 ) { opari2_print_help( argv ); return EXIT_SUCCESS; } else if ( strcmp( argv[ i ], "--nm" ) == 0 ) { action = ACTION_NM; } else if ( strcmp( argv[ i ], "--awk-cmd" ) == 0 ) { action = ACTION_AWK; } else if ( strcmp( argv[ i ], "--awk-script" ) == 0 ) { action = ACTION_SCRIPT; } else if ( strcmp( argv[ i ], "--region-initialization" ) == 0 ) { action = ACTION_SCRIPT; } else if ( strcmp( argv[ i ], "--egrep" ) == 0 ) { action = ACTION_EGREP; } else if ( strcmp( argv[ i ], "--cflags=gnu" ) == 0 ) { action = ACTION_CFLAGS_GNU; } else if ( strcmp( argv[ i ], "--cflags=intel" ) == 0 ) { action = ACTION_CFLAGS_INTEL; } else if ( ( strcmp( argv[ i ], "--cflags" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=sun" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=pgi" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=ibm" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=cray" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=fujitsu" ) == 0 ) ) { action = ACTION_CFLAGS; } else if ( strcmp( argv[ i ], "--create-pomp2-regions" ) == 0 ) { int j = 0; n_obj_files = argc - i - 1; if ( n_obj_files > 0 ) { obj_files = new char*[ n_obj_files ]; while ( ++i < argc ) { obj_files[ j++ ] = argv[ i ]; } action = ACTION_NM2AWK; } else { std::cerr << "\nERROR: Object files missing. Abort.\n" << std::endl; return EXIT_FAILURE; } } else if ( strcmp( argv[ i ], "--version" ) == 0 ) { action = ACTION_VERSION; } else if ( strcmp( argv[ i ], "--interface-version" ) == 0 ) { action = ACTION_POMP2_API_VERSION; } else if ( strcmp( argv[ i ], "--revision" ) == 0 ) { std::cout << SCOREP_COMPONENT_REVISION << std::endl; exit( EXIT_SUCCESS ); } else if ( strcmp( argv[ i ], "--opari2-revision" ) == 0 || strcmp( argv[ i ], "--common-revision" ) == 0 ) { std::cerr << "[OPARI2] warning: " << argv[ i ] << " is deprecated" << std::endl; std::cout << SCOREP_COMPONENT_REVISION << std::endl; exit( EXIT_SUCCESS ); } else if ( strncmp( argv[ i ], "--config", 8 ) == 0 ) { // Expect the config file name after an equal sign if ( ( argv[ i ][ 8 ] == '=' ) && ( argv[ i ][ 9 ] != '\0' ) ) { config_file = &argv[ i ][ 9 ]; } else { std::cerr << "\nConfig file name missing. Abort.\n" << std::endl; return EXIT_FAILURE; } } else if ( strcmp( argv[ i ], "--build-check" ) == 0 ) { app.setBuildCheck(); } else if ( strcmp( argv[ i ], "--fortran" ) == 0 ) { fortran = true; } else { std::cerr << "\nUnknown option " << argv[ i ] << ". Abort.\n" << std::endl; std::cerr << "Print " << argv[ 0 ] << " --help to get a list of options" << std::endl; return EXIT_FAILURE; } } /* read data in case a config file was specified */ if ( config_file != NULL ) { app.readConfigFile( config_file ); } switch ( action ) { case ACTION_NM: std::cout << app.m_nm; std::cout.flush(); break; case ACTION_AWK: std::cout << app.m_awk; std::cout.flush(); break; case ACTION_SCRIPT: std::cout << app.m_script; std::cout.flush(); break; case ACTION_EGREP: std::cout << app.m_egrep; std::cout.flush(); break; case ACTION_CFLAGS: std::cout << app.m_cflags; std::cout.flush(); break; case ACTION_CFLAGS_GNU: if ( fortran ) { std::cout << app.m_cflags << " -Wno-unused"; } else { std::cout << app.m_cflags; } std::cout.flush(); break; case ACTION_CFLAGS_INTEL: if ( fortran ) { std::cout << app.m_cflags << " -warn nounused"; } else { std::cout << app.m_cflags; } std::cout.flush(); break; case ACTION_NM2AWK: std::cout << app.m_nm << " "; for ( int i = 0; i < n_obj_files; i++ ) { std::cout << obj_files[ i ] << " "; } std::cout << " | " << app.m_script; break; case ACTION_VERSION: std::cout << app.m_version << "\n"; std::cout.flush(); break; case ACTION_POMP2_API_VERSION: std::cout << app.m_pomp2_api_version << "\n"; std::cout.flush(); break; default: opari2_print_help( argv ); } return EXIT_SUCCESS; } OPARI_Config::OPARI_Config( void ) { m_nm = NM; m_awk = AWK; m_egrep = EGREP; m_version = VERSION; m_pomp2_api_version = POMP2_API_VERSION; m_script = SCRIPT; m_cflags = CFLAGS; } OPARI_Config::~OPARI_Config( void ) { } void OPARI_Config::setBuildCheck( void ) { #if !HAVE( READLINK ) std::cerr << "Option --build-check not supported without readlink support." << std::endl; exit( EXIT_FAILURE ); #endif /* !HAVE(READLINK) */ unsigned bufsize = 8192; char buffer[ bufsize ]; memset( buffer, 0, bufsize ); ssize_t result = readlink( "/proc/self/exe", buffer, bufsize ); if ( result >= bufsize || result == -1 ) { std::cerr << "Could not determine executable path. Option --build-check not supported." << std::endl; exit( EXIT_FAILURE ); } std::string opari2_config_exe = std::string( buffer ); std::size_t found = opari2_config_exe.rfind( "opari2-config" ); std::string opari2_config_build_path = opari2_config_exe.substr( 0, found ); m_script = opari2_config_build_path + "pomp2-parse-init-regions.awk"; m_cflags = "-I" + opari2_config_build_path + "../include"; } void OPARI_Config::readConfigFile( std::string config_file ) { std::ifstream inFile; inFile.open( config_file.c_str(), std::ios_base::in ); if ( !( inFile.good() ) ) { std::cerr << "Cannot open config file: " << config_file << std::endl; abort(); } while ( inFile.good() ) { char line[ 512 ] = { "" }; inFile.getline( line, 512 ); read_parameter( line ); } } void OPARI_Config::set_value( std::string key, std::string value ) { if ( key == "EGREP" ) { m_egrep = value; } else if ( key == "VERSION" ) { m_version = value; } else if ( key == "POMP2_API_VERSION" ) { m_pomp2_api_version = value; } else if ( key == "NM" ) { m_nm = value; } else if ( key == "AWK" ) { m_awk = value; } else if ( key == "OPARI_SCRIPT" ) { m_script = value; } else if ( key == "CFLAGS" ) { m_cflags = value; } /* Ignore unknown entries */ } void OPARI_Config::read_parameter( std::string line ) { /* check for comments */ size_t pos = line.find( "#" ); if ( pos == 0 ) { return; // Whole line commented out } if ( pos != std::string::npos ) { // Truncate line at comment line = line.substr( pos, line.length() - pos - 1 ); } // Ignore empty lines if ( line == "" ) { return; } /* separate value and key */ pos = line.find( "=" ); if ( pos == std::string::npos ) { std::cerr << "Error while parsing config file: Missing separator '='." << std::endl; abort(); } std::string key = line.substr( 0, pos ); std::string value = line.substr( pos + 2, line.length() - pos - 3 ); /* process parameter */ set_value( key, value ); } opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_directive.h0000644000000000000000000000013214015716474017703 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.344005811 opari2-2.0.6/src/opari/opari2_directive.h0000644000175100001440000004406514015716474021107 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive.h * * @brief Abstract base class of all directives. */ #ifndef OPARI2_DIRECTIVE_H #define OPARI2_DIRECTIVE_H #include using std::string; #include using std::vector; #include using std::set; #include using std::stringstream; #include using std::ostream; #include using std::pair; using std::make_pair; #include "opari2.h" /** * @brief Abstract base class to store and manipulate directive * related data */ class OPARI2_Directive { public: OPARI2_Directive( const string& fname, const int ln, vector& lines, vector& directive_prefix ); virtual ~ OPARI2_Directive( void ) { } public: /********************************************************** * * * INTERFACE FOR DERIVED CLASSES * * * **********************************************************/ /********************************************************** * The following functions MUST be implemented by derived * * classes * **********************************************************/ /** * @brief Each paradigm must provide this method * * Each paradigm must keep a separate count of regions encountered * of this type. See the example for derived classes for a * standard implementation. */ virtual void IncrementRegionCounter( void ) = 0; /** * @brief Generate region descriptors * * The function generate_descr_common() is provided to take care * of the generic descriptor information. See * OPARI2_DirectiveTemplate::GenerateDescr() for a standard * implementation. */ virtual void GenerateDescr( ostream& os ) = 0; /********************************************************** * These functions may be implemented. * * Default implementations are provided below. * **********************************************************/ public: /** * @brief Find the name of the directive */ virtual void FindName( void ) { find_name_common(); }; private: /** * @brief Identifies clauses and their arguments */ virtual void identify_clauses( void ) { }; /********************************************************** * * * BASE CLASS MEMBERS AND METHODS * * * **********************************************************/ private: /** * @brief Generates the part of the ctc-string which contains the * paradigm specific information. * * The function generate_ctc_string_common() is provided to take * care of the generic source code region information. */ virtual string generate_ctc_string( OPARI2_Format_t form ) { return generate_ctc_string_common( form ); }; public: /** * @brief Writes Directive for ending a loop */ virtual OPARI2_Directive* EndLoopDirective( const int lineno ) { return NULL; }; /** * @brief Returns true for directives ending a loop region */ virtual bool EndsLoopDirective( void ) { return false; }; /******************************************************************* * Furthermore there are some static functions implemented in the * * derived classes, which are necessary or might be useful (and * * should be named the same), when deriving a class for a new * * paradigm. * *******************************************************************/ /** * static OPARI2_ErrorCode * ProcessOption( string option ); * * static uint32_t * String2Group( const string name ); * * static void * GenerateHeader( ostream& os ); * * static void * FinalizeDescrs( ostream& os ); * * static void * GenerateInitHandleCalls( ostream& os, * const string incfile = "" ); */ protected: /** Name of currently processed file. This is not constant for one source file, as other files may have been included and the source code information is written correctly into the line directives */ string m_filename; OPARI2_ParadigmType_t m_type; /** directive name */ string m_name; /** A vector of pairs, consisting of clauses and their arguments */ OPARI2_StrStr_map_t m_clauses; /* Global ID of instrumented region */ int m_id; /** line numbers of the first and last line of the beginning and the end of the directive region in the sourcce file */ int m_begin_first_line; int m_begin_last_line; int m_end_first_line; int m_end_last_line; /* Specifies whether there is an outer region */ bool m_outer_reg; /* The Compile Time Context (CTC) string, its length and the variable it is stored in, in the instrumented file */ string m_ctc_string; int m_ctc_string_len; string m_ctc_string_variable; /** set of relevant region descriptors */ set m_descrs; /** the index of the currently parsed line within the directive statements */ unsigned int m_pline; /** position index within the currently parsed line */ string::size_type m_ppos; /** all lines */ vector m_lines; /** all original lines */ vector m_orig_lines; /** A series of tokens that identify a pragma/directive */ vector m_directive_prefix; /** In Fortran a common block is inserted in the output file with * all region ids, the values are collected here and printed at * the end*/ static vector s_common_block; /** In Fortran directives are usually ended with an "!$par end * loop" directive. In case of directives that refer to a * directly following loop, the end of the loop also ends the * code region for the directive. The end directive is inserted * by OPARI2, if m_needs_end_loop_directive is true.*/ bool m_needs_end_loop_directive; /* The necessary directive for explicitly ending a loop * region. */ string m_end_loop_directive; /** directive of enclosing directive */ OPARI2_Directive* m_enclosing; /** Static variables. This is information which is constant for the processed file and frequently accessed in the directives */ /** pointer to outer directive */ static OPARI2_Directive* s_outer; /** Region counter for all region types */ static int s_num_all_regions; /** Language the input file is written in */ static OPARI2_Language_t s_lang; /** Type of format (currently only needed for Fortran, distinguishes between fixed-form and free-form Fortran */ static OPARI2_Format_t s_format; /** Specifies whether the source code information via #line directives is to be inserted */ static bool s_keep_src_info; /** Specifies whether the file was already preprocessed */ static bool s_preprocessed_file; /** A unique id that is needed to distinguish the initialization routines of the different compile units of the target application. It should not be placed here as it is strictly speaking not part of the necessary information of a directive, but it is used and needed here in the GenerateInitHandleCalls... functions. */ static string s_inode_compiletime_id; public: /** @brief Return 'type', for dynamic_cast */ OPARI2_ParadigmType_t GetParadigmType( void ); /** @brief Return the directive name */ string& GetName( void ); /** @brief Returns whether a clause is present */ bool HasClause( const string& clause ); /** @brief Returns the argument of a clause */ string GetClauseArg( const string& clause ); /** @brief Deletes comments in directive lines */ void DelInlineComments( void ); /** @brief Returns the filename of the file the directive belongs to */ string& GetFilename( void ); /* Return beginning line number of directive */ int& GetLineno( void ); /** @brief Update line information after the parser reaches the end of this directive region */ void SetEndLineno( const int endline_begin, const int endline_end ); /** @brief Prints the #line directive to update the source code information */ void ResetSourceInfo( ostream& os ); /** @brief Enter region */ void EnterRegion( bool new_outer = false, bool save_on_vec = true ); /** @brief Initialize region information. */ void InitRegion( bool outer = false ); /** @brief Initialize region information. */ void InitRegion( OPARI2_Directive* parent, bool outer = false ); /** @brief Exit region */ int ExitRegion( bool end_outer = false ); /** @brief Inserts the id of a region nested inside another region */ void InsertDescr( int descr ); /** @brief Check if the directive has accociated descriptors */ bool DescrsEmpty(); /** @brief Returns the id of the directive region */ int GetID( void ) { return m_id; }; /** @brief Returns the ctc-string */ string GetCTCStringVariable( void ) { return m_ctc_string_variable; }; /** @brief Sets all necessary static information */ static void SetOptions( OPARI2_Language_t lang, OPARI2_Format_t form, bool keep_src, bool preprocessed, const string id ); /** @brief Returns the file specific identifier to distinguish different compilation units */ static string GetInodeCompiletimeID( void ) { return s_inode_compiletime_id; } /** * @brief Generate a function to initialize all region handles. */ static void GenerateInitHandleCalls( ostream& os, const string incfile, const string paradigm_prefix, const stringstream& init_handle_calls, const int num_regions ); /** @brief Fortran specific finalization of descriptors */ static void FinalizeFortranDescrs( ostream& os ); void FinishRegion( void ); /** @brief Returns value of m_needs_end_loop_directive.*/ bool NeedsEndLoopDirective( void ); /** @brief Sets value of m_needs_end_loop_directive.*/ void NeedsEndLoopDirective( bool val ); /** @brief Prints directive to stream and updates source information */ void PrintDirective( ostream& os, const string& adds = "" ); /** @brief Prints directive without updating source information */ void PrintPlainDirective( ostream& os, const string& adds = "" ); protected: /** * @brief Generates the part of the ctc-string which contains the * generic region information */ string generate_ctc_string_common( OPARI2_Format_t form, string specific_part = "" ); /** * @brief Generate the generic part of the region descriptors */ void generate_descr_common( ostream& os ); /** * @brief Generic part of identifying a directive name */ void find_name_common( void ); /** * @brief Removes all unnecessary commas */ void remove_commas( void ); /** * @brief Returns the arguments of a clause. */ string find_arguments( unsigned& line, string::size_type& pos, bool remove, string clause ); /** * @brief Removes empty lines */ bool remove_empty_line( unsigned& line ); /** * @brief Check if 'word' can be found in directive 'm_lines'. * * If true, save the line number within 'm_lines' in 'line' and * offset within the line in 'pos'. * * @return true if 'word' is found in m_lines. * false otherwise. */ bool find_word( const string word, unsigned& line, string::size_type& pos ); /** * @brief Find the next word in directive lines, starting from * 'm_pline' and 'm_ppos'. */ string find_next_word( void ); /** * @brief Takes care of moving arguments of clauses for split * directives to the newly created inner directive. * * When combined directives are split the clauses are either kept * at the outer directive or moved to the inner directive. This * function takes care of moving all arguments of clauses * belonging to the inner directive. */ void fix_clause_arg( vector& outer, vector& inner, unsigned& line, string::size_type& pos ); /** * @brief Remove empty lines in directive 'lines'. */ void remove_empties( void ); public: /** * @brief Split combined parallel and worksharing constructs. * * They are split into two separate pragmas to allow the insertion of * POMP function calles between the parallel and the worksharing * construct. The clauses need to be matched to the directive they * belong to. this is a template function as it needs to return the * right derived type of OPARI2_Directive*. */ template T* SplitCombinedT( OPARI2_StrStr_pairs_t& outer_inner, OPARI2_StrBool_pairs_t& inner_clauses ) { remove_commas(); vector inner_lines; string sentinel = m_directive_prefix[ 0 ]; string::size_type slen = sentinel.length(); // make empty copy with continuation characters if ( s_lang & L_C_OR_CXX ) { for ( unsigned i = 0; i < m_lines.size(); ++i ) { inner_lines.push_back( string( m_lines[ i ].size(), ' ' ) ); if ( i != m_lines.size() ) { inner_lines[ i ][ inner_lines[ i ].size() - 1 ] = '\\'; } } } else if ( s_lang & L_FORTRAN ) { for ( unsigned i = 0; i < m_lines.size(); ++i ) { inner_lines.push_back( string( m_lines[ i ].size(), ' ' ) ); string::size_type s = m_lines[ i ].find( sentinel ); // & continuation characters string::size_type com = m_lines[ i ].find( "!", s + slen ); if ( com != string::npos ) { --com; } string::size_type amp2 = m_lines[ i ].find_last_not_of( " \t", com ); if ( m_lines[ i ][ amp2 ] == '&' ) { inner_lines[ i ][ amp2 ] = '&'; } string::size_type amp1 = m_lines[ i ].find_first_not_of( " \t", s + slen ); if ( m_lines[ i ][ amp1 ] == '&' || m_lines[ i ][ amp1 ] == '+' ) { inner_lines[ i ][ amp1 ] = m_lines[ i ][ amp1 ]; } } } // copy sentinel/directive_prefix unsigned line = 0; string::size_type pos = 0; for ( vector::iterator it = m_directive_prefix.begin(); it != m_directive_prefix.end(); ++it ) { for ( size_t i = 0; i < m_lines.size(); ++i ) { pos = m_lines[ i ].find( *it ); if ( pos != string::npos ) { inner_lines[ i ].replace( pos, ( *it ).length(), *it ); } } } // fix pragma name for ( OPARI2_StrStr_pairs_t::iterator it = outer_inner.begin(); it != outer_inner.end(); ++it ) { line = pos = 0; if ( find_word( ( *it ).first, line, pos ) ) { string name = ( *it ).second; string blanks( name.length(), ' ' ); if ( find_word( name, line, pos ) ) { m_lines[ line ].replace( pos, name.length(), blanks ); inner_lines[ line ].replace( pos, name.length(), name ); } } } // fix pragma clauses for ( OPARI2_StrBool_pairs_t::iterator it = inner_clauses.begin(); it != inner_clauses.end(); ++it ) { string name = ( *it ).first; bool has_args = ( *it ).second; string blanks( name.length(), ' ' ); line = pos = 0; while ( find_word( name, line, pos ) ) { m_lines[ line ].replace( pos, name.length(), blanks ); inner_lines[ line ].replace( pos, name.length(), name ); pos += name.length(); if ( has_args ) { fix_clause_arg( m_lines, inner_lines, line, pos ); } } } T* inner = new T( m_filename, m_begin_first_line, inner_lines, m_directive_prefix ); // final cleanup remove_empties(); inner->remove_empties(); return inner; } bool active; }; #endif //OPARI2_DIRECTIVE_H opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_directive.cc0000644000000000000000000000013214015716474020041 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.340005798 opari2-2.0.6/src/opari/opari2_directive.cc0000644000175100001440000007355714015716474021255 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014, 2019, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_directive.cc * * @brief Methods of abstract base classs 'OPARI2_Directive'. * */ #include #include #include #include using std::cerr; #include using std::transform; using std::remove_if; #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_manager.h" OPARI2_Directive::OPARI2_Directive( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : m_filename( fname ), m_begin_first_line( ln ), m_lines( lines ), m_directive_prefix( directive_prefix ) { m_pline = 0; m_ppos = 0; DelInlineComments(); for ( vector::iterator dp = directive_prefix.begin(); dp != directive_prefix.end(); ++dp ) { string token = find_next_word(); if ( token != *dp ) { std::cerr << "ERROR: Directive token mismatch!\n"; cleanup_and_exit(); } } m_orig_lines = lines; m_name.clear(); m_needs_end_loop_directive = false; } OPARI2_ParadigmType_t OPARI2_Directive::GetParadigmType( void ) { return m_type; } string& OPARI2_Directive::GetName( void ) { if ( m_name.empty() ) { FindName(); } if ( m_name == "" ) { m_name = "$END$"; } return m_name; } /** @brief Returns whether a clause is present */ bool OPARI2_Directive::HasClause( const string& clause ) { return m_clauses.find( clause ) != m_clauses.end(); } /** @brief Returns the argument of a clause */ string OPARI2_Directive::GetClauseArg( const string& clause ) { if ( m_clauses.find( clause ) != m_clauses.end() ) { return m_clauses[ clause ]; } else { return ""; } } void OPARI2_Directive::DelInlineComments( void ) { if ( s_lang & L_FORTRAN ) { for ( vector::iterator l = m_lines.begin(); l != m_lines.end(); ++l ) { // find first ! int c = ( *l ).find( "!" ); for ( unsigned i = c + 1; i < ( *l ).size(); ++i ) { // zero out string constants and free form comments if ( ( *l )[ i ] == '!' ) { /* -- zero out partial line F90 comments -- */ for (; i < ( *l ).size(); ++i ) { ( *l )[ i ] = ' '; } break; } } } } } string& OPARI2_Directive::GetFilename( void ) { return m_filename; } int& OPARI2_Directive::GetLineno( void ) { return m_begin_first_line; } void OPARI2_Directive::SetEndLineno( const int endline_begin, const int endline_end ) { m_end_first_line = endline_begin; m_end_last_line = endline_end; } void OPARI2_Directive::ResetSourceInfo( ostream& os ) { if ( m_name == "$END$" ) { os << "#line " << m_begin_first_line + 1 << " \"" << m_filename << "\"" << "\n"; } else { os << "#line " << m_begin_first_line + m_lines.size() << " \"" << m_filename << "\"" << "\n"; } } void OPARI2_Directive::EnterRegion( bool new_outer, bool save_on_vec ) { /** initialize region information */ InitRegion( new_outer ); if ( save_on_vec ) { SaveForInit( this ); } DirectiveStackPush( this ); } void OPARI2_Directive::InitRegion( bool outer ) { m_id = ++s_num_all_regions; this->IncrementRegionCounter(); /** by default, region name is the same as directive name */ m_begin_last_line = m_begin_first_line + m_lines.size() - 1; m_end_first_line = m_begin_first_line; m_end_last_line = m_begin_first_line + m_lines.size() - 1; m_outer_reg = outer; // to keep track of nested directives m_enclosing = s_outer; if ( m_outer_reg ) { s_outer = this; } if ( s_outer ) { s_outer->InsertDescr( m_id ); } DirectiveStackInsertDescr( m_id ); stringstream stream; stream << string_id_prefix << m_id; m_ctc_string_variable = stream.str(); } void OPARI2_Directive::InitRegion( OPARI2_Directive* parent, bool outer ) { --s_num_all_regions; InitRegion( outer ); m_id = parent->GetID(); } int OPARI2_Directive::ExitRegion( bool end_outer ) { OPARI2_Directive* d_top = DirectiveStackTop( this ); assert( d_top != NULL ); string& name_top = d_top->GetName(); /** * For FORTRAN, some directive block ends with "end directive_name" */ #if defined( __GNUC__ ) && ( __GNUC__ < 3 ) if ( m_name[ 0 ] != '$' && m_name.substr( 3 ) != name_top ) { #else if ( m_name[ 0 ] != '$' && m_name.compare( 3, string::npos, name_top ) != 0 ) { #endif cerr << m_filename << ":" << d_top->GetLineno() << ": ERROR: missing end" << name_top << " directive for " << name_top << " directive\n"; cerr << m_filename << ":" << m_begin_first_line << ": ERROR: non-matching " << m_name << " directive\n"; cleanup_and_exit(); } /** Set end line information of the corresponding region */ if ( m_lines.size() ) { d_top->SetEndLineno( m_begin_first_line, m_begin_first_line + m_lines.size() - 1 ); } else { // C/C++ $END$ pragma d_top->SetEndLineno( m_begin_first_line, m_begin_first_line ); } if ( end_outer ) { d_top->FinishRegion(); } int region_id = d_top->GetID(); DirectiveStackPop(); return region_id; } void OPARI2_Directive::InsertDescr( int descr ) { m_descrs.insert( descr ); } bool OPARI2_Directive::DescrsEmpty() { return m_descrs.empty(); } void OPARI2_Directive::FinishRegion( void ) { if ( m_outer_reg ) { s_outer = m_enclosing; } } bool OPARI2_Directive::NeedsEndLoopDirective( void ) { return m_needs_end_loop_directive; } void OPARI2_Directive::NeedsEndLoopDirective( bool val ) { m_needs_end_loop_directive = val; } void OPARI2_Directive::PrintDirective( ostream& os, const string& adds ) { if ( m_lines.size() && s_keep_src_info && !InstrumentationDisabled( D_USER ) ) { // print original source location information reset pragma os << "#line " << m_begin_first_line << " \"" << m_filename << "\"" << "\n"; } PrintPlainDirective( os, adds ); } void OPARI2_Directive::PrintPlainDirective( ostream& os, const string& adds ) { // print pragma text if ( m_lines.size() ) { for ( unsigned i = 0; i < m_lines.size() - 1; ++i ) { os << m_lines[ i ] << "\n"; } os << m_lines.back() << adds << "\n"; } } /* *INDENT-OFF* */ /** * The generated code might look like this (OpenMP example): * * @code #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); ... ... } * @endcode * * or in Fortran: * * @code subroutine POMP2_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) ... ... end * @endcode * * This generated function needs to be called from * POMP2_Init_regions. There will be one of these for each compile * unit. */ /* *INDENT-ON* */ void OPARI2_Directive::GenerateInitHandleCalls( ostream& os, const string incfile, const string paradigm_prefix, const stringstream& init_handle_calls, const int num_regions ) { if ( num_regions > 0 ) { if ( s_lang & L_FORTRAN ) { if ( init_handle_calls.rdbuf()->in_avail() != 0 ) { //add a Function to initialize the handles at the end of the file os << "\n subroutine " << paradigm_prefix << "_Init_reg_" << s_inode_compiletime_id << "_" << num_regions << "()\n" << " include \'" << incfile << "\'\n" << init_handle_calls.str() << " end\n"; } } else if ( s_lang & L_C_OR_CXX ) { if ( s_lang & L_C ) { os << "\n#ifdef __cplusplus \n extern \"C\" \n#endif"; } else if ( s_lang & L_CXX ) { os << "extern \"C\" \n{"; } os << "\nvoid " << paradigm_prefix << "_Init_reg_" << s_inode_compiletime_id << "_" << num_regions << "()\n{\n" << init_handle_calls.str(); if ( s_lang & L_C ) { os << "}\n"; } else if ( s_lang & L_CXX ) { os << "}\n}\n"; } } } } void OPARI2_Directive::FinalizeFortranDescrs( ostream& os ) { if ( !s_common_block.empty() ) { vector::iterator it = s_common_block.begin(); os << " common /" << "cb" << s_inode_compiletime_id << "/ " << region_id_prefix << *it++; for (; it < s_common_block.end(); it++ ) { if ( s_format == F_FIX ) { os << ",\n & " << region_id_prefix << *it; } else { os << ",&\n " << region_id_prefix << *it; } } os << std::endl; } } void OPARI2_Directive::find_name_common( void ) { if ( m_lines.empty() ) { // automatically generated END pragma for C/C++ m_name = "$END$"; return; } if ( !m_name.empty() ) { return; } m_name = find_next_word(); } string OPARI2_Directive::generate_ctc_string_common( OPARI2_Format_t form, string specific_part ) { stringstream stream1, stream2; stream1 << "*regionType=" << m_name << "*" << "sscl=" << m_filename << ":" << m_begin_first_line << ":" << m_begin_last_line << "*" << "escl=" << m_filename << ":" << m_end_first_line << ":" << m_end_last_line << "*" << specific_part << "*"; stream2 << "\"" << stream1.str().length() + 2 << stream1.str() << "\""; m_ctc_string_len = stream2.str().length(); string ctc_string = stream2.str(); if ( form == F_FIX ) { for ( unsigned int i = 58; i < ctc_string.size() - 1; i += 68 ) { ctc_string.insert( i, "\"//\n &\"" ); } } else if ( form == F_FREE ) { for ( unsigned int i = 58; i < ctc_string.size() - 1; i += 68 ) { ctc_string.insert( i, "\"//&\n \"" ); } } return ctc_string; } /* *INDENT-OFF* */ /** * This function writes the definitions of the region handle and the * CTC-string for the region referred to by this directive object. * * Fortran 90 example: * @code INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=268), parameter :: opari2_ctc_1 =& "265*regionType=parallel*sscl=/some/path/to/source.f90:26"// ":26*escl=/some/path/to/source.f90:43:43*has_if=1*has_num"// "_threads=4*has_reduction=1**" * @endcode * * C/C++ example: * @code static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "261*regionType=parallel*sscl=/some/path/to/source.c:35:35*escl=/some/path/to/source.c:54:54*has_if=1*has_num_threads=4*has_reduction=1**" * @endcode */ /* *INDENT-ON* */ void OPARI2_Directive::generate_descr_common( ostream& os ) { string ctc_string = generate_ctc_string( s_format ); if ( s_lang & L_F77 ) { os << " INTEGER*8 " << region_id_prefix << m_id << "\n"; os << " CHARACTER*" << m_ctc_string_len << " " << m_ctc_string_variable << "\n"; if ( s_format == F_FIX ) { os << " PARAMETER (" << m_ctc_string_variable << "=\n"; os << " &" << ctc_string << ")\n\n"; } else { os << " PARAMETER (" << m_ctc_string_variable << "=&\n"; os << " " << ctc_string << ")\n\n"; } s_common_block.push_back( m_id ); } else if ( s_lang & L_F90 ) { os << " INTEGER( KIND=8 ) :: " << region_id_prefix << m_id << "\n\n"; if ( s_format == F_FREE ) { os << " CHARACTER (LEN=" << m_ctc_string_len << "), parameter :: "; os << m_ctc_string_variable << " =&\n " << ctc_string << "\n\n"; } else { os << " CHARACTER (LEN=" << m_ctc_string_len << "), parameter :: "; os << m_ctc_string_variable << " =\n &" << ctc_string << "\n\n"; } s_common_block.push_back( m_id ); } else if ( s_lang & L_C_OR_CXX ) { os << "static " << "OPARI2_Region_handle " << region_id_prefix << m_id; if ( s_preprocessed_file ) { os << " = (OPARI2_Region_handle)0;\n"; } else { os << " = NULL;\n"; } os << "#define " << m_ctc_string_variable << " " << ctc_string << "\n"; } } void OPARI2_Directive::remove_commas( void ) { int bracket_counter = 0; for ( unsigned int line = 0; line < m_lines.size(); line++ ) { for ( unsigned int c = 0; c < m_lines[ line ].length(); c++ ) { if ( m_lines[ line ][ c ] == '(' ) { bracket_counter++; } if ( m_lines[ line ][ c ] == ')' ) { bracket_counter--; } if ( bracket_counter == 0 && m_lines[ line ][ c ] == ',' ) { m_lines[ line ][ c ] = ' '; } } } return; } /** @brief Returns the arguments of a clause. */ string OPARI2_Directive::find_arguments( unsigned& line, string::size_type& pos, bool remove, string clause ) { string arguments; int bracket_counter = 0; if ( remove ) { m_lines[ line ].replace( pos, clause.length(), string( clause.length(), ' ' ) ); } pos += clause.length(); pos = m_lines[ line ].find_first_not_of( " \t", pos ); if ( ( pos != string::npos ) && ( m_lines[ line ][ pos ] == '(' ) ) { bracket_counter++; if ( remove ) { m_lines[ line ][ pos ] = ' '; } pos++; } bool contComm = false; // Continuation line or comment found while ( bracket_counter > 0 ) { if ( m_lines[ line ][ pos ] == '(' ) { bracket_counter++; } if ( ( s_lang & L_C_OR_CXX && m_lines[ line ][ pos ] == '\\' ) || ( s_lang & L_FORTRAN && m_lines[ line ][ pos ] == '&' ) ) { pos = m_lines[ line ].length(); } else { if ( s_lang & L_FORTRAN && m_lines[ line ][ pos ] == '!' ) { contComm = true; } else { arguments.append( 1, m_lines[ line ][ pos ] ); if ( remove ) { m_lines[ line ][ pos ] = ' '; } pos++; } } if ( pos >= m_lines[ line ].length() || contComm ) { if ( s_lang & L_FORTRAN && !remove_empty_line( line ) ) { line++; } contComm = false; if ( line >= m_lines.size() ) { std::cerr << m_filename << ":" << m_begin_first_line << ": ERROR: Missing ) for " << clause << " clause \n" << std::endl; cleanup_and_exit(); } else if ( s_lang & L_FORTRAN ) { pos = m_lines[ line ].find_first_of( "!*cC" ) + 6; pos = m_lines[ line ].find_first_not_of( " \t", pos ); if ( m_lines[ line ][ pos ] == '&' ) { pos++; } } else if ( s_lang & L_C_OR_CXX ) { pos = 0; } } if ( m_lines[ line ][ pos ] == ')' ) { bracket_counter--; } } //remove last bracket if necessary if ( remove && pos != string::npos ) { m_lines[ line ][ pos ] = ' '; //remove comma after the removed clause if needed while ( m_lines[ line ][ pos ] == ' ' ) { pos++; } if ( m_lines[ line ][ pos ] == ',' ) { m_lines[ line ][ pos ] = ' '; } } size_t p; p = arguments.find( ' ' ); while ( p != string::npos ) { arguments.erase( p, 1 ); p = arguments.find( ' ' ); } return arguments; } /** remove empty continued lines inside of pragma*/ bool OPARI2_Directive::remove_empty_line( unsigned& line ) { string lline = m_lines[ line ]; lline.erase( remove_if( lline.begin(), lline.end(), isspace ), lline.end() ); transform( lline.begin(), lline.end(), lline.begin(), tolower ); if ( lline.compare( m_directive_prefix[ 0 ] ) == 0 ) { if ( m_lines.size() == ( line + 1 ) ) { m_lines[ line - 1 ][ m_lines[ line - 1 ].find_last_of( "&" ) ] = ' '; } m_lines.erase( m_lines.begin() + line ); return true; } return false; } bool OPARI2_Directive::find_word( const string word, unsigned& line, string::size_type& pos ) { if ( s_lang & L_C_OR_CXX ) { for ( unsigned i = line; i < m_lines.size(); ++i ) { string::size_type w = m_lines[ i ].find( word ); while ( w != string::npos ) { char a; char b; //word may start at position 0 of a continuation line if ( w == 0 ) { b = ' '; } else { b = m_lines[ i ][ w - 1 ]; } if ( m_lines[ i ].length() > w + word.length() ) { a = m_lines[ i ][ w + word.length() ]; } else { a = ' '; } if ( ( b == ' ' || b == '\t' || b == '/' || b == ')' || b == ',' || b == '#' ) && ( a == ' ' || a == '\t' || a == '/' || a == '(' || a == ',' ) ) { line = i; pos = w; return true; } else { w++; if ( w != string::npos ) { w = m_lines[ i ].find( word, w ); } } } pos = 0; } } else if ( s_lang & L_FORTRAN ) { for ( unsigned i = line; i < m_lines.size(); ++i ) { string::size_type s = ( pos == 0 ) ? m_lines[ i ].find( m_directive_prefix[ 0 ] ) + m_directive_prefix[ 0 ].length() : pos; string::size_type w = m_lines[ i ].find( word, s ); string::size_type c = m_lines[ i ].find( '!', s ); // if word found and found before comment while ( w != string::npos && ( c == string::npos || ( c != string::npos && w < c ) ) ) { char b = m_lines[ i ][ w - 1 ]; char a; if ( m_lines[ i ].length() > w + word.length() ) { a = m_lines[ i ][ w + word.length() ]; } else { a = ' '; } if ( ( b == ' ' || b == '\t' || b == '!' || b == ')' || b == ',' ) && ( a == ' ' || a == '\t' || a == '!' || a == '(' || a == ',' || a == '&' ) ) { line = i; pos = w; return true; } else { w++; if ( w != string::npos ) { w = m_lines[ i ].find( word, w ); } } } pos = 0; } } return false; } string OPARI2_Directive::find_next_word( void ) { if ( s_lang & L_C_OR_CXX ) { while ( m_pline < m_lines.size() ) { string::size_type wbeg = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( wbeg == string::npos || m_lines[ m_pline ][ wbeg ] == '\\' ) { ++m_pline; if ( m_pline < m_lines.size() ) { m_ppos = 0; } else { return ""; } } else if ( m_lines[ m_pline ][ wbeg ] == '(' || m_lines[ m_pline ][ wbeg ] == ')' || m_lines[ m_pline ][ wbeg ] == '#' ) { m_ppos = wbeg + 1; return string( 1, m_lines[ m_pline ][ wbeg ] ); } else { m_ppos = m_lines[ m_pline ].find_first_of( " \t()", wbeg ); return m_lines[ m_pline ].substr( wbeg, m_ppos == string::npos ? m_ppos : m_ppos - wbeg ); } } } else if ( s_lang & L_FORTRAN ) { string sentinel = m_directive_prefix[ 0 ]; while ( m_pline < m_lines.size() ) { string::size_type wbeg = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( wbeg == string::npos || m_lines[ m_pline ][ wbeg ] == '&' ) { ++m_pline; if ( m_pline < m_lines.size() ) { m_ppos = m_lines[ m_pline ].find( sentinel ) + sentinel.length(); m_ppos = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( m_lines[ m_pline ][ m_ppos ] == '&' || m_lines[ m_pline ][ m_ppos ] == '+' ) { ++m_ppos; } } else { return ""; } } else if ( m_lines[ m_pline ][ wbeg ] == '(' || m_lines[ m_pline ][ wbeg ] == ')' ) { m_ppos = wbeg + 1; return string( 1, m_lines[ m_pline ][ wbeg ] ); } else { m_ppos = m_lines[ m_pline ].find_first_of( " \t()&", wbeg ); return m_lines[ m_pline ].substr( wbeg, m_ppos == string::npos ? m_ppos : m_ppos - wbeg ); } } } return ""; } void OPARI2_Directive::fix_clause_arg( vector& outer, vector& inner, unsigned& line, string::size_type& pos ) { char* optr = &( outer[ line ][ pos ] ); char* iptr = &( inner[ line ][ pos ] ); string sentinel = m_directive_prefix[ 0 ]; string::size_type slen = sentinel.length(); while ( *optr != ')' ) { while ( ( ( s_lang & L_C_OR_CXX ) && *optr == '\\' ) || ( ( ( s_lang & L_FORTRAN ) && ( *optr == '!' || *optr == '&' ) ) || pos >= outer[ line ].size() ) ) { // skip to next line ++line; if ( line >= outer.size() ) { return; } if ( s_lang & L_FORTRAN ) { pos = outer[ line ].find( sentinel ) + slen; pos = outer[ line ].find_first_not_of( " \t", pos ); if ( outer[ line ][ pos ] == '&' ) { ++pos; } } else if ( s_lang & L_C_OR_CXX ) { pos = 0; } optr = &( outer[ line ][ pos ] ); iptr = &( inner[ line ][ pos ] ); } *iptr = *optr; *optr = ' '; ++iptr; ++optr; ++pos; } *iptr = ')'; *optr = ' '; } /** * @brief Remove empty lines in directive 'lines'. */ void OPARI2_Directive::remove_empties( void ) { if ( s_lang & L_C_OR_CXX ) { vector::iterator it = m_lines.begin(); while ( it != m_lines.end() ) { string::size_type l = it->find_first_not_of( " \t&" ); if ( l == string::npos || ( *it )[ l ] == '\\' ) { it = m_lines.erase( it ); } else { ++it; } } // make sure last line is not a continued line int lastline = m_lines.size() - 1; string::size_type lastpos = m_lines[ lastline ].size() - 1; if ( m_lines[ lastline ][ lastpos ] == '\\' ) { m_lines[ lastline ][ lastpos ] = ' '; } } else if ( s_lang & L_FORTRAN ) { // remove lines without content string sentinel = m_directive_prefix[ 0 ]; vector::iterator it = m_lines.begin(); while ( it != m_lines.end() ) { string::size_type pos = it->find( sentinel ) + sentinel.length(); if ( ( *it )[ pos ] == '&' || ( *it )[ pos ] == '+' ) { ++pos; } pos = it->find_first_not_of( " \t&", pos ); if ( pos == string::npos || ( *it )[ pos ] == '!' ) { it = m_lines.erase( it ); } else { ++it; } } // make sure 1st line is not a continuation line string::size_type pos = m_lines[ 0 ].find( sentinel ); if ( pos == 0 ) { m_lines[ 0 ][ sentinel.length() ] = ' '; } else { string::size_type l = m_lines[ 0 ].find_first_not_of( " \t", pos + sentinel.length() ); if ( m_lines[ 0 ][ l ] == '&' || m_lines[ 0 ][ l ] == '+' ) { m_lines[ 0 ][ l ] = ' '; } } // make sure last line is not a continued line int lastline = m_lines.size() - 1; pos = m_lines[ lastline ].find( sentinel ) + sentinel.length(); pos = m_lines[ lastline ].find( '!', pos ); if ( pos != string::npos ) { --pos; } string::size_type amp = m_lines[ lastline ].find_last_not_of( " \t", pos ); if ( m_lines[ lastline ][ amp ] == '&' ) { m_lines[ lastline ][ amp ] = ' '; } } } /** Initialize static variables */ void OPARI2_Directive::SetOptions( OPARI2_Language_t lang, OPARI2_Format_t form, bool keep_src, bool preprocessed, const string id ) { s_lang = lang; s_format = form; s_keep_src_info = keep_src; s_preprocessed_file = preprocessed; s_inode_compiletime_id = id; } /** * Where/when are they modified? */ vector OPARI2_Directive:: s_common_block; OPARI2_Directive* OPARI2_Directive::s_outer = NULL; int OPARI2_Directive:: s_num_all_regions = 0; string OPARI2_Directive:: s_inode_compiletime_id; OPARI2_Language_t OPARI2_Directive::s_lang = L_NA; OPARI2_Format_t OPARI2_Directive:: s_format = F_NA; bool OPARI2_Directive:: s_keep_src_info = false; bool OPARI2_Directive:: s_preprocessed_file = false; opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_directive_entry.h0000644000000000000000000000013214015716474021124 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.340005798 opari2-2.0.6/src/opari/opari2_directive_entry.h0000644000175100001440000000325714015716474022326 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry.h * * @brief Macro definitions for the creation of the table holding all * supported directives */ #ifndef OPARI2_DIRECTIVE_ENTRY_H #define OPARI2_DIRECTIVE_ENTRY_H /** * @brief MACRO definition for the creation of a directive table entry * with a corresponding end-directive. */ #define OPARI2_CREATE_TABLE_ENTRY( type, name, loop, disable_with_paradigm, version, group, paradigm ) \ { type, #name, "end" #name, #version, group, true, true, true, loop, false, disable_with_paradigm, h_ ## paradigm ## _ ## name, h_end_ ## paradigm ## _ ## name } /** * @brief MACRO definition for the creation of a directive table entry * without a corresponding end-directive. */ #define OPARI2_CREATE_TABLE_ENTRY_NOEND( type, name, loop, version, group, paradigm ) \ { type, #name, "", #version, group, true, true, false, loop, false, true, h_ ## paradigm ## _ ## name, NULL } /** * @brief MACRO definition for the creation of a directive table entry * for a directive that applies only to the next statement. */ #define OPARI2_CREATE_TABLE_ENTRY_SINGLE_STATEMENT( type, name, loop, disable_with_paradigm, version, group, paradigm ) \ { type, #name, "", #version, group, true, true, true, loop, true, disable_with_paradigm, h_ ## paradigm ## _ ## name, h_end_ ## paradigm ## _ ## name } #endif opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_directive_definition.h0000644000000000000000000000013214015716474022113 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.340005798 opari2-2.0.6/src/opari/opari2_directive_definition.h0000644000175100001440000000561114015716474023311 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_definition.h * * @brief This file defines data structures to represent directive and runtime API. */ #ifndef OPARI2_DIRECTIVE_DEFINITION_H #define OPARI2_DIRECTIVE_DEFINITION_H #include #include using std::ostream; #include using std::string; #include "opari2.h" #include "opari2_directive.h" typedef void ( * DirectiveHandler )( OPARI2_Directive*, ostream& ); /** * @brief Structure definition for a paradigm directive. */ typedef struct { OPARI2_ParadigmType_t type; /**< paradigm the directive belongs to. */ const string name; /**< directive name. */ const string end_name; /**< directive closing name, if any. */ const string version; /**< version of standard/specification. */ uint64_t group; /**< group the directive belongs to */ bool active; /**< directive enabled? */ bool inner_active; /**< inner begin/end instrumentation enabled? */ bool require_end; /**< need end handling? */ bool loop_block; /**< Directive must be followed by a loop */ bool single_statement; /**< Directive only applies to the next statement */ bool disable_with_paradigm; /**< Specfies whether this directive gets instrumented, even when the paradigm is disabled, e.g. omp parallel */ DirectiveHandler do_enter_transformation; /**< handler for region enter instrumentation */ DirectiveHandler do_exit_transformation; /**< handler for region exit instrumentation */ } OPARI2_DirectiveDefinition; /** * @brief Structure definition for a paradigm runtime API. */ typedef struct { OPARI2_ParadigmType_t type; /**< paradigm the API belongs to */ const string name; /**< API name */ const string version; /**< version of standard/specification */ uint64_t group; /**< group the API belongs to */ bool active; /**< API enabled? */ const string wrapper; /**< name of the wrapper funtion */ const string header_file_c; /***< name of the include file of the API */ const string header_file_f; /***< name of the include file of the API */ } OPARI2_RuntimeAPIDefinition; #endif // OPARI2_DIRECTIVE_DEFINITION_H opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_directive_manager.h0000644000000000000000000000013214015716474021375 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.336005786 opari2-2.0.6/src/opari/opari2_directive_manager.h0000644000175100001440000001263014015716474022572 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_manager.h * * @brief Interface declaration of 'DirectiveManager' */ #ifndef OPARI2_DIRECTIVE_MANAGER_H #define OPARI2_DIRECTIVE_MANAGER_H #include using std::vector; #include using std::map; #include using std::stack; #include using std::string; #include #include "opari2_directive.h" /* Map entry. Matches string to enum */ typedef struct { /** string representation*/ string mString; /** matching region type*/ int mEnum; } OPARI2_MapString2ParadigmNameType; /** @brief Disables the instrumentation of whole paradigms or specific * directives. * * Check if the combination of directive/paradigm is supported by * looking up the directive_table. * * @param paradigm name of the paradigm. * @param directive name of the directive. * * @return true ONLY if the combination of paradigm and directive * is found in the diretive_table. * false otherwise. */ bool DisableParadigmDirectiveOrGroup( const string& paradigm, const string& directiveOrGroup, bool inner ); /** * @brief Different levels for full or partial disabling if * instrumentation. * * Bitfield for disabling specific types of instrumentation. E.g. for * OpenMP, when POMP directives are used to disable instrumentation * (D_USER) it must still be activated for the parallel regions so a * measurement system can manage events for different threads in a * threadsafe manner. For the case that code is put on a device where * there is no measurement system, even this instrumentation must be * disabled, thus the level D_FULL. */ typedef enum { D_NONE = 0x00000000, D_USER = 0x00000001, D_FULL = 0xFFFFFFFF } OPARI2_Disable_level_t; /** @brief Disables instrumentation for a specified level */ void DisableInstrumentation( OPARI2_Disable_level_t l ); /** @brief Re-enables instrumentation for a specified level */ void EnableInstrumentation( OPARI2_Disable_level_t l ); /** @brief Checks whether instrumentation for a specified level is * disabled. * * This function checks whether instrumentation for the requested * level or a superior level is disabled. * * @param l specific level to check for * * @return true if current disable level is D_NONE * or l is in the group of current level */ bool InstrumentationDisabled( OPARI2_Disable_level_t l = D_NONE ); bool IsValidSentinel( const string& lowline, string::size_type p, string& sentinel ); /** * @brief Check the validality of a given paradigm and directive. * * Check if the combination of directive/paradigm is supported by * looking up the directive_table. * * @param paradigm name of the paradigm. * @param directive name of the directive. * * @return true ONLY if the combination of paradigm and directive * is found in the directive_table. * false otherwise. */ bool IsValidDirective( const string& paradigm, string& directive ); /** * @brief Check if a directive's active flag is true. * * @param type type of the paradigm. * @param directive name of the directive. * * @return the active member of the to @a directive corresponding * directive_table entry. Return false if no directive_table entry * could be found. */ bool DirectiveActive( OPARI2_ParadigmType_t type, const std::string& directive ); OPARI2_Directive* NewDirective( vector& lines, vector& directive_prefix, OPARI2_Language_t lang, const string& file, const int lineno ); void SetLoopDirective( OPARI2_Directive* d ); OPARI2_Directive* GetLoopDirective( void ); void ProcessDirective( OPARI2_Directive* d, ostream& os, bool* require_end = NULL, bool* is_for = NULL ); bool IsSupportedAPIHeaderFile( const string& include_file, OPARI2_Language_t lang ); /** * @brief Replace a runtime API in the line with its wrapper API if enabled. */ void ReplaceRuntimeAPI( string& lowline, string& line, const string& file, OPARI2_Language_t lang ); void SaveForInit( OPARI2_Directive* d ); void DirectiveStackPush( OPARI2_Directive* d ); OPARI2_Directive* DirectiveStackTop( OPARI2_Directive* d = NULL ); void DirectiveStackPop( OPARI2_Directive* d = NULL ); void PrintDirectiveStackTop( void ); void DirectiveStackInsertDescr( int ); /** * @brief Generate the final *.opari.inc file. * * Need revision if multiple kinds of paradigms are used in the source * fle. Current implementation considers OpenMP and POMP ONLY! * */ void Finalize( OPARI2_Option_t& options ); void SaveSingleLineDirective( OPARI2_Directive* d ); void HandleSingleLineDirective( const int lineno, ostream& os ); #endif // OPARI2_DIRECTIVE_MANAGER_H opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_directive_manager.cc0000644000000000000000000000013214015716474021533 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.336005786 opari2-2.0.6/src/opari/opari2_directive_manager.cc0000644000175100001440000006601014015716474022731 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_manager.cc * * @brief This file contains APIs to disable, process directive * and runtime entries in a separate namespace. */ #include #include using std::cerr; #include using std::string; #include using std::vector; #include using std::map; #include using std::stack; #include #include using std::toupper; #include "opari2.h" #include "opari2_directive_definition.h" #include "opari2_directive_manager.h" #include "openmp/opari2_omp_handler.h" #include "openmp/opari2_directive_openmp.h" #include "openmp/opari2_directive_entry_openmp.h" #include "pomp/opari2_pomp_handler.h" #include "pomp/opari2_directive_pomp.h" #include "pomp/opari2_directive_entry_pomp.h" #include "offload/opari2_offload_handler.h" #include "offload/opari2_directive_offload.h" #include "offload/opari2_directive_entry_offload.h" static const OPARI2_MapString2ParadigmNameType paradigm_identifiers[] = { OPARI2_OPENMP_SENTINELS, OPARI2_POMP2_USER_SENTINELS, OPARI2_OFFLOAD_SENTINELS }; /** * @brief Array holding all definitions for all supported directives * of all supported paradigms. */ OPARI2_DirectiveDefinition directive_table[] = { OPARI2_OPENMP_DIRECTIVE_ENTRIES, OPARI2_POMP_DIRECTIVE_ENTRIES, //OPARI2_OPENACC_DIRECTIVE_ENTRIES, //OPARI2_TMSE_DIRECTIVE_ENTRIES, OPARI2_OFFLOAD_DIRECTIVE_ENTRIES }; /** * @brief Array holding all definitions for all supported API * functions of all supported paradigms. */ OPARI2_RuntimeAPIDefinition api_table[] = { OPARI2_OPENMP_API_ENTRIES //OPARI2_OPENACC_API_ENTRIES }; OPARI2_Directive* saved_single_line_directive = NULL; /** * @brief Convert paradigm string to ParadigmType. */ OPARI2_ParadigmType_t string_to_paradigm_type( const string& str ) { int n = sizeof( paradigm_identifiers ) / sizeof( OPARI2_MapString2ParadigmNameType ); for ( int i = 0; i < n; i++ ) { if ( str.compare( paradigm_identifiers[ i ].mString ) == 0 ) // if( str == paradigm_identifiers[ i ].mString ) { return ( OPARI2_ParadigmType_t )paradigm_identifiers[ i ].mEnum; } } return OPARI2_PT_NONE; } string paradigm_type_to_string( OPARI2_ParadigmType_t type ) { string str; switch ( type ) { case OPARI2_PT_OMP: str = "OpenMP"; break; case OPARI2_PT_POMP: str = "POMP"; break; case OPARI2_PT_OPENACC: str = "OpenACC"; break; case OPARI2_PT_OFFLOAD: str = "Offload"; break; case OPARI2_PT_TMSE: str = "TMSE"; break; default: str = "Unknown paradigm type"; break; } return str; } /** * @brief Convert group name to group number (uint64_t). * * In case of the same group names in different paradigm, * ParadigmType is used jointly to get a correct group number. * * @param [in] type paradigm type * @param [in] str group name in string * * @return G_NONE: conversion failed * others: OK */ uint64_t string_to_group( OPARI2_ParadigmType_t type, const string& str ) { switch ( type ) { case OPARI2_PT_OMP: return OPARI2_DirectiveOpenmp::String2Group( str ); case OPARI2_PT_POMP: return OPARI2_DirectivePomp::String2Group( str ); case OPARI2_PT_OFFLOAD: return OPARI2_DirectiveOffload::String2Group( str ); case OPARI2_PT_TMSE: default: return G_OMP_NONE; } } vector tmp_directives; vector directive_vec; vector directive_stack; /** * Keep track of the paradigm used in the source file. * Can be 'OR'ed with multiple paradigm types */ uint32_t instrumented_paradigm_type = 0; bool pomp2_header_included = false; bool DisableParadigmDirectiveOrGroup( const string& paradigm, const string& directiveOrGroup, bool inner ) { OPARI2_ParadigmType_t type = string_to_paradigm_type( paradigm ); if ( type == OPARI2_PT_NONE ) { cerr << "Unknown paradigm " << paradigm << std::endl; return false; } bool disableWholeParadigm = directiveOrGroup.compare( "" ) == 0; OPARI2_ParadigmType par_type = string_to_paradigm_type( paradigm ); uint64_t group = string_to_group( par_type, directiveOrGroup ); if ( !disableWholeParadigm && group == 0 && !IsValidDirective( paradigm, ( string& )directiveOrGroup ) ) { cerr << "Unknown group or directive: " << directiveOrGroup << std::endl; return false; } int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && ( ( disableWholeParadigm && directive_table[ i ].disable_with_paradigm ) || directiveOrGroup.compare( directive_table[ i ].name ) == 0 || directive_table[ i ].group & group ) ) { // printf( "Disabling directive: %s:%s inner:%d\n", paradigm.c_str(), directive_table[ i ].name.c_str(), inner ); if ( inner ) { directive_table[ i ].inner_active = false; } else { directive_table[ i ].active = false; } } } size = sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == api_table[ i ].type && ( disableWholeParadigm || api_table[ i ].group & group ) ) { api_table[ i ].active = false; } } return true; } typedef pair OPARI2_Disable_level_cur_max_t; static stack disable_levels( std::deque( 1, OPARI2_Disable_level_cur_max_t( D_NONE, D_NONE ) ) ); void DisableInstrumentation( OPARI2_Disable_level_t l ) { OPARI2_Disable_level_cur_max_t level; level.first = l; level.second = ( OPARI2_Disable_level_t )( l | disable_levels.top().second ); disable_levels.push( level ); } void EnableInstrumentation( OPARI2_Disable_level_t l ) { disable_levels.pop(); if ( disable_levels.empty() ) { cerr << "Invalid nesting of regions, disabling certain instrumentation. " << "Check usage of pomp noinstrument/instrument directives." << std::endl; cleanup_and_exit(); } } bool InstrumentationDisabled( OPARI2_Disable_level_t l ) { /* This works for now (only one group and one sublevel */ return disable_levels.top().second != D_NONE && l <= disable_levels.top().second; /* If more fields are added it might be changed to something like the expression below */ // return ( disable_levels.top().second != D_NONE && // ( ( l < disable_levels.top().second && l | disable_levels.top().second ) || // ( l == disable_levels.top().second ) ) ); } bool IsValidSentinel( const string& lowline, string::size_type p, string& sentinel ) { int n = sizeof( paradigm_identifiers ) / sizeof( OPARI2_MapString2ParadigmNameType ); for ( int i = 0; i < n; i++ ) { if ( lowline.find( paradigm_identifiers[ i ].mString ) == p ) { sentinel = paradigm_identifiers[ i ].mString; return true; } } return false; } bool IsValidDirective( const string& paradigm, string& directive ) { OPARI2_ParadigmType_t type = string_to_paradigm_type( paradigm ); int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( ( type == directive_table[ i ].type ) && ( directive.compare( directive_table[ i ].name ) == 0 ) ) { return true; } } return false; } /** * @brief Check if a given paradigm/directive is enabled. * * @param type name of the paradigm type. * @param directive name of the directive. * * @return true if the given directive is found in the "directive_table" and enabled. false otherwise. */ bool directive_enabled( OPARI2_ParadigmType_t type, string& directive ) { int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && ( directive.compare( directive_table[ i ].name ) == 0 || directive.compare( directive_table[ i ].end_name ) == 0 ) ) { // We know the directive. // It might be disabled, indicated by the active flag. // The active flag is evaluated in ProcessDirective() and // HandleSingleLineDirective(); if inactive, the directive is printed // preceded by a #line directive. IMO (CF) the #line directive makes // no sense but if it is omitted, make check fails. Therefore just // return true instead of directive_table[ i ].active. return true; } } // We don't know the directive. return false; } OPARI2_DirectiveDefinition* get_directive_table_entry( OPARI2_ParadigmType_t type, const std::string& directive ) { int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && directive.compare( directive_table[ i ].name ) == 0 ) { return ( OPARI2_DirectiveDefinition* )( &( directive_table[ i ] ) ); } } return NULL; } /** * @brief Given a OPARI2_Directive object, get the matching entry in * the directive_table. * * The entry is matching if both the type and name are the same as the * object. */ OPARI2_DirectiveDefinition* get_directive_table_entry( OPARI2_Directive* d ) { return get_directive_table_entry( d->GetParadigmType(), d->GetName() ); } bool DirectiveActive( OPARI2_ParadigmType_t type, const std::string& directive ) { OPARI2_DirectiveDefinition* d = get_directive_table_entry( type, directive ); if ( d ) { return d->active; } return false; } OPARI2_Directive* NewDirective( vector& lines, vector& directive_prefix, OPARI2_Language_t lang, const string& file, const int lineno ) { OPARI2_ParadigmType_t type = OPARI2_PT_NONE; OPARI2_Directive* new_directive = NULL; string sentinel; if ( directive_prefix.size() ) { sentinel = directive_prefix[ directive_prefix.size() - 1 ]; type = string_to_paradigm_type( sentinel ); } else if ( lang & L_C_OR_CXX ) { /* If the directive_prefix is not provided, this is an * automatically generated end region directive */ type = DirectiveStackTop()->GetParadigmType(); } else { cerr << "ERROR: Undefined directive type!\n"; cleanup_and_exit(); } OPARI2_DirectiveDefinition* d_def; switch ( type ) { case OPARI2_PT_OMP: new_directive = new OPARI2_DirectiveOpenmp( file, lineno, lines, directive_prefix ); /* Needed for Fortran end do loop detection */ d_def = get_directive_table_entry( new_directive ); if ( d_def ) { new_directive->NeedsEndLoopDirective( d_def->loop_block ); } break; case OPARI2_PT_POMP: new_directive = new OPARI2_DirectivePomp( file, lineno, lines, directive_prefix ); break; case OPARI2_PT_OFFLOAD: new_directive = new OPARI2_DirectiveOffload( file, lineno, lines, directive_prefix ); break; /*no directives supported so far for openacc and tmse*/ case OPARI2_PT_NONE: case OPARI2_PT_OPENACC: case OPARI2_PT_TMSE: break; } if ( new_directive ) { if ( directive_enabled( type, new_directive->GetName() ) || new_directive->GetName() == "$END$" ) { tmp_directives.push_back( new_directive ); return new_directive; } delete new_directive; } return NULL; } void ProcessDirective( OPARI2_Directive* d, ostream& os, bool* require_end, bool* is_for ) { OPARI2_DirectiveDefinition* d_def = NULL; string name = d->GetName(); //std::cout << "Processing " << name << std::endl; if ( name == "$END$" || // end of a directive (block) in C/C++ ( name.find( "end" ) != string::npos && // end of a directive (block) in Fortran name != "instaltend" && name != "instend" ) ) // except for POMP directive "inst altend/end" { // get the directive object at the top of the stack OPARI2_Directive* d_top = DirectiveStackTop( d ); if ( d->GetParadigmType() != d_top->GetParadigmType() ) { cerr << "\nWrong directive type for 'END' processing!\n"; } d_def = get_directive_table_entry( d_top ); if ( d_def ) { d->active = d_def->active; } else { d->active = true; } if ( d_def && d_def->active ) // enabled { if ( d_def->do_exit_transformation ) { d_def->do_exit_transformation( d, os ); } } else //disabled { if ( d_top->GetName() == "parallelfor" || d_top->GetName() == "paralleldo" || d_top->GetName() == "parallelsections" ) { d_def->do_exit_transformation( d, os ); } else { //simply output lines without any modification d->PrintDirective( os ); } // maintain the directive stack if ( d_def->require_end ) { DirectiveStackPop(); } } } else // beginning of a directive (block) { d_def = get_directive_table_entry( d ); if ( d_def ) { d->active = d_def->active; } else { d->active = true; } if ( d_def && d_def->active ) { instrumented_paradigm_type |= d_def->type; //std::cout << "Doing enter transformation" << std::endl; d_def->do_enter_transformation( d, os ); if ( require_end ) { *require_end = d_def->require_end; } if ( is_for ) { *is_for = ( name == "for" || name == "parallelfor" ); } } else // the directive is disabled { if ( d_def == NULL ) { // Unsupported directives should be ignored silently! // cerr << "Unsupported / invalid directive keyword \"" << d->GetName() << "\"\n"; } else { if ( require_end ) { *require_end = d_def->require_end; } /* * If the directive is disabled, always set 'is_for' to false */ if ( is_for ) { *is_for = false; } /** Even if the directive is disabled and not * instrumented, The directive, if requires "END", * should still be pushed onto the stack, so the * "END" directive can find the corresponding * end. */ if ( d_def->require_end ) { DirectiveStackPush( d ); } if ( d_def->single_statement ) { SaveSingleLineDirective( d ); } /** Directives that might be implicitly ended by the * end of a do loop*/ d->NeedsEndLoopDirective( d_def->loop_block ); } if ( name == "parallelfor" || name == "paralleldo" || name == "parallelsections" ) { instrumented_paradigm_type |= d_def->type; d_def->do_enter_transformation( d, os ); } else { // if disabled, simply output lines, without any modification d->PrintDirective( os ); } } } return; } /** @brief Check whether the current line is an omp function declaration */ bool is_runtime_decl( const string& file, const string& header_file ) { // If it is in the header file, its a declaration string::size_type pos = file.length() - header_file.length() - 1; return file == header_file || ( file[ pos ] == '/' && file.substr( pos + 1 ) == header_file ); } /** Replaces a runtime call with the wrapper function. This function is currently used only by the Fortran parser */ void ReplaceRuntimeAPI( string& lowline, string& line, const string& file, OPARI2_Language_t lang ) { size_t i = 0; size_t pos = 0; if ( InstrumentationDisabled() ) { return; } //Functions my not be replaced in a line like: use omp_lib, only: omp_init_lock if ( lowline.find( ":", lowline.find( "only", lowline.find( "omp_lib", lowline.find( "use" ) ) ) ) != string::npos ) { return; } for ( i = 0; i < sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); i++ ) { pos = 0; if ( api_table[ i ].active && !( lang & L_FORTRAN && is_runtime_decl( file, api_table[ i ].header_file_f ) ) && !( lang & L_C_OR_CXX && is_runtime_decl( file, api_table[ i ].header_file_c ) ) ) { while ( ( pos = lowline.find( api_table[ i ].name, pos ) ) != string::npos ) { /** * when "omp_test_lock" and "omp_test_nest_lock" functions are defined, * they may not be replaced. */ if ( ( !api_table[ i ].name.find( "test" ) ) || !( lowline.find( "logical" ) < pos ) ) { instrumented_paradigm_type |= api_table[ i ].type; line.replace( pos, 3, "POMP2" ); //Keep other letters unchanged, except for line[ pos + 6 ] line[ pos + 6 ] = std::toupper( line[ pos + 6 ] ); } pos += api_table[ i ].name.length(); } } } } set header_files_f; set header_files_c; bool IsSupportedAPIHeaderFile( const string& include_file, OPARI2_Language_t lang ) { if ( header_files_f.empty() || header_files_c.empty() ) { for ( unsigned long i = 0; i < sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); i++ ) { header_files_f.insert( api_table[ i ].header_file_f ); header_files_c.insert( api_table[ i ].header_file_c ); } } string file; set::iterator it, itb, ite; if ( lang & L_FORTRAN ) { itb = header_files_f.begin(); ite = header_files_f.end(); if ( ( *( include_file.begin() ) == '\"' && *( include_file.end() - 1 ) == '\"' ) || ( *( include_file.begin() ) == '\'' && *( include_file.end() - 1 ) == '\'' ) ) { file = include_file.substr( 1, include_file.length() - 2 ); } } else if ( lang & L_C_OR_CXX ) { itb = header_files_c.begin(); ite = header_files_c.end(); if ( ( *( include_file.begin() ) == '\"' && *( include_file.end() - 1 ) == '\"' ) || ( *( include_file.begin() ) == '<' && *( include_file.end() - 1 ) == '>' ) ) { file = include_file.substr( 1, include_file.length() - 2 ); } } if ( file.empty() ) { return false; } for ( it = itb; it != ite; ++it ) { if ( *it == file ) { return true; } } return false; } void SaveForInit( OPARI2_Directive* d ) { if ( !tmp_directives.empty() ) { vector::iterator it = tmp_directives.begin(); while ( it != tmp_directives.end() ) { if ( *it == d ) { it = tmp_directives.erase( it ); break; } else { ++it; } } } directive_vec.push_back( d ); } void DirectiveStackPush( OPARI2_Directive* d ) { directive_stack.push_back( d ); } OPARI2_Directive* DirectiveStackTop( OPARI2_Directive* d ) { if ( directive_stack.empty() ) { if ( d ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":" << "ERROR: unbalanced pragma/directive nesting for " << d->GetName() << " directive \n"; } else { cerr << "ERROR: unbalanced pragma/directive nesting!\n"; } cleanup_and_exit(); } else { return directive_stack.back(); } return NULL; } void DirectiveStackPop( OPARI2_Directive* d ) { OPARI2_Directive* d_top = DirectiveStackTop( d ); if ( !tmp_directives.empty() ) { vector::iterator it = tmp_directives.begin(); while ( it != tmp_directives.end() ) { if ( *it == d_top ) { /* This is the only reference left to this directive, so perform cleanup */ tmp_directives.erase( it ); directive_stack.pop_back(); delete d_top; return; } else { ++it; } } } directive_stack.pop_back(); } void PrintDirectiveStackTop( void ) { if ( directive_stack.empty() ) { cerr << "Error: Directive stack empty \n"; cleanup_and_exit(); } else { OPARI2_Directive* d = directive_stack.back(); if ( d ) { cerr << " near \"" << paradigm_type_to_string( d->GetParadigmType() ) << ": " << d->GetName() << "\" construct at " << d->GetFilename() << ":" << d->GetLineno() << std::endl; } } } void DirectiveStackInsertDescr( int id ) { for ( vector::iterator it = directive_stack.begin(); it != directive_stack.end(); ++it ) { if ( !( ( *it )->DescrsEmpty() ) ) { ( *it )->InsertDescr( id ); } } } void Finalize( OPARI2_Option_t& options ) { // check region stack if ( !directive_stack.empty() ) { cerr << "ERROR: unbalanced pragma/directive nesting\n"; while ( !directive_stack.empty() ) { PrintDirectiveStackTop(); DirectiveStackPop(); } cleanup_and_exit(); } // generate opari include file ofstream incs( options.incfile.c_str() ); if ( !incs ) { cerr << "ERROR: cannot open opari include file " << options.incfile << "\n"; exit( 1 ); } if ( options.lang & L_C_OR_CXX ) { /** In order to please the PGI compiler, the order of the header * generation between OpenMP and user instrumentation must not * be switched. Take care to test additions in that respect. * * The error that was encountered was that the * threadprivate(pomp_tpd) that is added for the * --thread=omp:pomp_tpd option caused: * "PGCC-S-0155-pomp_tpd_ is not threadprivate * (.../jacobi/cxx/main.cpp: 167) PGCC/x86 Linux 14.1-0: * compilation completed with severe errors" */ if ( instrumented_paradigm_type & OPARI2_PT_POMP ) { OPARI2_DirectivePomp::GenerateHeader( incs ); } if ( instrumented_paradigm_type & OPARI2_PT_OMP ) { OPARI2_DirectiveOpenmp::GenerateHeader( incs ); } } if ( directive_vec.size() ) { for ( vector::iterator it = directive_vec.begin(); it != directive_vec.end(); ++it ) { if ( ( *it )->GetName() != "offload" && ( *it )->GetName() != "declspec" ) { ( *it )->GenerateDescr( incs ); } } } if ( options.lang & L_FORTRAN ) { OPARI2_Directive::FinalizeFortranDescrs( incs ); OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( options.os, options.incfile_nopath ); OPARI2_DirectiveOpenmp::FinalizeDescrs( incs ); OPARI2_DirectivePomp::GenerateInitHandleCalls( options.os, options.incfile_nopath ); } else if ( options.lang & L_C_OR_CXX ) { OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( incs ); OPARI2_DirectivePomp::GenerateInitHandleCalls( incs ); } /*cleanup tmp_directives and directive_vec vectors*/ for ( vector::iterator it = tmp_directives.begin(); it != tmp_directives.end(); it++ ) { delete *it; } for ( vector::iterator it = directive_vec.begin(); it != directive_vec.end(); it++ ) { delete *it; } } void SaveSingleLineDirective( OPARI2_Directive* d ) { saved_single_line_directive = d; } void HandleSingleLineDirective( const int lineno, ostream& os ) { if ( saved_single_line_directive ) { OPARI2_DirectiveDefinition* d_def = get_directive_table_entry( saved_single_line_directive ); if ( d_def->active ) { /** @TODO This is currently the only case, nonetheless it should be generalized */ extra_openmp_atomic_handler( saved_single_line_directive, lineno, os ); } else { DirectiveStackPop(); saved_single_line_directive = NULL; } } } opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_parser_f.cc0000644000000000000000000000013214015716474017664 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.332005772 opari2-2.0.6/src/opari/opari2_parser_f.cc0000644000175100001440000011532514015716474021066 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2014, 2016, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_parser_f.cc * * @brief All functions to parse fortran files are collected here. */ #include #include using std::tolower; using std::toupper; #include using std::string; #include using std::getline; #include using std::transform; using std::sort; using std::min; #include using std::greater; #include using std::strlen; using std::remove_if; #include "config.h" #include "opari2_parser_f.h" #include "opari2_directive_manager.h" struct fo_tolower : public std::unary_function { int operator()( int x ) const { return std::tolower( x ); } }; OPARI2_FortranParser::OPARI2_FortranParser( OPARI2_Option_t& options ) : m_options( options ), m_os( options.os ), m_is( options.is ) { m_line = ""; m_lowline = ""; m_unprocessed_line = ""; m_lineno = 0; //m_loop_directives = NULL; m_need_pragma = false; m_in_string = 0; m_normal_line = false; m_in_header = false; m_continuation = false; m_sentinel = ""; m_offload_pragma = false; m_offload_attribute = ""; m_current_offload_function = ""; m_offload_subroutine = false; m_offload_function = false; m_waitfor_loopstart = false; m_waitfor_loopend = false; m_lineno_loopend = 0; m_curr_file = m_options.infile; if ( m_options.keep_src_info ) { /** The preprocessor of the Sun Studio compiler breaks if the * first line is a preprocessor directive, so we insert a * blank line at the beginning */ m_os << std::endl; m_os << "#line 1 \"" << m_options.infile << "\"" << "\n"; } } /**@brief Check if the line belongs to the header of a subroutine or function. * After lines in the header, we can insert our variable definitions.*/ bool OPARI2_FortranParser::is_sub_unit_header( void ) { string sline; string lline; string keyword; bool result; static bool continuation = false; static int openbrackets = 0; static bool inProgram = false; static bool inModule = false; static bool inInterface = false; static bool inContains = false; size_t pos; pos = m_lowline.find_first_not_of( " \t" ); /*string is empty*/ if ( pos == string::npos ) { pos = 0; sline.clear(); } else { sline = m_lowline.substr( pos ); } lline = sline; sline.erase( remove_if( sline.begin(), sline.end(), isspace ), sline.end() ); //Set number of open brackets to 0 if new unit begins, since we might have missed //closing brackets on continuation lines. if ( ( ( sline.find( "program" ) == 0 ) && lline.find( "program" ) != string::npos ) || ( ( sline.find( "module" ) == 0 ) && !inProgram && lline.find( "module" ) != string::npos ) || ( ( sline.find( "interface" ) == 0 ) && inModule && lline.find( "interface" ) != string::npos ) || ( ( sline.find( "abstractinterface" ) == 0 ) && inModule ) || ( ( sline.find( "contains" ) != string::npos ) && inModule && lline.find( "contains" ) != string::npos ) || ( sline.find( "subroutine" ) == 0 && lline.find( "subroutine" ) != string::npos ) || ( ( sline.find( "function" ) == 0 && lline.find( "function" ) != string::npos ) && !m_in_header && ( ( sline.find( "=" ) >= sline.find( "!" ) ) || ( sline.find( "=" ) >= sline.find( "kind" ) ) ) ) ) { openbrackets = 0; } //Check if we are in Fortran77 and have a character in column 6 if ( ( m_options.form & F_FIX ) && m_lowline.length() >= 6 && m_lowline[ 5 ] != ' ' && m_lowline.find( "\t" ) > 6 ) { continuation = true; } //Check if we enter a program block inProgram = inProgram || ( sline.find( "program" ) == 0 ); //Check if we enter a module block inModule = !inProgram && ( inModule || ( sline.find( "module" ) == 0 ) ); //Check if we enter an interface block inInterface = inModule && ( inInterface || ( sline.find( "interface" ) == 0 ) || ( sline.find( "abstractinterface" ) == 0 ) ); //Check if we enter a contains block inContains = inModule && ( inContains || ( sline.find( "contains" ) != string::npos ) ); //search for words indicating, that we did not reach a point where //we can insert variable definitions, these keywords are: //program, function, result, subroutine, save, implicit, parameter, //and use bool func = ( ( lline.find( "function" ) != string::npos ) && !( lline.find( "function" ) > lline.find( "pure" ) ) && !( lline.find( "function" ) > lline.find( "elemental" ) ) && !( lline.length() >= ( lline.find( "function" ) + 8 ) && ( isalnum( lline[ lline.find( "function" ) + 8 ] ) || ( lline[ lline.find( "function" ) + 8 ] == '_' ) ) ) && !( ( lline.find( "function" ) != 0 ) && ( isalnum( lline[ lline.find( "function" ) - 1 ] ) || ( lline[ lline.find( "function" ) - 1 ] == '_' ) ) ) && ( isalpha( sline[ sline.find( "function" ) + 8 ] ) || sline[ sline.find( "function" ) + 8 ] == '&' ) ); bool sub = ( ( lline.find( "subroutine" ) != string::npos ) && !( lline.find( "subroutine" ) > lline.find( "pure" ) ) && !( lline.find( "subroutine" ) > lline.find( "elemental" ) ) && !( lline.length() >= ( lline.find( "subroutine" ) + 10 ) && ( isalnum( lline[ lline.find( "subroutine" ) + 10 ] ) || ( lline[ lline.find( "subroutine" ) + 10 ] == '_' ) ) ) && !( ( lline.find( "subroutine" ) != 0 ) && ( isalnum( lline[ lline.find( "subroutine" ) - 1 ] ) || ( lline[ lline.find( "subroutine" ) - 1 ] == '_' ) ) ) && ( isalpha( sline[ sline.find( "subroutine" ) + 10 ] ) || sline[ sline.find( "subroutine" ) + 10 ] == '&' ) ); bool key = ( ( sline.find( "save" ) == 0 && m_in_header ) || ( sline.find( "result" ) == 0 && m_in_header ) || ( sline.find( "implicit" ) == 0 && m_in_header ) || ( sline.find( "use" ) == 0 && m_in_header ) || ( sline.find( "include" ) == 0 && m_in_header ) ); bool noend = ( sline.find( "endfunction" ) == string::npos && sline.find( "endsubroutine" ) == string::npos && sline.find( "endmodule" ) == string::npos && sline.find( "endprogram" ) == string::npos ); size_t pos_e = sline.find( "=" ); bool validequal = ( pos_e >= sline.find( "!" ) || pos_e > sline.find( "kind" ) || pos_e > sline.find( "only:" ) || pos_e == ( sline.find( ">" ) - 1 ) || pos_e > sline.find( "bind(" ) ); bool misc = ( ( sline.find( "#" ) == 0 && m_in_header ) || ( sline.find( "&" ) == 0 && m_in_header ) || ( sline.empty() && m_in_header ) || ( sline.find( "parameter" ) == 0 && m_in_header ) || ( sline.find( "dimension" ) == 0 && m_in_header ) || ( openbrackets != 0 && m_in_header ) || ( continuation && m_in_header ) ); /* Debug output */ /*std::cout << std::endl << lline << std::endl; std::cout << "continuation= " << continuation << std::endl; std::cout << "m_in_header= " << m_in_header << std::endl; std::cout << "func= " << func << std::endl; std::cout << "sub= " << sub << std::endl; std::cout << "key= " << key << std::endl; std::cout << "validequal= " << validequal << std::endl; std::cout << "misc= " << misc << std::endl; std::cout << "openbrackets= " << openbrackets << std::endl; std::cout << "inModule= " << inModule << std::endl; std::cout << "inInterface= " << inInterface << std::endl; std::cout << "inContains= " << inContains << std::endl; std::cout << "noend= " << noend << std::endl;*/ if ( ( ( sline.find( "program" ) == 0 || func || sub || key ) && noend && validequal ) || misc ) { result = !inModule || ( !inInterface && inContains ); } else { result = false; } //Check if we leave a program block inProgram = inProgram && sline.find( "endprogram" ) == string::npos; //Check if we leave a module block inModule = inModule && sline.find( "endmodule" ) == string::npos; //Check if we leave an interface block inInterface = inInterface && sline.find( "endinterface" ) == string::npos; //Check if we leave an contains block inContains = inContains && sline.find( "endmodule" ) == string::npos; if ( sline.length() && sline[ sline.length() - 1 ] == '&' ) { continuation = true; } else { continuation = false; } /*count open brackets, to see if a functionheader is split across different lines*/ for ( string::size_type i = 0; i < m_lowline.length(); i++ ) { bool in_string = false; if ( m_lowline[ i ] == '(' ) { openbrackets++; } if ( m_lowline[ i ] == ')' ) { openbrackets--; } if ( ( m_lowline[ i ] == '\'' || m_lowline[ i ] == '"' ) && in_string ) { in_string = false; } else { in_string = true; } /*rest of line is a comment*/ if ( m_lowline[ i ] == '!' && !in_string ) { break; } } return result; } bool OPARI2_FortranParser::is_empty_line( void ) { return m_lowline.find_first_not_of( " \t" ) == string::npos; } /**@brief check if this line is a comment line*/ bool OPARI2_FortranParser::is_comment_line( void ) { if ( m_options.form & F_FIX ) { if ( m_lowline[ 0 ] == '!' || m_lowline[ 0 ] == '*' || m_lowline[ 0 ] == 'c' ) { // fixed form comment if ( m_lowline[ 1 ] == '$' && m_lowline.find_first_not_of( " \t0123456789", 2 ) > 5 ) { // Conditional Compilation for fixed form m_lowline[ 0 ] = ' '; m_lowline[ 1 ] = ' '; return false; } else if ( m_lowline[ 1 ] == 'p' && m_lowline[ 2 ] == '$' && m_lowline.find_first_not_of( " \t0123456789", 3 ) > 5 ) { /** POMP Conditional Compilation for fixed form. This * allows code to be only active after processing * with OPARI2 by using the !P$ sentinel to start a * comment */ m_lowline[ 0 ] = m_line[ 0 ] = ' '; m_lowline[ 1 ] = m_line[ 1 ] = ' '; m_lowline[ 2 ] = m_line[ 2 ] = ' '; return false; } else { return true; } } } // free form comment size_t first_char = m_lowline.find_first_not_of( " \t" ); if ( ( first_char != string::npos ) && ( m_lowline[ first_char ] == '!' ) ) { if ( m_lowline[ first_char + 1 ] == '$' && ( m_lowline[ first_char + 2 ] == ' ' || m_lowline[ first_char + 2 ] == '\t' ) ) { // Conditional Compilation for free form m_lowline[ first_char ] = ' '; m_lowline[ first_char + 1 ] = ' '; return false; } else if ( m_lowline[ first_char + 1 ] == 'p' && m_lowline[ first_char + 2 ] == '$' && ( m_lowline[ first_char + 3 ] == ' ' || m_lowline[ first_char + 3 ] == '\t' ) ) { /** POMP Conditional Compilation for fixed form. This * allows code to be only active after processing with * OPARI2 by using the !P$ sentinel to start a * comment */ m_lowline[ first_char ] = m_line[ first_char ] = ' '; m_lowline[ first_char + 1 ] = m_line[ first_char + 1 ] = ' '; m_lowline[ first_char + 2 ] = m_line[ first_char + 2 ] = ' '; return false; } else { return true; } } return false; } /**@brief check if this line starts a do loop*/ bool OPARI2_FortranParser::is_loop_start( string& label ) { string::size_type poslab = string::npos; label = ""; if ( !( m_line.size() ) ) { return false; } // is there a 'do ' string::size_type pstart = m_lowline.find( "do" ); if ( pstart == string::npos || ( m_lowline[ pstart + 2 ] != '\0' && m_lowline[ pstart + 2 ] != ' ' && m_lowline[ pstart + 2 ] != '\t' ) ) { return false; } string::size_type pos = m_lowline.find_first_not_of( " \t" ); // cerr << "pos: " << pos << std::endl; if ( pos != pstart ) { // there is a DO_construct_name, i.e, this is a named do-loop poslab = m_lowline.find_first_of( ":", pos ); if ( poslab == string::npos ) { return false; } label = m_line.substr( pos, poslab - pos ); // skip white space pos = m_lowline.find_first_not_of( " \t", poslab + 1 ); } //check again, if pos now start of do, otherwise not a correct do statement pstart = m_lowline.find( "do", pos ); if ( pstart != pos || ( m_lowline[ pstart + 2 ] != '\0' && m_lowline[ pstart + 2 ] != ' ' && m_lowline[ pstart + 2 ] != '\t' ) ) { return false; } pos = m_lowline.find_first_not_of( " \t", pos + 2 ); // cerr << "pos2: " << pos << std::endl; if ( pos != string::npos && isdigit( m_lowline[ pos ] ) ) { // there is a stmtlabel poslab = pos; pos = m_lowline.find_first_not_of( "0123456789", pos ); // cerr << "2pos: " << pos << ", poslab: " << poslab << std::endl; label = m_line.substr( poslab, pos - poslab ); } // cerr << label << "\n\n"; return true; } /**@brief check if this line is the end of a do loop*/ bool OPARI2_FortranParser::is_loop_end( void ) { string toplabel = m_loop_stack.top().label; string label; if ( !( m_line.size() ) ) { return false; } string::size_type pos = m_lowline.find_first_not_of( " \t" ); // is it a nonblock DO loop? string::size_type poslab = toplabel.find_first_not_of( "0123456789" ); if ( ( toplabel.size() > 0 ) && ( poslab == string::npos ) ) { // search for nonblock Do loop poslab = pos; pos = m_lowline.find_first_not_of( "0123456789", pos ); // is there a label in this line? if ( poslab == pos ) { return false; } label = m_line.substr( poslab, pos - poslab ); // is it the label of the top loop if ( toplabel == label ) { return true; } else { return false; } } else { // search for block Do loop pos = m_lowline.find( "end", pos ); if ( pos == string::npos || ( pos != m_lowline.find_first_not_of( " \t0123456789" ) ) ) { return false; } // pos = m_lowline.find( "do", pos + 3 ); pos = m_lowline.find_first_not_of( " \t", pos + 3 ); if ( pos == string::npos || ( m_lowline.find( "do", pos ) > pos ) ) { return false; } pos = m_lowline.find( "do", pos ); if ( pos == string::npos || ( m_lowline.find( "=", pos ) < m_lowline.find( "!", pos ) ) ) { return false; } // search for label if ( toplabel.size() ) { // skip white space poslab = m_lowline.find_first_not_of( " \t", pos + 2 ); pos = m_lowline.find_first_of( " \t", poslab ); if ( poslab == pos ) { return false; } label = m_line.substr( poslab, pos - poslab ); // is it the label of the top loop if ( toplabel == label ) { return true; } else { return false; } } else { return true; // end do without label } } } void OPARI2_FortranParser::test_and_insert_enddo( void ) { if ( !m_loop_directives.empty() && m_waitfor_loopend ) { m_waitfor_loopend = false; if ( m_loop_directives.top()->NeedsEndLoopDirective() ) { OPARI2_Directive* d_new = m_loop_directives.top()->EndLoopDirective( m_lineno_loopend ); ProcessDirective( d_new, m_os ); m_loop_directives.pop(); delete d_new; } } } /** @brief Delete comments and strings before the lines are parsed * to avoid finding keywords in comments or strings.*/ void OPARI2_FortranParser::del_strings_and_comments( void ) { // zero out string constants and free form comments for ( string::size_type i = 0; i < m_lowline.size(); ++i ) { if ( m_in_string ) { // inside string if ( m_lowline[ i ] == m_in_string ) { m_lowline[ i ] = '@'; ++i; if ( i >= m_lowline.size() ) { // eol: no double string delimiter -> string ends m_in_string = 0; break; } if ( m_lowline[ i ] != m_in_string ) { // no double string delimiter -> string ends m_in_string = 0; continue; } } m_lowline[ i ] = '@'; } else if ( m_lowline[ i ] == '!' ) { /* -- zero out partial line F90 comments -- */ for (; i < m_lowline.size(); ++i ) { m_lowline[ i ] = ' '; } break; } else if ( m_lowline[ i ] == '\'' || m_lowline[ i ] == '\"' ) { m_in_string = m_lowline[ i ]; m_lowline[ i ] = '@'; } } } bool OPARI2_FortranParser::is_directive( void ) { m_sentinel = ""; string::size_type pos = string::npos; if ( m_options.form == F_FIX ) { if ( m_lowline.size() && ( m_lowline[ 0 ] == '!' || m_lowline[ 0 ] == 'c' || m_lowline[ 0 ] == '*' ) ) { pos = 0; } } else if ( m_options.form == F_FREE ) { string::size_type pstart = m_lowline.find_first_not_of( " \t" ); if ( pstart != string::npos && m_lowline.size() > pstart + 1 && m_lowline[ pstart ] == '!' ) { pos = pstart; } } if ( pos == string::npos ) { return false; } return IsValidSentinel( m_lowline, pos, m_sentinel ); } bool OPARI2_FortranParser::get_next_line( void ) { if ( getline( m_is, m_line ) ) { /* workaround for bogus getline implementations */ while ( m_line.size() == 1 && m_line[ 0 ] == '\0' ) { get_next_line(); } /* remove extra \r from Windows source files */ if ( m_line.size() && *( m_line.end() - 1 ) == '\r' ) { m_line.erase( m_line.end() - 1 ); } ++m_lineno; m_lowline = m_line; transform( m_line.begin(), m_line.end(), m_lowline.begin(), fo_tolower() ); /*check for Fortran continuation lines*/ if ( m_options.form == F_FREE ) { m_continuation = m_next_is_continuation; string::size_type amp = m_line.find_last_not_of( " \t" ); if ( amp != string::npos && m_line[ amp ] == '&' ) { m_continuation = true; } else { m_continuation = false; } } return true; } return false; } void OPARI2_FortranParser::handle_line_directive( const string::size_type lstart ) { /* line directive */ string::size_type loc = m_line.find_first_not_of( " \t", lstart + 1 ); if ( loc != string::npos && isdigit( m_line[ loc ] ) ) { string::size_type nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", lstart + 1 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); filename = m_line.substr( nrstart, nrend - nrstart ); if ( nrstart != 0 ) { if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_curr_file = filename; } else { /*relative path*/ string path( m_options.infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_curr_file = path + "/" + filename; } } m_os << m_line << std::endl; } else if ( m_line.substr( lstart + 1, 5 ) == "line " && isdigit( m_line[ m_line.find_first_not_of( " \t", lstart + 5 ) ] ) ) { int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", lstart + 5 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); if ( nrstart != 0 ) { filename = m_line.substr( nrstart, nrend - nrstart ); if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_curr_file = filename; } else { /*relative path*/ string path( m_options.infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_curr_file = path + "/" + filename; } } m_os << m_line << std::endl; } else { /*keep other C/C++ preprocessor directives like #if and #endif*/ m_os << m_line << std::endl; } } void OPARI2_FortranParser::handle_directive( void ) { if ( m_in_header == true ) { m_in_header = false; if ( !InstrumentationDisabled( D_FULL ) ) { m_os << " include \'" << m_options.incfile_nopath << "\'" << std::endl; } if ( m_options.keep_src_info ) { m_os << "#line " << m_lineno << " \"" << m_curr_file << "\"" << "\n"; } } vector lines; lines.push_back( m_lowline ); bool found_continuation_line; string prev_sentinel = m_sentinel; unsigned ignored_lines = 0; do { found_continuation_line = false; if ( m_options.form == F_FREE ) { string::size_type com = m_lowline.find( m_sentinel ) + m_sentinel.length(); com = m_lowline.find( "!", com ); if ( com != string::npos ) { --com; } string::size_type amp = m_lowline.find_last_not_of( " \t", com ); if ( m_lowline[ amp ] == '&' ) { found_continuation_line = true; } else { /** There is no continuation line, so jump out * of while loop */ break; } } if ( get_next_line() ) { m_unprocessed_line = true; ignored_lines++; prev_sentinel = m_sentinel; if ( is_directive() ) { if ( m_options.form == F_FIX ) { string::size_type p = m_lowline.find( m_sentinel ) + m_sentinel.length(); if ( ( m_sentinel == prev_sentinel && ( m_lowline[ p ] != ' ' && m_lowline[ p ] != '\t' && m_lowline[ p ] != '0' ) ) ) { found_continuation_line = true; } } if ( found_continuation_line ) { m_unprocessed_line = false; ignored_lines--; lines.push_back( m_lowline ); } } else if ( is_comment_line() ) { found_continuation_line = true; m_sentinel = prev_sentinel; } else if ( found_continuation_line && !is_empty_line() ) { cerr << m_curr_file << ":" << m_lineno - 1 << ": ERROR: missing continuation line\n"; cleanup_and_exit(); } } else { break; } } while ( found_continuation_line ); vector directive_prefix( 1, prev_sentinel ); OPARI2_Directive* d_new = NewDirective( lines, directive_prefix, m_options.lang, m_curr_file, m_lineno - lines.size() - ignored_lines + 1 ); if ( d_new ) { m_waitfor_loopstart = d_new->NeedsEndLoopDirective(); if ( !d_new->EndsLoopDirective() ) { test_and_insert_enddo(); } ProcessDirective( d_new, m_os ); if ( d_new->NeedsEndLoopDirective() ) { m_loop_directives.push( d_new ); } else if ( d_new->EndsLoopDirective() ) { m_loop_directives.pop(); m_waitfor_loopend = false; } d_new = NULL; m_need_pragma = false; } else { // Print orig code if directive is ignored. for ( vector::const_iterator line = lines.begin(); line != lines.end(); ++line ) { m_os << *line << std::endl; } } } bool OPARI2_FortranParser::is_free_offload_directive() { string::size_type lstart = string::npos; return m_lowline.size() && ( ( lstart = m_lowline.find_first_not_of( " \t" ) ) != string::npos ) && ( lstart == m_lowline.find( "!dir$" ) ) && ( m_lowline.find( "offload" ) != string::npos ); } void OPARI2_FortranParser::handle_free_offload_directive() { string::size_type pstart = 0; if ( ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 5 ) ) != string::npos ) && ( ( m_lowline.find( "offload", pstart ) == pstart ) || ( m_lowline.find( "omp", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 3 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) ) ) { if ( ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 7 ) ) != string::npos ) && m_lowline.find( "begin", pstart ) == pstart ) { /*begin of an offload regions*/ m_os << m_line << std::endl; DisableInstrumentation( D_FULL ); } else { /*next pragma must be offloaded*/ m_os << m_line << std::endl; m_offload_pragma = true; } } else if ( m_lowline.find( "end", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 3 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) { /*end of an offload regions*/ m_os << m_line << std::endl; EnableInstrumentation( D_FULL ); } else if ( m_lowline.find( "attributes", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 10 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) { string::size_type nstart = m_lowline.find( "::", pstart ); nstart = m_lowline.find_first_not_of( " \t", nstart + 2 ); string::size_type nend = m_lowline.find_first_of( " \t\n\0", nstart ); m_offload_attribute = m_lowline.substr( nstart, nend - nstart ); m_os << m_line << std::endl; } else { /*print lines with !dir$ where no offload is present and continue*/ m_os << m_line << std::endl; } } void OPARI2_FortranParser::handle_offloaded_functions( void ) { string::size_type pos_function = m_lowline.find( "function" ); string::size_type pos_subroutine = m_lowline.find( "subroutine" ); string::size_type pos_end = m_lowline.find( "end" ); string::size_type pos_offload_attribute = m_lowline.find( m_offload_attribute ); string::size_type pos_offload_function = m_lowline.find( m_current_offload_function ); if ( ( ( pos_function < pos_offload_attribute || pos_subroutine < pos_offload_attribute ) && pos_offload_attribute != string::npos ) && !( pos_end < pos_function || pos_end < pos_subroutine ) ) { /* begin of offload function or subroutine */ DisableInstrumentation( D_FULL ); m_current_offload_function = m_offload_attribute; m_offload_attribute = ""; m_offload_function = true; } else if ( ( ( ( pos_function < pos_offload_function || m_offload_function ) && pos_end < pos_function ) || ( ( pos_subroutine < pos_offload_function || m_offload_subroutine ) && pos_end < pos_subroutine ) ) && pos_offload_function != string::npos ) { /*end of offload function*/ EnableInstrumentation( D_FULL ); m_offload_function = false; m_current_offload_function = ""; } } void OPARI2_FortranParser::handle_normal_line() { bool isComment = is_comment_line(); if ( m_need_pragma && !isComment && m_lowline.find_first_not_of( " \t" ) != string::npos ) { cerr << m_curr_file << ":" << m_lineno - 1 << ": ERROR: missing continuation line\n"; cleanup_and_exit(); } else if ( !m_loop_directives.empty() && !isComment && m_lowline.find_first_not_of( " \t" ) != string::npos ) { test_and_insert_enddo(); } if ( isComment ) { m_os << m_line << '\n'; } else if ( ( m_line.size() == 0 || m_lowline.find_first_not_of( " \t" ) == string::npos ) && m_lineno != 0 ) { // empty line m_os << m_line << '\n'; ++m_lineno_loopend; } else { // really normal line /*if no pragma follows the offload, a function is offloaded and * the next pragma must be processed normally*/ m_offload_pragma = false; del_strings_and_comments(); /* split line at ; */ string complete_line( m_line ); string complete_m_lowline( m_lowline ); size_t position = 0; while ( position != string::npos ) { if ( position == 0 ) { m_line = complete_line.substr( position, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position ); m_lowline = complete_m_lowline.substr( position, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position ); } else { m_line = complete_line.substr( position + 1, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position - 1 ); m_lowline = complete_m_lowline.substr( position + 1, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position - 1 ); } position = complete_m_lowline.find( ";", position + 1 ); if ( is_sub_unit_header() ) { m_in_header = true; } else if ( m_in_header == true ) { m_in_header = false; if ( !InstrumentationDisabled( D_FULL ) ) { m_os << " include \'" << m_options.incfile_nopath << "\'" << std::endl; } if ( m_options.keep_src_info ) { m_os << "#line " << m_lineno << " \"" << m_curr_file << "\"" << "\n"; } } // replace rumtime API call in this line if possible ReplaceRuntimeAPI( m_lowline, m_line, m_curr_file, L_FORTRAN ); if ( m_lineno != 0 ) { if ( position == string::npos ) { m_os << m_line << '\n'; } else { m_os << m_line << ';'; } } /* * instrumentation of the end of regions which are * implicitly ended after a single line of code */ if ( !m_continuation ) { HandleSingleLineDirective( m_lineno, m_os ); } else { } // search for loop start statement string label; if ( is_loop_start( label ) ) { LoopDescriptionT loop; loop.is_directive_loop = m_waitfor_loopstart; loop.label = label; m_loop_stack.push( loop ); } // search for loop end statement else if ( ( !m_loop_stack.empty() ) && is_loop_end() ) { LoopDescriptionT top_loop = m_loop_stack.top(); m_waitfor_loopend = top_loop.is_directive_loop; m_loop_stack.pop(); if ( !m_loop_stack.empty() ) { top_loop = m_loop_stack.top(); } else { top_loop.is_directive_loop = false; top_loop.label = ""; } // more than one loop ending on same statement (only numerical labels) while ( ( top_loop.label.find_first_of( "0123456789" ) != string::npos ) && ( is_loop_end() ) ) { m_waitfor_loopend = top_loop.is_directive_loop; m_loop_stack.pop(); if ( !m_loop_stack.empty() ) { top_loop = m_loop_stack.top(); } else { top_loop.is_directive_loop = false; top_loop.label = ""; } } m_lineno_loopend = m_lineno; } else { // normal line } m_waitfor_loopstart = false; } } } /** @brief This function processes fortran files and searches for a * place to insert variables, pragmas/directives and the begin * and end of do loops which are needed to ensure correct * instrumentation of parallel do constructs.*/ void OPARI2_FortranParser::process() { while ( m_unprocessed_line || get_next_line() ) { m_normal_line = false; m_unprocessed_line = false; if ( !( m_offload_attribute.empty() && m_current_offload_function.empty() ) ) { handle_offloaded_functions(); } string::size_type lstart = m_line.find_first_not_of( " \t" ); if ( m_in_string && !is_comment_line() ) { del_strings_and_comments(); ReplaceRuntimeAPI( m_lowline, m_line, m_curr_file, L_FORTRAN ); m_os << m_line << '\n'; } else if ( lstart != string::npos && m_line[ lstart ] == '#' ) { handle_line_directive( lstart ); } else if ( is_directive() ) { handle_directive(); } else if ( is_free_offload_directive() ) { handle_free_offload_directive(); } else { handle_normal_line(); } } } opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_parser_f.h0000644000000000000000000000013214015716474017526 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.332005772 opari2-2.0.6/src/opari/opari2_parser_f.h0000644000175100001440000000711414015716474020724 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_parser_f.h * * @brief */ #ifndef OPARI2_PROCESS_F_H #define OPARI2_PROCESS_F_H #include using std::cerr; using std::ostream; using std::istream; #include using std::vector; #include using std::stack; #include "opari2.h" #include "opari2_directive_manager.h" #include "opari2_directive.h" /** @brief information about loops*/ typedef struct { /** loop belongs to preceeding directive */ bool is_directive_loop; /** loop label */ string label; } LoopDescriptionT; class OPARI2_FortranParser { public: OPARI2_FortranParser( OPARI2_Option_t& options ); ~OPARI2_FortranParser() { }; /** @brief This function processes fortran files and searches for a * place to insert variables, OpenMP pragmas and the begin and * end of do loops which are needed to ensure correct * instrumentation of parallel do constructs.*/ void process( void ); private: string m_line; string m_lowline; bool m_unprocessed_line; int m_lineno; string m_curr_file; std::stack m_loop_directives; bool m_need_pragma; char m_in_string; bool m_normal_line; bool m_in_header; bool m_continuation; bool m_next_is_continuation; string m_sentinel; bool m_offload_pragma; string m_offload_attribute; string m_current_offload_function; bool m_offload_subroutine; bool m_offload_function; // for endloop instrumentation stack m_loop_stack; // Line_type m_type_of_last_line; bool m_waitfor_loopstart; bool m_waitfor_loopend; int m_lineno_loopend; OPARI2_Option_t& m_options; ofstream& m_os; ifstream& m_is; /**@brief Check if the line belongs to the header of a subroutine or function. * After lines in the header, we can insert our variable definitions.*/ bool is_sub_unit_header( void ); /**@brief check if this line is empty*/ bool is_empty_line( void ); /**@brief check if this line is a comment line*/ bool is_comment_line( void ); /**@brief check if this line is a continuation line*/ bool is_continuation_line( void ); /**@brief check if this line starts a do loop*/ bool is_loop_start( string& label ); /**@brief check if this line is the end of a do loop*/ bool is_loop_end( void ); void test_and_insert_enddo( void ); /** @brief Delete comments and strings before the lines are parsed * to avoid finding keywords in comments or strings.*/ void del_strings_and_comments( void ); bool is_directive( void ); bool get_next_line( void ); void handle_line_directive( const string::size_type lstart ); void handle_directive( void ); bool is_free_offload_directive( void ); void handle_free_offload_directive(); void handle_offloaded_functions( void ); void handle_normal_line(); }; #endif // __PROCESS_F_H opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_parser_c.cc0000644000000000000000000000013214015716474017661 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.332005772 opari2-2.0.6/src/opari/opari2_parser_c.cc0000644000175100001440000005205614015716474021064 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2016, 2020, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_parser_c.cc * * @brief This file contains all functions to parse and process C or C++ files. */ #include #include using std::istream; using std::cerr; #include using std::stack; #include using std::vector; #include using std::map; #include using std::string; #include using std::getline; #include using std::isalnum; using std::isalpha; #include #include #include "opari2.h" #include "opari2_parser_c.h" #include "openmp/opari2_directive_openmp.h" #include "pomp/opari2_directive_pomp.h" #include "offload/opari2_directive_offload.h" #include "opari2_directive_manager.h" OPARI2_CParser::OPARI2_CParser( OPARI2_Option_t& options ) : m_options( options ), m_os( options.os ), m_is( options.is ) { m_line = ""; m_pos = 0; m_in_comment = false; m_in_string = false; m_pre_cont_line = false; m_require_end = true; m_is_for = false; m_block_closed = false; m_lineno = 0; m_level = 0; m_num_semi = 0; m_lstart = string::npos; m_current_file = options.infile; m_infile = options.infile; m_next_end.push( -1 ); } string OPARI2_CParser::find_next_word( unsigned& pline, string::size_type& ppos ) { unsigned size = m_pre_stmt.size(); while ( pline < size ) { string::size_type wbeg = m_pre_stmt[ pline ].find_first_not_of( " \t", ppos ); if ( m_pre_stmt[ pline ][ wbeg ] == '\\' || wbeg == string::npos ) { ++pline; if ( pline < size ) { ppos = 0; } else { return ""; } } else { ppos = m_pre_stmt[ pline ].find_first_of( " \t()", wbeg ); return m_pre_stmt[ pline ].substr( wbeg, ppos == string::npos ? ppos : ppos - wbeg ); } } return ""; } /** @brief Check whether the current line is an extern function declaration */ bool OPARI2_CParser::is_extern_decl( void ) { // If it starts with 'extern' it is an declaration int nrstart = m_line.find_first_not_of( " \t" ); int nrend = m_line.find_first_of( " \t", nrstart + 1 ); if ( nrend > nrstart && m_line.substr( nrstart, nrend ) == "extern" ) { return true; } return false; } /** * @brief Instrument pragma directives. * * Preprocessor lines are passed to this function and checked, whether they are * pragmas. */ bool OPARI2_CParser::process_prestmt( int ln, string::size_type ppos ) { unsigned s = m_pre_stmt.size(); bool in_comment = false; vector orig_stmt; /* "remove" comments */ for ( unsigned i = 0; i < s; ++i ) { string::size_type pos = 0; string& line = m_pre_stmt[ i ]; string orig_line( line ); orig_stmt.push_back( orig_line ); while ( pos < line.size() ) { if ( in_comment ) { /* look for comment end */ if ( line[ pos ] == '*' && line[ pos + 1 ] == '/' ) { line[ pos++ ] = ' '; in_comment = false; } line[ pos++ ] = ' '; } else if ( line[ pos ] == '/' ) { pos++; if ( line[ pos ] == '/' ) { // c++ comments / line[ pos - 1 ] = ' '; line[ pos++ ] = ' '; while ( pos < line.size() ) { line[ pos++ ] = ' '; } } else if ( line[ pos ] == '*' ) { // c comment start line[ pos - 1 ] = ' '; line[ pos++ ] = ' '; in_comment = true; } } else { pos++; } } } vector directive_prefix( 1, "#" ); unsigned pline = 0; string first = find_next_word( pline, ppos ); if ( first == "pragma" ) { directive_prefix.push_back( first ); string paradigm_identifier = find_next_word( pline, ppos ); directive_prefix.push_back( paradigm_identifier ); OPARI2_Directive* d = NewDirective( m_pre_stmt, directive_prefix, m_options.lang, m_current_file, m_lineno - m_pre_stmt.size() + 1 ); if ( d ) { ProcessDirective( d, m_os, &m_require_end, &m_is_for ); return true; } } else if ( first == "include" ) { // include (for supported runtime API) -> remove it string word = find_next_word( pline, ppos ); if ( IsSupportedAPIHeaderFile( word, m_options.lang ) ) { s = 0; } } for ( unsigned i = 0; i < s; ++i ) { m_os << orig_stmt[ i ] << "\n"; } orig_stmt.clear(); return false; } bool OPARI2_CParser::handle_closed_block() { bool newline_printed = false; size_t next_char = m_line.find_first_not_of( " \t", m_pos ); /* The treatment of else blocks doesn't work yet, but it should go * somewhere here */ if ( ( m_next_end.top() == m_level && ( next_char != string::npos && m_line.substr( next_char, 4 ) != "else" ) ) || next_char == string::npos ) { bool more_chars = ( m_pos < m_line.size() ); if ( !m_block_closed ) { m_os << '\n'; newline_printed = true; } // while because block can actually close more than one pragma while ( m_next_end.top() == m_level ) { OPARI2_Directive* d_top = DirectiveStackTop( NULL ); if ( d_top ) { vector directive_prefix; int l = m_lineno; if ( m_block_closed ) { l--; } OPARI2_Directive* d = NewDirective( m_end_stmt, directive_prefix, m_options.lang, m_current_file, l ); if ( d ) { ProcessDirective( d, m_os ); } else { cerr << "Error when handling end of directive:" << d_top->GetName() << "\n"; } } m_next_end.pop(); } if ( more_chars && !m_block_closed ) { if ( next_char != string::npos ) { m_os << "#line " << m_lineno << " \"" << m_current_file << "\"" << "\n"; } for ( unsigned i = 0; i < m_pos; ++i ) { m_os << ' '; } } } return newline_printed; } void OPARI2_CParser::handle_preprocessor_directive( void ) { if ( ( isdigit( m_line[ m_line.find_first_not_of( " \t", m_lstart + 1 ) ] ) ) ) { /** * which compiler supports the line directive in this form? */ int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", m_lstart + 1 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); // -1 because the next line has the number specified in this directive m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); filename = m_line.substr( nrstart, nrend - nrstart ); if ( nrstart != 0 ) { if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_current_file = filename; } else { /*relative path*/ string path( m_infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_current_file = path + "/" + filename; } } m_os << m_line << std::endl; } else if ( m_line.compare( m_lstart + 1, 5, "line " ) == 0 && isdigit( m_line[ m_line.find_first_not_of( " \t", m_lstart + 5 ) ] ) ) { int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", m_lstart + 5 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); // -1 because the next line has the number specified in this directive m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); if ( nrstart != 0 ) { filename = m_line.substr( nrstart, nrend - nrstart ); if ( filename[ 0 ] == '/' ) { /* absolute path */ m_current_file = filename; } else { /* relative path */ string path( m_infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_current_file = path + "/" + filename; } } m_os << m_line << std::endl; } else { /* * other preprocessor directive */ m_pre_stmt.push_back( m_line ); if ( m_line[ m_line.size() - 1 ] == '\\' ) // escaped Backslash { m_pre_cont_line = true; } else { if ( process_prestmt( m_lineno, m_lstart + 1 ) ) { if ( m_require_end ) { m_next_end.push( m_level ); m_num_semi = m_is_for ? 3 : 1; } else { m_num_semi = 0; } } m_pre_stmt.clear(); } } } void OPARI2_CParser::handle_preprocessor_continuation_line( void ) { m_pre_stmt.push_back( m_line ); /* check for multiline comments in preprocessor directives */ if ( !m_in_comment && m_line.find( "/*" ) != string::npos && !( m_line.find( "*/" ) != string::npos && m_line.find( "/*" ) < m_line.find( "*/" ) ) ) { m_in_comment = true; } else if ( m_in_comment && m_line.find( "*/" ) != string::npos ) { m_in_comment = false; } if ( m_line[ m_line.size() - 1 ] != '\\' && !m_in_comment ) { m_pre_cont_line = false; if ( process_prestmt( m_lineno - m_pre_stmt.size() + 1, m_lstart + 1 ) ) { if ( m_require_end ) { m_next_end.push( m_level ); m_num_semi = m_is_for ? 3 : 1; } else { m_num_semi = 0; } } m_pre_stmt.clear(); } } void OPARI2_CParser::handle_regular_line() { bool newline_printed = false; while ( m_pos < m_line.size() ) { newline_printed = false; if ( m_in_comment ) { // look for comment end if ( m_line[ m_pos ] == '*' && m_line[ m_pos + 1 ] == '/' ) { m_os << "*/"; m_in_comment = false; m_pos += 2; } else { m_os << m_line[ m_pos++ ]; } } else if ( m_line[ m_pos ] == '/' ) { m_pos++; if ( m_line[ m_pos ] == '/' ) { // c++ comments m_pos++; m_os << "//"; while ( m_pos < m_line.size() ) { m_os << m_line[ m_pos++ ]; } } else if ( m_line[ m_pos ] == '*' ) { // c comment start m_pos++; m_os << "/*"; m_in_comment = true; } else { m_os << '/'; } } else if ( m_in_string || m_line[ m_pos ] == '\"' ) { // character string constant if ( m_in_string ) { m_in_string = false; m_pos--; // to make sure current character gets reprocessed } else { m_os << "\""; } m_pos++; while ( m_line[ m_pos ] != '\"' ) { // handle C++11 multiline string, see https://en.cppreference.com/w/cpp/language/string_literal if ( m_pos == m_line.size() ) { m_in_string = true; break; } if ( m_line[ m_pos ] == '\\' ) { m_os << '\\'; m_pos++; if ( m_line[ m_pos ] == '\0' ) { m_in_string = true; break; } else if ( m_line[ m_pos ] == '\\' ) { if ( m_line[ m_pos + 1 ] == '\0' ) { m_os << '\\'; m_in_string = true; break; } } } m_os << m_line[ m_pos ]; m_pos++; } if ( !m_in_string ) { m_os << '\"'; } m_pos++; } else if ( m_line[ m_pos ] == '\'' ) { // character constant m_os << "\'"; do { m_pos++; if ( m_line[ m_pos ] == '\\' ) { m_os << '\\'; m_pos++; if ( m_line[ m_pos ] == '\'' ) { m_os << '\''; m_pos++; } } m_os << m_line[ m_pos ]; } while ( m_line[ m_pos ] != '\'' ); m_pos++; } else if ( isalpha( m_line[ m_pos ] ) || m_line[ m_pos ] == '_' ) { // identifier string::size_type startpos = m_pos; while ( m_pos < m_line.size() && ( isalnum( m_line[ m_pos ] ) || m_line[ m_pos ] == '_' ) ) { m_pos++; } string ident( m_line, startpos, m_pos - startpos ); /* Replace if valid runtime function */ ReplaceRuntimeAPI( ident, ident, m_current_file, L_C_OR_CXX ); m_os << ident; if ( ident == "for" && m_num_semi == 1 ) { m_num_semi = 3; } } else if ( m_line[ m_pos ] == '{' ) { // block open m_os << m_line[ m_pos++ ]; m_level++; m_num_semi = 0; } else if ( m_line[ m_pos ] == '}' ) { // block close m_os << m_line[ m_pos++ ]; m_level--; size_t next_char = m_line.find_first_not_of( " \t", m_pos ); if ( next_char != string::npos ) { newline_printed = handle_closed_block(); } else { m_block_closed = true; } } else if ( m_line[ m_pos ] == ';' ) { // statement end m_os << m_line[ m_pos++ ]; m_num_semi--; if ( m_num_semi == 0 ) { //newline_printed = handle_closed_block(); m_block_closed = true; } } else { m_os << m_line[ m_pos++ ]; } } if ( !newline_printed ) { m_os << '\n'; } } bool OPARI2_CParser::get_next_line( void ) { bool success = ( bool )getline( m_is, m_line ); ++m_lineno; m_pos = 0; //std::cout << m_lineno << ": " << m_line << std::endl; if ( success ) { /* workaround for bogus getline implementations */ while ( m_line.size() == 1 && m_line[ 0 ] == '\0' ) { success = ( bool )getline( m_is, m_line ); ++m_lineno; } /* remove extra \r from Windows source files */ if ( m_line.size() && *( m_line.end() - 1 ) == '\r' ) { m_line.erase( m_line.end() - 1 ); } } return success; } /** Parse source file line by line, search for directives and the * related code blocks. Comments and strings are removed to avoid * finding keywords in comments. */ void OPARI2_CParser::process( void ) { while ( get_next_line() ) { string::size_type ls; if ( m_block_closed && !( ( ( m_line.size() - m_line.find_first_not_of( " \t" ) ) > 3 ) && ( m_line.find_first_not_of( " \t" ) != string::npos ) && m_line.substr( m_line.find_first_not_of( " \t" ), 4 ) == "else" ) ) { handle_closed_block(); m_block_closed = false; } /* start offload region if __declspec is found and continue to * parse the rest of the line as usual without the __declspec */ if ( !m_in_comment && ( ( ls = m_line.find_first_not_of( " \t" ) ) != string::npos ) && m_line.substr( ls, 10 ) == "__declspec" ) { m_pre_stmt.push_back( m_line ); vector directive_prefix( 1, "__declspec" ); OPARI2_Directive* d = NewDirective( m_pre_stmt, directive_prefix, m_options.lang, m_current_file, m_lineno ); assert( d ); ProcessDirective( d, m_os ); m_pre_stmt.clear(); m_next_end.push( m_level ); int cl_brackets = 0; string::size_type pos = 0; while ( cl_brackets < 2 && pos < m_line.size() ) { if ( m_line[ pos ] == ')' ) { cl_brackets++; } m_os << m_line[ pos ]; m_line[ pos ] = ' '; pos++; } m_os << "\n"; } if ( m_pre_cont_line ) { handle_preprocessor_continuation_line(); } else if ( !m_in_comment && m_options.preprocessed_file && ( m_line == "___POMP2_INCLUDE___" || m_line == "___POMP2_INCLUDE___ " ) ) // Studio compiler appends a blank during preprocessing { m_os << "#include \"" << m_options.incfile << "\"" << "\n"; } else if ( !m_in_comment && ( ( m_lstart = m_line.find_first_not_of( " \t" ) ) != string::npos ) && m_line[ m_lstart ] == '#' ) { handle_preprocessor_directive(); } else { handle_regular_line(); } } if ( m_block_closed ) { handle_closed_block(); m_block_closed = false; } // check end position stack if ( m_next_end.top() != -1 ) { cerr << "ERROR: could not determine end of OpenMP construct (braces mismatch?)\n"; PrintDirectiveStackTop(); cleanup_and_exit(); } } opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_parser_c.h0000644000000000000000000000013114015716474017522 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 29 ctime=1614257498.32800576 opari2-2.0.6/src/opari/opari2_parser_c.h0000644000175100001440000000402414015716474020716 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_parser_c.h * * @brief */ #ifndef OPARI2_PARSER_C_H #define OPARI2_PARSER_C_H class OPARI2_CParser { public: OPARI2_CParser( OPARI2_Option_t& options ); ~OPARI2_CParser() { }; private: string m_line; string::size_type m_pos; bool m_in_comment; bool m_in_string; bool m_pre_cont_line; bool m_require_end; bool m_is_for; bool m_block_closed; int m_lineno; int m_level; int m_num_semi; string::size_type m_lstart; vector m_pre_stmt; vector m_end_stmt; stack m_next_end; string m_current_file; string m_infile; OPARI2_Option_t& m_options; ofstream& m_os; ifstream& m_is; string find_next_word( unsigned& pline, string::size_type& ppos ); /** @brief Check whether the current line is an extern function declaration */ bool is_extern_decl( void ); /** * @brief Instrument pragma directives. * * Preprocessor lines are passed to this function and checked, whether they are * pragmas. */ bool process_prestmt( int ln, string::size_type ppos ); bool handle_closed_block(); void handle_preprocessor_directive( void ); void handle_preprocessor_continuation_line( void ); void handle_regular_line(); bool get_next_line( void ); public: /** @brief Instrument directives / runtime APIs in C/C++ source file. */ void process( void ); }; #endif //__PROCESS_C_H opari2-2.0.6/src/opari/PaxHeaders.6153/opari2.h0000644000000000000000000000013114015716474015644 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 29 ctime=1614257498.32800576 opari2-2.0.6/src/opari/opari2.h0000644000175100001440000001144514015716474017045 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2.h * * @brief This file contains some definitions that are used * throughout OAPRI2 */ #ifndef OPARI2_H #define OPARI2_H #include using std::string; #include using std::ifstream; using std::ofstream; #include #include using std::map; #include using std::vector; #include using std::pair; /** * @brief Convenience type definition */ typedef map OPARI2_StrStr_map_t; /** * @brief Convenience type definition */ typedef map > OPARI2_StrVStr_map_t; /** * @brief Convenience type definition */ typedef vector > OPARI2_StrBool_pairs_t; /** * @brief Convenience type definition */ typedef vector > OPARI2_StrStr_pairs_t; /** * @brief Bitfield for supported languages and dialects. */ typedef enum { L_NA = 0x00, L_F77 = 0x01, L_F90 = 0x02, L_FORTRAN = 0x03, L_C = 0x04, L_CXX = 0x08, L_C_OR_CXX = 0x0C } OPARI2_Language_t; /** * @brief Fortran specific differentiation between free-form and * fixed-form Fortran format. */ typedef enum { F_NA = 0x00, F_FIX = 0x01, F_FREE = 0x02 } OPARI2_Format_t; /** * @brief All necessary information to process a file. */ typedef struct { /** Language of the input file */ OPARI2_Language_t lang; /** Fortran format of the input file */ OPARI2_Format_t form; /** Specifies whether the source code information should be kept up-to-date with line directives*/ bool keep_src_info; /** Specifies whether the input file was already partially preprocessed */ bool preprocessed_file; /** Name of the input file */ string infile; /** Name of the output file */ string outfile; /** Name of the generated include file (without path) */ string incfile_nopath; /** Name of the generated include file (including path) */ string incfile; /** Input file stream object */ ifstream is; /** Output file stream object */ ofstream os; } OPARI2_Option_t; /** * @brief Definition of directive group. */ typedef enum OPARI2_ParadigmType { /** Unknown paradigm */ OPARI2_PT_NONE = 0, /** OpenMP */ OPARI2_PT_OMP, /** POMP user instrumentation */ OPARI2_PT_POMP, /** OpenACC */ OPARI2_PT_OPENACC, /** Intel offload model */ OPARI2_PT_OFFLOAD, /** Transactional memory / speculative execution */ OPARI2_PT_TMSE } OPARI2_ParadigmType_t; /** * @brief Definition of error codes. */ typedef enum OPARI2_ErrorCode { OPARI2_NO_ERROR = 0, /** No message was printed when the error occurred */ OPARI2_ERROR_NO_MESSAGE, /** A message was printed directly when the error occurred */ OPARI2_ERROR_WITH_MESSAGE } OPARI2_ErrorCode; /** * @brief Definition of null group * * Currently the max number of groups for each paradigm is 32. * This limitation can be removed if using macro definion instead of enum. * Note a group is identified by both the group number and the paradigm type. */ #define G_NONE 0x00000000 //extern OPARI2_Option_t opt; /** * @brief This function can be called anywhere upon an error. * * When this function is called, the output file is deleted and the * program is exited. */ void cleanup_and_exit( void ); #endif opari2-2.0.6/src/opari/PaxHeaders.6153/opari2.cc0000644000000000000000000000013214015716474016003 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.324005747 opari2-2.0.6/src/opari/opari2.cc0000644000175100001440000005272114015716474017205 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2015, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2.cc * * @brief This File containes the opari main function. It is used to * handle input arguments and open input and output * files. Afterwards the C or Fortran parsers are used, * depending on the file type or provided arguments. */ #include #include using std::ifstream; using std::ofstream; #include using std::stringstream; #include using std::cout; using std::cerr; #include using std::sprintf; using std::remove; #include using std::string; using std::strcmp; using std::strrchr; using std::strncpy; using std::strcat; using std::strlen; #include using std::exit; #include #include #include #include #include #include #include "opari2.h" #include "opari2_directive_manager.h" #include "openmp/opari2_directive_openmp.h" #include "opari2_parser_c.h" #include "opari2_parser_f.h" #define DEPRECATED_ON /* cmd line options */ OPARI2_Option_t opt; void print_usage_information( char* prog, std::ostream& output ) { std::string usage = #include "opari2_usage.h" ; output << prog << "\n\n" << usage << std::endl; } void cleanup_and_exit( void ) { if ( !opt.outfile.empty() ) { remove( opt.outfile.c_str() ); } exit( 1 ); } void print_deprecated_msg( const string old_form, const string new_form ) { #ifdef DEPRECATED_ON cerr << "Warning: Option \"" << old_form << "\" is deprecated.\n\ Please use \"" << new_form << "\" for future compatibility.\n"; #endif } /** * @brief Disable directive entry in the directive_table. * * Currently supported option: * --disable=xx,xx,... * Here xx can possibly be an openmp/pomp directive name, openmp/pomp * group name, or a paradigm type name. * * Not supported anymore: * -disable xx,xx,... * * Current --help output (27.03.2014): * [--disable=paradigm[:directive|group[:inner],...][+paradigm...] * [OPTIONAL] Disable the instrumentation of whole paradigms, or * specific directives or groups of directives of a paradigm. * Furthermore it gives the possibility to suppress the insertion of * instrumentation functions inside code regions, i.e. only the * surrounding instrumentation is inserted. * */ bool set_disabled( const string& constructs ) { typedef std::pair dir_and_inner_t; char str[ constructs.length() + 1 ]; std::strcpy( &str[ 0 ], constructs.c_str() ); std::vector paradigms; char* paradigm = strtok( &str[ 0 ], "+" ); while ( paradigm != NULL ) { paradigms.push_back( paradigm ); paradigm = strtok( NULL, "+" ); } for ( vector::iterator it = paradigms.begin(); it != paradigms.end(); ++it ) { paradigm = strtok( *it, ",:" ); dir_and_inner_t directive; std::vector directives; directive.first = strtok( NULL, "," ); directive.second = false; while ( directive.first != NULL ) { directives.push_back( directive ); directive.second = false; directive.first = strtok( NULL, "," ); } for ( vector::iterator it = directives.begin(); it != directives.end(); ++it ) { if ( strchr( it->first, ':' ) ) { it->first = strtok( it->first, ":" ); char* inner = strtok( NULL, ":" ); if ( strcmp( inner, "inner" ) == 0 ) { it->second = true; } else { cerr << "Error, unknown identifier " << inner << std::endl; return false; } } } if ( directives.empty() ) { if ( !DisableParadigmDirectiveOrGroup( paradigm, "", false ) ) { return false; } } else { for ( vector::iterator it = directives.begin(); it != directives.end(); ++it ) { if ( !DisableParadigmDirectiveOrGroup( paradigm, it->first, it->second ) ) { return false; } } } } return true; } /** * @brief Parse and handle cmd line options. * * First hanlde global options, * then handle paradigm-specific options. */ void process_cmd_line( int argc, char* argv[] ) { int a = 1; OPARI2_ErrorCode err_flag = OPARI2_NO_ERROR; const char* ptr = NULL; opt.lang = L_NA; opt.form = F_NA; opt.keep_src_info = true; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); /* parse global options */ while ( a < argc && argv[ a ][ 0 ] == '-' ) { if ( strncmp( argv[ a ], "--omp", 5 ) == 0 ) { err_flag = OPARI2_DirectiveOpenmp::ProcessOption( argv[ a ] ); if ( err_flag ) { cerr << "ERROR: unknown option " << argv[ a ] << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( strcmp( argv[ a ], "--f77" ) == 0 ) { opt.lang = L_F77; } else if ( strcmp( argv[ a ], "--f90" ) == 0 ) { opt.lang = L_F90; } else if ( strcmp( argv[ a ], "--c++" ) == 0 ) { opt.lang = L_CXX; } else if ( strcmp( argv[ a ], "--c" ) == 0 ) { opt.lang = L_C; } else if ( strcmp( argv[ a ], "--free-form" ) == 0 ) { opt.form = F_FREE; } else if ( strcmp( argv[ a ], "--fix-form" ) == 0 ) { opt.form = F_FIX; } else if ( strcmp( argv[ a ], "--version" ) == 0 ) { std::cout << "opari2 version " << PACKAGE_VERSION << std::endl; } else if ( strcmp( argv[ a ], "--help" ) == 0 ) { print_usage_information( argv[ 0 ], std::cout ); exit( 0 ); } else if ( strcmp( argv[ a ], "--nosrc" ) == 0 ) { opt.keep_src_info = false; } else if ( strcmp( argv[ a ], "--preprocessed" ) == 0 ) { opt.preprocessed_file = true; } /* handle "--disable=" */ else if ( strncmp( argv[ a ], "--disable", 9 ) == 0 ) { ptr = strchr( argv[ a ], '=' ); if ( ptr ) { ptr++; if ( !set_disabled( ptr ) ) { err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { err_flag = OPARI2_ERROR_WITH_MESSAGE; cerr << "ERROR: missing value for option --disable\n"; } } /* handle deprecated options */ else if ( strcmp( argv[ a ], "--tpd" ) == 0 ) { print_deprecated_msg( "--tpd", "--omp-tpd" ); omp_opt->copytpd = true; #if HAVE( PLATFORM_K ) || HAVE( PLATFORM_FX10 ) || HAVE( PLATFORM_FX100 ) cerr << "WARNING: option --tpd not supported on Fujitsu systems.\n"; #endif } else if ( strncmp( argv[ a ], "--tpd-mangling=", 15 ) == 0 ) { print_deprecated_msg( "--tpd-mangling=", "--omp-tpd-mangling=" ); char* tpd_arg = strchr( argv[ a ], '=' ); if ( tpd_arg != NULL ) { tpd_arg++; if ( strcmp( tpd_arg, "gnu" ) == 0 || strcmp( tpd_arg, "sun" ) == 0 || strcmp( tpd_arg, "intel" ) == 0 || strcmp( tpd_arg, "pgi" ) == 0 || strcmp( tpd_arg, "cray" ) == 0 ) { omp_opt->pomp_tpd = "pomp_tpd_"; omp_opt->tpd_in_extern_block = false; } else if ( strcmp( tpd_arg, "ibm" ) == 0 ) { omp_opt->pomp_tpd = "pomp_tpd"; omp_opt->tpd_in_extern_block = true; } else { cerr << "ERROR: unknown option for --tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { cerr << "ERROR: missing value for option --tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( strncmp( argv[ a ], "--task=", 7 ) == 0 ) { print_deprecated_msg( "--task=", "--omp-task=" ); char* token = strtok( argv[ a ], "=" ); token = strtok( NULL, "," ); while ( token != NULL ) { if ( strcmp( token, "abort" ) == 0 ) { omp_opt->task_abort = true; } else if ( strcmp( token, "warn" ) == 0 ) { omp_opt->task_warn = true; } else if ( strcmp( token, "remove" ) == 0 ) { omp_opt->task_remove = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --task\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } token = strtok( NULL, "," ); } } else if ( strncmp( argv[ a ], "--untied=", 9 ) == 0 ) { print_deprecated_msg( "--untied=", "--omp-task-untied=" ); char* token = strtok( argv[ a ], "=" ); token = strtok( NULL, "," ); do { if ( strcmp( token, "abort" ) == 0 ) { omp_opt->untied_abort = true; } else if ( strcmp( token, "no-warn" ) == 0 ) { omp_opt->untied_nowarn = true; } else if ( strcmp( token, "keep" ) == 0 ) { omp_opt->untied_keep = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --untied\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } token = strtok( NULL, "," ); } while ( token != NULL ); } else if ( strcmp( argv[ a ], "-disable" ) == 0 ) { cerr << "ERROR: -disable not supported by this version of OPARI2. " << "Please use --disable=paradigm[:directive|group[:inner],...][+paradigm...]. " << "Use opari2 --help or refer to the documentation for more details." << std::endl; err_flag = OPARI2_ERROR_WITH_MESSAGE; } else if ( strcmp( argv[ a ], "-f77" ) == 0 ) { print_deprecated_msg( "-f77", "--f77" ); opt.lang = L_F77; } else if ( strcmp( argv[ a ], "-f90" ) == 0 ) { print_deprecated_msg( "-f90", "--f90" ); opt.lang = L_F90; } else if ( strcmp( argv[ a ], "-c++" ) == 0 ) { print_deprecated_msg( "-c++", "--c++" ); opt.lang = L_CXX; } else if ( strcmp( argv[ a ], "-c" ) == 0 ) { print_deprecated_msg( "-c", "--c" ); opt.lang = L_C; } else if ( strcmp( argv[ a ], "-nosrc" ) == 0 ) { print_deprecated_msg( "-nosrc", "--nosrc" ); opt.keep_src_info = false; } else if ( strcmp( argv[ a ], "-rcfile" ) == 0 ) { cerr << "WARNING: Option \"-rcfile\" is deprecated and ignored.\n"; } else if ( strcmp( argv[ a ], "-table" ) == 0 ) { cerr << "WARNING: Option \"-table\" is deprecated and ignored.\n"; } /* End of deprecated options */ ++a; } /* parse file arguments, prepare input/output stream if specified */ switch ( argc - a ) { case 2: if ( strcmp( argv[ a + 1 ], "-" ) == 0 ) { opt.os.std::ostream::rdbuf( cout.rdbuf() ); } else { opt.os.open( argv[ a + 1 ] ); if ( !opt.os ) { cerr << "ERROR: cannot open output file " << argv[ a + 1 ] << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } opt.outfile = string( argv[ a + 1 ] ); } /*NOBREAK*/ case 1: if ( *argv[ a ] != '/' ) { int pathlength = 10; char* tmp_inf = new char[ pathlength ]; while ( !getcwd( tmp_inf, pathlength ) ) { pathlength += 10; delete[] tmp_inf; tmp_inf = new char[ pathlength ]; } pathlength += strlen( argv[ a ] ) + 1; delete[] tmp_inf; tmp_inf = new char[ pathlength ]; if ( !getcwd( tmp_inf, pathlength ) ) { cerr << "ERROR: cannot determine path of input file " << tmp_inf << "\n"; exit( -1 ); } tmp_inf = strcat( tmp_inf, "/" ); tmp_inf = strcat( tmp_inf, argv[ a ] ); opt.infile = string( tmp_inf ); delete[] tmp_inf; } else { opt.infile = string( argv[ a ] ); } opt.is.open( opt.infile.c_str() ); if ( !opt.is ) { cerr << "ERROR: cannot open input file " << opt.infile << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } break; default: err_flag = OPARI2_ERROR_NO_MESSAGE; break; } /* determine language and format by filename if not specified */ if ( !err_flag && !opt.infile.empty() && opt.lang == L_NA ) { size_t pos = opt.infile.find_last_of( '.' ); if ( pos < opt.infile.length() + 1 && opt.infile[ pos + 1 ] ) { switch ( opt.infile[ pos + 1 ] ) { case 'f': case 'F': opt.lang = opt.infile[ pos + 2 ] == '9' ? L_F90 : L_F77; break; case 'c': /*Files *.CUF and *.cuf are CUDA Fortran files*/ if ( opt.infile[ pos + 2 ] == 'u' && opt.infile[ pos + 3 ] == 'f' ) { opt.lang = L_F90; break; } case 'C': if ( opt.infile[ pos + 2 ] == 'U' && opt.infile[ pos + 3 ] == 'F' ) { opt.lang = L_F90; break; } opt.lang = opt.infile[ pos + 2 ] ? L_CXX : L_C; break; } } } if ( !err_flag && opt.infile.empty() && opt.lang == L_NA ) { cerr << "ERROR: cannot determine input file language\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } /* if no format is specified, default is free format for f90 and fix form for f77 */ if ( ( opt.form == F_NA ) && ( opt.lang & L_FORTRAN ) ) { if ( opt.lang & L_F77 ) { opt.form = F_FIX; } else { opt.form = F_FREE; } } /* generate output file name if necessary */ if ( !err_flag && opt.outfile.empty() ) { size_t pos = opt.infile.find_last_of( '.' ); if ( pos != string::npos ) { opt.outfile = opt.infile; opt.outfile.replace( pos, 1, ".mod." ); if ( opt.keep_src_info && ( opt.lang & L_FORTRAN ) ) { if ( opt.outfile.find( "cuf", pos ) == pos + 5 || opt.outfile.find( "CUF", pos ) == pos + 5 ) { opt.outfile[ pos + 5 ] = 'C'; opt.outfile[ pos + 6 ] = 'U'; opt.outfile[ pos + 7 ] = 'F'; } else { opt.outfile[ pos + 5 ] = 'F'; } } opt.os.open( opt.outfile.c_str() ); if ( !opt.os ) { cerr << "ERROR: cannot open output file " << opt.outfile << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } // opt.os << "\n"; } else { cerr << "ERROR: cannot generate output file name\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } /* print usage and die on error */ if ( err_flag ) { if ( err_flag == OPARI2_ERROR_NO_MESSAGE ) { print_usage_information( argv[ 0 ], std::cerr ); } exit( 1 ); } return; } void misc_init() { struct stat status; timeval compiletime; //long long int id[ 3 ]; uint64_t id[ 3 ]; stringstream id_str; int rest = 0; /* query inode number of the infile and timestamp as unique attribute */ int retval = stat( opt.infile.c_str(), &status ); // initialize inod_compiletime_id assert( retval == 0 ); gettimeofday( &compiletime, NULL ); //id[ 0 ] = ( long long int )status.st_ino; id[ 0 ] = static_cast< uint64_t > ( status.st_ino ); id[ 1 ] = static_cast< uint64_t > ( compiletime.tv_sec ); id[ 2 ] = static_cast< uint64_t > ( compiletime.tv_usec ); for ( int i = 0; i < 3; i++ ) { while ( id[ i ] > 36 || ( i > 1 && id[ i ] > 0 ) ) { rest = id[ i ] % 36; id[ i ] -= rest; id[ i ] /= 36; if ( rest < 10 ) { id_str << ( char )( rest + 48 ); } else { id_str << ( char )( rest + 87 ); } } if ( i < 2 ) { id[ i + 1 ] += id[ i ]; } } // generate opari2 include file name // only need base filename without path for include statement // in Fortran files and if an output file without dir is used size_t sep_in = opt.infile.find_last_of( '/' ); opt.incfile_nopath = string( opt.infile.substr( sep_in + 1 ) + ".opari.inc" ); size_t sep_out = opt.outfile.find_last_of( '/' ); if ( sep_out == string::npos ) { opt.incfile = ""; } else { opt.incfile = opt.outfile.substr( 0, sep_out + 1 ); } opt.incfile += opt.incfile_nopath; OPARI2_Directive::SetOptions( opt.lang, opt.form, opt.keep_src_info, opt.preprocessed_file, id_str.str() ); return; } /** * @brief Main function. * * Initialize directive and API table, handle command line options, * open files and call appropriate process function. */ int main( int argc, char* argv[] ) { process_cmd_line( argc, argv ); misc_init(); /* instrument source file */ if ( opt.lang & L_FORTRAN ) { /* in Fortran no Underscore is needed */ OPARI2_DirectiveOpenmp::SetOptPomptpd( "pomp_tpd" ); OPARI2_FortranParser parser( opt ); parser.process(); } else { if ( !opt.preprocessed_file ) { // const char* basename = strrchr( opt.incfile, '/' ); // basename = basename ? ( basename + 1 ) : opt.incfile; opt.os << "#include \"" << opt.incfile_nopath << "\"" << "\n"; if ( opt.keep_src_info ) { opt.os << "#line 1 \"" << opt.infile << "\"" << "\n"; } } OPARI2_CParser parser( opt ); parser.process(); } /* generate *.opari.inc ( by directive_manager ) */ Finalize( opt ); return 0; } opari2-2.0.6/src/opari/PaxHeaders.6153/common.h0000644000000000000000000000013214015716474015741 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.324005747 opari2-2.0.6/src/opari/common.h0000644000175100001440000000353214015716474017137 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file common.h * @brief Functions to handle parallel regions. Including the creation * and initialization of region handles. */ #ifndef COMMON_H #define COMMON_H #include const std::string region_id_prefix( "opari2_region_" ); const std::string string_id_prefix( "opari2_ctc_" ); #endif /* COMMON_H */ opari2-2.0.6/src/opari/PaxHeaders.6153/opari2_config_tool_frontend.h.in0000644000000000000000000000013214015716474022533 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.280005607 opari2-2.0.6/src/opari/opari2_config_tool_frontend.h.in0000644000175100001440000000135114015716474023726 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2018, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_config_tool_frontend.h.in * * @brief */ /* @configure_input@ */ #define NM "@NM@" #define AWK "@AWK@" #define SCRIPT "@LIBEXECDIR@/pomp2-parse-init-regions.awk" #define EGREP "@EGREP@" #define VERSION "@PACKAGE_VERSION@" #define POMP2_API_VERSION "@LIBRARY_INTERFACE_VERSION@" #define CFLAGS "-I@INCLUDEDIR@" opari2-2.0.6/src/opari/PaxHeaders.6153/Makefile.inc.am0000644000000000000000000000013214015716474017104 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.232005455 opari2-2.0.6/src/opari/Makefile.inc.am0000644000175100001440000000643414015716474020306 0ustar00builderusers00000000000000## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2013, 2014 ## Forschungszentrum Juelich GmbH, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## ## @internal ## ## @file Makefile.inc.am ## ## @brief ## ## -*- mode: makefile -*- bin_PROGRAMS += opari2 opari2-config opari2_SOURCES = \ $(SRC_ROOT)src/opari/common.h \ $(SRC_ROOT)src/opari/opari2.cc \ $(SRC_ROOT)src/opari/opari2.h \ $(SRC_ROOT)src/opari/opari2_parser_c.h \ $(SRC_ROOT)src/opari/opari2_parser_c.cc \ $(SRC_ROOT)src/opari/opari2_parser_f.h \ $(SRC_ROOT)src/opari/opari2_parser_f.cc \ $(SRC_ROOT)src/opari/opari2_directive_manager.cc \ $(SRC_ROOT)src/opari/opari2_directive_manager.h \ $(SRC_ROOT)src/opari/opari2_directive_definition.h \ $(SRC_ROOT)src/opari/opari2_directive_entry.h \ $(SRC_ROOT)src/opari/opari2_directive.cc \ $(SRC_ROOT)src/opari/opari2_directive.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_entry_openmp.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_openmp.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_openmp.cc \ $(SRC_ROOT)src/opari/openmp/opari2_omp_handler.h \ $(SRC_ROOT)src/opari/openmp/opari2_omp_handler.cc \ $(SRC_ROOT)src/opari/pomp/opari2_directive_entry_pomp.h \ $(SRC_ROOT)src/opari/pomp/opari2_directive_pomp.h \ $(SRC_ROOT)src/opari/pomp/opari2_directive_pomp.cc \ $(SRC_ROOT)src/opari/pomp/opari2_pomp_handler.h \ $(SRC_ROOT)src/opari/pomp/opari2_pomp_handler.cc \ $(SRC_ROOT)src/opari/offload/opari2_directive_entry_offload.h \ $(SRC_ROOT)src/opari/offload/opari2_directive_offload.h \ $(SRC_ROOT)src/opari/offload/opari2_directive_offload.cc \ $(SRC_ROOT)src/opari/offload/opari2_offload_handler.cc \ $(SRC_ROOT)src/opari/offload/opari2_offload_handler.h \ opari2_usage.h opari2_CPPFLAGS = $(AM_CPPFLAGS) -DPACKAGE_VERSION="\"@PACKAGE_VERSION@\"" -I$(INC_ROOT)src/opari opari2includedir = $(includedir)/opari2 opari2include_HEADERS = $(PUBLIC_INC_SRC)pomp2_lib.h opari2include_HEADERS += $(PUBLIC_INC_SRC)pomp2_user_lib.h opari2_config_SOURCES = $(SRC_ROOT)src/opari/opari2_config.cc \ $(SRC_ROOT)src/opari/opari2_config.h \ opari2-config_usage.h BUILT_SOURCES += opari2_usage.h opari2-config_usage.h opari2_usage.h: $(INC_ROOT)doc/doxygen-user/opari2_usage.dox.in $(AM_V_GEN)$(AWK) '{print "\"" $$0 "\\n\""}' $(INC_ROOT)doc/doxygen-user/opari2_usage.dox.in > opari2_usage.h opari2-config_usage.h: $(INC_ROOT)doc/doxygen-user/opari2-config_usage.dox.in $(AM_V_GEN)$(AWK) '{print "\"" $$0 "\\n\""}' $(INC_ROOT)doc/doxygen-user/opari2-config_usage.dox.in > opari2-config_usage.h CLEANFILES += opari2_usage.h opari2-config_usage.h opari2-2.0.6/src/opari/PaxHeaders.6153/pomp0000644000000000000000000000013214015716532015171 xustar0030 mtime=1614257498.360005861 30 atime=1614257501.252015069 30 ctime=1614257498.360005861 opari2-2.0.6/src/opari/pomp/0000755000175100001440000000000014015716532016441 5ustar00builderusers00000000000000opari2-2.0.6/src/opari/pomp/PaxHeaders.6153/opari2_pomp_handler.cc0000644000000000000000000000013214015716474021506 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.360005861 opari2-2.0.6/src/opari/pomp/opari2_pomp_handler.cc0000644000175100001440000001421714015716474022706 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_pomp_handler.cc * * @brief This file contains all handler funtions to instrument and print POMP directives. */ #include #include using std::ostream; using std::cerr; #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_pomp.h" #include "opari2_directive_manager.h" extern OPARI2_Option_t opt; OPARI2_DirectivePomp* cast2pomp( OPARI2_Directive* d_base ) { OPARI2_DirectivePomp* d = dynamic_cast( d_base ); if ( d == NULL ) { cerr << "INTERNAL ERROR: OPARI2_DirectivePomp* expected. Please contact user support.\n"; cleanup_and_exit(); } return d; } void h_pomp_inst( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); string& name = d->GetName(); char c1 = toupper( name.substr( 4 )[ 0 ] ); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_" << c1 << name.substr( 5 ) << "()\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_" << c1 << name.substr( 5 ) << "();\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst init". */ void h_pomp_instinit( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst finalize". */ void h_pomp_instfinalize( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst on". */ void h_pomp_inston( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst off". */ void h_pomp_instoff( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp instrument" . */ void h_pomp_instrument( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); EnableInstrumentation( D_USER ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp noinstrument" . */ void h_pomp_noinstrument( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); DisableInstrumentation( D_USER ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst begin" . */ void h_pomp_instbegin( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); d->EnterRegion(); int id = d->GetID(); d->SetName( "userRegion" ); d->FindUserRegionName(); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_Begin(" << region_id_prefix << id; os << ", " << d->GetCTCStringVariable() << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_Begin(&" << region_id_prefix << id; os << ", " << d->GetCTCStringVariable() << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst altend" . */ void h_pomp_instaltend( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); OPARI2_DirectivePomp* d_top = cast2pomp( DirectiveStackTop( d ) ); d->FindUserRegionName(); string& subname = d->GetUserRegionName(); string& subname_top = d_top->GetUserRegionName(); if ( subname != subname_top ) { string& filename = d->GetFilename(); cerr << filename << ":" << d_top->GetLineno() << ": ERROR: missing inst end(" << subname_top << ") pragma/directive\n"; cerr << filename << ":" << d->GetLineno() << ": ERROR: non-matching inst end(" << subname << ") pragma/directive\n"; cleanup_and_exit(); } if ( opt.lang & L_FORTRAN ) { os << " call POMP2_End(" << region_id_prefix << d_top->GetID() << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_End(&" << region_id_prefix << d_top->GetID() << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst end" . */ void h_pomp_instend( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); // change the directive/region name explicity. //d->SetRegionName( "endregion" ); d->SetName( "enduserRegion" ); d->FindUserRegionName(); OPARI2_DirectivePomp* d_top = cast2pomp( DirectiveStackTop( d ) ); string& subname = d->GetUserRegionName(); string& subname_top = d_top->GetUserRegionName(); int id = d->ExitRegion( false ); if ( subname != subname_top ) { string& filename = d->GetFilename(); cerr << filename << ":" << d_top->GetLineno() << ": ERROR: missing inst end(" << subname_top << ") pragma/directive\n"; cerr << filename << ":" << d->GetLineno() << ": ERROR: non-matching inst end(" << subname << ") pragma/directive\n"; cleanup_and_exit(); } if ( opt.lang & L_FORTRAN ) { os << " call POMP2_End(" << region_id_prefix << id << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_End(&" << region_id_prefix << id << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } opari2-2.0.6/src/opari/pomp/PaxHeaders.6153/opari2_pomp_handler.h0000644000000000000000000000013214015716474021350 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.356005849 opari2-2.0.6/src/opari/pomp/opari2_pomp_handler.h0000644000175100001440000000270414015716474022546 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_pomp_handler.h * * @brief */ #ifndef OPARI2_POMP_HANDLER_H #define OPARI2_POMP_HANDLER_H #include using std::ostream; void h_pomp_inst( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instinit( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instfinalize( OPARI2_Directive* ptr, ostream& os ); void h_pomp_inston( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instoff( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instrument( OPARI2_Directive* ptr, ostream& os ); void h_pomp_noinstrument( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instbegin( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instaltend( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instend( OPARI2_Directive* ptr, ostream& os ); void h_end_pomp_instbegin( OPARI2_Directive* ptr, ostream& os ); #endif opari2-2.0.6/src/opari/pomp/PaxHeaders.6153/opari2_directive_pomp.cc0000644000000000000000000000013214015716474022047 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.356005849 opari2-2.0.6/src/opari/pomp/opari2_directive_pomp.cc0000644000175100001440000000761714015716474023255 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_pomp.cc * * @brief Methods of POMP base class. */ #include #include using std::string; #include using std::ostream; #include #include "common.h" #include "opari2_directive_pomp.h" #include "opari2_directive_entry_pomp.h" /** This seems overkill in this case, but it should be consistent with the other paradigms*/ typedef struct { uint32_t mEnum; const string mGroupName; } OPARI2_POMPGroupStringMapEntry; OPARI2_POMPGroupStringMapEntry pompGroupStringMap[] = { { G_POMP_REGION, "userRegion" }, { G_POMP_ALL, "pomp" }, }; uint32_t OPARI2_DirectivePomp::String2Group( const string name ) { size_t n = sizeof( pompGroupStringMap ) / sizeof( OPARI2_POMPGroupStringMapEntry ); for ( size_t i = 0; i < n; ++i ) { if ( pompGroupStringMap[ i ].mGroupName.compare( name ) == 0 ) { return pompGroupStringMap[ i ].mEnum; } } return 0; } void OPARI2_DirectivePomp::IncrementRegionCounter( void ) { ++s_num_regions; } /** * @brief Generate CTC string for POMP region. */ string OPARI2_DirectivePomp::generate_ctc_string( OPARI2_Format_t form ) { stringstream s; if ( m_name == "userRegion" ) { s << "userRegionName=" << m_user_region_name << "*"; } return generate_ctc_string_common( form, s.str() ); } void OPARI2_DirectivePomp::GenerateHeader( ostream& os ) { if ( s_lang & L_C_OR_CXX ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } } } void OPARI2_DirectivePomp::GenerateDescr( ostream& os ) { OPARI2_Directive::generate_descr_common( os ); if ( s_lang & L_FORTRAN ) { s_init_handle_calls << " call " << s_paradigm_prefix << "_Assign_handle( " << region_id_prefix << m_id << ", "; if ( s_format == F_FIX ) { s_init_handle_calls << "\n & "; } else { s_init_handle_calls << "&\n "; } s_init_handle_calls << m_ctc_string_variable << " )\n"; } else if ( s_lang & L_C_OR_CXX ) { s_init_handle_calls << " " << s_paradigm_prefix << "_Assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } } /** * @brief Generate a function to allow initialization of all region handles for Fortran. * * These functions need to be called from POMP2_Init_regions. */ void OPARI2_DirectivePomp::GenerateInitHandleCalls( ostream& os, const string incfile ) { OPARI2_Directive::GenerateInitHandleCalls( os, incfile, s_paradigm_prefix, s_init_handle_calls, s_num_regions ); return; } void OPARI2_DirectivePomp::FindName( void ) { find_name_common(); if ( m_name == "inst" ) { m_name += find_next_word(); } } void OPARI2_DirectivePomp::SetName( string name_str ) { m_name = name_str; } void OPARI2_DirectivePomp::FindUserRegionName( void ) { string user_region_name = find_next_word(); if ( user_region_name == "(" ) { m_user_region_name = find_next_word(); } } string& OPARI2_DirectivePomp::GetUserRegionName( void ) { return m_user_region_name; } stringstream OPARI2_DirectivePomp::s_init_handle_calls; int OPARI2_DirectivePomp:: s_num_regions = 0; string OPARI2_DirectivePomp:: s_paradigm_prefix = "POMP2_USER"; opari2-2.0.6/src/opari/pomp/PaxHeaders.6153/opari2_directive_pomp.h0000644000000000000000000000013214015716474021711 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.356005849 opari2-2.0.6/src/opari/pomp/opari2_directive_pomp.h0000644000175100001440000000427114015716474023110 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_pomp.h * * @brief Class definitions for POMP directives. */ #ifndef OPARI2_DIRECTIVE_POMP_H #define OPARI2_DIRECTIVE_POMP_H #include using std::string; #include using std::ostream; #include using std::vector; #include "opari2.h" #include "opari2_directive.h" /** @brief Base Class to store and manipulate POMP directive and related data. */ class OPARI2_DirectivePomp : public OPARI2_Directive { public: OPARI2_DirectivePomp( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_POMP; } virtual ~ OPARI2_DirectivePomp( void ) { } /** Increment region counter */ void IncrementRegionCounter( void ); void GenerateDescr( ostream& os ); /** @brief Generate first lines of "include" directives. */ static void GenerateHeader( ostream& os ); /** generate call POMP2_Init_reg_XXX function to initialize * all handles, in the Fortran case */ static void GenerateInitHandleCalls( ostream& os, const string incfile = "" ); virtual void FindName( void ); /** @brief Change the default directive name. */ void SetName( string name_str ); void FindUserRegionName( void ); string& GetUserRegionName( void ); /** Parse string and return POMP group id */ static uint32_t String2Group( const string name ); private: string m_user_region_name; virtual string generate_ctc_string( OPARI2_Format_t form ); static stringstream s_init_handle_calls; static string s_paradigm_prefix; static int s_num_regions; }; #endif opari2-2.0.6/src/opari/pomp/PaxHeaders.6153/opari2_directive_entry_pomp.h0000644000000000000000000000013214015716474023132 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.352005836 opari2-2.0.6/src/opari/pomp/opari2_directive_entry_pomp.h0000644000175100001440000000454714015716474024337 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_pomp.h * * @brief Define POMP directive entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_POMP_H #define OPARI2_DIRECTIVE_ENTRY_POMP_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of OpenAcc directive/runtime API group. * More directive group definition can be added before G_OMP_ALL. */ enum OPARI2_PompGroup { G_POMP_NONE = 0x00000000, G_POMP_REGION = 0x00000001, G_POMP_DEFAULT = 0x00010000, G_POMP_ALL = 0xFFFFFFFF }; #define OPARI2_POMP2_USER_SENTINELS \ { "!$pomp", OPARI2_PT_POMP }, \ { "c$pomp", OPARI2_PT_POMP }, \ { "*$pomp", OPARI2_PT_POMP }, \ { "!pomp$", OPARI2_PT_POMP }, \ { "!pomp$", OPARI2_PT_POMP }, \ { "cpomp$", OPARI2_PT_POMP }, \ { "*pomp$", OPARI2_PT_POMP }, \ { "pomp", OPARI2_PT_POMP } #define OPARI2_CREATE_POMP_TABLE_ENTRY( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_POMP, name, false, true, version, group, pomp ) #define OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_NOEND( OPARI2_PT_POMP, name, false, version, group, pomp ) /** * TODO: * Set the correct version / group number for POMP directives */ #define OPARI2_POMP_DIRECTIVE_ENTRIES \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instinit, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instfinalize, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( inston, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instoff, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instrument, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( noinstrument, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instbegin, 1.1, G_POMP_REGION ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instaltend, 1.1, G_POMP_REGION ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instend, 1.1, G_POMP_REGION ) #endif // OPARI2_DIRECTIVE_ENTRY_POMP_H opari2-2.0.6/src/opari/PaxHeaders.6153/openmp0000644000000000000000000000013214015716532015514 xustar0030 mtime=1614257498.352005836 30 atime=1614257501.252015069 30 ctime=1614257498.352005836 opari2-2.0.6/src/opari/openmp/0000755000175100001440000000000014015716532016764 5ustar00builderusers00000000000000opari2-2.0.6/src/opari/openmp/PaxHeaders.6153/opari2_omp_handler.cc0000644000000000000000000000013214015716474021651 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.352005836 opari2-2.0.6/src/opari/openmp/opari2_omp_handler.cc0000644000175100001440000015247414015716474023061 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2016-2017, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_omp_handler.cc * * @brief This file contains all handler funtions to instrument and print * OpenMP pragmas. * * @todo A lot of functionality here might be generalized into a * separate writer class. This is planned for the future. */ #include #include using std::vector; #include using std::map; #include using std::stack; #include using std::cerr; #include using std::ifstream; using std::ofstream; #include using std::string; using std::getline; #include using std::exit; #include using std::strcmp; #include using std::toupper; #include using std::ostream; #include #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_openmp.h" #include "opari2_directive_manager.h" extern OPARI2_Option_t opt; namespace { bool in_workshare = false; void generate_num_threads( ostream& os, OPARI2_DirectiveOpenmp* d ) { string num_threads = d->GetClauseArg( "num_threads" ); if ( opt.lang & L_FORTRAN ) { if ( num_threads.length() ) { os << " pomp2_num_threads = " << num_threads << "\n"; } else { os << " pomp2_num_threads = pomp2_lib_get_max_threads()\n"; } } else { if ( num_threads.length() ) { os << " int pomp2_num_threads = " << num_threads << ";\n"; } else { os << " int pomp2_num_threads = omp_get_max_threads();\n"; } } } void generate_if( ostream& os, OPARI2_DirectiveOpenmp* d ) { string if_clause = d->GetClauseArg( "if" ); if ( opt.lang & L_FORTRAN ) { if ( if_clause.length() ) { os << " pomp2_if = ( " << if_clause << " )\n"; } else { os << " pomp2_if = .true.\n"; } } else { if ( if_clause.length() ) { os << " int pomp2_if = (int)( " << if_clause << " );\n"; } else { os << " int pomp2_if = 1;\n"; } } } void generate_call( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( strstr( type, "task" ) != NULL && strcmp( type, "taskwait" ) != 0 && strcmp( event, "begin" ) == 0 ) { os << ", pomp2_new_task"; } if ( d != NULL ) { if ( opt.form == F_FIX ) { os << ",\n &" << d->GetCTCStringVariable() << " "; } else { os << ", &\n " << d->GetCTCStringVariable() << " "; } } os << ")\n"; if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << " end if\n"; } } else { if ( strcmp( event, "begin" ) == 0 || strcmp( event, "fork" ) == 0 || strcmp( event, "enter" ) == 0 ) { os << "{ "; } if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; if ( strstr( type, "task" ) != NULL && strcmp( type, "taskwait" ) != 0 && strcmp( event, "begin" ) == 0 ) { os << ", pomp2_new_task"; } if ( d != NULL ) { os << ", " << d->GetCTCStringVariable() << " "; } os << " );"; if ( strcmp( event, "end" ) == 0 ) { os << " }"; } os << "\n"; if ( strcmp( event, "join" ) == 0 || strcmp( event, "exit" ) == 0 ) { os << " }\n"; } } } void generate_call_save_task_id( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { if ( opt.form == F_FIX ) { os << ",\n &pomp2_new_task"; } else { os << ", pomp2_new_task"; } } if ( opt.form == F_FIX ) { os << ",\n &pomp2_old_task"; } else { os << ",&\n pomp2_old_task"; } if ( d != NULL ) { if ( opt.form == F_FIX ) { if ( d->GetName() == "task" ) { os << ", \n &pomp2_if"; } os << ",\n &" << d->GetCTCStringVariable() << " "; } else { if ( d->GetName() == "task" ) { os << ", pomp2_if"; } os << ", " << d->GetCTCStringVariable() << " "; } } os << ")\n"; if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " end if\n"; } } else { os << "{ POMP2_Task_handle pomp2_old_task;\n"; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { os << " POMP2_Task_handle pomp2_new_task;\n"; } if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { os << ", &pomp2_new_task"; } os << ", &pomp2_old_task"; if ( d != NULL ) { if ( d->GetName() == "task" ) { os << ", pomp2_if"; } os << ", " << d->GetCTCStringVariable() << " "; } os << " );\n"; } } void generate_call_restore_task_id( const char* event, const char* type, int id, ostream& os ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( opt.form == F_FIX ) { os << ",\n &pomp2_old_task)\n"; } else { os << ", pomp2_old_task)\n"; } if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " end if\n"; } } else { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; os << ", pomp2_old_task ); }\n"; } } /** @brief Instrument an OpenMP Fork. * * The pomp2_num_threads variable is * used to pass the number of requested threads for the * parallel region to the POMP library. It is either the * result of omp_get_max_threads() or of the num_threads() * clause, if present. */ void generate_fork_call( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); if ( opt.lang & L_C_OR_CXX ) { os << "{\n"; } generate_num_threads( os, d ); generate_if( os, d ); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( opt.form == F_FIX ) { os << ",\n &pomp2_if, pomp2_num_threads, pomp2_old_task"; if ( d != NULL ) { os << ",\n &" << d->GetCTCStringVariable() << " "; } } else { os << ",&\n pomp2_if, pomp2_num_threads, pomp2_old_task"; if ( d != NULL ) { os << ", &\n " << d->GetCTCStringVariable() << " "; } } os << ")\n"; } else { os << " POMP2_Task_handle pomp2_old_task;\n"; os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "(&" << region_id_prefix << id << ", pomp2_if, pomp2_num_threads, " << "&pomp2_old_task"; if ( d != NULL ) { os << ", " << d->GetCTCStringVariable() << " "; } os << ");\n"; } } /** @brief Generate the OpenMP pragma/directive. */ void generate_directive( const char* p, int lineno, const char* filename, ostream& os ) { if ( lineno && opt.keep_src_info ) { // print original source location information reset pragma os << "#line " << lineno << " \"" << filename << "\"" << "\n"; } if ( opt.lang & L_FORTRAN ) { os << "!$omp " << p << "\n"; } else { os << "#pragma omp " << p << "\n"; } } void generate_barrier( int n, ostream& os, const char* filename ) { generate_call_save_task_id( "enter", "implicit_barrier", n, os, NULL ); generate_directive( "barrier", 0, filename, os ); generate_call_restore_task_id( "exit", "implicit_barrier", n, os ); } } //end-of-namespace OPARI2_DirectiveOpenmp* cast2omp( OPARI2_Directive* d_base ) { OPARI2_DirectiveOpenmp* d = dynamic_cast( d_base ); if ( d == NULL ) { cerr << "INTERNAL ERROR: OPARI2_DirectiveOpenmp* expected. Please contact user support.\n"; cleanup_and_exit(); } return d; } /** * @brief Print the directive's lines, together with additional * statements to support OpenMP task. */ void print_directive_parallel( OPARI2_DirectiveOpenmp* d, ostream& os ) { opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); stringstream adds; if ( opt.lang & L_FORTRAN ) { if ( opt.form == F_FIX ) // fix source form { adds << "\n!$omp& firstprivate(pomp2_old_task) private(pomp2_new_task)\n!$omp&"; if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; if ( omp_opt->copytpd ) { adds << " copyin(" << omp_opt->pomp_tpd << ")"; } if ( d->ChangedDefault() ) { adds << "\n!$omp& shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)\n" << "!$omp& private(pomp2_if,pomp2_num_threads)"; } } else // free source form { adds << " &\n !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) &\n"; adds << " !$omp"; if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; if ( omp_opt->copytpd ) { adds << " copyin(" << omp_opt->pomp_tpd << ")"; } if ( d->ChangedDefault() ) { adds << " &\n !$omp shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)" << " &\n !$omp private(pomp2_if,pomp2_num_threads)"; } } } else //C/C++ { adds << " firstprivate(pomp2_old_task)"; if ( omp_opt->copytpd ) { if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads) copyin(" << omp_opt->pomp_tpd << ")"; } else { if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; } } /* Parallel directives must always be instrumented to enable * a measurement system to do its memory management in a * threadsafe manner. Therefore the line directive must be * inserted even if instrumentation is turned off. */ if ( opt.keep_src_info && !InstrumentationDisabled( D_FULL ) ) { // print original source location information reset pragma os << "#line " << d->GetLineno() << " \"" << d->GetFilename() << "\"" << "\n"; } d->PrintPlainDirective( os, adds.str() ); } void enter_handler_notransform( OPARI2_DirectiveOpenmp* d, ostream& os ) { DirectiveStackPush( d ); d->PrintPlainDirective( os ); } void exit_handler_notransform( OPARI2_DirectiveOpenmp* d ) { DirectiveStackPop(); } /** * @brief OpenMP pragma transformation functions. * * These functions are called by directive manager ONLY if the directive is enabled. */ /** * Note: parallel directive MUST ignore "pomp noinstrument" * to ensure the measurement library is thread-safe. */ void h_omp_parallel( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallel( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && DirectiveActive( OPARI2_PT_OMP, "barrier" ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "end", "parallel", id, os, NULL ); d->PrintDirective( os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info && !InstrumentationDisabled( D_FULL ) ) { d->ResetSourceInfo( os ); } } } void h_omp_for( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) ) { d->AddNowait(); } generate_call( "enter", "for", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_for( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "for", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_do( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "do", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_do( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "do", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_sections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) ) { d->AddNowait(); } generate_call( "enter", "sections", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_omp_section_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); //Init region using the parent directive's region ID! d->InitRegion( d_top ); DirectiveStackPush( d ); int num_sections = d_top->GetNumSections(); if ( num_sections ) { d->PrintPlainDirective( os ); } else { d->PrintDirective( os ); } generate_call( "begin", "section", d_top->GetID(), os, d_top ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } num_sections += 1; d_top->SetNumSections( num_sections ); } } void h_end_omp_section_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); generate_call( "end", "section", d_top->GetID(), os, NULL ); DirectiveStackPop(); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_section( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_C_OR_CXX ) { h_end_omp_section_c( d_base, os ); } } void h_end_omp_sections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "sections", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_sections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "sections", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_omp_sections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_sections_f( d_base, os ); } else { h_omp_sections_c( d_base, os ); } } void h_omp_section_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int num_sections = d_top->GetNumSections(); if ( num_sections ) { // close last section if necessary generate_call( "end", "section", d_top->GetID(), os, NULL ); } d->PrintDirective( os ); generate_call( "begin", "section", d_top->GetID(), os, d_top ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } d_top->SetNumSections( ++num_sections ); } } void h_omp_section( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_section_f( d_base, os ); } else { h_omp_section_c( d_base, os ); } } void h_end_omp_sections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "section", id, os, NULL ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "sections", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_sections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_sections_f( d_base, os ); } else { h_end_omp_sections_c( d_base, os ); } } void h_omp_single_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) && !d->HasClause( "copyprivate" ) ) { d->AddNowait(); } int id = d->GetID(); generate_call( "enter", "single", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_single_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); generate_call( "end", "single", id, os, NULL ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_single_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "single", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_single( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_single_f( d_base, os ); } else { h_omp_single_c( d_base, os ); } } void h_end_omp_single_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "single", id, os, NULL ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { if ( !d->HasClause( "copyprivate" ) ) { d->AddNowait(); } d->PrintDirective( os ); if ( d->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } } generate_call( "exit", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_single( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_single_f( d_base, os ); } else { h_end_omp_single_c( d_base, os ); } } void h_omp_master( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); d->PrintDirective( os ); generate_call( "begin", "master", d->GetID(), os, d ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_master_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "master", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_master_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "master", id, os, NULL ); d->PrintDirective( os ); } } void h_end_omp_master( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_master_f( d_base, os ); } else { h_end_omp_master_c( d_base, os ); } } void h_omp_critical( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); /** 'critical' should NOT be instrumented if inside 'workshare' construct */ if ( InstrumentationDisabled( D_USER ) || in_workshare ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "critical", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "critical", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_critical( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); if ( InstrumentationDisabled( D_USER ) || in_workshare ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); string& name = d->GetName(); string& subname = d->GetUserName(); string& subname_top = d_top->GetUserName(); if ( name[ 0 ] != '$' ) { if ( subname != subname_top ) { cerr << d->GetFilename() << ":" << d_top->GetLineno() << ": ERROR: missing end critical(" << subname << ") directive\n"; cerr << d->GetFilename() << ":" << d->GetLineno() << ": ERROR: non-matching end critical(" << subname << ") directive\n"; cleanup_and_exit(); } } generate_call( "end", "critical", id, os, NULL ); d->PrintDirective( os ); generate_call( "exit", "critical", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelfor( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* for_directive = d->SplitCombined(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); } else { for_directive->AddNowait(); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); generate_call( "enter", "for", id, os, d ); } for_directive->PrintDirective( os ); // #omp for nowait delete for_directive; } } void h_end_omp_parallelfor( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "for", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_paralleldo( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); OPARI2_DirectiveOpenmp* do_directive = d->SplitCombined(); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "do", id, os, d ); } do_directive->PrintDirective( os ); // #omp do delete do_directive; } } void h_end_omp_paralleldo( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); string& filename = d->GetFilename(); int lineno = d->GetLineno(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_directive( "end do", lineno, filename.c_str(), os ); } else { generate_directive( "end do nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "do", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelsections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* d_section = d->SplitCombined(); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { d_section->AddNowait(); } generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "sections", id, os, d ); } d_section->PrintDirective( os ); // #omp sections delete d_section; } } void h_omp_parallelsections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* sec_directive = d->SplitCombined(); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); // #omp parallel generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "sections", id, os, NULL ); } sec_directive->PrintDirective( os ); // #omp sections delete sec_directive; } } void h_omp_parallelsections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_parallelsections_f( d_base, os ); } else { h_omp_parallelsections_c( d_base, os ); } } void h_end_omp_parallelsections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "sections", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallelsections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); int lineno = d->GetLineno(); string& filename = d->GetFilename(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_directive( "end sections", lineno, filename.c_str(), os ); // generate_barrier( id, os, filename.c_str() ); } else { generate_call( "end", "section", id, os, NULL ); generate_directive( "end sections nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "sections", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallelsections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_parallelsections_f( d_base, os ); } else { h_end_omp_parallelsections_c( d_base, os ); } } void h_omp_barrier( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { /** initialize region information */ d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call_save_task_id( "enter", "barrier", id, os, d ); d->PrintDirective( os ); generate_call_restore_task_id( "exit", "barrier", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_flush( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call( "enter", "flush", id, os, d ); d->PrintDirective( os ); generate_call( "exit", "flush", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_atomic( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); SaveSingleLineDirective( d ); /** * 'atomic' directive should NOT be instrumented if inside a 'workshare' region. */ if ( InstrumentationDisabled( D_USER ) || in_workshare ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "atomic", d->GetID(), os, d ); d->PrintDirective( os ); } } /** * Special handler for the end of 'atomic' region in Fortran. */ void extra_openmp_atomic_handler( OPARI2_Directive* d_base, const int lineno, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( d && ( InstrumentationDisabled( D_USER ) || in_workshare ) ) { exit_handler_notransform( d ); SaveSingleLineDirective( NULL ); } else { if ( d ) { d->SetEndLineno( lineno, lineno ); generate_call( "exit", "atomic", d->GetID(), os, NULL ); DirectiveStackPop(); if ( opt.keep_src_info ) { os << "#line " << ( lineno + 1 ) << " \"" << opt.infile << "\"" << "\n"; } SaveSingleLineDirective( NULL ); } } } void h_end_omp_atomic( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) || in_workshare ) { exit_handler_notransform( d ); SaveSingleLineDirective( NULL ); } else { int id = d->ExitRegion( false ); generate_call( "exit", "atomic", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } SaveSingleLineDirective( NULL ); } } void h_omp_workshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = true; if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "workshare", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_workshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = false; if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); generate_call( "exit", "workshare", id, os, NULL ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "workshare", id, os, NULL ); } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelworkshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); OPARI2_DirectiveOpenmp* ws_directive = d->SplitCombined(); print_directive_parallel( d, os ); // #omp parallel generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) ) { generate_call( "enter", "workshare", id, os, d ); } ws_directive->PrintDirective( os ); // #omp workshare in_workshare = true; delete ws_directive; } } /*2.0*/ void h_end_omp_parallelworkshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = false; if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); int lineno = d->GetLineno(); string& filename = d->GetFilename(); if ( InstrumentationDisabled( D_USER ) ) { generate_directive( "end workshare", lineno, filename.c_str(), os ); //generate_barrier( id, os, filename.c_str() ); } else { generate_directive( "end workshare nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "workshare", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*2.5*/ void h_omp_ordered( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "ordered", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "ordered", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*2.5*/ void h_end_omp_ordered( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "ordered", id, os, NULL ); d->PrintDirective( os ); generate_call( "exit", "ordered", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*3.0*/ void h_omp_task( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); const char* inner_call, * outer_call; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); int id = d->GetID(); if ( !InstrumentationDisabled( D_FULL ) ) { d->AddDescr( id ); } outer_call = "task_create"; inner_call = "task"; if ( omp_opt->task_abort ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "ERROR: Tasks are not allowed with this configuration." << std::endl; cleanup_and_exit(); } if ( omp_opt->task_warn ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "WARNING: Tasks may not be supported by the measurement system." << std::endl; } if ( d->HasClause( "untied" ) ) { if ( omp_opt->untied_abort ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "ERROR: Untied tasks are not allowed with this configuration." << std::endl; cleanup_and_exit(); } if ( !omp_opt->untied_nowarn && !omp_opt->untied_keep ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "WARNING: untied tasks may not be supported by the measurement system.\n" << " All untied tasks are now made tied.\n" << " Please consider using --omp-task-untied=abort|keep|no-warn" << std::endl; } if ( omp_opt->untied_keep ) { outer_call = "untied_task_create"; inner_call = "untied_task"; } } if ( !omp_opt->task_remove ) { if ( ( opt.lang & L_C_OR_CXX ) ) { os << "{\n"; } generate_if( os, d ); generate_call_save_task_id( "begin", outer_call, id, os, d ); stringstream adds; if ( opt.lang & L_FORTRAN ) { if ( opt.form == F_FIX ) // Fix source form { adds << "\n!$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; if ( d->ChangedDefault() ) { adds << "\n!$omp& shared(/" << "cb" << d->GetInodeCompiletimeID() << "/) "; } } else // Free source form { adds << " if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; if ( d->ChangedDefault() ) { adds << "&\n !$omp shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)"; } } } else { adds << " if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; } d->PrintDirective( os, adds.str() ); generate_call( "begin", inner_call, id, os, NULL ); } else { os << "//!!! Removed task directive due to user option \"--task=remove\"!" << std::endl; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_task( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( true ); const char* inner_call, * outer_call; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); if ( d_top->HasClause( "untied" ) && omp_opt->untied_keep ) { outer_call = "untied_task_create"; inner_call = "untied_task"; } else { outer_call = "task_create"; inner_call = "task"; } if ( !omp_opt->task_remove ) { generate_call( "end", inner_call, id, os, NULL ); d->PrintDirective( os ); generate_call_restore_task_id( "end", outer_call, id, os ); if ( ( opt.lang & L_C_OR_CXX ) ) { os << "}\n"; } } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_taskwait( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call_save_task_id( "begin", "taskwait", id, os, d ); d->PrintDirective( os ); generate_call_restore_task_id( "end", "taskwait", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_threadprivate( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); d->PrintDirective( os ); } opari2-2.0.6/src/opari/openmp/PaxHeaders.6153/opari2_omp_handler.h0000644000000000000000000000013214015716474021513 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.307910198 30 ctime=1614257498.348005824 opari2-2.0.6/src/opari/openmp/opari2_omp_handler.h0000644000175100001440000001167114015716474022714 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_omp_handler.h * * @brief */ #ifndef OPARI2_OMP_HANDLER_H #define OPARI2_OMP_HANDLER_H #include using std::ostream; void h_omp_parallel( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallel( OPARI2_Directive* d, ostream& os ); void h_omp_for( OPARI2_Directive* d, ostream& os ); void h_end_omp_for( OPARI2_Directive* d, ostream& os ); void h_omp_do( OPARI2_Directive* d, ostream& os ); void h_end_omp_do( OPARI2_Directive* d, ostream& os ); void h_omp_sections( OPARI2_Directive* d, ostream& os ); void h_omp_section( OPARI2_Directive* d, ostream& os ); void h_end_omp_section( OPARI2_Directive* d, ostream& os ); void h_end_omp_sections( OPARI2_Directive* d, ostream& os ); void h_omp_single( OPARI2_Directive* d, ostream& os ); void h_end_omp_single( OPARI2_Directive* d, ostream& os ); void h_omp_master( OPARI2_Directive* d, ostream& os ); void h_end_omp_master( OPARI2_Directive* d, ostream& os ); void h_omp_critical( OPARI2_Directive* d, ostream& os ); void h_end_omp_critical( OPARI2_Directive* d, ostream& os ); void h_omp_parallelfor( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelfor( OPARI2_Directive* d, ostream& os ); void h_omp_paralleldo( OPARI2_Directive* d, ostream& os ); void h_end_omp_paralleldo( OPARI2_Directive* d, ostream& os ); void h_omp_parallelsections( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelsections( OPARI2_Directive* d, ostream& os ); void h_omp_barrier( OPARI2_Directive* d, ostream& os ); void h_omp_flush( OPARI2_Directive* d, ostream& os ); void h_omp_atomic( OPARI2_Directive* d, ostream& os ); void h_end_omp_atomic( OPARI2_Directive* d, ostream& os ); void h_omp_workshare( OPARI2_Directive* d, ostream& os ); void h_end_omp_workshare( OPARI2_Directive* d, ostream& os ); void h_omp_parallelworkshare( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelworkshare( OPARI2_Directive* d, ostream& os ); void h_omp_ordered( OPARI2_Directive* d, ostream& os ); void h_end_omp_ordered( OPARI2_Directive* d, ostream& os ); void h_omp_task( OPARI2_Directive* d, ostream& os ); void h_end_omp_task( OPARI2_Directive* d, ostream& os ); void h_omp_taskwait( OPARI2_Directive* d, ostream& os ); void h_omp_threadprivate( OPARI2_Directive* d, ostream& os ); void extra_openmp_atomic_handler( OPARI2_Directive* d, const int lineno, ostream& os ); void finalize_handler( ostream& os ); #endif opari2-2.0.6/src/opari/openmp/PaxHeaders.6153/opari2_directive_openmp.cc0000644000000000000000000000013214015716474022715 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.303910186 30 ctime=1614257498.348005824 opari2-2.0.6/src/opari/openmp/opari2_directive_openmp.cc0000644000175100001440000006712714015716474024125 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014, 2017, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_directive_openmp.cc * * @brief Methods of Openmp abstract base class, * useed to process OpenMP pragmas in C/C++ and Fortran program. */ #include #include using std::cerr; #include using std::string; #include #include "common.h" #include "opari2_directive_openmp.h" #include "opari2_directive_entry_openmp.h" #include "opari2_directive_manager.h" #define MAKE_STR( x ) MAKE_STR_( x ) #define MAKE_STR_( x ) #x typedef struct { uint32_t mEnum; const string mGroupName; } OPARI2_OpenMPGroupStringMapEntry; OPARI2_OpenMPGroupStringMapEntry ompGroupStringMap[] = { { G_OMP_ATOMIC, "atomic" }, { G_OMP_CRITICAL, "critical" }, { G_OMP_MASTER, "master" }, { G_OMP_SINGLE, "single" }, { G_OMP_LOCKS, "locks" }, { G_OMP_FLUSH, "flush" }, { G_OMP_TASK, "tasks" }, { G_OMP_SYNC, "sync" }, { G_OMP_OMP, "omp" }, { G_OMP_ALL, "all" }, }; /** * @brief Handle Openmp specific command line options ONLY in the form of "--omp-xx=xxx" */ OPARI2_ErrorCode OPARI2_DirectiveOpenmp::ProcessOption( string option ) { OPARI2_ErrorCode err_flag = OPARI2_NO_ERROR; if ( option != "" ) { /* handle new openmp-specific options */ if ( option == "--omp-nodecl" ) { s_omp_opt.add_shared_decl = false; } else if ( option == "--omp-tpd" ) { s_omp_opt.copytpd = true; } else if ( option.find( "--omp-tpd-mangling=" ) != string::npos ) { size_t p1 = option.find( "=" ); string tpd_arg = option.substr( p1 + 1 ); if ( tpd_arg != "" ) { if ( tpd_arg == "gnu" || tpd_arg == "sun" || tpd_arg == "intel" || tpd_arg == "pgi" || tpd_arg == "cray" ) { s_omp_opt.pomp_tpd = "pomp_tpd_"; s_omp_opt.tpd_in_extern_block = false; } else if ( tpd_arg == "ibm" ) { s_omp_opt.pomp_tpd = "pomp_tpd"; s_omp_opt.tpd_in_extern_block = true; } else { cerr << "ERROR: unknown option for --omp-tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { cerr << "ERROR: missing value for option --omp-tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( option.find( "--omp-task=" ) != string::npos ) { size_t p1 = option.find( "=" ) + 1; size_t p2 = option.find( ",", p1 ); size_t len = p2 == string::npos ? p2 : p2 - p1; string token = option.substr( 11, len ); do { if ( token == "abort" ) { s_omp_opt.task_abort = true; } else if ( token == "warn" ) { s_omp_opt.task_warn = true; } else if ( token == "remove" ) { s_omp_opt.task_remove = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --omp-task\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } p2 = option.find( ",", p1 + 1 ); if ( p2 == string::npos ) { break; } len = p2 - p1; p1 = p2 + 1; p2 = option.find( ",", len ); token = option.substr( p1, p2 ); } while ( true ); } else if ( option.find( "--omp-task-untied=" ) != string::npos ) { size_t p1 = option.find( "=" ) + 1; size_t p2 = option.find( ",", p1 ); size_t len = p2 == string::npos ? p2 : p2 - p1; string token = option.substr( 18, len ); do { if ( token == "abort" ) { s_omp_opt.untied_abort = true; } else if ( token == "no-warn" ) { s_omp_opt.untied_nowarn = true; } else if ( token == "keep" ) { s_omp_opt.untied_keep = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --omp-task-untied\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; break; } p2 = option.find( ",", p1 + 1 ); if ( p2 == string::npos ) { break; } len = p2 - p1; p1 = p2 + 1; p2 = option.find( ",", len ); token = option.substr( p1, p2 ); } while ( true ); } else { err_flag = OPARI2_ERROR_NO_MESSAGE; } } return err_flag; } opari2_omp_option* OPARI2_DirectiveOpenmp::GetOpenmpOpt( void ) { return &s_omp_opt; } void OPARI2_DirectiveOpenmp::IncrementRegionCounter( void ) { ++s_num_regions; } uint32_t OPARI2_DirectiveOpenmp::String2Group( const string name ) { size_t n = sizeof( ompGroupStringMap ) / sizeof( OPARI2_OpenMPGroupStringMapEntry ); for ( size_t i = 0; i < n; ++i ) { if ( ompGroupStringMap[ i ].mGroupName.compare( name ) == 0 ) { return ompGroupStringMap[ i ].mEnum; } } return 0; } /* * @breif Set class variable "omp_pomp_tpd". * * This static method is intended to be called by main() * when handling a FORTRAN source file. */ void OPARI2_DirectiveOpenmp::SetOptPomptpd( string str ) { s_omp_opt.pomp_tpd = str; return; } /** * @brief Find and store the directive name. */ void OPARI2_DirectiveOpenmp::FindName( void ) { find_name_common(); if ( m_name == "parallel" || m_name == "endparallel" ) { string w = find_next_word(); if ( w == "do" || w == "sections" || w == "for" || w == "workshare" /*2.0*/ ) { m_name += w; } } else if ( m_name == "end" ) { string w = find_next_word(); m_name += w; if ( w == "parallel" ) { w = find_next_word(); if ( w == "do" || w == "sections" || w == "for" || w == "workshare" /*2.0*/ ) { m_name += w; } } } if ( m_name == "critical" || m_name == "endcritical" ) { string cname = find_next_word(); if ( cname == "(" ) { m_user_name = find_next_word(); } } identify_clauses(); } void OPARI2_DirectiveOpenmp::identify_clauses( void ) { for ( vector::iterator it = s_directive_clauses[ m_name ].begin(); it != s_directive_clauses[ m_name ].end(); ++it ) { unsigned line = 0; string::size_type pos = 0; if ( find_word( *it, line, pos ) ) { bool remove = ( *it == "if" || *it == "num_threads" || ( *it == "untied" && !s_omp_opt.untied_keep ) ); m_clauses[ *it ] = find_arguments( line, pos, remove, *it ); } } } string OPARI2_DirectiveOpenmp::generate_ctc_string( OPARI2_Format_t form ) { stringstream s; s.clear(); if ( m_name == "critical" ) { if ( !m_user_name.empty() ) { s << "criticalName=" << m_user_name << "*"; } } else if ( m_name == "sections" ) { s << "numSections=" << m_num_sections << "*"; } for ( OPARI2_StrStr_map_t::iterator it = m_clauses.begin(); it != m_clauses.end(); ++it ) { /** Clauses not to appear on CTC-string */ if ( ( *it ).first != "private" && ( *it ).first != "lastprivate" && ( *it ).first != "firstprivate" && ( *it ).first != "copyin" && ( ( *it ).first != "default" || ChangedDefault() ) ) { string name = ( *it ).first; name[ 0 ] = toupper( name[ 0 ] ); s << "has" << name << "="; /** Clauses for which the argument is put on the CTC-string */ if ( ( *it ).first == "schedule" || ( *it ).first == "default" ) { /*replace * with @ in the CTC String to distinguish it from the CTC String delimited '*' */ while ( ( *it ).second.find( '*' ) != string::npos ) { ( *it ).second.replace( ( *it ).second.find( '*' ), 1, "@" ); } s << ( *it ).second << "*"; } else { s << "1" << "*"; } } } return generate_ctc_string_common( form, s.str() ); } /** * @brief Is the default data sharing changed by default(none) or default(private) clause? */ bool OPARI2_DirectiveOpenmp::ChangedDefault( void ) { if ( m_clauses.find( "default" ) == m_clauses.end() ) { return false; } else { return m_clauses[ "default" ] == "none" || m_clauses[ "default" ] == "private"; } } void OPARI2_DirectiveOpenmp::FindUserName( void ) { string cname = find_next_word(); if ( cname == "(" ) { m_user_name = find_next_word(); } } string& OPARI2_DirectiveOpenmp::GetUserName( void ) { return m_user_name; } void OPARI2_DirectiveOpenmp::SetNumSections( int n ) { m_num_sections = n; } int OPARI2_DirectiveOpenmp::GetNumSections( void ) { return m_num_sections; } bool OPARI2_DirectiveOpenmp::IsNowaitAdded( void ) { return m_nowait_added; } void OPARI2_DirectiveOpenmp::GenerateDescr( ostream& os ) { if ( s_lang & L_FORTRAN ) { s_init_handle_calls << " call " << s_paradigm_prefix << "_Assign_handle( " << region_id_prefix << m_id << ", "; if ( s_format == F_FIX ) { s_init_handle_calls << "\n & "; } else { s_init_handle_calls << "&\n "; } s_init_handle_calls << m_ctc_string_variable << " )\n"; } else if ( s_lang & L_C_OR_CXX ) { if ( !m_descrs.empty() ) { stringstream ids; ids << m_id; os << "#define POMP2_DLIST_" << string( 5 - ids.str().length(), '0' ) << ids.str() << " shared("; for ( set::const_iterator it = m_descrs.begin(); it != m_descrs.end(); ++it ) { if ( it != m_descrs.begin() ) { os << ","; } os << region_id_prefix << *it; } os << ")\n"; } s_init_handle_calls << " " << s_paradigm_prefix << "_Assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } OPARI2_Directive::generate_descr_common( os ); } void OPARI2_DirectiveOpenmp::GenerateHeader( ostream& os ) { if ( s_lang & L_C ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } if ( s_omp_opt.copytpd ) { if ( !s_preprocessed_file ) { os << "#include \n"; } os << "extern int64_t " << MAKE_STR( FORTRAN_ALIGNED ) " " << s_omp_opt.pomp_tpd << ";\n"; os << "#pragma omp threadprivate(" << s_omp_opt.pomp_tpd << ")\n"; } } else if ( s_lang & L_CXX ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } if ( s_omp_opt.copytpd ) { if ( !s_preprocessed_file ) { os << "#include \n"; } os << "extern \"C\" \n{\n"; os << "extern int64_t " << MAKE_STR( FORTRAN_ALIGNED ) " " << s_omp_opt.pomp_tpd << ";\n"; if ( !s_omp_opt.tpd_in_extern_block ) { os << "}\n"; } os << "#pragma omp threadprivate(" << s_omp_opt.pomp_tpd << ")\n"; if ( s_omp_opt.tpd_in_extern_block ) { os << "}\n"; } } } } /** * @brief Generate a function to allow initialization of all region handles for Fortran. * * These functions need to be called from POMP2_Init_regions. */ void OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( ostream& os, const string incfile ) { OPARI2_Directive::GenerateInitHandleCalls( os, incfile, s_paradigm_prefix, s_init_handle_calls, s_num_regions ); return; } /** @brief add a nowait to a pragma */ void OPARI2_DirectiveOpenmp::AddNowait( void ) { if ( s_lang & L_FORTRAN ) { int lastline = m_lines.size() - 1; string::size_type s = m_lines[ lastline ].find( m_directive_prefix[ 0 ] ) + m_directive_prefix[ 0 ].length(); // insert on last line on last position before comment string::size_type c = m_lines[ lastline ].find( '!', s ); if ( c == string::npos ) { m_lines[ lastline ].append( " nowait" ); } else { m_lines[ lastline ].insert( c, " nowait" ); } m_nowait_added = true; } else if ( s_lang & L_C_OR_CXX ) { int lastline = m_lines.size() - 1; m_lines[ lastline ].append( " nowait" ); m_nowait_added = true; } } /** @brief add region descriptors to shared variable list*/ void OPARI2_DirectiveOpenmp::AddDescr( int id ) { if ( s_lang & L_C_OR_CXX ) { std::ostringstream os; if ( s_omp_opt.add_shared_decl ) { std::stringstream ids; ids << id; os << " POMP2_DLIST_" << string( 5 - ids.str().length(), '0' ) << ids.str(); } else { // not 100% right but best we can do if compiler doesn't allow // macro replacement on pragma statements os << " shared(" << region_id_prefix << id << ")"; } int lastline = m_lines.size() - 1; m_lines[ lastline ].append( os.str() ); } } /** * @brief Split combined parallel and worksharing constructs in two * seperate pragmas to allow the insertion of POMP function * calles between the parallel and the worksharing construct. * clauses need to be matched to the corresponding pragma */ OPARI2_DirectiveOpenmp* OPARI2_DirectiveOpenmp::SplitCombined( void ) { return SplitCombinedT( s_outer_inner, s_inner_clauses ); } void OPARI2_DirectiveOpenmp::FinalizeDescrs( ostream& os ) { if ( s_lang & L_FORTRAN ) { if ( s_lang & L_F77 ) { os << "\n integer*4 pomp2_lib_get_max_threads"; os << "\n logical pomp2_test_lock"; os << "\n integer*4 pomp2_test_nest_lock\n"; } else if ( s_lang & L_F90 ) { os << "\n integer ( kind=4 ) :: pomp2_lib_get_max_threads"; os << "\n logical :: pomp2_test_lock"; os << "\n integer ( kind=4 ) :: pomp2_test_nest_lock\n"; } if ( !s_common_block.empty() ) { if ( s_omp_opt.copytpd ) { if ( s_lang & L_F77 ) { os << " integer*8 pomp_tpd \n"; } else { os << " integer( kind=8 ) pomp_tpd \n"; } os << " common /pomp_tpd/ pomp_tpd \n"; os << "!$omp threadprivate(/pomp_tpd/)\n"; } if ( s_lang & L_F77 ) { os << " integer*8 pomp2_old_task, pomp2_new_task \n"; os << " logical pomp2_if \n"; os << " integer*4 pomp2_num_threads \n"; } else { os << " integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task \n"; os << " logical :: pomp2_if \n"; os << " integer ( kind=4 ) :: pomp2_num_threads \n"; } } } } /** Writes Directive for ending a loop */ OPARI2_Directive* OPARI2_DirectiveOpenmp::EndLoopDirective( const int lineno ) { if ( s_lang & L_FORTRAN ) { FindName(); string pragma = ""; for ( string::size_type c = 0; c < m_indent; c++ ) { pragma += " "; } pragma += m_directive_prefix[ 0 ]; if ( m_name == "do" ) { pragma += " end do "; } else if ( m_name == "paralleldo" ) { pragma += " end parallel do "; } vector lines; lines.push_back( pragma ); return new OPARI2_DirectiveOpenmp( m_filename, lineno, lines, m_directive_prefix ); } return NULL; } /** Returns true for enddo and endparalleldo directives */ bool OPARI2_DirectiveOpenmp::EndsLoopDirective( void ) { if ( s_lang & L_FORTRAN ) { if ( m_name.empty() ) { FindName(); } if ( m_name == "enddo" || m_name == "endparalleldo" ) { return true; } } return false; } /* Initialize class static variables */ #ifndef FORTRAN_MANGLED #define FORTRAN_MANGLED( str ) str #endif #define OPARI2_STR_( str ) #str #define OPARI2_STR( str ) OPARI2_STR_( str ) /** * @brief Creates pairs of directive keywords that can be combined * and are split by OPARI2. * * This function is called during initialiazation of static * variables, so the language is not yet set in s_lang. */ static OPARI2_StrVStr_map_t make_directive_clauses( void ) { OPARI2_StrVStr_map_t dc; vector clauses; clauses.push_back( "if" ); clauses.push_back( "num_threads" ); clauses.push_back( "default" ); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "shared" ); clauses.push_back( "copyin" ); clauses.push_back( "reduction" ); clauses.push_back( "proc_bind" ); dc[ "parallel" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "lastprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "schedule" ); clauses.push_back( "collapse" ); clauses.push_back( "ordered" ); clauses.push_back( "nowait" ); dc[ "for" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "astprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "schedule" ); clauses.push_back( "collapse" ); clauses.push_back( "ordered" ); dc[ "do" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "lastprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "nowait" ); dc[ "sections" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "copyprivate" ); clauses.push_back( "nowait" ); dc[ "single" ] = clauses; clauses.clear(); clauses.push_back( "nowait" ); clauses.push_back( "copyprivate" ); dc[ "end single" ] = clauses; dc[ "endsingle" ] = clauses; clauses.clear(); clauses.push_back( "nowait" ); dc[ "end do" ] = clauses; dc[ "enddo" ] = clauses; dc[ "end sections" ] = clauses; dc[ "endsections" ] = clauses; dc[ "end workshare" ] = clauses; dc[ "endworkshare" ] = clauses; /** Commented out are the ones that are new with the OpenMP 4.0 specification */ clauses.clear(); clauses.push_back( "if" ); //clauses.push_back( "final" ); clauses.push_back( "untied" ); clauses.push_back( "default" ); //clauses.push_back( "mergeable" ); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "shared" ); //clauses.push_back( "depend" ); dc[ "task" ] = clauses; dc[ "parallelfor" ] = dc[ "parallel" ]; dc[ "parallelfor" ].insert( dc[ "parallelfor" ].end(), dc[ "for" ].begin(), dc[ "for" ].end() ); dc[ "paralleldo" ] = dc[ "parallel" ]; dc[ "paralleldo" ].insert( dc[ "paralleldo" ].end(), dc[ "do" ].begin(), dc[ "do" ].end() ); dc[ "parallelsections" ] = dc[ "parallel" ]; dc[ "parallelsections" ].insert( dc[ "parallelsections" ].end(), dc[ "sections" ].begin(), dc[ "sections" ].end() ); dc[ "parallelworkshare" ] = dc[ "parallel" ]; dc[ "parallelworkshare" ].insert( dc[ "parallelworkshare" ].end(), dc[ "workshare" ].begin(), dc[ "workshare" ].end() ); /** Doing the work anyway and usintg the OpenMP 4.0 specification, I went ahead and added these clauses too */ // clauses.clear(); // clauses.push_back( "safelen" ); // clauses.push_back( "linear" ); // clauses.push_back( "aligned" ); // clauses.push_back( "private" ); // clauses.push_back( "lastprivate" ); // clauses.push_back( "reduction" ); // clauses.push_back( "collapse" ); // dc[ "simd" ] = clauses; // clauses.clear(); // clauses.push_back( "simdlen" ); // clauses.push_back( "linear" ); // clauses.push_back( "aligned" ); // clauses.push_back( "uniform" ); // clauses.push_back( "inbranch" ); // clauses.push_back( "notinbranch" ); // dc[ "declare simd" ] = clauses; // clauses.clear(); // clauses.push_back( "device" ); // clauses.push_back( "map" ); // clauses.push_back( "if" ); // dc[ "target data" ] = clauses; // clauses.clear(); // clauses.push_back( "device" ); // clauses.push_back( "map" ); // clauses.push_back( "if" ); // dc[ "target" ] = clauses; // clauses.clear(); // clauses.push_back( "to" ); // clauses.push_back( "from" ); // clauses.push_back( "device" ); // clauses.push_back( "if" ); // dc[ "target update" ] = clauses; // clauses.clear(); // clauses.push_back( "num_teams" ); // clauses.push_back( "thread_limit" ); // clauses.push_back( "default" ); // clauses.push_back( "private" ); // clauses.push_back( "firstprivate" ); // clauses.push_back( "shared" ); // clauses.push_back( "reduction" ); // dc[ "teams" ] = clauses; // clauses.clear(); // clauses.push_back( "private" ); // clauses.push_back( "firstprivate" ); // clauses.push_back( "collapse" ); // clauses.push_back( "dist_schedule" ); // dc[ "distribute" ] = clauses; // clauses.clear(); // clauses.push_back( "parallel" ); // clauses.push_back( "sections" ); // clauses.push_back( "for" ); // clauses.push_back( "do" ); // clauses.push_back( "taskgroup" ); // clauses.push_back( "if " ); // dc[ "cancel" ] = clauses; // clauses.clear(); // clauses.push_back( "parallel" ); // clauses.push_back( "sections" ); // clauses.push_back( "for" ); // clauses.push_back( "do" ); // clauses.push_back( "taskgroup" ); // dc[ "cancellation point" ] = clauses; return dc; } OPARI2_StrVStr_map_t OPARI2_DirectiveOpenmp::s_directive_clauses = make_directive_clauses(); /** * @brief Creates pairs of directive keywords that can be combined * and are split by OPARI2. * * This function is called during initialiazation of static * variables, so the language is not yet set in s_lang. */ static OPARI2_StrStr_pairs_t make_outer_inner( void ) { OPARI2_StrStr_pairs_t oi; oi.push_back( make_pair( string( "parallel" ), string( "sections" ) ) ); /* These are Fortran specific */ oi.push_back( make_pair( string( "parallel" ), string( "do" ) ) ); oi.push_back( make_pair( string( "parallel" ), string( "workshare" ) ) ); /* This one is C/C++ specific */ oi.push_back( make_pair( string( "parallel" ), string( "for" ) ) ); return oi; } OPARI2_StrStr_pairs_t OPARI2_DirectiveOpenmp:: s_outer_inner = make_outer_inner(); /** * @brief Specifies the clauses that belong to the "inner" directive * of a combined directive. */ static OPARI2_StrBool_pairs_t make_inner_clauses( void ) { OPARI2_StrBool_pairs_t ic; ic.push_back( make_pair( string( "ordered" ), false ) ); /* Comment out due to ticket #939 in Score-P (silc) The same treatment does not work for lastprivate, although this does not currently work. (Philippen) TODO: fix */ // ic.push_back( make_pair( string( "firstprivate" ), true ) ); ic.push_back( make_pair( string( "lastprivate" ), true ) ); ic.push_back( make_pair( string( "schedule" ), true ) ); ic.push_back( make_pair( string( "collapse" ), true ) ); return ic; } OPARI2_StrBool_pairs_t OPARI2_DirectiveOpenmp::s_inner_clauses = make_inner_clauses(); #define POMP_TPD_MANGLED FORTRAN_MANGLED( pomp_tpd ) opari2_omp_option OPARI2_DirectiveOpenmp::s_omp_opt = { true, false, false, false, false, false, false, false, false, OPARI2_STR( POMP_TPD_MANGLED ) }; stringstream OPARI2_DirectiveOpenmp:: s_init_handle_calls; int OPARI2_DirectiveOpenmp:: s_num_regions = 0; const string OPARI2_DirectiveOpenmp:: s_paradigm_prefix = "POMP2"; opari2-2.0.6/src/opari/openmp/PaxHeaders.6153/opari2_directive_openmp.h0000644000000000000000000000013214015716474022557 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.303910186 30 ctime=1614257498.348005824 opari2-2.0.6/src/opari/openmp/opari2_directive_openmp.h0000644000175100001440000001250414015716474023754 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_openmp.h * * @brief Class definitions for Openmp directives in C/C++ and Fortran. */ #ifndef OPARI2_DIRECTIVE_OPENMP_H #define OPARI2_DIRECTIVE_OPENMP_H #include using std::string; #include using std::vector; #include using std::ostream; #include "opari2.h" #include "opari2_directive.h" /** @brief Anonymous namespace including structure definition for OpenMP specific cmd line options. */ /** @brief Structure for OpenMP specific cmd line options. */ typedef struct { bool add_shared_decl; bool copytpd; bool task_abort; bool task_warn; bool task_remove; bool untied_abort; bool untied_keep; bool untied_nowarn; bool tpd_in_extern_block; string pomp_tpd; } opari2_omp_option; /** @brief Base Class to store and manipulate OpenMP directive related data. */ class OPARI2_DirectiveOpenmp : public OPARI2_Directive { public: /**@brief Constructor. */ OPARI2_DirectiveOpenmp( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_OMP; m_nowait_added = false; m_has_untied = false; m_has_ordered = false; m_num_sections = 0; if ( lines.empty() ) { m_indent = 0; } else { m_indent = lines[ 0 ].find_first_not_of( " \t" ); m_indent = m_indent == string::npos ? 0 : m_indent; } } /** @brief Destructor. */ virtual ~ OPARI2_DirectiveOpenmp( void ) { } /** Increment region counter */ virtual void IncrementRegionCounter( void ); /** * @brief Parse OpenMP-specific command-line option and store it * in 's_omp_opt'. */ static OPARI2_ErrorCode ProcessOption( string option ); /** @brief Set value for 'opt.omp_pomp_tpd'. */ static void SetOptPomptpd( string str ); /** return 's_openmp_opt' */ static opari2_omp_option* GetOpenmpOpt( void ); /** Parse string and return OpenMP group id */ static uint32_t String2Group( const string name ); virtual void FindName( void ); /** is the default data sharing changed, * i.e. is default(none) or default(private) present? */ bool ChangedDefault( void ); /** returns value in brackets, if present, "" otherwise*/ void FindUserName( void ); string& GetUserName( void ); void SetNumSections( int n ); int GetNumSections( void ); string& GetReduction( void ); /** split compined constructs in two seperate statement */ virtual OPARI2_DirectiveOpenmp* SplitCombined( void ); /** add OpenMP descriptors at the right place */ virtual void AddDescr( int n ); virtual void GenerateDescr( ostream& os ); static void FinalizeDescrs( ostream& os ); /** Generate header of the include file */ static void GenerateHeader( ostream& os ); /** generate call POMP2_Init_reg_XXX function to initialize * all handles, in the Fortran case */ static void GenerateInitHandleCalls( ostream& os, const string incfile = "" ); /** add a nowait to a directive*/ virtual void AddNowait( void ); bool IsNowaitAdded( void ); /** Returns a directive for ending the loop region */ virtual OPARI2_Directive* EndLoopDirective( const int lineno ); /** Returns true for enddo and endparalleldo directives */ virtual bool EndsLoopDirective( void ); private: /** * @brief Identifies clauses and their arguments */ virtual void identify_clauses( void ); private: string m_arg_num_threads; /**< argument of the 'num_threads' clause */ string m_arg_if; /**< argument of the 'if' clause */ string m_arg_reduction; /**< argument of the 'reduction' clause */ string m_arg_schedule; /**< argument of the 'schedule' clause */ string m_arg_collapse; /**< argument of the 'collapse' clause */ string m_user_name; /**< name of named critical sections */ bool m_has_untied; /**< true if has 'untied' clause */ bool m_has_ordered; /**< true if hase 'ordered' clause */ int m_num_sections; /**< number of sections */ string::size_type m_indent; bool m_nowait_added; virtual string generate_ctc_string( OPARI2_Format_t form ); /** Static members */ static opari2_omp_option s_omp_opt; /**< OMP-specific cmd-line options */ static stringstream s_init_handle_calls; static int s_num_regions; static const string s_paradigm_prefix; static OPARI2_StrVStr_map_t s_directive_clauses; static OPARI2_StrStr_pairs_t s_outer_inner; static OPARI2_StrBool_pairs_t s_inner_clauses; }; #endif opari2-2.0.6/src/opari/openmp/PaxHeaders.6153/opari2_directive_entry_openmp.h0000644000000000000000000000013214015716474024000 xustar0030 mtime=1614257468.247910008 30 atime=1614257468.303910186 30 ctime=1614257498.344005811 opari2-2.0.6/src/opari/openmp/opari2_directive_entry_openmp.h0000644000175100001440000001227514015716474025202 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_openmp.h * * @brief Define Openmp directive and runtime API entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_OPENMP_H #define OPARI2_DIRECTIVE_ENTRY_OPENMP_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of Openmp directive/runtime API group. * More directive group definition can be added before G_OMP_ALL. */ enum OPARI2_OmpGroup { /** invalid group */ G_OMP_NONE = 0x00000000, G_OMP_ATOMIC = 0x00000001, G_OMP_CRITICAL = 0x00000002, G_OMP_MASTER = 0x00000004, G_OMP_SINGLE = 0x00000008, G_OMP_LOCKS = 0x00000010, G_OMP_FLUSH = 0x00000020, G_OMP_TASK = 0x00000040, G_OMP_ORDERED = 0x00000080, G_OMP_SYNC = 0x000000FF, G_OMP_DEFAULT = 0x00001000, G_OMP_OMP = 0x0000FFFF, G_OMP_REGION = 0x00010000, G_OMP_ALL = 0xFFFFFFFF }; #define OPARI2_OPENMP_SENTINELS \ { "!$omp", OPARI2_PT_OMP }, \ { "c$omp", OPARI2_PT_OMP }, \ { "*$omp", OPARI2_PT_OMP }, \ { "omp", OPARI2_PT_OMP }, \ { "openmp", OPARI2_PT_OMP } #define OPARI2_CREATE_OPENMP_TABLE_ENTRY( name, loop, disable_with_paradigm, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_OMP, name, loop, disable_with_paradigm, version, group, omp ) #define OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( name, loop, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_NOEND( OPARI2_PT_OMP, name, loop, version, group, omp ) #define OPARI2_CREATE_OPENMP_TABLE_ENTRY_SINGLE_STATEMENT( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_SINGLE_STATEMENT( OPARI2_PT_OMP, name, false, true, version, group, omp ) /* *INDENT-OFF* */ #define OPARI2_OPENMP_DIRECTIVE_ENTRIES \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallel, false, false, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( for, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( do, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( sections, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( section, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( single, false, true, 3.0, G_OMP_SINGLE ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( master, false, true, 3.0, G_OMP_MASTER ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( critical, false, true, 3.0, G_OMP_CRITICAL ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelfor, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( paralleldo, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelsections, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( workshare, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelworkshare, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( ordered, false, true, 3.0, G_OMP_ORDERED ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( task, false, true, 3.0, G_OMP_TASK ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_SINGLE_STATEMENT( atomic, 3.0, G_OMP_ATOMIC ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( barrier, false, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( flush, false, 3.0, G_OMP_FLUSH ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( taskwait, false, 3.0, G_OMP_TASK ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( threadprivate, false, 3.0, G_OMP_DEFAULT ) /* *INDENT-ON* */ #define OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( name, version, group, wrapper ) \ { OPARI2_PT_OMP, #name, #version, group, true, #wrapper, "omp.h", "omp_lib.h" } #define OPARI2_OPENMP_API_ENTRIES \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_init_lock, 3.0, G_OMP_LOCKS, POMP2_Init_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_destroy_lock, 3.0, G_OMP_LOCKS, POMP2_Destroy_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_set_lock, 3.0, G_OMP_LOCKS, POMP2_Set_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_unset_lock, 3.0, G_OMP_LOCKS, POMP2_Unset_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_test_lock, 3.0, G_OMP_LOCKS, POMP2_Test_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_init_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Init_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_destroy_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Destroy_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_set_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Set_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_unset_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Unset_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_test_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Test_nest_lock ) #endif opari2-2.0.6/src/opari/PaxHeaders.6153/offload0000644000000000000000000000013214015716532015630 xustar0030 mtime=1614257498.368005887 30 atime=1614257501.252015069 30 ctime=1614257498.368005887 opari2-2.0.6/src/opari/offload/0000755000175100001440000000000014015716532017100 5ustar00builderusers00000000000000opari2-2.0.6/src/opari/offload/PaxHeaders.6153/opari2_offload_handler.h0000644000000000000000000000013214015716474022446 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.368005887 opari2-2.0.6/src/opari/offload/opari2_offload_handler.h0000644000175100001440000000164114015716474023643 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_offload_handler.h * * @brief */ #ifndef OPARI2_OFFLOAD_HANDLER_H #define OPARI2_OFFLOAD_HANDLER_H #include using std::ostream; #include "opari2.h" #include "opari2_directive.h" void h_offload_target( OPARI2_Directive* d, ostream& os ); void h_end_offload_target( OPARI2_Directive* d, ostream& os ); void h_offload_declspec( OPARI2_Directive* d, ostream& os ); void h_end_offload_declspec( OPARI2_Directive* d, ostream& os ); #endif opari2-2.0.6/src/opari/offload/PaxHeaders.6153/opari2_offload_handler.cc0000644000000000000000000000013214015716474022604 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.364005875 opari2-2.0.6/src/opari/offload/opari2_offload_handler.cc0000644000175100001440000000242614015716474024003 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_offload_handler.cc * * @brief Handler functions for Intel OFFLOAD directives. */ #include #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_manager.h" void h_offload_target( OPARI2_Directive* d, ostream& os ) { DirectiveStackPush( d ); d->PrintPlainDirective( os ); DisableInstrumentation( D_FULL ); } void h_end_offload_target( OPARI2_Directive* d, ostream& os ) { DirectiveStackPop(); EnableInstrumentation( D_FULL ); } void h_offload_declspec( OPARI2_Directive* d, ostream& os ) { DisableInstrumentation( D_FULL ); // Only go to the directive stack, not the vector DirectiveStackPush( d ); } void h_end_offload_declspec( OPARI2_Directive* d, ostream& os ) { EnableInstrumentation( D_FULL ); // maintain stack DirectiveStackPop(); } opari2-2.0.6/src/opari/offload/PaxHeaders.6153/opari2_directive_offload.cc0000644000000000000000000000013214015716474023145 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.364005875 opari2-2.0.6/src/opari/offload/opari2_directive_offload.cc0000644000175100001440000000272414015716474024345 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_offload.cc * * @brief Methods of base class for OFFLOAD directives. */ #include #include using std::string; #include using std::ostream; #include #include "common.h" #include "opari2_directive_offload.h" #include "opari2_directive_entry_offload.h" uint32_t OPARI2_DirectiveOffload::String2Group( const string name ) { return 0; } void OPARI2_DirectiveOffload::IncrementRegionCounter( void ) { ++s_num_regions; } void OPARI2_DirectiveOffload::GenerateDescr( ostream& os ) { if ( s_lang & L_C_OR_CXX ) { OPARI2_Directive::generate_descr_common( os ); s_init_handle_calls << " " << s_paradigm_prefix << "_assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } } void OPARI2_DirectiveOffload::SetName( string name_str ) { m_name = name_str; } int OPARI2_DirectiveOffload:: s_num_regions = 0; stringstream OPARI2_DirectiveOffload::s_init_handle_calls; string OPARI2_DirectiveOffload:: s_paradigm_prefix = "POFLD"; opari2-2.0.6/src/opari/offload/PaxHeaders.6153/opari2_directive_offload.h0000644000000000000000000000013214015716474023007 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.360005861 opari2-2.0.6/src/opari/offload/opari2_directive_offload.h0000644000175100001440000000357014015716474024207 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_offload.h * * @brief Base class for Intel OFFLOAD directives */ #ifndef OPARI2_DIRECTIVE_OFFLOAD_H #define OPARI2_DIRECTIVE_OFFLOAD_H #include using std::string; #include using std::ostream; #include using std::vector; #include "opari2.h" #include "opari2_directive.h" /** @brief Base Class to store and manipulate Intel offload directive and related data. */ class OPARI2_DirectiveOffload : public OPARI2_Directive { public: OPARI2_DirectiveOffload( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_OFFLOAD; if ( directive_prefix.size() ) { string sentinel = directive_prefix[ directive_prefix.size() - 1 ]; if ( sentinel == "__declspec" ) { SetName( "declspec" ); } } } virtual ~ OPARI2_DirectiveOffload( void ) { } /** Increment region counter */ void IncrementRegionCounter( void ); void SetName( string name_str ); /** Parse string and return offload group id */ static uint32_t String2Group( const string name ); virtual void GenerateDescr( ostream& os ); private: static string s_paradigm_prefix; static stringstream s_init_handle_calls; static int s_num_regions; }; #endif opari2-2.0.6/src/opari/offload/PaxHeaders.6153/opari2_directive_entry_offload.h0000644000000000000000000000013214015716474024230 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.360005861 opari2-2.0.6/src/opari/offload/opari2_directive_entry_offload.h0000644000175100001440000000277714015716474025440 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_offload.h * * @brief Define Intel Offload directive entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_OFFLOAD_H #define OPARI2_DIRECTIVE_ENTRY_OFFLOAD_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of Intel Offload directive/runtime API group. * More directive group definition can be added before G_OFF_ALL. */ enum OPARI2_OffloadGroup { G_OFFLOAD_NONE = 0x00000000, G_OFFLOAD_DEFAULT = 0x00001000, G_OFFLOAD_ALL = 0xFFFFFFFF }; #define OPARI2_OFFLOAD_SENTINELS \ { "!dir$", OPARI2_PT_OFFLOAD }, \ { "cdir$", OPARI2_PT_OFFLOAD }, \ { "*dir$", OPARI2_PT_OFFLOAD }, \ { "offload", OPARI2_PT_OFFLOAD }, \ { "__declspec", OPARI2_PT_OFFLOAD } #define OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_OFFLOAD, name, false, true, version, group, offload ) /* *INDENT-OFF* */ #define OPARI2_OFFLOAD_DIRECTIVE_ENTRIES \ OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( target, 1.0, G_OFFLOAD_DEFAULT ),\ OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( declspec, 1.0, G_OFFLOAD_DEFAULT ) /* *INDENT-ON* */ #endif opari2-2.0.6/src/PaxHeaders.6153/config-frontend.h.in0000644000000000000000000000013114015716515017021 xustar0030 mtime=1614257485.331964386 29 atime=1614257497.21600222 30 ctime=1614257498.140005162 opari2-2.0.6/src/config-frontend.h.in0000644000175100001440000001006714015716515020221 0ustar00builderusers00000000000000/* ../src/config-frontend.h.in. Generated from configure.ac by autoheader. */ /* Name of the sub-build. */ #undef AFS_PACKAGE_BUILD /* Symbol name of the sub-build in upper case. */ #undef AFS_PACKAGE_BUILD_NAME /* Symbol name of the sub-build in lower case. */ #undef AFS_PACKAGE_BUILD_name /* The package name usable as a symbol in upper case. */ #undef AFS_PACKAGE_NAME /* Relative path to the top-level source directory. */ #undef AFS_PACKAGE_SRCDIR /* The package name usable as a symbol in lower case. */ #undef AFS_PACKAGE_name /* Makes C variable alignment consistent with Fortran */ #undef FORTRAN_ALIGNED /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Set if we are building for the AIX platform */ #undef HAVE_PLATFORM_AIX /* Set if we are building for the ALTIX platform */ #undef HAVE_PLATFORM_ALTIX /* Set if we are building for the BG/L platform */ #undef HAVE_PLATFORM_BGL /* Set if we are building for the BG/P platform */ #undef HAVE_PLATFORM_BGP /* Set if we are building for the BG/Q platform */ #undef HAVE_PLATFORM_BGQ /* Set if we are building for the Cray platform */ #undef HAVE_PLATFORM_CRAY /* Set if we are building for an unknown Cray */ #undef HAVE_PLATFORM_CRAYUNKNOWN /* Set if we are building for the Cray XC platform */ #undef HAVE_PLATFORM_CRAYXC /* Set if we are building for the Cray XE platform */ #undef HAVE_PLATFORM_CRAYXE /* Set if we are building for the Cray XK platform */ #undef HAVE_PLATFORM_CRAYXK /* Set if we are building for the Cray XT platform */ #undef HAVE_PLATFORM_CRAYXT /* Set if we are building for the FX10 platform */ #undef HAVE_PLATFORM_FX10 /* Set if we are building for the FX100 platform */ #undef HAVE_PLATFORM_FX100 /* Set if we are building for the K platform */ #undef HAVE_PLATFORM_K /* Set if we are building for the Linux platform */ #undef HAVE_PLATFORM_LINUX /* Set if we are building for the macOS platform */ #undef HAVE_PLATFORM_MAC /* Set if we are building for the Intel MIC platform */ #undef HAVE_PLATFORM_MIC /* Set if we are building for the MinGW platform */ #undef HAVE_PLATFORM_MINGW /* Set if we are building for the NEC SX platform */ #undef HAVE_PLATFORM_NECSX /* Set if we are building for the Solaris platform */ #undef HAVE_PLATFORM_SOLARIS /* Can link a readlink function */ #undef HAVE_READLINK /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Revision of OPARI2 */ #undef SCOREP_COMPONENT_REVISION /* Defined if we are working from git. */ #undef SCOREP_IN_DEVELOPEMENT /* Defined if we are working from a make dist generated tarball. */ #undef SCOREP_IN_PRODUCTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION opari2-2.0.6/src/PaxHeaders.6153/config-custom.h0000644000000000000000000000013214015716474016114 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.092005008 opari2-2.0.6/src/config-custom.h0000644000175100001440000000152714015716474017314 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #ifndef CONFIG_CUSTOM_H #define CONFIG_CUSTOM_H /** * @file config-custom.h * * @brief This file gets included by config.h (resp. config-frontend.h and * config-backend.h) and contains supplementary macros to be used with the * macros in config.h. * */ #endif /* CONFIG_CUSTOM_H */ opari2-2.0.6/src/PaxHeaders.6153/config.h0000644000000000000000000000013214015716474014604 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.092005008 opari2-2.0.6/src/config.h0000644000175100001440000000236214015716474016002 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #ifndef CONFIG_H #define CONFIG_H /** * @file config.h * * @brief Provide a single config.h that hides the frontend/backend * issues from the developer * */ #if defined CROSS_BUILD #if defined FRONTEND_BUILD #include #elif defined BACKEND_BUILD #include #else #error "You cannot use config.h without defining either FRONTEND_BUILD or BACKEND_BUILD." #endif #elif defined NOCROSS_BUILD #include #else #error "You cannot use config.h without defining either CROSS_BUILD or NOCROSS_BUILD." #endif #include #include #endif /* CONFIG_H */ opari2-2.0.6/src/PaxHeaders.6153/opari-lib-dummy0000644000000000000000000000013214015716532016113 xustar0030 mtime=1614257498.320005735 30 atime=1614257501.252015069 30 ctime=1614257498.320005735 opari2-2.0.6/src/opari-lib-dummy/0000755000175100001440000000000014015716532017363 5ustar00builderusers00000000000000opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/getfname.f0000644000000000000000000000013214015716474020132 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.320005735 opari2-2.0.6/src/opari-lib-dummy/getfname.f0000644000175100001440000000221314015716474021323 0ustar00builderusers00000000000000!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. !> @internal !> !> @file getname.f !> !> @brief This file is needed to check the Fortran name mangling of !> the used compiler. foo_foo is called and depending on ! the mangling, this is linked against a c function ! foo_foo_, _foo_foo, ... #include #include static char* header = "/*\n" " * Fortan subroutine external name setup\n" " */\n" "\n" "#define POMP2_Finalize_U POMP2_FINALIZE\n" "#define POMP2_Init_U POMP2_INIT\n" "#define POMP2_Off_U POMP2_OFF\n" "#define POMP2_On_U POMP2_ON\n" "#define POMP2_Atomic_enter_U POMP2_ATOMIC_ENTER\n" "#define POMP2_Atomic_exit_U POMP2_ATOMIC_EXIT\n" "#define POMP2_Implicit_barrier_enter_U POMP2_IMPLICIT_BARRIER_ENTER\n" "#define POMP2_Implicit_barrier_exit_U POMP2_IMPLICIT_BARRIER_EXIT\n" "#define POMP2_Barrier_enter_U POMP2_BARRIER_ENTER\n" "#define POMP2_Barrier_exit_U POMP2_BARRIER_EXIT\n" "#define POMP2_Flush_enter_U POMP2_FLUSH_ENTER\n" "#define POMP2_Flush_exit_U POMP2_FLUSH_EXIT\n" "#define POMP2_Critical_begin_U POMP2_CRITICAL_BEGIN\n" "#define POMP2_Critical_end_U POMP2_CRITICAL_END\n" "#define POMP2_Critical_enter_U POMP2_CRITICAL_ENTER\n" "#define POMP2_Critical_exit_U POMP2_CRITICAL_EXIT\n" "#define POMP2_Do_enter_U POMP2_DO_ENTER\n" "#define POMP2_Do_exit_U POMP2_DO_EXIT\n" "#define POMP2_Master_begin_U POMP2_MASTER_BEGIN\n" "#define POMP2_Master_end_U POMP2_MASTER_END\n" "#define POMP2_Parallel_begin_U POMP2_PARALLEL_BEGIN\n" "#define POMP2_Parallel_end_U POMP2_PARALLEL_END\n" "#define POMP2_Parallel_enter_U POMP2_PARALLEL_ENTER\n" "#define POMP2_Parallel_exit_U POMP2_PARALLEL_EXIT\n" "#define POMP2_Parallel_fork_U POMP2_PARALLEL_FORK\n" "#define POMP2_Parallel_join_U POMP2_PARALLEL_JOIN\n" "#define POMP2_Section_begin_U POMP2_SECTION_BEGIN\n" "#define POMP2_Section_end_U POMP2_SECTION_END\n" "#define POMP2_Section_enter_U POMP2_SECTION_ENTER\n" "#define POMP2_Section_exit_U POMP2_SECTION_EXIT\n" "#define POMP2_Sections_enter_U POMP2_SECTIONS_ENTER\n" "#define POMP2_Sections_exit_U POMP2_SECTIONS_EXIT\n" "#define POMP2_Single_begin_U POMP2_SINGLE_BEGIN\n" "#define POMP2_Single_end_U POMP2_SINGLE_END\n" "#define POMP2_Single_enter_U POMP2_SINGLE_ENTER\n" "#define POMP2_Single_exit_U POMP2_SINGLE_EXIT\n" "#define POMP2_Ordered_begin_U POMP2_ORDERED_BEGIN\n" "#define POMP2_Ordered_end_U POMP2_ORDERED_END\n" "#define POMP2_Ordered_enter_U POMP2_ORDERED_ENTER\n" "#define POMP2_Ordered_exit_U POMP2_ORDERED_EXIT\n" "#define POMP2_Task_begin_U POMP2_TASK_BEGIN\n" "#define POMP2_Task_end_U POMP2_TASK_END\n" "#define POMP2_Task_create_begin_U POMP2_TASK_CREATE_BEGIN\n" "#define POMP2_Task_create_end_U POMP2_TASK_CREATE_END\n" "#define POMP2_Untied_task_begin_U POMP2_UNTIED_TASK_BEGIN\n" "#define POMP2_Untied_task_end_U POMP2_UNTIED_TASK_END\n" "#define POMP2_Untied_task_create_begin_U POMP2_UNTIED_TASK_CREATE_BEGIN\n" "#define POMP2_Untied_task_create_end_U POMP2_UNTIED_TASK_CREATE_END\n" "#define POMP2_Taskwait_begin_U POMP2_TASKWAIT_BEGIN\n" "#define POMP2_Taskwait_end_U POMP2_TASKWAIT_END\n" "#define POMP2_Workshare_enter_U POMP2_WORKSHARE_ENTER\n" "#define POMP2_Workshare_exit_U POMP2_WORKSHARE_EXIT\n" "#define POMP2_Begin_U POMP2_BEGIN\n" "#define POMP2_End_U POMP2_END\n" "#define POMP2_Lib_get_max_threads_U POMP2_LIB_GET_MAX_THREADS\n" "#define POMP2_Init_lock_U POMP2_INIT_LOCK\n" "#define POMP2_Destroy_lock_U POMP2_DESTROY_LOCK\n" "#define POMP2_Set_lock_U POMP2_SET_LOCK\n" "#define POMP2_Unset_lock_U POMP2_UNSET_LOCK\n" "#define POMP2_Test_lock_U POMP2_TEST_LOCK\n" "#define POMP2_Init_nest_lock_U POMP2_INIT_NEST_LOCK\n" "#define POMP2_Destroy_nest_lock_U POMP2_DESTROY_NEST_LOCK\n" "#define POMP2_Set_nest_lock_U POMP2_SET_NEST_LOCK\n" "#define POMP2_Unset_nest_lock_U POMP2_UNSET_NEST_LOCK\n" "#define POMP2_Test_nest_lock_U POMP2_TEST_NEST_LOCK\n" "#define POMP2_Assign_handle_U POMP2_ASSIGN_HANDLE\n" "#define POMP2_USER_Assign_handle_U POMP2_USER_ASSIGN_HANDLE\n" "#define omp_init_lock_U OMP_INIT_LOCK\n" "#define omp_destroy_lock_U OMP_DESTROY_LOCK\n" "#define omp_set_lock_U OMP_SET_LOCK\n" "#define omp_unset_lock_U OMP_UNSET_LOCK\n" "#define omp_test_lock_U OMP_TEST_LOCK\n" "#define omp_init_nest_lock_U OMP_INIT_NEST_LOCK\n" "#define omp_destroy_nest_lock_U OMP_DESTROY_NEST_LOCK\n" "#define omp_set_nest_lock_U OMP_SET_NEST_LOCK\n" "#define omp_unset_nest_lock_U OMP_UNSET_NEST_LOCK\n" "#define omp_test_nest_lock_U OMP_TEST_NEST_LOCK\n" "\n" "#define POMP2_Finalize_L pomp2_finalize\n" "#define POMP2_Init_L pomp2_init\n" "#define POMP2_Off_L pomp2_off\n" "#define POMP2_On_L pomp2_on\n" "#define POMP2_Atomic_enter_L pomp2_atomic_enter\n" "#define POMP2_Atomic_exit_L pomp2_atomic_exit\n" "#define POMP2_Implicit_barrier_enter_L pomp2_implicit_barrier_enter\n" "#define POMP2_Implicit_barrier_exit_L pomp2_implicit_barrier_exit\n" "#define POMP2_Barrier_enter_L pomp2_barrier_enter\n" "#define POMP2_Barrier_exit_L pomp2_barrier_exit\n" "#define POMP2_Flush_enter_L pomp2_flush_enter\n" "#define POMP2_Flush_exit_L pomp2_flush_exit\n" "#define POMP2_Critical_begin_L pomp2_critical_begin\n" "#define POMP2_Critical_end_L pomp2_critical_end\n" "#define POMP2_Critical_enter_L pomp2_critical_enter\n" "#define POMP2_Critical_exit_L pomp2_critical_exit\n" "#define POMP2_Do_enter_L pomp2_do_enter\n" "#define POMP2_Do_exit_L pomp2_do_exit\n" "#define POMP2_Master_begin_L pomp2_master_begin\n" "#define POMP2_Master_end_L pomp2_master_end\n" "#define POMP2_Parallel_begin_L pomp2_parallel_begin\n" "#define POMP2_Parallel_end_L pomp2_parallel_end\n" "#define POMP2_Parallel_enter_L pomp2_parallel_enter\n" "#define POMP2_Parallel_exit_L pomp2_parallel_exit\n" "#define POMP2_Parallel_fork_L pomp2_parallel_fork\n" "#define POMP2_Parallel_join_L pomp2_parallel_join\n" "#define POMP2_Section_begin_L pomp2_section_begin\n" "#define POMP2_Section_end_L pomp2_section_end\n" "#define POMP2_Section_enter_L pomp2_section_enter\n" "#define POMP2_Section_exit_L pomp2_section_exit\n" "#define POMP2_Sections_enter_L pomp2_sections_enter\n" "#define POMP2_Sections_exit_L pomp2_sections_exit\n" "#define POMP2_Single_begin_L pomp2_single_begin\n" "#define POMP2_Single_end_L pomp2_single_end\n" "#define POMP2_Single_enter_L pomp2_single_enter\n" "#define POMP2_Single_exit_L pomp2_single_exit\n" "#define POMP2_Ordered_begin_L pomp2_ordered_begin\n" "#define POMP2_Ordered_end_L pomp2_ordered_end\n" "#define POMP2_Ordered_enter_L pomp2_ordered_enter\n" "#define POMP2_Ordered_exit_L pomp2_ordered_exit\n" "#define POMP2_Task_begin_L pomp2_task_begin\n" "#define POMP2_Task_end_L pomp2_task_end\n" "#define POMP2_Task_create_begin_L pomp2_task_create_begin\n" "#define POMP2_Task_create_end_L pomp2_task_create_end\n" "#define POMP2_Untied_task_begin_L pomp2_untied_task_begin\n" "#define POMP2_Untied_task_end_L pomp2_untied_task_end\n" "#define POMP2_Untied_task_create_begin_L pomp2_untied_task_create_begin\n" "#define POMP2_Untied_task_create_end_L pomp2_untied_task_create_end\n" "#define POMP2_Taskwait_begin_L pomp2_taskwait_begin\n" "#define POMP2_Taskwait_end_L pomp2_taskwait_end\n" "#define POMP2_Workshare_enter_L pomp2_workshare_enter\n" "#define POMP2_Workshare_exit_L pomp2_workshare_exit\n" "#define POMP2_Begin_L pomp2_begin\n" "#define POMP2_End_L pomp2_end\n" "#define POMP2_Lib_get_max_threads_L pomp2_lib_get_max_threads\n" "#define POMP2_Init_lock_L pomp2_init_lock\n" "#define POMP2_Destroy_lock_L pomp2_destroy_lock\n" "#define POMP2_Set_lock_L pomp2_set_lock\n" "#define POMP2_Unset_lock_L pomp2_unset_lock\n" "#define POMP2_Test_lock_L pomp2_test_lock\n" "#define POMP2_Init_nest_lock_L pomp2_init_nest_lock\n" "#define POMP2_Destroy_nest_lock_L pomp2_destroy_nest_lock\n" "#define POMP2_Set_nest_lock_L pomp2_set_nest_lock\n" "#define POMP2_Unset_nest_lock_L pomp2_unset_nest_lock\n" "#define POMP2_Test_nest_lock_L pomp2_test_nest_lock\n" "#define POMP2_Assign_handle_L pomp2_assign_handle\n" "#define POMP2_USER_Assign_handle_L pomp2_user_assign_handle\n" "#define omp_init_lock_L omp_init_lock\n" "#define omp_destroy_lock_L omp_destroy_lock\n" "#define omp_set_lock_L omp_set_lock\n" "#define omp_unset_lock_L omp_unset_lock\n" "#define omp_test_lock_L omp_test_lock\n" "#define omp_init_nest_lock_L omp_init_nest_lock\n" "#define omp_destroy_nest_lock_L omp_destroy_nest_lock\n" "#define omp_set_nest_lock_L omp_set_nest_lock\n" "#define omp_unset_nest_lock_L omp_unset_nest_lock\n" "#define omp_test_nest_lock_L omp_test_nest_lock\n" "\n" "#define XSUFFIX(name) name##_\n" "#define XSUFFIX2(name) name##__\n" "#define XPREFIX(name) _##name\n" "#define XPREFIX2(name) __##name\n" "\n" "#define SUFFIX(name) XSUFFIX(name)\n" "#define SUFFIX2(name) XSUFFIX2(name)\n" "#define PREFIX(name) XPREFIX(name)\n" "#define PREFIX2(name) XPREFIX2(name)\n" "\n" "#define UPCASE(name) name##_U\n" "#define LOWCASE(name) name##_L\n" "\n"; static void generate( char* str ) { FILE* f = fopen( "pomp2_fwrapper_def.h", "w" ); if ( f == NULL ) { perror( "pomp2_fwrapper_def.h" ); exit( 1 ); } fputs( header, f ); fputs( str, f ); fputs( "\n", f ); fclose( f ); } void foo_foo() { generate( "#define FSUB(name) LOWCASE(name)" ); } void foo_foo_() { generate( "#define FSUB(name) SUFFIX(LOWCASE(name))" ); } void foo_foo__() { generate( "#define FSUB(name) SUFFIX2(LOWCASE(name))" ); } void _foo_foo() { generate( "#define FSUB(name) PREFIX(LOWCASE(name))" ); } void __foo_foo() { generate( "#define FSUB(name) PREFIX2(LOWCASE(name))" ); } void _foo_foo_() { generate( "#define FSUB(name) PREFIX(SUFFIX(LOWCASE(name)))" ); } void FOO_FOO() { generate( "#define FSUB(name) UPCASE(name)" ); } void FOO_FOO_() { generate( "#define FSUB(name) SUFFIX(UPCASE(name))" ); } void FOO_FOO__() { generate( "#define FSUB(name) SUFFIX2(UPCASE(name))" ); } void _FOO_FOO() { generate( "#define FSUB(name) PREFIX(UPCASE(name))" ); } void __FOO_FOO() { generate( "#define FSUB(name) PREFIX2(UPCASE(name))" ); } void _FOO_FOO_() { generate( "#define FSUB(name) PREFIX(SUFFIX(UPCASE(name)))" ); } opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_fwrapper_base.h0000644000000000000000000000013214015716474022303 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.316005721 opari2-2.0.6/src/opari-lib-dummy/pomp2_fwrapper_base.h0000644000175100001440000000274214015716474023503 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. */ #include #include "pomp2_fwrapper_def.h" #ifndef POMP2_FWRAPPER_BASE_H #define POMP2_FWRAPPER_BASE_H extern void FSUB( omp_init_lock )( omp_lock_t* s ); extern void FSUB( omp_destroy_lock )( omp_lock_t* s ); extern void FSUB( omp_set_lock )( omp_lock_t* s ); extern void FSUB( omp_unset_lock )( omp_lock_t* s ); extern int FSUB( omp_test_lock )( omp_lock_t* s ); extern void FSUB( omp_init_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_destroy_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_set_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_unset_nest_lock )( omp_nest_lock_t* s ); extern int FSUB( omp_test_nest_lock )( omp_nest_lock_t* s ); #endif opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_fwrapper_base.c0000644000000000000000000000013214015716474022276 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.316005721 opari2-2.0.6/src/opari-lib-dummy/pomp2_fwrapper_base.c0000644000175100001440000001060714015716474023475 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_fwrapper_base.c * * * @brief Basic fortan wrappers calling the C versions.*/ #include #include #include #include "pomp2_fwrapper_base.h" #include #include #include "pomp2_fwrapper_def.h" extern int pomp2_tracing; /* *INDENT-OFF* */ void FSUB(POMP2_Finalize)() { POMP2_Finalize(); } void FSUB(POMP2_Init)() { POMP2_Init(); } void FSUB(POMP2_Off)() { pomp2_tracing = 0; } void FSUB(POMP2_On)() { pomp2_tracing = 1; } void FSUB(POMP2_Begin)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Begin(regionHandle, ctc_string); } void FSUB(POMP2_End)(POMP2_Region_handle* regionHandle) { POMP2_End(regionHandle); } /* *INDENT-OFF* */ /* *---------------------------------------------------------------- * Fortran Wrapper for OpenMP API ******---------------------------------------------------------------- */ /* *INDENT-OFF* */ #if defined(__ICC) || defined(__ECC) || defined(_SX) #define CALLFSUB(a) a #else #define CALLFSUB(a) FSUB(a) #endif void FSUB(POMP2_Init_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: init lock\n", omp_get_thread_num()); } CALLFSUB(omp_init_lock)(s); } void FSUB(POMP2_Destroy_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: destroy lock\n", omp_get_thread_num()); } CALLFSUB(omp_destroy_lock)(s); } void FSUB(POMP2_Set_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: set lock\n", omp_get_thread_num()); } CALLFSUB(omp_set_lock)(s); } void FSUB(POMP2_Unset_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: unset lock\n", omp_get_thread_num()); } CALLFSUB(omp_unset_lock)(s); } int FSUB(POMP2_Test_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: test lock\n", omp_get_thread_num()); } return CALLFSUB(omp_test_lock)(s); } #ifndef __osf__ void FSUB(POMP2_Init_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: init nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_init_nest_lock)(s); } void FSUB(POMP2_Destroy_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: destroy nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_destroy_nest_lock)(s); } void FSUB(POMP2_Set_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: set nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_set_nest_lock)(s); } void FSUB(POMP2_Unset_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: unset nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_unset_nest_lock)(s); } int FSUB(POMP2_Test_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: test nestlock\n", omp_get_thread_num()); } return CALLFSUB(omp_test_nest_lock)(s); } #endif opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_fwrapper.c0000644000000000000000000000013214015716474021304 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.299910173 30 ctime=1614257498.312005709 opari2-2.0.6/src/opari-lib-dummy/pomp2_fwrapper.c0000644000175100001440000002440414015716474022503 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_fwrapper.c * * @brief This file contains fortran wrapper functions.*/ #include #include #include #include #include #include #include "pomp2_fwrapper_def.h" /* * Fortran wrappers calling the C versions */ /* *INDENT-OFF* */ void FSUB(POMP2_Atomic_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Atomic_enter(regionHandle, ctc_string); } void FSUB(POMP2_Atomic_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Atomic_exit(regionHandle ); } void FSUB(POMP2_Implicit_barrier_enter)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task) { POMP2_Implicit_barrier_enter( regionHandle, pomp2_old_task ); } void FSUB(POMP2_Implicit_barrier_exit)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task) { POMP2_Implicit_barrier_exit( regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Barrier_enter)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task, char* ctc_string) { POMP2_Barrier_enter( regionHandle, pomp2_old_task, ctc_string); } void FSUB(POMP2_Barrier_exit)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Barrier_exit( regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Flush_enter)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Flush_enter(regionHandle, ctc_string ); } void FSUB(POMP2_Flush_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Flush_exit(regionHandle ); } void FSUB(POMP2_Critical_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_begin(regionHandle ); } void FSUB(POMP2_Critical_end)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_end(regionHandle ); } void FSUB(POMP2_Critical_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Critical_enter(regionHandle, ctc_string); } void FSUB(POMP2_Critical_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_exit(regionHandle ); } void FSUB(POMP2_Do_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_For_enter(regionHandle, ctc_string); } void FSUB(POMP2_Do_exit)(POMP2_Region_handle* regionHandle ) { POMP2_For_exit(regionHandle ); } void FSUB(POMP2_Parallel_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* newTask, char* ctc_string ){ POMP2_Parallel_begin(regionHandle); } void FSUB(POMP2_Parallel_end)(POMP2_Region_handle* regionHandle) { POMP2_Parallel_end(regionHandle); } void FSUB(POMP2_Master_begin)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Master_begin(regionHandle, ctc_string ); } void FSUB(POMP2_Master_end)(POMP2_Region_handle* regionHandle ) { POMP2_Master_end(regionHandle ); } void FSUB(POMP2_Parallel_fork)(POMP2_Region_handle* regionHandle, int* if_clause, int* num_threads, POMP2_Task_handle* pomp2_old_task, char* ctc_string) { POMP2_Parallel_fork(regionHandle, *if_clause, *num_threads, pomp2_old_task, "dummy"); } void FSUB(POMP2_Parallel_join)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Parallel_join(regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Section_begin)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Section_begin(regionHandle, ctc_string ); } void FSUB(POMP2_Section_end)(POMP2_Region_handle* regionHandle ) { POMP2_Section_end(regionHandle ); } void FSUB(POMP2_Sections_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Sections_enter(regionHandle, ctc_string); } void FSUB(POMP2_Sections_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Sections_exit(regionHandle ); } void FSUB(POMP2_Single_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Single_begin(regionHandle ); } void FSUB(POMP2_Single_end)(POMP2_Region_handle* regionHandle ) { POMP2_Single_end(regionHandle ); } void FSUB(POMP2_Single_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Single_enter(regionHandle, ctc_string); } void FSUB(POMP2_Ordered_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_exit(regionHandle ); } void FSUB(POMP2_Ordered_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_begin(regionHandle ); } void FSUB(POMP2_Ordered_end)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_end(regionHandle ); } void FSUB(POMP2_Ordered_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Ordered_enter(regionHandle, ctc_string); } void FSUB(POMP2_Single_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Single_exit(regionHandle ); } void FSUB(POMP2_Task_create_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int* pomp2_if, char* ctc_string){ POMP2_Task_create_begin(regionHandle, pomp2_new_task, pomp2_old_task, *pomp2_if, ctc_string); } void FSUB(POMP2_Task_create_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Task_create_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Task_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task ){ POMP2_Task_begin(regionHandle, *pomp2_new_task); } void FSUB(POMP2_Task_end)(POMP2_Region_handle* regionHandle){ POMP2_Task_end(regionHandle); } void FSUB(POMP2_Untied_task_create_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int* pomp2_if, char* ctc_string){ POMP2_Task_create_begin(regionHandle, pomp2_new_task, pomp2_old_task, *pomp2_if, ctc_string); } void FSUB(POMP2_Untied_task_create_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Task_create_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Untied_task_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task ){ POMP2_Task_begin(regionHandle, *pomp2_new_task); } void FSUB(POMP2_Untied_task_end)(POMP2_Region_handle* regionHandle){ POMP2_Task_end(regionHandle); } void FSUB(POMP2_Taskwait_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task, char* ctc_string ){ POMP2_Taskwait_begin(regionHandle, pomp2_old_task, ctc_string ); } void FSUB(POMP2_Taskwait_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Taskwait_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Workshare_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Workshare_enter(regionHandle, ctc_string); } void FSUB(POMP2_Workshare_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Workshare_exit(regionHandle ); } void FSUB(POMP2_Assign_handle)(POMP2_Region_handle* regionHandle, char* ctc_string, int ctc_string_len) { char *str; str=(char*) malloc((ctc_string_len+1)*sizeof(char)); strncpy(str,ctc_string,ctc_string_len); str[ctc_string_len]='\0'; POMP2_Assign_handle(regionHandle,str); free(str); } void FSUB(POMP2_USER_Assign_handle)(POMP2_Region_handle* regionHandle, char* ctc_string, int ctc_string_len) { char *str; str=(char*) malloc((ctc_string_len+1)*sizeof(char)); strncpy(str,ctc_string,ctc_string_len); str[ctc_string_len]='\0'; POMP2_USER_Assign_handle(regionHandle,str); free(str); } /* *---------------------------------------------------------------- * Wrapper for omp_get_max_threads used in instrumentation * * In Fortran a wrapper function * pomp2_get_max_threads() is used, since it is not possible to * ensure, that omp_get_max_threads is not used in the user * program. We would need to parse much more of the Fortran * Syntax to detect these cases. The Wrapper function avoids * double definition of this function and avoids errors. * ******---------------------------------------------------------------- */ int FSUB(POMP2_Lib_get_max_threads)(void) { return omp_get_max_threads(); } opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_user_region_info.h0000644000000000000000000000013214015716474023017 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.312005709 opari2-2.0.6/src/opari-lib-dummy/pomp2_user_region_info.h0000644000175100001440000001065214015716474024216 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_USER_REGION_INFO_H #define POMP2_USER_REGION_INFO_H /** * @file pomp2_user_region_info.h * @date Started Tue Apr 1 2014 * * @brief This file contains function declarations and structs which * handle informations on user defined regions. POMP2_USER_Region_info * is used to store these informations. It can be filled with a * ctcString by ctcString2UserRegionInfo(). * */ #include "opari2_region_info.h" #include /** * POMP2_USER_Region_type * */ typedef enum { POMP2_USER_no_type = 0, POMP2_USER_Region } POMP2_USER_Region_type; /** converts regionType into a string * @param regionType The regionType to be converted. * @return string representation of the region type*/ const char* pomp2UserRegionType2String( POMP2_USER_Region_type regionType ); /** * @brief This struct stores all information on a user defined * region, like the name or corresponding source lines. The function * ctcString2UserRegionInfo() can be used to fill this struct with data * from a ctcString. */ typedef struct { /** @name Generic source code information attributes */ /*@{*/ /** source location info. Needs to be first for the typecasting from generic OPARI2_Region_info to work. */ OPARI2_REGION_INFO /** @name Type of the OpenMP region*/ POMP2_USER_Region_type mRegionType; /*@}*/ /** @name Attributes for user region types */ /*@{*/ /** name of a user defined region*/ char* mUserRegionName; /*@}*/ } POMP2_USER_Region_info; /** CTC Tokens */ #define CTC_USER_REGION_TOKENS \ CTC_USER_Region_name #define CTC_USER_REGION_TOKEN_MAP_ENTRIES \ { "userRegionName", CTC_USER_Region_name } /** * ctcString2UserRegionInfo() fills the POMP2_USER_Region_info object with data read * from the ctcString. If the ctcString does not comply with the * specification, the program aborts with exit code 1. * * @n Rationale: ctcString2UserRegionInfo() is used during * initialization of the measurement system. If an error occurs, it is * better to abort than to struggle with undefined behaviour or @e * guessing the meaning of the broken string. * * @note Can be called from multiple threads concurrently, assuming malloc is * thread-safe. * * @note ctcString2UserRegionInfo() will assign memory to the members of @e * regionInfo. You are supposed to to release this memory by calling * freePOMP2UserRegionInfoMembers(). * * @param ctcString A string in the format * "length*key=value*[key=value]*". The length field is parsed but not * used by this implementation. Possible values for key are listed in * ctcTokenMap. The string must at least contain values for the keys * @c regionType, @c sscl and @c escl. Possible values for the key @c * regionType are listed in regionTypesMap. The format for @c sscl * resp. @c escl values is @c "filename:lineNo1:lineNo2". * * @param regionInfo must be a valid object * * @post At least the required attributes (see POMP2_USER_Region_info) are * set. * @n If @c regionType=userRegion then * POMP2_USER_Region_info::mUserRegionName has a value != 0. * */ void ctcString2UserRegionInfo( const char ctcString[], POMP2_USER_Region_info* regionInfo ); /** * Free the memory of the regionInfo members. * @param regionInfo The regioninfo to be freed. */ void freePOMP2UserRegionInfoMembers( POMP2_USER_Region_info* regionInfo ); #endif /* POMP2_USER_REGION_INFO_H */ opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_user_region_info.c0000644000000000000000000000013214015716474023012 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.308005696 opari2-2.0.6/src/opari-lib-dummy/pomp2_user_region_info.c0000644000175100001440000001212414015716474024205 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file pomp2_user_region_info.c * @date Started Tue Apr 1 2014 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_user_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ static void checkUSERConsistency( CTCData* obj ); static void initUserRegionInfo( POMP2_USER_Region_info* obj ); bool checkCTCTokenAndAssignUserRegionInfoValues( int ctctoken, char* value, CTCData* obj ); void ctcString2UserRegionInfo( const char string[], POMP2_USER_Region_info* regionInfo ) { assert( regionInfo ); CTCData ctcData; ctcData.mRegionInfo = ( OPARI2_Region_info* )regionInfo; initUserRegionInfo( regionInfo ); OPARI2_CTC_initCTCData( &ctcData, string ); OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues ( &ctcData, checkCTCTokenAndAssignUserRegionInfoValues ); checkUSERConsistency( &ctcData ); OPARI2_CTC_freeCTCData( &ctcData ); } static void initUserRegionInfo( POMP2_USER_Region_info* obj ) { obj->mRegionType = ( POMP2_USER_Region_type )POMP2_USER_no_type; obj->mUserRegionName = 0; } static void assignUserRegionType( CTCData* obj, const char* value ); bool checkCTCTokenAndAssignUserRegionInfoValues( int ctctoken, char* value, CTCData* obj ) { POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; switch ( ctctoken ) { case CTC_Region_type: assignUserRegionType( obj, value ); return true; case CTC_USER_Region_name: OPARI2_CTC_assignString( ®ionInfo->mUserRegionName, value ); return true; } return false; } /*----------------------------------------------------------------------------*/ /** @brief map with region types (really short but exactly like the other paradigms) */ static const OPARI2_CTCMapType userRegionTypesMap[] = { { "userRegion", POMP2_USER_Region } }; static void assignUserRegionType( CTCData* obj, const char* value ) { POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; regionInfo->mRegionType = ( POMP2_USER_Region_type )OPARI2_CTC_string2Enum( userRegionTypesMap, OPARI2_CTC_MAP_SIZE( userRegionTypesMap ), value ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_region_type, value ); } } const char* pomp2UserRegionType2String( POMP2_USER_Region_type regionType ) { if ( regionType ) { return OPARI2_CTC_enum2String( userRegionTypesMap, OPARI2_CTC_MAP_SIZE( userRegionTypesMap ), regionType ); } return "no valid region type"; } /*----------------------------------------------------------------------------*/ static void checkUSERConsistency( CTCData* obj ) { bool requiredAttributesFound; POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; OPARI2_CTC_checkConsistency( obj ); if ( regionInfo->mRegionType == POMP2_USER_no_type ) { OPARI2_CTC_error( obj, CTC_ERROR_No_region_type, 0 ); return; } if ( regionInfo->mRegionType == POMP2_USER_Region && regionInfo->mUserRegionName == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_User_region_name_missing, 0 ); return; } } /*----------------------------------------------------------------------------*/ void freePOMP2UserRegionInfoMembers( POMP2_USER_Region_info* regionInfo ) { OPARI2_CTC_freeAndReset( ®ionInfo->mUserRegionName ); } opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_region_info.h0000644000000000000000000000013214015716474021761 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.308005696 opari2-2.0.6/src/opari-lib-dummy/pomp2_region_info.h0000644000175100001440000002222414015716474023156 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_REGION_INFO_H #define POMP2_REGION_INFO_H /** * @file pomp2_region_info.h * @date Started Fri Mar 20 16:30:45 2009 * * @brief This file contains function declarations and structs * which handle informations on OpenMP regions. POMP2_Region_info * is used to store these informations. It can be filled with a * ctcString by ctcString2RegionInfo(). * */ #include "opari2_region_info.h" #include /** * POMP2_Region_type * */ typedef enum /* POMP2_Region_type */ { POMP2_No_type = 0, POMP2_Atomic, POMP2_Barrier, POMP2_Critical, POMP2_Do, POMP2_Flush, POMP2_For, POMP2_Master, POMP2_Ordered, POMP2_Parallel, POMP2_Parallel_do, POMP2_Parallel_for, POMP2_Parallel_sections, POMP2_Parallel_workshare, POMP2_Sections, POMP2_Single, POMP2_Task, POMP2_Taskuntied, POMP2_Taskwait, POMP2_Workshare } POMP2_Region_type; /** converts regionType into a string * @param regionType The regionType to be converted. * @return string representation of the region type*/ const char* pomp2RegionType2String( POMP2_Region_type regionType ); /** * type to store the scheduling type of a for worksharing constuct * */ typedef enum { POMP2_No_schedule = 0, POMP2_Static, /* needs chunk size */ POMP2_Dynamic, /* needs chunk size */ POMP2_Guided, /* needs chunk size */ POMP2_Runtime, POMP2_Auto } POMP2_Schedule_type; /** converts scheduleType into a string * @param scheduleType The scheduleType to be converted. * @return string representation of the scheduleType*/ const char* pomp2ScheduleType2String( POMP2_Schedule_type scheduleType ); /** * type to store the default value data sharing * */ typedef enum { POMP2_No_defaultSharing = 0, POMP2_None, POMP2_Shared, POMP2_Private, POMP2_Firstprivate } POMP2_DefaultSharing_type; /** converts defaultSharingType into a string * @param defaultSharingType The defaultSharingType to be converted. * @return string representation of the defaultSharingType*/ const char* pomp2defaultSharingType2String( POMP2_DefaultSharing_type defaultSharingType ); /** * @brief This struct stores all information on an OpenMP region, like the * region type or corresponding source lines. The function * ctcString2RegionInfo() can be used to fill this struct with data * from a ctcString. */ typedef struct { /** @name Generic source code information attributes */ //@{ /** Source location info. Needs to be first for the typecasting * from generic OPARI2_Region_info to work. It is included by use * of the macro OPARI2_REGION_INFO to ensure typecasting when * necessary */ OPARI2_REGION_INFO //@} /** OpenMP specific fields */ //@{ /** Type of the OpenMP region*/ POMP2_Region_type mRegionType; /**true if a copyin clause is present*/ bool mHasCopyIn; /**true if a copyprivate clause is present*/ bool mHasCopyPrivate; /**true if an if clause is present*/ bool mHasIf; /**true if a firstprivate clause is present*/ bool mHasFirstPrivate; /**true if a lastprivate clause is present*/ bool mHasLastPrivate; /**true if a nowait clause is present*/ bool mHasNoWait; /**true if a numThreads clause is present*/ bool mHasNumThreads; /**true if an ordered clause is present*/ bool mHasOrdered; /**true if a reduction clause is present*/ bool mHasReduction; /**true if a shared clause is present*/ bool mHasShared; /**true if a collapse clause is present*/ bool mHasCollapse; /**true if a untied clause was present, even if the task was changed to tied during instrumentation.*/ bool mHasUntied; /** schedule type in the schedule clause*/ POMP2_Schedule_type mScheduleType; /** defaultSharing type in the defaultSharing clause*/ POMP2_DefaultSharing_type mDefaultSharingType; /** user group name*/ char* mUserGroupName; /** number of sections*/ unsigned mNumSections; /** name of a named critical region*/ char* mCriticalName; //@} } POMP2_Region_info; /** CTC Tokens */ #define CTC_OMP_TOKENS \ CTC_OMP_Has_copy_in, \ CTC_OMP_Has_copy_private, \ CTC_OMP_Has_defaultSharing, \ CTC_OMP_Has_first_private, \ CTC_OMP_Has_last_private, \ CTC_OMP_Has_no_wait, \ CTC_OMP_Has_ordered, \ CTC_OMP_Has_reduction, \ CTC_OMP_Has_schedule, \ CTC_OMP_Has_shared, \ CTC_OMP_Num_sections, \ CTC_OMP_Critical_name, \ CTC_OMP_User_group_name, \ CTC_OMP_Has_if, \ CTC_OMP_Has_collapse, \ CTC_OMP_Has_num_threads, \ CTC_OMP_Has_untied #define CTC_OPENMP_TOKEN_MAP_ENTRIES \ { "criticalName", CTC_OMP_Critical_name }, \ { "hasCollapse", CTC_OMP_Has_collapse }, \ { "hasCopyIn", CTC_OMP_Has_copy_in }, \ { "hasCopyPrivate", CTC_OMP_Has_copy_private }, \ { "hasDefault", CTC_OMP_Has_defaultSharing }, \ { "hasFirstPrivate", CTC_OMP_Has_first_private }, \ { "hasIf", CTC_OMP_Has_if }, \ { "hasLastPrivate", CTC_OMP_Has_last_private }, \ { "hasNowait", CTC_OMP_Has_no_wait }, \ { "hasNum_threads", CTC_OMP_Has_num_threads }, \ { "hasOrdered", CTC_OMP_Has_ordered }, \ { "hasReduction", CTC_OMP_Has_reduction }, \ { "hasSchedule", CTC_OMP_Has_schedule }, \ { "hasShared", CTC_OMP_Has_shared }, \ { "hasUntied", CTC_OMP_Has_untied }, \ { "numSections", CTC_OMP_Num_sections }, \ { "userGroupName", CTC_OMP_User_group_name } /** * ctcString2RegionInfo() fills the POMP2_Region_info object with data read * from the ctcString. If the ctcString does not comply with the * specification, the program aborts with exit code 1. * * @n Rationale: ctcString2RegionInfo() is used during initialization * of the measurement system. If an error occurs, it is better to * abort than to struggle with undefined behaviour or @e guessing the * meaning of the broken string. * * @note Can be called from multiple threads concurrently, assuming malloc is * thread-safe. * * @note ctcString2RegionInfo() will assign memory to the members of @e * regionInfo. You are supposed to to release this memory by calling * freePOMP2RegionInfoMembers(). * * @param ctcString A string in the format * "length*key=value*[key=value]*". The length field is parsed but not used by * this implementation. Possible values for key are listed in * ctcTokenMap. The string must at least contain values for the keys @c * regionType, @c sscl and @c escl. Possible values for the key @c regionType * are listed in regionTypesMap. The format for @c sscl resp. @c escl values * is @c "filename:lineNo1:lineNo2". * * @param regionInfo must be a valid object * * @post At least the required attributes (see POMP2_Region_info) are set. * @n All other members of @e regionInfo are set to 0 resp. false * resp. POMP2_No_schedule. * @n If @c regionType=sections than POMP2_Region_info::mNumSections * has a value > 0. * @n If @c regionType=critical than POMP2_Region_info::mCriticalName * may have a value != 0. * */ void ctcString2RegionInfo( const char ctcString[], POMP2_Region_info* regionInfo ); /** * Free the memory of the regionInfo members. * @param regionInfo The regioninfo to be freed. */ void freePOMP2RegionInfoMembers( POMP2_Region_info* regionInfo ); #endif /* POMP2_REGION_INFO_H */ opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_region_info.c0000644000000000000000000000013214015716474021754 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.304005684 opari2-2.0.6/src/opari-lib-dummy/pomp2_region_info.c0000644000175100001440000003233614015716474023156 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file pomp2_region_info.c * @date Started Fri Mar 20 16:59:41 2009 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ static void checkOMPConsistency( CTCData* obj ); static void initOpenmpRegionInfo( POMP2_Region_info* obj ); bool checkCTCTokenAndAssignRegionInfoValues( int ctctoken, char* value, CTCData* obj ); void ctcString2RegionInfo( const char string[], POMP2_Region_info* regionInfo ) { assert( regionInfo ); CTCData ctcData; ctcData.mRegionInfo = ( OPARI2_Region_info* )regionInfo; initOpenmpRegionInfo( regionInfo ); OPARI2_CTC_initCTCData( &ctcData, string ); OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues ( &ctcData, checkCTCTokenAndAssignRegionInfoValues ); checkOMPConsistency( &ctcData ); OPARI2_CTC_freeCTCData( &ctcData ); } static void initOpenmpRegionInfo( POMP2_Region_info* obj ) { obj->mRegionType = POMP2_No_type; obj->mHasCollapse = false; obj->mHasCopyIn = false; obj->mHasCopyPrivate = false; obj->mHasFirstPrivate = false; obj->mHasIf = false; obj->mHasLastPrivate = false; obj->mHasNoWait = false; obj->mHasNumThreads = false; obj->mHasOrdered = false; obj->mHasReduction = false; obj->mHasUntied = false; obj->mScheduleType = POMP2_No_schedule; obj->mNumSections = 0; obj->mCriticalName = 0; obj->mUserGroupName = 0; } static void assignRegionType( CTCData* obj, const char* value ); static void assignScheduleType( CTCData* obj, char* restrict value ); static void assignDefaultSharingType( CTCData* obj, char* restrict value ); bool checkCTCTokenAndAssignRegionInfoValues( int ctctoken, char* value, CTCData* obj ) { POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; switch ( ctctoken ) { case CTC_Region_type: assignRegionType( obj, value ); return true; case CTC_OMP_Has_copy_in: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCopyIn, value ); return true; case CTC_OMP_Has_copy_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCopyPrivate, value ); return true; case CTC_OMP_Has_first_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasFirstPrivate, value ); return true; case CTC_OMP_Has_if: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasIf, value ); return true; case CTC_OMP_Has_last_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasLastPrivate, value ); return true; case CTC_OMP_Has_no_wait: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasNoWait, value ); return true; case CTC_OMP_Has_num_threads: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasNumThreads, value ); return true; case CTC_OMP_Has_ordered: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasOrdered, value ); return true; case CTC_OMP_Has_reduction: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasReduction, value ); return true; case CTC_OMP_Has_collapse: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCollapse, value ); return true; case CTC_OMP_Has_untied: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasUntied, value ); return true; case CTC_OMP_Has_schedule: assignScheduleType( obj, value ); return true; case CTC_OMP_Has_defaultSharing: assignDefaultSharingType( obj, value ); return true; case CTC_OMP_Has_shared: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasShared, value ); return true; case CTC_OMP_Num_sections: OPARI2_CTC_assignUnsigned( obj, ®ionInfo->mNumSections, value ); return true; case CTC_OMP_Critical_name: OPARI2_CTC_assignString( ®ionInfo->mCriticalName, value ); return true; case CTC_OMP_User_group_name: OPARI2_CTC_assignString( ®ionInfo->mUserGroupName, value ); return true; } return false; } /*----------------------------------------------------------------------------*/ /** @brief map with region types*/ static const OPARI2_CTCMapType regionTypesMap[] = { { "atomic", POMP2_Atomic }, { "barrier", POMP2_Barrier }, { "critical", POMP2_Critical }, { "do", POMP2_Do }, { "flush", POMP2_Flush }, { "for", POMP2_For }, { "master", POMP2_Master }, { "ordered", POMP2_Ordered }, { "parallel", POMP2_Parallel }, { "paralleldo", POMP2_Parallel_do }, { "parallelfor", POMP2_Parallel_for }, { "parallelsections", POMP2_Parallel_sections }, { "parallelworkshare", POMP2_Parallel_workshare }, { "sections", POMP2_Sections }, { "single", POMP2_Single }, { "task", POMP2_Task }, { "taskuntied", POMP2_Taskuntied }, { "taskwait", POMP2_Taskwait }, { "workshare", POMP2_Workshare } }; static void assignRegionType( CTCData* obj, const char* value ) { POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; regionInfo->mRegionType = ( POMP2_Region_type )OPARI2_CTC_string2Enum( regionTypesMap, OPARI2_CTC_MAP_SIZE( regionTypesMap ), value ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_region_type, value ); } } const char* pomp2RegionType2String( POMP2_Region_type regionType ) { if ( regionType ) { return OPARI2_CTC_enum2String( regionTypesMap, OPARI2_CTC_MAP_SIZE( regionTypesMap ), regionType ); } return "no valid region type"; } /*----------------------------------------------------------------------------*/ /** @brief map with schedule types*/ static const OPARI2_CTCMapType scheduleTypesMap[] = { { "auto", POMP2_Auto }, { "dynamic", POMP2_Dynamic }, { "guided", POMP2_Guided }, { "runtime", POMP2_Runtime }, { "static", POMP2_Static } }; /** @brief returns a string of the schedule type*/ const char* pomp2ScheduleType2String( POMP2_Schedule_type scheduleType ) { if ( scheduleType ) { return OPARI2_CTC_enum2String( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), scheduleType ); } return "no valid schedule type"; } static void assignScheduleType( CTCData* obj, char* restrict value ) { char* token = NULL; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; token = strtok( value, "," ); if ( token ) { regionInfo->mScheduleType = ( POMP2_Schedule_type )OPARI2_CTC_string2Enum( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), value ); } else { regionInfo->mScheduleType = ( POMP2_Schedule_type )OPARI2_CTC_string2Enum( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), value ); } if ( regionInfo->mScheduleType == POMP2_No_schedule ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_schedule_type, value ); } } /*----------------------------------------------------------------------------*/ /** @brief map with defaultSharing types*/ static const OPARI2_CTCMapType defaultSharingTypesMap[] = { { "none", POMP2_None }, { "shared", POMP2_Shared }, { "private", POMP2_Private }, { "firstprivate", POMP2_Firstprivate } }; /** @brief returns a string of the defaultSharing type*/ const char* pomp2DefaultSharingType2String( POMP2_DefaultSharing_type defaultSharingType ) { if ( defaultSharingType ) { return OPARI2_CTC_enum2String( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), defaultSharingType ); } return "no valid defaultSharing type"; } static void assignDefaultSharingType( CTCData* obj, char* restrict value ) { char* token = NULL; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; token = strtok( value, "," ); if ( token ) { regionInfo->mDefaultSharingType = ( POMP2_DefaultSharing_type )OPARI2_CTC_string2Enum( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), value ); } else { regionInfo->mDefaultSharingType = ( POMP2_DefaultSharing_type )OPARI2_CTC_string2Enum( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), value ); } if ( regionInfo->mDefaultSharingType == POMP2_No_defaultSharing ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_default_sharing_type, value ); } } /*----------------------------------------------------------------------------*/ static void checkOMPConsistency( CTCData* obj ) { bool requiredAttributesFound; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; OPARI2_CTC_checkConsistency( obj ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_No_region_type, 0 ); return; } if ( regionInfo->mRegionType == POMP2_Sections && regionInfo->mNumSections <= 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Num_sections_invalid, 0 ); return; } /* A barrier, taskwait and flush does not have an end line number, since it * is not associated to a region.*/ if ( obj->mRegionInfo->mStartLine2 > obj->mRegionInfo->mEndLine1 && regionInfo->mRegionType != POMP2_Barrier && regionInfo->mRegionType != POMP2_Taskwait && regionInfo->mRegionType != POMP2_Flush ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } } /*----------------------------------------------------------------------------*/ void freePOMP2RegionInfoMembers( POMP2_Region_info* regionInfo ) { OPARI2_CTC_freeAndReset( ®ionInfo->mCriticalName ); OPARI2_CTC_freeAndReset( ®ionInfo->mUserGroupName ); } opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/opari2_region_info.h0000644000000000000000000000013214015716474022120 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.299910173 30 ctime=1614257498.304005684 opari2-2.0.6/src/opari-lib-dummy/opari2_region_info.h0000644000175100001440000000436614015716474023324 0ustar00builderusers00000000000000/**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_REGION_INFO_H #define OPARI2_REGION_INFO_H /** * @file opari2_region_info.h * @date Started Tue Mar 25 2014 * * @brief * */ #define OPARI2_REGION_INFO \ /** name of the corresponding source file from the opening pragma */ \ char* mStartFileName; \ /** line number of the first line from the opening pragma */ \ unsigned mStartLine1; \ /** line number of the last line from the opening pragma */ \ unsigned mStartLine2; \ /** name of the corresponding source file from the closing pragma */ \ char* mEndFileName; \ /** line number of the first line from the closing pragma */ \ unsigned mEndLine1; \ /** line number of the last line from the closing pragma */ \ unsigned mEndLine2; #define CTC_REGION_TOKENS \ CTC_End_source_code_location, \ CTC_Start_source_code_location, \ CTC_Region_type #define CTC_REGION_TOKEN_MAP_ENTRIES \ { "escl", CTC_End_source_code_location }, \ { "sscl", CTC_Start_source_code_location }, \ { "regionType", CTC_Region_type } /** * @brief This struct stores all information on OPARI2 regions */ typedef struct { OPARI2_REGION_INFO } OPARI2_Region_info; #endif /* OPARI2_REGION_INFO_H */ opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/opari2_ctc_parser.h0000644000000000000000000000013214015716474021747 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.300005671 opari2-2.0.6/src/opari-lib-dummy/opari2_ctc_parser.h0000644000175100001440000001032414015716474023142 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_CTC_PARSER_H #define OPARI2_CTC_PARSER_H /** * @file opari2_ctc_parser.h * @date Started Tue Mar 25 2014 * * @brief * */ #include #include #include "opari2_region_info.h" /** @brief CTCData */ typedef struct { /** pointer to source info */ char* mCTCStringToParse; /** memory string*/ char* mCTCStringMemory; /** error string*/ char* mCTCStringForErrorMsg; /** structured region information */ OPARI2_Region_info* mRegionInfo; } CTCData; /** @brief errors the user is responsible for, i.e. just errors in * the passed string */ typedef enum /* CTC_ERROR_Type */ { CTC_ERROR_Ended_unexpectedly, CTC_ERROR_No_region_type, CTC_ERROR_No_separator_after_length_field, CTC_ERROR_Num_sections_invalid, CTC_ERROR_SCL_broken, CTC_ERROR_SCL_line_number_error, CTC_ERROR_Unknown_token, CTC_ERROR_Unsigned_expected, CTC_ERROR_User_region_name_missing, CTC_ERROR_Wrong_clause_value, CTC_ERROR_Unknown_region_type, CTC_ERROR_No_key, CTC_ERROR_No_value, CTC_ERROR_Zero_length_key, CTC_ERROR_Zero_length_value, CTC_ERROR_Unknown_schedule_type, CTC_ERROR_Unknown_default_sharing_type, CTC_ERROR_SCL_error, CTC_ERROR_Inconsistent_line_numbers } CTC_ERROR_Type; /** @brief print error information*/ void OPARI2_CTC_error( CTCData* obj, CTC_ERROR_Type errorType, const char* info1 ); void OPARI2_CTC_initCTCData( CTCData* obj, const char string[] ); void OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues( CTCData * obj, bool ( * checkToken )( int, char*, CTCData* ) ); void OPARI2_CTC_assignUnsigned( CTCData* obj, unsigned* anUnsigned, const char* value ); void OPARI2_CTC_assignString( char** aString, const char* value ); void OPARI2_CTC_assignHasClause( CTCData* obj, bool* hasClause, const char* value ); void OPARI2_CTC_checkConsistency( CTCData* obj ); void OPARI2_CTC_freeCTCData( CTCData* obj ); void OPARI2_CTC_freeAndReset( char** freeMe ); /* Map entry. Matches string to enum */ typedef struct { /** string representation*/ char* mString; /** matching region type*/ int mEnum; } OPARI2_CTCMapType; /** @brief number of entries in regionTypesMap*/ #define OPARI2_CTC_MAP_SIZE( map ) sizeof( map ) / sizeof( OPARI2_CTCMapType ) /** @brief returns the enum associated with a string */ int OPARI2_CTC_string2Enum( const OPARI2_CTCMapType* map, const size_t n_elements, const char* string ); /** @brief returns the string associated with an enum */ const char* OPARI2_CTC_enum2String( const OPARI2_CTCMapType* map, const size_t n_elements, int e_in ); #endif /* OPARI2_CTC_PARSER_H */ opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/opari2_ctc_parser.c0000644000000000000000000000013214015716474021742 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.300005671 opari2-2.0.6/src/opari-lib-dummy/opari2_ctc_parser.c0000644000175100001440000003537714015716474023154 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file opari2_ctc_parser.c * @date Started Tue Mar 25 2014 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** @brief print error information*/ void OPARI2_CTC_error( CTCData* obj, CTC_ERROR_Type errorType, const char* info1 ) { bool abort = true; printf( "Error parsing ctc string:\n\"%s\"\n", obj->mCTCStringForErrorMsg ); switch ( errorType ) { case CTC_ERROR_Ended_unexpectedly: printf( "ctc string ended unexpectedly.\n" ); break; case CTC_ERROR_No_region_type: printf( "ctc string has no region type field or value is empty.\n" ); break; case CTC_ERROR_No_separator_after_length_field: printf( "The separator \"*\" is missing after the length field.\n" ); break; case CTC_ERROR_Num_sections_invalid: printf( "The value of numSections must be > 0.\n" ); break; case CTC_ERROR_SCL_broken: printf( "The required attributes sscl and/or escl contain invalid data " "or are missing.\n" ); break; case CTC_ERROR_SCL_line_number_error: printf( "sscl or escl field has invalid line number arguments (%s).\n", info1 ); break; case CTC_ERROR_Unknown_token: printf( "Token \"%s\" not known.\n", info1 ); abort = false; break; case CTC_ERROR_Unsigned_expected: printf( "A value >= 0 is expected, \"%s\" is not allowed.\n", info1 ); break; case CTC_ERROR_User_region_name_missing: printf( "The field or value \"userRegionName\" is missing.\n" ); break; case CTC_ERROR_Wrong_clause_value: printf( "Clause field value must be \"0\" or \"1\", " "\"%s\" is not allowed.\n", info1 ); break; case CTC_ERROR_Unknown_region_type: printf( "Region type \"%s\" not known.\n", info1 ); break; case CTC_ERROR_No_key: printf( "Could not detect key in \"%s\", \"=\" or \"*\" missing.\n", info1 ); break; case CTC_ERROR_No_value: printf( "Could not detect value in \"%s\", \"*\" missing.\n", info1 ); break; case CTC_ERROR_Zero_length_key: printf( "The character sequence \"*=\" is not allowed.\n" ); break; case CTC_ERROR_Zero_length_value: printf( "The character sequence \"=*\" is not allowed.\n" ); break; case CTC_ERROR_Unknown_schedule_type: printf( "Schedule type \"%s\" not known.\n", info1 ); break; case CTC_ERROR_Unknown_default_sharing_type: printf( "Argument of the default close \"%s\" of unknown type.\n", info1 ); break; case CTC_ERROR_Inconsistent_line_numbers: printf( "Warning: line numbers not valid. Expected startLineNo1 <= startLineNo2 <= endLineNo1 <= endLineNo2 \n" ); abort = false; case CTC_ERROR_SCL_error: printf( "Error parsing source code location, " "expecting \"filename:lineNo1:lineNo2\".\n" ); break; default: puts( "ctc internal error: unknown error type." ); } if ( abort ) { OPARI2_CTC_freeCTCData( obj ); puts( "Aborting" ); exit( 1 ); } } /*----------------------------------------------------------------------------*/ static void initRegionInfo( OPARI2_Region_info* regionInfo ); static void copyCTCStringToInternalMemory( CTCData* obj, const char* source ); void OPARI2_CTC_initCTCData( CTCData* obj, const char string[] ) { initRegionInfo( obj->mRegionInfo ); obj->mCTCStringToParse = 0; obj->mCTCStringMemory = 0; obj->mCTCStringForErrorMsg = 0; copyCTCStringToInternalMemory( obj, string ); } static void initRegionInfo( OPARI2_Region_info* regionInfo ) { regionInfo->mStartFileName = 0; regionInfo->mStartLine1 = 0; regionInfo->mStartLine2 = 0; regionInfo->mEndFileName = 0; regionInfo->mEndLine1 = 0; regionInfo->mEndLine2 = 0; } static void copyCTCStringToInternalMemory( CTCData* obj, const char* source ) { assert( obj->mCTCStringToParse == 0 ); assert( obj->mCTCStringMemory == 0 ); assert( obj->mCTCStringForErrorMsg == 0 ); const size_t nBytes = strlen( source ) * sizeof( char ) + 1; obj->mCTCStringMemory = malloc( nBytes ); obj->mCTCStringForErrorMsg = malloc( nBytes ); strcpy( obj->mCTCStringMemory, source ); strcpy( obj->mCTCStringForErrorMsg, source ); obj->mCTCStringToParse = obj->mCTCStringMemory; } void OPARI2_CTC_freeCTCData( CTCData* obj ) { OPARI2_CTC_freeAndReset( &( obj->mCTCStringMemory ) ); OPARI2_CTC_freeAndReset( &( obj->mCTCStringForErrorMsg ) ); obj->mCTCStringToParse = 0; } void OPARI2_CTC_freeAndReset( char** freeMe ) { if ( *freeMe ) { free( *freeMe ); *freeMe = 0; } } static CTCToken getCTCTokenFromString( char* token ); static void assignSourceCodeLocation( CTCData* obj, char** fileName, unsigned* line1, unsigned* line2, char* value ); static void ignoreLengthField( CTCData* obj ); /** @brief map with CTC tokens*/ static const OPARI2_CTCMapType ctcTokenMap[] = { CTC_REGION_TOKEN_MAP_ENTRIES, CTC_OPENMP_TOKEN_MAP_ENTRIES, CTC_USER_REGION_TOKEN_MAP_ENTRIES }; static bool getKeyValuePair( CTCData* obj, char** key, char** value ); void OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues( CTCData* obj, bool ( * checkToken )( int, char*, CTCData* ) ) { char* key; char* value; CTCToken token; ignoreLengthField( obj ); while ( getKeyValuePair( obj, &key, &value ) ) { token = ( CTCToken )OPARI2_CTC_string2Enum( ctcTokenMap, OPARI2_CTC_MAP_SIZE( ctcTokenMap ), key ); switch ( token ) { case CTC_Start_source_code_location: assignSourceCodeLocation( obj, &obj->mRegionInfo->mStartFileName, &obj->mRegionInfo->mStartLine1, &obj->mRegionInfo->mStartLine2, value ); break; case CTC_End_source_code_location: assignSourceCodeLocation( obj, &obj->mRegionInfo->mEndFileName, &obj->mRegionInfo->mEndLine1, &obj->mRegionInfo->mEndLine2, value ); break; default: if ( !checkToken( token, value, obj ) ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_token, key ); } } } } static void ignoreLengthField( CTCData* obj ) { /* We expect ctcString to look like "42*key=value*...**" * The length field is redundant and we don't use it in our parsing * implementation. */ while ( obj->mCTCStringToParse && isdigit( *obj->mCTCStringToParse ) ) { ++( obj->mCTCStringToParse ); } if ( !obj->mCTCStringToParse ) { OPARI2_CTC_error( obj, CTC_ERROR_Ended_unexpectedly, 0 ); } if ( *obj->mCTCStringToParse != '*' ) { OPARI2_CTC_error( obj, CTC_ERROR_No_separator_after_length_field, 0 ); } ++( obj->mCTCStringToParse ); if ( !obj->mCTCStringToParse ) { OPARI2_CTC_error( obj, CTC_ERROR_Ended_unexpectedly, 0 ); } } static bool extractNextToken( char** string, const char tokenDelimiter ); static bool getKeyValuePair( CTCData* obj, char** key, char** value ) { /* We expect ctcString to look like "key=value*...**" or "*". */ if ( *( obj->mCTCStringToParse ) == '*' ) { return false; /* end of ctc string */ } if ( *( obj->mCTCStringToParse ) == '\0' ) { return false; /* also end of ctc string. we don't force the second "*" */ } *key = obj->mCTCStringToParse; if ( !extractNextToken( &obj->mCTCStringToParse, '=' ) ) { OPARI2_CTC_error( obj, CTC_ERROR_No_key, *key ); } if ( strlen( *key ) == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Zero_length_key, 0 ); } *value = obj->mCTCStringToParse; if ( !extractNextToken( &obj->mCTCStringToParse, '*' ) ) { OPARI2_CTC_error( obj, CTC_ERROR_No_value, *value ); } if ( strlen( *value ) == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Zero_length_value, 0 ); } /*@ in the hasSchedule clause was a '*' originally and needs to be replaced back*/ if ( strcmp( *key, "hasSchedule" ) == 0 ) { while ( strchr( *value, '@' ) ) { ( strchr( *value, '@' ) )[ 0 ] = '*'; } } return true; } static bool extractNextToken( char** string, const char tokenDelimiter ) { *string = strchr( *string, tokenDelimiter ); if ( !( *string && **string == tokenDelimiter ) ) { return false; } **string = '\0'; /* extraction */ ++( *string ); return true; } static void assignSourceCodeLocation( CTCData* obj, char** filename, unsigned* line1, unsigned* line2, char* value ) { /* We assume that value looks like "foo.c:42:43" */ char* token = value; int line1Tmp = -1; int line2Tmp = -1; bool continueExtraction; assert( *filename == 0 ); if ( ( continueExtraction = extractNextToken( &value, ':' ) ) ) { *filename = malloc( strlen( token ) * sizeof( char ) + 1 ); strcpy( *filename, token ); } token = value; if ( continueExtraction && ( continueExtraction = extractNextToken( &value, ':' ) ) ) { line1Tmp = atoi( token ); } token = value; if ( continueExtraction && extractNextToken( &value, '\0' ) ) { line2Tmp = atoi( token ); } if ( *filename != 0 && line1Tmp > -1 && line2Tmp > -1 ) { *line1 = line1Tmp; *line2 = line2Tmp; if ( *line1 > *line2 ) { OPARI2_CTC_error( obj, CTC_ERROR_SCL_line_number_error, "line1 > line2" ); } } else { OPARI2_CTC_error( obj, CTC_ERROR_SCL_error, 0 ); } } void OPARI2_CTC_assignHasClause( CTCData* obj, bool* hasClause, const char* value ) { if ( !isdigit( *value ) ) { OPARI2_CTC_error( obj, CTC_ERROR_Wrong_clause_value, value ); } int tmp = atoi( value ); if ( tmp != 0 && tmp != 1 ) { OPARI2_CTC_error( obj, CTC_ERROR_Wrong_clause_value, value ); } *hasClause = tmp; } void OPARI2_CTC_assignUnsigned( CTCData* obj, unsigned* anUnsigned, const char* value ) { int tmp = atoi( value ); if ( tmp < 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Unsigned_expected, value ); } *anUnsigned = tmp; } void OPARI2_CTC_assignString( char** aString, const char* value ) { *aString = malloc( strlen( value ) * sizeof( char ) + 1 ); strcpy( *aString, value ); } void OPARI2_CTC_checkConsistency( CTCData* obj ) { bool requiredAttributesFound; requiredAttributesFound = ( obj->mRegionInfo->mStartFileName && obj->mRegionInfo->mEndFileName ); if ( !requiredAttributesFound ) { OPARI2_CTC_error( obj, CTC_ERROR_SCL_broken, 0 ); return; } if ( obj->mRegionInfo->mStartLine1 > obj->mRegionInfo->mStartLine2 ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } if ( obj->mRegionInfo->mEndLine1 > obj->mRegionInfo->mEndLine2 ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } } /*----------------------------------------------------------------------------*/ int OPARI2_CTC_string2Enum( const OPARI2_CTCMapType* map, const size_t n_elements, const char* string ) { int i; for ( i = 0; i < n_elements; ++i ) { if ( strcmp( map[ i ].mString, string ) == 0 ) { return map[ i ].mEnum; } } return 0; } /** @brief returns the string associated with an enum */ const char* OPARI2_CTC_enum2String( const OPARI2_CTCMapType* map, const size_t n_elements, int e_in ) { int i; for ( i = 0; i < n_elements; ++i ) { if ( e_in == map[ i ].mEnum ) { return map[ i ].mString; } } return "no valid region type"; } opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/opari2_ctc_token.h0000644000000000000000000000013214015716474021573 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.296005658 opari2-2.0.6/src/opari-lib-dummy/opari2_ctc_token.h0000644000175100001440000000243214015716474022767 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_CTC_TOKEN_H #define OPARI2_CTC_TOKEN_H #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" /** CTC Tokens */ typedef enum { CTC_No_token = 0, CTC_REGION_TOKENS, CTC_OMP_TOKENS, CTC_USER_REGION_TOKENS } CTCToken; #endif /* OPARI2_CTC_TOKEN_H */ opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_lib.c0000644000000000000000000000013214015716474020224 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257498.292005646 opari2-2.0.6/src/opari-lib-dummy/pomp2_lib.c0000644000175100001440000006701414015716474021427 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2014, 2016, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_lib.c * * @brief Dummy implementation of all POMP2 Functions. These functions * only print out messages and do not measure anything.*/ #include #include #include /* *INDENT-OFF* */ #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" #include #include #include #include #include /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. */ extern size_t POMP2_Get_num_regions(void); /** * Init all OPARI2-created regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines this functions by calling all grepped functions. */ extern void POMP2_Init_regions(void); /** * Returns the OPARI2 version. */ extern const char* POMP2_Get_opari2_version(void); /*@}*/ /** @brief All relevant information for a region is stored here */ typedef struct { /** region type of construct */ char* rtype; /** critical or user region name */ char* name; /** sections only: number of sections */ int num_sections; /** start file name*/ char* start_file_name; /** line number 1*/ int start_line_1; /** line number 2*/ int start_line_2; /** end file name*/ char* end_file_name; /** line number 1*/ int end_line_1; /** line number 2*/ int end_line_2; /** region id*/ size_t id; } my_pomp2_region; /** Id of the currently executing task*/ POMP2_Task_handle pomp2_current_task = 0; #pragma omp threadprivate(pomp2_current_task) /** Counter of tasks used to determine task ids for newly created ta*/ POMP2_Task_handle pomp2_task_counter = 1; #pragma omp threadprivate(pomp2_task_counter) POMP2_Task_handle POMP2_Get_new_task_handle(void) { return ( ( POMP2_Task_handle )omp_get_thread_num() << 32 ) + pomp2_task_counter++; } static void free_my_pomp2_region_member( char** member ) { if ( *member ) { free( *member ); *member = 0; } } static void free_my_pomp2_region_members( my_pomp2_region* region ) { if ( region ) { free_my_pomp2_region_member( ®ion->rtype ); free_my_pomp2_region_member( ®ion->name ); free_my_pomp2_region_member( ®ion->start_file_name ); free_my_pomp2_region_member( ®ion->end_file_name ); } } static void assignString( char** destination, const char* source ) { assert( source ); *destination = malloc( strlen( source ) * sizeof( char ) + 1 ); strcpy( *destination, source ); } static void initDummyRegionFromPOMP2RegionInfo( my_pomp2_region* pomp2_region, const POMP2_Region_info* pomp2RegionInfo ) { assignString( &( pomp2_region->rtype ), pomp2RegionType2String( pomp2RegionInfo->mRegionType ) ); assignString( &pomp2_region->start_file_name, pomp2RegionInfo->mStartFileName ); pomp2_region->start_line_1 = pomp2RegionInfo->mStartLine1; pomp2_region->start_line_2 = pomp2RegionInfo->mStartLine2; assignString( &pomp2_region->end_file_name, pomp2RegionInfo->mEndFileName ); pomp2_region->end_line_1 = pomp2RegionInfo->mEndLine1; pomp2_region->end_line_2 = pomp2RegionInfo->mEndLine2; if ( pomp2RegionInfo->mRegionType == POMP2_Critical && pomp2RegionInfo->mCriticalName ) { assignString( &pomp2_region->name, pomp2RegionInfo->mCriticalName ); } pomp2_region->num_sections = pomp2RegionInfo->mNumSections; } static void initDummyRegionFromPOMP2UserRegionInfo( my_pomp2_region* pomp2_region, const POMP2_USER_Region_info* pomp2RegionInfo ) { assignString( &( pomp2_region->rtype ), pomp2UserRegionType2String( (POMP2_USER_Region_type)pomp2RegionInfo->mRegionType ) ); assignString( &pomp2_region->start_file_name, pomp2RegionInfo->mStartFileName ); pomp2_region->start_line_1 = pomp2RegionInfo->mStartLine1; pomp2_region->start_line_2 = pomp2RegionInfo->mStartLine2; assignString( &pomp2_region->end_file_name, pomp2RegionInfo->mEndFileName ); pomp2_region->end_line_1 = pomp2RegionInfo->mEndLine1; pomp2_region->end_line_2 = pomp2RegionInfo->mEndLine2; if ( pomp2RegionInfo->mRegionType == POMP2_USER_Region ) { assignString( &pomp2_region->name, pomp2RegionInfo->mUserRegionName ); } } /* * Global variables */ int pomp2_tracing = 0; my_pomp2_region* my_pomp2_regions; /* * C pomp2 function library */ void POMP2_Finalize(void) { static int pomp2_finalize_called = 0; size_t i; const size_t nRegions = POMP2_Get_num_regions(); if ( my_pomp2_regions ) { for ( i = 0; i < nRegions; ++i ) { free_my_pomp2_region_members( &my_pomp2_regions[ i ] ); } free( my_pomp2_regions ); my_pomp2_regions = 0; } if ( !pomp2_finalize_called ) { pomp2_finalize_called = 1; fprintf( stderr, " 0: finalize\n" ); } } void POMP2_Init(void) { static int pomp2_init_called = 0; if ( !pomp2_init_called ) { pomp2_init_called = 1; atexit( POMP2_Finalize ); fprintf( stderr, " 0: init\n" ); int n_pomp2_regions = POMP2_Get_num_regions() + POMP2_USER_Get_num_regions(); int n_pomp2_user_regions = POMP2_USER_Get_num_regions(); my_pomp2_regions = calloc( n_pomp2_regions + n_pomp2_user_regions, sizeof( my_pomp2_region ) ); if ( n_pomp2_regions > 0 ) { POMP2_Init_regions(); } if ( n_pomp2_regions > 0 ) { POMP2_USER_Init_regions(); } pomp2_tracing = 1; } } void POMP2_Off(void) { pomp2_tracing = 0; } void POMP2_On(void) { pomp2_tracing = 1; } void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin region %s\n", omp_get_thread_num(), region->name ); } } void POMP2_End( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end region %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { static size_t count = 0; assert( count < POMP2_Get_num_regions() ); POMP2_Region_info pomp2RegionInfo; ctcString2RegionInfo( ctc_string, &pomp2RegionInfo ); initDummyRegionFromPOMP2RegionInfo( &my_pomp2_regions[ count ], &pomp2RegionInfo ); my_pomp2_regions[ count ].id = count; *pomp2_handle = &my_pomp2_regions[ count ]; freePOMP2RegionInfoMembers( &pomp2RegionInfo ); ++count; } void POMP2_USER_Assign_handle( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ) { static size_t count = 0; assert( count < POMP2_Get_num_regions() ); POMP2_USER_Region_info pomp2RegionInfo; ctcString2UserRegionInfo( ctc_string, &pomp2RegionInfo ); initDummyRegionFromPOMP2UserRegionInfo( &my_pomp2_regions[ count ], &pomp2RegionInfo ); my_pomp2_regions[ count ].id = count; *pomp2_handle = &my_pomp2_regions[ count ]; freePOMP2UserRegionInfoMembers( &pomp2RegionInfo ); ++count; } void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter atomic\n", omp_get_thread_num() ); } } void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit atomic\n", omp_get_thread_num() ); } } void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Barrier_enter( pomp2_handle, pomp2_old_task, "" ); } extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; POMP2_Barrier_exit( pomp2_handle, pomp2_old_task ); } void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { if ( region->rtype[ 0 ] == 'b' ) { fprintf( stderr, "%3d: enter barrier\n", omp_get_thread_num() ); } else { fprintf( stderr, "%3d: enter implicit barrier of %s\n", omp_get_thread_num(), region->rtype ); } } } void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { if ( region->rtype[ 0 ] == 'b' ) { fprintf( stderr, "%3d: exit barrier\n", omp_get_thread_num() ); } else { fprintf( stderr, "%3d: exit implicit barrier of %s\n", omp_get_thread_num(), region->rtype ); } } } void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter flush\n", omp_get_thread_num() ); } } void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit flush\n", omp_get_thread_num() ); } } void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ) { if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin critical %s\n", omp_get_thread_num(), region->rtype ); } } void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ) { if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter for\n", omp_get_thread_num() ); } } void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit for\n", omp_get_thread_num() ); } } void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin master\n", omp_get_thread_num() ); } } void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end master\n", omp_get_thread_num() ); } } void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle) { pomp2_current_task = POMP2_Get_new_task_handle(); #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: fork parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: join parallel\n", omp_get_thread_num() ); } } void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin section\n", omp_get_thread_num() ); } } void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end section\n", omp_get_thread_num() ); } } void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { my_pomp2_region* region = *pomp2_handle; fprintf( stderr, "%3d: enter sections (%d)\n", omp_get_thread_num(), region->num_sections ); } } void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit sections\n", omp_get_thread_num() ); } } void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin single\n", omp_get_thread_num() ); } } void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end single\n", omp_get_thread_num() ); } } void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter single\n", omp_get_thread_num() ); } } void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit single\n", omp_get_thread_num() ); } } void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter workshare\n", omp_get_thread_num() ); } } void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit workshare\n", omp_get_thread_num() ); } } void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit ordered\n", omp_get_thread_num() ); } } void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[]) { *pomp2_old_task = pomp2_current_task; *pomp2_new_task = POMP2_Get_new_task_handle(); if ( pomp2_tracing ) { fprintf( stderr, "%3d: task create begin\n", omp_get_thread_num() ); } } void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: task create end\n", omp_get_thread_num() ); } } void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ) { pomp2_current_task = pomp2_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: task begin\n", omp_get_thread_num() ); } } void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: task end\n", omp_get_thread_num()); } } void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ) { *pomp2_new_task = POMP2_Get_new_task_handle(); *pomp2_old_task = pomp2_current_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: create untied task\n", omp_get_thread_num() ); fprintf( stderr, "%3d: suspend task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: created untied task\n", omp_get_thread_num() ); fprintf( stderr, "%3d: resume task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_parent_task ) { pomp2_current_task = POMP2_Get_new_task_handle(); if ( pomp2_tracing ) { fprintf( stderr, "%3d: start untied task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: end untied task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin taskwait\n", omp_get_thread_num() ); fprintf( stderr, "%3d: suspend task: %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end taskwait\n", omp_get_thread_num() ); fprintf( stderr, "%3d: resume task: %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } /* *---------------------------------------------------------------- * C Wrapper for OpenMP API ******---------------------------------------------------------------- */ void POMP2_Init_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: init lock\n", omp_get_thread_num() ); } omp_init_lock( s ); } void POMP2_Destroy_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: destroy lock\n", omp_get_thread_num() ); } omp_destroy_lock( s ); } void POMP2_Set_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: set lock\n", omp_get_thread_num() ); } omp_set_lock( s ); } void POMP2_Unset_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: unset lock\n", omp_get_thread_num() ); } omp_unset_lock( s ); } int POMP2_Test_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: test lock\n", omp_get_thread_num() ); } return omp_test_lock( s ); } void POMP2_Init_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: init nestlock\n", omp_get_thread_num() ); } omp_init_nest_lock( s ); } void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: destroy nestlock\n", omp_get_thread_num() ); } omp_destroy_nest_lock( s ); } void POMP2_Set_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: set nestlock\n", omp_get_thread_num() ); } omp_set_nest_lock( s ); } void POMP2_Unset_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: unset nestlock\n", omp_get_thread_num() ); } omp_unset_nest_lock( s ); } int POMP2_Test_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: test nestlock\n", omp_get_thread_num() ); } return omp_test_nest_lock( s ); } opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/Makefile.inc.am0000644000000000000000000000013214015716474021001 xustar0030 mtime=1614257468.239909983 30 atime=1614257468.299910173 30 ctime=1614257498.236005467 opari2-2.0.6/src/opari-lib-dummy/Makefile.inc.am0000644000175100001440000000624514015716474022203 0ustar00builderusers00000000000000# -*- mode: makefile -*- # This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. if HAVE_OPENMP_SUPPORT examplelibdir = $(docdir)/example/lib examplelib_LTLIBRARIES = libpomp.la libpomp_la_SOURCES = \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_lib.c \ $(PUBLIC_INC_SRC)pomp2_lib.h \ $(PUBLIC_INC_SRC)pomp2_user_lib.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_token.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.c \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.h # Currently, the fortran wrappers get a int* parameter whereas the new # POMP_Region_handle is of type void*. Ask a fortran guru if this may cause # problems. # CFLAGS are sufficient here, CPPFLAGS would cause duplication libpomp_la_CFLAGS = $(AM_CFLAGS) $(OPENMP_CFLAGS) libpomp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(PUBLIC_INC_DIR) libpomp_la_LDFLAGS = -static -avoid-version if SCOREP_HAVE_F77 libpomp_la_SOURCES += \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper_base.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper_base.h BUILT_SOURCES += pomp2_fwrapper_def.h CLEANFILES += pomp2_fwrapper_def.h pomp2_fwrapper_def.h: Makefile getfname$(EXEEXT) $(AM_V_GEN)./getfname$(EXEEXT) noinst_PROGRAMS += getfname getfname_SOURCES = \ $(SRC_ROOT)src/opari-lib-dummy/foos.c \ $(SRC_ROOT)src/opari-lib-dummy/getfname.f endif EXTRA_DIST += $(SRC_ROOT)src/opari-lib-dummy/pomp2_parse_init_regions.awk.in endif pkgdatadeveldir = $(pkgdatadir)/devel pkgdatadevel_DATA = \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_token.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.c opari2-2.0.6/src/opari-lib-dummy/PaxHeaders.6153/pomp2_parse_init_regions.awk.in0000644000000000000000000000013214015716474024306 xustar0030 mtime=1614257468.243909995 30 atime=1614257468.303910186 30 ctime=1614257497.844004219 opari2-2.0.6/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in0000644000175100001440000001155614015716474025511 0ustar00builderusers00000000000000#!@OPARI2_AWK@ -f ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen University, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2013, 2014, 2016-2017, 2020, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## # # pomp2_parse_init_regions.awk # # Expects the output of # $(NM) $ALL_OBJS_AND_LIBS as input. See # for a working example. # # The output is C-code that needs to be linked to your application. It # provides several functions: # # void POMP2_Init_regions(): need to be called from your POMP2 library to # initialize all instrumented POMP2 region by calling the instrumented # functions POMP2_Init_reg_*. # # size_t POMP2_Get_num_regions() returns the number of POMP2 regions found # in $ALL_OBJS_AND_LIBS. # # const char* POMP2_Get_opari2_version() returns a version string. # # Three functions returning int and specifying the library interface version: # int POMP2_Get_required_pomp2_library_version_(current|revision|age)() # # Author: Christian Roessel # function add_region( type_str, regions_arr, n_regions_int ) { for (i = 1; i <= NF; i++) { if (index($i,type_str) != 0) { separator = type_str; } else if (index($i,tolower(type_str)) != 0) { separator = tolower(type_str); } else if (index($i,toupper(type_str)) != 0) { separator = toupper(type_str); } else { continue; } # $i looks like "POMP2_Init_reg_uniqueId_n_regions" or # like "pomp2_init_reg_uniqueId_n_regions" or # like "POMP2_INIT_REG_uniqueId_n_regions" split ($i,splitResult,separator); _uniqueId_n_regions = splitResult[2]; if (!(_uniqueId_n_regions in regions_arr)) { regions_arr[_uniqueId_n_regions] = $i; split(_uniqueId_n_regions, tokens, "_"); n_regions_int += tokens[3]; } } return n_regions_int; } # The pomp OpenMP region symbols contain 'pomp2_init_reg' (case insensitive), are of # (nm) type [TDA], and are not Intel -ipo or -O3 symbols (.ITC.). / [_]*[Pp][Oo][Mm][Pp]2_[Ii][Nn][Ii][Tt]_[Rr][Ee][Gg]_[0-9a-zA-Z][0-9a-zA-Z]*_[1-9][0-9]*/ { if (tolower($0) ~ /pomp2_init_reg/ && $0 ~ / [TDA] / && $0 !~ /\.ITC\./) { n_pomp_regions = add_region("POMP2_Init_reg", pomp_regions, n_pomp_regions) } } # The pomp user region symbols contain 'pomp2_user_init_reg' (case insensitive), are of # (nm) type [TDA], and are not Intel -ipo or -O3 symbols (.ITC.). / [_]*[Pp][Oo][Mm][Pp]2_[Uu][Ss][Ee][Rr]_[Ii][Nn][Ii][Tt]_[Rr][Ee][Gg]_[0-9a-zA-Z][0-9a-zA-Z]*_[1-9][0-9]*/ { if (tolower($0) ~ /pomp2_user_init_reg/ && $0 ~ / [TDA] / && $0 !~ /\.ITC\./) { n_pomp_user_regions = add_region("POMP2_USER_Init_reg", pomp_user_regions, n_pomp_user_regions) } } END{ print tmp "\n" print "#ifdef __cplusplus" print "extern \"C\"" print "{" print "#endif" print "#include \n" # Make a regions array with all regions counter = 0 for (i in pomp_regions) { regions[counter++]=pomp_regions[i]; } for (i in pomp_user_regions) { regions[counter++]=pomp_user_regions[i]; } # cut away leading full-stops for (i in regions) { sub(/^\./, "", regions[i]); } # declare XXXXX_Init_reg_* functions extern. # loop reproducibly as make check (test/awk_script_test.sh) might # fail as it expects an order. For normal operation, order doesn't # matter. for (i = 0 ; i < counter; i++) { print "extern void " regions[i] "();"; } print_init_functions("POMP2", pomp_regions, n_pomp_regions); print_init_functions("POMP2_USER", pomp_user_regions, n_pomp_user_regions); print "#ifdef __cplusplus" print "}" print "#endif" } function print_init_functions(type_str, regions_arr, n_reg_int) { # define XXXXX_Init_regions() and call all XXXXX_Init_reg_* functions print "\nvoid " type_str "_Init_regions()" print "{" if ( n_reg_int != 0) { for (i in regions_arr) { print " " regions_arr[i] "();"; } } print "}\n" # define function XXXXX_Get_num_regions() print "size_t " type_str "_Get_num_regions()" print "{" if (n_reg_int != 0) { print " return " n_reg_int ";" } else { print " return 0;" } print "}\n" } opari2-2.0.6/PaxHeaders.6153/doc0000644000000000000000000000013214015716535013065 xustar0030 mtime=1614257501.212014942 30 atime=1614257501.252015069 30 ctime=1614257501.212014942 opari2-2.0.6/doc/0000755000175100001440000000000014015716535014335 5ustar00builderusers00000000000000opari2-2.0.6/doc/PaxHeaders.6153/html.tar.gz0000644000000000000000000000013214015716535015235 xustar0030 mtime=1614257501.208014929 30 atime=1614257501.164014789 30 ctime=1614257501.208014929 opari2-2.0.6/doc/html.tar.gz0000644000175100001440000102741714015716535016444 0ustar00builderusers00000000000000‹]7`ì½@TiÛ7Ž !JI«ˆJÌÀ03´Ò( ” *0IwKKK‰ R*"% (Ò% ‚Ò  -Ý)ÍÿÐÝuŸ}vÝ}Þ÷ý¾ïÿrv—9sÎ×}õõ»Ï™5´53å'úï= à@ >¡!èÖw( ¶õùí ‚Â P!.$(@B0"v¡ÿfº¶;[”5;;ÚÎÈ‹³þ“v8k›ÿ ‚þgC‚ü ¬Q–†z¦8œ9–ÏÒÜà¿x‚€áÛòþùÃàˆÀïä#|°Cþ‹éøÃã¹ü.ªÈ c"§dÔˆˆv·€ófÒ}௺e÷øØ‡>//C´Iø'¡(ù;‘¢ÌY ÇûãÚêC$ÓSŠDQeªId/ÌÜà4dy¡“BwÿõØkMù‰•>ÜVc+Ά,v:ôd”wѲ5·iîfp{h½¢MK¬€Üÿ9~lööý/÷]îZ}®«€V1rxSK‘r¼°Ó.uØ-µõ Ær¸eë¢w3Í/ga—^„RzÆ Æ8ÎmÎå×ÇW9;2#¯ÑPsµõxûK³@ וi–‡gÓŠŸ;ÑZ:dúq_ÔgïüÞÖ¼«p¿C*[sU5›{P…ÕÜvc7‘ýª|!ý¢»Àü¬›ß2lJ,¡-> #k~½EÀ-‘þè,?DMM­ÔŠY@@`)d‹þãV¶¶¯CXD—BÎÂH¥_-pôÁNKf­I^ÞJÑ#)Tâ΋¯ãÄA;Ðf}I’;5±˜O šD×’ŸŸ¯ôv3˜E”N_{«;BáØ;ÂH0¢hÉ7X«ù¶ûÕ“U|BC/ä­š¬æGð\¾!l3È~ì˜L ¿'·j|3ëùóŠTÍ4ˆ~)#coO™DP°¢2~ ”&°²IyùòåY§âµÙóÌHjÎ0RÛ3/ÞZ›ž^\ô ?-dâ{ù9žCR’¨gt”,¤ŸšT‡ó™*^UéÒ|eÕOMGçkÔôس‰ÙM4;;Û31q€œœfÖ~èéÓ§ ·$»ŸÔú‡)xˆívô”{7‡UéùuxQQQÝB†>@`0™¡±Vc­¼é× èðx<÷½w+p9ÊIbsÍ)**}ì`¢|(+˜ÛWʉUÂÅÿðéK¥åå»ãââ BB>1Ilb$\E¢aF7 ˜ª×ÕťŠzúäœÚ–'_á-öåT’kéé­õ” ¥aµ=Üðp@ôAA¨­ -­×ÔæhªY™ºjºÏS‚ªð=  ¨èùðáQ_ Æî›ëô444¯œ¿ò©Ä‰]ž”ùøÒ¬#ëú‚±%úUAfiºWáÂ…Lˆ´±ñ)¸éGVñ륕•Ä@²¤¤¤g®^e.ÞÜpÖ¾|ùäÄ‚ýH#ñX[¦Ÿ6OUïjZÚ=€í€›ý_»ÝïÅ;Mê ušL´è.¦&ó!«ëŸ˜î*r–ÖÓc³¬=«£Ã'ázóõk™ûH«ÝSr@P 9FêŽNNe--/jפ©Zð ÖŇҞPÑXCg3T‡°Tk*C dï¾Á˜í¸4ÍÆ`¬ÖWìL;óg輸|Àme$Y§„ž`1):vñï3y´³ˆNxûù‘ÅÊr[¿³èbžèÈ­N8ëe9ÕU$P³1ßt tÜ_†“G¯˜ùñãÇHûqmá~½Ù@º²ÖVºýû÷¾¹[–béM¼èŸ(íW^WGeee5«÷¥-ýòÃgCÇ^hMɾÈËs 2jI _³':ƒBqôõ÷s"Ca0ê½.~Tlr¡¬âú††¤!ý=ÏÖ¾:2'æ4»—Hˆ Äÿ ÷!Î'Hfff¨+Aô㾓ülˆ ¬I¡Sóë§µs5¼îc££R€«ûöíÃ=>LGqùå‹vyá-û%$$´sÍYÊ+*P(”ç§çG‘Hí¤Š¬óIj{‰‰QïîžÌzùRçjà›tþ^기âD‹³êú BD\¼Hàˆ“ŽNtyͳœoS²¦¦¦y«jêêP·5G—…-ÇÅqF¬ck¦žÞà"Ï„ñšÜ¬,3ìgäää¢ÈÉ0 PôÞÚÚÚ[ññz\G_Xqº5’óëó5³JÒÓ“ >'c3A£oÎön¬¯¾º¾pJ†“¦*ø‰‰‰‰ËL%=Žl-ÿfPÐë¾Ê@ï›g3TÞÞÎÔÛÛKJIY•~ùy=И$qzUÖ®Õ”—ÀC ÷ñöÞ ¤wµ×éýû÷½££7Gš’ûÊ¿ùðÁ73“_%Vħ¼\ ø=†#G¤ååIµKÜ\£–¯äšûû“:%𙛇„•G6§øß¼)uöì®ÉÏy^`ˆ‡¯^1ÀápKkëòB§¹[qq!¯^!ӯ橥L‘â͆z§Í5ÓŽ—´2ueÍÍùZÓ/ïÉÖ]µDõÚž^ëíï÷Z¿´²Âyòä~OOO»w³ù±¢²²¨åC˜ÏÚÚŠ7VƬ ZVz‹ž,ÎÌœ•“Û§¤¬LXp@͆nîîî¶c­¤ý(}^¼*//Ÿîrž*kl<(¹¹&XÊFl8æ{WŸáj,Ç/Œ¼uÞœž›“5ýÉ1n!›ª«nNQox¤HKtF_ŸX„>³GKKËÑÑ‘{(˜ f>À“<ååççO×yAfÖžS¤dµ2?"ð^!õ(5)ÄqZ¼³ WîqÚsû 5à‡;r3#5B1-BûDlI-H4>⟨ö!Ù!ÔÑôb`\ÿ|¤í0õçÎNÍöÁW|ãããY¶#jJѰ€)îS_ßžˆ'rtÊ`Tª(ŒOáÚŠy2MªªÊ[]¥!aŽpÍÈèõrÈ&õï·~môGgBO¬ôV`eä$D÷.1ÝüxÍå;“ÔL—$RÅz·?RUÒ’Hdhß‹aZ"ä'l©‹(Jpû&«fb™Kl,a@,wl }ÂM·aѪ~¿ÔÛ™9µ‹hr3Ó?þÚuu7ï’L`à]ºþÇûš©4Ê@Vˆì}JJ¯4(ª›cÖAçº2ß+*'mÿjåŽôçb?Õ‡ð=D!lñ¡]EN*2ƒé¬ì¯7#rÛgy µ…Gõ©¯ Òr6ækB¯÷Ë—ÔÕ¡Ýý¢”[ÙãÝKÖ ¸(TY°>Xd’Qå {c¹¶$~7✪Ωʆ‡(nÞðY–@Âú¢O-ð'|Y®)6cçðè“™ò°2ÚRýæßíîoOV-Œ©Šq,×_.Šh¯ÿ&>éLùÙ3—j-¸´‚Ñ]Ç?Š­UËÉÙ‹´ç ª–!§A»‘“}†êÌ¥Ùn˜"ë4‰’Ì„‘‹êµ«±Av!EÝ]šë´ÞÅ’rËESñï|é&I¸­uÈÑ~·›nf˜?¾~øÁÊ›°‚'æ°Ù ¿ú­¬;É¢7ûÌñ鹯°ëÒ°À*º–”áWv§)ÕŒ¦×`€ 67ß¿®$·%ù»–¤gJ<öER8öiñ[ùã>>XùòÖò 6œ¾9ó –âÄß6iNÂð†9Þ{ˆRÓxnÑì>ä?v”¦“¾òNCº6ú=Q–ë꡸;B%íñpóôÈ;Ò­è]4=Û uÿVÞ¬J¯¡A»•uªÉÿ왎 ûVß+ë”»,„gcoÚïfc÷~ß„A¶ß%à§¾ ûƒ fšÅë Ã÷k‡˜˜È.\¸àÃ’» 㟞ËÛyúŸ»¸m»jäQ÷ø®•ü§zf]öíÁÚ(AŽ…•ÂGÖß(j.yx6º’L[[»´©‰„oK›´ù‹íöžž[€ç)òïIJF¶›dl” :FÂ͘!^1•â¡Jñ,ÊѰ²H(¦¾ØÕÙeu"×?0P}’ü¸”¬Ð–¦ 8˜ªØ7?ܰ‡ïÍ»wRgÎõõõM¯í®x÷.U®fnn®â‚äº÷Ý»‡€CÕŸýòV?ˆ62?¦Ê¤ }æþ$‘’¿t)B@ž²ë;KiÇ÷a½õ—g´s iLÍÌÂnÝò0ëxYöé#su‹qvWW×pgb~ajðùQRR/ˆ|Bº!¹_×'J÷ ùh3i¥xŽ_²qãðÀfÖoW£8t¬¬ºšd¬5CÚÑÉÃÃq^4ÝKBâ½”VùÒ¸åÜFn\+QBVVVUMع$ÀÀò»'ÕõÍÌ‚kk•Aïü=¾ M>5çoòШxýzo oùúêW«…QMUøÝÚÚºÔÈOÍÆ–™3t4•¿ŽóèÑlÇtdT ZBV¸áå5i噿†‘“?úÉ“­XâùôZA9 3 `zaAVMíàî={Â_®µf\9Êɹû`À£ÆêñÏy´>>>Hë/¤>œYhÓ«ho×1bTxߨ.ٷë˜vJ͵—¦ŒbââÙNsøZŽÙ}í/LÂWî?šü6«j""°ozzZ ×Îή&ç½=HʇŽ?¢Êj¼qö_£ÎÕVU÷n^to¡æÌ_ï›ÆÛ—"ÝËv?àx²L²]¯ÚÉlkÕß?SÀÝèô¢.V§>pæû•ƒT{ˆAôaòØžZjÔÿoŸ)NmÍdœÖÍÑÃ+ÿà µ’½¢»¨›×¼þ´šý³³SmIq@ãßÇ –ߨ]ØEäGÉÒÒÏù‰zP¨ºü’+SKM@„óÜ{I¿ð(uáÚÕ«Aãã¦á<1Oè1 ̨QæxMks]×èüÝeΈ#Þô÷…ºU彩ÛÉKw²ê¦ ;ÖB«>ŽÑR²ˆìupøz\vƒ–áÉ3*eÌMG 2ëÄi¼(njl¤fdL¹£]h̳1Ùѹã5ƒH•ã5ÇS¾Ë˜hAu˜9”JKd)0•²ëzáÅLÃu3†Ñ´á¤ Yñæ¶Vˆ¾Ç»x¯é¡wá§O¹SjÒÉä>œ4ôïÖ¬Æÿi~’"«jf`@âî¾ynÊa»Ú…Ò)ý Px(¿ŠYW“Hd:›:o¬ªÑvÈlÍF‘ÃO+ÅÄ$òTH÷ÜÉTÉ¥ž=–Ì$!ýúX¬w±ëjßhKÚ;m[)iéÞ‘‘Ëý¦:::ÀxKÜ¥ôø™ËŸS­&uqâÙu¬{5Êf‰ÚñÆiðŽóÊ‹8Ùf¼sÂÂ5шˆˆÏpçóF,JÖá‡i^¬„žo:tøðÛ¯y77ŒŒ4Û¡QrOF¬‚_Üc*‡Ê¤÷fm-0>1µþ¢ÑI“»ÙSWTUivïÞeÔÄ,ôΔ6ÓÙØ¶´S puÑèü¢ú®Gã£7 \›PuÕFB¥Ý®p†M³dKýEÀßíZ…<Á{ååå͆[€b!žÿÛQºÀ2+ægÏž}i>¦w|œ$Ç ®íEF¸DuŒdÆ—/_J;:Ž\ºtɰ5ÿ>Ú”ïÖsFFFeoßî/rþZÒê£ñ“¿Ã+ž*mÆÀÍn„‡¦  èrþ:ùvª¦¦Æ+7|'¡4y•ŸÏÉÁ‘è;½’fXÔþéª%U“¢Od9Ýs0Uî½ß°%õ°’’÷îßMhóËÊ‚(ÅÀ0W—54МY˜BáÆr_Ö8ƒšëêµkê¢2 [?jlSîPšàÎ/*,æ·øôŒf5@¨!A G¢T·n“ñÂÖÜÙOŸ>õÖð—¼.õÜC!Qš”o§2ÍÝÓG#wk¸®eN>¯þðpÎ÷ùsAŠÀ,ŸóíÈMÚžúDE1÷ hj޶hfæJ„\>àÉ9e¥ÜËBT|Æ‚ÚÄ]–¨O_J÷ðñ!>el¬ƒë®±hå~ñ‰« æºb w/¦*èìêâÄÌDn7'ŸJâÚåk!¹©]÷š+/ü*¡eØõöΉþ®"g¤ë ,NÌi·³³óÕb—¼ÏýÇî n5ôÄÍšäx;² è݈ˆ¾á†‡ ø)™‘DD Œ+oL:ß;5:Tß, ¬›„ˆ••Õ?$¤*ü´Ö­ÈH`zhу“û¯Ø÷ú±¹¹t‰ŽPŽ7„508*&Æì0ÕE9\â(ˆŽÓì@ų¿šCª¨A“°ò5ëÙÂ•Ž¼‚i--z(ŠtšÅ†K4À^µ0çÏŒAZqõóžž¶\Îw^Ô/õØ•Rç‹ «º½v9ÅšuuT’ëó´Àôôöz‚U×”ÜÕÈ•¼d§´ëä†ÖàÇlÌÇ,ÔÂ}HqHûöt»oÊÊÈìì* ¼sâBÄr&ÖõÒâõ±þÈjîYÖ6Û¢]Bi‚™³d¦<îx“o;rca¬Mš‡SÁëà d{?6vfuªäž°â§[- Ži³®EÈ-MHÞ9Já@æ­zöüù§Ää‘aa4çQAP¼±ñ;¾«¯ØÝ]Ïö”ê:–1`j[[#2®æ=«µ}ýÒ¢û¸VVæ¹¼²ònÊyÝ^Jj÷žR¶O¿ß—P[@{âYccã9½: ˆ¨‚QLP6Èbðúú¥œœœïÄ'[ÆTT".Ü9—¤tì æÒR*‘>(«…¢“¹4²uÍÌÌ>9t»žpw15åÙS ô†3~±§lÏ>qו»ÐªÈ¢"ñŽ"çܵѮŠÑV å{ô´´DYÍÍËëôüºX"íë×ó×ìÒVáê1 —i²‹ —ܺíml0ät<úAP®;o#¢Ï}ýš9/¬çÞ͘¶¼8}Ê£×’’2>;P#]]^~ì«0ï³--í±fÂò¯\r¼³Kýª}=;sήšDVÂd1'J6A¿ ~dĽ{'âáV}2/Ñ•7æ´^H¤]/ JŒLzRsÿÞåg-‹6¦ã³M«‚ƒ •ÝýÑé¹ZsÍ>D àÈö”>V‰}gmcc2½ëê%åÜý²IÉÉÏiŽÊAˆLŠÓk±“W¾—ùšÄW}7q^¹“J €ÑÀi¶çy]É5ï]šé‡@¡ªŽn&&cÖ¹•h«s•ÕÕÒ܇ʫª7VóŸ ?GsäHà£GÇ@ê|Ím³·Â¯á¡<Ó~¤£³sM|Ç»wd$”Ì¥ñ®¾qâÎè•ù‘% N» ׌˜ˆ””•èµI}¤€+~ãþ´Õ¶%CËÆÆf¹[QQ±¾±ñv¼æ^û‰ö·Si vS‰œc¹\5´[pØ™´K_æ4rLAÐJæê8/ûX9Ƥš=Úë¾¾@Ü>_˰¼®Y4uXu~ýñÂ5›öövn^^^Dh#""‚{\T\222²‹ˆŒœ<­“-MôqóüÒÅ0‹¿Ûlmiñ).–þýÒiž½ K+éã —d.W§ûJ5|}Å56ÝÌøG0Û+¥ç™ÑOÞÂU§hÜLH`WŠ iï›ÚÚ×ïf;Ò¨3 vâ&³ú¨uaF¨«âý©ÁìÐÊ»ÝÉÉÉZøþ”áò$-‹ªÓVVVAÁ´E'@ø›w é^"WÁX„ñ»÷1Jº‰¯Œžs^¤¡ü6‰¯ýiŽZN~þ\ìzŒêHNFF¦Bíò<ã"ý5HýÚßxÎðFjëi"Kæ› ž¸¥pLAIéî…À€à$ ¯’d¦MЧ›¯·Ú:ÔìM]ÿó—Zø‚_FE§¼]T ¥ [~~>ÒnôÐâø'/«þª·’‡œºMòÅ ZsûÒ32hXX®áuääö úÔ1EÉncW}w4„ê¦Ëb³·@krjèåh•ðU%åQ ZZZÒ¯SÝÕ-iZ TAÌ?#µ¯\éä/¾8z¯‘pSFN=ÓWIØ„øœgƒ%p© VÁ´¦_6lÏIiœ–mÀœ3 Í]Èæo9c Ê*œ~ùòe…R``5âøŽ—fÌØH6þ=ˆ7A¬âùí¸˜˜˜Š––ÃMɪAŽ+6ö€žžÞ}»ÔÏFŒhhu™ ÊÄ„¼g!¥´ä¢ÃÃÃì@v€ï÷êlzˉ]6–‡€ç³ÅF/õÞƒvœ1226UÒÒL¢âmôffgËS5Óê+ï.aK¾Ï77§¢¹¶¾ÞqAÁ"r˜ )9y…óTpŠ-ANCIIIÈ—@IT(Ö´>W'‰Y[š¡Ñ.t´Šræ/ßôX™€r ] ‘jPë öžJ¾Iª¢>Uótm¼$Aw¸”Gg#ŒÒKKχõdq B÷KI9 ÒÀ/_ù¯¼¤0¨‹ó‰‹‹[;5bDj«…Y=ƒa¡ØÇKž€$b@—ÄLp- nÆôT·ˆìôéÓó“W$Šò¿²<é\$ª_yzd¦ =Ós] ¤z€ÛDÀ˜ï Û쉌?9+hn…ãÔ§cêšÀÇÈh®*]¥è¸·43ÕUd·qc1ÿæË t%ë‹GV'Òr†4Or½Ps¹XÃkßGŸ_úS’BÀßÕjòêmä‡Ç¼22x;r-غ¡Í7SÛî‰XPÙ©òƒ6[U_£ö¯E‰Ñ ‹Çî®Ë¦q“Z3ñ[åvWýþQYŧ{u®KŽX×·Òϲ(f|ïöîíu5oÚ¦M^Aå´ý$ž!D„Vcû’N{„$‰øêÔ7:_v4#‡¤¾g>ä—ÞðPcÈQ+”gW–ûVÙžLÖDìÑìW½4üÂC‚ Ú7o_5ZfDzôqíér®a)t ~œ°oXJ6ø^¸¦ÇÒE1f ÖòìÝëás^4'•õ€VÈ®da‹"[ÛVQ§Sï“͇•^D÷ 9ž=??½4#¼Gzún,~CP_÷Keàn,öKïòœáâé4ê¼ðô­§~ÅPÑ”Éùtgꘌ"ÈâÈlæè úñ]ö¤ª$tëÁ4v§ž·W[í¦ ÚÕy"Wªî“ïn-þH?œ®…9¹'÷ šÁõë,úhr=w–}ìJ×Ο'J¼HTÅðHm_ŠÆ%sÝÄ‹ë¢ÜkWstÃÓ=<óNÞÅí2¡GãÑ·¹Y2üÂ(·¹¶AAK!r©À¡ÞˆwñŠÍô̾WÝpZ+¢?Ö¡kP”)ÅC©ª§gš÷öç‡â乿ôô5ÒˆÚ+/BÖ$¤+܇“ˆð|=&ìHs…ÔÌ•C‰%X¿«ŽÁl5€Úý$9‡Éíw÷3½™‘”–Ú†7Ÿöëì î÷{ŸÊü˜üp iµU$,…ŠOO7d²³ã]I†–{>¦‰¬¡!%aJn͸)瀔ÕYÄsóúƒ§–ˆýöD¸g]}Qæ/í/q°Þ}âÐî ŽÙPÉžŽ\~´× ÂB,Ç.1.›ìl023ÕQ=›Qµw7¥ ~Þïâíej˥ᇬŸì;Ü|ên¼ÎWäüúh¯mú³I“ ³B".Í»WxsP“hŠO&CËH’‡p†™GóC’o¬QÏx|ì ãK‹’ À²=^:ɼ¼ó v·î¨ûÓñRôޝQ^½Úåù|N"¤™9¸7XV׊UΔճgX_« ‹ô€W™Ýê¹CÄ»ký]%çâTueøi½¸Œ}DžD·ÞN˜îuܼ§—Бs²dWÀU—úuqú¤{ï¯]§³Ññ1ߨ ô›½Kãø‰dê—/õ_½%WBRFÂßw»‰¦¶ßQ’Y tgH?!Käò°[*¾®6¡ÅûÃûâAÈáãɆ‡‘¢mT F‡uŸ8Ž4 õ¬,p_-aõ©¹ÇÆÁŸÉ@GÇÛ3¾RX‡·q¸ökðœôí€#î»Y25ž{:^и÷t[ætÒØ½…û!!‚´W&ÆK»–vŸ®o”¢ #•nK?[¨‘>3ј¤À£ëB}ù21HŠKÜU›¨´tNU¾è ab" x´&ââä óÓL» 5øPz½®í¢Ây¬B^|è—aj¿/ú_žRÖ7f¸Ò¸8Œ©‹‰Eúntk—[³ÇbŸn‰NÈѸ|Ä Ä[bËÏî¸hxKu…_wøHâYÎ0Fz>±×>äaKClPdˆô=¾Ç³»;ÊÊ¢ÛõÓ"e¸ÊæÅ›²%mÝóÈï:s>˜7‘ŽKX¥¼¼Œ¼!I™žUí6‚…AˆìBEy)Ö"ýyÛªåeƒa¡‡z7F¯ØÛﺔ)àáq‘t/3öðUάó`YYüÜ­nNqqú Žé¹‚€ùùÏ›z~¸¶£ÕE¦É«5üæ ’]añ LéìE‡Ê>)P|›Í¸ª@†3l8K5¸Ô`v{´¿±d­£=ê-ÂLÑý Ox sçsÞÜ^›¡IésçàXž‡¡ãÓc™wÒîUºì%‘ï'ˆ¯€Îçõë¡ú¦¦³uq³9;󣄢Ÿ6Òb(ºHвf#̺ì¼E¦G§|t#Цçòâg¦G¤‘/lÊg©"*^œÎ gíìxA®U¼”Õ_Œ\ﵿ0õËÛ3„~<§4Ì"™â/¬r^˜ts¥A;®ãN’ÔV·à´2¯•œc»ãÛ‰°Ç4%)¿ySS*oφY=ßБŠ/9w«=¯Èîô Wö;w§¢ÜòÈš‘щtÀò¦®,ëQÀ1 Šèy*r'çq·fYÔ^½n»ßKä€ÚpvåmôÞ®ý¯ù‡ÜË$ßn–¦ÄÒ’8a”B¡ÔdÃÁ©Ø\å¹âšžDg2/?ï™]êÙ;ßtŠmq<ÏÓ¢X˜2*}­G»yL~ýôɰžµe÷éÕ)-:ºP0ºñ‘ÄÒR\}KË%CFàIõƒ/ Šì9ÍÆ1ŠåºmŽï™¸z—îM}­½Yl b.û}Ô¤)yQLDsO.,~ÔÊ”áDIIf¸³ƒéÇ)ý7·>@ ªÔ¯‚/[*A\>¬ôÌ{5ey9í*{‚"ºž$ìÔøh7[J¤ ÿZ…y?Uð~ÜÚÊP`Áv¸Eì–ÖÒ¦ãæø¸Ô!ú{œP¨zKŒ,¹··K™MyÕQ!!’ D¶³ÄÚ&pºŒ¤b¤OãH]ùö‰ï¦žO°üÇSezFcêS©Š…ŸXEa0º¤$µÂ¹ ÈAH=;ÕÕjØè?©þx8ÇÐtÙ„Üþj÷.³DøãùØISü²ƒóžWs)ÇÚ¼vA&ZÈæZÈ«X P±KÓ—7tÄLùmáq¿/–G B\–eï®û’›DÌ$ŽÎ%¡Iç%{DÑ^_Sªgú¿Öæí’X~„x|aʯ5c¤Ï‡ðx85}ó¦ñfbâã¤ä«™âö@Ñlí^4¤Ý /LQh{ЇЏýhè1¦-øÚG#Áƹƙ°Nym1,”9#EO ÷ÆqÁÙ³ÿñpãLMoÍ®Ïy´÷J–÷±MuS‘ÓÓÇ©ÃYÏžÝÔoϹ†».†B­.¦-õúÝ!%Ó¹Âreîþ3Ô)¾ˆž×«_Ná&AEª( ‚˜Z¼žfªÝÙU·É{„•cWkª »ä®$·;@Î43n‘jl´¶»Ä¼hye`˜‚â[¹¹Á}–ÖÆ››E7mÏt¼|¿’2sîØq¤ã{ë¾ Yoäök§š ÔY7]¨‹ñóîÑw¼/I%MKËz[ˆïBÜ#ÌÇ,;ñvVÉ%«¼ÕÍåŒ× Ô¨„ßEÜšf””TÖÍ êK9AÆŸ¹jß/¢Ñí§ßÝ>Ã|ÛëQ³¿´ÍÅ»Ç=U°äL˜©°•ø N,,…(hxÝ4V“ÔµU–NI“* ¿ÖîýðkHùb: 3O5`’l«¾T~gk",É)îÆWr½ÓÒиv!uþ¼õP“BÖBÏârü³‹A\‚,¹´Rt3‰zò¢t ¯‹|iC²€Õ‚ûþïÒ{_ñcRWN``Ï?5:² hãúÃÄfÍÓ\¼ûb6ÛƒbËD9‘B_Lið8¹ï¯‰™cÉ(#tƒÍÍ?î9>±ûÎ¥Ú(‹ŽâÌÅzéû¢¹ ƒƒ¼K!MúCôý³?¾a•t“SeçOÚËF ±ƒÝx)QäLq¸ÅÛv7ßKÇÔ½×>’C÷–ÿ6´°ÃÒEbÍf>{D}½ö‘ÍÆÆ«,ëãUKËe£E_ÁÐ=ãÎ{Ò.±xÆw+Q0 ˜BPsqÙ·8EåÂ1ùyˆõ#‰õyqÛÉϾS†Æ#N¬‡*äç‰C5ü.»rÛ œ »ÛS7-™ 7ä5Ï#v&wæaÈ!¢eæ:sþLɾæÊ˯u ICç†8ûEU¼hXãüUÂ1ke°„ÀÛo±s™Šnɽdpç*ÝöiŠMÉFÜ¥Ss9M¯ˆ°¾e+xd9%©Þ"ñÀWÚk Iç¯ÙÞ²~ò„k4ØWMëi[ǵ¢:}ã9¤G=Útïn;7/·Ç¦›Tu)Q‹×Å+Ù»øž=#îdLß¼ DÃÚ*¾ ÒõÖINaªCLüož;›©{ „®²,Tgb’ìÔÌç¦BõÀË ûëöÜÈ7õx¹®û2Ø-í¡„“ü)iY¡À}ë×«Ñ }d,¤Ý­âa¤Ò”åø­“Õ#]õ6(Øgsº7+¶½díö’I™ 3==]Ù_]G}(çÐû˜¦¨¦ü›ç«';ËŽÓtDúóì‘QùìéRÓ¡Üïï%fÜ!ŇpÃêÍûK¥Gƒ¥gÆÜ/g/Î;2v£õìšTPo§/¦2ë°¥ñÐkXðìÒ’ÕýhÛòʃõ,”Kuƒ¶I[\Åcez«/o®ÎU:0/§ÂÒf9ƒ>ÆÃ££ß'#¯tÿ#‰r |V7‚ᢷ×K‰Xs®sò²BFÚ†Ü íaï!çz(ÜÄVJ¡¥ŸtÚñÞß”‰!µÒ7=k°f2 RJ¥È,–nwI:VV×å‡aÖÖ7-‡ëÍY¢bÔp[¦8—ò¨WoEb“ýtP¬èÎê3W[K8Ï>˜O“µÈ'©»!7-.޾  ö ¾ï+ÍØchÔ|P—Owšu<¿ò~)äqë±ÊJR჻©ûCÙü.ÊûM)0õ4ñnn0ÍOuï*Ù‰ü>‡p^ü\ê¹'‘š üÝž¸8>Ç¡ØÜå*r.Œ‚»¶Ç£aêîÚ³×±È]$´W¤s&NßÈ \Y8{ûö Âóââ,E RsH‘ò¦&Ú¸¸¸S*ò‡dgÄg¢nÏìíÈ4¯^4éàW„uäa}ÆÀÒ5Yê{~˜ª„Jâ̽Pɪ„©â~Ñ9nÞpôøG½°{ZÞMÉôRB‹ƒ¸¥¸0¯lOµ¿*mi ãáí.÷ÞO)–Ç/ó JÝø‘s­—nÿ:];Áüó¡µÌ2õPµn³'OÌ©RÓHzùùÁÕñülò1þty5üA_‡#”Se] Ÿ Ý Í%'.ô}IŽï«xÓ`TËPÜÿ¤èðiÊþáÈ}‰"Ò‰Ž¦¬©–·oO¾N”v dÓóFt÷ï·W45{‘8<.^Ó»sXÏûqĨ<ÿÔáÃ-¹ÝU_»ÝC ̈&Ú_T¼ ÍÖ/Û=<2¢ªšá¨úr˜é\‘±WňÓ´ð×(¢¾¢¤Äã25SO§¦eYc|xCØ…áNÝý³söK!_†°ø9Í­e»®z•ß>Ë"Ÿ!îÈ^U슰ú¢Àó‚˜P+D 7%©ââun>ºeêo1˜05û²Þ¢Á2DÔ‚®eèClÅÕ‡‹.1³۵µVVV ¨xÄÆ²|þüùÉ“K’~e¤ )ÿÔí~â™É‡g‰ÒmêM²µµ¦Ð#"¶¼«“wÆÛ_¸_¶²:Ù u²AlðÅÚ4Í6¢-øb\×‡ÚÆºlŠ1)ŒŒNvH¢÷vˆ[²Ÿ>ÉÝ#¢s3Èå]zƽ어 Ó,²f çü@û5*¦ãRkþ‚Tkf7UmÛ×S5uüƒ¢:E·"ÞD.]¢$ïdÇ»¿’}Öíì}Íuêùó9Œö%T^uG{û3Ù@ºl·õèž={ZSÔOÐ11½kM¿\¡¤¬¥p -hð«–¢‘8„ÂÑó]½Õ­rîšèc =?&Èìó«°Ë::®®®­™z’ttt\î¦ææ|W²ôw "UUUãT’Ø™™™ÙÕx ×wkÓÒx,öµa'ÔôS9QÖü¼-aO1)éxŒ¸³}ø233sdffæÚ¢›Û"HH?áÖ•¢ëBwÞbgWÓÞ]iq•Aù Ùå42ñçu»£¼*Œ ëÇ›åå™á®¼¼ŠuߌÕìiÑ>V¢€×Û\2y™À(xßäMáZ¡ö—&À^ÓìH³‘FŸXànŠ>‰ýü™sp|mÏ(ú(H|§Yä'@á‘Å{…OÀyÕ"2e„s°··æéµÕ\UÌFWL¹ýׂ:·)š*Ê`×7R­\Ù@]¸N>-dùâT/ 3/àA îÏÌÈȘ%hðl¨.þù“'Ü‹‹Ï¥ý(OÞML}°Òí¾‰kooçA"#ÓÑ=»u‹ú¥íˆÚ2F>”õ½ï#U}}}Úööð+ϰû¿v: =.xDÔžç¼²2 …¦ÔÅÍöõ£ "ß¿?E ;FváôÁï·Ð&m!Ý%ñЪÔÚ+&d ¿ÕîZ§¿ºØ‰ÕÕuÖNV‰ÞšAÿl²³„ðý#0‡ËÖ³äÅG[Ó@,x¹>jßÚH©Q/Ý—ÉR«âÝÄø&’œþ#ÿãÇãlÄ’¯ì‰RªwxNèòäe—jÕÓ€÷o$Vyn]Öáñˆ¤cõ\¬î?Ž›e ¤›k£ý…m„çkJŸÁa¿:ßnìK.¿^q-2ãää4kD{B{úRúEC'ÍÃ-ÀºjKK=dedîÆLµôß¾sg é‘ÚIÚNΕ¯_Cˆx„„4Ý6 ïæÈ.„ŸÖb ŠˆŒÔÆ¿»9ª7ÿüæsg'#&ý]¡f§¼ñê…ãr ¼ÚÚ9>²l ûJ¾Úæ ˆËi8dþÈd/?=¿£ˆsŸík#ÓüœýGsƒ¼¯]­e…auKHë´ÔsǙ»ÀÏumÍ&Òv*$WäbÝÉ’u{Æ¡:ÉÒDi›'uŽ…ãë_>ç‘L/ù8Ä'˜h©§ëŠïõ8âMÜÅH GVMô#h4W^ò»þñ=Õà{ ];¿ÜŸŸ_ßÖæçéy6ÊÈÇÇGHw2&==ݲ§t—Ëâ'ƒ7oÞœù:ÙÙ;1qàÊ•+ß_œÐ1/^Zrô—ád``HÐL»4;‡Ãt $µ¿Ô,”œ¨ð£ê¯fs—ÑÐ84;7·‹HEE¥e0cTBMPCƒVM^*‘¨³ Wöë¤Ôa2ÁZ:eª›­ÝÐWÞrwP‹'ÍË£–ü3¬ð«Ÿ=œvÍM·Äëõ6mÄ£7J— QùÒwÝ«“¬~¾úu&9ùW¼89‹´tñÑ™ÁÉÎÓ3Â^᧯õª¯SÐÖÑá£d+ŽÍ~‰½”~)R´¤Â–tº–ÇyŒ¾ïó±îwgQ÷ruHåImñŒ‹ÓÚ-ÆË›Q»~T.¨ÔŸæ(û·ÔÔÔDôôô„½Càs¨I÷*œ?rèP‡ììì7uuò::Ñ…Y!wº»O3—ww³…„„ᔕ•+—fúgCôëÎB`°×UÁG¬¦{ÊŒçFÇÆ´œØTA¹íͲF!tÑž{¡¿zª·M_èfb³säWn[É¥ …²Å´ŽìåÌ÷K#ã,Ç|³¥Ÿ‚Ç.‡hóïÕѱìÌ?ì6Uš€«éÉ·;Ýæ%øµ¯è«HoÓ’i? âÇì~¦µ9‰ à…žÉI£¦•Då˜Ç.òê§ŒöWMÔÝ:tÛkH•˜ÚØÆ±ãu'WTiz()o{š»^»½½ýÇ"gÄýØØ°ØØàš{5S–½»ùôŠƒFš’öµÏ%qóðx+qyåå Ë…0¤¨'£A4%l"˜ž¹‡ð„nv¶ç;´ƒïcüôÜ×çååiçY'¹|b®îÍív«nxˆ24ôgÄ—67º'vöÌ"S3³ÞÁÁK\ciC@Ù|CB(¥¤¥A¹žcޙ߾ejþSû¸½aðÌÜêÉz±IçuŽçÏWÏu±$¾|Ïûò–’á7¯¢îvÚaò–Nõ®Ø½|lve1·D²[uôšQÊÝ`Ö¢¨…‰Uñš|Ý&ÒÒZW¯¾£dÉ¿jÃç…yÑ­,ùwÓEL³('©¸3Uš¯Ýsð©AvãîÊ럟3yiÑ-±<|*^_ÿâ T_«ßÕÕEÆË‡G‹Š b× ­—vc—œbFûúЃýýí/Lªççç#32xEíÇ#]ºîßg&ød¼™Ù{ ŠH/¯=¢nk¯Öܲµk‡¾„šbËüœo̽!dÑudd$pÊÆÆvizSœ¬èÓã•{zn(...%yy?a‘g>äô$$$U iv™>ÜãÔ êʤ¡LýGAZ£ºY^xÄêTß!ÓŽvôáÈÏó9-›ãš×ö®.õL.N0lÅCFZƒ§ ƒ›¯ãÄ–}Þˆ|{Þî9‰ç”ßû‚ªË~ŠRÎÜœFb)መøµú´{‡»FÓsÎìS!2![ ‘òÏO(Ó#U=lƽ0ýÈrÍ~±ä³töÑérX²‘6ÄpW;Ì Xh¸¾ãF$d×'EÅH—Iæh†–5)eÚCóTìna¬ºâ}}·ÕhåD‡ÕǼ9‘qÁg@5¿•PA+-J2>Ñã‹ýy¥úLu8ûn]l~õ3óTáÕ6j5âS©ûU ‚qÜ wÇ™ä¸ÂgqVW•õóõ<Ô§zܰq{ø”á9­[q!ES%TÏ»Š èU{h6ß91Â7e‘ }Y*éVëÀþ+ !À*~Ý÷W@BÃŽTú.‚$Š ”®Nž‰näf‘‹Ð—ÙhjWüLÒ£JTVWW¼KíÓ£x¬uCÜy±Ù‚½‘ú¢ª²?—Ѱt ýù›4Ž'¨%†\¨—aU&îg­y XNL’…˜0 íb?yl¯ßçΙ.DwBõüˆ…¨1çÑèèH1KJ°‰ˆD_vÑ<ÁÑ+¼¶.åÊb²s[C-G§EEÄ@8<+\O]ïyäNPèÑ5„pæ8ÊS" 89ÞƒŽ>÷Ç› ›vC=úa•Š{¬z[ʳRf”cÑÂjÓ³‡Ÿ>s_Ó¤¶bŸwº^¨•|èƒà"ñn«»æ½åD{‰Å_ç٢̻¦£I û¬•öv]¯¡¾ÃµP–côÁ°ësÂJ”÷#…}3çCÛ•i^z0âÖ-|#oi™³ö ú7HÿâÇÎü(£ÏŒÝ%w6ªZO_ÉæÇ²QØ€v‰ RES5=Žv-;rç­%v‹•“ÇÌ.ÏÕ›´M)œ{nPwÀe¦’fiùýëRÏX­Ãœœ*‘nk¬ö“…¾î›Ê?”ÑIŒ> JÔMp._âxH>ÓÀÊtËŸúx"Èn|Gs¶eÊsœN#â½ÂTÖа€1ö”ª0µ ÌuÌ™^êvÝÔãß¼yÿó«¯ÖÕÒ’Òõ÷²¹O“»IûõeP²@ðSºg*Ч5¾l¬Ë±1Î QUÝ>. JÏC33Œ„ Ð îS§Êüiì#ÅWÅmGmÐ7Ÿ»‰u¤‹ðûrE˜Úo°OÖ”Ã[„YÉôj[*W1ƒ½¾qm"„ZˆðlypY̵¯ L$gK§”;¬×,ëM_˜•dêž\ùT䌄\‡Ý×z*“yAr@T%‹;ÜãEÕZVþ€x÷nüYîæ ç¹‡ÃÞ2˜ö¯úVj×¾Á4>’ˆ„”Ѽ6R¡ ­`“çS¤‰þ4\–J£Ä"cØYq+¿ü¨Ì2ÈžA¯Ûp/P½f¾{ý_WÔÖ†„aketn®¹lV(Õg*6_£©.—ê”ÃQAeô¡l’ÒëՂܹͮâM€¶õºÓüCTÂ3 …rnŠ Î·¨*ZEêÝÏÇL@`KxGâe’Ûò,æØ‰’ú'‰ÍÕN èõ:¿§Ñ‰lt “8²ÂX5â ê}•|BmsãȺx?7ò÷Yí6 —†°ÅS‰ŠÚ÷7k_½*ü[Õ¯%xS²èCLu«‹üéäœ3¾¨<Ê÷²cq¾Y.l¢­h=oœœúºÄ“§Ñ¦){¬ŠÏ´8‡qÄidéÍäQÄÆœÎ¼r)ãÁ¸éøjφ˜˜þ;D–R á=v@×PåÞK«ÙÓÓÃ5Ì>EŸ^Waq©Ø¾~´ò¹8ˆè€áYE׿T“s\˜7ŽDV |·-Ø…8ÙNJ.^žDݰ¯€•d^—bÚz­H³éubóùoøç}=/’·T=ÍöwyBW3^Iìí×_:Ü0üÜ’ƒ¹¨(ç­/_è@‘¹òuÊCÏ=8DŸ/_õÖ'v€|ô&¸iimªxgå Ž6Ôàë¬%J‘ù¦Í±z‹”‚$4„óQý½EƒÍ¼¨·Þþy„‡¸ÐÖqíJ .xÙk°b ‹bÓí,êÐ7‹èîé__Eõö•;Ü?jQˆq3þý½¾æàzEÕÂY%”ªºŠ–„ú:gïÒðC¨ Þ=Ç¢Ü!çÜá¢[ì+J\µÌÁõµQó * {d “šÃ@ ˆÌa0Ý0$`뼉tconcë£m—Öæ H)}«—ç 0Õî˳H{ ƒÚEåóEÂHÞ&æ9^?AÜI!rXÿ®Éh¬õ{y°r»f'î…ƒŠû7(6iM¼ZûZï\ÉÊͪ¾q–R†Ú³w-—ªî÷ ïÉþ†‡–v„ô±7_nš%9XöÇÜ)®ßlF 7ù´%6N-KH7¿UúÂE/}EÏ£uQŽûDy‘*g4—X8Jmá€ÞÍlv,çÄ‘\ 1|få Îò¨†òݺ|º‘äÊ Ë©<åÝlô—ž¾f”Ô.úÊšyY÷mÍéªéÞ±úœ”]!ÌQit®Q÷¶w%—VýÛù9&md¬¬*ï´²²–;çÖïÛǼx%H¶P Å~£HÂÄÓò¾j¡Ê¡•ÏÇd :žðÞÍA|¥4]ÅÙ"œcÓoÁßþÜn³*†ÂžŠä^bÞÞ¢+•óóW™ElØ:âµÏÎ79™|eÁDÏB¯öíMŽ;ØóDÁÞ°­—èš½D$m¤v.´'¼Pp ÛB;¦Ã‡MÔ7]!÷è•nVP%bô=¬ªCÎ>y¯×Ñ‘qe³ü‚dl¨ôz† +®„øû#,qºWk®Ü|á0Uí2b.-\¥ŒØýŽãpô³Vbâ6ÜLiZ%ù¡4ÿ='ç¦plä5<,Ít·Ññ–#êÚÁ'²M‡;Hix.>z4vê”TÎ˽iïÂLhì_0ì[¤:UÖº‡w4èY]&¬›b„ ŠZÄ9Å#º¯zävë‚„?#ÇÍ^ëùÁÇ'žœ4’U¶:Ò>V0sBï4äôÍÖ:.ÎØª‹Ê2ùŠô—RNkžÃv¾/Ͼy¥iu>+olP>ÔÒ|Bgíø±½™•U!Ÿò¼:‹¯(ÇlDFÚ‘R¹»ÖÖMMNžuscTS{Ú÷!öÔ«‚ Õ¼ìaŽåµJl0‘xnÕ•Ë{ŒÏµ×¯©ÓSÈî˲ô«XÛX•íÈ©¸ø:ŒòÁþÄhÿy¯ú´æ)î³}ˆ¤ž kÈ¥RwqfTM¹þñÖU"Ç[á>÷º+}/H”¥¬àmÔ!øKÔÂèÃHÑ6š””+Õ¶ƒE‰‰‡‡>t¾þôQßÞN¬§çàííˆiŒÂ´z]mõúÌ"Ié=lÄÊ_ª~å<Ú_Á’¢EæQ¼·N’nƒ¶ç]““ Åš™des^3£_¡M*«üî_Íï öM-/;6¼UÚµî`¹Ÿì(iNÏÎÚ¿]:P/Ùgµ2/t5ß–>"½—ø}µèOû õMÖ·¨Ó*gYÚ0†Ô…ÍýÙçŠ^¤60+›¹Ñ ~>»Õ•—SK4v.8vÆDœŒøC¦•ôÑ£{ ðRØë¢W^W땃åLÜ ³´qVL3°søÚÓ˜T  ²Aå¶”Hg3ˆä<öšÜÓs¶âÐÖ’.Ó™ ¤lî5/wZ„)?{„\K»ä]° ̬¶4pj¡«X÷KÄ`Ÿe곋--« «ÿUÆ€žå2‘[«Ö%MŸ:×^:ÿ6×G3+^C÷Pc­Ì’¬A N:¢É‰‰ÄCs-ˆ´w L/ØU/NÔôŒ¤äño¶tI”àó§«Q†ìTª:O¾"/ò8ÿ&*ÁÓJ†‚jÐ6,!.¥5Ǹ殻&lª›uöã3HanŸ¸vŒ‰½òjŸ)Öϯbª?´—‰:¡¡ý‚æ%8ú}4†”té%ë]à۷É\VŒ8fgÏAqï° Çæ²Ì:Ô>v˜¸™&¿Áhè™0’64ñè£ùÖÄ_~ÖÂõ @¾#­ùt¼ç²±€ÚÓ¤3)j}Ĩ¡ÔXËl‡†ÎKƒ^T#âBxõ\‰Ça—艾XïrV¨ñ4M7Dƒ–æ¼]sTVVÔöuŸ:ÚooF°çŠÐðX¾´”»ë|hüµ½ñB{S³÷ÊCyTž9 c-:ztÔþ¾Øeßú‹ô¯òSÝ“ƒóóU°Zý®ŒééJÙØq:¾íµª“!!!Ó³³×ÍcYeùùd¬Ÿ×v}J³ôM-õ¢Í ª ›é@_™cì¾Æœƒlïëë³ øò’÷ԙリÒÝ}(ŒTùÔCL2Ç®ÓœÒ ”3fdTöñ©4_£´v"^‚Ä]à c_Ï µËM™ÎÔLÊŠƒ¦¸ó]/&ß4¦ Û?E¯,#â ØkøH#U×e³hþ^ÚG*«UûÃׯ_ïíC‡..Z+EÏÓöõõy›«ó»2|å055µäX/Ÿ’ÿô©&é´Ì£´Æjó:>š°8ÚŠÞÞ11]9ì—S¶ööT¦Nµ6T‡磟Ôí½®îçB¹GˆfD€°(ÕƒÊYèJžtm(ù×ɤÄlÕáy­PÏÝ×䢅98î–\¤¥ S†Óåƒö˜'\œ´‰‰‰ÜÜÜÔùÁ(!¢¢£ã/oᬒ -‰´MÃ^:ÏÏŸ¯&v°s6:+•ÙR•¢ž¼w‚ãäÉýnnn{Ü»²1$|zÅ<úò22+Õ‡‚rá* MXé•d/^ºäëGÅFøQ°°°éùyfÇS•O¯Ä­:jiÑ«ÄKµe>|øpÏää¤ÿÍ›7bc;ϬûÓ?HO§ F@Z=CC$’’’¯««2ïß¿_AAÁ#-íôíÛ·}3:š›½Ê‡$ää‚ÃáÓ_¿²­ê±Ò„•:&Eû+ø£çá¡ ç×õ ¥¢dFz”‰æû^_«O”~’’R@{²·œ),̇/Fµ  V'Þ¼}[6;P/ìÜ]ì)lÃEøéÂûœ2:]á{àÖ[¬¡±1ÓâLU•Ü!::t]œ8á5ö×hhyE…ªºº×»wï<Û,>¿¢¥¤obï›U¶§æff¼çΟ϶R! €ee»P(Óf5͈Hˆ;øK}þ|g¼²²ò."2ôÇêø}2³1Ñ –ööûˆ>¶·o$ºŽŽú¦›˜›S >7X±¶´\’6 ¦ &!ˆ²Ôíâ·ÂÉÉÉ»]ã<=ËnÙ¹¹;¿ÊñâÅ­š@úž²#êœÑ ȳ20J0,á}¤Ë„UÒÂGÊ“„Š•§;—dýÚ.=#CUUuWø9¡ù”””–66Òh4'V€Ðqëöí¹Š2žƒxã_‚4Û""LH§Ùc.®®(SS±>¦²²2n>>_ &NNN9 ‡ÍõáÑÑòÁ÷14´´{ØØØ2 %99¯áëK&½22°Sžžž†¦¦2W¯Þ¯ÏNzõ ùñãG`¥×†/ùûËÕó£ù5H%Àñˆ ˜ á" )¿(--à0FÓ‡-0p„Ey›{øÞB),*ò1—¶P(„—W‚LŒCæ‚´Æå‹²ìõ`¿¨)¥¤(ÍÎÉËϯ%(ÍÏ/£!î½5 ”®a2·1²5²0G™òó˪p²sÚÚZŠðó;88ð9òYXðk¨ñ;Æ‚:;åµýMO>¬-–̼5¡£™©¹ø Þî½Õ¬|˜álQì„¶¼8+;#{qNi s[œ¹-¯†“%Ž“³ýMœÓçh»ÝYcˆ²¶ÁÙŠkjÈñ"9ùÿhm^ͳ¼Òf–([#´éoÇQ”þµ9Ê 'Î ø‡³FÙZXÿ¦Ì|ÝêakdkŠ“¸pñ¬š¢€»ü¶!Šño_&3527a7´Æá±(´ ÆÆ†“Ýg*Îicëdг1Äál9ÙmÁ²¾­†Ð€0® ÆÚÈÒö·wŒQö¨í«œì6ÖqNc+;œµŸ± §„ÿöŸëˆu2·ÁaR²ù}ïßÐkƒCYc ù·?þK ÿad,ÊõÖð#u§¿;û1n¬ÆÎ õ$Ÿ5Ð9'n¼ùG¸O²;³™ÙêmÍ}R”Ýõ¤(Ùó蛡ýwØ ìáÿ¦âh ¬øÀÙ³aA# K°‚-c-ØÍ-lÁ`fö8v[C#vЈ‡ÝÈ–œbL-lpXv´Ówç`ß2ï_Æ!è ,‰`M@ãLq윩©% cdn Î áÜún‰Âb·¾C…Ž"f»M8±fßZ°Uœ‘¡­»ÜÒQt‹kb¶Ø­I,­-Œþ˜ZX¢Ì ØQ¦À:”ß·¥ó­…¡ Ÿ½Ð `Ø?ejd`Îù}Îotñšâð`fŸÎl{jö_Vø­ÁH·9†3³´ubGÙ°&Û²U”‘¹Í–oñtæ: …CDÅÌÃÎ ³æ”àƒðÁÙ¹­qöF6@Øí·.œ"¶gçÓÿ!hk#žSâ‚%Î\ù"ûEk”Šý¬9–] g@KÑÜÆÖzKÓ,¬å/À‡õöÇ7màß’ád«á–>àÀXß\»%ÊÚv[Ü„òÛj[~ôLÛþ ìAØÜÖq) Gvqvsœ»ú÷ïÜœ¿Üâäaÿö…“œŽçÄv³?˜ÅoXc޲·¶p€U3EÙØl{¾m)²‹Ù™þ檩‘í·à–©‘„ê›a™cqŽ|ÛaaKnÊ@ªÛr¼ˆ2À}“? ü:þÑ– Íc¨áL ûu›Ÿe ’Ðd€ßÚHckgýg£}_4ÆÎÚè篣ãLG¥áÊŸöíô7 WþEn¿ðü×KŠæ(àÙìqœ¿é¸e ßZlí7÷À]‚EÿfXuœ)Pôý®Ê8HSÂMsþ¦ëÖaanf²-ྫྷÅ9­q€3æ¿*ßóߎªnháÀ}òßagû—#(aq0–G"¤ß®ËÜÒî·öÀùÛUÊáL±œìö(S;p{û'; ƒÁÙØ˜àœÀ¥? ¢ˆ8ç¿Ò¶5šá.7ÐÜINöíŒ6µ³þ‹¾[öö‡Iv–ÿ¶·´!ÊÜdz'D¸ßqá›býV¬ žþíP¿åŽ4!îp~SÙ_݈ȯóoµPÃÙØ™ÚÚhóÝ’«Äïui«•¢™';ÚÂKPÈŠµà¶Ôêlà_ð«2ÿâ›·¾|71~;Óm_ûÝéþèž~pOÓ?ý±Õnû%ÐëŸx‚oUÜ£þ’PþÁpµBÁÿh…DÍYP³ÿ„Ãü^Žrªyô-Éú)·û}‚½þ0 ¡ Tºgˆõ? " .ÂçŸSó—Âúµäþ5Na¬-~J`Û[±¤¿v‡-ëa·®äB ıu³ €…å½?¦|?xémËûæ©þ±#þ§îwË-ùÍÿ²ÛyœÓwïôKº³½z#¼5!sûíê·)ñ–saçþMŒÃ£Àµ“È‘œašïCoO¿ú0{ #,7xÙ­Û¿ñK¿¸˜íŠðÇa9ÿ`ª­µlÏò›UÈú®GÛ•$¡á·œ” •ÖÖ» |QOãÂyYu2‚ÿýÖ gúÝñZ‚âU@OÏz+µÔÓ3ñGi¸¥~GQ$ Ãc` …À„Ñ$%ŒÇaP,‰ÇpJlwÿ֛ЙÏpË·nkèw*4ÕeÕôÔdå/¨ü5`åßÑ$,ˆÇá±(˜0@ã…`Hˆ0‰†£á8ñ¦­1þ-a[fókùÎÅ_Mf ºÀ[XØþ š "Ûïí~ͦ ­¿/nû!æ€Bè›Íïn7C™jÔp– ;ÚÎÀ/û/nÁ ,ÕBÄÆÎ’pÿŒ ÆÂÇkI@:8%þàâ·Un ¾lOJ¸ô½" ðQ‚ìßã??à¿x¹ÿZŒé/ð?( "ô/øßÎÿÿãæØÁÿvð¿üoÿÛÁÿvð¿üoÿÛÁÿ¶üoÿÛÁÿþ—â ÛýCÿ1EB ` ‘p(‰@"!p ˆÕA4¤S gÀÀ~š¢_3º¿AÓŸ¾õ"€„aQX(‡Â  +‚ÃxêáÑ;oýì¼õóÓÇo÷ÿÿ¶þ·Ž?ßÿµì÷¿ÿ$¸óûïÿCÇÎþÿÎþÿÎþÿÎþÿÎþÿÎþÿÎþÿÎþÿÎþÿö±³ÿ¿³ÿ¿³ÿÿ·Wø÷¨ûå÷ þïÜÿÿÁ~˜àßTÉ£[1SóÌÏ,ã['ü÷Nø¿ÑÉâ{'‹¢íß±ü>ˆåÎ#;Lüù#¿½LˆßhS Œ §„ÎG¨Pìã`·ÀƒÈaÊþ½À«þ^ÛÙð€ðnmDȱÁ)`„‘9á„à À $Ú¶ß\ P([CvB¡·…d8ú}¼-!ò ¥†‚¿ÂÀ(sŒ!0 ,óWk ÍËŽaçµh¼óƒÿ?õ´ÂÎó0cà¯õÿ]ñ¿×çiþþÓ4?Ét‹ïL·ø=Óÿ7¼íù×ü±üÎËßóçý³Jÿ×ýäÎÃS;Oý­‡§þçšþ?ö®½ÉmÉÿŸOÁ›Ônm²±L|:Ž«œÉãæÎv\±}{WwW³ Îè,‰:JcÇ»{ßýº"%rH=FÖLšU»ñH"Ðh4ýø½­ÂÚ˜Eà©ß;xŠn¸%@Ù=”æ5Ä„t#¤!ÝŽtSø¯U6âN0F=÷¿€•ã¯ã¿ðJÂá!ü×)á¿0 héü!ÀF0B€Œ`„#!ÀlÛU<v0¡c~wèmœUÒÝøX™‚ë¸ýYÍQÁF[DH7Q±á€h\(`£L'à¹æJ¢ÖÔÛNÇÌo^|ª´mߊ°®/íËje£HÀJ‹³ü`¶ÄßkåglÎãtyýÄA+7/æñéÉx6¾|¤Æö§1Í,—«Iˆ­¿.ùM‘40Šeïcà°B¹*Õrn‰­u´¬›´–¢¸W÷ ÷_°<Í7âgÊÆ¬ ù|f>UvggÎ屩‘°:s6`,YËvµsâ-zV(+—A½$üÊ AKñU÷ŽÌê`";’േƒÇÚAb×TÌë’›M†# o¡ÌiÐ×cÐÒ:eaÅ´œ–™eü-“†µ†¨uC:]R¦J ©zD¨ ¿;SÄéßÂrØÔ¤×zÄÅZŸß€‚{/•Èè”]iå ŒƒÅXŽŽžk45SŽØ>r µå î?Ë\wm.š#YK+bµwOà×JƒÂ Khn_wŽkâ)º;V¿sUROªNê7Ru"ßÌËK·¸ÇÕ-­iCóz =Óž":–²ÁÞ `8ÝBå¨íþЧ­ûšöQq®.µ3×O=e|\í³¶~»¡‡š4O-ÍDmÔS"‘ž‡óèüo¹y\~ÅáÁ}÷øA°–ÿõ¸Kõ?ŽòPþ÷”ò¿˜°Tü6ëßÊÃF” ¦l0eƒ)LÙàû› îÎü";LÙ`ÊS6ø¾eƒïJ¨×´@K[úÏ T;áNJ¯±£mÇ~†Ò#í„íX|¤Å7.[¬ÙçGº­£÷:ŒiIÛ”þ”ðRA¤ÿ˜õ´“¡y< <î…]ƒÐ[GþâK!“¦Z¸Y¸Iøiº±/¤ÇƒÔK²à¶„÷_ŒgÒÙ•ÕA”áAò äžk;Ž1;Œ¼Äuaþ×ÌêÈM½0³Ã8ÎBz,ÊdIœ$Y–ÚNp¬v¢H —9íD2Q’…G0_ºÜµ·d5Û•Õ~$d3‡ó$K\OØwÃ$’‘Ë`ôŽ{`V§’pêxxš æzQ„Yè„2³»`µðýÈöBžòÌè.˜SOs0½®dCYýÏbqžO&b¾ØU‘…vâáe)Nègþ“Ù°c;à‚ÛÌ œŠL1ÿt1Û‘–O4‰B/ @Ÿe<ŠÒPò0Žüx8 ¯‹ñ0wÝ_b $d2ñ½–8üŸˆX$¹$Nœu«·&?‹ÅrOBì0ð½L&2ÅNêË4á!ça˜eá͹Èvì: =[€Žu$ýû‹ïKf ‹¸Ÿ¹Ãº!öeC(} Êß–÷y(Ž/÷ƒÐ ñôò:^åãåŽ$xìsLFo‰HD–Ä‚‡)^X¥I¸™¾½Æ`ïb׉ð‘ù!±ðl˜Š0b1 `Äi2P ~AcQ¦»®RW8,Ï—¶x­g>¬Zu6:‰®Ò_ez£œ¤©ðYd;žÒMdb§nœÒN…Ùi&dÖ©¬›T ý·3#„¾-c™¹Ø0%6Þ€Æ1]&ìa$¼›-Ç;“‘¹Q;´/c?´C¥™—b®4òƒNë FÈ䓉Ùu*xê{ S°„ãË M`iº‚Ö ‹tÈα:¾# ºK`­€¥K7ƒ…ÉÜ0vÀ2õÃñ;R!ìan¸wbW: <Îbî fòáC¨@œÇ¾î@&#ðB8ÞÖç ßv²ÄKÁ|bLK zôÀ†“oã=0q˜±çÁBŒ‚( ‚8âܼ0íÔûN,‹Xš%< „‚»e»Ò+\ÄH˜”ÙPÃIñ{/‡˜º¾ ³ ت¾Ìl'd!0,*&퀆Ӽإ'Á0¶pÀ^Œ“ÎÕ¶³S†˜ßYb¡ âÂÈϤÉÀaÛ3{g—À¶E˜Iî¦u˜€Äeú 0ï¡ËÂôÀÌöüГ¾ðÄqÁ=ðaš3Æ\XçžçÆAg¤afg©¯,n•Jßö$¸• ö= 9ØûBÜÚÏE~3ß#Ò"ÃdÊÇÛuÜP/H#ß_½Å…¶‚Ï ¥£“3.K}¼ÒÑþd1ìt‰ºéÍ ÁKC8C7{ìÿiâ¿îæü³7ð_(„ÿ:ÆCø¯Åæ‹0_„ù"Ìa¾óE˜/Â|æ‹0_„ù~Êö0Â|æë¡c¾v½tÅ2ÆÏ73´I3}Hi³Î‘þåcý«FÑ#Zxª^\‰ðg„?#üáÏFø3ŸþŒðg„?#üáÏFø3ŸþŒðg„?#üÙ=ÅŸÑóy…ÿ«çŽî žú_xIãzý¯€þï(áÿNÿWåj-“¦%  H@@€€$ ‡k˜CïH€´ß mתcíîÑ! ý¯²Îj84óI µœÈ%ˆÞå/`¡4k!ÿ‡±{^z}öìµ^šDmJ+u*Š«ñì‰åØ`c‘¥|„¶|¦ûÇBÌ¿Eåv-ÐŽX<ð'Ui–ïÎ"0·ëšïVÛÜÖ5ÎT±PX¸,¿;cj‹RmÇùr™Oô4¯¬H×4oÑ›é¬QŠM\—UcôÿÿRÿÃÌ\U‹£fÀš"-ÛÐýú.é~½Ý%­Ú/ÛµèË-ñè:9%Qõ"@z@ %¬3…Ò• é¢gk^trap‡-Ã~¶öÝÚªéû\êò ôíQñÿ¦zð>zâÿÜqùúùæ:ÿ?ÆCñÿÓÿÓú§Ð?…þ)ôO¡ ýSèŸBÿ$ô,@¡ ý?ÈÐÿâ0QÿõðBW¯¶Ð—0Ù±3}Ê]YhVGž¡šìõ«ZÑ5»¹í›U]vûŽë²¯Y-…×ÏžW˵¬æ¾u,x½îz{hø–Šë½…Ìu‹eýô®B÷Îå©ó°3¸½ÎÂÖX÷>’‡¡™X«¯?PVÍ-Åàg°›XoQ›Mà¶¢íEm€µrí"Ì…6½8M|/ EFqÂb„«—k×C¿˜U¥ÚMù²à<“×¾­ºZ©jùfE>m˜ïv¿Ö_O’¨]‚ÚrF{‰N@{Œ;Ý”%å3Hˆ°§NQÊü0“8v#Éî„‘ðìÄT.ꢴ::rxqjúÛ:üRª{½1SN‡ž“|Tþgḓ>zò?¶ÍíõóÜã”ÿ9ÆCùŸSÊÿ˜À¢ebŠ”ý¡ìe(ûCÙŸcgº#´ûeƒ(ûCÙŸ *)ûs_²?”° „ÅÀ„Åš)éŠ { ÓgóÚ]µcÝ‹\EKŒ0°î&j$¸ÉÝ–k°.^½yûüÅ‹îð&í(hGOýQñ¿•|'}ôÄÿ\î8ñ¿€ðßGy(þwJñ?³=‡YäæRSuë¾)(HAA RPpË `w@ïóCÄ)(HAÁ *)(HAA >° `¿}o†êÀá2Ï'I7Ë¡}‰˜L>Yãʨ°Î¿±ÎÿügEÝOy®Y áKòTɲ\ÀïñΘչ²O`VÏÃ[_!üO‡Ó`€OM _)Œ5âíFÖ¹ÞŠ¡Scâ`OXÔèÂ%:Œ‰/š€¾ýS‰Dº«êc· 'ã¸Dž=ÓŸÁG£kK!±ï^bKê‹z;—‰„?òhXŒ)ä|"©X‹Nv5–ŸFÖ÷0ÓùDý¬\7ˆ¡Ô?°ž¿¾X|Ë Ñ ¼9•bÖÀTIN!¯D‘V/Ý@°Jby->Œ¡?Œçó LµÖ?þ8ÁYÏÑÀE˜'¶PÑ y?“2U<®>Wñæê$Œo‘'ce2*̤ZîÕÁ ½‚ŤZž‚ìL4ü3‡Ía ž¾v{­À¤”É$Ÿk8æ\H‘ºGËü‘‘¿uÑ€¡2=i|)L`nýS0é,µ¥âµëcÜ4pö9ƒ˜B[†j5EºÑÑÓÇsX]óÒç#(Ðë ‹÷Šéyù{ëm^5£ºÊ¤P!% ‘k‰TÌq'¨ ¾Ù"ÇéÊó÷樂«I˜™9Å Œ³q¢ú³.~0Ú• '8ø Æ«)€žÁ9{Æ'4•LnR¡‚çJ´»‚õ(RpWô€|ã·5F,8`ÌG¬»¢@™‘Ào?ÁìX°k(ÕRqíùJ\k‡'ô4 )K#°¿)'éz‹%¸ó´ã¯õñ2¿.,‰‚7BΜý àß©… _æ¹B^ʘ¨(-7Æ{“2X|µY=³þô/@/мÓ%‹xyƒãúÆbþgÛì+3Œk§£D¡Ñ¿ú¶¡/Þ)Xt#û’Th㋪ta›®1é £_.j™•­Þõî»7ÏþѼù=ÌSb½[(ç¥ïÅó·ç—oÞþzñêgó6|ðÈ`œ ðþV^\¼ú×U/ƳrIëåJGYo>-–rÚß.…Z¯]úc)æ^4—~S?þûó—¯_”¬ùñ7 ¶Ûto^ýø—7å@· ‚[ÑÖ+ùq¡ô}£@§”¼y÷òåó_ÿÃH‰ùËHÄü®c^Üa½árE…¦MXtËEµ^òÉD[TÀÉ9¦õPPú »`ƒ)Š4hÛáë|>úÆ\nZFÃ&úÕbÕX‘P¿ÂÚXLÆ3eE»Gò믚ÎG¸·¯À¾œMÿjýq²ü6ÿgq ÊuçâWËo­Ô}”ÿ‚an¼«O!Ø“>{ƒ­´s)n·d”}ìô.vÎ86N L%š?©L& sn FHŒ9.OÊKüŸ=½fåo®°¸l9°ê2ÿÅM ]˜¸iIû··k¶vµ{ŒñRNŸàTðLx’DZíÛvp‡e™ |ßswâÆ xñ^|ûYYrAk¶æ­õ«SkwÛ7Ûùµùj­PA«Ôô‘j¤F…$MÆñ£ôf:ý´:ê°Î†…„_¢ÿùd}oÊoΓ±Y8 å„ÅØSÅÿ²(q³,‹¼@¤^e)÷é;‚y^Ľ,º»øƒ/×ãžëSüïÅÿN)þg’j¤ …)H!@ RB€¤ …ïQ0uÝÄwÁsŽcË$È<; ]–¸a‡1ãFYTn¥¡·éb¿nâEìÈÆÛܘ“5ª]ÔDÍþÙcl-Ø)˜¨À‹‡Š#öœtЀUÑöãK 5ïü'âÂÿ»;¶”!”û¶áã÷jðÏ:‡?ÐCÓ—N+FT¦¶º…f•J«šn4z~UÂzÖã» vNyý@ÈÉLü€S*­2Po/IèæÊ‘ ‰?üøïê©âÿƒòO»õÑwÿçzëñ×(þŒ‡âÿ'ÿ_ew)@‰JP"€” D%(@‰JܧDÀXàmšß4zÜl@ŸSó Ò:ÿ±Qµðólj;käŠÊ/uQÉf¼¸ãýíbÆw–?9ŽßR µ ÎßÂïö·÷ ÑßÊ¡=£ôU=ÏF¨oèÑõ4æ®0°(Ò‰¬WUW/5JÓb,— º¨s¾;;J9ÜÑhÔQ£Ý鲨¨êÛ\4G<².–å \Xx´¼·©^d6Ï£Ö×ýÜù´S]¾ÝEh¶þ•ÜÚÐRn'¼ª[JYÛÝŽ·ZáûU*®­ð¶ÊÇYæwY™¦¿ó„i•ÿYÚ­þû6Ïÿtþç(åÿN)ÿg”÷£¼åý(ïGy?ÊûQÞò~”÷£¼åýîSÞoÇ@ÇIÈÝêeœl"nß»€úLÐ]@;œí¢ðÝï2|·÷£âW…˜__N$LZze€oÿ1ÇõøZüÏ lŠÿ塸ß)Åÿ~Æ…h½P ‘~ð£€ü(àG¿õÖ(àG? øQe_Ššç³WömZî;Ñæ€‡»Ž%›O”ŒVµW±Šå¦M±\ùìx1†Xª¢³Wõ¼4)ËœçXEwÿf A©«!>±ðwu’VôꟂÍ*k¹‰òãu<®¹9Àïf¹®#蘕§w¹Ç_ÿ3h!U±B+–‰À*£Xà°Zc÷¾~\r¯‡ÖCk »\‘ðwëÿ¾Øïéˆ7:بÛÓ¨»Á¾·šGÒ„óÀ¦Ÿ]Ëb¼TÕN ©ë…¢•=NS¹#½R¼F®ˆy¢‹µ&»ñÖïéÛß…·AO£Áo­s5&tœJÇ®k–‘$ŸêZ˃¹ö¶põݬÖÿ\ŒzúŠvà¢cßÞ¨coH¨f£RLãE)ž0]æÓˆI]j‡2ÓéQ6ŽÓÂÌת¿ï±hk%£+±Î]§GÑ8lîö(‡op÷¹µg]£?s¯G×8M]Sö‚µRÍbWuNÍ¿ñÛm¸×£]oîõ¨ ÇßV6‹| ¦ü½“xö('hϲK%¡[0´G±8á. íÑ N´5CÇPRwa'ëÑ<Ìne§êpKf²Åœ˜Ézc=̼1&4Úlc·[ô¬GÁ0Þ¶ÿ,¶ÒŒ¬G±0wîõ( æmpï Öp7üÑ<ÔLÃÒõ:J‡6fì4¿’[ð±GÕ0¿ÕÌ,'­ÚyV»Ñ7;îQ*¬©T¬g¥Óªfh÷=j†…½Ýk P[˜C»îQF,êëZ³¼nM ìš÷¨nëZí’¸‚놛çÀÞ{´oj£¿lµGq¶6&3sO6ߣh8ß`™R3_Oñ|Sª4ßPþôèÞÔ7+5¶Šæ”þ-F%À=¶”Óýq<™˜¨Ž5WY¹ÛO´? , ×x<]E0¦W:|ÑÈ©«ÐÔã®§lý}iÅùorQö)bÌ٨׭kñA®2•bÿÕ>û%0éÙÏËÓeðæ'l†2‡Ñ(wEÅhôY¹¼T‘˜èÕ÷ªpî:U¡ª0¯[ÇÍÁµx"’÷&g julÍiYë«»)Cl³¥™u3Û¥±÷ËáT!4ÐåÓ‡+3å±É)))Ýê…Š´`àk6C¼âÙ²ò'ÆæØÒ\j?2ƒ?83µ‹¹LÆÙX‘ Cˆ^ª†£_Z DQäÛM?4“2¹1o×Ï&‚G~#&ã¿ÁWmþW5ˆåò£7wù1/wÈ5n«N® üQ³”¦Vó¹­œ¨¶×7ŒÅµ—ç7Å|"¡ÅõF Àyƒ¦R)N={ð94\RbVÛüGVÅh|a"bYÍD–€ÙÁDÚŸ_ÁßE~su][.ó|<[YcyQÊ´¤£ÿY£þ“ÄIlR¿’ÓI+Go<[è™ÂC·Øýš ˆR&æg˱’Ĭȧ}c¬šA4ØT‚FRëâWe—kâI0°öl⿦©wà>nÇaÔ^ǹŽKø¯c<< ²,”10Þö3Á<‡ó0åI§AœeÙ禞»}ÔúrñÂ}ôà?}ŸÍõÏlæpZÿÇxÿyJøÏö«F, ¢³à %h(AC ú ¡úç¦(4Ò† ¢]£’ ¢÷*º¡žXC=±-õÓau@ËíiKÿyªqf©ªnµ·«$¥>:XÿðAµwsv}°‡´+·ÂàÞõÝ’3irÕýšŸéÈòvÊ2[„yDíh$¬k•T¨ß\9²@Z*…0$Œôe .òox |þŸ½kknÛHÖïü¨ìVÉΊ îïqªÙrTëµ]¶³›S©T<˜‹„5 °2ŽNåÇŸî™Á"€ 2K>в4f¾¾LwO£çB†™þ°÷é·)àÖy_PšÍTjΪväåÕfÚ—î`0[Æc²àⲋ‚ZØÉ{] î?¡&²òßëGH_=¡…páœÒªžº\àr!5áÁn Ä‘Íu¢€˜,¦¡érÏ£.‰BmŽñÈ­0Ãb|½«6 d­ÃD¦ïq; ]â×À£.½z£3 92a„ùœ˜žpLKØ!'qì„‘/¸)x`ÙÛqb™æðŸ"NÙ/Ú§¢xñ ,£Õ‰}ÁÂÁ|Ç´½ÀŽqßôxàº67CÛ¾sóˆÑ>•Šº‹ôg#8¥¡Åˆ+‚À¥Qà³0tcŸpÏ ˜GEp4¶©}"Ó)ëe™úb3„Vqâ‚aZg$¢"ôœ0°ˆís×qI!Ú§‚œèn—úB3„ Ä÷#Ó æŸï3Óòóì@ærûˆØÐ>•‚ ݬR_hz°¡»göA ¡jjgMtrÄâ;‘p}[ø&œ(&Œ‚IµXë¶[þ+‘”Þât1¤ëò,Y(³]Â_¸ ‚S8®û.õ=׊ýÃã|Ó\Ùa&M:êÛˆaüíT‘ù ©ÄíòÒì/"/ÏJO]îÄʳvI7ÿݵLЦ-b1jEL iÂflŸÈ´Šh;/“}áéß-­ˆøŠ`WjXùÊAnŸË‹ ÎUžFš  ›ÉþÛ"ždôÓWßžÒ}Ò*ÐW:´27žëý[RcÀz»ÙÁé’v³Æ>­¨_Ýû-VÐfUFx5!¡6%«Ì´ÜÞ«× ¡U×¢Ò~½¡¬àÉ“¦ƒ©öO‹DCm‡YŒF¡, }ê³;aùÛ¹Ëq–Möû¦ß“ü2›Ý]§ßí‡ÈôÝÚÄ96- ¾HdGÜ1jÅbKaŸè·O @_wÈïöCOX½ùJD虄pÏâ8"Âò|ðÎÁ¸ˆÐñ…{ð,hŸ²àZt{Õµ'ƒ„ß ß Ì0‚§z 1Ÿ3ꄎ††qðÈ·O‘¿ÂŠÌ^Òß—A1 D¢4´Ln9¾ þ'lÇB7 èÁó }ȃW¤ úÂ2(Rs1.(88‚ÆÄ ˜:ýˆ< Ú'€,xý›$‹nAzOD™ÿˆSêᇉ‰g‚¥ #;¶XìcFßµO@¢¿œ~¸Åz¼Û2ЕA¨K,ÖzÏç&'‚»–cûà™ŽÅ4:´uÈ7¸ ÅY7´'$Cà÷íÈ´<1åÔdnLn2b “ ÂÅv!ú>áoŸÂÿ޳%U/;vI–÷eP§ ;}“Ç"=“› q¦ešŒÅ±»6Ù.ÈÞ'Ú'€ xKºŠ_D9@&õï¬Ðü#LÇ c3pˆ|ñe»­Š½:@­PØdBfyGï§'&ƒð"S¸QHEèóØÍDLx +è#?Ø.E»Wü['€øÿ.’ŽÒß‘A݆±…P7p¬Øå(™‹ØñˆmÂ"äì'Á‡­(@Å©€ÓGPÕ)`àÄÄôyà“ Hð½§·`Å'|ï)¾v˜¦ÅØ:'ùúB?„Í1³"æD`Kfqø&…cr‹ÓÈÚÎÉíÏf'ã@0KÐ °¼ÐäÂâ6õ9èmF›Ÿ« \0’ôfïÌnkÚag–÷eà Í)©Z fè,òM0íÄòIHŽ`ó±} òÍ׸­Ñ½‡XO\¹Öó½ˆ;,ô ÎFmÇÝv!´²ã(ƒhŸÄ‚Ë÷ú­˜nÞuO\%¹ëù÷™Mí¸nš‰× üHø¿]Ä~õ } ÓËy²H(™tïÔ–?I ÿæâÆ/ШƒÆKëÍ÷Õ›Ú²³·Õñ'†&þàûêëáìàüqpîÛÝ[˹uŽ×@þ±Ieôy¶+‚›Añú0´C­Ó!êÇQ¶ÍêPÖt0­J޵cV‡Ê¥ÃÆøð›euȽýqc^m-¼ ã@„ñ­?}ܵ&YX^ðsô‘ïýÚµÖó*¢ªfi‡xÎî’tšJsͲ`§»õ½èã0qm–·ì X¹píÙ%M‡‰,–lí Ï¿ÁØ¡$æ0a|E¾„|⢿ñìPìr˜¸=;ƒ4Í>ÁÊÞ^¸r hÖ tv‡hIt  Õ^r˜¨–E7»³£™"9 Ðõ%‡ h­ŒfgR:/hôCÕÈabZTÆì Ð\¸Ü·W!&šE¥ÅÎÐ\J‚šØCTÃyn`à ¼Höj&ù'ùW*;ÈÈü¼¼‘-eö0)ÛYɼúE/sѾav y—ÆÖàÐTb™u)zðõÁ°ÃKUG”\ßò¸µ<ª¿6Ezw-Ÿqšˆ„B‡í!Œ§õa`‡‚™#bàÖ5OkYج>Ú¥^kì…”¿ì¿ Ò¡óÄ!î‚ì¶õÿû?sëÿkÙaS·»‘}œPD´ÂO gFAâÅËë7¯¹~}õoçi¾œ7'ûùÖÔ”có82¿Ûß©šsè{L tè¿qè(þYjÜÑà®ó Yž «[” 9ˆs¶iõu:,`Àaµþÿ—Ç¡=æîÿoC¤æ­öÿwÌàÔÿŸSÿÿCêÿß<p:àtÀé€Ó§Nœ8p:àtÀé€?áùr:%ó»¯dÚN‰Ù_]Õ ÕÉ·«ú× þÀ9‚,öÅXÝE¸ß[cBf'Íõ3pù’¶”›¾èøÚë¯ämŸâ8‚ÅÂòÜHø®٦ŹiG¨#èá¼çº™ëæÐ»Ût_X†¼jD‚x„¡ã¹¦…µ±fyÔuf®»]#«/óº÷LhŸE¿vÓ}QôÂ}DxÛ–ãPA]˜žã†4â‘kS!¬ízyîí³è×oº/*ƒÚéñˆrÓ¡¡{Ä7-A=O´…ã»Ì2ù1˜¡ö9lqüF_`2¹¾;øŽ)°Ýç´B;„gQϱ·ëý±w5hŸEßó7úâ2„¦IBÁÏ´LË6) b¡&’8];Ü®«çÞyÐ>‹¾pôÅåÏÑxbÕþ½:x:ô¦ÿýÈäX_6ïàÔ@Ë&¼ämó~˃|ø¯›wpKÒjì¶8soE†>§ú¿Ã«ÿ3®_¿ÿðìÕ«S©ß©ÔïTêw*õ;•úí¿Ôos‰Þ°Ò¿S©ß©ÔïÞ(O¥~ÇRêwªV;U«õ*3+|ycû’²{kó2Ï&ÐaËÔ„oÅ›ðõ°^·WÑmArΘO²Ï£Ñ%Æü7˹ދ:}½þ3½™©Í¸âD®OOšñ˜%9ºã«Ï>üðî…æŒöC‹b´ârd4AMáiý¶§iöX’kþú§§ÏÞ½üÙ¸Gç'øõÓ;žÿ\¿'‡•‚½ù@ÂO b1¥!Ã|mø£%HÞãã”|âÆ¿žZg3iÒéBÁ\¡0IâE–MÆÈ1XLP±ÃÁ'TœGS4—F ^ö'ôÉ€S|¢¨çM*˜œÎŒ&¢Ø@@¹‹+×"sÆô–«§ÈøÆË2sšÝ¤Éÿrh}3˦øÚt5ˆ1`<¥w™k‚ùLödXÎÀšðñ"™jHêX{c“ Çkä ~Fu¡’ —‚›7x)[5ýôôí?^¾ÿ¹4ÞŠº€<'à?çÆOÚÜ€5²tù·uDVÅJ|1Ö:UÑBܦ€¨Lœà%MµkR«tç- ‚ž¢ÒäÀøí³Ë<{YŠº!Y¬¹"èx=H`qË}É(þPÓ³ú3J-“¿¤Ùt¢>çËdÁŸ>º¡ô÷$žþž€ šü>»I~ÏK–È[6}>È!EÇtd× ±Œ>gjÂòÝ×ãrªãG’}ûìÃ÷ÆO0¤Ÿ/ªߤË1®>`!:’‹Ñe5@"7^¾þÁ€kïɆ$”ßåó,[<}~ýNRË…Ê‚iÙ\Ô„o‚QÁå þ‘nQRŒã ®zöÂBéþ?œ=ü>›âTxŒé"Ùàé¯É–x|4„W JÊ#¸§H’ú/WoÞýòÝׯžW ´C°0PŽJÅÏ ~qsO½Ë–©)ëC¢Úîóâ( \ü&°æOj‚¹ƒÎ³èu«Ô:´ A*]¬ÅùÆ`e.­f¡ÝüøãzU­qJ«øzmVFüA­H]Õ˜¾Q›¥Ú> ¢5r5!Z¯ÉŠ5I¬#®æVþ}•!£Ñ¹tià»¶Âgæ æÖ+'ã6Kàzc Àˆûc¹xŸá9]pù-ŸÌFÉB‡•Öýe\|àq7+צÁ: ªóoІl9x*o'œäxXc·»f3 ÷Œ®ëîðu- ÝabŒ‰‡Èt’ñèò±aE‘{ŽßžüöåwtnئiÊoK~ÛòÛ•ßÞù¾}ùs ¿CùWs~ßgbñ¢`Dprlç08 FNÈs n$> á[GË":–Î,f[Ïb€±öÆiư©£¢6Bê3>Ÿ& L®£b¤wÆ”³d9-ï˜gwd²¸C&üš`g8å6ê¹ÀáÞÊaÈÇÿŸsÕbuþ+gè{ë!áÖN&„l¿Lòq’ŸŠ'ÁdA:áQx B2“ýŽäüÔY4zzï#1ùw(&wç*ás‹^žV„ÜøxñM)u70VßE(t†Ù¢%,`åUç…9ǹé«qÂ… )ÊژыÈlâ¡s—© âÇw/ž=ÿç‹3]šêÔÌ€8¥!m7´¢M5dª»‚‘¹~ü8U2€t0A!rD°aµ Y”æ)[£…­´ž¹¼9˜‚éBñÉÕß¿pÐSþæôä /Êi£M^æÅG åb”K›%ébE"ªm÷‚HŠeé.`©äÊ'Îgç2PAeÕõ 0XXÁ /*»T—}€ë‚Ð3™™©ý*IA’¼<.T©Õ¨ŽqŒ6VûH¥“å"ÃkÎ`¾ÿ[ðxåQà+ãà‹a«¦çh`s^”6ø©ð"¸…œ'ËF aµ–Ó“ÊRO¸kŠR-Ù–äOðëžÃÎ ŽW&°f j"ˆù*UÖ/x+÷ãnÆ•ï__ëÏÔƒ‹dQ„”˜ÿ\H5nÃx·LÓsb¨<¸Ì\c¬?4Œã¿hþðri>g ¸ 3”4ÅU—µXSÕ7ÁÔ]±èêR—"#’£°/T»m™³?Û …òJçÂ(òµÒñ)ïRDå½h ÑŸÊùDŒµÕAËDq„h0Ô€ ®˜v±Òÿ,óÅ}"XÒRí¡E‚õ]u9·>òÊ·‚QT¯z©m04uÜ­\¸TØbÍBe 7O *ª?PEÁ‡Õì7#ûœ*ëˆ9L]C¤è”.‡ô]uf²e/›™Žš Éå¡7Ë ™+2X\©ÌC†K´@ÍIÎnÑ&òß8].ŠåG£îǃ†`‚7(o#ã4½ÿ`á†a7YˆÞé¢`ÈÜä¨xU0EËdŽq™ÛŠ Ig*¤ƒ¾ óŽþ"Ïõ–˜â•Ãâ›[½H:"¥®( .3ù–Óû"’sýöÞ¼»m#Ëî¿õ)0ÊóŒeDa_œØçQä%šöv,y’~39ìP“„šm«§û»¿ukÁF€Ô’ètÇ ÔrëÖÝêÞ_¹“ªXی̡”ƒ…9!ºp˜»’”\ QatÈÕõÑn˜IBíQ±ÜT{ƒÂ§-S/’‹)ÊP)»®½&`û­-¥¼›×äTœ–ô=¶]ÑA(–æÂÓÔæA°-þžŸ ¯D R9Ís«XäÎDôvùÜÍ{ ¢œL.’%Îê>'s£r¹úyAÌd䃙IÔŠÅ¢@¾ÅìúÑ;à£5ÏPL áBZǶãA3e„Ü«¹2êü‘é>nÕ5£Gýs"Q—éžJ'£¨þ…»Ë-pq8D‹‘¨éN?. ‰Lï'"söb ?Q$õSnh•ç|zú,ð<ñ~vtICËÏŽf×I£Ï?y€Ôu%ƒù¯üÐñé!u€9¹òu‡'!Ýä-±ÔcÒµr²$.U†YÒb34qÅ_Ú¥2ëœ,ý‚ºãu‘¬0­µGºAQ—^Ïh¦2+નp €JƒÍù±t Ä”MÈD…`ƒM ²ä¡’m½W(°¯T!>@}$Ôû¥öLؽLè§d§màrÚYñ!¢¢%N6È‘üÔg¯¬VÅ}íùàÖÔdÌb÷4GvÌä+wÁŽZ0«mÿ¿à<~ŸEïØNø™zÅ9>*¨"ÍS1ͲiqÉ’îU–d3¸ÄÅ*MæÝI«/N ö ã«¡‹ÊjÒ¬«pb­’‡ñ^%N@ßG ¦1Ëm°©¿_(oQðþ\ùEÑÔ‰EÉ©ÀÂë)1 ØTbï{•凡R™Èˆ¹ØR¬ªFÓ££|!ö#”í©°·OD:8Šh¶ŸÛ[GG Wh|“F±óÆþzDó­sIËY65Bío¤€­»ö†ðˇd!Þ³[dƒìÙ¿ …6¤Ä†kó_¿¹öÔ6ù××Añ›mî+ÿ½ž^qúË/¤©ÿø]4õáÕË}~Û~¹ÏlØLŸ\®DÎy‡L<\v„•âòØìˆˆ'%-¢Âã)c5>,±:0Yd})šµWøÅ× H™dV9jÁ©Ií ʾ›d0‹åçq®Ãº±ÀIkVgê_u¹÷×ãUº¤GC³c2hØîüdÉ6ú”R~ŠOž„\*ô÷`_p>¥ð–Ç/P~ùi2[q“—žzUU¼"iÁMåÑìòò•.ùò¾ò='ˆh7‹ ƒ~ñVf²¢6%`­Òô+’ÆùdQ*ö-Ð4â@îêWâ¹|šìUU˜G£NH³xÆÂ Œi™ʺáAÐÄc“Ž oÔ(·û ¥4C7æ¼)™V{BV1Öˆ6Bµx ùZxx—®MᲕì®Â*ß«:?‚ÐÔ0\3 ™¼W  DXƒbx„&yT>¿œä+ÈìjӠÙâš3ï…чÌ:àÑe®£SœËb"lð78ÔKÙa!Q"sÚê_ÿÏÿ0‚þ“,0ÆBµî8*¸ö°$ˆP#¨Eñµ´ÞÌÉŠ˜öý"Œd1q ò“É"ð8OH‡pØKËÂxô‘wXÙùÉ1L.Ï[  ‡Tù{ˆt¿gyH¼ÙÅÍúY;–Ùó8jEôéQ«”zÐgÙ¼†DÁø’šÏ¹þ«IÀŠá]ŠÜ6OŸ¯îaLEuR:hÀ,ÖËõk92 XĸJ`­¿$³/ù䨱sqÄŸ\®{ŒÔ8¬C`‡s &Ò÷¸Ì8FP¡° òë8‘sKp•$lOæÏ÷°Ñ1›íU‚Æ%w¦”™óP#'ï•8Ì7ˆL{«ôvž)ýÊ2nŒ>Û°G¨d§&>DÆ‚¶$¡:W„Và@sY[_–~ºÄ” üŒ蚬4L&3g¢ù‰%+ùÍò§ªÁjæ7ÅøÁxˆùñÍd]$97ñèâObŸ°#ò1 jñ¸³gñ<ÎJÌÊ 6‹ÙH×e-š.õó¯ù`al•®Ù-tÂf#Ï|©)0˜O‘F¶× ¡âší¦æàùrÛ4ã7ÓÏiº\%~¿G Ò’OLK²Z¼ZJPm|îZÑ·¨Š™ÂÉÍ´K×upžbD6E²ÊÊŠ•'!‘¤¤ˆÒ3ÎÄäYö) 'Ÿ™Ö!;¼‹™Ý±%Ó>”+¡ˆaKèŒÇÔ †˜!‹10laÕ0É¿ÇNWpÂD"]-L³4ªDI@uö"Ó/W<6F½`›ÓŸŽNß¿ýpòî/Gç9¿xùvoY[ì/:júÓ@HÄu0õ DïÏÙ¿~ùñÝË7GäOj ðäèJ^hºò‰Iš‚Âq4Ò:ue#Àƒ bo¯ò^LÅS~³9 } hTÏU?"mO$FÒóÚúÚTR(aOéâeRüF~ÂZªP¤ùbðÏ9»´0×Ù 7_h0Ÿ(âA…ÝŹ ÇÀæ{"îO¡D*™ Hò›’¾¦¢`2ç!ãZ‘Y‘æm(hOøs¥fŽ ÉN Äå9• ¾½ý«$Íöó甃x‚'¼OꨛA{ôd©æƒLf¹Ò½Ëwæã<šft‚:U¢=a_½`úvÝÈi" „J…‚.…f×6Y¶.„" 9ÏãN¡ž¸’5]Ë(†q:ÇÜÐg©bþÉéé#3y:¥9âÌíý+¤N*G ³$ág«eîÝ1ëq¥&ð·˜æëql~œöeá¿ͨH:}ÿîÕÙëéùÙaÔ¦d„¼ LDë¸IÄèÅŽŒ÷N øŒâ§yMùa†<þ]y}o=-`“y›?@;buÁ¬ô¥q©y“eóJe1n™|(2ª/áÖÐ\àÕ¢(0a D"‚˜o§C^Lyó)Qƒ ¡uTîŒÂµëŒlÍÏÍf†åÀ;‚«nPLUæy>u%m»0òÚ_ÿëäã3:ŽGÕhîC¼°Nt°}Ž/ƒ`o‡ )äa˜¿’¯q­ËMYúDÉZ>X-(FËë,¹:â¾¾vPð ü³„ÉXUX¼8¸ZÄ[a¥¸¢ÛF0óO/¡~&\óîçÁs›y%Ë'âõÏø‚Av¾§k¡RušÉÇ…1ž«ÍRÏ(U|”^)Åo6>¼WÙóg‹/|_m°ÅhÇå7Š ÃÏ‹9ÛÙ2™QW;Îö · ´!é_ErÒ_®±9}Û¶» •uŠV+Á –ZB“áy›Ï¨Åò(ÿ“ tE¼¨/xs?åVlUkµRx²csß¼:ˆu,<z´–í¦"ëæp~˹SOwP1俯J‰—´8n‘‰¢»K‚Q…{‘@’ÿª:ã_röEy†dm_ódVºAêKPªjyuöæ%öå‚ÉpQ ñ”;ã!­k)'ˆõ` ædZÐ ¯àÏ–(ŒE²s­ d yRh`Æ)Ç!þr¼X±DÌ< ‘<²¢>hÚÒ/ÖªöðÉ,F\n®×aMümcÆu,ð¿þ7ó‚ÎQë½Èåç¶;¾°Œ&°ÿ|LSYˆÏN³²8±W×ô ‰î‰Ü'RÄ–˜ù± «|-Ïú˜‚9‘ñ›wNv¨í3„«Åc6‘tˆcgöΡ-«yµ¤«Â•&o>ÒÚ¶¡¢­ð½˜ëŸ¿[qØØx¸/YŒJ…Ä„K÷†Ò=«÷[Ïyú´È6.§ú‰´*Á¨÷#6náÉSØ›€ »ô²(wh>0eÃ_$G̶†X<ÊkCØ^È…4[æë¥ ø! }—”Þð/åOªRœ¥b#‡åyÂTX6ñ×8Ä´*ßÅôX~@©•J~@-ò‡cBßç×k„UþP?ÿýÝËŸÏwŒù^þiÇ×-ݰjøï†jZ#þû]üŒøï ÿý ¢Y5­òMGø~AàGø~AàGø¾úâÏ~¶/)œ#bá_åÒ|@ÿ¦ Àïæ+}Gµáòè²Þá`ðGD‡gô$9/ªá®IšKgÁnk@ñ;E§oð4n¢þJ{Þ|åÛ÷/>½!$ùÿ.ÎÞ¿ã·M¾%tœ¥¿‹»œ5zKã%.Ë7+æIHÁç÷Gà ‹Küu ˜{ vðÈ TX68¤1?Á !BÏ1xÔ«ˆïA©W_²DëGZ§ öáýÛ:Í ªk')æ#,n Õ2`¤q°M®H“g°J¬üíËoàüô0#ƒæoÒ­5iâè“Å0«åá\âМÖ{ø”]¡-.“ü÷EˆÒ«ïy ŸXhDv±¬”ÏU¡ÀVpl¸œT+JD† é½Ö‚CÔ€åÀ}­I|å§ì —¦å¡à`V{<D?^{8»ž…O×Eéç¦gáãÆ‡VdÒ¸±ýâÛÊÝ™ÙúÍÙ»?OÏ/^~à, +ðwÎÍœQéA-EzRæV,NçÀ”Ôä5j´Ø ±Qø£YT<±c‘(ô–ÏÉ2È‘a9)ÎÎ pð*+xAœ.ÀÔ|ZXp-Gå©]>@ù–o¨}À•à*ÆÜ…dÜu¢ž>Ÿ_ß®ˆ¤»¼ldÁ€C—Æž)Iw§"ý½"ØÄ”e„ŒXÊ—-J]bPtx§xe¢œÌf¹ÉØ`AN>œJ‘—X#´¯)[`N$pàÞ[Z˜]ÁU©Ó¤ ®ÉØôétûS÷Ši…Êâgû~gîqfÕÎRqðË&ž{¢ì?g “vÙ%¯;ýÀ—lJÖïs™ÌÕoÖ‰^ýþà1MÄ¡Yl¨(õ$ÔFË˃ˆ/ ÿhá ;‹-ߺ A“ŽM§ÔOX!6‚Stւȵgð|×Àh´5Íý$Vg;c•[dsÍáMÔ‰Îø9MïBâ@‰òúÏ|+% ”û…Š8¦£©ìˆ?­IÛ3²ZÊp øœÌtÊ»ýá˜~«B{RqPͶ¯šã—µÌÑÒÓF†š,…ç¢ E2ëøaºÞ+§e¹fÐ~…j#1[=B±Ä’ +ÎA"èv)ºÉÇ™ŽÖ¤"/Kd!‚«é¥)`ø—8›ÎÑ7ñØA¥¯|NZæ)¶nXšdÊiÒ{™“%›u+é¸,óÃæ½Pùõó³…€†fið¤] ÂÔ4ËC°W–èúâð|+× Nùå—é/‚(|Zù….È•r ˆ<éÆaú@`@¤)ša’KÉ]¹!CO½ ùÉ+bYÎZ6¼Tîuí¯Ôæp@sH¥&˜@Ô†,~ŽþCçBÖ+ÍL™òñæó/÷Æ3€Áìcù€øAZ[Å镸„;ßeìV‰¥«Bì.;ÅŸ¹À<‹8¡Zo!„*".—pM÷rÎÍ[‘:GiFíFX ô—¢!ÑÒK€Ú*¥µ2.¬¥\ÖE ¥l|°“vÀ¹›PŒñþ%dh“|)õÀwÑœ3€A+Pìo)GÕ)Í!=¶a[‚DRlSñpDO_â"gS¬±à‰<¿Œê&J«…‘ŒÄgyža¾×³²<,mlJØ|è¹Q¥Òù•ç“åäÃy\B~Iho\ä¼3ÃQäcá¼$Ìuc4¢b“Ü ™Ó”7ž¥KSéNó¾h‚’Xšf8)ϨgŸïàrÆ)Öñé9ÑçA1‡Š>TÎW=Ã3æì¼.W¥Õ¾A9±4\ÁSEÜgröã[qÌP}hp:Q ±È£N+¨×A3â³­½ÇtsÁàGÅÙ(—ëeû°ØB­Ãf¦fàr!à[ráŠ4wÒÊ«UµÐPyÓeùQ˜‡> ¦ŒÖ9[&_.NÎÿ|öî5/ÄaÍÀ·3dëã9?3øá˜üJÿ6&*ûCµY½ê+Ç<ÂádÆ*DS¾G9--ìýJÎ9&DŽÂ ÉF¤Ý4Oª¥BýRTÕ±ZVeË+²vØ;Zm΀ãU^¡“ÞJ,“ƒçˆÄ%]-Aq<0ð´YK¼ºÅ–«k:2Ò4^ÂJ‰¶)Ô lC6ZSÍqiÓàxîêƒ@¨XÏø¡"$—ÔóÝËEkáõ¤%ç‚Y °ˆSfiN™‘‡*ßÁ) H *Ù˜‰$˰´—©/ËÈ [*¨E-&û®(ÛdˆhÔoNã80Eª©¹p9,dà]$v cêÅÐr¸Ì WY©4*ºzEÍÍ[< ›.ª(ñKÏÅÌH?§ª€¯S® 8ÈõÿCî§SŠ®¼Ad]J\ê–ð¼ðI”0ÈlºÇö–‘“´ÆÅ%7'`P +’â©~ÕøJóïéî¤ÌÁ6$šÑ/V9 OJC!T¾’fŠD~ÞµHb_B$bΨ_0Gähp+oMìJ’’‡Æ›/á*Tb%³p _3s¥=f5þ¤,سÄRp«Áâ’# ð•ÉEMÊÓ9§h¯k[rÂPä*uBTÔ¹p5Ÿßì !\­ÍͳکŠ®3Þ£5ƒëÄáë¸&Îz2™C´¥bäÀ㔫?Ð@-üK½$ªÙ®âË+¾MjŃ1ÇB†{fˆ]™W\$Ag@ßø¬rLí†i 9ôªM\1j}s"Rïéþò ”ýŸ€§’½€ÀÀN~ Áÿ£PøCi'²Ü¤17’„vŠEœtŸ·‡É¤bK¼!CZüýPù‘hÛPy›\-•Ó«%ØâdÙ>þ{²šÏ¾'vØìPy/?+çÁÕ<g,úžÅß”Ÿ“Y$Fz¶xª|X&Áèm“!œæÏXq•\ÓKLœýLäq¬Þ¼;=?T¾$³‰bkñ®¯'Цzš®‰F_¼?{ 8~šª:ÇžãG¶©‘§5çÈ›z²ÀJŽŠUjI4e¹À´´(!–ò3´ÎŒå G옶#a¤$^JØ{µ.½-œ@q}HÊ“ZRK©Ú9¿¾¢Ø§Ìm£Vn„7û10Øe´àb}ƒS™”—fð1ðZŠ‚ ¯_§$¦ˆï‹R(¦.Eá9¼HiStê\)1á›»ìÆ €5¥CnYSùÇú'SᱚdÆoµ}8 ÃZÕÆŒÍ>åˆMìÏ$âÀöñsŸ?¡>Ó½¼Š¢|'@#è…IQè+Fß«IC»úq)²'›N§LQŸ½;}óéÅKò7O@^ŸOÁlì¡o \…æ5OîÅD$­—¼¡jsp‘üÚ T!rò€Ý"ö2wzmQ4ð˜lÕRQ|¹”šŽ§¸B‹¾,Ú,_•XƬ&œð‹qRœ¶Bãñ©MŠS€"£¦V!YPIlFná­^Ug»¼#E¬­è¤€õküK»)(­TøhL(¿ïäØÿ?4ÿûå/'o?¼yy[)àíùßùN­ç–=æßÅϘÿýò¿_²w@ƒÃcâ÷˜ø=&~‰ßcâ÷˜ø=&~‰ßcâ÷˜ø=&~‰ß[&~—]Œ[Èøf©‚v„3þ„09h±›yŒ“§“?ñb~]=^/±T¿ñ¸í†ð*ohì¿Gäwq´“²æWZW€r`îJ2N²TøÜzV’]«–”ßÙ ¨‘!1Áì.]‹\ònzxÂÃÓ›ŒïCÛ>‘ yû¤dòù‰sµx6[G}âZ⦠õµLծˡ艸‘=¤™[Cª²R•¥ª¯Õˆ©qû!Pÿƒ#…é§ó—o'(‰ÿ馩×ã¶3ÆÿîägŒÿ=¤ø­Qø‚û¬*¸Ç`à ƒc0p ŽÁÀ18Ç`à ƒc0pË`àFãV"ƒ47- d¦18U %]Sˇ%Ÿæ·Š`­ÀzªÀŸ›ó-Y ¬~ú¢Vø^ã7´―£M…7?W.ÂJŸZ$Åô›à_åaK^.%™ô¿ýº¦gïÎ/ÈÎ.öjŸýøòõÙ»µ‘•Ÿ8ysñòÝ‹ÖGZ¾÷žøøéíËwõ¾ù‡ù„>ÑKxÊ7,Ót^"pÈni(J ¢2 M§di˜Ð´¨EdŸÐ9–kw7=Hæ‘WGÓ’mÖ÷ú½G€ä-ª‡è°˜È<ö‰_ôù¾=žL&4† •´b*KE,s´ü,ò@7‡‘^|Æ7 »nzÖ¸ú‚•ìºç8‹‰côw~Ëãb½*ª^èL-Á }«/‰ 9‹šc1ªòš7“½úØÙµŠ=ª„’(‚\t. ê¢HìωCËÖxƒ>ξb¼8,ü 0¢7#ZˆK¾D ¢|hzŒ—/VŽòr.$ê¦DM/‘‡ÄK˜s´úzŽ5¿µ§I½”S7«‡; J•aeu ±€¼W´Öƒ4cÙ0Q;Fàï;B{»?4þ05gï^ßSþ¯£écþï}ýŒñÿ‡ÿÃ)hÀÛR•»p<OÆS€ñ`<OÆS€ñ`<OÆS€ñ`[,èv¯ãÖÎhHhu]4BµöQ.£FåY¬Ï³‰#\°ÄZËáZÐ5 Xñ>–˜Œàs9¢Oq»\= œ¸ a|(Â.„ÖRFÂÜTŒ›Á3qcŽÁñ eýòø¶k R´¦ìwHÃØð ¹Nˆ­È7°fú>Ž\݉52vè£OÏÀáq˃ÇÀq‡%x䮽Y¶ãè®9¶¯9ŽåYÙß¶£û¡Jþ@‘èí5Î(°f­CŽíÝ©mZ¦êcSÅZø:²U×$ÿǶoiN€Ìr§,yÊ/ôdýÖ!:/ò‹6i,¼`$…"->¸Ÿ%š(/.“`cÎfM€LÀŸ æÍ÷™Šø°üí/pqø‚³k)œ?M‘Eÿò—İ8r+ß~ÌѲ(EZvÈAé̦„©O©#L‘S}\Û ß<xWŠêQ´å—ÿ_å¯lÉùõ¥DH.æe¨*þïé”´ äL!Ý]ùGÙ0ùo"6×Þeô;ªŠ#Ò¼½6•âhë' ˜5͆nád‰ó€i¶dw`ëfFe ખÜp|’|•^°kz!Ø8ôY«D'Ç#žsŠWa³/Ð×Ïâ$Dxx›šÁ–ð#ŽÓÈJ>c•ØÂ_bÄÎ2ø¹-ï¢BÝ?4™E9öp1°oQØé*Û¤7Dk;#ýW½>Uª ýëûpÁo œâÁ²qö£°;{{9x˦ìòi`2¥ù‡^*̆Ižá¯Mø[ìU{‹/FŽk™¯HÝx¯ý”Ø“K ʳ–ŽèsGâ«Öù׫dV\6cÙVºælž³.år…Ý&[`>ÒÓ¼ªR/…0ßQ0×gñë L–°¼ÃCzXµ‰h[yò›„,¥É‘Në ãà¿Ûq°N' ¾\âë¦×ns¬ÓE@žw`“ð¸Zä­³,×Z|2¥õëÑ=ô<¢×lÿVjðBû5Ésè 8Áiû$JX÷|›³·OŽg¥°¶Ú›[ŠØôlÄl4Ï˜Ž¦ƒå•C&ð‘wÓkÄÕÝ5@õ˘ÈI—\/ÕÒ (hßzô<ëÿ—dKüëýÐüÓ‹ÓéùÅÇÛJ‘䘪ºvÿ·ckcþÇ]üŒù)ÿƒlÄ£sz?–òG—ü2æ|Œ9cÎǘó1æ|Œ9cÎǘó1æ|Œ9cÎǘó±eÎGƒ§q+y§,â|tÏñë·L9 ½?VØEÀ¼À³r»f°†Àmé¶[v“G‘ "êëàŠH~›S\:¬._‚p|Xx›(/'—v^‘¡Q‹ÁŠ@8¿0¢šaÂ8nD†»ÃšX€]ÂNا̊›N¡ï† €ùµlôžÂ”'ÁTnî)®!g'>¼B’E™©êªçhYz,è²ò‹?&“‰H à#öi^MÃØœ~°, ¼ÈC‘ØsUõü0°-ÏE®ëùî#ÇõôýçA0ÓY‡gä}ž‰Ð~IrS‡m·%—nþ,]™LÓ*P±K«Ët¥w&V¨šR:±, :U.Wf)#„‰svƒ[œ ÖËøué(SˆI´¸Ì®ž€Ú§ö@é·_ó_{òä°\à*2žÃíaO\ý  „/ž‰ÚÄ'iÌž}#O‚§¶Fo#ÿ>Áåmò¿'W(=‹žiOžˆVß: ÏHFÀîÄa'æy²i«è’]\vA™+*óÛ=þz\Nå!oÀøØ«¯òësê ¬øÝ2ô„=ZñCص°ÂõqÞâÔØ`·[Úù%UÌ7'Š»—®yŽƒ Ì:a9ß­æâŠ`Î9Πt–¦~]¬]m¼*]­,n­£ÙÄ’®Í.UµÍü·ÖØÚKïAØÁý3Õ7ö±ôõ˜«¤Út–âsi çüÇZâbGéû§Él†®Óúûÿ¸ö~CW"Žn(~‰=¦I,jÉ9Tâ žðä¸q:ÈYˆ¬x%9§þ=ˆT¾hl4¹4øK²¢gÅâ£\Ý­P¥wcÓúB41ÒzÂäºx †(!“KidzDççWh­A›rXÓXµ³±Äy<´û_ÿCÏÿ>Ÿ¼¾µÛŸd纩ékçùg<ÿ»ƒŸñüï!ÿýˆÒ8PhŠêxî7žûç~ã¹ßxî7žûç~ã¹ßxî7žûç~ã¹ß–ç~%ãvnÊ+ÔТZF!ê/™.Ò*¢áCZ-@6N©©JýA 2†*Ë1dÄ‹ZYwœ²êV^´‹.c­Eo—«ÉT*uY©å ]J†‚]¨ç¦5Fh½(|Ge±‰ÊØzÒRûÖÓ¸‚¯¾;ÿôöíÉÇ¿ì?ç¿Ð÷hÉÏjI±;CâˆÆ³ôqCa%'àÖµ“Õ¢ÉxAÉñ+‘JðËo{{OÖ~æÏrI 3…Ó#â6Cñ×úOöö~=:Šç俞JþÀÿÿã? ª÷òæ7åœUåûä’4:‡IåET<ˆÏô7;Ýãµ € Xˆ–j絎pA«ôVYê o“¼OèÌ×ÞG õrÜRè…R$]EQüM‰`9&l:KŒ¡lÞ2 DÞ&ñSÄŒŸ1æx® ¸:´€2 ‡èLúVž÷ÔcÏ⣈¿uDüu¹ËQ8Â"!¾ÖÿY$Jú èŒój˜ñ€G˃*XùŽžýôj58L8$­°ó†³ÊêS¼üÂNdbžÄp:ÄÃY3»~ óÚ¬=¥| q(NìrÄv=Ï&¨2͌Ŭñ wëò‚Æ|2ô°"Í`t:äåbB… 7A>†°qúŒžaœ‚ïGOˆÃørþëÓü˜ñ—ËduýëÓxAZøíìØß~ýñüU]…¬¥M¼¬*X¼žòî•J1ó^SHF =³Œ‰Òçp¸—÷O^~Å×ÁŒ•Èkåfèi¿¦¿[b¸ú E}$i$/°¥Å´iQ¦K-QŸF‰òí^Âþ“K•Óé”#F¼;}óéÅKò·ω‚ŽÉt-Q¶pMãòžöòâº_óòÏax-£0Êy:ô-¨ol~e­ü‘©¤=(±Í¥1ØŠÐP®¦*-½_eÕ'AÁV]I+^þJŸc’f6O —øqTWq*ÀøÓìÉI“®¤ú’‹Ž|c ½ÙüxEi³¶ý×7úI˜×9|ÝuÀ"QvqðèPyDÌp¢ôÐ ~Ÿ#b¥,7<Šf«ô >LɆ™aø§<‚mÿLÂô‘ÈÙ*µÏÊhé–£Ã"-Ü, +ÊÎ|,Š)í93ôøÃJ??UÞP„ºAHÁs¥nAȰD¯ ‘ž²)²ù’çYçÍm’&Øã¬N]¼Rt+@%š N½›…*kœ‹r>V¶£^¼9;¿ø~H7Á2 o{¬»œF’”WejÓ°‰Ðœ£Ï˜Š'Þ°S÷T¡§âDüxCšùlB«Q©D(Ò/H3t9ÜG²i@JŽšQ6½i÷ Ø ’e×uy8´Öœuþ(H®o⎳”¼2%¯ÀÑþãGÔœ^Üäƒ(kR®¨©YÀðˆQ«À‰AQ\B©  ìa@Y+¸Šgá/ x E³!ˆ¬ÁKæ,Ä »ŠZA‡Dž+ô¶ ÈQL授âÎ}z×÷<Ö¬P"w¨R¢§úps86b‘0ÙE!·+*”<šuÑù*jC‡aÝðj²›™8˜ƒxpJÙž[qù®/G1a‘#ì>:(2VG3 ÐB9åVãžR!@ZØ¡ECbV4­hžÛôdއTÙÍ)ňíF& BˆÌµ PƒAµ¡aÒŠ€9V›€_a5ët§ 9‘5ÏOæù€ø;y Ÿsß1£žX å¡,Ÿ`ÃûOÉ+àï×w1ÝL€àOl”%ñ\SêÁSž€œÖ¨z2RŒ Õz ÃàH DDæ˜Bõ\ƒö$s¸ xŠþ)yŠžQ¿±.LË3?‡œŸ1¾þÇ"9‚Û)À^cm÷b“ñàê2ùø }‰©yÉV,?ÓÊ_Ï߆\¥ ì(x5y‹êmºԖ‚Ùí_± }_Ú—£åeX#~! 룆îdлò¢vp×ü8'îSñxã¤6Ø}öö>Ì0qmɘúÂ!fX¤Ü$+¸»iÝAf Où¥Ðà‰X¡_c²†ïèkR¹\:OȬ¼ æWÑB]WƒPÍýr· .!ûUüGêB\Ó§üÛt5Ç:xÏ¿¦Yí4dCž£˜(À2B%ó« p q_'€ Zý*¥A6S$˜ÐhÍ„Xà‚.•‰U즟bœ @ø¡E,n­¡;о2Ã_á8ªDAÚM¨u&Ë[’ÿ˹íäÉ"/ŸEÜX*uD/ŒúÏWó2¢CS¤AC‘ Oê `æÄÅDl$‡JSÖÜcè¨(4 ñIУ‰„Åêèt…ã3ꮪúfà™¯ëšg`¹¾:Hõu‘sBÜØK1,–°ù˜Ý^Sf¤7Š©áKDwBqøù ¯‰Ž*l…Ü3esi„ø# ü+ÍßæˆÙYÄ[a–ˆÔ­úÕO ’6Çìf¤2’ˆ°®™¤ Êʑߓ´tgRN HíÌ-Ÿ2ëÐj‰Ü*.Ò^9ò¼Wµ¸ œ½ˆŠ¸¦§&Møhö:CudùÈ¡!ôQJf.½ÏIÀÞ§zÕ6[œò£ANcGI)/Öiý3¦Í^Å—W³Ö*Ñ- ñ¼eâ°¸…Ršò±VÄóŸ¯ÈŠÎ t’¯‘†WÔÞ%#âg9D8„”N‹DŽ4|¨Ðß“ÏÄýbÛpîÙ‚ù ÕÙó£²è*¯²Àa=ßPDÓ?‚Þ g2C̼6Ö*ïP1!€ á:€‹½¤ì+„s.ËõIc>ñ˜Oü‡û¡ù¿pÚÉ›7÷tÿ“jjÎÚýOŽ1æÿÞÅϘÿûòÏX% b¥Xcð˜<& Àcð˜<& Àc𘼠c Àcðó²‹q+À¥d³æ±O§å„\ɵ8I8Ye $ðÂõí4]˜r– Ýºuü€»CC•Bì`à&Y Ôpv²–ðŒ]~gz=¡5Ã×"›̸ÌÖöY¨vr, ±òƒ¿»Zùõß!J¯¾g°dfW¼2˜|šÎ¼èÇ¿­5³=gÈGé*ÎpÞêeгxv:O±Ñ4ÃôŒ>ÍVaœ fHå¨þ%àD¼8añb‘¤FÏØx€§­@ ‘Ëÿ¥‘KÿãçZâjúØ®öøŸa[š^‹ÿ9Ž3Þÿ~'?cüï!ÅÿØF¤û°‚s£€;§|äÙ#6ÀCƒchp ÞChða†7,ÇÐàCƒ·\OzE<é=åSó®eòà y«‹\¹œ%>YßJ+¯Ùg¯ÁÎ1ØÙ?ØÆË©íê¶j†ê! E.vuÏÁ‘8òƒÐGœÉdsŽëÓ¼! ¾¯Úª9†¦GÈDvlÛ2uCóyó òsûGáj>¿Ùm\5%M¢å PUì¯ï8%Zûˆ> ÁAe+emžƒi¨›ß—^b%@Gs ¶!yé-­ôj~ ²xò%ù‹×ŒmxœŒâùW"“>\T]ÃÅ=Ò¡d†ß»køXp^m%@dåíŸÎ_~ÜP{S÷%´vê:l‚iŸÅ% v:ž:Z»(Á‡jhCž7^ úÓ’S–¯äðÁ ²ZrÜ7Ç¿Cad»!B¶ø¾éaC34×C–Øž®k*ƒ"íÔŠ'ŠRÙ4A—ì22w¶o¯71Ð*†ïÄÃÿþ·U’}ß4S±6‰)#tYh4  ófYÉë×{†˜,ô‰äŠÅê+Oó­p]òZh[ÖëD¤s¶ u'4 o•¸ÎæÏ¶?쪲ey«“!$r€ÏNt#1L~¸ÒÅ3´ÄVHÀD(«.ç¨Á´&ì®tæƒ3¯³Ô1QœáùSÞsþáùð 8 uÒ…™&2ý“Æ,øfã6m­‘Õ÷ü$Ë’ ê¤ÓnoÙ|gâ4¨Í>¢ó{¾aôðûó;, V˜Ó Ÿü6€MBŒˆbœÍI@…UQ£[[¥8겘Íâ…îÐæµL1Ï%Xã×sñÍ~eû”—5ÆÃ,·¾/ë¦ݗžnGäŽBdz¡czºyºéªv}Û·1vœAû•Û7»Ú¯˜Q> ¸Þ–mæ—¯ÏÞ¿›^¼ÿóËwçTÊÓa–ÿ[<Ë:JË¥7%'U MÊGUkSÎMÄÌÈ52L÷̀Xçšo»8²ÁpÄM0®Éþ¼$ŸÄºjÈè )D¨5óF_ºôà;g“ªAÙ¤ädÈyD®7ð¸ÌwÈ"Ãue’ LY-ËB©ýúÛápߤÍUà÷Aï¥R¬ïêtæÔNˆtÈŽ°©éŽa¸Ø3tDºw‰co8fôGàù®N•Þ²Äøáþ×½ïZl³îi¾Ž 3D¡†M[35Âp–ê™nDùƒÖ½´¥žÜ¥²Î…6R¬=dèlÇo^ûÛÖRŵ^rÎè»Z}íš½’)ˬtœÌMvj«oPJ/èCÄxYì”&çÔN:Æ™þwÅ™xiVð6_l”Áé~˜AÌ‚—ù#|~i‹d+¬œ\/MÑUÍ„ &pn˜Ç7ñ$õ½C  åÏA%îl¼’®‹ ASK¼Í…êþÚ§×Ë$KŠs¥ºUÈRŠó-š$PUv4{–;uJ³#ÕÉ*ª½ÖÒj“ “`ŸFÑ @ÿ"ùŒÉÆ£ËZçïmZ“’î0ì¾&L÷û[ê݃Ùz››îµ¦Âéè±–ŒÛû[K0\•M²L©Rœ¶ðü áCÑ,ETš–-£’ny‹g=áy!Yi:uP6.|Ûi³ŸñÍþó¦it›Åí˜È})²,9räϦ×eDi¤Áã„YcÀv»¯/˜éFl¬?ž5”øŽWŠLS¤ÈB²PŸEÕO Äg¨—ÝÒ³ìZC⌠‘.eâoŽ,ÄŠ–㹋J“ˆeKà ¾÷´ÒÂNäàG5lÐI”P9ª^H‘HCõq–±Ë»)8@QB™àòrÆáô@›ãi2˜ÀÕ’Â1AqÍ §©^bŒ'Æã/Á”hQ›ìD¸ –ىxÊ,^æKy`¾šeñ5…Ìæ×ÿ& žŒ7»9TH«+Š« (IÀ°éàÁ£Ep–BÒ.ýÏ=­"ÛC¤ŒÐj•Uü’ü(fÞºœ(pû-½mÊnÄ-î ÅHB)O1æ-_ˆF1²î'èÂ=ƒ²I_,;•ø)[ðù½ù²ïÕ•½x~OˆûfíQÒ¥\ªŸt½,¼|Eø>;¼cÏùŠg!C´[Ò ¤UÆPåSƘ倘HåSŸaqI2{ÀµÇ°|ŒÆ ÔÈx©¡ý]³.ù`ç+bLaÂºæøˆå¦ø-Ê)ÇV,ß ÎÁÙìfp†FHo»`…ŧÍ#—4oh½6‹âû4Ÿ§34¶>Ð “õ±ˆÄbZ49Vö)©¾K4þ¯¾/F_ u´sFy/qÖ D&ÂÑ0UÈõN¥Å\ó+ uFò‹ìÇŒ³3ù °Ýbf)sŽ>‹É@Í(è{ l4e×›üK(ðÇâFðI^¥y­±Ò³U.4ÄòÓ e†’à;dê¡­bDü,U|ä…æ…"Ò9p<„ð¦1?}:/Ø;ê@) ·¶ Ƒʿ=SÔI98Q÷žš=¡áÞ{ö„Ú%ø6þЃô$ò­¿ÙØÆxµä•À\ç·Ùç&Wð,\vûê°Aè]äªr\H`ƒp¢t}Ý8¿C8ûþ8¿pÕŸ(›Ï vÍü·,¶3˜N¿ýAHþƒ—Ut[ ¾Ë Áf½¶!è¨8P*o×MÑ`°Lx6ô÷bô|ÊpÙ N+i½Û¬±‹LÕǤ;-|Ùªk’ÿcÛ·4'@æÃ¬t«¬‰| lM`wp~¿nŸEéK¨­Ê5‡X§*ù lÝw,×Áš¯iÈ'6&±(ð‘-Æ+¸¦˜ÈÐ^2ª'Y¶YÏ1"ÇWíP3£0 -‡Ž‰±¥Zºèî°}q7K zqÑnò÷%É6äW‰ ²¢È05i‘íé¦o"ͱLdù¶nƒi¸òˇÎÈÿ>ŠúP¿/E¶¡>‘tAè;v [¶é9Ž8 N­¼ªñ€©/:§~/áß— Ûò <7°£ ÄXSm#Š\E®iFèâ†>Q!¾|èŒø?›ˆÓ=)‹—0?aÝä÷£Wð(øUé¿þ&_º¾äÜJi˜˜fÍúš<Í"Ft ¹JL6d¡ÐæiܑҭÔËEØgá:h•ž4Ûf}ˆÅàEz #¤Z¾åãÐ 4+ð°éê¨Ú^ùÐK rBëcJ‘ˆ;Øg}iûaè,_S´aH<ŒÖ£4¸C°èþÒ‚ËA¹'mES» ­m“TûmŠf\Æ!¡Ý(<‹!ÇǸHD£ŒEÕ~ÂÊ7 í¶ËÃ;(³{.Š()øm’À7‹«¾¹ÚeñF³µï³D|«Bw.Œy¥û¥°û”UŸ"V¼åSƹY­¢b"”í¼»*ð¨rF)£³Ï)O9ÚJ1¸ŽUså%«Tr"ŽmyÞ:MÜa%IÛêAˆ‹—P\ù …Å-—vükoŽíª äÁ¾Á»"¹ ×\9«Þr)Ÿ³x÷¡]Æ¢HZP±½Hi‰`Ýï®Yê'° =¡ƒÄÍI³9Ô¼Þâë£êmÓa¿ðš+º²üf`>É5ñÓ¥dK(¯VëY Ü!ðü DÔÿ…¸àL ¤l'¨Vë% :„ºÄz¿¢¡å~§ðXãZ÷X¼¡ò‡±xÿJûåbK×!„÷ –n=Æù@½‡1ÔPýì–C °|)x?Ä*ûL¼gÉm$>dë´†©u—þTÙÎâL'„øëì†fôÇ ?tÈ)»?yÂø”ÍÙsÿBê¡Ìg¬êü÷R"e Í“—/j‰–J ƒCbÁQ°ÄˆAX±dhZÂïsºã.—øº¤’¦gïÎ.¦«U•™¨MÐÖ¹–N”Ÿ»+_1ß°,Ê°š‹³–âÕA®Hûì ÉSõŽÊ,ç#þ q7u»8³•¥“»déµ®)X 說,£Âà ÏkÀo¬/Ž &Ïÿà &ãOçŸ2þKþÓ.úhDZ4ݰëø/¶ªø/wñ3â¿<<ü—ö‹vG˜f„€!`F˜t„€!`F˜f„€QF˜æ> `lW·P3Ti(r±«{ŽÌÀÀ‘„>â,H&;þň… ß éÈ14=B&аcÛ–©š_†9šÅþQ¸šÏonfᚉ#ú&•­”µ5z¦¡n~_P©Þ×.®joz¶z#wõ2î¦ç«€%¬ˆmaiÚÑ#Ólyg½Î@ ÷¿õ•µ>K·U”³7]ZQº²â^.ßÜp•r£{®j¸–¶å¹Èu=?Ð}丞^¾JhýÊÍ]bým•dß7Ÿ'Ö'PÅüáU˜‚Ò³f;ùI2ë‡@Ô: BT—`ÔZcR(¢a/l_íª¸O²¥›wØÆi…8 jӂ褞o2<ÀüüN\8Ä¿r‘y§û\È!£@þ06æS/îÉ£×£¡òyÅ©UûÊ5˺›W¯¨š|ðOu[€n?aÈÀ×öÍ(0Õô5Õô|Çu‘I!Ze´-¹²ãšÛfæ“O.&ŒÁ/îûÕ—*Ž+ªV剪é'ç Ïð]߉B- G³\GÖ£-BÜЈï„/äÃgÒâs¹Î¯È”âzû µð=‰Òƒ1Z1 \9¦¦c/DR ?z‘³†ùŽo¸ÃÊâïn-äïhVÉô%ÆŽÖÀó‰¢SµÀvHÏHSÕ0p<Õð‘ ÒhtÄîéðÙœW8\Ͱt'ô$ÇUx  ‰k¬!7€jÅ.Í7ZQ£8çX‡Cæ þë“â–79ÄE߅تÄÐÝÀ CC "l#/P;ò<¸¤Ñ쇽èòÑç—'®]œÈ–þž–¸/Ù·YâPu-;p Û.ÑðDÌ™."ê&UC÷üaj÷¡7ìoé,èëaÅ*]¸y¹oÕ[O‡ýßsÁ¶aS3tÙZh{†cEAd†žj!=ô i¾õÇ`ù,èëk÷GdŠ¡–`q…¡œ ú.ÌV8|È´t×µ5Ç%.¢j¡á8†‰¾ ]<8pÖæU‘Ï‚¾.LÃȆÁÆhZCTÀžËó„¼O:þð'õ7Q&¢ ³"™ä·¼Bæœ#z¼ZÆÊ["#tUÑ짆úÔ´ÈïªW®‘i‡8£aBÂ$öùê!»¿²Tê‘¿­ÊXüçÿy7O8ö+ODOÇò¥JŸB`½=þ„Òi\ß¶9øoqø³ö|»öæõ2þB¸à°×›Uê°Ç›Q¼L³R§Ýß$ßeÃF»H¦_Qœ  ÍqÀá€7É[+ºÛû¾)4Ñaï>S²¥Áv|óÝj>)Ñýú<]’Ý ÙvG¯yÂÕáS*2Šw»Ï3ŽŠ9öåøÙ ]§h å¡ÙäK§=G»Zd1×<Äþ†,„º8U.’Ϙèu‡,EßzwwQÛ!æ|¢–0ïÚ7ܺ 1ãw¡çv‚ð6Yn%;oLY¯½ ’ä¡é?ÚR ôض^¢µVû¬C‡àôm»L·°Y¸ê£ùŒÔX@<¨÷úš,?‹mC½XðnqµCÌ÷ž ¼›lÿmª»·9/ã†Ü'üÉãÇ}ÉPÄ›)þ(è)w›˜þ1«¤ÿÇ  JID`²L"h½”KtU?Q„ ÊÜBâÙ kƒJ¿kÄ1¨™Û¹qI8LA~²Ì8 þg,1Oã6×"íOùˆXi*~zÇÙV"F®èc Ç—‚Ñ`ŽQºZbjô¦7)‘””Î —Ÿ(:{Òyª‹åêò’ÈOJÕB`¥úø }‰ÉÊÁzÂn¼\á42I €"ßðñøK°·92Έ–¥âÑ’wI)ZrÊ¢=Ãq¥+_€…3GT/zšÝ*¤ÕÕºLƒ$€9²RAf%EÙ¡ÿ¹Óµû ©qˆ‚j Í“åÈåG×@¯ñ6Qþ’¬âr*¿‡ÈÈÿ–xFVšpòKÐwz¦ÈcaåÐÕ­#>•´a~)f°6LJ)û3¼¸Ì®ž@užüšÿúÛ“}–?Éž!bÏBà™k¨'ì¾Ê¨Y¥â‚DÀd$çæÍDùe… Ð&SjK‘è¢A…<ÙD=Ï·èšuÉ;_s€ V3‘árS0ÒñXiòqq˜Â³‘ùiÌøG4‚Ì>ÅŧÍ#åÍoj½6‹âû4Ÿ§34¶>ø“õ±ˆÄbZ´à Vö)8øïÿ«ï‹ÑwFæ*ï ΔÈD zÜrÍÒŠ«AV‘]˜qv&¿ Î˜Ë9úD,&S[ÅK àIÖ›ð™ôAŠÿÈzù1G8#ëÊUâ é>!-/%ÒL¼ Lå¼AKù﬿wIŸ+º :¬Î¢ÏDDM0Õ^ý Küd#$â¡kH#>Yè†m"ôP¤u?Þ|útþn5?Ç¥ ›+”2[aʵ}øím=|›–ma;ÔÝuµPUä¦áØ^d;¶Ý<|Y|Gv ÿÝ9|Áù$þíB_Ô®Y÷ìÔmVeÛ¸vÇ)ºeH°W„|Âv»ƒ›zÅ „¸+8ý‘‘¨ Ž ÉÀÃ]b0vÈYy°êíYB»æúÛŒ÷Ý듾‹-Bhÿƒ;¹Þ=QÔàoxíw±Cš¨PÚ) £d;†Ï£ë®é‰ÉI°Ä×Dÿ ‹Zˆ“†1õVEÒ‰Ðþ\KÔºÓ}9ð°`˜ªºó}Xt{/û¯<ë5 õ0ö[Ù+è½Ñ:$k= Ö w·*pèyPßÍVθ»ÓíVîø^6\uæ¥-WÙ½oºÊhZvÝ?;þÜÞOÿµt…èNûhÇÕMSkø¯¦£š#þë]üŒø¯ÿ•ìÃ÷uÄ}q_GÜ×÷uÄ}q_GÜ×÷uÄ}q_GÜ׃ûšf`›–åù>öqàD–깦˜n軾np䀊ƒ°_#/0£(ò,…–ãE¡akØÖNz5¬È«À<Þ>ä+y²ààÌûà®Y›½Ã±²S¸ ¨Læ·Ä±ÛK7fíî“n’6bn6>/²~,Æõ€q9רŒêª‚×ä°F.Âp– a—ìQj6TÛw ÏwTÛ ‡!Àña)4‰f×ð¥Àãw†Ï¢%ÕKe;áö¥ÌƒÃÜñÊ p¨»ªê›g¾®kžMäú^è Õ0ˆW†š™”/.f•ckqûpùÆØC¥ …Å/výõ·x%=i¹h¸Èp Ýò #ôU#pÃÀPÉo¡î0ÐFœ ”~æÄ¸ÕE”΀ ‡Þ‹¿N³bXl)Ë:,JOBõX”õÝZÒjt»þT«†K•Ër@%«]ýʵ´©ÆvÝ5"Çö5DZ<Ë#6§íè~¨’?P4 ™^Ñ{›Ë-vi¹‹«û,u_Êl³ÿ4Œ Ï ›Û ±ùÖLb÷F®îD™Ãàvo[nÊÍïZ-Ý^Ûgúe› ®†©úØT±Y‹lÕ5Éÿ±í[š ØTYùà‹ÍÀAë‰ÏœÒÊ‚îËÑ—D@ФÎ^ 3Õ[At¸EÝ£b¹ƒõx‰NeûüI[ Ø.mímò…~¢MÑ,’8$ô£›5T«‹DAÔá(Jÿ¸+ß4´Û®Zï`ô=ˆkÉ+¶ð6 ntß\´²ÅMsÑî³€}«2|îð:ü?Jú)½]AÊjÿm…•9º¾¦˜i8ûŠñBi˜-$¤k¥æñH”7.ëDù‘ôòQ¼ ”uCƒ<¼¢4º\$|›Æ‘èqx£Kíø–ÑrÑ9X ÄäÏÄ€ÊõÉpšüÏfî˜ß mäÞÌýI›5÷QÙèÁm#€jV²|£Þr”ДÁÙ1ÔþÁQ7̘6®•?uI­µ1 [îÝ¿0§Siôûþ…„/*•,l•’ßæö V_ÔâJ +ìe&ÎQ@å7”a³à7=*d ‹9•Ô—K|ÍúäbëÝÙÅtµŠC òG!¾ ÔQPÄÀú Qýs®d!ðÕ\˜ÕÅ«ÃØ¹uöý¹»ƒƒó0 6ysÿ¢\ΘTá“Ä*‚@y@OÖèŠxfyÙšøâ˜V“¼jtÉ] ºµ®I €½ ÆlʇóøAM}^ƒY 0Œ•c¥Æý‡Öl¸NsW• íõš®›õúÛ1Ô±þã.~Æú‡TÿÑteíX2‚Œ… c!ÈX2‚Œ… c!ÈX2‚Œ… c!È)±]ÝvBÍP=¤¡ÈÅ®î982G~úˆ³ ™ì "#B6|_µU5r M‰"ìØ¶eê†æ—‹@Žf±®æó›Û¯Y`Æ=¢O`BpPÙJY[/óèänSï‘ÏbCÜçWGÔÉNå÷í¥‰ðòfîî®2Ys<‰© ´šß$B7N,ÄiP›|D§õ|àá6äçÝ …ùYOž¡UÄ•%Ói.¢ç²ÌÆ?Vâbïû/V˜Ý×jfùðKdˆç ãÏ-ý”ñŸ Äݪ öÑÿ7£ÿ×5Ã²Çøÿ]üŒñÿ‡ÿg‘îêùwÎL/°Ç€ñ`<Æ€ñ@Æ€ñ`<Xkc<Æ€tDfZ÷Û†Çéë¸E±™µ}X.dmˆÑ—úŠÀšdÖBéS¸z¯nŸÑP ‘Vô:ynA t`J ”²!œOhÎú8~’KF IŸº¤O½CŸÊ¥¨!g7;f|ÿœF"?(ie´^ñ Z(…)÷¶!¶ÑiØýú4%}šÝHuš\ßPUMÄÚc‰î7 K2 «Û0^%Ë4¸Z-.Ó¿“ˆs£üç Ïb"u_ÏýŸ‰c²œ£ÅM¿±Ù’±Ù·°,ޤO§ç\ ÷ôùäŸ$Œ£®–$þ[§ü~É^×Ë.ö$ZzUòýíJív4R~<qDÝn…¬^«‹¸ìæ¸Ó÷þröî5ß–¬è쟉Ǥø(ÅýFìIFìu1Ñ4Ä€íhü“ Mz ESÛ‡¢©»ç2M"›µ.²YyrܯS‰pÖºçã';üé7|‰Öºé'OåüôäÍ ù°YE{ òp€hxZ‘ÿô¾DÞk]ä= ÿÏïÿóäÏ| ¥áG?úIÜIˆOƒãÏÉïèóÆ™ô¾DOh]ôÄ.y§çð%ªDë¢J€úUu«yž{¤iÖ_¶¢¾D+i]´ £š>Ìõõùê/ÉK׫ ü§Sxo9|‰~Òºè'þŽ~ú_¢¬´.ÊŠJ®J© }úñìõOMÊ´Y± ¾.Qpz·ËÛOmé]©·èÊk¸Â+h]B¼ÃïâhXK¬õÓùËÓ/_Ÿ½7={÷êýô§~Ã’hS½E›Ö†ÅÊYw4,‰–ÔkZ²S£†Dø-¿¾øo«$û¾@rÚ~{z[7ºî¯£ç¼Å>Ä2$ZÁ°‡K"«Y½‰X 4ÙO’™@Mî3K‰ô5ܳ4Ûø¬XVúf׈Èw;vd†ØÐÔÈ0 ß6Û25ßvqdC ‰Ž×4X”h?㛯É2Ì±Õø“JóCx±š÷"§)1ä̪!÷?[•l1³ºÅ@ ”äÅ"¡÷M*Ïõ°cÖ7í¶þØ9fÇž$ûÁ¬î‡*ÍBa'ܳ6…üšÎ®l/ÙKæ½dIT‰Õ¢Jr>¦@&m¬ÎQԮВ?õ¤ãè$Ūi”Á«‡4_G†¢Pæ­™B¶¥z¦ù(ˆ|­ýDšX»uÆwp?ŒS¾øq×—ˆËÀEv›Ô,‘Yî/››\S>3­íRä²n{ ][²El}ˆÐµÛvóp’}‡¢Ð6TÝrtß°Bl«vLSǪ«›¾ƒ0Óc¶»FT³"}¼0»MÆ‘˜ùŽºÖÕýl˜y±};²¶Ó¦B¶Y'Sm¡CV‹H/ 4/Œæzã!„áœÆuê&c7ÐxWÛâð!WMæHœZÇ뤖»‰uneGëJ˜ÛUHL÷VlXψp"Ó ÓÓýÈÓMWõ°ëÛ¾1°2ŒWbÃ6{ˆ§§ÿðâýŸ_¾;W”ÿî%K]‰öq["‘ÕqÁ6(ÆÄ¨± lØg8Ë×µ†,­Ä¼u[â}=h?}{òaúòÝÅdz—çåSÏ‘XÈngúþî[¯*’}vؼ^Ê?ûWb»CŒ`W"\¯£š$¢Õ£!E:¤xô¡‘¦·o2òýn¬æ0²ÝÊ~àû¦G4²A´²ÔÀöt]sÐ>3#¹d:Ÿqé{°ÁBëïLT¬yŸ¿þÖÍÕôv)@¾_SÀÍ?·£¦žp3×ÕÌ×ôv!D¾ÀÒF{8”|[,m´Ûàäûݰt¤Ù65Ý1 {†Ž—»&Š ÇŒöŸGKŒéZU9ú-»`©Í¼>0$RÈ“Õ ‰€1øš$ЫõôâEG‰¥¥³ä1ïÒÙöæ>6so–,½®µB{Ú!îPm™tÎóÚ>²±â™e!âêM(ÊæFš½±Rèâq¹dµ™”’­3å«m´Úv÷5ÀL»A#VIPølö‡Ê,þÌŽå¨)”,• Y’®“”ˆêùYL‹Ÿ›Vð¹ýç/ YZ÷ô‡cÿùÆš°§L‘»ßÊÅä¶|» A¼™w)¼n{ | #TžBxGŒ;íàkoÍÚ]úæ?}Úàè·ˆ&ÖÞÙóB0dÌ+ m-t·Qm¦ì¦wv@Y8ÖÚeåÁ¶”ÝÎå„M¯Tï{̽‹õS©!"b J6ì°º:¤"¹]dwC†ûˆ1þlüYÇX¿!yÛ>Úñ,ÃRõþ³cÚÖˆÿp?#þÃÅ`×¼¸#îÈû0â>Œ¸#îÈû0â>Œ¸#îÈû0â><܇Ð4Û´,Ï÷±'²TÏ5õÀtCßõuƒ³ ¯=„ýyE‘g9(´/ [ö†tÒ«aE^%8vÔUÛ5ÔCé¶âáaDx¸„Õ;ÒUÍ8¼œ‡?_ü¤œ ®aü´ˆé ÙÍÿ>|‡Ý,ÊŽp^ãüúà E™­ˆÂ'Þ,^Æä²¡âùjÆÄÎÜÿIùq‰V òÅWâÑ\¶Ý`7ÜHÃn–mGè Ê®l‘ò­„p¦¼ KˆÃVg'(}WgÐ ;[]-ÁÒ TÓû%¾„d‘—+*ŸÎOî?¡ï²ìô`g˲ ƒ[Ú >AßÅÙ¨À®g'TñâÕ0Ïë<¸J’=›*©¡ó †ËPR¾b|ýŽ™U1l· º‚Û ì~{Öý÷ÕIoWdɆ/D&׳áw²<‰«w´xïÉK’2®ÔSÆ7 úî¼t‰\×;Êõ yé1®ß‚×%b\ï&ÆûA¢qmt×÷‡ä%)aPÚJ’—¤B©×Alþý yIª”z5†áßóHTI½îa#õïÉk(€äÕ1gãðwôÓwø[`ó<$¯¾H>·¾u{ª-‰®4Zt¥ÉëÍÙ=¡²L‰5[´¨ÁkÀp$ZѬiÅnJt•Ù¥¬FE¦<‹ª6JaØNÃÆ/²!ãéæt+XNí|l>׳U ÿï7»~ O͵ÀøñdÅÀ)ÍŸÅä4Ûçl§ 6¥+þU?”(iåa?:Ý ª“„øVUyüD9¡uÄù\Z§J´LæÊû%1q±rž­Â8Q ·•è¡¥GÊ"ùŠâ ÚY¥PG>"{µW¥¯jIÃêèÓe‰²ÄáŠ]§9K’ët¢¼‡C_;¢›”èË/32L¢*—˘LE¯®ˆùB_8$®w¿±KÖÒêx¦B 1‰ÿ¯¤è žôÔw–DßY}ô([< ÒàüÓ»ßOO•~‡ ¶DáÙÝÞ5ËmÄËe²œÎɧ?§$Qt¨¼œ¾{ÿóÉÙÅôãËŸN/ ¨—¨ÄžC•(C»;ègqÐlªc£q`wG$áÆÏtZ­.ºB‹pÖ/xc÷VÚ”ìðr¶±ckØ5Í…š† Õö]ÃóÕ¶BMsL©Yít@[Ã1Ø„¶´Í˜«·9 w.j…SX?#sË.LvwÁÔwõÄ)ëØ¨D^8rTŒ5–kZù†rCöE×qJD‹3D´¸’FÝ.ø‘-f^e»¥ñßñ´x_+ΖÂÀ°Êã빇±F8pB×ò<ÏñmÏ÷ƒ™†HsAÄ•í5Φ‹ÕœoÒE¸tFw싯թQOÂà^ïºÆ}¡aTOÂ^oh˜Ê G–I¼uŒ=×7uÇ -ßó4dA­†å•>ƒz[\^OÂÍÞ„mO¢&¼5Ñcyo&Ö“èÏÛŠl“ð€ hAàëÈ&ÛŒüÛ¾¥92 Àþæú‘^JñÎy@SÛuù¾?h’Eòý=nqM’ÍH¾ßNˆkŽ˜*ù lÝw,×Áš¯iÈ¢ÈOŠ­ï«xfDÝʪJÐÔH„š$Ç|¯«Ú¾kÉ÷[­ªç‘ã«v¨™Q†–ŽCÇÄØR-Ý t7ßµ ³ocE%iƒZ=m°[£’}Ú–ívû+*IÓêéo=WT%–E†©9H‹lO7}iŽe"Ë·u;‡UyE·² ’-ZO£ëÖ¨d‹¶¥ÝÁ‚J¶h=Q¬ç‚µ„¾cºe›žãa€/ mäE(ÄôV©$ñL«'žuk´–ä¯g_TÈžëIÌÇs; BŒ5Õ6¢ÈõQ云f„.Ô‚³õü‘XÈ|I7ù´RŽÿÕȳ=v¬Õò*§¹»2Yë§ÄALSŽÔ5%R¡žMÔ `±'†æÝ²f_ Ê¾Ö€‰)Ü™¯ùÈÓ,⨚¨ÄC ÜQ¹û0fwÎۀ̔œ"km§È·¿¢’Ce­~¨ÜsE‰™îEz #¤Z¾åãÐ 4+ð°;Áú´Òž¤i|Y¡îXòHκµÚY÷椒%†$'æZýļ[£’P?ö.?¶ËjMrT®ÕŽÊÿÙ±U‰Šm;÷Þ6¾­IN²µúIv·F%ʨ~B=|FÍXƒ\ŒA ÊMŒîƒÛÙ.0ÁÒÓ P¢\{<©ˆ¥Š3˜ï× ‚› &wš¬§7Ö‰\äÙøs«Ëÿ3îQè4exxs–š7CçÜÏnê4eòlÇ-±Mäa½4/ìDñÂöü 7ŽÎ};««Ö_½W*R $e¿èG7ù¹ØžuäGšC·Í–g¥›)ÀÎ…•ͯoOy²Æ@ª Ï‘pÄ“Æ$‚æ—¤pÑ®ä©Ý€»BBù1Ú@nw>·™Œ•65±=kÉO˜Òe«£ëüf5Ø#Âô¿ Âtÿ¹ŽZ¾+èVügM×uòYÿY'¿øÏwò3â??<üç Êÿ=B@Ð#ô=B@¯·–³Ð#4y„€! Gèúö! mW·P3Ti(r±«{ŽÌÀÀ‘„>â,H&›s\ŸæYØð}¸f/r M‰"ìØ¶eê†æ—áŸf±®æó›¼«»Ä®]Ì=í ºù2¸ º±Ï z{4hmDƒ~xhÐ}eDƒîØçí¢A÷\¶ ºÞç­¢A÷] úNРµC…‚ÖÂÍ~ã¡«}Þ*0tÏí3C?8`è¾+8C×û¡G`èêPF`èºág†® †îó3CW†?CÀЇKÀÐ_¾ôɳw¯Þ?lè-FtðЖDä[à˜úoc!1ÏÚÞpQÒÒ(îm{×:Úð]߉B- G³\GÖãåí éûÓÑš$UOÓ†èhM’h§i-:šËœ“}'†5u_lír§‹®R½'BvÉ—«£ÙªºRXÆ_PÖ?Y¢ õMšðU¼L³kÖWÇ®$Ú°–§6LUI··~* ÖWaI’Ü´z’[·Fû!Yß±Âê OÝéBÕµìÀ14l»d¹ˆ1]D\¼ T Ýó5®°ª¢a'jk;žQÖGÔô["JêY[mÍhVa)­!gÓî3?¥g¥EoïRG±{i)I΄V˙訥Z¡‰‡‹X^¶kaÛvŒ@3C¬Û¶êGºnb„,Ëô!TÌ!käÙ*ðÛŠsûŽÓè AÜ©Q«M £a"#@±=ßL a“l6W7]_30œá@5‚ÚH›;Œ5wµýäæE0¬‡º±Úç°uÐ#'2B- <×rÐ"õ›x†ë{¶ÏÖAo^‡j ľ¯ü £§|óŸP ùsg‹>äÜý–7}2TWÇ„·|ð!|yº‡ Õ 4?‚;‚œÍ[þÎÈ)¤ çaÖu§é®uÎw(B‘k©aKÃvÕˆtBt2Ùº‘kØ‘Éhº®•òAMÏ¢>¤l³´²§ê:¶å¨®GÆké¾Ú8 ×0\7"`¤tï™=¥ƒRR·£?¶ÞE=Œ¨.¶qàj*&¦‘ᢀˆ(òW¤¶ãš.@mB‘ÛUvWD•ˆú ¢éîÕ’é´µG È€hì(ð‘á†D@Z®2šÞ³Z’hú.ù1Lø®äܽZŠHJÎÕüâ °òÒ>$ݽVÒMDì"X6V1Š0‚ÚÄF¡>jà1Ãɾg­$$”§$õ¡çîU“­{Dåab*8PCÓ¬†HÔ0B8Š=ïY5É ôüˆÃÍ­éAÑÖ¬µaÕtǵUìcâ¨X%» ŽâÂÐ÷ ßÔs±œ{ÖKòAEYÀ´9w¯’\5° âuh®ßQ‹TÃr}Õ1¡ê–£1rÞ³J’’™ö³ºNûèøÖLºu<52=7ˆ\ûÄCw‘FV±ÏvFÐõ‘Ý’°ÒÁa?Ñì°>dm‹e #+FÄ_6Àt Í7±F6“áG¾a!]%úÀ`duvY~Ö·ÍrÈ'9/höY‘¶Hì°ñCÍ ˆ7'ÔpèØj@~õk8ð4f}AfãŽVdË0ö°‘Orþb->Þc]Zs)î7À~`ºZhšš©®å„ž­Š4¹ˆ®‹»^"Ò.€ÊG*;@òÁÎ?¥xùz™¬®ßªõ!mÛ)Ö@kÎmËÃFèZv€¸šdcšÄÀ× ¦,!]´iW ¸‡åû@«N:Ø9ñ:D¾tÂî^išØ´l Û¡è.aUuo˜†c{‘íØìLÁí«4o‰g僋2˜¾,+9r«g@›ŽeÇ]•Cø¼Ï%¥õ¬àNz;®’ \Û7£À TÓ×TÓó—6pU“nÄbWž¤J®¹ðôôâtJÈ7½xÿç—ïÎ Vúï^‡}ž$WÀkÁ6¨Ž úc"¦Ú4H®o5ŽKròïu®`mϧ8ì?.I ×ù†Õú¸ª§Û‡}Ç%¹pÕë\ÄZWàÁzŽKr^êu¾²µ>.òL¶Å:Jœ×’Ò>®E2¥¥%ù^"Õ¼ÎÂÖÇ•ð¸ã’$PxKùëãZŠhÎá€qé’Üg]í\Ð_—H•<B/]’ø¬«-7’q±ä¶aò^—dJëê yOÌ·¢’oظÚå½®’÷Âú™BGÃø«]Þëõ”énãObz ®D1²žãj—÷äû¡üGo W»¼'ß×Û,¨6¿Úå=ù~°¼'¼Ÿ±“!ëØ.ïõ¶ìùöq­x¬¬Ï`Ú…¼^O–ïÔ¨${\oõm±|?¼|'ŒßéÛ“Ó—ï.>ž½…#EÚB 7nNEyÙD+·¯ÊXÛ£OŸ6jl¦+¤C*kolGXZ̲-eåI7[QVÞ|eki>›É*2‘”ê+[Ò¢¶¥«¼Šb+ºÊ›ßÀ±Õº [~a[~5w ¤ ÀÛIióèZ¤w ©xxKz:$k«r’c WNÛám&"u°ó•'ʦ&ôXÔèñöœ(¯†ÞŠåÍoàÄ¢þº'Ї·äD¨Lߊå¶÷pNÜÖ®ßLFpb”Í/¬­ò¤°êwÀ‚òjç플´ù ,Èê«;°<¸-ëÙÛÓQ^ưåÍ7ѱ^8ÑËhWj¯o«iœ-÷·¼b 7h»B ]_Û’žÚ|"y¥ÇVL+o¾‰i›kKXilj[6ö¶dc9Äòp6Þ¾¹¹´Ö@UMQâÍ»0”¤ÕÏÛJÒæ7h©R½uU•?½­ÔA_µò —m8îó­/nlè`³`Xg<*ÇâÙŠGåÍ·óýL•7¶µ­và°Ë+Ë·¢¬¼ù ”-jÙ;U<¼­þÙEÀNŠ}°]ÀNÚüzVÐ:´ôü¶ÕÝR¢ÊQé†KÔˆw2‹©òøvôƒË×¶ŽÊIñ¶‹ÊI›ß(> „…N²S<¾íF$iÕæv*IÚ|Mëu¢-Êž©ùÚ[ÒÕÝß$Ç5ÛŽ®Òæ7ðjI­¿V_ÙVÙo+FåI[¦ƒJ$Ñ»¦×J†j9yDY[¹ÇóäàÛÅ¡¤Í7±æœ|Ï×^ÙvÓï@AÉ1â¶¢¬¼ùMÇq9*]—£8þð¶öRå´áªÞ)ËXi¥Õ°[~·]â­pCN#¥“`ÿùÅUœ*¬IòO²Ä©‚f3Þ[ÎMï%ÿC åý5^¼ýÀÃ)‡Ê,þÌ®g(ÔŸMˆI–¤ëdB Dš¬–V&“ÉÖKmì 8.GQÞjëÈ›oÚ:E«§µ¬T^ÝVeÖü9öÇ¿)Ñ]Bî‘rtô¼ô1Q,ù4…÷è'?]¼}£DI’á%»>ùvs‰Š6q'šš?–fh™‰ç®áwúÕÕRŒœ}µL†„™ÒÚÏHç„GŸï}Ä× yÝ_]¦J–(ù:ÍQ<Ë’§éê¾ÿ)áI|t=I–—ûÏ>²“ ³FɬSøÈOÂø–÷ùÞŸÆŸÛøâs‹iû 𙨠»j7}¨ô’hþÕK£kìo€ÿ7 Gÿ“fªqÀˆC«ÿ hóOŠº›îÛV°#åOþ*ž…xÙò^¦w1 »ý)dÇFa‹ìxñþôâ/^*ÀʇO?¾9;UöŽ6N_\¼P~¡­hU¹X¢EJEš¿|·¯ì_eÙõÓãã¯_¿N¾°í/>ƒ¶4x™ÿz”•Þœ„1wˆh‚¿Íg "ƒÖ›Ñ<ÏcoÓgÉÈ?sœiDž=Â[Å_žíŸ2qyÂz_O"¥ñ·Œ½ü=Xœ)Ξ}ºxuäé×ÐÈ/GŸNŽNÉV!ŠÙŸ•Û9{ùÌ+ÞaÉ©„~x‰ˆN/=÷¢BWúFg3üœÝñ”+²'WÊ9ÓÞ¯âÑ/ì±½fñâ3—³òÓI¦ûĘz¼™áô ãlŸš|vðô“Ëø:+ó;ú‚اûJº žíÿþ·^ÞL~Oi²*ý¦Û‹áÍBTqÔß.7Åh\³v:ðJË!ÊЀ9TG×çýç{Šòˆ9·=ýx)n7ÑjA)rðXù €)kúàñ÷Ê?¿×L#¾ñºQG9¦Ú‘±ÛW÷éß×DmÓ¿5ëÿA~ÈØxÈ/K…Nì]_^eO˾þö=¥ÚYÈ‚ËäwÂ?³ä@¯âù%1‚Ény³ÕáOLá‘IúåÌ“ã,lhÍâËžè“ëh†#Ò³:±ðœu­ä3äïqc“P ϯ³¥ tF÷.Š)ÝÕ”6äår.y¹dëì?×'êÄV–øKœ‚uþ…~ð˜g€ÓÞ™×0ƒáÈíý`ý!åd*ÌÚTÎ`§%˼N òÏ’ý#L'ºbžd &mqQ_˜ðÅk&°7T%{H² ¾5ÊxüÇä›òLYà¯Ê¹øû`?ÿjÿPáìFh–âÃGì±G•mQ"Í}Y&_µýܸ&’­¢òÃjVút§ÿ‚|5‹ ç!^„øwÑèº=KV•­ãt‰óì|ðÈ‹Mm\“çÒJñ V4“vi-Ȇ„÷*m½ r‹5tNÕ²­µ¼2aE>¨LÈ[ˆ¾¨Ž4HÛÀöòB#Að·ùºå4/>:[ "Ù¾àýÒ‹•â ²×Jß‘oaG—š=Ç3ÂèU¹;G—D@Î&׋ËýÒ«ô'YÌb}ñµ|¶¿Ä„2‹‚Ñ&ïåVϯ’¯76±Ê¤-ü‡¸¡*‘@!•絸^•÷Ã~y–¯b< ÷•/h¶"_³Ïö@=Èg|C>jeD´Húl}l´µWðíáüx_YÙŸ­–’wé~k|™ iu½ñíÓ+´¸Äø h¸*_– é+<@«ØJÔ9½#êš 1ò´èŸ>ñ§«Y–þL¶/]×çu^¢OÍ/÷ŸÖpSTf,ªà([åKH=ε ÌœËfú‡Ø ?¯fLÖ ¡[OzE<é=åSó®eòàMœf]äÊå,ñÉúVZyÍ>k|½6#ª¾RJ+)ÙFA‚Ä ’kV¦[1*;š­çêÁ›vèV¥,Lú_H_û3¾œœ«F6û8Z‚–/Ïž5BÌ'ʈÊAÉ`bé#)Ra\èF4M í‚ßáèà@%;’~]â᜙7Qmv¿¡+:ÖKiV%="~ËUΤäú7eàƒ’R!ßBÍ÷K¤x&6k/§¡i¶iYžïcNd©žkê醾ëëgÁxÌV!ι®O‘˜Qy–ƒBËñ¢Ð°5lkH'½VäU¢Ày‚©×ãhÄ .Š÷ÈÌ ý|3W>¦–ï~-ÔÉ>+yi¬‡bå²Fê=а´[;®bÁ>­× „Ô€ÿ„_ÁƒÁ³àA\Lè¬K‹Pa5Žº^3©J°¥f£T Ù§êV•à*J PFÞ§òD¹Óï…°”&X9§!ÅJšDÙWâ±(¥`A)Þø¸ß°ÛË”¥¥L¹4ì~}¶(+J ØE™TÀE51‘Z™Ò;ÒUÍ8ì7˜öJ`Ei(æãÏ?)'(¸"Nŧ1—iœÝ¯c9G‹›~cj/$V”¬ŠÁ‹Ò^g¬(-uÆ»_”öŠ|EiQ*æ5NÁ™®P”)ÑŠhyâÂâe NÊy<_ؙ͘û?)?.ÑjA¾øJÜøËÖŽ¢¤(-(JC—M¨´î|Ù$XJÖ_EâàjÁ)ßJgÊ b¥„x1lu$ ~J¨ßàÕ‘H×6T¾Ý¯ŽDì¶î•SH7PMï—øNl_® |¨|:?é7*‰ümÃÓ¼,ùÚ…×eYØë¹8ñÛ†rWÒ«dIöÍjq™þ|´\Í•ÿ\áYL,ü×DÈ Ü9iÜj7x‰$²´ ‘nç;G6§´ÍUÕ_! sºÎƒ+ÈX©’2:b¼pÊWŒ¯ß1³-†­ wNiú‚ä8¥ 9n÷+(Ämp]4ÓÛY²áË#‘Ìmèoƒ—G"wÛÜÖü•Ü'™£Å'ÿ$aLZ„J§Ù2öWy_- .îLFè”ÒoÐÁÝâV4R~<qDÏP²¹ð"Åå³”£Ó÷þröî5wÂô³k|F—XñQŠûX"×Û0ÜÊ#ã%²dyÃίq†âY:é7‰¯c³í„Ë$b\ï&Æ{ujHĵÑE\?ÙáO¿áK„µÑEX?y¢(ç§'oNÈÀõ¨Ä y8@4½@‘ÿô¾Dî]ä> ÿÏïÿóäÏ| ¥áG?ú©ÄIˆOƒãÏÉïèóÆ™ô¾DS]4Å.y§çð%ªÄè¢J€úUµ«yž{º·¿lE}‰V2ºh%þF;87¨”óÕ5^’—®WÃOá9¼åð%úÉ袟ž4ßh6ä§ïð%ÊÊ袬¨ä᪔ªPЧÏ^ÿtѤL›ÛÀáKœÑEÁírçöT[]itáþ.Žˆñ*Œ7g?Nê5S¢@ÍÞ7L ‰Dš5]Ø­Q‰†2;cZBùåýf&Ñ3fgêïø1”òï³ì{"Î&Wÿ~™}ßo0­av†Ÿf “ý:—È|s§jJ$±Ùî¹BÞ4 É‚¡°D´šÝaeÿˆþ§ãP%Îê|%À€­gI$¡¥à[B|»›û¥œÐ²Ã¯h¹ ´N•h™Ì•÷Kâ¼`å<[…q¢@®2±0–J) zÓ´³J¡Êˆ˜rˆìÕ^Ðɪ-Y »ãF–(Åý³$¹N'Ê{8ÉWÐì+ºI‰%”âeF†IŒ å2&S@$¡¤+b˜Ò•4é7vÉZÚãm`¡qbÆÄKÑ<éiÉØÝf÷Ðm‘ÂLˆð€HƒóOï>||?=UúrÛõfwWo×,a/—Ér:'ŸBR¤rDÑ¡òrúîýÏ'gÓ/_|:½üäOç/{U¢ Û°î·¸{¥wß©QG"œîÆ$7k§ÓjmäZ„³~a9gðµÄ¥4–ï‹0HkØ5Í…š† Õö]Ãó²’¡Ç&(¹8W8hIæ×¨q6AÂ?Ù¥>l´¬LCT ºv½AZu$"ÈénXs¿aK-Fm@ü[ï( ¿RÇâïÖ¨DFÔÁë»0[ÓÊW«øÙg]‡(‘$u(ü.C$†®mN³j„ƒ ñ¥Ÿ{Pb×aõ;5*¹ä]q[Œü.fgE¤ñßñ4ëÅ’Þ•ú ï%‹e;Žî‘cûšãXžåáÙŽî‡*ùåXH¯qF/Ðb»YÜÑEÎu½ÙAu%>ˆ;àÊMUré¶Òvévï…í{á‡*¹z[©_½ÝyY5Œ Ï0‘ë„ØŠ|k¦ïãÈÕ(P#3Gû?ƒò¯[\SÉÞJýï.j’ÌG­í‚äk:äBž'gЮ\´úUÊ×Ý6-Sõ±©b-|Ùªk’ÿcÛ·4'@fy;sýL¤َW_“dhjõ›™;5*É›ÓÚòæ6¬þš*ê8’vŸS«'Íu^EÓ \d8†nù†úª¸a`¨ä·ÐˆŒ_‰ eüuš•G¾ûe”äßiõü»n¶K­-5éÖ³&IbÒêILÝ—6À¡îªªožIv¨®y&rÚ÷B©¾.–ö$…[?*‹Ú`ÓqˆQþW·›¿4IN”Vˉj<žÚ•¼,5dÁ4å0TYS’¥ÕÓ£º5*á÷î7g?eÐ$yOZ=ï©[£’M×–Hrû›N’r¢ÕRNøFÉ’yLñ‚ jw{D’ˆ¢ò=òP¶ˆ$)E«'¥tkT¢ÙÛNûoŸ‘$‡ùZí0¿ÊHßâ¬u'»‰¯ÕOæ;5*9%Ѷ=%ÙŽü’ƒ­v0Âhý#‹¦ïz#KÎI´Ú9I£²[3!̓%™…Ôúê:‰P·Œ?Žêµ$>Œ5 @¦IâØZ=Ž}·Œ-¹3U«Ý™Zcìn‚¥#'In>Õj7Ÿvbke­;3ƒ-QÝö€Ø&9Ðêçu%Ám1înŸÃ\‰€p;›_Ïâ ΦþíÈPW²Ó]S.µúÓÎ\çJ¬wH|Á•ˆ wÀQš&‰ƒiõ8ØÝr'Ù½^“á½Îu»pºÚ¾ùÉ÷Ý™n‡’N—T¨“ïû³‡.)A'ßiTr9¶zŸ<§KJnÉ÷ <÷j¶J¯v,ÞtI@Qפœö@L2]ÔëÉnJ.Ün+ó¼}6’„êZ“«ÇÙh·žž.)Õë… •¸ô¶ú¿Û§¾$R¦×"eŒÖâ¶„©Oˆ¾Øå Hbfú˜™.©ÓÛêÀî`$B¾Ñ«­^„;¥¿D¦×kÆ:5*©‹ÑÛêbnŸþ’@˜^ „­Ñ§šL÷Òkq¯fcé¡(3IàL8Ó%U z½*án™IRÞ ›­ât×úLRç ×ëº5*‘Wõìõ;^‰3Òd×·.‰ïê–Ä$}({X Öë)òÝ•ˆ\ë^ RK"ƒ­Fƒ4éì>w§½D~ZCä§$U]oKU¿}ÚK²×u»)zö¥d8ÑŽ;X’¸®Ûò˜ÙCÙÄ’Äv½žØÞ­Q‰¤­Œï–‘$‘g½y®0ÒŽmêÖ|wÊêJuïÕ ’„èu·É ú€–h6÷àUJbòº;Ä’$ôêõ„Þ;^Éît›ì |v¼<Éfô’ÔD£žšx§ô7$0’äû6úGÉòóÎ4™!—$ß;³f¤‰Ùºšâ?q4 hQ`ב¶ï)C•Ÿ‰)dÆgWp½FÚu¬í;̨…¿Ǻ³¼C7ä!ðc®’ ¸1$nH"‹F Ùí‹ ™QC!«‰‹ß“¾†̨¡“ucle±;³ƒx̨ukT"ë1áNJà—Œ6ø¥Ûç1 º’a4ùVçìî¥;W†$$lЏ’z&e·F%Ú¥ æöYIRc˜MÞ•`¥Ý—†$ l ©1$&F„É_"¼Ì¦,6NþtÇ‘NC6Ì6ÛƒÙË’ð±QGQéÔ¨$gÔ°îÕôdV“éQ0Óncž†$4lÔCÃÝ•¬ªu¯ÂT‚ÙbØÂ0pðÎC%†…Ũ£°tkT²¨mÀw@‰¬·›\uNÿë2Iz²a±J% FÃíS_‚Ò`8âGP§šL‚í`8rÇç¡è1 „QÇ€èÔ¨+Tî}Ö¬’ˆ¸á6Õ¬FÚ±“Ä¿zŠz·F%†Ö½œ IÀÙh 8ÿœ,?§„ëw¾•%gÃë”{üPv³'amoˆRö$ÒλW¥,Aý0¼&¥\b§oh ̇Q‡ùèÒ¨)ID7ë‰èwº¦$£ÝT›ÎðÞÃ8ܹ]jJCÌ:bH·FÛWÕTï31Ô”†˜jSb¨X€Ý¦¦ä°ÃTøÅ¦äR$³íR¤Û'¿$kÞÔšòB òïR™’ySëú@”™)I²7‡$Ù›’${ó^“ìMI’½Ù˜dŸ³ÒnU™)93‡¤Ø›’pµy¯ájS®6ÃÕôð*Xb”u³tÜÎ’µY Yo°N[¨P×I8ÔìPd/Q¿mS’»lš í7‰=y:ru¬D“™ëkŠŒ–À›C`áMIh׼׬_S’õk6fý–eD7‹«#CIRM«CÊÎNOáMKbZpMIŽ­Ù}û,! [›v“H©½c}!‰P›¶Ìüka„^L ‰O›CâÓ¦¹ØlC.¾}&DÏM§)k‚RzÇ.˜$Pn36= í½{¥½'¡½×DûO‹,ÆL¸Ý’ùæIVÂ냦±K+NÒ3½™[ÝÖÓ˜“DóL¯KYcñs'6$ägzTpë˜ïô“à˜˜Cð|-Iö©5ÑuwbÄ’ä“ZZÓÉPƒÙ¥…gI Y-­£ÇÕ¼S ~ïkèY’{Ó­ú½é• –Zm·8o·ø’ȥ˷ÊÃ’Ä‚,}¨§],y¯å–„ƒ¬!á K‚i`Ý+J©%9°QJË,±[ËÎ’@•Zõ;s;5*qá­º ·K ɯ´ÌMÞ6Ü´ë-)I§´Ì.š~gÆ’%I¨´þH •–$¡Ò’PiIj˜­{­a¶$5ÌVc sÎÛ;52$ñ«C ó.M I@ÅR‡lItk§ém…Ñqp’hÌn{ûÓKœMç蛨IÛñ…–$Õͪ_cÔ­Q‰àrîUë;Iä4B$Âí*³$ø| –§¿M³'JڙВœ9«ž3×­Q Ë×ë™ï–аQËmâù˜¨–äf;ZK˜z˜¨%ɺ³î5ëÎ’dÝYYwçx;ž–$×YCʹ-I¬Ïòî•§%!?ËkâéO‹t[JK8ºž£×­Q Ïx»<«ï©0m h¬­6Õá± mI&ž=Ö–\eׯˆºS޶%ð ¶Út¸EÕá¢JíüÏž$o÷mu@†º-IS³ëijwKrI”ÔÖšx[(ÆÝP] µ‡”ÖÛ’<>û^óølIŸÝ˜ÇwŽwÅç’Ô=[Âç’Ë­ìúåVwKqI°×Ö›øœ)ËÝÐ\óµ‡Ü)eK`l}—µ¾jS‚‘`ëñ4 îŽ(ÞB³‡À)Ø’(²ÝEnº=X$-?X¾õžßò¥W®on²ßòHöëX][6¶ëaãòðKΦÁõl•Âÿ{ÍNr?•]»ŸêŸ[mòÙm`ÛÞmK°2lcÀ©ˆ-½°ÛpûÍ(Ë‚}%kNáÃi‡›e«MÁèLvY-zµ»1S:ÊúKðùcþZÏyË/Jî=ï-î^ÞMáã=úÉOoß(Q’k˜ü³TÂäÛÍ%^(ÚÄhjþXš¡e&ž»†ßéWWK1IöÕþ1¡j.‰v¬}AtíÍfÏ÷>â넼î¯.S%K”|æ(žeÉÓtu ßÿ¿4H–øèz’,/‰ ^ÿHM&Ì%°Ná#? oà_XÇç{ÈÐ☋ ®Á¦Óx%°‡Òdµ 0åûmúPÉmšð¯æXý[c«€R¬æŸ4SÕ,G³-Cÿ“ª«†æüIQw5ɶŸ0°¢üÉ_ų/[ž#ú.t·?ÅV¿Â(lÙê/ÞŸ^üåÃK˜AùðéÇ7g§ÊþÑññÏÆéññ‹‹Ê/´m¢*K´H©žG³ãã—ïö•ý«,»~z|üõë×ÉWvéñÅÇãoЖ/ó_²Ò›“0#Þ8‘$Ðá·ùlADÆz3šçyìmú,™ùgŽ3"<ȳGøo«øË³ýS&ÝŽ.Às²ŽÈ_âë³—¿šâìÙ§‹WG.V ürôéäè”_”Åþ¬ÜÎÙËg^ñó&ýðeÄ(ž{Q¡+}#‹³æ&ØS…oD¾aN®”sº •W1¨öüÞÄ'ùÌåc†üt¤é¾²Ä³gûiv3ÃéÆÙ¾‘ >Mx:Lƒe|•¿ù}AìÓ}%]ÏöÿÛ /o&¿§Ô…¦ßt{1¼Y¤uªþvi¼)FËàê˜ý³ÓWZQ†Ì¡:º>ï?ßS”ÿs&Á ôëã dÜD«¥ÈÁcå0§¬éƒÇß+ÿ|üý^3øìFå˜j5Æû\É•FQ–\ï3 &Ê"ÉHcóä V²«8UÈC‡Jœ)1èä$Å¡â߈ÍÿoLçíß!2%Øf„ãˆ!àÙŒx·±7ží«ûôïk¢néßšõ ?dl<ä—¥B§@61Ž/¯²§Še_ûžRí‡,dÜ2ùðÏ,¹$ÞöñüRA3²mÞÀßluøSxd’~¹³â8 A3bGí‹>ù¸Žf8"=« ÏY×J>Cþ· Åðü:»QPª@gt£x‘ÒíMiC^.GÊm¬æ>X6úDØÊÁ‰Á¶W¾Ðó íÙg ãð—1¸Mï¯ñâíåXmH9Y„ ³•3bö-)§%˼N òÏ’ý#LºbÂd†&mq™_˜mðÅk&¹7TE{H² ¾}ÊxüÇä›òL!æ¼r.þ>ØÏ¿Ú?Tøû‡š¥øð{ìQe[”H³@_–ÉWm?·Ÿ‰äc«¨ü°š•>ÅiÆ¿ _Íâ¢!þ6aú‚®Ûó·dUyÈ]â<`ö:y±©kò\Ziã#žÁŠfÒ.í Ùð^¥­Dn±†ÎÉÙjÙÖZ#]-—4Fš·}Q%h¶í噉‚àoóuËi^|t¶@D²}Áû¥+a3²×Jß‘oaG—š=Ç3ÂèU¹;G—D@Î&׋ËýÒ«ô'YÌb†ñµ|¶¿Ä„2‹‚Ñ&ïåVϯ’¯76±Ê¤-ü‡¸¡*‘@!•絸^•÷Ã~y–¯b< ÷•/h¶"_³Ïö@ ð3¾!5Œ2"Z$}¶¿>6ÚÚ+øö€p~¼¯¬¿ìÏVKÉ»t¿5¾L†´ºÞøö)q;/ñþ®F…†xü$}…ðëJÔ9½³ÏY¶#O‹þéqºšeéÏdûÒu}^ç%úÔÙür_ñ@e ©ÌXTÁQ¶Ê—zŠk(˜9—Íô±A~8^͘¬B·*žôŠxÒ{ʧæ]ËäÁ›8ͺȕËYâ“õ­´òš}ÖøzmFT |¥”VR²ˆÞ$æVÈÐÀÇO®©W5*;š­çêÁ›vèV¥,Lú_H_û3¾œœ«F6û8Z‚–/Ïž5BÌ'ʈÊAÉ`Â"Ÿ=n¤H…q¡Ñ45´ ~‡ÐÁÿÏÞ·7·q#ûÞ¿õ)ÆÚ[Ki-˘Á<0Q”-G±ul—äìž­¬¯ ƒ‡Í˜"uHÊŽ6'ßý6€y`ÞCY¡•ì ™ä`€FÝøu£ HýØÃùp4fE¹ØÝ†ªt[L-V«¬1ú ˜wù …ôw=Ô8°&xŒºÔ“Jú“˜eÂʧˋxaÄ]ŒbêRIñâHHŸa!ÆšAhl>â6)Kœ$*æHFØõ$õ©Q¾‡Ý$-^[MfÓ俾¼¼É«ÊFvÝ ¨¸è­´jƒ…vs‰.ý¬áïnÅñh~k²ÙLU…Då5›ÒªUgÎ7UA&Ä->™´Éß.”‹LËÌÞ J*…4È^©‘CÍ«šÌõWvzÖWÁPO¬•ãtÕc-ÖÞaÚdeõ‹æ8Ë’9ùù‹ãœŸÞˆüžàM§k‹{-Úf®Âm²î§ßž¾|qqúâÙË‹ï6#©g&­svÄÕ깸’zfG÷£žp>§ëp¿¡íÜXxÿµ_zv};Þà`¦Í«î™ñ».¾ªU­×‚µ¼‡rÜMY¸yzfïê=Zƒ¸¸) =Sp5Ntc6z¿={¦ááQ©›WÝ3…VÃH‡ˆòåÓ9¿­oJOĪ3vC6zG›QÓ3?Tk‡Ú£ñ«×ºõ£Ž“×'äxýòoO_œßžý=ªo¤Ê]Àø4"ç‚-¸P[´Óç`sÚzT<ÞHÅ+Ú´ro¡nCÚzt7ÞDw›þ44µ<³%=ª¼z`ò B{Î9vüá6J˽øþÉ«‹§/^Ÿ>µGï†ÝÐsþ±S½²¯»~qþü?׋õ‘X±™ùtÐ9¤_7Ô=ç#;þF:7£xU¡¸} +š7¤¸GCûièŒbã0V‘N6Ý–8¿nFeæöo£¹;Ð)–ô›YØ^ Oͬ=©¿]ûÄ-Ä8ÿÛ¸–oòR|ùéÚåµû•©q3fõèŒÊY:¿ +5èR·âÖŸ(B”Hä"×CŒE‰ŒiSšDÄ÷×䍯O5Ôê¶ùÀvô(• ² É)Ú¦DmðH(oLPT­‡fУG‚ÛøGzî—tºî—¼Õ>¹&7Ñ'nšËíÛù‘.9wÅÔß²÷£çl÷«×j½Ë ÿ,–båÐÙÌQï-/ÓU±yÊ'Ý£sèl²O¥i…ï ¥jÆû1Âþwžtü"ó[Õ¡×u‚ %þ_§rü¿ë…¾ûœà·"ÈNÿáñÿvÿÏ /Ù»4þèîêèÞÿcà *ý.÷l#}æ_™-é6ˆb{ÃìàÐñô½Áóö¦„Ã7TwØaøÙ4|~¦B‚³è!… ÎÏNUr% èü ¬ËõuÕõbñ½‘ÆÝ¯^,œôs mÜÅ„kËÞ¢;cÝò`÷Šüû>ü4ÊÿR¶=E‰Ô±\¿^œò=3öw~ÙqÍo‚cg29‚ŸVÝ›££é—陉ùÛõ»£éÇûðü³¨^dðN&Y žOÖ{Óý£âé3ýäÌ;xŠÒ§`àì±C=í=þ‘>ú7zÿë!‚ýëú¤7÷÷uÎ_ÒøHCâÃcf øUÿ³•0eÍ¿tÃæv/ÐîC6?\/ÎõÖÙ=ÈX-£åÅŽ÷Ôÿiô©É´óëÎNÎì·bý߯«½éZ\lV›%*C‘¬.¤•ö)_¿+ûñ Ñœ?ÿÙQÿ>8ΕF(·ôgøÿá±cø\ÈõQúTSzúŠªmù¹ÖŒÖ›q3¬ƒÛ‘7J®¶äõâ*kHOKªM¹ÑMKù‰Q¿ŽÞP­â˜ÈÁÍúú¿/ØTï…ù8]¿³ÁH³ÃU6T&.XZ«/ÔW³AÈy yõG“)•­84ÕÛ§ÖïèJS5Vº2aMÌ1˜µÓ9h§9‡ŽsºræBp ,·D8¦ŒÓÔôRÅI¯wòñùŠ¹Ú«röÒbk72tœùÎ_YlÑQTd‘Ϊ  äÙRÿ:£‰˜™¾VÝû@·ðÿ×y`eW;ÝÀm²·ûýtµR͹Êy¤ÈÉë:ÜUÛà?³6Kzw“jxήdQ,9ÔÖÒ±fõQ–É"¦”Éú=Ïû^ܼ6ü+ˆr<×z.Ë "7aåÊûšxì`+ ³µiùßÕf¼¦ÝÝR–³ŒÈ·YÞM¹¨lÓkF¨F9žèí;v½-$Ï£êÒ_*' •Òž«‘QʧÇÊQ­s9ß¼üÞy:JÎW;Y)ð£µÑD“ïœT:#Ü\C€öI ùú&­ò~Vf\•Ë6=tûÂÓ-K¥›XÿO­#Ý1P«éÕâêúªðûš²*ùÔF•÷A´ðOoâ¹}f/Q¦PÊE›­ˆ·,XíËI.åGÎSµƒÄùNDZ\¥9Nèl¦&wbîè½\j-åJ}/–é\îÈåâÒžS¤º‡íõm[v ¦+#¾Å„ª_Ò?„U]]ÍèÍñ$QgûMJt>:nzÏ"÷¨¯ô”qi³ÉÕÏ“ÞwR.nÚï´ ã»í ÏÊõmñq'kzV®æxê–eÙ°æþ²l0µ9?}RÏš³´òàÙý™*CƒQÔ¨>šhwz©À_Ò·»Ùv7GïœëÐ-jS^³n©ÁÕËëõå=Ü5›?sX•oÿ<°s[j‡e…J¬hj¥ŠS×R†ÚmͬÏIÐ`[”´Ùk7Z|Xíλ±”ûŠ„÷ÊX^Ïç÷ç½ÞÞ·Öû¥®µ lŠöò1¦„N¨Q¨Irþ Ý·v¾H·yê¾Ô}®Œ„Ó§9¹B•©Œóãc)œoýàâò4ùWï¦Rí¬„ç©ùVØomSÐ^Þ C(PuÜ?Ϩd¹"à¥C&%Ô­*.‰*!©Bež”_ýqúF³”“£×I•é7;Ôz[;Ô‡ÚxT‘™ÇÇCå) “}+ó/¥Ñj^Ó Àn‰JFíß~Ý©*çÊ~Ï}i—ê  «Ã2üJ¡zú­Þ?z”Ì´=¼˜Ãôà 0,sïM> ¤}]^µ¹¿V¦‘êXó"-OWŒ^}Ý(Ž¥Á×`Bìíªð{eé@·ðBiRP¯ùb.&Õ,¸9ìªå—yÒò 9l3ó³gvWÛ“Årz¥Ü'kã“iÛØ†]YÍ<Ñ€… Ô2±÷ØyøøíØ—6³‹ypÜØÝ?ioèw4׎5µP)jS¯ŸÒCVÌóÚpÔU÷†Y!O+¼¾âÀ«²V)龿éÄ™ž§gïL†Ì õ¢ý¿ß({@¬ÝkŒÖ4à§ŒÁÛÂã°ÉbF/ÚÉâz^²›§¼âêU2@1\‰Wà6ʼ⬴‹îÒ­zø°Io¥pIç8jáÚ¹èäÙôà§?ÇTeó…†~éL7]®Ö'êcyvøéøØð£Z‚£ß;p.–jéñxòç?Ï ¬Ñ\̆¹Ò_ˆŠ¬j,㧦nˆt^H·> £€ì€ /)Ô¸“«-íÖnc}è@T¤šÅ̹9:ƒ#3®¶ ™šsïÊ<*•Æz³jßvbȺÌ*åÁñî®òÚ×܉fbX\ ãAÿM– "Üyô•:‚ŒÚº¾4ygªù¨Ü Ðe+Æ68÷Ó`n¹YšÕ_6©Ã½}ÝØoçõæX/£«ÖÕ{Õ¼µµ§*}˜4Ñ÷Ò¤üpÕIÈ£GwHˆ‹+ö€¶zíCêH³6ÛzÍØ+³%\Ù`Æî48íœ'æˆÂL¾UµF.³Ã]Òá²cÖíݱI¼åܾù¼Þ Áiâi7ñMOw_‰¥Š·\åžsÏØQiÕj-Ã\0~¹V$9Üý¥öÿ@«Ùh× =[Y¥®ÏÅò„ê.hX Ö³7ÿùD»\~uuá{èÀq÷ËåzÔA?Cr¾<6•ƒ@ëá;<ùúÙ3õ‹Ýº¯ 0Í’ëårñ:Û¹¢Ó²— /’¼Ëb¡é¨éÇÀÜe¸Y<”f¿fsC/ XŸ§g€ª÷Ó¸«¢ÿæPg})÷RÂ-öÀ/޹embj?k]9ÞǦ>öZ ˜'ð×&SšU>•÷BåMëÔæƒŠ–™4UV°Ê^e|+Nþ:y(´kÏžÁe~*š—×¢¦zµ±”.I Ó™^üUs˜^%N! à‘Ë2Ëp£ó·QÛÚÛëÞ|¸uzò4Ç}£/.;–¦úõ¯eãvUVw2ßpÃx„Bìå¥Ú’“åà¨Ý§sµ+ è‡öe§w[¹ÓÉ—’ªŸ#W ç]ª#/ïM6*!k©*¡ìqw2H-¾;¥8°>¦ðÙ,Ì®EÊh<§—vœüPX5ƒ;×WГê(­›ª¾h(Ørà5ÅöØx¢Åíþ ï#-Õú4©ÙMqN¸0Cä¶ ÍN nq¢—pº“G XŒ*½WjœJ £3ÞJgžLªëQWiFÛ¡"ËáŸtY*JÐÄêx@s«ËÊŽA\Ì›ÎUgPVƒ÷²ùa®AÂ/™!¥#õ‘äj%Å{Eð‰j½Z~T¿Ì¼0_–u’Ž?ÏœÀ¨¢°ŒCÆþ .A×/çE¿äÄ,Þ¾¥*H‹žLgÓõM¶¾sœ\¯©EØÓo,2žðk?b¢Sw“•]žW:ú³ÈÜå3-‡&ˆü…R%?fš=`ÍÞ£-ýøà¸ônÝKš-©‚•£ÒÈ ·oNÿ>± ²¥ žžŸi èI³ç4u~¤oÛ¾ÎÍ«X’{Š÷ö›+´Ø%UÔ_äÏ\I âçõù4Q¡·ƒ«°ÞÙÈ'ÌÖ—ò²l½Ó…ªõÍ+²Ãû_=yÐÔÞ£«4‹)ýCiH¹Ô´¦\‡+FJû$¬¨²Q@mɲ×- m3{óØhy«¶ú5`l´UŤ\ÍfT§X¥†y®ÌÌ•\*„[븥P6Ë|Q„Dd%L×Κ¾Wøj]¨çΞ;æB–4[–ûÉì#½Y¥"¿Òý³šª¨é…ª'Wxjeâžß¨ˆ¦7G¯³B`¾13Êt«Ô5! ¿X­ÔE7– ®ûòÌ´Ty>ÈW—Ì›ê`Ó4hV ¾)‚2Ç@:íÕ3¦¾FãæÒΠ}cœð%ó Nþ:©p=/yg¬¥Ýæª\‰ug¥µ,ßQ‚óðÿÖJX/étÖ[Dƒ_ÑÊÔ°•§„g †8[|\5ÏŠ«¯o^Ó·j^ØÛåÓ»¥é1ƒ…«6õÿ ØÚá|iU–®O6/.µÇʬÇòÝBÙ¨‚\åq÷üÌ€žÝö(xI£—›ª2¦¼™…*Õ³ç_­Î_-ÿÅÿrÝ7™ØÝ7Y-]_Lªz=í7Ã/K…šAå—Ôy¹âÂ[*iÿøØÀzûu1ÌlHiÇ‹UF ŠÏ%Í9¨šŠngšV_öxl£@pÀ[}éZÿ…éáÝô­šYôŒ³˜ð3QLi(X 8蕾vÐ+wjU°¢3¢óì™u©Cê‚‹Ñ•ØõóR*z¥x€WþÅB€öÇrwâ“d)èûNü ¯NRmŒ¥Pd³órŽç׳™Õ¾òô¯åáPéB_¾ZŠc_Þ³¾,Vñ‡÷å+sÀê¥M$¢ÜÄ¡>#LÍ­é=*»õ^l±ñK Ç@#Ш,ë•^©ãdjÕ,.UÝÜQùšIJÂ~^Û)f30}Ÿ¾/–™6ÌHr¨T1?)[ZìÖV]_µ1²æBéeq¥ãíR£FQ®DÌ(Ú,ÎƉ×Bh\¼_Ÿmìî³F# ÁýJȆ•Ýn˜ }±ƒ\jAgâc•µí‘µQRT™Éšê¸½ìå6]ÒCÞl÷éËBÎê4ª>×jkÿqê *MÄu:S££ÚëË+EkùA®¾­ _ÕáZ¡é:KÙËU9Y™º;Õú×N.|«DçCÀ¶_yT­³>g åÿjídµå°x·Â~ý²æ¿ú`e3Oº{þóÞo4uƒ.¥¾Ë X~ œž^åL_ åú¤vy6âL8…ÒZ Nv÷‹^e=íƭìõƒRŒP–9WML©&öe˘,æ°âÀ„2Ië"³†O'ÆÕ*¸0ûŠ ëÚ…Øô¤%Éð—YòÜÆ¦†AÕFo‹8±‡ej)­ª”i®¯]²lŒ”½Û)ºòBkŒU$Aÿ[áf©ÉŠ( N>ñ”óê÷ÓŒ©(Ur˜×Ò=kö¬¬Îß¿X¥±ˆ›ÌÉÍg¨Ù³3€uª½HÇ™®Ê3ólàü4«kƒ“”öI·f^ÌÙlÊÞCöy–6MNÅÖ¨ÖeèC‹'õûã'Vkïs龇|;à÷tù~7¿ÆB_û®Ä•øò#Ôÿ¦½gÙt¦ÆBK]Ÿû°Û1ÕRýüg®ëžÝ{þ{UÏÇ(ÏÞFÒFH˦MçXk^ô…³›0!§³ËÅ•>zË…_Ò^ñÃG&Íg>_êOÊ ?…ðÉ«œ}¦mNJ6—¬r‚ò³dsÂÒk V9}b~}¹Êi47¬­rJUÐýª™N£*-BŸX„ªYÙ9×WÔ\/-‚Ÿ•~V#øï5‚_W ~ ‹%-ÞStOÙrQýª »Öÿ¶üëæ]„w~|Ÿü»aUþýÀå+©Øß¤éñÎ0f~œ\-.¯.<¤Ú ÿ¨S¨—éq69øqòêå÷¯œà±>©¹òððð±z~ñÃùÓ3³­øÀ=˜hi™¼yófÀÄçnö˜ÒÔ$ÿw{ûK¯ü»QMþ†£üo#ý‘ïÑ…˜;øÞйš%KëÝoJ×­máÆ˜b~-]sîšy¾Ðûv¿J?Úšb2gw~å]'áúÒ»ŠwýhG߉—· • "Ðû«üc…¨Í/Í@o«_!ãP5 {W-ﵿØ˽ZLÁÅæÿ¹øXÙÓ¹[Ê¢|eX¶q³Êâž›‚êú?Ø:þîã?4êÿm¤fü—Þxé¡ k¸^.øµ¶Nà+«³û,âKo×T÷v9õÞ²+àB  L¨ààA¹F}åÉlf•zúâüõ“çÏóôs 6•ÁW.lÄ–¦&ù¿øo¼ÿk+iÄÛÆÁˆÿFüwñŸÿð_ƒÿo¼ÿu+©ÿ)=£àØz¡ü)èêz©6|[ݬԲ&@²ç&«¾,Äù¾ÈäœçYµ=?}ñ·Óß6x ü›©c©TÁ |¡ Ÿ@4j|®9gæó"ý }ñôç£ñÓR“üß üçò¿4â¿mã?Ä#þ»Çøoý· ÿþ¿­¤füg;ÙØ:­|ð•zåFüõûNMò/ðßhÿm%øoÛøøoÄ÷ÿyÛÇØ­á?×õÿ6R3þ?ÓË«™Ð«¼\(Ä÷Ôü✤ß>ýï'ß¿zþtD€¿çÔ$ÿ÷ÿò¿•4â¿mã?oÄ#þ»ÇøÏÝ>þ ü:þã¿·’šñ[³ ›#Õr0>*àwòú䑹xÏùÆúð <¹8}Ö¼Ì;BÂû™šäÿ^à?w”ÿm¤ÿmÿ¹#þñß=Æè3¬ÿuü7®ÿl%5ã¿„®¦Lo†!¡àÝ×êç‡ì+ ½Ο|;úþ~÷©Iþïþã?¶’Fü·mü‡Fü7â¿{‰ÿÒãnîöá¿Uñ_€ðˆÿ¶’ÚýT‡Àr½x/æ«Ôõw¡ÎuyýòoO_œ§8Pã]\,Å[µ9øb:—‹ òNcˆ?QFÂÄ—ÌgÈO\äÇID¥`‘Ë‘LCGSBZ€zÿð]±1ÄP¢¢ dš§J“:gæâìé·§/_4Ò¦ßn¡0ÆRHNý˜G~ì%2ö|‚bA’0 …ˆ"‹B]LÌß9Þm–ÿ»E€½ø/ªÆ8ý[I#þÛþ³ç׎ð> @[ÿë÷ïÿsa¨ùÿ‚ÿm%µŸÿçÎEÕØÕªV‚xädçÿyߘÇçéãìa*ŒqB’HrW2˜ú‚„t…Ço2dAÜ 3ú @X¢ëÌü<”ž ù®'bNE€RcÌ`$™D &îpzV æüz&jgó(¡œ"—…E]„8‹b„ŠB…4NS ;—3ع_]ÈÈ>ØEû8 }`™ï&!2D!BtäüÇHMúÿø]wôÿn%ø{ø¿ÀW#úÑÿ}@ÿeýŸ†~×&@Ÿÿ×¼ªþ÷ü1þ+©óüG 5¾£s>Å©Œf,~/Pãlš0‘P¡«+ˆï3Ê]W`&ÊFaÀ Øo*soÿ s5‰) U°±žþ&Õé¢Ó:ÿÈPµEþïöûkòöÃ(ÿÛH#þÛþ+ͯ#!à=€€¶þÏïǹcØ­ÿ]׋Pmý/ïÙJjÆ—0tÖSFgs}m.üp’þð"ý@ØJ_hd܈–JÝ{ŠùÂÂ@„Üc!.G(¢ öqÆ2ŒÂPC±’ÃV½\80/ËÞçÌ;yYö:¿.œ–}%Ü9Ž‘@wBÄàcˆp‹Ý — 1çêÈñœ)Oç\]áTãIŠ/›h KžH7ð ¾{Èy1Ã’… øT½ýÅve{ûîk2aÈE£Ï£®ï…¡'ŠÌ£¤¹ÉƒjÓžã¦:cÐÛÔ—Qä³8 9!~RàˆLFV¶÷¹¹b›÷0; 7cüóìË®G±¤åÁèI‘8`¾!òý¤“뺦á,}‰H’H"HàÅRð$b cRrP€],着•ßn ê{n„ÜXp3IL"—z¡ð±zù×Ze¶g3ÛÊì0¦"N<c&™P`Ÿ°Xľ,pý^f{ÙͅIÊ\…ŒDØ£žÄ,"’¸D$Dö1»­ªVfÓ0ŒQ@0Ç2¤h1èÒóÈÜWLÀl¯Äìw€?³½Z­ò]X߇H9b0c²Ð%¡ÄðD Ú Š0ÅȃYµW±i®n¦ó‚€«›ÓùÀê=IÌ]Îb´›Ä¨áD`’Äa2´ú«åô@E›†WÅOCfœ(!ž`a€˜Ã{±À(bn"Û´]™9]®ÖJž©ß6$‘( "P3’ÊÀK\ Î0Á˜ :„”©Ì8•«…ÊH€(([W`Pô0Ñ„¡D‚2¡ô‡T  ºÊ€çtÓö ˜pqˆ e00ˆÒ»ìˆO"6„ùâ#®3^,þ‘~P} a¶óD†`”QÉŠ ‡q \C1TýõåL=ÊW9 ×—¯‹_†tG¬´© ¦ ô‰½Ä‹@0΂Å`©à /‹¯CDÓ§n„ *…ïb/QEØ‹M¨Í\è’‘pfÿ0€ˆÐ‹Ò *|&â~Â"8EqI…lQÒe",˜pžP=Ø$D"ÒûAW µžÎ“'¾GÑê¯çëiQýù·!’ÅHú1i9IH¡1—W&PF-xÀª^­¥—³j`ž[߇tæaz0 n("Î@}Šav‘쟌8Gà&ÓÈC]Œb è`Ô*| rèù$qùöwAX‘“Tl@„ 0Sùó#ì&¾paàD&8 9ÁýD€¥¸.çê—MM)b°;°Šhˆ\É(É“Ð%4f;>*U7$…øO¢$@øâ(Ž£(‰1öã€ð%0°¾V¤äÉØã’á8¢ˆƒ‘…|ä¦ID™'„ìFJµªË½P˜:ãFÆðŸû!‚Ž”(5¹Ä#À€Qíáÿ¦æh9€¥`ÀŒ(ááЀ@Ô¸˜°ÙRY+ç9°°[b\4‰C)‘ë á|Ý$ÈÙî•Ù>Ø,@ˆ)pÊ×õƒÁ(ce+À€ ¾Gø¶o`! DF˜¹> !ô·ô<t@øIÔâ|RY+Û%5Üö`dq¢@€iéÁ„ãA…TôØaåzs¶+·ÓÛåâú*×9êÖÝoÕ/¸ba0Ö|0Ë}ßõÁ8 "‡ì˜(¡½ªO‘a&&s!­œò=2Ì À/™ÀtÈ\˜©KÀtƒ!:8õÇ^Û~jóÿÞå`ÿú_õþG¢ñü§­¤qýo{ëåõ•qp\üü €¶þ—×scVÞñÐ=ú?ðj÷ÿ>ã¿¶’º÷€tMߖÿ ,{bôFùLp ”ø,öYâynŒ…2FcfaâY›ò`«òö…°ß¼¨øëìkg˜‹pJÆú!–’$T"]ÌÁ ªîMh©[ÌyQóÓ9ï­7ö…F²‰ ¨Ö  <ÂP1µü„k»‰[ê•S˜&§ÿ¶øýÌú¥“áFóüGYè%Q@"á&®K)ePÚ[ÓEh0ø Hm¡«÷ Cà[È¢2èÇý!`„â{A‚1O”ûƒ3ŒàǧþðÎ’t}™‡%®*ÄÀ#ëA !AEÁ2 žAÄBÒŒ6Žà •C ÉC$?€^H}¡-éSëY 9¡ø(>.ù `”ùð¿“À…Qc;ìëåî}XLù­Â$ïºÚ®±4·½)îtž;ñ;ä(‚JPÈÁXåjuMðÈ"€¹"fñŽbUsÓhQ4 *®8V®³ˆ PDX¸~’I¼H2$}Ö?TRµ¾”²·á(JBì»ue{~âS˜4}$¡Ö6UµÕk Ç—ýêÆãI2/ýÌ1΋%i,)Cx`­éN³ÖICÛò3Ge ¿bé1R$A"xÀ܀ŗÀ©¹›QÖ©B4uz¤IÝ"®N³à$ˆãú.NÆ©A¹Q—„C~J_ÛxÕ¤µÚº$t)·ˆIâ{áAÇ.Åa¢žAĆÐU¿ñ̉Àªv;‡‰ãç9úv8rD‚EØ!BÆÔõ M¢˜™Å©¡».‹¥‰*uÅ*ÅT©2Ÿ†.c’IŸÇ( O°GÝ$H•½^Q¥Ë^ºØ€²æPÐHD W‰ð †ù)+‘ e2÷„Þ·Ôfÿ}nÿ_4Æÿo%þ¿íùÿÊþ•Ñÿ7úÿî«ÿïnïé=ÿÏoðÿçm%5ûÿÀºVøìR\&À…ÕSm˜¤x O¿/žöáXìF8LjaÁ©“¡(”q¬V„Ã4¾ÇæÔX¶Â϶RÙ…g%€kFC7çEƒN|*qäËß?žm“ÿÏÿÆý?ÛI#þûøo¼dÄ÷ÿmsÿ'à?·Žÿ¼`ÔÿÛH­ç?Ç j‚ßKЂ~ƒ|½”H&b‚0 Π&”8a€¯"{ý˜¯ ¨ úÊT•áÞpœÇ%€:JÄ%‰ ìb—Ä4@,Œ=ÏjëÅ¿?œ×–Úäÿ³ã¿1þo+iÄŸÿñ#þ»‡øo:û,÷ÿ†(¬ÿìç?o%uÇÿ©˜O¼Ë—‡Ó8¶ “:NiÖ «T^Hõ"É– Òð‰µVhCwÀDw¹ô7 Á 3¯òóBÇ&ù¿çÿBþQþ·‘Fü·Eü—ϯ#ö±ßçÇ~*Õõÿg¸ÿ·vþ›¸£ý¿•4ôü_ú¤O›`Oúè>#ž1Ù©Iþïþí¿­¤ÿmÿ¾¿ÿÝOü§9úxûðökç¿£ñþ·í¤nÿ_ þÕîW›k¬ÝÐlà^k¾™¬­¦–fF¤985ËÿÝ"ÀþõßÚý¿¾;îÿßJñßöðŸ=¿ŽpD€÷6éÿ»ööúÿ ŽÿÆø¿­¤MüõÛ¿j¸¬õüÇ’ÝÏÔ,ÿ÷ÿû¿¶’Fü·}ü7zGüwñÍ.ȯþöêÿ(ô«úß÷иþ»•4žÿ×q,Sù$u^zÛ€¡¥|ÙEö°o3LŒ’D’»’ò Ò …ê¶xàA>ãù„ãù„ãù„ãù„Ÿr>áÝÄwÿgrøÛ®‰ýæ±òyå¹,¥oèD#_ݰÅ)£(N¢3oD&Q‚ÉÐÃû€Œì¤¼EÙ1yÃçÕ„rŠ\ÊRÄT]ñÄ¢á„"u#<†Ó4dù‡:ÈrË;Dîv û3ìH鮲,¥vë‚ÚyVdJŸ ì"˜pú ?|7 ‰! Qmè’Ùñ¨Òñ¨ÒmUZzá!ÅCÓ¹’måú¡ÙýˆJLE«sZ¤ªçZŠ œ*oÝ–ÖJêþŸ»Žþÿ[]ÿó<žÿ´•4úÿ·çÿÏü«£ïôýßß¿JUýmßÿï‚=^÷ÿë¿[Iñºð¸†5ëå"½ó¾‚Å S=º*¢BœG€qŠœäsN¬\€v4´i²6ò„‚h•zúâüõ“çÏóôs ¡Ô†ŠŽÂ,£¥°ÒË,½~aB…ò¸‚ø>¨è ŒÀøÄ1íaÀã†[KM™{·ò{ÞUuM¶ðoÔÓUÁ¸kð>§ºþ¿'ø\ÿÝJñÿvñ4âÿÿßcünÿ»®W?ÿòú©ÿ_ÂøYOå·½Ÿ¤?lpé¼/ü DÈ=æâr„"š`Ga,Ã( {/¯{õ5)ßÔ\ù J¸s#"î …ˆÁÇ„á »A/AbΕɑ3åéœ?ƒï5ž´æ?Qбä‰t˜à{1ºB /Æ"bX¦·Ôñø_Ø•ííg–D_“ C. E˜x»: =AP`8 ÍMT[ËÂÕŸ¨` z›ú2Š|G!'ÄOB*ñ€ÉȪ³º@V¯Øæ=ÌÎÂÍÿ<û2„ëQ,U€SDpzÆEÒC$˜ïÃ@ˆ|?é亮i8ËcŸD"’$’x±<‰X˜”`Ë»ªjå·Ç‚úž!7œÆL’“È¥^(|ì£^~çµV™íÙÌö†2;Œ©ˆÏŘIæØ',±ï \¿—ÙÞpfsáE†2wµÄäQÏbI\""û˜ÝVU+³iÆ( ˜cÒ´ti¨"€"è]_xƒ˜í•˜ý@Èb6£W+£U¾£«ëû)G,PW§¸$”þ‘D;A¦y0«ö*6MÂÕ‰¬4\ÝœÎVïÉHbîr“€D Ý$&@ '“$“¡Õ_-§/Ú4¼*~2ã$@ ñ ƒÄþÐØ‹FsÙ¦íÊ„Èérµ®PòLý¶!)ˆ€Yš‘T^âòPp† Æ„HIúç e*3NåÀj¡2 ÊÖ=L4a(‘ Œp(ý!Õ²®2à9Ý´ýD„¦$\bB ¢ô.#â“4n£‡ùâ#5ÁxІ‹Ð<4¯¯ú@Âlç‰8 Á(£’%ã@ùÖb>¨úëË5˜z”¯r®/_¿ éŽXEôRL è{‰`$œ ‹%ÀRÁ3^_‡ˆ¦OÝ"TÝc„½DUÇ-°xhBmÆ¡›‘pfÿ0€ˆÐ‹Ü *|&â~Â"8EqI…lQÒe",˜pžP=Ø$D"ÒûAW Æ“'¾GÑê¯çëiQýù·!’ÅHú1i9IH¡1—W&PF-xÀªÆáJ˜ƒÃ50 Ï­ïC:ó0=ÈP7g ˆ>Å0;ƒHöÏE†¦ »H†ºÅÐ À"¨UøäÐóIâòíï;HE“`G¦ $BP˜©üˆùv_¸0p"Pœà~"ÀR\— €sõ˦&€1ؘ‘0 hˆ\É(É“Ð%4f;>*U7$…H '„EI€ðÅQGQcìÇá-J``}­HÉ“±Ç%ÃqD# ù"ÈM“ˆ2OÙ”jU—{¡0tÆŒà?÷C( Pj($r‰G€ÿ£<ÚÃÿMÍÐrKÁ&€QÂà  ¨ p1a-²7¤²VÎs ``·Ä0¸<"(h:‡R )"×ÂùºI³Ý+³}°Y€%Rüö®°‰bý‡›–CŠ ".å*5I7Éæ,ïA›&PlKi)k“lÚH’ Izr) —<@ âU JAà OТ ô! bAPÔŠ}ê_‘KßÌÉn²=ðß(ÿ—ÑÐdöÛo¾ùæ›o3óͬB œ¯LŽš1Zµp¬ BƒÉ5–F¨ýJ•FI¨Tj…Y†A‚ ´·U.Ç€P*1“ºŽÉ‡ÆV§Ú­·åÀ²,„ U`h)9('‡ñËõ©N;åºÉ|—ÏçÀX²a0ç¦b؆å&ÃÀàT©¶hU(7€Ç®Át}þP<ž4q]‚Ô©)LnQÁ·=b@_Vxš©]I2 ºƒ êÑTx%°iSðüo3Yÿ Ïÿ†$…×ÿB»þ§ ¯ÿ…×ÿšñúŸ2ôñ¨Bxþsxý/TIxýúA¸¥]ŽzIð>÷ä»)Ó¿<Å/ဠ/&E¼$‚#é~"$ÛGpaZjÆ£©Ãö8ÐÓü„2Îð À7Ð ¨ù4ê’E_@2˜lÀ4ÃðXöÝÙ5ñÿ'÷ÿf‚ÿÂïÿ I ã¿Ðâ?eÿ…ñ_3ÆØ]À2!ü>ÿ9$Iÿq7Y@°•ð€/fWFÝÛ)¸ÿ7ü~ÿCHRÿ…ÿaaüÆÍÿ)îþSbŠ`üöÿ!IÂøÏê&Α5páÕA8L@ýÁ«Ôê,½.› ®¦û¯6t8ŒB®1k,jVœPáZ3ªVYµZ¸"¬b"àë=Æ'Uº. ý‹ÔuJYß!1V¹ 7ã*7'W+B«ã*EƒáV…ãÆ(|HL³ÇÂÁý¿™à¿ðø/$)ŒÿB‹ÿaüÆÍÿÉïÆüŸ"èüwYøý¿¡IÂø(Â.;Aòb¡bû t¢g~üd›”ž™fÏÞË)¸ÿ7ü>ÿ)$)ŒÿB‹ÿäaüÆÍÿ5õ»¿ajÈÿ+äX0þ Ÿÿ’$ŒÿÌ^3|¿‚ÃÏû&§ôNCýhýdxZñè‘2²3×÷¸aV3fF1“ Å´&µFƒkáAó2‹Yc57<×%‘[裟µ2ç<q$ô©ÏH 'ÈÍU_À!]à³Íyu¥÷ž†¥ŽÌ¬s}3‡Z…•°ZpLkQcZ¹Éª•cTKhL*“Š ÔAçé×]}ºîœ™X(ȧ«Î™ƒmÔIæ8Ð:¡Õ  Òd1«”Z ®ÑhMf¹ Wk´òF5#ö•/Þµñj³XU Ž«Lf“ Ó 04Ôhq%jViår™:èÅM÷Þ„k3KÁþ¿™à4ìÿC‘Âø?´ø?üî÷0þoÎø¿©ßýSÃñŸAþ_¦ Çÿ‡$ ãî±™©×šwÑ[2Ì@rØŸÌåd' ÏýÞó)¸ÿ7ü'ÿC’Âø/´ø/üî÷0þk®øÏoÑMëcê÷ÿ2T© òÿ*yøüÿ¤„xI@b,I&‹ø„ÈȾF:þžÐ!‚Xí$îÕ!vÂêMŒœ (Ò) ól^BâqáfÑ!N²Ð»©+.’~ èÜä!íù^"‘Ëv :ƒé':Äæ„§NÑ™ÜksJ¼¤K‡h\Et¦Û–›nEÙß…6‹7O‡ÈÔ¾œ OA*§sL¸y*Ћó;!¿™Ù\éõ’Ήƒ,‘ÐHÜÎå{¸ ÓT›—½XRݪQ„T;5HIËÓ8® mƒŒ‹$ž<4½ß÷qçšð8TŒ0ÿKeÊA´Ñ-šê%샜òDš÷·o þ]¾Dòøá>T½ÃýðÓBôâË1 1ÏJ‰Ï‹Dž¥"ÑבhÎq‘¨¤HôÑ?E"EŠHÔ«`ž*~HÔâÔ”¤ÑE§¾Y±kqlRôü½§ºëºT¶J(j5**íØÐcj`Û]í=£·L­ˆò\“2OuqhæèèÞÛàÈ|üÙ‡¾({!¿Ó€±'‡l<ë—ãÚ—³û¯]1cý¬«ŸÜ¸öä»×>¼>ã¹Òƒó¾u´nïóBÚ³Gj^ߺe‹ã3‡Ò–e¸Ñ˜)ã>¨k|ÅѼ.Û~x¨GÆúlñ¡Ø•#Fůü—EþƘG¬Û{Ãû%ï™4{åôŽq«Žï†¥ß¿&sxüâ}%{ìpüð‹îµ£Ã½y» ßn8þøùìì§%¢MQéÕ­ŸXg{53îêÔ^]æãƒ§<ñÛ¶C‹RZŠª¦‰¾8ñ÷3CÎ?¼úü2sé¡oE1˪ž_·¨¶ò3,ýÀ™è¢·çã7ÿúÄ_/ýT²ç¹ýç–_Ÿñ{Å ^«/z?ÍŸ(Zb|mÙ·:ÿÏà‘— »?Ýfé…œ½²¨êÂÚj›ýôw^]Ôß¶§ïû¾ºc‹ÁGJ·Ôž/î½ót§ò# ^› } dOïª ÏŒ7/‰œ¹;:'ç©Ë;ÎÚ;YõRzå—Òµ+kY¼¥vö‘«/L8±rÁþ'oÞÎP½4só7ÔÜ,yP4nCeÞG#?\M%Õ‘²%yÊœ»g¬áÔä‰ëÿÍpò©É½Ãñ?˜cÖxq÷!Ϩ˜ôÖøÛYÒU·¯õYzóäTAŒ›ß/µKë'¯&·aŸ5ö¹ü¿m:þöÒ'“ÛýëÚíÒå+~zâ)|á·îÔ ?Ž=0íÖû;.Õ,½0OôÞÚûÄÎYÑ5kÄZÛâ¸Åÿ+F{u~ª¶òÊÔ·N¥o:¾;prP»%²¸Å-cçl©E;¶zgBçùø†¬Öÿ|ýVîÞ³³+¾~òØVæŽ/®[“·:ëõÕ“¶NMzãDí°ûæ/MÊÉÁ_¿2Ò~zǤ¨@õϪ_Ks6å ˜WôF¯É?¿SQ«|wµZk;õEö Å-«±ð˜COI<ð{FAa·””¯_î{cㄹÃEÍ?7ồ•G;çÖÿ%'gæ§múWô;¬MPjØyzfrJ¦t\jû'))K[_]˜¼­¾tßvqâ7'_ï{£ÔqX;fÓʘΠÊ(_:wVO¿8ðÕéí£ú¤g»GU½éx¢üë__´jÚåÎW\XÏs³ÿõl¿“Îx´¡\[Cö0ï\z!¥jæÞv¢É…Æ%¨ød´­ÿR—zO%ÿï±ÿGå U°ÿã¿$ÿßRý?üW9éQàâE­s“Ò“D¢ÏO9V~÷ðÆz³I«·w¢$ i"T8 ˜Eà–âi‰Á€¥}¾Iœ;eÊ”Á³niÞøíǾ oüñÇå&“¨ÕøLq—Ç:¿¬l³VÔ²£¨¢Ý}ƒg3„‡š!Mý¿É'ÄŠ`üŽÿ M ÉüßyÚ¼1ú/›NeÆÌ:|P+K¿55Fÿ;3儲Ên§Ž®‘~™=bÍìuÞ=ú?æÝn3çTÅ܇Î,^¸:eî¸Í§~%ý{¹Ë+¿´ÛÕû•e×zS4†­'Ì;5ŽÓÎÊ-7Û¿8cßyºuM¯%²[ıÿ.ØõñÏ»?ÎÃJ.U^^`WM/=ômŠ®lþ:[ftÿ¿âë«qÔ ~÷xþí⊬¨u¶Ø•#’ª±ö}Þ‹yÚ'šòÖøŠ¥×›ÞümÛøÍ±åGö£‡z_;lÂ.rê’ª;±’nÄÂÛC­0à 1âÅMvBŒXlbÄþÂeÔ: CQD†¹Šäp=‹4‘^RÓ ÊJ½ÏNP{*4¢€°ÓkØy2)u îl¡B‘"¸1(J´?½ÚJm*V#\l0—Eß6ä.×úbNòä"ñbôx±<u²RŸ 8ù£”*¥:¹aœ¤ÛÛ}"0«ÆR5“Á‹s¤¢Þ#ƒ#ØÀw”QTž¢>uú¨db$O> ðÁÀG >*HÍú7oé¸Ëõ*Uz¨õxÜ J§â+Kêi,%ÙHÂÆQÄ[°áGÐîìd!ÔûEÁ~ÁØ/Jö‹Šú»€Rs1î¤ØZ¼>Å€þ#uäÛ½63dDk|Ïw8%¹8l~ªíÙ&¸Â¹ÁLæÃŽ ¾Á”é’2/ñ=—þjaÃ<«cíž!ð >Âi±Û8—YcäQðJà™+Ká¢û"a¡€†òfÜE)שS*@ÈNäÂè(Œ€ø54y6Ÿj<ÜnËc&èðCºÓOO$ÀCÛ°q§QÁÊ”£”:ñà6¡ïòK6*ŒªDÖ¯ðJ’B¯JQ'2†Ö¨r\¸7jˆç "øA3Óóý¢qZ °oø6|Ó#’í-¶C¯ ‡·†‚ÖáÙê‰Äa6dz\W`}˜°pùb*2IN›ùBTƒÙñCÅpF-uÛ K1<­¡¶ÒêõòŒãà­T h< ™‘àq JÆôIuô•Ë©,kNl)9 {}µ ìY„P?àa­0ºþeÙÃßP/ì_a« Ž?À”e¾òb®2_âÈíÃ;S^¼–Df¦ƒo]nBjuã¹Ô DýzèzLo4(ý=Q(Ô-Ù¨7¦øI|mpS‡/ ›l /h˜]r.4;«zy<ßKúó `¸¹ ´‰›À§J`F¢Û€û}üøýQ®ìpOPà»±ÚŠaÖ2TéïÏÚûõ2~VBŽJ¥$ÃÖ`„€ÕóíÕEAï¦áSÅW™e} ­ý|§›€Ç’™½qgÿ¡ŽÞø,‹"MD€9¦“%ÐÈü$0²‘.Â#˜D%@LòÈ}Äê`R>[H 0¶¡ íÇG˜j@”Rå#)UYè:àó\¢Tðp Ý2yÏãή¦D!hêC‚*xa8q@ã‹ÿVá{-ù¬†x+ Þó€8{þ$cOý|É?Ç–¬—ëŸaY?NÿòÐà®JÐîþ œ¢\pÊ %ÀÉIB6Sèw0[LÙñwšo+ƒö üã5º”‡+ þöžN¦²ïÙ,™%Eê­c…]íŽÙ¹/ÂÚµnym¹$—˜9³3ÌÎl3³7ln±$ê|R^r)É¥P”([TÂÊ/¡\¾ÜJ¼ÏsžsyÎsžsfVò½ïû3ûcgÏù?÷ÿóþ÷‡>¬¦Yøƒ±z<¸ÄP e:à8uNo ÃvzérýNèKOe Ç>Áµš±†¸eÙŽ„«hâ˜w„¢™‹x}À@™ÍØìòA_FƒU&¯…·”Ð6þŽ&DÞ9Gî¦ééé²zµÁP %ÆL,§8Axq¡­<ØE@Æ’X–ÂÅÊÀ8þšMpJ„‚ùIMY–MNo“ Gxr ·©ad4‰µ©ÅbIN¦·;ÚÚDÜ3j ÖÍ›¡J ÷ 6"" —d1’…~ìDõûÂeœvÖ¦ á?”šöù°êˆP÷T)î å˜ï.¢/$°)0E”iH\}½ÁÆV«M%øË3BÝ2|Ì€^¾ƒH&› &DË4ü¤údŸñDÇÁË&·›Óa¬JÏ$éŠÊá«32âqiâ€¹ßøV†¤@YÃsÀ P@Öwúj ,B‘Ó_ÈF„V‡)# òÙ|ˆÁj­IQgß ýάp(u)ÅP_~H<íàx~rò}n·Ÿ•ÐmM•väè„é"ˆ2®GÁ ³€µú)©õ$P°”a0„ ¥WÂa¨Ή/””Õ­5 ’° ïÙÿ%ñ wбÙíØÙD\Ü2€p‰#SÝàP6£ÅhR@yx>B€båu¹‚ù¼2;ÈÄ9ÅàìÊNÀùƒy>—¢I¾6Žn?]V—])’”=;#»cB¼å ÆP ê%eL\^)ÎIŽãÂ_6Š­UK!\I>»f3wÒÓÏ ¸±R´­FUú…¬ ®‹ƒB«lMFUíeYËz8½ £_ ”ÖT¿¸}!^Ë… û*õ;  ˆðM[!騫Ëy¡}æ@#·IIÖˆuC`&ôRrYë– GfF_ F^D©X¡²C2Y,JÈ2´pFº0Ñͺüa̰0‰Vê¤SV,âNa ˜‚«’‰„膃[Òå†tI,.oò¯ðuHž2³ˆ!ß ðñQ@í@ÍÜ÷Ç!þ¦pÃLÂ+ôö²7›_à—Cˆ˜ô,Çræ‡Ux!­¹ñ0…Žúi95Š|§ÊdôňéÔÑNhÜjµŠsÝ‹-pry ÚNš1«S'K¶QMHÓìisAÊ —Í0Ö'*o‹Õ ŽŸ´ARÖƒÔìk¶“s_§ü8SкˆÓÇÛ“ÁË^\GdÒæÞ°ná8#$í“Ø+ØÙì¬3ÂG ×¶¢ëÚf\t §c“p]¯i™|… „¬82Ù@ìKJ¶@]1J“‚a³RÙ!—Öø­8¾ÑìÇi›fÅ2¤9zpÕàƒU¯ ¬(Ç#JÙÄ—_BSü«M¶@S8& …¸”ó™fƒŒˆÄSBÈþJ %h•%d A§ Æí7„X'<º•Ãø•ô¬tF7:\H$lj€"~Úx1݆gå‚a™¬›³iL—ܪÏç#H+™¬ÖFúÏhHO¦Z¡ŠË€vý`JFåó"ÈSÓ0"0uÊÊÆˆ& qAÎò.`]>NÀjäÐ3.EM¥\Rµú@Ñ×@Ë*¢ø#^6Ì2ÎËÉõ‘Ë2E>¶˜ñQ P'“ÄÙÔ’Q–4ÎïÌWÕµ¬+³âÔTIEUDR'¯ÎN‘ ÑOê’<š¨•–”ÒD9•ƒAM壘da·Êê4°X G®çZ†MÂf“¹ I>*8±f„ì‚’g(µ²×ɧ w'•‚º9|$ø#ÀäcÒ®§6*½ wÌŸþÜÁ(äßÅz2°E\þI=­u ›‘¼ÞvI.kªY‰c?гˆqY©3Eá„W¸‡tAD­qH:qWZúWå’˜hg5ž[á„ [w†B¢J…tà…Ïö¤¢ظ7Gê0¥ú²¯ªïÂj¯TSçT>Âg*ž"ø‚‰žÃd•~>—èÔNËÚ…õ±°ö•l î¬i"ÛJydEw4ºåèTd¦¤ºÝKÄ@ɰˎqñ”L³gI Kü(Lú¤jŒK¨ÉÄÁ@´ÚÒDŸÉËé’¬'CÖ` ¸8KK©Ï‰ ©´êˆ¤œ¥€ (Ü9Ëh¹bî¿v¼¨“»ƒ®¿j´ êÿÿA">ždäw¡~¢ß?ä¿Jb$š@ͺHöß`¡Ë› úê|È—jm½:ÅÖ«‘k½ ­ÖSžI>Aj2¬x ™2¬F[>ÁÇS¸HÌmRdJ•0*¢ h“'yq7$ŒI5eY­6ÎÍC¯O;I¯‰’ Þnsس±ITc² Ã4\¤#Âeì•UÖ¤ˆ—¦Ù"1K^ÿWiKÔÅ¿!”,šÌkÌö£¨Êð¨zŽºJ†(夳¤j}Slú Z{|¡p$ÕSà«b¹L€Ð¨ÒïT¯‘Œè”û’àE#f I¼SC³›ozS U39ªÞL£@™¾cvÑÅH‹˜YU°Åz Ž ðŸµV©*•F€$’ç¡„Øz< ¿è;gVHÞX^û0©}®€Fzì:9pÈë¥à@¯ÏífÄ‘'îx!:·ÐŸ0‚8émSšÖB]=CdR­øHÍü$`:uþÂÛ¦ŽŒŽöLÌ7 M-—“Ïé,øÅóÚ'¹Ï ‘ºß‡.…O¤BzÏ+|ôè @„ãrµHš¬ZAçiÕ˜µ\×à°Æ¤a—QgMpïæ§Äl³Ùì™äPàWÀ!æ3ÎÉ ÓŒÄekjáÏzâF ‰ƒtX2­YmˆÊº|n'Ó9äØ"¥3`‹œ)¢àž‚$yYî‹ëðfPé­x¨MŠÃJMCMmŽ SÇ,ż!ÏÕÜÀCC‘ÎrxAè›(øA¾ÂÑDõ”7¥‰) aäG€ˆ7”ÃÁ+É8É(\˜öO)GÐ=˜’%HÅ$Úüñ2‹Ð |ÂÊá­!´U3ˆ@@Ðô¬ ä uDµMñö>¼Šè!Ñ0!–Ý[•]ÓýSЙËܰi àŒ:Ëå¡IÀÝäp °xë‡ÛŸ `‘S—¿òzlÀÆà\7Š¡ã¾;#0Zгj‚¿ B ^„ûâ 9Á¶ ¿Ü,p9¹`}ðg$èFn[–Ï-ä’7€oat€Ò4ª§ÙD9«4ìc‚‚ÍãÀRí´}È_ÎD9Á…ë3Ñ,+^‹qŸÆLá*µ©¹¹ÊÎ6bR_‘›Û+£1 ë•„7·V#üzñïfÏB¦±“Ô>@û›Û¾ÙhÆÚ»íæ6Ÿit`ÓÏoq†š…GðMhZ þ`\,º›±ª…]BF>휼ÆÈ*‡öª<…ĉ¢ʵ€M›†iX(Ená˜óä`¦·ÓÌw¦0žHž AfÈæ lV¬<7äc=Ríi¦ëª] ¡b— ¡ºT­õÏÕÊFÎë”H´Ür÷ õ3Oð8àTÝðÆ–D%ÔàFòÀ©î4?ìŠÔísÆ Ê'‰Yjôð`0?®î£EûÇø>T–ØÃü|Y±ƒQ–9v ¬ Ùf´ãþǘ°#>Ã:Lõà&/fÆ(Gk+­#ÿ>™R‹ÐŽÈ4QR — F¡OGK¶#;CSãšåèdïÔIUjç5…ü?rÖHÛ³ ÃËsó`Ñ’¢Ÿ°Í[lŒxT0ºßGU,ñ—Ü庋è‚;é2k&ì ƒÉ "ȈÕEj‡Vi“xÿb;ÔÙ·éJòy##†Jõq!'U’evé5Î_h“pV]®‡ˆe‡X–뜌©ÅðÔÄH¤GPæ€=ÑÌ­ÝB8¯BRã‘*Ÿ(“OÏ på“Ö9$¤iz–) ˜Ô ˆéÒÈfµfµ6,j%,¢?§/àë¬0§i¸ò+èh)öt<ø·6¿‘ã–)Œ¡ â%ŸXIZÒ ±úHˆ“ë`v;/e¡±ìÄÒ=Ô‚AÄWÀ„XKæf8„f|OšE"2«r‰0½ŸM ‚Ål¨·Ë´ ¬ ›õ8 ýêîuêY;”äáéÍgáƒùmäaž‚V ’l¾<Ñs\…ΈÅG¯•Žû(Ä.­n0ŽÕhHÇ4¶f¾ä³_ÒfLÒËšÒ,v‹Ãl³Ø‰ ãöZDng7[ÚF5ù Ygâqjï<µbU-äf]>e c3§9”%ªæˆw¥5Oûmª&}±¡Ö¹¬'å^é‰ÓÇ£óé]Z3‰‰j+%ë^¯!€êIaüߦÀ…)pŸb Kc)pPöŒÒA `˜Zc1¥FZÃÀ°ˆÛ÷ù¬R8‚- “ˆ™=Œ’<`TY¬¨Ë#,E”Yg•`Ô¡Sà¨#g%Œ“ËÀTÅv²b GE  Ê:*6… jÐ EÜPPšÉ‘ÂHÿQÛÆ‰5ñR4©‰îÌ”žDi´X±€Ðî§’Z5U”ZI‰–I”¨Ê«ÔíàrÉ(ëN£Ô¦¬[9¬9>£rV¢Mgw¡”ÕZ2©MJÉX©dÌÄ*$8Ý(f ¬¾‰‰êH¼àñþj$PÆO«6m%{rˆeBbÀ¤¨k ŽIšë¬‰I”‚”rü¢+Ša3Èÿc[I$ìr\!΃Sö;…vÊÚÑ^'Õv”KF™zÚÌ+æA‰ÓÈ¿áFOeå ýÉ™èåm'SòñÖ¦€AH) T 6…R{*—ñ‚ú¼IEÙÊi¯Q¶A)ñ2Ì1ëç_ª]YÀÅû¤¢LºÜ|>¦(ès£R¢á“Ú ”ö¯Eɪi ćTž"nÔŠÌ<·õSŠwh¨¯ÄÁóÒ+z*ô¹êÂgepe®óþtÿWßÉuÞð‹_ùOÔûŸmVòþ»É~ëþ—›ñ¡ÜÿUC§‹×q÷ÿõX½áNðë w}WÜÏûšô¼;§ÑèC?öwÔ^eªÝ÷áû¶æ6k¼{´oÇákË÷,}nÛ‹Cr&×[ýÖ]þ‡Æu:½/eð»;ö—.Þ¸¢þWEW?^±sgÅåUËÌÙpÿì²áÅWÎþü{Ý6FûDãÄÄò¹5ßJÚ˜Ë××§N?`ûñȲ׼Χ/ -]¾á‡²³WŽ<Ÿ[XþÕsúðç\ýrßù¯?_°aåÛíg¾®¬òâɽíRc«ûz5sTœ'¡meƒÑ«î†“õ_x±·ÿ¹P)îœøK(@´ýo¶÷ZLö[÷?ß”eÿ×ÿîáîÿÛºèþ‘à×~ÿÏ~$ac‡5Z$–Ü‘Z}@÷MâƒCZíî׿_­á»†nûù›ù=—:W>3 æÚÕ[‡6žÔ¶Ñ>:´wC;ÓfÝ•mº7j­Ó=¿l’ë©ÞC÷–µý:®cIý…›§Ÿ»~ú–„¸VÍ[òéãsÇ=”§{°Ý˜%/9º¾×÷@—Hµ}ú§3Ww{Y·úÙšÝÞÍÛàã·}µŠw ¯±>þÂ=óó7͹ë»ÙûÇÔh¡;°ýÚæQõÚêfǵ0¿\íÉßàèþ 7ì þHûßDf­ßFÔýoSìÿ[÷ÿÞ¤O,ûpþ§u«–Ñè³³s¦e–Ä·šÚk÷ÑFúþ»ûÍ0ÔÛ¢oÛ1aØñµê¾ñ@‡Z~ÿ®ÉÉú)EÓö%—Øéà¥#Í+‚Ï_öüþÖ|ßÁ]÷o숿’ùñƒR~™ÓÞÕbû¦½ç÷œy¿hl÷…ÆŒ7™ŸV½Ûùø™—[48±vܤåÙTß{*ÞýêÅÝ÷ç÷0_-kŸ³}Ïs)¯Öî™/v}gßÞiÉäõ7oïìPT6aòáVÛ;ŸorìH›…O_šy¡ÉÁZó­M,ûËVl„£½EÈ·ÿɸÊÜFÔû-frÿ[-·îÿ½)Êþ‡·û¢ý_Y6p‚Nw[Káü¯Zÿ±Ÿ2'·¬|.£ûô®ýßÙÙ|~jÒ¥=Io¯u)þ——kßõɪ3ÍNhc74X3·æÄ‡7´lðØÚzo6«YòõºýÛõôNðJL¿¶mÛó×Ú?^q~ÚCq3Ý5÷p|/Ý‘’_/„Ïþö f¥ùÿÌOn¡‘‘<&~p)åKùÛ…c›íMt»ët¶ùWZïÙýÛ'Ý6ÝÕ¥`ͱŠÿýÇ’}ZÙäóSGVœ°ØG,^ó\· n|Ä™eײW¹oüø—}ƒæ²=ÖV¶ýbâWKû,ûæ{ïΔ֕OmjøýÞpñÕþsO·©öVerxÑøÇÊ·Lo–n?ùtÇFŸŸšµH× ‡™úñÞßL_{®ß¨Ü.GëŸx㫆?¾ 4ŠkóÚ˜…Ó†ì_ÖúÃS:|ìdü½×‚5Öo?º÷âœæOô¬˜ÜíàØÕ¡É]jû~{çôå¶¥«¶î;9lM󆦩·záñWþY¹Åíù:¿¾â®-OúêÖXûúÒÚ{žÚ’Vž7ÕÜþƒqº£ït0–'~p{æâï¶•Ï;ýÞŠ'Óß{'iæû]zÖŸºâ›æÝÿ¨èâyªerç~Zï*3ò@M]¨o·åæÚ+_{¦îÈBïØSÓV+kÞÖ3W\kw°ªÏžýŽÔ¢Û/V;š³»å¯Íí+ö=Ü}ÌÚ‘¦œWï9Y£aÃa'®tì1{ÀŒ> §ìÚùڅžñ‹Ÿþ)ÕÚ{ÙÎÞy/V,:ñfµº×fŒÙ?*wåá+×®yë·¸¤Ïc^Út¶ï-bûŸòÁè¿Gà†·•þ§‘÷¿[LfË-ú3>±Ðÿú<ýTñ÷½ê]=õP-u§¼;½AÍ—rú4n6¯åýÃ3'Œ_ø[GÎÿ°b͹„²gx©dô…ÞO.Þ¡ãз'üÏĉ‰õîNª~Šõ,¹£èT£:Çrô§Ÿ©Ü3è÷Y—=yÇ7V7úöqutu_¸v ãÝ4c£×_x°ó‚3?•/-|¸tÝįƾ÷qYÚθéöòÄs{j‡fv8¾ëêëï˜Âö©9´ñÊò¥»,•­›vÜqÄQG÷iÁ™aÇïþ=~ ×¿«¥yùÕÓûNªÞè³IÇÂŽ5—&½Úý‚M÷hÇY)ß¾8çâg[/Ox¼þ¶í:ŸÚ‘Øù˺ ¦|²·í¹o-_–¬Ú3)é…äÝì/î;ëåï=–¼ñõÙ“‡¼ªóò-¶î¥ýšõ6¾ëÁ•›ÝûAe÷;›½g\û«;ÐgÞP÷ô>ñ¶äÜ»-»º¼Òj䚺Ì7®:3†D {Ô;ŽmÿhƒyµÞ{m£ï¬·]ÑGwy1ý`ÃV<¸¶<…é“÷ÉüÄÚm]t,‘|ðÅ~qOTÌ]™ÿéÓ÷Ü;b‹sèÝe—~ídñt?b®yºghñ‡oÜÖæjxÌlû}/µì–SoÞ¡/j[öý˛ӳ.s¾ùxý‚—Æë7þᧃ?žî¥[5{EƒvgšÕy}]]â#E;ŽÝù}ÿÂU»Þß÷ËØcëK†vk»ø ýóúï ù¿žÈ{櫟 ýYÜ·bЂ`¥%øä+ëzWϺú/ö®3(ªlÝžš$9ƒ M–ÜMjb*Y$‰d$Y‘ ´JnAFDI"4HÎ (49J”(ÑQr“…78×y¯fæ]çÞk«j×ùsjïSµ÷ZûÛß·jVà€žõЈŽ8‡¡_#:ZCÇBÿóâ_ÿ·ùN©ÿ/ø–þ‹I@ÿ¤ÿ¢’ÇñÿÁ?Ñÿ‚¯ñ‡­ ]s`’£ÆÛ…`ëʲ œpî&*°uc|Vª¬¦»‹é¼úø-ÅÁàÃ;‡¡NÞ, wÎXÔ0©6¨ª+™\ñe›\Çãéa– F=öY»Ñç왼ž(V‚.'w·†Ú4¼¬˜îtl†ž7òzÓ/¹Íûí|.Ñç¶È§"Ù&Ù~©2àPq¡¹€Ç?Ö$œ¢b¨qµ«zÆ^½œÔpg{‘$ºzQ1l FÑßÚ˜‡ñx¥µŠË1±‚Ë|ß|€kÖ,Ö) 5™`§.ÙάÕ#Ú)]m(Ó3•‡ja½©n›¨+qMÙHÇ ùqµ6‰ æ¿ßN‘&ôØP ~X°âႪËg²ðg[H®kRn8¬•È{$h=ùpÐ „æÛðÓu¢÷^À%êq½KÝées"0±Ä«©bç.ò¡‚÷(wžJCߨä‰Éb:‰ò[y˻۵8G-ÖI&Þ)ml¾bˆ¡°ýø6jVsùî¤p¥.Üù½ÌÚª‡è…ƒrwÊ<ÞÑ‹¬¹Åéű¹¶˜(_ˆòdÔ2GlÒM¨‚tgYoëY6qŒ®¡CvM\húa0ä9Qí6Ý® Ç(Ûã s‰{DËù!¡E*4–»uµ¹"5Ml£œ ÷³eúéöÎìuXA¥ÆTfö±oêþêV h H ^Ÿ<ëJ9ZßÇ{Ó¿ÇýÿãFìï3Æ·ò¿01øŸë¿°ãúÏÁßè?è·FøEÿñ¨6`¿=xþÈÿ’1~ÎF» i r!D@å¬ıCks—ˆˆRxµG|Ôí1í~üîÿðqµ±p³³ûÏø?`¢¢ñÀ Çüÿøâ?¦/üŸò–ß|æ¯ü×Ò¤³g¬Ö ’ :›ÑõÚâ3™Q V:Ò+ë·‡6³Š" Òx²ˆ|c6{ÒÕ”û”mÞE¢‹âXDX´®hjH8Òà_+u‘KuXÁ?SåìŸì’””ÄÝã~ký ^¶¤Sn½SnyÏÜ,´k/ºëz¯ d˜L‘ÊÕ«^ÞÆqkbLøIŒ’¢?¿Ì=XôÜØ5ìÌCÛŸ{ ¤6Χˆ’j쬞JAÊQØw¹¸2̨7 åYù¢LˆÆ¾±íPB£·ØKIäÈtzM€î^|\*L_"Voü–sÉêAÂŒšÜšõLlÌ%ƒÕ¹0øë™¥Ýër®TyFÝ”)¥¶Z,‹Œ‰„µÖ÷fM½5νdòÍ¡Üu}S ðµã!#Å’ˆÁk²“~¡Dl—3tÄæ‹+wº9YåSR=•¹¹ƒ_Üí׿)Ž G'¿ @=Ö…<ßr °íx@ês;½@ié¾öÒá-$Ý´µ‚I޲  ’׿4üêè—TÔØžméŽeoïªZ ÊÛ¡%΀Ð'Ã,e»ÚBµ* ŒÜMGÍ)…×MKn–ÉþùðŠeb!³nÐA[ÓP? Ý€®Õñçô­Ï½K“Z¡ Õ{Ø»ÂI‘Ñœz³waLЀx0“ME¥Ìý¸“i§:¦j%¦Ø ÍÆ½9‡6÷Ç3í„,È }›‚0’WDd¬Ü}ZLãìÅ&K>£DÉØT®jP|½gM…´Šç€(Cj ºb„õ°Ó|#t–_)s gƾZª´‘ó\Ó1,Ä0öÃ8fU7¼‚ø6…ñ ‹5¸Àšº [×õ*}whÒàëóN”z&Ö;ãÚ±kÿ>Sú©•Ê•¹Ì+Týã—›6[#Ò]ÒJÐoÞv>N^ÈÈ¡ÙÆ©-îd%Èk±9b«Ò²åJ’Aê1†éâ™n;a¿G‘ù!êù9Ü-ŸüÓuÊÕ-5”ìJ¡-ø+ækr§ŒËŸýõõ’ÈŽIžÂ°©Q×#ßõ³É7%›°Œý— ÚÊ£/pµÞ¾l˜š ó¿µöiY×z5è`þ©º»š+PÄ>ÿÌþµúõq·‡Õ ÓÍ+Êzz„H \’gÙ ÖŒu?.倬éaär¢¢v,ÚµÝÏçkbXäï!,¼÷ñŠ·Ó -œëÔBx”^zu†ojˆýÅNþ÷ª¢düm­´ùä‘Àsb0鈾I¼–l}~'0D蓼‰±“Ì*ýÖÖ(ÍcKqϨ¼ŸÝæôÜ¡‘  Ý ®“Jºu¸ ˆ”÷ŸÔŒŒ3¦à FÓ~˜]àS÷lz"½qeR6¦DH¾MTA£%ë®$ñš±›SñÙú²þ¤E—Oå ùNäzN¤TÑX éʬC穟 º$)ϹS 6ûfnâ§û‘·@ÐQ h^Ú#þüœªÿ¿ø¢ÿ_o4øNc|ëü/*úgÿ‡ôØÿõcð7úTÓ!þ¢ÿ³G+äÉ‘*•”‹`ED” –ŒæÑ¨ñ‹!^|6Šp®ÑzíÍ×h©<‰Ó™8Š)ÃŽSe Ò>Ó”§ògÛVæ2J 68cÝÓ„¹JϧQŠøÕT¦„'}N•Ø}ÊÏN¥Ÿ_øÿÝ*ÿ¿ã›ù?ø_ù/~\ÿÿ!øþ“µßã¿_ Ì g¿Æu$H(¸g(w6Ö ªŠ´‘гfg|.íç¿¢†àâÄL–~–Éjö½+ÒŘtÙ;Šä¼刓™–—ð yÌóÿ"|áÿws~þŽoîÿÐ?ûÄÄŽÏ?ÿ„ÿ_ùïB®ÈNÒ{Þ‰¹AŽq±!ó\øÅY=X[¡)Î:ݲE‘‘Á$¹ë,:jµ‹É…e *N¨ú'79HŸ¸iÑQëW5},ÿyüËÿqÓÇþû…ßà?\Tò/ü—€çÿþ†ÿ¿5¶/ü?!6 ~_ý~¦]ö‡bž Êä:áéT‹Ô<Ç)Š:§'.^–÷Öxz–¤¦÷,wèèh i†´Jn›ÕkÇð§òçúo7`Ÿv¾—Ú½…˜\Úó«¬^Þ–/˜,i (¨ÙÂŒO.ã¤ÍS¶¼nå.€OS`•[@>ð2>k¨×Š£Ôf8pˆh_ßÂGêŠÈ9ÅÄ×Äp·ísŸÁrðÈˉ(Mì1ú‚¢CTµ i~›?yH–‘ó¹$,Y:*ÃfìâÌ™ä'©™!áPIÊ£÷FWi¶S‰ÄnV+Bê[ÕzS*XgêË7 4>é3ï‘~É«¦s»‚°e^(¸¤£ºd(3Iø‰l‡Ç'ÿ¶Ü|±¸[¿¦£5jP9Ù¬\ñ¢l™*ã·fn{~gƒTböÔ0cËìeµ_ NHÀU.Þì7´«kWÑ(Юo GÁõM$Ö ¼w„¡ú¨Ÿ¿?E ™3¿5¾$HlÔ™àXÚ1~yló$'¯„’Õ\r!­‚ëŽ?óÙàÖŽëUQõM³M´½¥û>Wx%[»›uqèùº…1çóí²Âb&¢ï2][›~™_HÜœ‘F½¼kšž aA®Ý ]gÛÜÄwpë4} ûôÒ#ü(!÷y#ô2.3ÑE«•/]Í)fÝ4ß,÷¡Q,ɪpTJQ2wðÌ2ƒUYöBÒâa~:O³²ˆÇ«¼îš6ëLZ-Ï·GǤ^_²n?ðØá±®i§°¼Þh!«^ýɲ—¾3aé‰ßõIa£5ê Oô‰dÏQ{×çBSز ±¦}B¹ûœ˜ÜÐ ÌDÈi„§Çâ¾±Éú„/|¦'òN–çåú2,}þ¨ôµòKÝßxš~J–nÍË¿{¦xH˜<ÃôßÐK¯ÅÁ‘O_~pÆ^Åê-ÝÞ§)%×>ã)€}žÍåah‰N/ ”.öx—Ô&6Œë¾°zaøQ/ÐÓÉÓ5“3Ë]c÷\‡v^Šô`(:…¥úžS;שɰ"Ëg³ 4RÔÄéZýÄZÏCês~ÚMŸ#žÔàÝE»ÐÜàiyf’ÖÕúœý,¬Ížy'|âðtëžUŸYbf7³`ÿ„9 9c}¤s{8¿¡|•7£1lý×*æQÏDŽûR©ÚõÐañb1ËAzœþs½<§ o`où-æÇê?âfeRü}b&ÅmÊôé)ìèca…¡ì{ÿÃÞ•€CÙ½ý'KY¢la¬3¶A!û)kö0ƒÑ 3ƒdߊdÏ–dI)%e›^BQ¤b,Y³d)K©ŒdoÆVï[ïÿ}¿ëûW×w]îë23ιÏy~ç¹ïß9çyžsž›ä&×pÑAr-2ërO¦Ä¼ÆÙ×ÑF;f¤ÚÁ¤W½L«Bµª¼k0¹õÓ=É–z£9«ÓCëà8Ƥ°ZöT)4dœòСÈ0D‘~Vë¶ý²¶’Í…“-Íè•fÓûæ0¦!Wa³á5áSõ*—lï¿eþìÏÁ¨¹PóXót0.{¸¥¹1ìüãbm Þïoe<Õñ¦ç¶Hº¶…T¼Eè³\9n7ra›$Ùm8}®ž–= ]íù*~ñ¦JBƒÊÉBóM"zü¦{ËäæìW¢ÛÍ´Ž•Ýí#£³Ô›šk0Ôw+yòÖ“¦{×~mZ§£ã—C?[`–sˆËñÎÏE&³»5¤ ‡;yI§°“éÂùÙÒSŸ5;ñŒ-î wÑÚºôó…¼+’øWžÏ¦Å’ó¸Xyês²ŠWêêP ùô1¶“d ¯ñyå"Gö[[6gÞÔqš»G9¨ÐŸv‹µùjj¬%{fûMn„"ä7òæ‹Ù-ŸO6š‚Àƒá ä }û µ î-*ÎñÉå2>¬EÑ+Ÿ%FÉÒ`=½¡éfJoßZ\ºŠ}Îf*L¢éœíÃÿH½÷®€…0$Uxq|òúÜÔ0´Ô2Ý9‡Î短`sq 2a“¡–ðxë1õ±óvn¢^|"7™ÈõBÒ E’DïA+¯žý­¦%2E•eˆáÓ ‡¼ªåO…ErêÞæess¿Å6–Ky.õ@‘m´Uiø»=îU§ÏMŸÈ‘w™¥Ü§iñP„v¡,Å}…ŠÓ]´ê¿@й.oöÅÔ’$²••‘ ×ç3[GQGŸ3®´ãËÍ¿NÇðh |*lq1]³Ò—…Ï›W¦tâ7'i vŸîÚ㎎ðÕ‡%Ä:7%uŒ‹ØæÉV”DÎydI¸ãȳÉð†m7ŽÚ‚H€Ö¹ã '­ÒsÝÍp8¢-«.Š=E˾ð¯ Q¦æ¦ '>¾jrµ]èUYèÜ+£¼ÃðÆ¡YÆWs ]jxeE§Ô?…ý&±ÒÔ^EÈ%Ä4•ù¥ÙÏzÜ*bâ‹iîÿ„§Íëzèå HÿÒy‡ýøå½v×NŽp–Úw3Ó”|Jªü–rï_!w;w–›åH´šVì³¹¹ w¯Šö±Ügϕׅ“G‘ÚÙÔÔ±’Qò–¾sfD*̱7ÍAº±I/5ÀÛ•é)·±†Ååô¡hH¬¬»?p\aâŸÙ·2½}I:H.¾K3žÙ1k^(y1ýG&lïaY3C VÒ*¼ØÜSá'¸/¤;¨²¦Ù$pŒÒ*³Â®´ÔȺšáXdÌ•Y×5—‘¥ÎV=4S‘ÈyWÇÅÿû¢~¿ê•7ü9ç‡&–<Þñ‰(Ú› ¦W1Wkf.ÐN‰½£›@>Æðh¸°£ª­ŽöððɰIÈË+t_&/º=;¢wd°\¨|—dÑy÷ R.VzýÚ"M¦òüÐT9ˆ¦µóÓ¾E¬¤£«Å•‘OG­?G‹éñÖ>õÙ307•F÷\Å>?$ (ÓÄé)¢®~ѵ‡0éÉç`ßöBÂ*u"­Ì ,«}ô]zÙ—••#Û9£b±,3âjÂ*ù†}\ûdgÇÀŠ'Ü‹h»&ý²r'Pªòæ¬ÞSŠšSÀi¼My`º/iŸi'×ðqD?`sê’€tðͼ˜TìxEhiåD{"ìq=mNi4» ”qz4<æË€ê,GÙÜòK…{柵å f ˜y}Vna¼Ô“³@cCÛ¢[:!>q(ëB ¬x\°žg¹:€dêW^áB®¼Ìžh`È3±öm—ó˜Ú>Ñ›9À¡PW[‘tÏ{1³—îRä¾Y]©çjX±¢K0¯›Ÿ´Û±®:Žã5IÓËZ*F9ι½âäcÒÀpr,£ä²—ŸE7%: Æ/iÄ“*‹?ÚëÔQ<™ÿ¸OÚ—{²¡v‡5áœMq‹ñ’gÀ\Zžms[$võcp¥œU–3#³õ14éRfÇ:mÍoN7`·Èò 6ì­ôàKÝÅÃç·“$H‰µD1ûñ8ÅV¥°¤ô>8‰˜ëÅCX²K)Ç4É^KAp£g¬D€,ZàcH–"ñ*ÎF{i×<Ëvc PÎñZuë~Ñ_Öžÿ®GKûIÇø§õ?û%¾»ÿ#&¾õü÷—ÈîÿPþ8VïÿÐÙÒɉû?“Z†úÌM•£U®hïÙ¦îd­Ö’qÁz•c4 ü”·Ÿ€´„÷see‰L¤KPp1;ê‘Í™eòmY0ªÊ*›¿:Þ{xZ÷ª™ù¨ÍÇ"‡eê]ÕµÓû.|Éð½<½HzÌräm¯I!Ñ »êTA$³G® Ô Së…uWÆwTc=‰ÁÜg}ýÜêé»Sht“jÚ݆¯, ÆæPìó÷•oÓâô¸§Ó’ ²öŠŸÍ]9#.Ô—9óœGyJä±à3Ðæ‹OÏ_¤ò 9S³_ÿäGaKˆG×!£ËiT)œ7¢ÄkÏÏwÞ £æSƒ7JRGBu „XU8HÇS²„QïRa ‘ ~+Œn V˶ áì;—áv 62mtÌÏ”8&=^™§@û#õjE8gFŸÄÎeÚÜäUE ˜UÞöe´|`G·p =G<˜0Ö¹Öc0$œ €³Ò|c#”LDŽá¬ )@ε§ýŒÆ±¶>S@yÐ*[Ç"gåhmƽiz²3‰I¹ÏñbݵRìØÜ$Ó|cßÞmÞ®˜&)‘äšGqV•ŽÉ§4Ïm>r¸­˜Uýú-¾ñÚÐëát­H º^^ 6™HPžu\XáD¯‚’ØÝîPå¨k%+O/‘Š&–5$ê†ù}s«¿ÿù²¹ÿçg-þþÅó¿ßõÿâ÷oõÿ¿Bþfÿôêû‹IÈ+_›ë?©jÅvªë7¸cYÈW`æšXkg°þ8ïúò°ZõìŽÓUýbÊ_æö×ßᑆ0—ËZ”ÜÈŽ‰diáfð 0ÎY«rvñr/h Í8¾QS£®šŸ†¯8ø’8©qQOJö"bÚâý¯“Mþ;ÿÆýß½ÿéqIÐÿü ÿw®ò_x\™¨³ùþ§‡”hwm«ìч“o)g&êª$”âJsI¢ú^%Ì+Õ5’EhN_o$Û¢ñÿYå?1ÆøO¼üÇñ_j‹ÿ¿Kþ†ÿ¼«ü¯ß[oIø:½1þo£}((·Ô)ÑÅÇERЩFØiéÜêNö‚[f4êX=°+‰~`šYM2˜Ëµ>¦o‹w®?êýÈx±óŽhåÐæ—g&}æ£ÉíŽ,V4QÏÅpÅQŽ‚73²^P럳ßÑhgP‹`üн–—8¤n®J„ºÕŸüÙäÿoÿÄ©­õ?¿Dþ7üÏxH¢¼[Ýé ùÌñƒý÷-‚Bœ#3lÓ7ïjN.è î“ö-‰8Ú8Ȉ_ös•ÉìæÕRòÐ1™‰ØWïÀÔ%…ËÜ‹â;ÊÐÕyÙ•][Í,å ¡±†¶zãp!ØaŠÍ”ÓŠLoË0ø²-÷ ÍŠ­«êÿ‚lòßþ7ò_ò»ýÿâ’[üÿ%òoøï±1þ7ÒÔˆíVœ¡Ýo°OúÇHóΧ±ìrŠÁlêbu91_>IX†ßïçt5aóUîÊL&5Ìwæð¶:²‹ÅMç^œ¥sŸXQí}FAn銣Ñùâò\É‹¦ïñ+¡Î²Õ¯^,ŠN1²æI=î "Ü¢ýÏ”MþÛýFþïÿŽÿ[óÿ_"ÿ†ÿfã%M¸ØîÐU -B9{öHÈ‹o'g§YŒUóÓL­-z]Íò.°©G³ÏKÓõΞÞJÒKžÓsĸpǼÝözBý¬Ù|×¹öÉv=\õ|æÛ2õr‰êáý­—Hþ>Y[ÿïㆆ;¢¡.ÿ}'ÿþK‰·ÿg+þ˯GO·UÃ0îNNH¸ 1̉Àø@·zö.Ä0o^„Sdo‡†ƒ@¼›P; #``¹5•kD-0XˆXD,²ž¼©¶<í¯jëÉ›jÂÉ Žú«Úzò׃¢x!ë© ‰« Gd½^( oÄ‘ (((`Pžpµn:Î"°hm5íìômÛa°CH;4¡ÊµÍs`( îêî_O%n©…¯b¹À&|@ÑžöhBž›Dlõ$ÜÍ ã,"- þº)oµ‰†ÿí7Ð6Ð~Ó€oÐþ Ú&à¯mø¿¡#ÀÝØC¼– „‚c{Á s+`ëh4¼7¢Qn‚Kbhè.˜ön_áì­O'I§ Øê£S9—Áˆ¿/j«CßBÔü(HFÊ•Mê£<ÒfÚÔu‚ çz0‰§ˆÂ€Í¥=‹ÐàœgçÇçïNJŸî˜™?­-úžƒÇ=&áxôBÿÒ•AóÊà÷ýÝ;ùGSœ—"Y—íÕ8­Éçz0ê[f ¦Ô¯5pE©é¤:oæ}²©O¤Æ`jÆð§¨é°z«¥è¢1ÛƒþW•ÅDe1»fjÈ$’6j*1öú)3)œ—2¹:{ÿY%ÇZ™À[ÓÿÖ*^man:µÆ^Áôf®æ·jV¼¦Z±`ò”¤‘_ész|MÁ7NŸþ·êÕ˜¿«V©Ò/ðÛ†þ<ái×]í¹ø;·©¯Õü!†ç‰#ÿ®#ݪ ¯w7ëÿ¼ pÚŽp‡ñ"‡Ä…Àap=[$3ùqßBKz¾äç}Á^à_V|ÚØìs¿|LÛ¶¥.E˜y!¬x^CHÅèP¼ÄÆ·ÙÝØŒÐÕ‚_þ8e›yÞ¿ô§‡ÿûóÿà‡êÿoÌB¨þJúùný_­ìîU7úÿå½ÿþÿ?þ#?¥—;?/o¿ Á<¸ê‹ž—>ÁZ~î9¯an§Óq­¤”¥Ý•`'Ž¢ñ½ue×ó˜qÝŽ -78{< †¤¹á³þÙ¨/Sß·çŸ ‰§.߀µÊ .v67Œ&7%9-÷=õ†³>x¶«ÁÃTnßbmULcßbE蕟€†ãè[d´" *À0„`!Ó 6(eÆáÕ13‚QŸ¾ÔȤ3Bh«oáQö࿚çÕÜ íeÝ]׸ÒOYbÌ9»´©ä›ûœ;ý¨7à ›ñ>Ž‚ùà&€2”ñ!>£‘X§VŒ¯%Ø„ƒ·ü ³Ë¸g?ʬKÞr®G!´Ò$ãÇvÂø¯ˆXHžñ3|x3ŒÿÝ/}µšµö׿5º/­F»³è|îöíö×ýîËg«¿Y8Rì¾´ŸÙ%Æßú¥Î|žÃªN\€o'0žÁ·kXEÁîÄ/;¥æ> mtJoßnâü;˜owº¬ö˜tbÀ CŸaqw7;N‰_&ÓîjÖv‹?Åëƒb«ûXMìÒ ãü’ÙþŠP£Î¤ûÒ\aD^Q»a5𠇫bÊ ÀÔq:ý—vq†'ÝvHÇ»‰X.üL|]ÕVÌFX ³mpæf!ÿ}0µÛF§ÔÅS;Ýù#LAœ¸Äy9êk7×á~¸»xy‚6x…ƒÑÃ`8”Ë›Æd^S@ã‡~©hµƒâCw…ïÚ¥ô`Vñ..À§'¤mq¯`B¶6~}G ÈJú‹Ïgz°ƒR±ß?b!ã—þ{þ-ìMñ$šFÓûqK¯(ô3~º9yÄï£ø§â&SPšÿ`2 î5ˆñ,¾eüÍÆxŒ¦Ëø{_`×7œ îŸo¬€ä7\¾¿f|é?&uRa~§þ#d±¦Ì°YSã-†ú]Ëñ¥ÊxEÚG™ñ]Òü½úàÚÚánj X–&0Æ]gõÃO€Ú~¤Z•ÚlË©m·ës·Nã"ò½úÈ MõïÍçÏwxõùó`îàã¾`^W(%€ÀƒëÁÃüéFxüèÚû‰LÍ´Åz·Áä`j¹˜£š $ƒo*“£Ù}1+Æö}`/ûm´ÜÃÏn‚y'ó¿;á2웎Z~þ~µ½îj'µÅîø Hª>¯B¢ uÔ#:[M^…ÓÖxµÎ÷|‹WáÙR)œK¯·Zñj-˜Ûuîùü Ý e…Ú-ÈÁ? ƒÁHh¥E» ÚÀÃÞ$|"z°éè ¡ÜÖéAE"U‚wy.XÍ÷¶¯N$ˆ‡JGÉAkÜD›Úe°¶ »p"vèAÑYxà!…8z-ר5ýÁ¡Úèh[œHÑ¢»prR·Š!—Åö»¨"7áTRwxÞG>—»‚7» Á]g`ÙŠø«vAÇ÷œÒs^%âÎkWªß»É6=Í饮‰‚D2§* Б:sF8Z±³m ^ïiŒòÌ 3Ü$÷VfÕ¶~ \ÿ^,Ú¯H…Ó_J«Ó¨O¿×sçD _ui¿‡ä’Pm¨…˜0µ¼fšLœµfRzd2ÁÌÔKƒ‡°¦Egý¸(aÓˆ0oão„ª’À±ˆ^÷i Ø>Zh“K„–]˜†KƒmmËë£AøXÑK_MƒÞïnðT<é/ý  CqH¾xh€N0ᩌqHj­Rf9ÈËà¶Ã¹0\B\‡!ݽªÚ¢‚Î UÁD” 0'΂•{lš† b±á¤™êT¾·Þt̯L >Ü‚i›I*ýr°íŸgŽÆû–¸¦JS #UÌ‹ œâ#))8Š#lÁ[Ó­ˆ…¬-sýBfiä䋞3EQªå‚°™Q³â)å ÿ°Îað]"â!¼O¥ºc² Ù#‚É ¹òØf&!0™ÒælÊù F–ÉL¶¹ Æ[u{}4ƱØ$/ëI.Z0yø2É£l'ˆ?õŸ€4YêèuƒèŽ´QMŽÀOqpk±eFwá]4$¸7œ˜P‚ß›†h½èn< §¡ùgL‹!¼œÌÁÈ.1¨’¿eÐ2ß¿=o\FA?ì›P ’N@Œâ[à‡Î\m'@SõÆ-¦à¨oi•Ø2{ÆSҲυÈèƒÜ)–߯WšêtrOþc}§’u‘%=ºQD!¡š) ž¯z“h8Äzdº°PfhÊ·mϱZúE¢ŒD‚˜¸P$p¢f•O«Õ_@ $aø -žHîž?ÏÕx©G6Aþç ºÉ<šä7]ÄõN;ô¶"Ûéà5B¶€Çä½ìçÏáð´ˆ2HIa»ï'š¢p§äƒ/ÛüRÕT6DE Ò¢ùI aYØ4/CI 8R¶µhãå´' Å"LÉ!mHP¨àÔã6úÓ40µÓÎÍ鋲˜ÍL ]=¼¿6×÷Ô´,7.Ô´N¡Ì%‘ÀY={»„ãd„»ñÉÝxz¿Á&OÄD“­o§²ðnáL&PäÄ6½ÅÛVìúà¤. ÿâêý» ªÙNÖJÀ’>S²04½µjÒ²œ;ˆ¢~qhLmôÑ´kðΙ†15"ä©Å?3óèÖR>`t#>_0ÈêSYXx°4!1åf˜ÁÛ¶E±€Xb™ç#°Aß C Ɇ/o/óz)˜ !»®ÔŠ;à"? 0FÏÇMÓ‹J~(ç…EM¢;e tXÔ–wC3ë0àâØm~‘ÙƒùvÞ(Ž®§ˆMDéøg¸ÀÍ ˜M@‡Hdª}J“.ÑÄ"I­{;Ð6Wkć÷Ÿ‚›wà4-“Hž‹Lõ¦Å÷5®!i°qªÈ EÑXoP# O`Ñ–ÄTã­’7ÙŠ}q¿ ;KS–¶¢OëJ;á”BÙ¢¶g= ~ˆÝÌ'\T¦.ÿ`æ]\ÔèñO6ß‘ Ouž£@0³Lò½T̰ÜõöêZ­X¡,^)–‡™»‹)=¯¤);&ºÒ1ä3슰­rš{‘[ñÈTd« îJ›{]Ü0‰˜üÈ!tþ®š'i*¾[ß\ ¹ùk³¼õ‰í…€äîX“à· "]_튭 f)i§øžßünŒ2MISòý€†ÀnÚï¶4•9GŸ“=žà#–«²#”—µ§<ø„Õª-J–Šªpd3%yRÀJ)û|ÝÿŠÇ4áP“ð&\ŽÍµèXm˜´ÅYÙèˆAÝ”£õ“”Yî0uÙ?ÁyÆ»¹’S­7Ók*Û¼&÷nóm0½…²}iQs kÜ«‰( ` Ø€{²DT³Äô2QÚ»Þhceåµ¥Á\Mƒ}ïV:ÛNÀ<Z•þ‰òR_Zô¥P¨gÖÊ‚^/Œã¼Z½1‘.á^©È˜©“n©¯µ‚G3Ñ Ií5e+bá×·Ðz|OÏX(ÞH -û;üh]Y¶s2†îÙ™A¨¦håÉîß%ýÀHG(7Óðå¦áKƒ°ÁËaO§!eLS@ºX»ÄŒd±Ùž¤_'°l“8,ö1ǘo1Ì— äo!‚]F •¨ª™ßËK4ì†ñúÃ/úƒ§îY-j6S|ÁÍ´h§W Ä5A çhI$ÄNj"š&“÷ß8RÆׄ”-žqýté›~Ü%Õ«æ_Pp³h2ÉzbXé0uƒiq<ƒÜ«‡o2Ê«—®†]­ýŠã”§#Z­ÚÃ,ÂÀåeÀŒ×³½ýŒÈ²"U¨ ¼X»Ð„zÒZÃÖEÕ.’Ts8»×!Ô=µÍõæ1ÖSÁT]‹ÝJIb×Õ]„y(º½Æ;r·†HjÒRÉ ¯JŠ%_7D1bʺ`¦ÍÖSc¨óͶ0ECÜ’tÍ®H€5•C*~à Gê¨Å¿?ú›#IW!â{;]6çHMòF~MDKNÈ24|N\“¡"`Ys˜å‹E<½˜ÒîÄøÜ-”êøzJúø¬”ðc_4ùêO5ÑBÝRß°ý¦šê•ÚÉ“]³ÜÒ ÄWø:lÚ¶I’éöÂÊ.ÔE¿Uu(±þýN÷Ì2‡á58eU‹‚†èíÈó”ž&ÚÞYÚ–î)(ã)A_¬PF„¹”Ûa×ÇëŽãËzè‡R?ñ¢’pÔ|ÉȦT.´h,_Þ·Ã6_t…n¥›Ïžu^µ—gØ ôù¢iÁΰlµú‚ƒ6—0ÀCJŽè÷’ñ{ÆçŒ?0~€¯9exZò§Œ_0¨øãoµ§HíÚ‡"÷´Á/à7‘{m~ QÿÌç²F8æs–õ ðdzÚì,W ÈæÚ™ÌBl ãË:¸ÖÊðœ4 Vr ¯ Z>&pà屈H´¥a„`Xv×ùÏ竸Ñ9†ÊËs‰4íœåAƒ?¤ÊïÛü «ÒÚO•z»pâi4~?jÉÒo)÷% l›^nñÃô˜Ø9—íu@q”u2–><Å·ƒë)ºÿã¬Å® #ïßíÐJÜ¥z“û€ûƒ_à°Tý„²'~‹x·°ÞÚ?L߽˘rÊ’(¢ú«³ BÛH_î¤ûÏAõpдÝG7ÅÂñ^¸£>ÕyzWz^‡“Àêü Õ­Ó:œ>ƒ#‰Ò_M¡¯4¡ob¦¨<&Ø.¾'ÿ»TôõÂbpÅrcE©ïe}‡ÉrWpà‹¼}¤ž&¸XクäE\ð°“ê—Š‹ jn…ä„B|Ç7;½ça„ô¿Wïýêc¥;ù=ùÅ* ;zç>óÚîûï=Ë,Ï|V ¥¢’€<ü­`͸ö¬›ŠbÀOì!Êú¿…¦ÛÑùÊÝKb6*ÞÍ’täµ220W÷Í¡?€Eñóg 2ã¤~”A û¬í Ñ*¿ônëô^]ì:èÛWöûM¯…6ÉKï‡{|Fû–O¾%Åõí.~§AÕ€©:¸ÙÇÝ~›z¨åçkb‹ _’°ŽÜøäŸ)Øû yj0!ÞÚNu0 K³|)ËŽ“t¶“y­gÒŽàÊCëÃ2móJñm¨ËÚ¨éRðfCËñᘡÌÒÒüβiÃêˆ*´ª¹-4ðÏÏ×íxpÈØüÍñÙ:.Ñ…^éè`oŸóP N ý±POÚn7Ÿ+p~yRv²Ç(ªÃ4;²Œ-øj>*„v&=¯Sër½N—FFŠ!.iv`wýM¤rǾ_zSŽhap߇­¿ê{=ª0P¦­&žç#ÀÊÍÎ:ÍQc3€í­¿_búABt¹%бFhúâ +%Ý ¾†=Û–eKa®‘-OoP¤Úi‹Ø(cò¬$`œ<¯Á"`hÛè ¡{«ÌY¬QXË1¸¾„¾¶¢CBŒá骖ƒ–ì …yhØ   @L\ŒPh¸¨¢‹•ôó’¾ÐÁ¢ÅÚÃ÷òYÇeÀþ*ÛÁð¤OŽòw!MŠñpMž@Q4 j›VÇ…ªsûzVßq Ú H¾Û–! ´Ñ††&P–°P‚“¿ÕmÃ"ûµ2bÔO¼G Àn1ª7kÃ{×JYAQ;8 übdÖÍô&Öܺy³æ“ËÖx%è{Ñ(áKò¾²ßÞ^µŽó)àãµg'‚dVÈW]!•21ÞSd¼_ÉäÓµÀPòéé4Æ*Ó°¥Àû³Î qæqBì0Âôª€ëßÈË»ÑmeóÎTMÎ*·•i̸ Y|`ŸÂ»:"2Œ´uŒ$*sLБS¹ Æs§rìTN@¬s*e§r†.§èvé½Gé˜@*žà[`œ{è¦ •2ÈøÝA“,B½ pk0Û20©2.ð‡ö›ø™{Ÿ6ò¦À[€3ש jùûf­æw •n¿æ÷©‚ïZ‚1‚/Ç,ñ*×›D ¿f-òÏT*UèƾøÚ<ª0±b~Ìú‚?~hÿóÅo#U¿Õ_»¿§~§gd-Ä3TîÃÿjȲÑ?}żAGG€Ÿ“ÓÔYÌâÅHÉ¥€aËÅC…F³*–Ž—'Ž0çØE‡åØßnR@¡(îê7õÁ#ýÑh>F’/åÉJV4XUµ!"„FžÂuˆEÿ .ÏËûŒÝ°&NBå  ÍÃáÄìÓºàù„wTÎk(:E<Åé¹bŒ¥ãŽ}£jtçýÞë'„C˜J=е8°v­4íHXî#@Ó-º~D/WÔ€ëfôÛzÙÜK·ÛFî½æëÀpïÖ(<1fF´Aágxð‹ù7:ß½]˜oØ ï?±ë ¥ËpN†Ö6Ìû„»Z®fª+÷åXåÌì­rZ@_zq§Ñ £à 0–W¹Yi¡ ´ÆæëõNPm莻Ãb­¶ÉpŠw©<´ón–³¬£*ìvûç'E8xÞóhj«>pñàÝ.åÖ‹SŠNvØ©à Q e)‚†“½=••1à> ÁŽY”ÎÙ z1[‡–/$¿?òû Ž]‹Ñ¤ö*"giD@dž}¯ 'ONûD´ËuÉÑyæÇQ$ĢРLKM |®à»oÆ"WmÄR™:"´x’I“rú¹ü/Â¥\v–9šÂ×Ä?fo?náÏý[ÒñŠn2z[Œ¿³“ M­MŽÄù×™óŒ¶D)Çü½Å>=V,ZA›ö?‘]+´ÑbDÚ,&l'h¶Á¶7ôò¯~»b‰|£Ÿ!=lgV·¶7WvâÅ•íx:]­Ç×W6×âËË˹\6·ŒAZ,õ¾ðš†U„ÙG›¯¤Õ »CãUlBŒÿî.¯?”Â}ÊÐÂÌ©m¢~ƒïZå½Ùý€¼Õ¢t-!h·¼yeUHß²Ô­)D¥Y\9¨3˜¨á¢¢nWŽõùxC“ÛÊÎ]žÿ€Ì°CúMjãJÄe"‡ôö¶äóí1Žˆ±ß¤Ëf\1q¼ñ2–¤ðqå‘f3„ `”3Šx9Kü‘¼DÖŒ¤¿y‹BñînÆwŒÓr‡©ùÂØ8~5Y¡fª&Ì©"Þ Å > K¡>5uxHšû”Ù¦ÜìSF€Ã˶¸½`Z´[Ú½¾ J^£.C0+JŸs§hlðW ŽPªk·e5‚6.Ñ,œõ/Å®+_–Ÿ|ÂX÷V{gÚtÑÁ ¼y–¢¾¸¡š? éøH—ֆޮè²ùÖµÙÊó9úšÛÔQ)›<€!"­òB·Vƒ¯ÄwAl6¯àU‘,€Åo]…šFÔ‘øK¯ê°OL ç3@s1_†{¡À!4ÅA`:A0i¦G“Ï•üK¶ŠYK–s ?Sw—Èä§Oo2Ž E2}±0$Qpk'šá1Rc|t°';/W装 =ôÍ1„yó8lïðŠ*<±ÁüĉÌõtH14ÿ1ëf|?cÿêyjäÿlƒ¸sŸÚÒn añˆêH’F@‚k61βÏp•¬¦Wt¬øoiŠ:¥"CSЊ*i1RÁ“‡/|C¥ÌÖþ›çöŠÛ ?¢ñ„µÿ>°ÈÂlèήS;ï•ÅM¼ª$”3$½«L¥^ùÅ~Iì*×D è©{œ¬ipåY&$+±ƒ/ôf¸¤Å¶,¾‚ÔH\m‘féñ ø"‚¸àp ÇS¡·­MBŸ“ƒR™Ä¬Þ[dÆO $<£5(=´½þ£ETZ º-GU xlÅ'xA¦Õ! +*P3æ{=45[PÓB-Ô’†„ùSPù “°oÒ¦£+FÙRÒ_8 “J*g%NYõ‰e‹IT‡H6£ú©P1z PÞçN¨U^`AG§†­Þ„n§i¡H Ä߸÷‚ ¶#µôcdÚRùh0‚ mÇ¥‰®Fð÷GÀ ±FøJ,QS0¥Ü# - ³ &…EËÄ»^ ʤ-NAÌŠE þS‰ìn¨ºSÑÃ&Mä…9 ¶?hôiŒÖ¦0Öší”ÆŠ«;ÑÖ‘¸Tª*jÐjޤ±'€8ËCPꢢIšYõÉþl jQ¨Av6œïŠ£ [®‰‰ùŽ!þÅ̧®nüNh¢ ¬™u[þjË÷úªÚ”çI…ß>œªè›GåÜÞ-4ÜÚv(K’ºmn7J“x¯rH^Û&Z2̉F®àNÕi"ÛY)Ò“ +Èm+ä6ÑŒvæGã!”ç|Óøã­Œ¥®”Óx\„‹™¸JÀ¹­LïP~>äÀábÌWÅàUèÍ–|ƒŠ—p{ò7(]Çb¶ÛÄ G <0! ¾fL7J¾Sô)éüþèß%ŽW§¨IÇ»€}(i°¸ a·óF÷¾öoɦ³=_þÆ,ú›/¼aD¯ï{T½Õ=¨ÏXàu¹ïyØ¥+½7ü…:ñ7 'ð&nQß×èw[ƒ7ÚÈ7yÍþÆš×·V·Û{k?·†Í^ËÃßoè¿I"àÇÓ3š˜¾ ªð¢ö&í*hD»n ‡ì,œŠïx7Ž·k",«ÂøJ! áÙ§p‰ÃÞ_$‹Ù’ .š-üŒéXö°÷·‡©aœš- Aå»Í 0xoo~á£!¿K˜Ö¿s B— $K c"|!C÷/0u.²Á1*/hæÏ²NíÖˆf"KŠÊ !+l9$MZÍØ¸„Äξ&7ˆBÊ‹^]wÜaL£ûï΄eo¡6œ“AØ\>šLnÝiR³¨—нà>^\‹Hkð.<¢M6Ó,ªál¢Mᦰ)\úŸÀ€*)âý6~N>÷17(aô.‚¥¼ØsNZ‚m?_ÂûɼçÂý|ùåýÔ“AÈo)‰rO_ô=,+ô×°¹P }?í¿»ÅSs‹§!õ ‚ñh/¼úSs ƒëïÔÁçŸî)1•ê+sG©…™Þ‡Úĉ’µ—–5·³œÅ"¼³,AnI®,0ðæÕ„ŒÖ7¿Û“w{ì¶Ö?žm·§¡ÝvȾu„{þŽRü´éªŽjmÜçi Á›â&D0uG±­Å_0Èi®ýÊf~ VóވѢJd [±aIdå- z­;¬£ÙÕŽM­ çØ z(µ„<é 4Çúë/õ꯿¬ðq˜™Ï®ù(|vHò£@"´lãA™—ó5ȆP,Z€ƒÄĹCÄÏÚI’NÔ‡›gˆàZ½ûøÄ(ìPö%ž¹L™Sf”!NúW¥Þ”óaKoJL#¡¡ýn÷Ç÷žú9:½ÖIú„êCŠ}æ£J•±P€î§YÂj^2¤šÑ ™ÿ1ÛÉ)’¼àZp£2 ÖçoOóø^‹ͤ±~èˆ~@ê•‚æE;.RC­ön‰(˜vÉ3åKããÁÃyDíÀG±2ák1uɵ‰¨)¬üÝ4Ÿ6Ô+iRý&ŸÐ …\êcP¹¢[Ú¢lÅ ! ج﬚ÚÏö–õÃrw—Ðu•Ô¨¼ÁptèÎFLSm±ÄwfóÇÊæŒU›ŠHö‘eÛìü«L9p:ö5U¿ %K¨Ê¡û.¿Ú¬7ýÚ†Ïò0)Œ-cB¿ÓvQ^aOÈ×C™$—ðÔ9ʹMŸñ»¹…ÐrXRí8D|GeC¸Þ¨Ló쉋?cé¼ò‡-H7 ¼ˆIú·¥îEiá-I)<$f`„µ9„1QCã[P%Ç)8a#ECZ]‰ò®ïÆ"ÚPØOÆwBƒ²5†ŽÎË®ýêíº¯h1$ÜõjÒÓN—§ŒÎÂ+=Vš%¼Õwn¹*#b¢Þ.RÄ ßX>â4P²õ·ó‹8v4}Öû}g‹Ò¾òà0­@ð¢l~kÅêDµáÞ{.IlÄeÌ^á"nÙ+23»,"t¨qz¾fèj–;¯ó×név-¼Û^¾gC™ÌìÐi á^ÞR&‚¸±êSšÂÌÂMØJ*žÀôÍUá4nÙ'×±ý*üûïZ,0'šIŠÉLúNæ]nRh µ9 „Óž¶~ìÔ1'n«»9Ã[Ã<}ooapÖ¯}¢¡o]ä°GóëªyãÈ”¨‰}j‘æß†—JGü?(Ì/C*5¸Fýɬ«´wlX^YáÍ,gÈM¹üèÛúFx^k Ä\¦ð-­t':ü`5CÍs÷Á®™z…@ÉÃj&`äò‚°Ñ‰úWû×6Æ|ã¼Ã¶‡l¨ Hh]À÷¥tUA¼·ÅÙ§sPã[Zy—+.zy¿èµƒnÿü‘¸ãL•?Ñ&ƒü-é¸É•{ô•‰þHü(Ç앤ãÀþ4éTêÜx» Œß›È£Õö;Ïö9's® \>ùš˜þí>+­ç>z£\`ã?0%¥Lð‰à±ÏPõÆ] C»àX¡Âbˆébú}ªD”Ð9óÀÑmvÿýô C£pXʨEé8üØxüàm Kàùí7Û²5éÃyÐãø9ÁP0Æ’ÒçQ–#±ohJƒyWí ‡5H‹åS,Sä“0ÐíëÌV~ÖøFTÉ"?ÿ2O…“bÀö ÆÒu*CwàWØo©¯×JÐ6o vQê¡‹6IFÿ·t„€Gùhr‰T‘ZŧC½E¡‹Žº)Þ&ÃWžp™ø=© ò¶3éŠ\¼Q°†Lûþs€šZ´*QÖjA–bÍ÷lÙÊ2ú¼@>“ µPø`ò®çÃ"œð ã2m §,¾Rt1.qáõ+Û$o‹¹Ò&Uâ^ 0þ’á4½Iq‰ñøÅŽã\Ÿò(’JmGù%ºâ½ }•€-ik €o*ˆRÔÏ“_%Q‘nk|gYÂ|¥Ïê¶R"対ÛAx·0¦âEï¥}€ÓúºísÌ]u‹ÆÙ”ª,Ê‘HLÃ0<œøk×Eÿ‹Ê954€AÃÎÃ3rV”Ã;ØÄ^€PYù0Õ…uã–p„¬… »ž¤ÙbÃŒŠ N>=¶Êß è CÌQ|‘2.!ø™u„íÇAîé²øa8(1£­î3œŒ×£ÀÏ=˜”ø%ì÷P¬Å“°©åàs0vA!…3Û çDŠº+¾ùeoû]ŽiÄ:ìlƒkáß`h{ Ožy`ÌW¬çLÝUüÅÐzÄbN Û ™fîU¥}椴ž,ÕLØ9Edû@×Äp JÄ4;„Jö¯±à!<¡Yb Tq`S #¶X9$TU$\4&µÂWôãóƒ¨=ÈþVJâìH†@Sª:ó'kOÖîgXXy²vÅMˆè¶]×(r-l‘8&$à» ¾?#Å—½ôˆú@­¨<î6¿Ü‡—ûôD¢Àúã‹4¢Ø&„?jT«A!5õó)[GAßø§8wJœRsF¿47Bj°­ßi£ÃÐ÷úµî¸c T[€ïçµ Œh€‹³lϤGm²pf ùP(¶¯®úˆˆ6ǯLnøbа1>pn¥Ç*zô0Ê2qðÃn›#½ ÏÖE ô‡À;E\ i ¬Ût’…Ée ÌOka/^d†œ õ5xAÊ~a[„[^ApI`fJ8ûs¡ÑÚ‹Ío“#Ù l¹–,âÑ_±Ã=‘G5å >2ÈPâÚ ù…Óý öÈæE†žˆF¦T|9&¥­3Ó%7ãînžhþ±ÀywÕMʉ/,(|~BÀ²sv¨ˆÂ%p\ù=Š[08çå1˜FÐ\µ’ÁÕ9ø¬N#ÎLQ_ãÍ_}XÕó;˜gò‹xq£¶ØyL@°ÁTrOø”-¡öÙw…¯,c¦-6 ]-:Q B{âe †V®ÇG‚y8ËnF!ƒçÖPë…•.Ïç Qü½†Éºš³†l÷ÆÛv1õ¶ò. fwžì1%hR\v1HÊT!~KV}Ü5|"ǹéÞÞâ»]E10çÜ ^œ^³Óå<yAþ "ɇ :õÁï1(¹<]%Ø CYÔõÒ_S„—¦0æûæÅÖ¦Œ2 ç·tG>{"wé‹p‰‡&lðúG/0ªº[pÙôÑåE4Σ‡‚ µ*Ü·Vm}Ö¬–äÑV׃©ž*»½½CEÁc£còÖå“G…K Øqo}G"R›¼[QÿNcnöŽeYx‡¹:Þ¾}òçCÎe Ÿìãm"WÂtgò}ä—ÌÏ4*2¢Æ0m^´D×Ny°é8wQ甿À™³­=‚Ä_bq)•‹|P°fîŠ1J€±G‰ (™yWt0ô¢žTQø¡ãÜ‹ó”h%1ÒG`+ô„Z 28•‡,˜%e/‚Ạ+úÂA¦w’"†HaCDÔ.Ì¿= 5RyÑó‘I´@q¿{fbaÎ Ö›ôᨈg¡v/jZ šPÅ&@ÄåÙ_ ðÊ* ö¢à³Swɰ:†¢05F%«#© ˜HzÊä»DÔóÀy@o¡+0º£œ+‚¼CÃb¤™Â…/®+Q“¶L"ШÈå21sÀÐÆy¹Ïue?…Ê×%‘õå+f=  ×dz†Ž`è©‹¹ p2ƒÄ Eyðç½à1/°|!9F>t«ÃÖÎüP`‚DÔ‡(iQø ³¡ c6S_×$]ÐYIÄ8üê)NÚj#ùƒ|e{&Ï"—bÇĨO^dø"ªÏ‰îHÐÿ ¡F—àé¹k*vÙèTYV£55”‰îÍJí¶_k¤,îiS.ºúM¯ùÒ#§h@Ч»¤Ih¨óYú³¤Qº ñê‹(%%Žá :Œ´‹Ivé†ÈpI‰/BƒÇßÀ .)u–D¼2RF¯ìòõ²/9†Ê.hÛŸÃÚhx ¤­'kQׄ Ï ’~·P±¹Eœx"¶P„$¿†‡ 2èWEp²ˆ×~õ§‘ ‡ÝCC’*TÄ@qÕa¿…¯ŒŽÐÈNA`G¨¡‡DË¢10XÌG12l¶ýòÐk÷"# Í‘ñ}³zo¦jNÄ­÷Ìyô§â·˜ È}4jéoá¸á5þ‡šh C2†ôóMP‡ÊK>£ržüXP÷¢݈Å!•ª98Æ_þk×jÂÚ\‹¿7‘zy±ÌL˜®Åß›l¤MÿÞDÕ¾ïw®ÅߛȰ+¾úxŽº“!Š<¾ÃZm„qBƒÐÛRϼ”WEŒZ%³#|INMTëˆ+›Î†F7ÊÂ^P-Ç—Pz %•Äs­ eÇe=þN«§¤lÙÇMÐÇM¨ónÏ肞çzjiÏ)q††_X#+"´h¥.¹º«õÚ@t¹yÀË–äÐ|BD-%xíñ)½‘ÆhΟ2Yú»¼‘ɧìÀo‡ñˆèwÌâ²Wñtã¾ß ˆpé>Zg3LSyD^ï84‡¿ Ÿ*çŸxeçƒwìÿÍ’£/h#©ù˜ÏšÞÆãhFÌš Œ{òr'âY’ü‰j…—ØØjW¢ãZû*¨Pyñ¥@P‚>Ï7ŒÜ‚UNðùÚP¿ø¶oœ÷ó¯”¬ŠŒ÷ž{ù Q” Ó®xµü«„Õü«¡­³Äý&öuáÛî3æH¯PÄËç7Í}šFÉ.17¾¸ÛÑ[p}€#©uZ€)}‚z¶¥¢ šíç–‘”D(g5o¦—@ÿ¯«l¬$.ÆNsPMÉès@`›ÌM§Ù,¸2 Ëè/W‹Ã¾‘.øèfÇ\Óbq‡`=,0©Ë3uaj¾`hëÜÅ™ß6Œ—þØ•…u‰L-ÊG*.q‡0˿ע–ôZ %³b.ç%‚TÏѷ높†öh$þú$L 8ú6OWPžR…Ç%óâò\ÌB’õx—âž•ÖCÆ›:5¶3W ;½ÑÌWXôñÌØœB«ôæ:’qå,e*ï:pøì»S)¬Ì*BÍßý1ÈÙÃÆÁêU3j:U‰¥ÕÒ=¾š ©çÞyo›2$ÆüV=•/.ý‹5"¾›± ÂÒÙ q© Æ8ÏóÿýQ†za—ˆ9þ˜’P#3Ë(™÷‚F¸HY0Ôä3»pÌõêÌo€š³hâ\þA/£Ò^í5¸ÞÏóU?ÚXNpÑ/‹‰vÌ™g…˜ÑkÀ B#?Ñ-ð:ÞáH×`pBÄE¼²±QÂ2†}n lŽËI²÷ÏP*¢Í9Êù8N•Å1tÔUæâ¤Jò;fØÕB¦bz…¹…¯Ý0µdVi®XÃB'Z¶ˆ1!¸é4qÓ(¾ô0¸‰,°ô°!º=ÜP¬ëÈÕUfceÏXG+—¶ìÈ…âÐò¬œ±‚Ot÷_0 K?5R´…ç Æ¥1‹%„yqI ­¤ ãQK¶úP†$šqZ„ð¸\p³ò/lƒ¸wåšjnóæzF2y¸à×ïÀEõ †3£¬™ÒmIë3ÖA©r‘±áur¤{÷žøKfm íŒo"Í„üŒ’eÇä Eýþõð<жÔrÞ…Ûw:o*  :ã$ó "û‘4$|Ì~r²˜'õ`X#hfÁP•€< Ä„‚¶e¦y;nãƒcò“ÍX|Lsûóc£¯ÅÇ&4ÎàØÌ!oÝt4Xl#qç¤ P<‹¶fåì’æ,”(ÖhFøc/”Gæ,&äÉËX/(&Ðßœ‘–.œ,}Iü#¢ÐèHN…¨rC·×˜Ðëœú!›2òC…û =ÑÏj‚tK“”7w;¦8-|•¾½1©0ª/¢Q¬-¶Â-º‹ß‰:Ɖ$v˜B3:dÿÑŽÂ:ú{2z }€·=JF b<"‚‰H6$‚ÊÖH‹Í?Â7ÖÀFh4‘Z¥Å?¨ $ÿüë¹ÇWD”¶ "‘`|š§€ðð9‹ò*µ+åVüÍ“zDs#±lã²*¬¨wË _^ Ÿ5AÀÇ"\.i—ß9v_RadFMñÑS n³” "!á ¤Ýžw"ìJíàÈ©vb£2y'IH»þkß—…¸×ÿHþ±ôÈ‘róå¥åG¶ÊåHY ³ÈN$7ßF¶º½iýë"™T:íDÎïýÈv÷¡Ùí†"ÍÕ;Ãý‚íŽ ÞêÄù‘£Ò¹Ù,o;@ ‘½ÓÃÈa³êwþ AŸœA§ž~›Õ]‘ûá°—O&4¤ĸí$TMþc.vë¾›Œ¢o ÿsûgÔ¾‹ý°ßø‡?Üâ«ÛÛ?Üþ¸»ûãÇÝÛíïÖÝíŸðÏøëßÀ/¬‡fPùûŸN^üÀâ·[x¼³£?8ð?{»K¼ýè¿ýèØØÉFÀ±`¸dØgÅ¢FJtþ ¶%,ÊiƒîNåÐe›Ø@•švËÄÿahNe ÈŠc7~u“?~`g'’óG~ƒŸWÉÂmÊÁÔ\h·©#ë¢jÀ¦¤3—Ž/‘Ü8•ïPÿÆ­Üa6“õF\;í²3Ÿè‰ì‚çu‰dnÅ%Úeà}i0Ø#Þðe`Ù©dÊ ¦¾«dœJΩ,;•k§r!&}ŽÚ5r±§œÓWdù“r+—…Z­JÈžÂa”]ùXIñ…L¦UË·Ù»BåJ³”Ñ=Š_£ÔkåLÖqýq¦º–¹Ò•Jô â¶hÿRX]¶Õ2v“©žn+W” ൒u+GQzŠÁ¿i²þ.5ÕYwþ› 8«ùÊW¡e:Õ!4|é5ØÞGk黾ŒiUfb$—´Þßm-ØÊRå; ^Ÿ¨¯ßh®£öᜦGF/‰’ôÊÇñ’nbÁÕ^lU!uþÀ Y*‘Gâ»^ÐÕ¢&åÚîÒrßð¢ábFç¥òEîï¹Ó|zöˈűb€)Í—ò>ãØñ®X¨œ1€»M-µƒ›.øŸ¡‚0„ðåtÎ9p]ü‹gõÛ`oŸœQt«Ñ3а}su.ó,ÀìSÉþ0tfëIæâýaU‚¯1Í„::Ôim®‰| vàŠ’¨^PZU@tg|^®5ÚD{[FÚ{¸—¢É(ÓòçÊüKF~—êõm¥,<„Î]òÁªp.ˆe=¸&hBrNöÖçrÓ——”ÒãDÕúÇÓ|ÅúñEïsv4>WŽÆ’]¨|åPOWØ3Î;…Šp'ðÌý˜R€­éd3o@ÏŠLâ™O)4J{þÔ%;b0"TûUhC¿Ë Mch¡Å»Rl‚ü+®Ø…U\\Ímû¹Úöó`Û]¹ízò˜Á!sf¡ 7jvU‡´aáÂ(‚ü ­eŽÿZ\*^‘ ÷ JåxåÊüªoV ^‰Uº¬EÚvC<„D}—Wd™$œEqŸ®h“ ‘_üYY¡9/#f\ T›• e¤Rãà¦åµ¼Z§.q'ò|i Æ·¢‚$-U–™QÍÍ€1­¤üwø&pQG_l/«]–in¤’VR·´¤ÌüaSMÃ~xßïŽÉôd‡£ •§@r&,: õýj·ÑÁH&< ¯’°cÅP"”w«SÙ‹—i)eñ Û:ÆYÏ4U¸ÞáŸe½[eÇ Þec8 ˆ¼mÓùDjBËZÐò@:•£ßÑÍî+"»µJÛ ÄvàÏyqϺc[öüki;Ÿü' ‡mâ9•ª¦â?žwá¿q’,í˜t¶‹år>ù#ñ³ŠØÔ»E ²‹²êAU~Ü%âùù~²êÇ_`…|ôGyÕ¿±;šøcÃþ‘}‹þsãƒïÿ°ßàÿà;ìÖ!Ÿüsaw³ß/Â*壔˜¡3¼C…Ú…¯RŽZ”åq8¨¯xëÖjoØj ZÙøQ‹é ŠwxÜT‚C©Åì ›eÛIçô¤Œa?þÓ[cøÖ}q·²›•Øâ âÞþ‰£þ F|ZÞ¹Ø>ÁV>\Kn—oÖêˆRó±ïþÀÏиfŽ¢:hZŽ  #¯—]‚/¦Olä›ÔWŒ„ô+ñh(bjhÑŠæêSøDNÚÆŒ-fi:Ø+âÚ蘜+?Ï3#C-°Pç(~Bá™MÔ›Ê.‰V\2]=3c˜ÌÔG™ãàK‰È!ö ãfÊóLH効ý*cµNAMl³ûÜ0hÀîë ¢”aK";œZ+Ó±0ŽCÃe±4f¹LþØNŠ«!Žûe¥:1;(ìèK>Þ1üƒo@ާ >Å8;ƒã©€_4¹™O®ª€ü‚˜1+ª‰2¨ ¼ ˆÒ¥â½˜_~!β+9³It8_Å'Fé —q"ø‰úmn±B…1¯Öÿt-j >$Æ_”II3É.žˆD0ºÂ¼(ª®#.`õl‡Ô±¿½ÁÎŶp.ö” B:4Z{¹\­¤š<¤˜Âp æI*WÒ[›‡&8^Rì²R ǬÞØëï'Z¡Å:)çÃW¡#8%d@V8ò¯~‡4,dM¥g¶4JÑÍü8û›Enì¿ÖÛ ÃÓŵepDYY†¥œ;ö¿É2ˆí)#lʦù“EÃXZò5iyæøCgaE³Þ½70‰¯Žá––P=K0S–Пø^Í_”.š¼ÿQK6í¹Øï3ÎÓ õcr s¢„C÷lìU#a¥ü>Ó),ÉWa?±Š@c˜gd=im@@AËÏÅÛø ­³Ý(Åi¡ ¸¨t'ÿr‹ÊîTkÀü©ëÄõÆz@_ÇÝþ; û ÊôFÙ¢B'‹j?ÏÞiSƤôƒÆyc”µ?Æ3g£vÚ6ÑU³í5þõÕ ¯õ‘÷}3æð¿iàÔ¬1n~ù¯ôñ)ˆ^‚¶ÍÞa…°æÂÓ¨G]Uy5ßøÃÅÇ”‰­6‡:Ó½¨d®î .”2 w%†&óß„m¥fªTæP Š¿ÂIºp@jÀ¿¼×èd¸Ù®t¾ 4ÓšïWëô³Ïì‹Óø°ÚY ¸¸÷ëq%–]ÿé×*JJ—ã$Êdîp¥.±œ®ÑN@¿p@û‚¸7TÃ¥O¯èëÛP”Zò¶SÉQD½~èz9ÐØb8Ù(éP˜GQœù5²%˜çÇhœɉ`@»7kçJ »¤;5upNÊV¾›¼ˆÎMÈT…‚½$Mp˜ñ¦›>9ºPºÂ;$æ,oHÓt!×±\Œ›”ŽÄž*M µVž~`[y©="Y<¬=7¥¡Ë^s$U‘Q-5ò™¤QPxJBÝé ð_éJk™ÛD¹#Ï|t殀F/Èò”¸O±©½1¨+—x¹Bå;Òf3v7…À?R]â®0b.lbilÒú¤ØÁ&ñÝÐìŸæ'¶p^¢€³EÅ@~œÍ¸Oèq†×bÛÕåC Ú±4ñR;õã)ä, /ââ @râšöåÎÕB.êå‰A÷¹_õcÑdtc í3ñZËæßÑ;¼ÙIŠ*6FˆÖoðÍF“Ñ?uKÍ õ]lAwNæÇ(Þ#¡}%à9¶SÜ O`•Œœ4ÛM-šÔa#D^ ?ÓD`íʳiТ7 ‡¶IÐmâkŒ™x\a™|û†©üB?ì)>ndï©r],6ä M·æ:CR¼àÒXiMƒ¼9’¦ªÕn4lùÎ6î¨è½zÚJò†8FpѺuÛHë$Û{Ú4…³þAx—‰fq°ô0ï?kÆ´¤f9{¯5@úþû=„ç*ñt>=ûi5€¯OË\WpMúnH¬ÌK®LB©€nÄ1 R 8öZÖ¨­^7k‰•¿dDo¥ÿFwE¾ãÚ(þã‚•r8Ϋ »=1 ÍXõB½r¥#^4j.‘KÑÌî;ò*Z8,¸*õýŸT¿DžDî™+“_xùP¹„E„?gÚ%D•”èÙÊ*Lm’ôÆñC÷ÈÄT.7xè%øÍóȶ²g­#l[$è*…ËL²ík&g.xtã#Xdüà\ÿ`¬ôœIþY0Iœ7̲:B PÙµÕ~³7:Xz}Rm›L^šm ‚ÝùãŠF$«ìŸºÖg/B¿í.Ǭߓ_¬‚~¸IN×´;j 4¾Ì*ÛDŽðâ,QÚ6Ñ$k§ß¹³Z|ov¥_±†ûºÐ/Î*ç°žOœ^¦òçs¹¨Âý,¨ÂÜ©–pJ4» ’?¤;¹‚’%Í©jì_p#}ùóQÌWáQ¨)^†9êà‚] òp–ð¤Bæ ¯<ÏØÍÆŽÚ…0xùïAÀ#¿Sã–T­­n›k?Ì^ ïš1ê&Ú,€Ù7NVpÑ;w))[w¤lYËWòò­&,£•’AÔÄ=eyΨø}R†ŸA¡±¡áý~·¢´,ÁþiÑÂ%ð2­•ëÎp+N ~°ù|lŸžýþTš ÑRo(ÐqøüCÄó×_ìNô×_èêËÕ‹Àäþ~¾S>Ç%ëñ’AµpßtþÂ…Q+_*ÒÅÓ™ák³Lˆå»Cv”@H.ÉɆÈWQˆ²f½” N3œÔ(ö›ýögÅŸþ<ˆ;ÁÊ2ƒ]wóü¡¹¾áÓ!Ô º÷–›²}¨—íÀm…?ÌÜÑX%V¾Þ’2êG]¨Jܨ-œSèªÙò«ðhÀ$‹µ)c!ü¥·~+ÊîBÃ…ÊÔfñªÞ,BÑôžðõÆÕ3HŒ±¹½ËîÍL /Dñ 9{cæ H®¯àÛ|´Ë¹9TzùŽö`IwgÃjîÚ Kß„«‰1CÛ'éVL» 4¹NþùcðÇmìÞÉ[Êe[ÙÓCåA¸½@` ,%NýŽ—Û?~üöÉbç‡Z‹ ³V¸LÔz—¬Ø?Y2ë¶™€ `îP’k(-¼êy¦%šÅq_ÍåL¦¥0"ÖçT“dÏD¬þÊô¶rF#Ïî7’øjŽZÄÍ 2òÃθÝ}9š/û•ÇæpÁ‹ö T(=ÞyBe”"E‰Ï„ù:®¾öMxØÖ-Á’ûûïwyƤ–×s’†Y¥ø£‡Pr“—¡&l»hÁ‰™èŸ)ÌI`ÜßKÿ~' f¼Â’ (¨% |ÏX±.@õÝÒ’KnR=KË;WΑGÃkØÎ©\ä´É!N>vƒ2••r ®ñÄj>,7ºKåJwb™ýmÆF'VP&ÉN-â#Á‚Â/á7²œSOøï ]¥wбå/¦h ñx’PZHj/`¯Þk-ÐGé„£|'RŽEôIJ }1± Ûôž¸7ÐïÑ¢36¼*hìH+q$l– ˜Wà •©ß5S´JYˆ‚_ù޼¹Ð‰ËÇÐg¼"D2-3‰‚6áÖï·~Î ``éµÚÔÝs™J,á˜øËÊeA~€|£ª¼ØÜóŠ:ñE˾Äs4b™Í 2dåøÿçBØ•}°€® 7eqÛ%Vƒó̰;HÀGá\™~jÆÎ.á{Š)¾·#Û*ù°XÛ ä ÈꩪÚoX²¼°¡•#þ[ª°Ÿ`i)ú±^*½¢K5¾ÔšI$?ŸœóÌ¢n(ä·ŸOÙsʵ:Ú% î,âO©3g½ö‘«_&ú=±L¬¸ÂÛ‰7)2r•:¢ì%hÐæÄËäxp£ûµ2’°§’ø„Œ±†î‹w+åHŽy80æ:Cò©(©`B²XñF*†`:E ìÅH›VW(.Ÿ(è~.Ò Ž’P°»%ÆŠ"×fÃ!F”ÝZy‹Óöúò¾^±¿ªkx®B1åÊÜœ ÞsØUåè_BoºäÆeð*nò¢3l¶~K:Þg†e6rð†·ôŽ~¡´uÖݤ“t*=¨š¸ý3ÿÏ·?ÎÝðùéb¾³/ç\{xS÷•îБÈ'Æ—é~Bõÿže t=`YÝ h¤jrÀ$Œ\¦Œû ƒ&`ȱ“Ú9¢;Ø)¬’°1ý -V¦R³ Å3cBGä6ÌøfâºcÂoQíPzÕǨ…Ž(0ËÁ0 EJ½òRÐ{¦ô±Æ&ê»äsØ$EeÂLØñ¦Èў̛Ÿµ¯(ñg/D¥É ¥@y‘3›Ð½»Çt6ÆÊ–ùô69Ÿžr~Õ°† å‚P„ÑPø¦wV\¬…ÝSZàÊä3F šÌ/:Ǥà\ókîtº mC›àí‰fD¤m‡Œ1²ó ¥`ø…6ˆ:à®â—ÜJs¡©ÐÒÒ™1ê6öeÈ™Š …¥ÂcÑ¨ŠøDW¯r%¹j@0óú2û!9ÕVwàfESG …Xšcÿ¹¢'®£’^O%ç¿é¦¥ž›-ÔKðVw"ÀlŒ`6þ¬å Ë-Å(R”.gJir(Ä3ç¶ÑRÁâ+‡“ã¼8-ä·ò•MLƒ!ç_ €m-™‡O%†(‡§J€õ¦…ñZå¢ç…AƘœ!Œ9Æ;6š„\+¢Z‘îp£RûE_âé<Ÿ×°L¥P‹ÚÔ¡¶ä‰Þ‡'I<Ø ŠY/a*ÎéÓ&”MgÜPï)O-ⵑ²ÞÄjðÌb@§€¨ =àwhfaÞÀGXÂê§O⇮’é'ˆ¨D%ˆæãi…4Ã7Ê=U Öe\3ÄâiV¯ýÄ)96ÐŽ>/ŽÈÌ1²bûAxˉ»è@V¸J^OágD×`Ʀ؉¶ßopÀ>¤Ç”öÀ~g5·¢”Š Àq éüÚ¨ŒóÁN`î(ÇëÔD4‡D ÉP´Œùˆâ)yb˰j¦T==–a`mÀÊLÆN ›Sf5€Ô]˜ é~ÃÏsª`ÁQ,‡•D­‰HL÷³ÕÄ~,È€`|ŒÀix™a<¾ŽaR­÷×ÞCÀ÷Á%u‰¬ÆÇ_„]ÇD?ÅNmAG?ûäž~y=ô.yA7÷KË9ç#‡M øé}o C~íªƒh¢bú~Ò‚vá8 xÃÅ›#£„ê5ë}rCÃ,Oü‘&áÈ"N¡¢„óxkv äŠZ9ßn$gÂü;m¯§â§š$\íU´Xr–€³Ö¨‹#JDªÅv‚Ô4€Ef’ƒ ‚J-yS‡†¼'˜xŽ"«5ßÞ¼uAýƘ€Ñ{ÒÆ2q)ÏÑd ôÆzóc ÔÓPZA™0Ú±läPñå¡ìUÄPŒD˜cZ+ŒVÔŠµl+pçZïPJŸ0þؼ‹Ñ½ò·w!šÊ¹|ÐÅï†@^ÈæL(söHÑl4Ò˜1ØP@…€˜oÒHyqÁ™o±m™ ÞÔ”HÏ;Þ>ä¦Gwj®a³è©Èj<Áð€œÓ2UFJ¸"S|aÁ$ }‰©¡ŠÅ(±¯½’VÕ± ­H°¢1¥{ÏÛ™ŽÃw&cäîFÁÇ™…oÐ à9†°Ï ?~{KIžr7U<ÑÉ?Ò〉½^n SJ±Î™#T¿há•ÉâS»© þ H{Wb¡Æv¨­ÅgU6^Шv“fî•HpÔ Že06íØ`¦861ÂÈ#õÓ )¦ˆBm“ƒ¨˜\°OšíÉŸox¥1Âz¤J—¨t·ï5H§.25™šv:@ÉÎÄØšÊx aÕ4ëfÖ½3×ò*•þ›×6«-ÿÍ4YñžkÍî[Õ댼Á†m5Ã7ÌwÔl ÞêÍFÕë‘™ü|îûoõnÖê=±Þîýîsï­íõßÚ>¾èx£·îóÝ?zýnÃǼ |ZŠ·ÁsjNß0ëÏÛzïZŽ×p“‘‡oÈPþ¨Å\ #RÔboä4e%Ž×§ ¾XÒ9s“Ÿ£KìIÒ«v[o~»â×ÞîûoÍvã}NàhÑP¼7 ”^ÛŽâõsþ.fßþù¯m’_’͆Söċ¤3†§!ÞÆ&›Îü~ûôÏãX!éx>ušgs ·ÁpÚòm¨ubó]¦M——KUõîuKO ?³bÞâg ª]7)üøDˆ?Ý»7¼l’î} l¦Òv“?’Ñoä½ùÕ¶gsߨÁ1_~^¢¢[ÛÅóâÛ·ñqT*MÜWRþ6íXŸEdÚöskØìµ|÷wùë÷/0žÏI~ÿźi°d‡¿ª7ýVmà¹Nð„Ê€®4DÏE®!~bläümF½ãUUè§^šÉ†«~öEõþ—ß,h_U„× Ü„zÒ@hâÑ{ÁÕèÇ#S4çoS*•¬;ª®õFvÁ›$`Q©5—Ãc)uŒEC<(øCöJ¿ù,Ñ{\7úâžk,{ª¤ F¥ì÷›p_@9 ‡[kŽ>Ó­Ž˜~Ü™Y†a=L|ÛzÌÚzÖ™CxDJѨ¯‡²G”ÉŘoÑž…ƒâ–ŸíÓC¢ŸhÔæPÑy©v.s¦-p*dÉ”ËOiB÷½^X øû fž­…f®æ+c…«õò…S°þS4“hu;¾ð1¾73¹LKAÙÇŒ2úöæŒY9«âq6TÆcØb‹¸Í+W®æx¦6†—T[)^Þ^öþ¯,ðÈ\`jÏ\â-ñûM„A””#)‹ Õˆå8ØÊ ›˜&gË¡©Í+¿‘1fVø{Sm„€'Ï9ž;f‡!m(œ‘ð¼W„’8‘µ‘t.îq®š b³öM—¿ Q˜5*Chþï ¡ÖmyfOË{N—¡W)dØbUŠfë(VäßÿÄc#T½ºÄK‰èm(ËËGJµŸ ` J=2ü r¨;ÏPv¥tá{M>,„ü48j{—ùPû=½˜/S=YFú Øþº!TþW­…!ýº„¦Ç'€æ¢O0¼V󫩇y@'m4º2ô˜í…“¢ߢܩÏŒ„ÞõÚ‰•jìtn'„“Cˆ˜¶ùàå»¶¿¨jRã"Q¯A>ôGÓry¬ù 02ÅkÐ]_ð¾¬wfh: &«bòŽ>šÆèƒiHLJ‘~8ƒœ­b°#óèÃ&*NÂK xáŒ'ÜáFh¡!ýóFyß8!Zªx A¢e¶BÕÈ‘™É=H7á†ãàè˳! •”ºj÷(¬ktÃbñD‹Q;å évb£E1Œ°î5¨rußrŸ·7•T]44ó&·Ñš¸ùŸØoo·Ì×ÚÍÆ0¯¹ 4X<¾3`3Kãü[æ‹e“ ž:ãתcºV•WQòç`QU>€|U'°3£ü”´m*Mˆ¯D-Q ¶0”#™æ9DÀ_‚+Vf}}bÇQ¥ÑðG3çdÂ]4v5Êæ >D½“ÃÒraJ‰3EѨa Á`P&’ûzï¦Ç·Ebäè/piŒ2u4¯ F¿eT¼ åhò4ðo¢"ȺdÞº˜ü›nÚ¬AäFXó^Ç è ¯›,mEðª™n|g˜ çùîµµ®Ì/èHº¨á‹M§²ëTv¤B›lE§²99*›¤}ÅkâH*€-ÄFŸ>ͧOr³¦{Ë@]qð·>„€WT„\ŽSÌ„©‹qj>n²²/f¸Ž›pkK‡¯}èe£²'@1µöæ–°ÐÅw ¨çV8€Z/=kde›RapTðÁÁJjÀBÈïµ.Tqùʶ´ÃÛƒÊ3|«Ôt0P)ªÌØ~D~FÃ*.ì QßÔÅêE]ôR¹óŒRRH“{le¯¥«:Ö°oi‘ç.ÓÑÚÀ§;õ¡á…Õ°.ê4óÁ¢9<Ô‘`òJJ)ýÅÞ” —˜r’|¥h‹¬}Á 2Xàå@7D¹u%6ŒÁÈüd^9‘–Ʋ7Þu†²È°wP†¬Š²XÚpæM-m§ºO™»—HÜ{fl6Õ `34pp(ŽLÁUpñÕã3“xZäìF‰Ø0kÚШ¼Ï˜‹k ]Û-É zœê‘ãG’i”fÍã cžPªÕÊ4&̨ТGËþg%¬<ÆY\ôÒ µŸ œŠtyyá§Wñà n©@¼z‘U%xS0h ¨…f8MZPzƒ|A_¹> ð6$TÄyC|¶ 0k†Š¢t6Çî{¦Ä¼®î’À_ cÅ ú[¨0PÜŒ.ˆá#Ä]lŠîÑ·‚/~Ƽ~EéÛ 4X&òÓÊyfçÈJ óÀna>G›úE› 6x«v; 3QÆw ^ðn)jÄú:ÕnHaå×ó²˜Ü‹xaÑןó¦{·Íy·;Õ×Açr½¨È˜ 0·?—Wþ}D­5º£©‹5ÏV6OsF¾µ_i@.‘¬Å14/è_YfqiýÞ2‹ïÅ6¤¥ þ=/¯jðXh~LR×è¦2ÐU8³€KkoXTåœEêC$ ¸7&lÈ#AQÓt=Ä'¦&Ì…tÁªÓ¥¶(‘7qw¡b£ Q›F@k¦! PôbRþlË‹›P±lðáѯfÙ‘‘+u!“Ú¤Ù]ãǾÈÛÍY’™é*Ú¯CÙª`µñá\ƒHÃY›'·ê•j@Lc–) kE»l,#ýÁ•ɯ 0n&ñ›9Š=©‘Þõ1g]"L½È8;ˆ_ hJ‚œéN Ý‘Ê&1¤#œOå%†ÉçØ¾×Lid| ûU-] Jüb“1²š¥º„7º!ñ;Ú2øWW©Þ^>R½!Þ÷&·•¯ Òh—¾о¡%/·<Ÿ$+“ 4wVy¤BËÜ+ãC?黬üÈ(3®íx\èW¿Ê™©¬²—;ëÎÆjñˆÔ~%~’:8-”}ܸ¤Ô5zš§Á—%îìå×Zaf…£¤˜(õn~Ccr9Ò¢ór6Ž”ñôRÉ<g¢½y÷®:ÞÚ2[ÙûÊXÔÞèкß-¨.¡™'¤ G€Ó×@„4Ú ©ä> yƒ8_Ö.ÐGQK#Ya{.þ,hŠ\ö„gË~Î&`Ú¡ êÀ¬RRÖöâx””w¥ä¨oöCa¿=úRåPDœ­´Å²qðsG¥1ß®ä÷lœ}óð‹1Öb%APÕ1oŸNF¹]K"óORšÐ8 z~µéµX "Õ;,jÁöˆÁ- BŠô ñÀYJC ¿q<·ZéÜ…Âé”ûV ŸwJ‡dˆÝ3ÑÍ{ââ»QÍ|81èWqŽÞƒ7‰¾>÷[y.s¼Á´SeTÕ:ªy {3µV·âµvFÀmE…I«@Œh¾™1óxÇŽ•üã·ÔI¼ä… bÞ;]h²IŽnÒkõî=ÌhecøE4Ž{v“]@ÀÍ!HLTl'7½-ƿ߽ýÙPøÄª›ü3ŽY»ÐEsboü†wQ˜tJè¼yû#»³]ú›øQóÉtÐ[u_{—DÔÊ Û‚-°œQsЬ4[Ðm^†þÇÈÿ0Y(¨´ºÕGLÕqo­C¿>^à “–£AZÊλ=(Úì‡Ý6”}w¼’ã]³—fu`&4å \p7€*‹ÑÜíd`/åU«þ@úû!ÇmšY°q±ak‹6\p¶Ñ´1xŸ¯à˜D:ú™=Ó,Ö¡œ¸ç_Åä_Fô±n¿Î|Ãw,µD}+øe)·6¬´•÷ÍP6cZB|BјaÇDÓ02x«u"ÆÁs¸¼òqáù¹ìê¾öÜÕ+wûZáD;nÖºcñû…b ŠßÝn;/7 §ýnænÕ[]ohå5­Ð`°‹e–üeÁ‘±óÃÌ¡‡|x3¶i?؈À°w)ë Y°†bÍ„—ÄÔWo~z!$Þö[„AI2rå&LÈýC Í:(9+,AW8Â¥ÛlÜlžä¥·©Ü¼’Bv¢$˜šmò;ßv£1D¯Àm¦í?bð+sgÇàœx¢:d‰ÛRü aˆm¾Õ‡ali¬Ë§OÍÁ±wL}hJåP%jš!ƒèŒ$„ÞDÈ;°x@aý¡Åaaer€Y(£mcêUœ6¤!‚u+Ûò2ºˆqV´¼%Ÿ>Y Õ¯´Õà¶¹¢ØhXIV6nÆßT!Ó@u d¹@WTÚ¦NHüÔöB®£öq‚û8)H[†"éLÀ.éµ9P<Ô©Ó ¦Œ:ðÆØœÀX­ÀwUø]xÆâáŒuÛ·ã0&xÕb䈺,¦äg¢?ߌÑÀ÷\!«ŒÚôïŒÝlªÏý­r™×Fj/o­{€‡àÈï‡-N‚ÅõïÜzã RjG^dédÒ­×–®°Ù%=PxOú¬(ÚŠË„…Þª£_ݾ¸ZÕÀö…"˜XVôZ ìApwõ£&ÜÛ'_ô˜å“ ÍN˜‘0% +õ‘eáUiÁ9¼gB 4Ï}$òeܠг°©"¾D{ædQm.lkŸø-m'Ó©”³€R½°¬ðÒ2Eù˜M%òc[ëœXÞ&" ¿ß$©lÃ"f#*'iÄüt‡†ýy Ƕ¨B°Åqz–?- ¡©…›¦eùB ã Ëv40̈zhD‰µÙ“nñB§ˆ˜Mö¨ÐßLõìzÊ7fÃìïqÇc¹JEÄXS:c/Æ'í@/ÖXF¢¦$2žOØ‘…%à@x€.)D7„ªõDù¨‘2¾$úÏtG  p=q/¶àUxT8í»|‡ŠLf¹ùâ#Çê·­< ãí-Å ÛI¢×œø-ÑÔ§ÅzÕÒ˜3ì=»ÀaÂÖ|w½ÒÛH JÐëñœBQ IÚ†I‹òê‘Yabõê^'ï¥i‡ µGlQÔýE…¦ ]’n£@;„7tŸ;ÏíMÑ㼆ê3D©ˆVl¦à™Ï3¢Ãblá÷•‘ñ!SÑ÷ú£_Ä,Z‹¿ ֹȄ–î»\MqÄŠŸS€Ú‹*;{Q‘„JlŠôž‹¶ôÔÍ/Í{SZ¸$µÔòí |4Ïyi爭‘‰™i‰ô'Ús‚¥â·³d¢¨$Y» Yî—8æÔ§O”Ö 9ôTjŸº9¡¯€/¢’,6A0 ÏsŒVT&ho§ÛÁÐ …ÐHÊoùF 0¥Á\4]²RÄY>ºÉÿȤп±çbô»ß’Ne?û?:¨‘xr“ÿL`è'o•˜è<ù1¼Ã”?ú?:èÌØßø-Ù†6¾sp©j·Õí£§Oÿ›¥üšê¡Ç¤×l½ñ`ÞÚ]Ì7Î2ћ̶öÖ÷: ÿmà{ýêýÛÐoQþ.öÙ|î·Þƾÿh£~Ä;â^½J÷yøæõzø¿ñÁ°Û÷ DìGœôömùo}ðH¨•Ç™}ãövÎßöwŠÛЪƒŠ˜Éɤ­ÿØ€J+nò3k›~Tnÿü|GÙß7–>ÿHréû3ÛEÉFÓ·B9ÈP't-£Ci¥z Owö_îퟟîþH:_YÑ3þû‘À˜ÅyJ—ŽŽ—°èÉæï(Õižònؘ¹µõNŽIÍñ<Zœ>þãí8Ç»to­?’Ö] þXwd7í`Ý¢ˆÓBVôð¡pþÒÕÃ+×N #Öá§ÙÀýÊ‚4l…MY2æ¯kiÞµWeSò—0^óÁç­?‹¶Î. ßæ{2tKݘ(KÄEâÚ’þðŸA‰#AÀQ¾Ç4³IE­Y‰ oD–LS„# Z“áhÞ¤©Ý°D^àÂQ]oÝEÉ>Q¿ì¾"Ó¸´áFÊ&ÉG(’oR&Q©æ¤0Mdÿö†-¶‹ r$ÑM’0½ä¸D"â,i Šò<[Ÿ: ÏSÔÎlÙr¶àc\„¨•­_¯nÍ]Mâ÷8RLo¹Â4M{b‹T'áIo !œQ1d'ªÔjè(§o$ÊßÒV´-¥LÁ#‹ç²6¹ì‡Ù$QoyÃ2JÐzjr¹t¦À­d…­Ýaðž(Y¡Â¡~WHÿ,¶Kƒ%¡nd%E©0}añlšRÈKøŒ—tUUQš¢¸N!-©æ8¥òyvÆ™«°Ó*#s.a'C…lác0æX~ÌVȦ„ÁoRJœ: Ð%‡}™wàËE€Ë4õ9œó%y1ìIHnòÄ ›»5DÛlÔkÙx¬Ó“ò¹5óbËý‚q_0v°›<È@Á=ZmXôŒÆ0'ÞGh›±EÇo[ØvÙô>è”?LïÌt[#¿ÅÉmØÑñ5ƒóþvgFÖ(dPîoT¢ûGnÛ´»BBµñrï¶-ï_ 6\.:·5lݱù“áÁ1®Ù Üåšh¨ŠÒ?Oû–ŠÞóƒ\ìšÄ÷â.pC¯c¼~ ‹‚0ê uèvaXfÆzì,J—Æoo"¬r¸$C0¾kåt5kCƨµ(`ÊmUƒ„£(XgçG Âá¡z‚¨ ‡Ô–ˆ8xTá_‡,`QtQÁKŽ…lÆL·ó +Wfã9zaÁ¢sìÃ0¿º=ú±% ™v0$¿¦‹þÆ2æœþ…6ŠˆÒ 6Xß"V˜‘ümZIÔÂLÐ u¤h3Ü ÇrQ:@_Le°"Ræ“‘ ’þC횈8Ÿì‘#:è©3à¹âÙVg¾2™…ÁhËĘ…ÄqV`É}çÙu­=s ô |rl~eÕâ©Ô±hï ¼ã±ç^XéÈÑÝ(„î­Ñˆ$sã匿¼¾AÎvô yB€Àò5‡Èfç½#>ŒÎíðÝ(ßÑB—±·Q"™iCƒMNâãñ8䱇výNNÙÍvq±ébžÚâ«Yþ ûÐÂ@&íV¨±vˉ5ÃQ1y1²uãf Áp@øspÍ6°D4¢™D C÷.µ bÔ;ö“ä~¨‹$7H$)2aø] "", ¯åˆtJ`Q#¿Ï)~­?h,V¾RI”‰f;4͈„ "ò„>Â’(Ç¥ÅÐçÌÑx“ü«ˆRÉ áÎrüSÚòSà¿E®(òuXv"Ó¥N(ësQÞP}Mæ-Ó"Äer¬˜PŽô`⡵çVÊè°|eY]b `®C¯S¥~1ø)¥ÇdCŠÐœØöë~¿´Õ©Ãó–×jU¼êã juá»HÛowûS‹Ì¤¡chmø<Ø¢0‡8" ßû(îTNèßo„k‰g,9lÇ øç«S9páÐzµ)àQ ÿ)TßùOÏpHöCIÝ1Kî…àr‹ŠK:éO1}Õ ^¹Ð¿0×óBe_Æ-7H5&iµÎ8qoƒEdíû3•o"°bG¨¤Qj±‰mÀï$[Nf&°ƒ"ò¶ïzÛâÎó©k§·þ¼»-È0™;2ɦ74Ó ²Þå3¡ôgNNC¿Yó@.' ò#¥µƒ k‹÷®o® Hí}3@ EG³¨œùK¼Ò=LPê-*»Àˆš‘/f3Íœd7Š¡õ/8ű0Èâ•×𘡆c#wL¦Ö}bÁ¬rè*ß(/ÞŽ$pq+ß¿¤6–ó©‚Ì¢¼ìT²œ:ÞWR•‡(…èÝÎRœîëû7“»ß?gS¨©ûŽwå©eàv¢Y?êÖšõ¦0£P鉹½Z‡Þ`—u-ÚK2„”E"j?ËS™wÙz ñ­?ù› [ÿ¨Á¼0^r[ö…°¤›¦ëæewæ{j 2Ô RËàkBs}JR U²n%-ï¦ñášoò0ÁÎw®/jÒ >c–€ï.ªú`J|üa? êñ³ka²_ÌLrÍeZAfùvò.®”¡^¦xïÒŽª  jP,Fº9Ð zÀx "m¹öðª¬ÑÀEE‰ýŸoX‚÷ÑŸø1@[Ô$¬ÔùFe9Ï £%¥oöyg¿×²äò,Ñ×\ŠÆã‘‡ÞlÃŒ/‘Q¤”=”¨»ÛnâüMKÇãD(Ai‹hѱ î5[X …%ìÕjcA\‰%×PÒç ë–}¯q;6YÞÒX ø÷n¦xžó[Õøö3¼GU% Òúi/Àyr耿 éÁ¼] ̸*OŽþXuŠYÉ$&IÙ”®¼é ÊH«c¿£Qb3“Dµßþ§Û6EéÛKRÆã éà ¡¯0D éd ¶ä(«!F—£¯áVÇ;˜Œ„map¯Àó… 9}á*o1°Mx³ ‘]»â~î-§RKi÷ìP¿mÜãËÞ‘¦˜/Hè‘I^th÷©q²S·‚–E¸¹=²A–4ärŒ^m¾»¯£…–JCrdeÀˆ!ô(’d^ª]áƒà!'g‰eaŽv#ÒSfwIu@³»š˜;ÑõèBPhþ®2[Š=~v“Ñ®ýc#úéí7ûíÇÆd³`(Q‰ òMUhYAÜ“ŠÂ…` XeÀÍÞÀßÔ()ìIGÛ³4ô¿M¼ØÌ/nÊÏ•åA()Si Z˜vÉ'âkaú)9vhëÙ…ÿô)(#qFåo'ÏX¤zko„K¢Ä›EdOQá|MBFqᲈ8rA¨áÌ¿e,1Ec¤âS`ôìH €(ÁÀfì¯mÔÔ<"€°}ÜÐDG¥ÖÒå6ê˜xŒJ2}øR @×L4áÚ¡cIȰBÂk½éÀ`ù aHÁ8æï¾+lEAh˜`Î@ïâr‰ïîôL‚cH¶Ðcoét‡}Tú©cDt¥†!¾€¬»r‘S€/Ž“ºªá ù°«©1®^Þ)Çð‹Ê'ñà¥_͈޴ß‚šÉÐ ]’ˆF %±áèçÆÔ η¼( é¦}%²Rh'z`I‡ß |OZ 6{ðE÷¢¶êSÉ0 ú”,ÎØlWš@Ã+ã0èÀ;޶øZD›·zKð:0b‘Å7oÖ%ï7a2$-:Ã?|dÇ ~½u:Û!-ÿtÃïf>úgb1Jü~¢ÛA; ÂÑ!ñ õy>|ÜièÚ€·~¡¼U¤÷ö–ÄüÚ›”(åÑÖ*Ù냞ȋW¸"øaNÝoð>—"2€l’I¥¥ÊFªU»Éûa7øð5†¼â•cŒ¦œ4'Mç0 @õ+‰"qÞ×,-m, |‹\±ýz ¬¼hA8Àb Éc-Ëa”ý¿Ä1ÀDÐÁõÑáþpØ ƒ¨WGè|ü°ðcctQ먉PÛ­©ÕóóSËl.$4NîûNQZ§r¬l¾­þô ç° šå½C-ç·n^¥lkWºá\ZÂÔ¢€.8í¢5nï·ú~ 6¼ ‹Å~b([ÚÑùA¢j–„A©*Hÿãà4‡/µ Ü€òò¨ì"OÊ¢Ñ;'rSsAØ¥A 8%n.ñ €†’19úw{¨'ÔãøDkÅiu‚ŠÂ7ÍJÍÉŠ€uÐ-Ëc2*-“^Œ†€Ó;W+Ã癈w'„+ G–ßòÈC…ÚG¬‘5ÖÕ›·Öu\«_‹S4-’a•»– ÝÖLq 7ióú296q"¶ Ø û=£ª˜ýÁ7T§>óToœ-2‚}üDQÝ•–Œ%ȺV`ž(:pBÛšËu—ÙEäPÏábÍ#0dŒ»=¬³©ÜñÑE”%Ì!iM/aÓØšÐÝI±C°ñ­ I9ÅÄ«hT¾—(bÚ¾Kí*Sè>lõ~˜èPŒI»rÕ ~q²â¢i=Gº³í` X(—þ€læd@œ]\p… –BçÁ]l†Î/§–±l…ÄL&Kµ2ðfÄcÞL²ucÒÍí i¿D%b÷JFtaKâ¨,Ú:عhl'›ŠÂÏUÓF+oÂü›öŒ¶ E®wvz4[L@ÈŠj¤Ñš¾‘Y÷šÓv¼M¶-v–ÿ6¸ïŽÑ¤ÞGvïœLÈc?âw®½½ýQ‹‘%¹½õâ/ÿq÷ÛÎgoß½ÕÜKÙó‚ÿù·pÿW®üN<¨Ø·Â-G~% èqê#ñN<Ɉ·ÊÅþîÎñ–Í\Ð87“«)J¨±ÀìŒîêN¬œü¡ÓlÃrG½p=ÐådmGµÒ9ŽæSÁŽÐ-†âêk÷%›ÄNfl`k¸qÇTyc ´jÊ›|CÇ¢ÏÅ©àj¨p˜w ÑXÜ3‘ÒÈZ’B­‘þÃÖüëÓƒÂØYúÂ3xoòhY E>spíð/î+~¾h_€8 v–-áqæ×Ÿ—bI®©ÀÏøý buì¢MiÊ€õ£;9 ó9€ê>¼ 1ZÈÓ9âߎ(2=a•½¼¯â&Ÿ]¥ÛÅ<,„²ù…eÞ‘ a/zý‰¹º´·E•Ó¢Ð÷*º¤OYs…Énsµò"Љ-C´-ßàSg ¸‹šaðu(áÁ1œŒ•vÜ0Hª1<ïš©7¤×¢|R¶T"ø†¤ìŽ**òÛ¨a¨$˜RÝ-c zmÚë1ܪݩ`l#¿Uårgv0Ò¿àÔIý0ÝWfÎ-‰w»Ë—¬kúGB†Áˆ–ÏÚ­6À1fÙÙ˜D,<½Ì•üÕK‹ã`ì­¯6‹öÒÖÙrjŸX©=²ß+*;réj·¸é1©·•–}ÓŒ8±m« Ä ¾pYø³}§.òéi†ŒÅ‹Še\Õìâ±]Ô;7µ{›¾+¨oñYêø?øhG†§Úñ@û`=B%Xœ|zT9£²p&Ùrø°Õ¨€€‘O)Ð|î¨ý¢Ý³îì+GýÀ†˜æ£’9p«å9#ó^ouÇî-;p8Qè,(»^Tx#V´*Ãû˜¤‹½ìiãçC'mMÃëŸ?ÚDÏüc8 ƒCoŠno“c€ÖÀ0!œiúøè‚«qH¡×dI˜û,˜­+,ÍBy@‰ ODÒò« ³M‹äm -î®pœä‚E ­|†A´ë¢l£R2Ñ_>%ìpšnÄ¡KþjC|ÅOh†w ŠÅ…§Ý»@”Øw½saå´KÞ\höÜ×oGoÏp×ÝÇH:…Ê!ȘIw³}·a¡wÜDÒCr!ž;Ã.ÿ¼^Ûpñooi;V9¤^£â9)»·ÿÀË—ÐG•-¬ÏþÐþåß8ý¸kmÄÓù4|»-oͨ±°³Q‰CíÅ®C7Šj £ÿ7À–þÅóôD$ZeÔ-÷Â$Ùˆklx…Ùseó=œ Y“j ,­u… y­úÄrnï~!;Ê„l8B!Z@ôzÎ¥!.!¡ð¹Ãô€œ ËDd“ÜwɯŠÃÚ!šD—‘ê8‘Îဠw\¨0.Kû:Ž&«Ý›ò%&†J ¤ø%xVNn°€‰òþŒ£ø¶©Òæ°ß¡bI°Õíô¡Ùòüw"º­ò³,T&ñxAåôÕã„¥HF‰â×RÈž@\ãÑ,9<oä“ 'ö‡C±E Eä•Ó¶¸ÅC… ›3Ô|Þ5ùí˜wù÷°çš9Œ7–Ez´{ËòbNÏ <„/àÍ¡V”2ò)hñÖ½}îQp‚· Óí+?BE ƒ1Ñ’‘5Ÿ¬™ŒÝŸÕüíD¸´íPñE/ðÿ²ðœù\åƒWÈÚ•:A8n‰Y¾“ç¡ö‚Z“¼ 5¼ þJæxÅ¿-’ZØYH¡Òý”ˆË ÅMÒ²yÏå•F!77¶ÑD˜d¡ ›•LØ%ÄËÚsŸ.nЫŠY¼ª?Æ=ÁG˜ó ø×ÐSñzŸO0:ÂF*¯â„«—Aȳ 4ü¤s ÐÔÑ¡Pý¾ jQ*xY®Bt6Uêtñ}´|F<8ŠÝ¢Àébq ÁO=œÎ‚,Wø!_<´j!¶Jô0wðdy€f¦K:/-±'µ3›÷Xr^‘Kñúah0üÖüXeô‡XŪF£hyFQöú}Z²“;–J䀎0ê’ÃX?g¶>1}×HwÍì¥äúåñ‰t‰#ø׋ä Vªßl¸üuÎa¡Æ°Kj¯Ï½š!øi5E€ýžÙ+[@½‹ô‚?µgQ¨x«uG9¹T-³õ+±hظք´Ë>×ø–··Pö‘ cóþ³Z™º bmfXG!GŽ-èÌÈàKxÒ9† …âÓˆÉqnÈÀ˜â¥.[ 2AǸ ¸[¯OÔÁõ–¡M b§;5¼6—«í•ñFœ‡Ú¨b8U).}î4‡dÔ¢žB a°_¨K¤•ÀÞ§-$ëÅÊHœn@¨/î0ÕRb‰¢¦¡{w_}ŒèÅæx8>.ˆ&¢1Ÿ·BØš}XÉñye„b¥jŠ®FçKDqQJÄ,Ö,š§–:C¿·Ú•1ÔC{ tÜç2CêšÐ@5pg¡‘hÀc¬žIB)_hÀAÏAžyþîqç‘Á…(É]›eñ¯¶|]£¿&,¡O²P§é|Ê ƒÝ',aÝaU„çùKKõwÖ{çµxgRÄäû:“?UAÈ(×EÛ§ÌáÆçú–i EŸ¬yDÒü´’@ÆÌƒ+BR8¹ ÏgZœOBÄœqþB[Bš¬n¼¹ ¾4vX¤ )Þ)S1ip!‚hð7¦´M܇”ÿ÷ =^õ½éÊr—2\ÃÿnŒà˜[ÔADn»µdÓ(ß¹Z_è0“Iléó:¾Øô;ª¿À¬Tz†±èâ5P±ë8Áј¡sá„D — ER»5”/jÌf¥J±2òÒh¬±4¸¼ˆöØêÿ%ÐwòÂ*Y]+uêÍ…ÑT$­ QÑ6‰›€VЀ©²™Ôš à­"4Z·?ƒ®»hÐžŽ”“v´íE”'J׆fÿ!{·g„²»(‰ŸóŠX7ŒaI*äa¤ityàV–÷œ˜Âm‚À·?cÂ÷øÌ’Þ«0ö!ÈÇ•Øf$,$ö$`DöñçÓÙš@¸®*j¤„]†™C΃Ü´b%•Af0Ì£]‹äyòË©”@JJ²1­-n%YSjmÌ'ÂdÐМMUÀÿàu®Æ ù:ÿ„lôü;ÊŽ7â‰Üp d6ɨ0›Q(äÍ£ ó‘(#8âBϱÀ³#‡˜â¶7Áp7cšm m›`@¶Ôù‹‘å$”/ Ë&ó*H€2hŽÖ‚™ÉÔÝšÝÎD|/}ãl=Ì x£¦!på¼D“˜ÄŸ9ïF}Î9â ‹à6KFéÉI +óð m¬·ÌÊÚ“²f½ïµ} ¶– Ÿ›ìÏ…GÚ#üÁ›ä¦ff¢Lh“ŽL³*­™ Û¯m7Š…l–qÕìԺ㷷 D†µ•}B¡÷›pÖ1>(âB}Èhw«\NoQ‰µa}^‚/P¡˜ _8¥õ™>ã:bâœ6æròeä¶C“Æk˜6-ù|Rª±¼5é·†fÞ˜øŒ6󿉧g.ÝäŸC nòEíížoík|ï¾áP±Wã±lvŸ;x­¾ÕjÂðÎP1€ôiÞ`" ¡v*Jêò®S”øH˜K¼¯?$œÁm¡Ñ :ʧ’#3ø.q„¯PäWÕ.a/y¿<–³ú¨$:ÃRÑÞ¥’µÉ&~¼p-#¸]û•¯¯öçz¢ã1gëÂ}“’tAlǦVän¼"š®l&àƒQRó”¾±>œåéMŠ S"~ÕvÄçuÛõ¾¢¯@ÀiÌçÝù¯hO)Љ/+ -…Vƒ):úûz ÿ†G7R«t'xZz²Úï¶Z²õD*_náú—ZP )$­D¬2Š“Ó+V#Vy‰Wv¤…-ÙžX®‰ °`ó l·SZ/9"ÚýiðŒ[)ãˆp‚1ÍœÕäxÇZ”?¤w•zsŒžHMB¶¸â7%Æ—xßC®(”üo»PÙŽSXf ¶…ÊT+8a“yÇÜoÇŒyBõXh¢Æàk]pÜk5¦d Š„ÞªW»Ýþ9bé"P¿Õ|út)mi8<]k³•àˆ¸0 3KuqX‹*áU­™º Ó̘Ãà¹2ì{Õá@óDˆ<0³KŽK9B©ËµDDYëß:^Ë-V–ê0Ð÷[Z SÂKýJͪšÎ™»VÔvmö/€4ªX=LÆ`¾bð`S_óõ½µ')T02ÛÈlJ¾–‰½ØÀ`›Å副Ÿ¿‘z|*Kjë¹&âß—:›ªq”B„Möuë>Ü\}Tìô8À²>·±˜Ûˆ<„'„w{A¦ÆMWeO±ä>H?7s—EBŒ`·И ”_‰Rì©Qñ¤/ z P'*i µh€è]ѣʎ$-HMS‡?X{êÜbš;û Zn“Oãý«,wÙCðE :ÊlßR=ÊQ¹ÅÔŸ)ÚX_m_cvT lãÂeϦëëÊžL'BêᵇI± ÝÖ»=W”Æ1õ€1º?qUV—¹Ëò8 ¢Ë1Ž_o=£Än)gŽcØV¦°¼ÜÛì.¡[nª¬T!''A½Mê*N‚bø+xÃÒØn¼ÆÐ*ÞåòÐSÅÞ…ù<ŽÝ¯WÀ5ÇÒÑ!åŸ6;T*ÿ¥K´q9ò*ŸÅ{½/ú¢ ãÁUž‚ ö-Vš'? mJ Y@@ºÒ£ÿëKpIËvo<\[H\„Ý7‘·{÷@X,èââ:l€c µ¨Zù»ú8z›lß€áÆƒ†‘1ãElÕBLañãAù̸‰Êæ>1_ó'Œßý$x­¤&Õ E”ÔÜ ñ[FÓsJ"Ë«®gÛâë,¦w‹2U¾x¡äÒѱRI<|ÃØ0è ø›[)mœ’›x/D°\˜ðÚ5ý·h} °(jq¼´gsæ)X…ðQtL0e’,ý#òG„›ˆ\”"éÄZ"½eX¼ÕíM)uS$“J§Hñâ|ÿ䬜N†‘(SK&¹·ç&Q’RLØøéö³×Š ¿3ðkÌ1Þ‡%ò#G¥óH·Ù;=Œ\ŠÈ YoÀ/vÝ~#)^‹A‰÷°×Z‡º¾(ÁËä?‚Cç95ûÕK<7]ü‡¢µ¢)üNˆ˜ *à¥'™1|뼊×y‹Ãrý)ÆòË¿Ïóé5g³¸õµ|ZÜÚɯ9[ÅÓò_‡'[_ó™”³urtT„küëx;¿ž–?ÿ:ÜÙ=ןÏJ{ûP…‚ãó³“Ã|zÕÙÞ9Ü9ßÉ/¯8Û'WÇù唳dsðç|ç o9vÊÐãN>³êìŸíä³+N鸼svž_Î9ÔCvÕ9Ú9¾À†/ŽN‹Û··óéÔª|ÜÞÙ*¡»tJ•.KÛ;P’–%¢¿Ôš,8º8Õ9žŸÚ0„GKf1!eƒÖvéê¨Sæ¸uc˜¶“f‹þ%¶ùjH5ŒDÙ¬#è ñXÝï§fŽH¦P¦äC!!\_— f €ÍV:Cú€.Ñ7,í¸Ïv÷H^wÜÁ‹2 'ñpf˜ ¼·¥ÐœÛÌë“s–ãw~iXÏØânlÆžB>¸wÀûswÀ )Ô]Zq®¹ÎxŸKw}–&œG÷•D NPGx8xv8¥8çmÞ‰ìu$hßÏüJÿN+Ð[?DÛNËi:$ûŒÄu¨eè&Ôékk)Ûè$’áˆÌÚÖüè;™© ?“yÚ‚Ïñìt>ú\È+¡^µ &­™÷žtÖ¤Ütõü¨ÕÔ­o?€…»¨{çqQÓlª=+xï‰kM§¥»`4—2ªH}©É9ÍeLœº¸ M—ª«?¸ ¥\™Oåian1 –ík7¡vpYÝä ‹uB( Êâxõþí­ùN«K”¯LZD$i5Û[@ðÚý§»Ç¸ƒ¶&×.-ÕÑ߯ ùf§÷<| ¥B{«<Ãë¼±»ˆõò`oÀðd.˜¼…“zØöó¤XBþ#°Õ“Þyð =¯S¼Qÿ€üEBäŠî?š-Jø.œîе ¹±Eéô•‘†Æpcí[@›wÎ+%+ÑÐR]Ë?¼´äQ¨ Üè[ŒάÎÞ¸*Õ«Àê zàoˆúµ¡Wi2ÉÀì>ðT1?o(þ¤¡âÔ]aS¬œ@p¡1AÔ§OKuF¸óºACþ†vLÃŽzð>d-RkŽ`¨…º™SQ­]]$A~m7;;ZéTª‡”[<²’^à7ÌtF‹±lЍƒ$hª ×ì]SS©ÂBÊçZÃ" }¨å«‡¬7êöb_l»ºz­gÀ†ùWk°#u§áˆ“zObÜmý.0/q€ Þ}‚[¡ßúeÓ Ø´øZÇëÈ¥#zÒ…Š ŒP|õaƒ•CÄj‰N¨O×Ã' ™RŽíÞMî??H¸{á¹®l©onïï8ˆ%ýJß ù@uàÔIaàH› }yˆ7•9}_^Ëk¾ú{o¢?¥WòuÀd SÔÛ -‡½A™8^yÄ•AQØHáÓ-¹^„"…(`¼:VâK§ +Ъ¢‹¥Ô¤ZNCØe"› [ôE‹l€6‰Xæ¦ W¾-P‰T÷Ëç4x[œ4ÍsŠ£¯A,­Žú±¢þ$¨þ(¨éÜëEH´ uš6.¯Ãw r*³£BC3¯m¹¢$›ÿWVº$y !ÝKÅ© +4ÂìlSy„€ª«´ßcQâ{5Ü”s_ˆÞ»u8y6_Êx‚ÈŠ áODºÞ ÖÂhŒ{Tì­ ½UED»ð8(×,h¿ÝÅz‚E< bºuE.3L6}‡ýôìÀ\5ŠÙ™¡Ô•ïà ò„¸ÞOæÔÀ9RŒ'nùc‡>£ÄŠœÁU[X„d©Î¨Ë˜ª bIœ‡BÝ,K߀•ŠYq+V—Þ¬¾  V÷|V ˆ÷íƒÆ>jT»ÂTûGU¨À6ºø§é„€ÏµïK©”"jY{Âä‘;§Ê3NÀÔ$ÿqô¿i*¯+3Ùä+œmùÊ–k>Vfm FÈz^ÕÏ7^Gäüòuñ°ƒÅOœäçZKÌÕy{“nϸÕòƒü*† r—•>þ…=ÍQcãk¢}ºÉ¨›"ÐT Ž\S>cK×öÚ ÉÓ”AG­7ú€>°¦«é.5>}º—ú¹@‚6áAP§Åº~¬píù•Þ±M€çG=QR$Û‰¿Ðú_пp}è8P3Ç=½ J_RÓ_z:ÜA+º— ¥ÿ¶«e9]™=M ¼4ŽÑ•ÁƒÙrŠ öñ úâYŽ˜“ÅÃhþ0êoùá/4i£þEv·¨«\®}°>F Æ„ðKÒF¥m*^¢Â)èNQ±RÐ×Túëý¥²%p¹%ËÅ;sc[J¹í=‘^Dý¦´‡úÀQgvíZz½](ÄþÍ"1•9W.¹,J4·$¶î*~WÐ ¢ö/´‚*x”¥›žT;Õ,ùŽÐ›Þ…Ây@LdíÈs3N,Ú÷3¯ï)»Ä$g‚CÊB¤*|”ŒÀXº¸†¬ëdÔY§qn¸sšRɾ×ïf˜ò¸à#2n°Í_hõ%À8”ˆÍÑÞåužGƒôÊœöªø 9ø–J¹nƒ×¡cÀ¨ÄQÚ×`õ_ ¸­oXÀ®Ð¶YyKÛYëî_Ù[¨CãÔm3´k=ßÛmö–Ö¹Š+Mîßû˜Ä‰Œe“@… þ½ZB<œ!XØCÔ s$ù`‘4¼á翈ù¡”ZØ2ŠþÒ\'/¹fÃ; Ãû&sÍ( ³rp‰ê6¼Aö¬ ÿ€ià ‰ùp²J+eš6ÜÛȘžä<Z¢ 9N¾:ìSÖhS"h¼é~_:Beùÿ¥åš¨µí£Zg‡ßÿ]Ô‚1 .îa0'$Um!ÄàÒ&A·Ïš¡^f WЀmŒZÐ>UµœWEØ«˜H´•·ò¤NèÒÂB)Fói #-ošOäÓÇ¥¡ÁAÕÞ¥ºê‚ã#«)&Ü †'A•‚-š©Â ?þ¤ DÉ}Ž“^ä|(œšöIÌ’w([Ø& )¨Ñ¼¿ñeÁ'ÃR»íך€ÇÐ ÓkxÂz5ÄOj±Ð“M°R<ãZ«&0¦‹N&¼)ŸH®Yæ|ú¤•]üØ’›QíÑ,hq n´žß7«÷˜KÄ©¹’êh/ÁpFTñ¢*ÝøF%*Ëlv “·•f#R@fÞ“¯ï¡ÖÞÞ–´Ñny=˜§“0´?l†ÉK €|HrÉè„à» ­hͪ’± ñJ¿ÿNæ+?ÔõïÌw\•ІÅaƒo`øÆ®È¶hZó;èÎí*TT1Q‚I¡ÅAø± /Ùlî(É} ³ô¿tšþÞÇ3mÀGØœ€†_â^ \ÔƒâYÁ€ç_ù ¿Ó±©†¸Þ‘Þ¡ñésïãƒá!õžÛÃè»â=æuLOª3ÓÖc):gñ‡{_Üu QKð%Qˆé‘ëQ ƒ§.û^jÞž»˜~Äkï€xíWA|ŽrjÜ/ýÆüàóáy+sÁ¡‘ËÑ3_‰¢ÿ%Ð1>þ;Àóó½*ëôë×$·è.ZI‰’¥_û;ÇWpÉFï]‚)ƒ:sPa¬ªÐ¹+£PúáU wžÝ*ã5þk;?¯|#*ߨö3Ðd{š*€sÁð"óäB~E+n|¢ÚÐ[ø¢l$Ð^º¶p„¬õKƒ€UQ«^ÕY¿¾?h¾ ,c9Õ„d×zªékÚس*À®þ´-C‘Y²jÅŠ5/B¯:FhžaMùùó°»OAgèQ\)µÉ²J÷ÝúÝo %”sO:ïAÞòƒ\í½ßê¡`FonÄE') ᑯ2ùIÝ‚¦SøÀ¯à·0~J§0¢ÃM ›¾ôh‘1¸5)ãÂǃ…· U¥ÝÂ&^ÿÒWci)ú˜Ð lc­ŒWŽ’é¸Ã¼Þ»óÚ:vû8.Ŧ¼s2"ûK¬Ôc‚¼½=&h‘ñ‡Ø¶à¥1‰8—Zl$àí†S?´é" lÜÈ6 †å‚0Xh¶ɦbzÇ}¯­Fÿ\kŽ"U\PÇ‚Å8„Ý»êJ1áëÄ‚õås>ùò;ß9nSFë!+3‡¢*˜Uâ¨-/Êç+0(A <Ãó]°ùÍ¿ä»Í™Ò‹¥1ãcK;ÈFµðÛP›¥Á¯›^IÊkàxÅã ÁW÷Îr”c×O? ç/GK`ðÓ/Ø’L~Ãvd?ýH˜›)íí¢ªúiñ)Q«*—–‚¯êÝÎmïmçn1„*Á"‡JBÇBÄë Ñ_…å…Œ:º‹ÈóGt™h2N¬û³ñ8=€ªž‹›L;L[ý6ݱ7º&±Ìw êJÕvo•­“äf:A dSœOBÃIZ¹@ûùäŸþoZ1“<Û&߉ÜÖp.žâÚNï'˜ Õ's³Ì5Qmv—Ї\Œ=‘ÝÈ£ø‹x/l¤ µÃ<2?sÖ&ÌìØ…Î*é …1«Y*ÁW”—ZlÄ<¼m‰Y=áá™h~úÔ¼Mßmà?y<©"¦0‘‚§—‚¨2Çÿ+TÍõy‡_Žc+=ÚNÜ/˜ç£²iUZΪ0‹Ñ¯ßk³PÆ%ƒ_þ´ƒðòÊ:½7qfÊ%qƒüÞ½­¡'ŽÊënÝ µŠ¾EïÎýR9Ò“cËêf¡ãÐiñixVuž|[‡rŒ¸k¬[[;v,>}šÅ{À={Í3Ž7•Ólãvôÿ™¥Ô¦ð´§:5ï ¹Ÿ1µèåSw¿à»¯êòÈK> eU/RÁÝÕTG¾!ⵋ)Ñ?‰Å«”v¹%šÔª©W²ÑÙ;˜•®´ûG˜(ÔùõUÀèoÑ¥[õ6ÿñ#¿~çc4Cü´NÆ3â·ÛD)»þEšx-½ñýýç yz-~»÷øöñ³66ñZ|ý(•{£`ËÝ ϱõ—}±Ëäòæ ¬ð:O’\ENÔ£ƒª†é¬$Ž«Ì—œ`Wþ5ùèê9b¸ø;S“×°·^ÃÐIˆ@Mç¤ Gl;ú½ýª²9( B-á‡rܲº+Ëæà‡cýûh_6¶ðZTæ«bQAâ²E`p5eÌaü¬ÃŸa1ñ]øwW(ü¤Y‰Oîa=5N&XÏ–cbÁQJÖN@§ï.:¡Š—'-³3t½hKŒÝg$èõ >Ë@ß±º˜“¨ÏgA~ÀOŸU%AC=ˆ£Éˆ‡/ª‡Á\ò¬Êøé‹ªD¾šÀ Åýà Úפê6¾SÅmó9§™~xÑìØ;20æóLføà ažtÞã7y©ñ„Úd‡õ¦ªŒfüéÓ#Ž“ ª7g=œ{©Moðé“/^{ñТ´Ã/ÙwÜ%±d@»åáh:ôŒÝ}úDË6èœÈsɵ(!$WVc¤jò ´f‹ÍÂÆ!«‰€µþ%fZ(a5ÎTÚ(,¼©cf‘Ï¿Ü~¡.oÂîí½­ßÃggyàL¥sÆ-K+sÑI£œn(¾á+…¯´¨¥w€šeOââ„oÚÍ2y—n–ÊËòP1ßíßÌy,‰±L5“ëOá[Åì¶³E±¶”=àUK±¥ëòí^X@]Š.EI‹md´~{£2‚BË.àÂÖ.c„”(ùþFÀð›‰#\’¹£± i¢¡ÄˆPµô܇Yú=i]Û·ØpH™é4ðâ݉Ôo0ï2¸æI—³aã˜9Ûqƒð+J‚†õ1{Rø•ÉÇÓòz™¥—1É[ñ»šØýÏ-k Î"½ëœM ¯ i –íÃ69¢ J\¢†ºynª›gsn2׋”fæ/æ4GQ}K¤š’‘'ÿª‡у–è«4Obuhc¬3jõ †Áª5ܹ& …èŸ wL«ØdjXÐ/€?Žývþ“úÅi]õ%ÈÓÇÄ™ƒ÷–J—ZIʺ9xo¡#† žÔ¯%Þ‰´ç•|CÏFÍÞa,ˆÁø?¡³ñ;uþæÌ:ÿ+3ëüÍ™ýRgïÌLp$ڇ►ˆ«h±¡ê¨ëTJ±;4]r¥¾L*é·5]SqZò¯3ç¹9ï øºÐÄ2Tèø‹ì/…u¥Îò›ˆJ")¥t`žo'|ò …‹U»C+§”)óñJ©n°¸vB70´Ó_Ëy˜w~š/­¼Ÿ³AtPÅ I³VAȼ²~˜oÁ|¢h²ðn4Žc’ZQ7·ñ¨îYÒ)¥ýÓÞJn€^æÓ^†D;¯•oF1Ï”#0È9ÁZÙA"iV˜©7FøŸ¦ù•bsõBW@—Î{³'&=U^Dý£¯3F7™ÉÀ&áfN?Ä«7œ¦dYÞßÙäOú¿×üL V[ZBü¼±Š7«ë²T vký‘6|³ ¤ÞÆUù¥›–=ÛlÁì§8ÕׄÐô~šR¢é}õ½>ëýôzäþ£ë‘ûŸ_Ü›×#½¹ë‘]ô]4ÔõHO?L­àj¤gC¼yÔî/zï_‹ôB¬÷“k‘öûÍj×"=óT/hT¿ Ú»\„4œö§Oœµ¤Í8áqäÞv^eþÓüC"ä¼"SÅ«ì¾J9,m"ÃÔ'4«±ß‘¢PUqºÐ÷V*D½Þݧ™Ð<Ý+òR%€2¤³®Ðz‰Qv¥BÙžõÌûÉ®]è-¼ mÚ"}ŇGO³AYÄOô%æúèü ÕiÁo©óaX7¬\Žàñȧ«[Tí…YIÙùh’Q²PÐ5l{£xZˆJ Òð¨U³¡lÞï‹ã #}dëfiw¤|{kèµo…xÏ’³Ô¬ U™{hUx„íU2ŸšÍ“£×TT7‰ ¡è¯$gôöfÄ Ôa4$t‹A´-pz·@¢2ôï™ W"2°Œ&³=§ Ï-æv E”ëÚä]0·pÍ.iÁ¢uôRZ2R܇R8jÇ›¨Æ‘Œ‡‹˜Þ¥1Ê3sãÁ;³‰—Ûs/Ä1s£!ÿ¨ðû£Xf¾l£v}®rPKÜõ¡éÄBØxdˆx"LL`ñD†j·Z¸(ÄtÜÀ$/@Þ¿ýð]3÷Y™;ŠÿÉKFzË>0Ò°ï~‘aŸKWlL¬>G‡Êœ¬—àîð&M¿FÓbZýèpŽ ýËϽ7ƒ8ä¾j]\_èÍ'›ú­×,ÔÈ¡¡òD`­ÌyÐâÙït$´&ïL„i0’ܼY¼±4â¶ïÝÁã-ÃÜø B7Ðß¹:<‹«söUŸ›ÓªÓeÑ]-¥”s°6[£[±5¸e󥶆x,<ž6ª²ˆiMkj4(ïÆÄ=É€ ªäT/L°€:&ç,‚´ ½ðY ÛýOŸ(ùÜú#lµbúv1+ñ‚„"\!Þú9Ô À¡ °˜Q=Ô³X¹¹&çªÄ?‡ÚPçai¤.¥„§°bÃ}Ò¸”§Íµáaž|<ÍS1@¬Oó(N¸iEŸÄÁG±ô!È݇—Ù†ÙéS\%zž>…WèI³÷iHVÑ©„.‰P› ª\â/é4õõSo31¼³$A|%ônÏ&"ÿ÷öûS¾•¼£ç9Vеö74`З»à³Ã5¾ {´ºô‘5x6ÀnW›Ãi>•ÈäÂ~œÚÕˆJˆø6ND:@0çΔÁ.ÎÞõbáÙk¯eØP1‰ q•(ÁÌïjêþÄ—@;Ïjü’*ñ^S%’5?µÖ=ÚJ}°¾~Ìi¦àÙ¼êáa\˜+W^ÖÉ_MQÏåèùÕ¯Àb¿YP /¡ï´®½¸´€ Xòí™Ê»w^ên­Çæ'-÷þ]›ßÂ}‡'ãÊŠ§ iÒ-—8üç.Ï…ðFt´61Q©Ç7UIF¹*ðwhtnÿa>ÃÁ2¿è¾)Iƒú>úžŸI‚û“üÝÞ|;p"´_u­‰+Fk ¥‰+»‰Õ•Ý´Öù_j©`*BØL)nt0ÿ»:Ðìœâ îâß3Ü÷;á¼v”YO‹p«î—”bÃÆ,~y‹êŠì æ'öûÁA’ºç»¨°‰Ä#£t" V“™t2“J§´@~ŽAÛëP¿^¿‹ÚÏÿšŠóyMâ—flÂhÕÆø„©ˆµÕWºS+²éw"Elóg‘½NB. @hŒ‹Ê@„ÉPôÀßߩȠêV0dŒõ,e%ŒÐèþ– õHàánz-À ÷F)§†y¬X}Ì*càèÊÛ[ó˪ž·o܇·7 O¤U£T#âÞ×ú§{ $¬êßþùÏ»?þ¹MüÀìX¿¥-{ö¬®ÞWE222;‡bÕyQœä-_¤tñ1ÇZss©B›úM©á 9´f(ô0.Rȹâ7J›3€ø^¿fØûà`ì)匾MxÀËY䡆îS.šyša k§ë>¸s=Íjïí ­ èœ1ýͧO¿/ÃÒxÖs+ZÆ#9„>õýäv£m–à–\ç¢m·ò~á7Ìö¢-§D7O¢ž¾£®ñìé?ÀNZvìi6ëéÁò:ޱ9¸Ñ! &Y]Á8ýEkš9\7W69èW }øÆ~ ¦Xxr‹þþ¹Yï{m?"s³¸VAò)\–Luduæ7˜ÚJ¤W¸¯Èå­ÉÔrÔ5‚–µ«Š9"˜8Ø_\ *©|ඃNÔôûwŒÌsjK+[°„ýÞÍ2øz)ÈþöVè¤àþZVñPZ¶[‹ 0šÿ”„·ÃvËrž1½F„êOšÃûç I•íWÙ—S¶ g2õýÖó߈ïg²KJý4Œž9'ÎY9`Ã'€€;Ï^KfaéD_ù,ü¦R'F)!"ÑScìÇŠÖùÔž9ü1 µ‘¿èãèñ-ÉÀ´‚ð%gŸ_ðÑ×èâñ£Jëyá(÷ßéHæT±ý)%‰Xðm g‹sš€J[$ ¸™ÕÛÓòhøƒ—ûZ÷jÀNá¹ÍgR)OžIY€:´î˜P›8¥=Äg¥ZÞ’YN“d2Љ&r¼£Ye§ðy 7n䵨=’d)V4=’²„Œ4,À£àø†§ªˆûcŽ‚(UÅ8Fh9¹B³4Û;lpÂü-öeu(àèþ!ñ¡Ô—¥úÒ«×ô‹ê9PçÎ@ݬ&ÞÞ9c´S5¾1Û“-Œ¡n+SŹbXwèäpËßϵÁ_ÐX°¥Áد¨ØûCG[n ’¬4æ¶ïðgÜkã+ÉfÄÃ@–ò0ÅÃX,ЬGcÖ?W_ùúç²Ô+"Kh6‹úY<&Õû@õ¾¸ŸÅc½#Ü(šðŠÇ98{/@öèôá¿ðÈÖŠº{ÍF+»e7…G ¹ÊàzĬЋ:2ëÑPÊ÷ÆXÞ]¼' ‚ºÉQõ¡‰Åí=õƒTµJü…vî)¾¸la;º´EÌëþ™k‰PÊn ý¬&4-œµGó#‚D×{óñü"[ªW8ÞQ+@z!©<²+([IQ¶}÷D”WÈ÷´$È Ð¯’A§œàMaŸã{XÒ§÷µ”`{3 h;BEzBe¡:8}]:àÁïrt™]ºâÐð@WAê‰8”à‘˜ày ç@܉ €càkûÍ*,¥ýº{»§ßî!P£F¿:Ǹç8¤N«ÑÁSç›ýzÄn–K_Eú ›¹¢SÜîÛÈê剜ÀÄE%Œçxœ˜'`A¿¢¿šþ]¹þѯÆöâçG£2;hCW­j¹`h*!þó§²KÛË£*Ì7"Bª''樨O§$àã[`>¥!—x5!YpÛ9YTå&¨rƒlÞ·Ø Îñô³\o$tè‹*€ß“¡¹ŸÓ˜ûmþç$Ô ~Nã¢j¼Ÿ.¹îém~¼½QÁ„ Vá‡ýz-ÈþÐëd¢—‰Šs™ðì?v g\^õ›­h4zýÙ•”Ïd9;¹œ£¶Ï>§í׳˜»6ß7[~ô,G™f\b[5Ê6ŠqbÎÝTáüó© sŽ!`µ¾=¿s]ööt~' A‡ ˜pp›,bÿ^ÀÚTµ¼"Ø^dÂás÷Й sJ´(80:Q4ù–ŠšÍ‰‘š˜ê`€äËymÖòª2+‘ÆFmMË;Ëü't«ò-¡é7˜Õ=ažñx"jŸ‚Tf–sdH#%o0°@Ö—zjÕÔTÀ€I¨±LýÍs 2¿ýK’sEȓ͜@Ç´|ýõ¶d0ö™­3§eûµ,˜ižL–n îø,zn¿îCÍÂ9ZèH¡Ì;{A\w9`ʃ òÕ„R_óÚcPUóúì„yËh:•²çÇq)Æq „ºYYYñ(mÕiß?£ð4–]¸p7ñèú÷ˆla@ r!˜À÷ÛR #uËmf,[Èýuæ`ƒµ©&îᨰ ]™Ï±ÉiD€a5Xs‡0¬TxêZ7r•Kj(æYøÑ Pæ‘YôÀÉÁÚ.š)Ýsü5z†© ãyš AR“¾,¤…‡@B„DxÄR¡ìK)î,$ÕñJœ€ò-¡©/ƒµ( 1ë\2ü}ÜrL¡Õæâ#('@¹Æ»¢ +i~p®3GL¥Õ8¡{ësœÇÜ2ã˜|s¢ÁÙÐøé“~~ÞÞ¢s"ñ§O.³åýÀ‰É]ÊÅ](©¨ ôòâgó½øé|Ën;zÄ÷’@½ Ä­—À»ûõÜõÄñ;w1.γìâû>»²„×y³@}ÀŸ0í¾#V”)bÄ/ÛQ ïÌ ~Ÿ›ehâ—A•ÙŒ÷õÂ6Ô "ëA„ÁÔHvª±¾â& î ¬; 8.œ+îäz7Z†G'´Ë¡=(u¯p<—n°¡4ÍBqÍiÝã‡Ú#LYyCœÛ:?~áœK€K]œÉ£w©-eJ=òê§äéX©u_Ë!h-\…¡µpéžJ¾;¥¾ÂG ¶šY Xìì³›ƒƒƒ@h6ýöv”©uRÊÁË™Á8òÌ”ÆI;‡Ÿ>éDŒžB ‘y¢,IcÞ|Mqàdö ´8ÓH¢†QˆRR·s-Ðm–5ÿ’‘©½€ †O‚î¸?ù€ôûl‘žªT–m>~]¤ÂÑøÁ'Tk‹5çãšYAo|ú´ ì±î˼ š¸WørÁõ3R¬ÅL»£†–Jç`Ý‘P¢ !õŠòH ,夳yÁD?î Èt`æøÌ¦à3Ãþ-€P8¡éßëAÜ—çµ*•êæ¼œƒÐlP€s¡/@ay·×ߌ5+!ŒhŸŸcxMЏq핱¨Ä‹»ÚDÀ:vwÕ½‹lMÝߌ¢B×½ï”RàÀE("™uä[d?tæW‡¤"8`ê?`O¹=(`Ú%(X+SM9˜/ ”}e±’Vzƒ5)ŠhPô™‹bÚ!ØŒ–xÜ{nIÝáïÊß]Ûù*·lgß9(ˆ»)¾Ø•t/öÜ=¶=(a°‹Ùœ5‰5vç¿ØÅ+X+í ¬(-0S¨ðݾyÚM•jÅ}!½}%ØÙ7>ÝO …‰R‰s̺M Û¯ræºPy` lÑ^ˆšÃêÄŒsáì †Ã8"gð½·7¥B?’[j¶cÇ¿~†•Üs{2è4}ûú¥ô _)‰où5Nõð5ƒUìðË®¨%ý‰¹¾Pµ>ˆ:ô$WKÓu{¸ã|µ”*0uƒ‚½Oî^<]ØÅ‚ëCÌpùßþSÿÃ]MaaÚþ'õfÅ+ËËø7½šKÓsšŸñ¿L&ýoéåT:·š^Ée3ÿ-•Φ²¹ÿIý'Çøïý2"‘ÿVyn¶@ü žßÿÏZ ÿÂÿ¸÷N„þdÄßläõø¯d¶A—‘ñfÐs>òÜoE‡*U½Nãw»@õØ5¢ýpÁKœ|U°(Í%õng'rIg{­°îµ›­i>òûásµYó"{}¾ýÝÙó;þÈsöýÖÈ6«žSì£C×Àë â°Ízá³üƒÇ-Æ«w’ÂNfÿ0棽_ç×ô¾Œº¨!ÜŠ#) ˆã¢ž¥ß2zã´|³VSö‚vÃùék|¯ú Wÿ­õmD.À‘ìŠ\>ì6NæãùaKc<žŽê|­ÃóŠdRÆnŒE/•n«öÎ Õúµj}¿çà tºâ×\eA’_W»­n?ùgfmy+·Íei,>¸÷j˜ÆI‹ÿõ/šÉåœHðO*±nkŸÕüjWø¶ˆÅÁW !àb†Ö dnÙ´%’°¤­mž²9þü˜Ü¼Dü'>1— ^¯ÿÊüS0gúÿt"õñÌM0•Ü‹šêã÷þ÷öÿjTøÿ—ÿý>Áµºnb0jü›ûø˜þ§W–W2!ú¿¼’^þ¿éÿÿŽÿ>oLÚ­ˆªëZp­ˆß©vù¹Öó°_³6¾ü|^ŠÇ#H“µà)/Öº?Rjµ`ý¨(’^N¤pœA®ìL0šdä´õ܈—:‘^ŠÈ½‘•D*ÙÄõŽ,g³+Y;‰Ç©í“­ó›ÓÀ`äôbó°´±âÉäUv+™Ü>ߦfÒ‰t2¹slE,á 1ãl¢Ûo$yèÝ7«ƒ$TLbEø( ¥Ó‰Ú°faØ´6Ý´iÖ\k§Sû `5:wAÓUlJTÉO€<.ª˜^__OÒ[¨êZ€÷¬È”ÿþüwf–\+³¾–XË­ãK‰ÀZÏ&–—3X2júãÍ.~ŒškFø5î±6v-TÏ-¨ŠÝÁ`óƒžWõ]«‡š›þȧehÀ?ÿýs¤¢H½Ùj¹Ö?S©å­•+‚Æ~þ\A\ <•ÈYèóh9—Xˬ:¹tby¥šr2‰Õl:oS+N.‘Y_§¹ôš³šXM¥¡¯ÿ^…àì¡âr*‡Ó+Î2TÏÆ—™tÚYÖ°ÒêúŠCÿƳ‰õ첓…×Ùø |2ËP ¾^]‡J©ìj<—H¯á¹ÜJ|-‘N¯óoî2C-¤ ÒÊ2.½N•ÖâTI´„#Ëæ`+éU,Ée¸»¸èŽGƒÿæ`LøßÚzއ§aóËà÷© Oª¬¯ŠŸ´Õ¼^]K;¸N9UvuÙQïWW«ØDš›À…Jc/¹TÚ úZ¥¾x,ô¯ƒ«”…1à9jØét§¶FƒJ;¸HËbGÔüÓkU\Ÿ¬“rp}Þ<µ†iž5ãÐÜ\¡œÃ{§6ºâðÖá@Ö\¢'ØÙÕ-€—lf§öK@ÏòZbvR‡¥ì5r´œ–Ð+’^]†ýËæ–źÀVp›Ò)Ø ,.îâ-÷*îP.‡kÂÛº¾Š›“MãÂСµµ5Áü^†O—¡f6€Òµ ‚Êê¯-ã2§WW «Ô*ÿD¨ÉdV¬>Öaݲëzïˆ÷Ô†ƒm Àd×p=×ÖrÜ™ct£rpTxYXóª¹Ã#§É9rr0kÚñeñ›WÏ_:“á¬à²§³¸¸ô©l†º‚V`§©ܨe„›Ü2¶%zÊf`3ØÌšƒ™ãN¯Ó®¯¬ð¨«rfk0$\_8žŽ˜=ü@C Dçuf° Ó Uªr¹•ì‚ã:üÖ6£ŠKƒ“Ì®§\š±(jSyb[(©µœ“Ë%rƒl`nkËŽC/VòãAC++kØxf 2ÎOM*»†±¶¿Ói&“‹žÈÑ$»‚ïVp>«¹UøYÉá1_à|³—§,“]PsÎ!Ú[!´N#NY_Eü‰83 w& À’zJguÓ^'ô§4—X]YE´°¼^•Çg5‹ßä2xÒ€šS9ú5‡¨4 €ìã¦îhD{,±Òj€–×@pdük§Ÿh‚=žýA$þ8iÉZ¡f=ë ŽÄ#(Þ¯2þ‹í,ãÁYÉ)Zô…‹½šv$Þ^Èi=®Æ ¨+ %€T-ãàAÑ%l+Ì?…8g7ue5 •V3¸yðñQ5ЀÏõ5hi}}þͬfGâ•{Þ§KŸ—ÈÑ4„û ¸LQ*šðÌr<8ÂØ'à-‰ VV°³Î=·Î'çœYçSƒh.K”v[\ɬ‰“%è?,ZËf”›òoI>3€’ÏeW Ïey<¢ÃÍVˆ.ƒ;¹FƒÉáîÃ9 ­ 6Ì„ æð8¯¯¯ò°aÖÖ—åô ºÜZ€èÖ–uD—Ë*DÇïa\ˆæRkšK­ 4G]: k„P]6CÇjÙ¡eB””]D V‰Rmø(—ˆ\Ï­ðoÄs«Œç²i„XDVra4Zk”å–q×D_ ÙÑ®-u…&мկn­ÁyfÐÜ*ŒG X’þˆ t£²œ­2•FfŠˆð àëe^yIÉð¬1!†q¯ÉgDE¨«*8ÆÌˆÿU€Ó¼,ö+eV‰fäF‘2Âkù3àKRÈÎå¯f™ƒÃß\¸ß*6³*Hô’Æ&WstÒ3‚xV™ ã:p €-J!øªm‚ È-¤ï¡6l[ŠŽ?¶«°Æ?«~€.RNúZ'LM.#‡ŠÀ¬¶¹î0¶!L€ÔêŠø ÊúÚÚ(“Á •+º¼‚$+‹¨…0ób¯,Âå*2IOV‘&„K°.Í¿«q1žâUäÃĬ'«ªí#„N'¹VÊÁbpËà†®2 µBô"‹%¥Ì¢2ëOˆ¤Jû–|ã+:_âw@+RŠIʬâ)X^]峯üí-6³ŽÇ.GX~ueùÑWWTa  7ŒaE—38*øJ2#D…Òœ• —#¢¸žfúê¤qœ‰ÐÁÖ™ W¡_Å3™%™<–EQgY`’Z[UõR«To%Ç瘈>’{<ûPžÂS‘#žˆk†¸bjjİO$ÙF»ÌI1+Ф}Eá̵œ1˜«Ê ´!ÝO㞬¤–M Žyi]QLXΊ¯¶:ZÇ#¿Ž¬|:Kã$ àø@ðçéÌ $'k–^¯ªóšN!o¾’#@#fnÃ!àâã@ðœó @ütÞ–In[!ô‰Óƭª"̯ÐñÎ h§`ðáêº<(ÊàáÀ9­á.¬°ÄHè?›!òŸ¢±’Eh^ÏDZF€AlÔ2k'H¬ñWÙÕ5ñš[œ ¸XsQ÷*±Î@ßÝÉ¿ ½†§{•ˆË:Ò&dºVø¡še&+à’À9–&+P›€ FBpœ±ÃÔŠà‚àËÛ•åÜ%¯ø¿ϯ,c»¸¯Ë9˜" €b`ˆsiKH>Éð–!D´LsË„ˆ²„9Öô××HbY[I3Z¥-_UâT†XàtvE)ÒÁÀä²Ì©ˆß5ÑIÂCŸZ[ž#!“1oœÉ8…ºU&ÎHZé f²kbL4ÀY3¤W`,„tTNäP ¢–¬#kÄÒÙµ¬dè@x%>ÏS !$ 8q›aø‰ dR9ŠV²B¼GìŸããØ?—g¥Š€F@‚tÎ Ô]Ëàïõtº¬6 ™Ø}ÿ-@±ŠR4¼d¹qRÛຬ¬ 16§Öo%­ …K†á‚ b¢Ú‹´Tý¤ølS[´UÄ&IñÄ!×c#‚>Ń~RB›Á@ƒm¥Y'·Æ¼_\r€¹ÉEŠŽà‹ï´À¸×r˜‚ná §W@8j9Ö[:æâŸ^YOäpñ3ëëÄ’¬2¦gÑu•Щ€­@Qñ2޹ýÕLšpÿ*ÿR#Pã©ÔÊ2¡4ü¦V²ŒqÅ—‰j,h/¼,§GY`Lré}Ü%îߙԬ9È€ëÄ‹3ED{%Ýœ5¡Ï#­T*¤ÓË­g•¨“…$–ð˜ãf¢P€5¹¦YAÔ#CGs™Î6V8yȯdr¬8¹Ï¬ã©-£þ;¿ÃZd——/WpS«Ñ£ ÁC—kB…|kad•v,CL@n•(ˆý¨ˆC^*ƒüT$>“çIŸ¦Öó#È|m]ò0ÐPZ[åù²ˆ‡œcÄìI˜]gŽÑÁóDÁÒ1àqXΊåѬYÏ í.â: …ZÈúÀjƒ¤i3ì‚Cäeñ0*Ì=¥87).¨ 2 éUZÑ t||QI‘aŸéíº:´¬W]O­ó§qApqtøÈ\Â4‰g@¦€Ä;þ-Ñ~VÈžY!ï- €r´´*Ø{:SH-â2À!}ÂUörfÍD`ˆÝ%ÝZ£Æ–Ic¼N¿"˜„ uÌ1~Z¼.=!gщ¿ÄJªY $ƒBeÄsÊ&X^B‚,5 /¹,3JL嘂:’Ñ#Ì,ÊWr$ê’fHÐ ’Ä¥D]Q-#…ýìº?yjRDEù&+ØuX'!ÊÒïj–ÖéÒQ[¤¹k‰ŒÐy ê–%.XR‡„‡y9–˜‰‡©"ü-+É¥j©ÖË‘ær…øµ@W ­#!¥ü½ížŒ¸:V¢àŸ’Ö…8R’Ù¡?Rw¡H&LŒZ¬å’QçBòÂõ,“‡À“HB&0k¶ Dbj=Okxf+2žýœÄ –…È–éê:RäÖr€¢Pø·Gd©$ p~qª| ?+£4Êë÷X ˆžœ!/AŠŒõñÿÅíQÍÜ=~·Bjn r´ü›þd.ÌÁ‰ÞʬãAÁw«ë0ß5hY®c žg«Ïsm{k%»+æ™]¡ÍE}ìê(žæVîáâ/£‚f Ìwx X#þÿ®ãÈ3x³´L‚_–ó5<^Žª•Å)ÞSÅtë!ã„å$ŽÂªñoª9â~ïyé-8°^ Ãgˆ—TC…€©#[:á¦þWߨþ{ÿ›¿ÿïÕêÿæ>>¼ÿL¨4|ÿŸ[Mýß÷ÿÿ;þûÓí]<ÿã?þ_ÿïÿÇÿóü#IEº•‡ÿñùsòÈzh©É@ÙYòdë”97ý¼Ý†ÿß®à»»ä ÆñŒ¬Rųͽ~÷¹7¸½ûò¾ÚˆJðtê5üA$KÕ0Õfr Ú¨ûòåøö› ú?$óãH6—Îe“åç ÆoK^ò—rt_¾³ê{m8 “žW}ô‡‘ŠßÀhÌÿŸÿãÿäÛý«ÜQ꨷åß7÷_ú~ùåø¼úòX]¯Y_þñy’Ÿ´{mhM^ì»–‡Æ yøÅI+BU†®ÅV×G§‘­nßטÈÄ«©•lðàÍ D‘ ÈmÉÔj2 ˆ|-ŸÊå—ÓñŸõ £>÷kõüÙö®èžÞµ#He’À{Aø`Úz“xgðOnD¶³ís¬i ,ÏGßµ¬D´ÿ¸£ZUõÓ{î·¨—Z5)R1 È`B5Žíתyt©ö†_0ßu“ƒW'A|N¯Ìú¾ç‹Ñ9 ³Øš¥òE«I6 -íM&qÛÌúrÒóúÍÌ_î_ƒª×òàŸ¿¶Žn¾~NòG¡.’ó}Ðáp-mÁþÕ…hP+Ù$\(œæÄëÁ*¦’ï|´Wj7>þ°‘l¶æ&Àwy ìÛÞÐÿ’LOp-Ÿ§—ó9±L,•ɧRŸ“suÃítkÍúô—Z j†ÚØ¢(¿Ò†VsQÝþy·Ûú2oI´U^ÖÕB-œß?·+¯ÙüM`Ã?ß±ˆkùƒîs¿ê[sˆžpÏòœ,,“[¡qiE}$}­f‚DÑG_‰Supº³|7wÔæ¿#ÓÍ/Éõ‡är±ø­üøýà¬QÜ,6vŠåâf©XÜN®~+.öîGµ½õoo}\Ú>z>*—¿=¶Ž‹±T‘þÛ,B}üo§øéŸ“b¡ø ?†ÿ¾7“±åâöãîc%sÐ*îóõd¥X‚—o;›Å‹ÍÆÅîfãqoóÛÍÁÖ¸±·Ùhn»_·ÆÝ¯Ôàöfñh»8Æÿ}Û..Ÿî×N¶7Îw7¿ïLÆ•½É º?Y««ÿwö7ÇÕãíbêz¸Ù»¿8Û=ëÒ;jШü7ÿ—\ƒ‰~kÀ”wŠÅñÎO¹X:+~;:ƒ©í=šý~g÷m§ü÷m·8.íÁ²ìoazð®QÚ×kX܂ٺTK[ߺ‡ðz :Ø.6¾mA¬4Ô9‚Í::ƒõß-•&ß.wöv2;ÍêÍÎÅQoï~sr5ùÖ<ݤ/†û÷G“ï͵­³ic´Óúörvþøôuz“=Ý:¾øÖy\9y9¾¯]|ß?ßN=—JÝ£ƒ­ûÆ÷ûXº§rêrx|ùu³?]NžîPƒé“óÔ÷ë«Ý–w•žÔ®[ëWß3÷=¯=T®r£›ìYºÖ©-û×½Õú~:VÏžìÜßxûÍRûksyzüÐm=æÊ—­žÓþN >U:¿“ûúÐûzÕî­4{OOσ¾·2êžÁúÂôKÛ›ß\¾Ýìl@TpÍîw¶7·vÊG;»gÇ÷¥Æ÷IãûΔìVöÇ»GûgËåã­Ý˃fu´ór°}¶Ý¸÷ÊÓ«æÍêáÖfö´|ìì4&µ‹Çqƒ¦|ðð}w¯Y{¬í^dמN^ÆÓFLÅN_îÊãó‹ÜéY«vsuÙ«\ï¦ýëôYë{»Öõ®zýÊ^ú¹’ùÙô©ÁØvëàꪕk~o÷ž«ï+õǧ“Çžçuž¾¶ŸžV¦ÃþSl”ôж"vĶ׊ëËO«»×7ú?Ô`¨ìÃzÙã—M/“¾TOJË¥¯|uöÜì6rG“Ø·½-žòN*v~ú²“<½Tú±ÞË·•ÿÅ;ë>Vv+ß¿?ìž–º™ÜtÚ?[¦—©ýQú¥²\;Ø+e³‡ÝÚY¿7=íŸÝì'›ÔàêËu²x|ý”oÇÛ•dñàéz_iúǧ£Ó—Z²‰UÒ~?™,~-ż¿uZ=œ¯¾¬eëËÏkiøöre´Æ'%Ù;h'Ç[z-®—c•ÇÚõùÕú·Ëtéëàðéfg§ÒhÜêÛÙÍSn¬_ÏÖ;/ýÁÕðêùÞ÷úÔ`¯Ÿ<_M§ÃÕØÕ}»Ñª¦ÎÛÉËÔ÷‡o­á$Ý?¯^xß.«µæêvÙ[¹Þ¿d7ëå˜7Ì.k;ö5*Óþ©Ÿìçb^/æíöskÃåÚa'½—M=_”¼oÃFjÚ;üzv6®—÷Z¹Çæ}v9Åk¸Üé•–_¶ýþÊs't§Û÷ÏÏ­S¿¶3:ÌlO{7ÙQ{ó~ÓŸ\]džž×w·Ê‡;{íïOÅâEéàô¾=zܜ윭f=jp|°üí{u%ëïŪõXµu|=:þV)'KéǽíÓ•‹ãõýïß{WÅ‹ñ¸¶y±~òíà´qô²æ7‹»/pøWÏŽoÆÁiŒ¬öޝ·®—G¥âùåM»=ìŸt¾%w·®š™dº5½\ñO2/û÷é‹a2]ª&;›±Úèñy½Ù\Keú×»ÏÞSi5“½::Ù-å¨Á½ç`z:º¼_½©Oc_oÖ÷ײI'}¿Ú]wrÞ~n9UÍf:—÷Ï7þ×ìð¡ôí{éú¦RyX-·ï—‡Ùõ‡a{³=îpƒÞáðh¯ûÐÚ½o]] WwO_®j©äaå¥tqótÞ[[>Øì ¦;;õòöùáð4éog‡{OÉ真[û–]·÷Õa¢¯Òß[7G½ÒÍ^·”)•&åä·‡“ª?¼¨<¯ O²~nt°¼êev¿ô:WÇ»ûÏ/;Å›o[~yëÛIe¿Wù–<|úZŸò”RÉtñÛ׭凛ËÓóåÖÁõh9çíÄ–‡gé“ÓXug=µz9üš>ÙyY©øß®ÅÓi&õTîn/W·¿öÎJ¹ûÁCiÿ‘¬œ]m>®î^î­ŽË/Ãìse Û0\ž\•½ï釳³ÕÁ¤¸·Sì<6·Û“•ÊZêtºrß9Úé´OÏ'ˆ›Ç÷£d«Ø¢ë“iêæ`}â=žNO¾^<;¼><Þ:=j”NÒÉ£ìÚè°7}<…ÁMÇ»çÓçR*¹;}ÞY>xè^qƒé½£µÞæcugíhíëù·òááv©˜ª6wŽúÅõ­­ãæQ¿Ô{ÞÖ—“Rñ©Ö8éM.Z«±ïû[“ÇÚKî>µ¾ŸÝß¹fªWÙÙ©}óŽO{8õN÷ª}Õ9_>(ýkÁÛLŽüõf'w–líÞÄÎVws«£Teô²yrµ“^i\–VR€až‹g•áàk§2l=wÓ›ÓýÊcÊ».?윮œ§®¾OSϼ)ãØõú×µ±wV]9z,u†‡­­‡bc·u°Y¬m}óûWOƒoí›öxÜ)žïî?Æ®ëÓË`èé$V}òK“ý§röªÍ#l–üöÞ×u¯vPW3™^±Õ-??¦¾e·WDZÁZjuÔ.ÕÛ£ã­d®»©œ}ßõVßÏö‹OÊÏãËÓáþÁ2c›Áf«¹õm»röT_}þ¶Ö™´b÷Ç^re¸þ’›ßOW¾žK§Ç±ýÃçÃQê 4h·²ÚI>ž$Ï÷›[øâkç´×æM¹ZûþØto&ƒëLJÚåS½ú°}|Gu|?8ÜÍ|}ž\®OëíÝ\.•^ç¼Nº¹¶ÿ4-ÆZ߯º™£Ô*Ào?³—¾:½avÒ=Jìï|ŸvO/¾¯'“åf¬º¾—Ú_›ÀWŽ¿·GëßFÛ›½Ýçõ½Nõèðjÿñ,¶2ì6¼£å‹­QªÚ~ª­w¾V˜êu«Ùóñýcú`ÐIʇõdg·>½vÆÏÇé­«µ®÷Ò½¹Iõ—cí‹*°¬Û¹fçz:zÜ?Úÿþø5×jì·“k½Ñé~¥ÃÜãÚ³×;¨fŽ67[ÏËÅ›ÞÍp2<Þ½lyÇÃté´º}ô°ÿTú^?/¶RƒµÓ§f­3èäNêíþ&¬Äýrp°ÝO3¡ß\¯Þ_ÿ¾s2});ßï3§/{7W½Tò¾Sy\Ý/{ÝïgÉòöÁéi§sz>:ȶžVÒÏëûO~ëìÐËnn OÒþÎÍÁÊ%Óå‹Î x>j]â2gêGGÕóÒ¨ýR®í%ÖVj•öèðyu}¿Ü÷ËÓç«Ý~å~˜üºU;,—÷vk×ßK›—O±ÝýÓÃÔÓר.ðZÕÒÃþÃáÓ1“€Në¤~?9}Kƪ«7™je%ׯ6³•ëòÖËÃuãø›ÞÁÅh˜||øšó’õ›ãÇ“éäúédåà8ÞIc¯ã¥olf½\úëÚãAï¬÷mÚO¯¤[{•ÊåÎÙ$½¶O ž­”öüJ3v¸â¯½¬´Ž{™æõîËöð¨¸óPé{þ6¬wûã•äIõêÿËÞ—€»QÖ{‹Ê"â\YŽT(2´³o‡ö`f²'“m²Ëâd2“L23IfI2‘‹lU(Üç»Â­ˆ‚D@A6EÀ[øŠèE ‚ ˆµp‘GÚÓÓ °þLº•†³F°Æã’XQÊ «¨@Ín<äbX*:Éq$eàålPMG¿ÇÛ=(ƒb©|–n$ÊÍzÏ‹T #šáÂy© ¤*’ U1¾ÕŠ–5Éç«4›f°èeÈ\Že™C†Ì|¢ï Ôbª) N–tº8éÊf«‡($Š£”ÖÇ1‡“9: ¨ !’àB#SbÔ¶0ÆGSR‡`j™^Ѳ ]%ÇFQ%™Õb¼ CA•Fâ}½¨B…´  X!ìÔ1(¦ánÖŒaý¶‘ÆAÖ/;Û}Ìç£ÇýΖ© ɵ g)8ß®t” —r©VÚEZQßv86Y1£”»U¿Æ*-»ÊÚîÐV3ý±Miua¦é‹6jQ%-&FÔ—›\¨ [åL+Â7¢]:ë…¥TÆ„}ÉB‘L(¹„Ÿéš,ÜfBm©[íµãÕÁˆ ž“±v3— d)åå8ÅŒwTÝÔT§,ê¶ä×)UL×…x<‘bÂJ`±Ó§T¸ÇEl`OY=¬y´G¦êãulºÆ´à/7ÔXWo5χꤶf¯uK%¸èÂ$ ÍÙš•Sya7›e$‹È~Ç”h_ó°96ôqØËë ¸oºØm¯[€ñFSa_8 Å~/SÚšÍ0å@Š`ÅAžíÉqnDYRÍRÏÚyU‡·p2Ÿ‚c’”…±A&SéG‡cévMYÀŽŠF 3µ»(ÂΰÍAÜ-1µº*à†™îÆ“º(µ­±]FtKêÓq¯â©L¡ì>Ã1 ^‚ e£!Ÿ›Q¸Ñ$ 'è"˜7¿ª»Àn²Á¸Ü¨ø®‘n°¬"Žl)^”㈕ö7Q¾j6úé^CÓp8Š`ÙT*'%8 %+˜ÅX@!´X?Ó(;q‘A½ªT°‰å8œMU,7žCÜÁi_)©æÂ5Š Ä–Ó ÄšF‰Ö0ÔM4 >­aê©&C |‚âFSöØYd¼T¶—ïe!+Yìers¸ÜÁ# ƒÕMQL” !ü±Îq8ªz<÷7-{÷2"0D0) a¹öÇ’bTð,œNÉ Úðau‹21ˆÀÌRg"h¶ƒíP_«¢ kø P ÏÁÝp Ž—”hKèx$Ç'ôîx… QÇJ ²¾¾E’Œí”d½ŽÆ°Ò@ªT…X½ËÅ„t²Èõm4U¢‘¶ÑB J,"U¸SM ¶D±áZ±YÛ/•ÀÉ¥§H…éQÕx´§ôhÉ kL6€¶ŸîxÚfu·.&êz¯ïi½*ž/U3)ð»1ÅíƒyNŠêxu®”ªhù6íF=^.GÉå“h>Íá;F½¤’D„¢Âà0àÄf¬ç¦U¨ö9 ïÒ†”Ó\ޱAvD0hÄå`ɨ·Äðñ•N³9Ó†Üdé…TʨäÐusR:ZÌ£>”ÎøDÀŸ+0 ¥ØFCý²æ+@c.‡F¢ãdúFÝóR\„Bñ$MÀ5RŒ{ ,åºY½ÝL[ mT3 §U…(J*K¤ä:SMuP‡²†ƒ‡ÇQ]´‚VCŒFý‘’ÄH(Fi) ói4ÑSœX%- 9¹g‡«! n²Qö#p£ÉÊМ칆ÝSjcÖï§À­¦Ó”³]Œà`ÕêL¯Ñbtw8sùbeP\°Ýn¢j«qµIyn¤åäAÖè!”J&§ï¯ÔÆ=lÚ Ç¡ÈBXäÃ&¡´Ð¾I•üëƒ#&Ó‰vc!3+9Š«oÜg¶ó[¬uB¬€`¤Ýã*¤OI– £Q)I[Nœ(Ùp.§eÔˆ®n *;B]!“ *­PuˆÄA`¢‰õtRk:&á¢RAŠÇ8YD«-Â?^äÓTL%«0CF@8h;1é :)eÚjä1JÆ\‚4'í×Ó‰MWÓt0½’êð _‹§¸ñJ»Ò%sA%BI³ËÉ5X.ÙÃ%«I›18ItÉÁÀϰÀ+bšÃ¥DMŠ·ªKÊp¡eÕ<>$&…˜fó1 WE˜bÝ(¶«©$PÅu ϧM]«”Y@” 4­xn¤dà~D²Aá#[6 Qá¾RRÒ]¸`8"L6Ø- A«z±’‰¤Ñài ð€³d’½*-V9nJ&€õd½“ð5­,W-=™ãc IÖH5ذ{H%S"Å,Á&‘Ú°­X¬-ò9Ï•Ð(TNæ<£òÈ@„´øZÍ*zy2ë$$µ@WDKŠçÇ8î²å}Qà𩹒C8^BnʶÂ5M|JÄ_MÚV%\ê4]W»±B·(TV²‰¡°œ‰R9Ù¦8,ÓݱM‰ÒùYöÇc©ˆ#3B´â[t®B¬œ#¨" ¡ ·šlòÖŠ8%/)§ó¬ÖJf‘–¬Är¾L†€OžÌ1Tx¦ /uÑeÊI¶Ç˜lUa¯SajWì”i†`#T à ?póôNJ@9ä, ƒÊc‚ƒP¶[d¬lÔ v×05‘ù•‚R+ä‚hŵ퀗ñ ŽÔñÌ>× §MËõHõ‚^ΗEË'X|#VoX§•¾×Ô0²Ä¡¢« DCŒ’9á–H¬AÊ5àbKfKhÍ )…CÁ0¬ Œ(⟅³Õ‹6àñv°õúpðXjÀ@ï ïÜnÀüm‚ªŸÚj$¤a5QYÏ‚‰ç§.ûxBŸÉùËî8Ö늮éVòƦG/]xÐÌ“i•PG0iˆqvZÕ”&Š^W2A¹Å<‡·ÒÒ‡¶n6Bœº”Y$ÊžÁsÊ€Š .¶Ùó›ûß,Ç`K/^üöñ±ñÙ°MNĽ‹£”³¹{?T –OFƬ§*m'£¨[®iÎ OôÅçÍN(ÐuÞ ¡@W1y3j Âddý7Î#þ)×Õª“$B±J B¥QYÀ(lu-dU‘«†n\wºÓ¯Þƒ<°° H:ˆ¢4ÐÆ Šú° dQ‚ä8‚D0jšìU7!›\ÿ°ùeFݦȅ³€,Ń6üœ `~†¡ù€ç@‹Ó´g©¿I÷VFŸü½70Õ¶Z-urtŽxÖüM‡®XZW©­–ñp.cR{{>‡s¦ çŒÞÚœmRu6ÊÕY¸ñ)Wg›©·)·¶™!›­?[3Öfy2kþ m°1S6åXX³–åÍr8WT:ïÏáÜ‘ÄNJ£ojOÉ-³«XŽRvƒôÍWíH†=¥15ãxû„Óš8LwŽrͦÙꙇ՜£¦É®¯õÎtéû22[꾋QÍx?±1,YaYç(å ’`¦ioðÑïÕsjxÃaÁðn?=<÷²“ !ä$ŽL“•Ú<»¥:=ÉR|5ÏÍŸ­èæIÊuɬ)ÕÙJLs“j›É~›OSðf9¹¾¼RÓÞ\g>@”üóâÿŸwdïY²ƒþ’Mó(D ?J“l€Á·U²É(•EéIÄ=ºÑ1'ÙÉ~ï(™á–p<Êøx`8ͼ7”°Y”™D‘I”œCÉÄ?‰þïšÕõ±¶K€ÞÜj¡íY“r3d„˜Î1šgxå¶]F0lè#aÔ$AÌÉÈÄœŒl¿2‚0 hðc$Š`~¿E”#Y 1àÆÏ¾a²(5I¢“Ã+ÎÉÈœŒl·22Ó×b1ñƒ<‹Ñ Búém—ÉbèÐŽ ¿54'#s2²ýÊóË=' s² ;C@–áè÷á,n«€ç #øÐˆ sË:ãÌíxY' „¢>rÇ9?ŽûqàŠûq p³í(A™,†Mbø$Ê@s(Ù¾QB1”/€ùHÃC”ø¨ Êù¸ Í“>ÚG¢ï%lC&Qb’ÀçtÉÄvŽöƒE ÆN’s^Ù8sûE ÊR4‚âx%ÐÑà<ê 0$CS¹í(ÁˆáŽL"øôÄæP²¢„&€ïdQÀ[E)† žc>†äI‚ÜæeB€*;üš";‰Î-¥3·_” – )–¦|3Ô%,á÷1…s´Ã0t›½Wzã`“(:IÎmJŽ3·c”ð3¶åPÁr¾86Nš­ kjÎTJë+º=]p”4C*gt{–A ¹<Û+O³-@m£Žx›TA3 àhMñ­°"UuÍTćÏ5 {¿Q-ÓJ†¦{€ÊÄ4™ ¬ÏÝ Y™Ú¤íQê–+G;•l+æÄð· +r6_`y(¢]›Êÿš@‡¯/OSÙ¸ÈæI)Ž®æ(ÓpŸ™¼•±µ6ƒ Ç‹Nõø¸³ÐqÔæcºä»± ƒæoœ‰±iì¥tÉ52·ð%ƒ)Þ“Ì­yS‚44…ÒVË•]oõ¶ZŒÓ%¹ù.âf9=bOräúøEÇw7ïþ©µÉÚ°™Oýãw'ÆÍOŒÚÐfƒB[¦3‚<²a¥Í Á¨ßÒ[@ÏÔ5[ï{øŒNØ£ñŽFWP´».Zßý ’·NÃhUøŒK|ûï­W¾¯9•Ê$ù€(®¯élfÂfÔ”ا…£÷\§'|”öú:™µ§“·NÀÉÆÌúëS·^½2”™™µÇ‰›gó–·G&Þo ˆrøÍƒí ½N'³mX ‡ïj“ï ± qÁ¶ ,¶ehò}‚ÃlªwƒÌ­¨ž÷7¡?C–ä:wÝh*Û¢YÑíW³f#!ðÃ-Fæ„j«æ„ê] •¸þ¹âÿe2Å/&‘ Ui1Š ±m­m—g‰ƒ–7¶äŽ6ûRÓŒÊÛ(Ñ#$ÿ¾ŽÏ&Cþ§r}ø˜„ÅØW$@õ¿V›´ù.q…½W`‘ï VÔúæ‰Xu¿Åx¶¨÷}[dmW7óÅR£ ñ—&AâdÊjU]Y±Ö/°§üÁ ]«X’åM° ‡,Ú¨Ðû;NÍøƒS»‚ÑWJ e+°xßþ›kd®‘¹Fæ™kd®‘¹Fþ¡ÙuÑÑý6pÑgB1«‹érôÔîà7Û±ÉþÖª4vÇ'‰á¿‹Á|Ë5 ŽiUû HÏ 6eÇ{“SÓU˜·«ø,‡kõ¿€-D1œ$&¨…ÃÛ䯢 ir‚a"Çœ®(Õa)à?N Æû’ìÄxב84l:À“µ'Øa£p\²¡UÕTM©îŸžg@”@ ’A0Áæ#ÈüÏÁ‚RÕ¤-’M ·_ |D4¥)²1Õèõ†§Pd˜=5õ·ÀÛ @ ï„DGrð{HD&Pt}¡á¦HËf‘ r}ðÑdQq¾Î*}çØaR[±mDKà‘ j\”}qÅF}ÊZš±Åümößž|öíÉjº£Xpp¸×ãWd‰ÀqŬ9õ œ ˜©©õŒÞ5¼ä¬ÂýWÙ뱋¾ÿÇCLÜrÄó·xjñâ½8y yÝI;œà}|·/:óçWýÙF¹_ÕOHv{¹gæa‡<Wkê ƒo{ëü¥«O\³¦¿î¥[š[Q~áòG~µæã¯_~ô¢{ë^Xóøå¡©•ÚÚ£Éuó“©©uÏá¬{öøsö¼hê;ó¾è͵û½ðK¯š÷äOÞxt…þó‰+½.ZuÐѯ¿þÀÑo<³æþïw×½<ïÂÖ¾’>gõ“{wŸ¦^=üù#å_^z½}±ôÖž·õ¿´è!vïEÿù‡cNýòé>`ݸüè1õü¾zàE¯M—§¾ùÆ‘ùsæwï{©¿ô+ÿeþ'¬xhÝ£îK×>p÷ÙÖÔ£GÍŸ>tÌŠ{ñÇï¾çG¯G^ÃO¼tÜ­çžöë[w?î¸ñùß;ö¸ÒWV?ñéÌÏowØó¸êw_ýõN‹øCÖ>¹(võ='¢Lc]íìï¬|*v~{¾{+D-=ëˆ_~k÷£VþßôµË[G­tžþê í²â*÷éî_s•ž>ô|ÞÁëþåŽ/6?{ñþ'ä/Þå'I'›ù•‹bkƒ?zK\öÚŠÎùëk^óÄ•S_úÞ¾«ótË//o}ý€OÞtχ±ôžk÷¹ã2èc',êþâƒ%O¿ºúÂÂM‹ž¹ÖCxùçì kýë_o?cÿ3^~È žzýcÏVïÕÏ”.xòé§/¹H;‡”àù¯èŽ ^úöv~.õ`~­óÍ º¼ðÈ>ûÜê{NpÅË–>zò¹W¿r{ë–ÿóÒ¢ýnÕ§rÄ¿™ÿ‘ý¿÷«û<õó¯}â¸}×U–/¾¬æ{ò¾O­þÁÄS7žwÇ÷O^½ôOÕ ×ù]ßÁá—~ñÌu ?tÆî¡¥·~‚…n¼)ð³Á+ÆÙ“&–ì÷Ø|â —í?õ‘£¯<çóGɾ9Ø;áþO÷ËϹðôkw>ï7nûÓêVýá¨=îdw¾÷™›?rø‡ízàÁ=n­/-rì…«ð¯½víCÐ]øêƒCéUO~ý¤7Ÿ\ó…Æo]þæä_^Yüò[ó¾ûÖe¯<²âúöqŸÙûÙßïvkƒ'µc|çî†?²KùšUknyøÐÞ¹¨»TùÖ#Ë÷¾‰]µæKá<•8 9êÒЭ¯5­>²_ü¶'ævß]‹~}ßsËVýø|ã£wüúãsÁóïH¿úÓSv©gÿÛ¹ð‰kwùLnê°íx²¯ÉŸ®žw€~–uê?î‰g`;ì°0*ýîøÁAÐÉ?)ÿù쓉âë>‡?ÿ”·×Qw^f?uRäWtÇKWäþí9gy½Ç¢kŒ¿ô&ö{±“;«øÃ¯þðÑ]_Ú±ø9êPøº/_yí_ºâ‡ÿõò|å„'ù æœþòä ×®¹ï%ÿ‰ƒ»;øÖÎÄ…¼gŸ‡žgÏ?Q½î¨¥;W‚ë»Â½Ù‘ù]ZöÇ{#/º?üâ²FÚ~tÏÛÛó¤\œ¿Ë}_û쿟vtÓ}‡4o¸öÓ7Ú+þØý²ïqw×ûü ÖüáÛ¿ß×–ä­=”‰ ¡ð=Ì%g?˜¼ñÎÍç%ÒS'´/¹}Õ·ÅëÎÛcå7ïö.Þ÷¤}¯š÷ìÓCÀÞ¾è/ó‰oœ=þüû—ó¾ûÙÿwé¡ÿzñ}¿ÜÿÍô©Ë?ºâÂù­}ÿÿNó.==ñœe÷ðwÎÓvxñ§¿ý&>o‡U§}â2èòÒ-O\ê|èÜßœþŸ§?^ð×o¾Éîû Än;½yʱ¿ä#?8ì’½Î^vùo.ß'qÚ~îé_|üUô³WÙ‡<¿VþLÏâ{çwO?ṟ ϹbוŸ»éåÃv½pÇû.Å]ª´ã Øiü[7Æwå¸íSéÇIߎ¦¯~ý”Wá'ŽØó‡Òõÿ~ßQÿºöÂkçFï&‘„\Ÿ¼Kà‹Wïüý™?]»Ó³ WþB[zû%—ìdï¿ó’K²낽ü6õ©]J?øÄCÙÛ–äžzõcg}原KǛ˾÷êŽ7*­oœ~Eë̽•ý?³êþ›àŸ‰/Ç*go¾òÜ;î½óÙcî¹þ9áÆv Ÿ:OùÞŠ?×y]¾Óò[®Úù·]÷Ãý§<ò£»/?ü¿[ƒ®<÷Ï;wžyòG¼Å}õåólí[¿¾{ŸC¨uÖìòƒ{÷voî¾?úä+Õ×VþÉ‹¯þìÞ}–]BÝûìmð^¯}¨÷ýW¾~;wúêåk*yøÆÂÚOþrÙßõ+ù†vËê/þøk_ùíŽ'cúªSœ5ŸwÝ J—›çù؃?þ‡Î:îÇCù‡¾òµk~–xqùÙ¤’X²ËŽW¾öñG/c¦ÐÞ×/kÛ_+kpó’Ï:h'éŠGN^vøú-úòíŸ_òíçŸ5~øó=þ‡–¿Ž‹céÖPÜ%Bpwww îîîî®I h:LJ_Xšö!j«æ—z2k)æîY·ÀÄ`h y&éIÐ\³À—›™O -³«H:p^­¦TâÄ{õÂÜZDÚ!ë’æœªÁ|–„ ×™ùý{B~7o.ÙPP°¯Eû¶³ÙBŽºaöÍ)Œ^±=â«“ÃO}T¿Â«qÝu‰I0횦ՠõä>ûvwˆ"Õke0çèÉŽÍó(G³—@-išŠ}‚„_BøvBø……ZÞ¿Bù²sïãþ¬Ï1ÖÃl2æ»pq޹€ÒkXÎ̯Þ?8˜Ñ=Ö\añç­„ÖÈZ‡÷©míV#âÀÆ-ãë °ÇÀj¤;Íô¾„~WoMýæ•ìG“WkþÏ}ºäކz«ì‰Š¹ä›é¨_Þ§ðbãn_òT6ˆÊO¸è鿚¸ ÚJj„ s||ÑîÌ4XÀ­Þgc³3;;¡ÿÇL8w‚S½‹‡!|Ur´¯Í" {'Îõ™Uꓼ*‡%ÿ'¡5—òmÏqFy‚J’j1HJе"µ/×Zs2㮫Ƀ”ï•&Æ*`wæŽgò_7o§ø8ƒâì=R0d ·t–‚¶oˆd¹¢]Ò¹ä+:|4EÍBžWú8,ñ°G}ûÝ@A«-¡£²–¶@zo­@g­'ÓLÁŸ0—At(; Z”×!ÄÍ/«C}ò³žñ*"ÒÛ<“ ·X_{]¬­%sqùˆ° $Ã7’ŸA?L+‚¬Lýê%(gxÿ3)âUåªáÖ­½NÊ÷ é7ªq]×_Þ|ÿ&P‡dQ‚ù±­Ÿ)„·Q}#C;ž@Ô!y鱕½&ÞÀ¢ù—‘W|oD36Ÿ˜¯áÞ²»ôškG7¹1‚›Ž‘(ñ0æ+×±=¸¬mÉz*¾-СעFÜß›÷ü<—rR‘2Âîÿh»á„6Ï‚Î,Tá’~d˜2ÕÊÆùŠ´…èTҿƬ/=h`æí¸mHMå7v£Ð€åSO)_¢Àbd3µjn‘ÎÓ’Ž2Ɔv'‡B¾Ü¬’ú;1u—²¢yY†nïe³·ŒôFä“«XÔ6ãµ²•‰APÚz´‹–D‰º!Ãw´×ˆ†”BWõpJ¶…ß`þŽA†.ŽõÎÁKGÀ+^~õï×à¸Î„ Ãi¾ô¯)¿Z:'’:ŒÐM>Q=}m’Z‰ò¾ŒÒ•NŸÇi?Й bÄaâPˆ€(褕W¦Ú‡u™»_óŠD_EÖ4&Â…‹”ü£„ÄÕ ÄaºvÚ6VÒèš•QÄ1ËäÄ3Xù•éw$ädÝ´°™•ÔŠ e®Ú‘9hL¶Hæõ¥› ©ÆÝ¬$ƒÊLšÚ’ ŠDE§y “Äxÿá¾ë]j©mذM݇Ï?¦]À…q-Ðlúl°KêoC–z°Hê¥ Xêø#–•2R²5Z¡&Ð5gI¤¥jv×Ô5ÔæDÐQvC[Aj•÷nÂ-»DBÈ%ÝË—27Ñ­iÛp² Â#b±UNÌ7B> í,T½¥ÓjØÒ„QÙÐhÏ}=“î~…«².õ3EÇÅSKð¥ÌKQa‘Ÿ%F߆nS0’]·‹ãó^Œü Ó1ÌÔB¬4ú,;D¥{Ütu6A†}ÃŒ©|)— ’”f:ïž(Ù(†eS`ú£¤ÈëBÆîk„–ÓJ*T½¥ªq¯ï2‚,1œ°>ìh|¡Ziœà² Í`òêªÛ% ÁÓƒ—Á [xåÀº4!­?X‡½ÅSøuÉ=⇅¼iÙgùD¿ºùÀ“ò[žú¡ö|úñŸ¬„|î ‹dHÞ¬á¸É¿U–§†u—m*‚I‰rÈ?þþZÖWGðp" ¾é@Ñ—SEE9“ü‰'|WɃã„™,²Ø† |»§É»u›·náÊá7‡n‘qž/±<…ÇüÆž (_ª’N¾>7M¶lcÜÑ›$ùOÙ”ëH=LäyFBE«;Çg“–sc¼çžœP|>ÖIËw‘W쪪,¦:¼…¸ciÂ^rÐ1øˆË°QuÅ› 3Ʋy«|‚·×{ÝðQ-` ,zcÿýþü,øç‰NÈÂÙIÞÄQðb¥-àÙ•ƒþù JOÏñ&ŒÀ'YàcŸ½ ’°„ëŸ'¿<êЋ›Þ4}zl}y ddc¡W³0<²ÿý`ÈÁ­ª§ÂI-©¯E¬nMO'iÆnýŽÔÀÙ”JÉÀ–•žÓ\ÓÒ—†Æ‰ˆVËV[šŒû¶,…¤¼¤Š8—‘ž‹9œ”™ ' #‚€-10™>”¸±<«* ½„¦‰½(™Œ¡•Ž!¹ #‰‘¥1™‹™¡œ§½=7' +=ƒ©/-Ÿ¥) ƒ)»˜7¯½¦•Š˜¬ï¿ìX0¾lYhÑKØ›¸›Ó‹˜¸Z™(¾"`be%`dyÞ»ø«>Ëÿ|dþ?±ûƒ Ç?Rבãu %'—Ó 5à—ä&¥æ à4áSç•QdSâ·ÐÕ0dæÕ¡Q£S$±– ²—¤•§ e€3Ôa3°´‘Õ´¥"ä%—SÐ4QÐÕ ¢áÕᦢÖV±6ã46¡"²Öâ¦âeÖ·“gÔ"TÒ¥äg¤”Ðd1v±×‡et$¤§¡bТâ¤3“Pd"3¤&vâQ·fÐâá%$fS¥tR·•p¤ã³SÔd±&•‘ÖЦã7擱…c#U`²Ó0•U#!¡–“å¡ÖQT‘´fà±´–¦³S·pÒäVÒPÑ¢g'æ!cfw4²Vr0‘4!¦QcW43d„S•U“2å³Ñd‘SvbP"t2xÇ÷µ•? +—°‹$¹“%‰³¤„°%» »­¼Œ!¯›»Šœ8œ¼»£¶¸ ™ ƒ1™(9¥©¨¢#½55• ¥ƒ®•+‹‹´:»=‰º”£‘†=ƒ-µºµž­ •œµ ›¬-µ¦ž¬ƒŽ»¹“޾º:£­&'‹ö¿†íoûKoÞÐþÕL!jhbûä[”ÀÍ9áwô*NfO96mþ¢ë_´Sµ0q{✓…™íß,ûÇ(ÂO£;Û9þÙmúsGñßߤad¡c ¤Wr1üç°—æfçhØ&zé”õ¡ÁÀɰûD¯® .¬ Aý?_i§µ}⯅­Ù“ŸÛ Ú:Yüu/fáèä,lnàHÀÊð¼õòÿC€ìí¸=×`ddùKeG—çÿôÓÿõÅ `qÒbe¸ÔÿÿþXYYÿGÃ?ïØ9žN€èÌœ,:ÿ0û?v&Œ–æda¤6°ÿÙØv{.¡ebbx¾™3Ó³zB€½8Z&f†ç2F@òÔ^ç¹ø–?Å?¾@ðŒ;%°ÔÂÚ„‰€‘ ÿ|«à5 ‚ÒEÌéeím ¬Ÿ³Ô€B230ÐK8X[ ÚšY›0Ð+9›Ø¨<…ð¿,ñ· éÕÿèÆÂÉò$þ±Gûl²s¾ÌŒìLlŒÿÜ3ôV…wWÚÀômqúzþUQ<ú<Ž…WB<à\Èb6‹¶zê<”eDBkVÈ+†«ì Ì2FüZ]…ø«\—Õ"¦ØÚrJ)Ð-Û_8!íþ¦z²R.§<·gÉgKÍgMK÷G·  ²!y)êì\f39Xx×1isjº.Áá‘#Àò`äSí4‡ »™C0zè ÄnûÙbí*Ãn]kù¿c’SDÒý8>Ï-¦x«§{G‘®Ûy9¨Š2±žã‰ßòñG M‘öíÆìe¹ë`cNWÑy?© 쫨V:ë·ÂÈ⿌½,l´úªê .S@å“íÒØ[ˆÇ#pZÕ_¥Úµ”f7a‹oñùCŠdN Á~°—?>ûµûðMöŒýqfBRÔ^ÁòrB¨ü§[Îë{²˜(îAñÖœcWHÁ#Fû`$~ékx? P•…ª¬?$ÚÁ—»ø½>~”zŒ'*€}Côê…ˆpÆb¾:ÂOóWд™»¯£ Hˆ`{ZCÐ>÷–'¼é0ÆÓ'kôè «`ÀšÁèÀ´'xëaßþÁ-ý•‘Âû9ùp]Ì^Pv*…–ãú8¶ÁÐkŒ núD–Œ°Ñ Á” ¡ÜoWlçƒð—u¥…y±†ðOĺwG„>ZìÔúýÆÓ¦¥Ë 1Èí§Í‹#ôê4rEØûýÒŠQrçÑ t'OøOõÀÛc¥;êrøcTšì­c¤a×¢s'7Z^Q-sæ”LÜív1O,»5ˆÔö¨ò䚌D×Q2žiPx«¼ÞX U¯73Á~¿Þ4Ä‹³½ƒEÕ–îÆ¡Éâ=GÑ,G’1o³¶n“µîršŽÜ*Ǧ׫+”ÐæuߪFUiÏ7.>–»—ÿá[>Ü xMâÀŒ²ãå“Èï¯Ìy…ö ‚– éð^/¢Ê†aw.¬ –w›Ô“ìd÷hd±PjQÅÌ+6T‰kR0Z  ;}ãìã RWŽËˆã[üjͨ1JË%v°ßn2c*/¾)›Nj@mDÚ«~Ä4™/X$;&*AM*)&ñµθ)ÿŒ[Ý\«K«ÓÒ”¦¾¨>ÐJŸNQÉ ú9öÃèMìo×ÕÆUö…Ưïe[RÕ!í-Äà´—pÓ”W RóìzòhCÙ$>Ìy 펋‚åP}5{…ãE}•²Õh‚W•D–üjRˆìØBÞg6¯53 zlvT `; vµ6ß×¶]'°,ò¶÷{ÆÌüˆñ˜úy§ù¦_¿Ò‘urÙÁtUssƒ«¨ÊÚØ•7€üÄÉtl³ÝT#áq¨¬¦Ê•É˱lKTµS7QTµ«Ã_ͯé£mã _Põ)ÙÞ:­jï\QlGQ\™jd™f»æ5máÆÞ†ðdï;ŽAiþžo°Ô›h¿hÞËýfÜþ‰™ü“Óûc˲ÓÝ¿Ž¥ä;Ô­Hºe½ß(]¢Úíjµá¥'ˆ%ËTiaSö¸ìÃÁ¯B P$% DÑD£¿RÄ}e•DZ;‰ø#ÒcL@œýù“¢³Æ/ÉŽ1bs’"îl%(Eô¤½¨ „ÏAŽ”QÉëß½©Ò…°ÂðWA©¾Ïå%HæÅôæ%Sý’‰UP^Ûv=vÿ&à6,R-Q4Û£üNÉœjAÂíËÛʼf½Oãá·ù¢“ÁE§dG´ÞU§‰(“×(š’Ôæ¤×oŠsX«Âë·5s{˜Ï‰²ß¶“ƒd‚8{W»×¿VÙ[;¯-MÒY°Ïm¬GßË5q b"ÉwŒã@œÍäÞj»—@¨)¢5a\:A~MúXkÚ¢LZÍÆÆV·ù ½Å® M Å ½%×} @1Í lfõìM¾èt”ÐåÚUyð 8žiÞt"›¢©{–‚ê^Ê:¢s=b€â!}6©Ø€TM»ôn†[oël¬ð˜½`3R¤Nœ6ÆÂýùý+Å-Ä,°ãëû{ÞBÎá+ì»ÆÈ_vÏfvß;­ fDû U*®JfÅ<¬Øíકý7óḱ+ùgªŽY¦zdz1Þuc„+`z_ß­ñb¤ðve0Z‰G [9ÝȽµíÜ€yÀ†_7 |ô&Í.å/Â0˜L: U+OˆO"U§-Aߨp\úb„r^¯×é±Ûe•_9TTŠsÄHb2‡RµófFccÇS0-—…³€9,76ËR†X¼”–’>„’* W‰²í‹Óüv9f1z,; Ÿ`lr‘”‹Ó˜äiE{|#­ó—æô=oPîkúQR#nŸë¿>MYöXö œ:†}°§]A­ ÀÉÔ}{ôË¡¾¹· %CõX<¾zܨªÆÜvxØPÃnZŠm„¬KŒ]È·åò7ÙäÒ6TÔ*cÜ]&Éš¼Òoò“'¯ÊmúûÙ‘ð­äÐD!ó+B‹„eaG$.•s…i/a޽‚ìÃé῱Mõši¦ôZJôE7¼Á²‰Sà£ÍeÆr©GóôËS¥<'…Õr¦#·Iµ(,#ç‰àˆÝŽÎ ï ‘.é–7c胧Ëèg–bæEÎ?[¹îõ. éØB©àÒê*«Ðe¬ÊïΡ¹¦'ãliÔÓ-©râ³BîD̹çRl kö…òÅIn„ÜË)^ÁŠüÄ`m#ÿD"é­ÆHJ“…Ì"².(m‰€\æ»5h oÕvÚŠíu6Pw5ï4Äy•ìu88ŽŽFcë¢VC7Ø¢SšãR}ñ7:Šîw/Õ˜ã7mj°P7üáCŸêf?u·«ËÂ]ÖõÖüÒSN«V£¨*9I$3ÕÙ!ºÞ8¥K>b/‰‘ïÙrflP»½u‰rƒî4̹UÍë—Ù&>[<·ô2- j· ff“ð~J%7ܹÖN+.9'‘kŸE2¬DxéôðDN'äyã(²¼§Xûù6°$|”»bJ°ºý•EmMÞ³}‚ˆ ›2ϨOcqà‘Är¡,4‡exg,_>-:¤–W¥›§vB0 ¯Ê)ÃùÇ<›fDÆÄv…KåÓ ‹N6Ôë,&ʨjCöbSÞ¯›Š7ä*ðÚR«R§Ÿ λÜÀ"Z‘1ôÚ©7òpÌ>Q˜ƒ^ƒž†. 2ò¯ÿ`t©Y ,Á'ZÌÆÜÅØ?j¯_X>Ȳ6a¾Fì3Ñ£Àw X±WúÄPE=ÝÛŸ+*É|·ÙŒœž‰²úI†áŠw78\ÏúËi5MîþOw¶ó˯ï>ÜóHªÙ‰ñ ú7è¶Ó·l„ùvºó«ür?”*¼K×Á?®ó]VkÙÃ2.#Ïþ,©íPð±ÛK×ý.ô?ó`ÇÃç¡‘¢«¤çi÷ÖyuH÷(?Ì+¥Fn mNû##—<ºùµ’鳕A™Cz ðó$Hó»öù_ù_´èclƒéBÞµR¦­ ƒ‚.ãØÏdð;JÓüÆã¾ ಛ-^˨Rš•‹FÄw±1_yw à5žc{ÇU®Àß,b³Ùè1´>ôš4”^_šlñWðWú儤°/ nåcrÂV¹i²^;oî¢e—><¨ä¦‰©XFŽÉ©9Ž“Éeù 3yyiÚÈÈèâõU›ò¢…½gM+¹2·)ˆ­!BÍ’W® Ï3°aoÕž³«Ö'Á»9¤Åùdá+Ü!ÙÁö sòü8Í?”y{}솖ÙÐâþã„™X&Ùù»ÀÇꪌ…=‹¥íK‘Æx0‰™|s¨'­:½.}þ{¼¦ã®ô¦; ™r?jĨqÒJ ¸oÖûÑ%‹éL¦­~üt¦£aÆbh0šÖ«’´êôóƒ 7üLÔìéÀÄâí7‘>¡=¦…¤Ë¼ƒÖný¾ãša”°TÛ´@ÈrS8=úÛwGc¬ô¹“*Ò)ÃɘJÁü(›KÁ%s ¼[ÂbN6Ä|RÿrÊâ=÷Š}ÿJS; g1ó$í9zŸåÝòQÒxV}.¯YƒuÑðY â:“¢Æá\#6ÆW™5ŸîKÚj¡ùÞð.ÏSœ¹Žƒ]ÍTÓeZ›½ëÚüÕ=ltÿ±?FT‹QïË÷X YÓ Ê)iúÓhÍèÜv?ü¡}æZNÆ_sk´¿‚HMÀÝ]º}”7«_³‡ß‘Ê.‡ËpK¬?¨ùƒ‚Ø=‚›ÿË."ã?ö $”Lßl§’yy |Wž^NþO‰œ¼ #½’ ³£‹ ½’Œ“ÕSUÛ?»#½0DodðÜÎÎØîä øÿö†“¼£…ëS—Œœÿc'ŠóŸ¢Ë˜8ˆ80=¿Éô”#/"ö§) Ÿ‘€‰ñ_ ˜˜˜þµ€™€‰ù_ X˜Xþµ€•€‰õ_ ؘØþµ€€‰ý_ 8˜8þµ€“€ øzàm1 [Ç¿~Ó€ñeí¯zY!k;#+NzE;[cgG û¿‹ÿ“éŸfù³YÎÀÎú÷N)¡¼íóÞ-3")éŸÁ¸þkGB‘òySï©’ ‡ÞJÅõ\ô\(hM!càhD+hkì¨ÍÆÈF nòÄ;[['J ʧ*ÊÎÖ&O•äì -˜ô_9¡³76¥|ÿ©Ã'TLž;ed cl{s±rŠ l] œœ,<…lÌÌOyB,lÍ„ìܹhŸŒÅüd}¶§6Œ¬O¥âŠ&NÿR…މ `A:¶'32>ÄÊÊÎöÔ@ÄÎÈÅÆÄÖð“Óóÿ(œ¸¿@ð瀿p@ðü ˆOp°ê6ÉÄÞåü1A F&=! kã'kš À€Ì?åxRš€Ž ðBÝ'éØ(þåG©ŸJ¬xÅ× X…ñÏ…–ü¦9Z™ØêPþ‘ÒÑÎã@Œýù%È'¸žQzâ7#;à¥HF&`me{À&Ü3ÂŒì¬O£³r>%üSï §?VàxR€“…ùé;+3+;3ë“}Ø98€mþ¶ˆ‰«…‰ 6attV’…åIµçX¢èbmâ¨bkáü$? ‹ˆûSh2±æ"`ú«ýó6)ןÝWÆ¿S`eG3gÀû“Ö.ÎÏDçxáÉ®Ò&r0ü”‰²ê³Œ´ŒOÊ01³s<ñ”Ž™…‰€…Žù鎃°óÊ ØPŒÃòD¾ç¨˜ñ%ŽèÐßË@O "¼3)çhafaËõGLv½wŽÆSçi,`ò¬ Ç?NΗ(2`çÔÙÄö Œgüèd”žFµ5¶³˜À ñ¿g&ÆÿŠ2l ,Lÿˆ2ÿ?vQ€ÂÏïšÚX<™3 <™<¡¨\O”{⃸‰;‡³‰")àÛ]ÌÌ€” rrRaá—\ffÀ•™PÊÌ (ef–ЉZ[±±j±±îØØµØØµØØÄÄ^úääÔáäÔá|:­99µ89µŸ) –°0 –°0 ¥°0 DXPGL P*&ÆÆh-&(¶J ”(pD`) åK9óSx¤€Z) @§Me) @#@ Ðû `[€N€pÐzâì  è ¸r:Æ¢ P   Ô佨 9c Š@”)°%Ps ô@Ù²GHþb£—ÀP   ô´ Pk`Ðb€+ @¿ Q¶èHwí€ö¤@É9€P   ZÈ ®Àñ#¾p ù ^l”ˆ: ·\€š¥H” 8.°ç{k¼€:í^˜ ÐШ5°  Ôò `[@ ¨Ð‘ô…Ù/¾D8Ý/~áÊ Û’™ä‹_¼Øˆ;P: êÀq¸$±È‹n@Ùµ^Föl,@Éž d3Ðæ@l€=ˆ=@þþííÀ6ˆ¤/Þú·g½àô7÷ì~áýßü´þ›C/žþ·•_PþÛ‰^´þY_ä}Ø/°%##ð{²€+0*2þ9ž¦àçãï+ðÌ©Ïßýë <IYY9_;;ðþï+ðààÞsp¼ŒÍñç–ü}BBÀû¿¯À‘TD˜ó÷xˆŠïÿ¾†¿`<Øí ¼¹^Ÿôcbfaaädü1³r2‰ýû••™ƒå©îöOs n³=ý ?§ÿë•ILã© '° ƒÈŸ‘çÖÂÿÌùÏëS;ΧvìOrqüwÏÿçØ¬¬O-Y8-YŸž>s°þž>õæük¬ÿÇØ#“+`ìç^Y:=åü56“(P[¡?Ú ÿ÷ùÔú_rçŸ1Dwì¢@ $Öf{Ö[8â³ ‚Ï2½ôð¿`ùr}jýçÓ >ì#ÀçÅ^/#s°°‹ñd`ðDÖ§Åëÿ7‹ÿçõi$1€N@½Ÿ-Àñ"óÓHÿ¸û¿Ðÿ#ùÚC hç^8Ÿ‘z“éOŸÿÄÿÿÂü?ñgeèýÇ‚Ì@>é-ÂÀþ<ÛÿÑú_0{–€3 À{žýˆó™!Âårþ#÷InA€Í9ØE~÷ÄTfVfvÑ™žò™žYÇ*øC8Ÿ#Ÿ ÀJ"4gxÏ“ÞOdjñÄÍÿ>ÿwÛ½´f}Öûš²r>KÃùïeÏz°|Œƒå¯Ò¿pcÈ(äü3ú_'ë³—p{Æ\ 0ÂKax2· ;#“ ; `Ýg °þóø¬¿ÄVÁçqXŸGúÛ¢€rÑçÈŒ ÿÖ`ò Ðþ wN€M^¼ý™s¬¼æ9Z­ôP& äO-Ÿ%æ?ЀZ° q0² Šy´ƒ¿¢"ÏÐ;þ ð‹¼ÈðRÎÁò¬÷¿Ô°FðFO>ÿOžïŸ¤Þjþa À‚éuŒ}n#ò¬Õs € þ²ƒðŸø,üWdú‡¤jÇÊü‡ÝLϸp°u{Ž0¬L@{sü‘î7Ñ—ØÏô‡éúâ|aàÀŧ±EÿÄ&@é¯`ÌÁô„ó9Ùÿ¶<È…g _˜õÒ`TàlÄÀù²g»² ¾Øû/mDžeçü E^˜ò<€7Œ‚l Ÿõ^PäüvÿŒs"óóˆB/³Ãs”Î@lÿ*ùÛožmüj@Ížó…Ÿý÷yU'äÞ_lxBé_Qû¯óÏlðÂ$¡—¾Q Øæï˜õ?¹°÷Ÿ$öÇóØžmþ—Ç¥zäKÿ/ýá9Û3ñ©‹ÃÏ~üÜëóZȺ?’¾°íERÖ—¸ú2ûýá +ðxɳTÿ‚-ëlÿ^µ<ëÍö‚ìSTddeÿ¶ÿ{Ÿmù<“½hõŒëŸu‹ðÿÌÁø‰ ‚€¹âåüƒ¬PV Þ/ØþaçV}øY«g?üoÿË¿ÿ‹Ÿ¿û{ÝÔ ÕS¼} -—ˆ‰ýçhdù7DŸyñX_Øú2Wra. ˜+Ãç뉟®žž>=åWæÂúÿË&Ϩ g~`MàJò?$ay‘ú¹ÆŸ§ÀspåñÄ`±—µÂsÔüÏgC€½Ÿ^æõ¿8ÿ¿ž‚f*À*ñyåñ̰Ʊ¾¬hœzŽ//Þÿ—g³×›ÏóØ_¶úS‹()ð|‰âÿažãù3?ÿðä¯Hÿßç_+n6à îÙbBûÎ?¯f22õ{–AäyÊü²à °Ø¶ü£Îßk Áçg†?6yÑ€3ÀÀ'‹?<^µ,ñÂà3 ýÏ+çóú|‹½xÓ¿Ÿ;18"ö2³ì˜¿_üXÐõ/æ>•0ûf ðÓ^Ÿ¼p÷„Ó ÃÄDØEþÏØ…ÿDáÿYð’¿­Èþì[€Õ9`TàNpC°Kþo›ùLÿóåj­ý #ûó;Ù¿Rݯfc7Çòyƒ\ ‰‚cúU\¢Í´'nÎú‡L™Äåð.B×w\“ž ©3z~ÈÁ5ûl35?nM.Z+X¼9„‘Ì>ŽW¶èè¤e‹:å~ÚâJ•Ñ*¾Éáu“ØÕUž¾(~rç½{j¿£Û†{òvÁÕD)M •uPæ(zª@'5ÛeäAËq§yü@lÂÅm759ÐQé2jDZpvTOZ¯Å‡u½p¬É‡"9_7ZñP¦¶µ£.D¦²€¿ „Ú9‚)üW…i^X…®Ù@®ÓUÿ[Ûå†f|ºá›Š; 79y²/ô¤î+"7(óöD"$#“4Á%·…5»%Il*c®[‡ç‚‡VÕbaŽK»–¾.•’´Kø.‰ì.vyRÅ¡E3r7Íü†#õÃ?NGáËâc?"³¸qz°4-?a÷¸3[²4bÿú‰xXÓ‘ÎÆƒíPU;-àX|‹§ô·’ª«»›9ðVÛnum v>Ë‹ÉgwÈç~þjþÇЇÛݺóþÀ;Üb}ŒúaFaß ïw+ÜÉ í» ?m—önøsj&ŹÖnÍÛïZOÖí¦¢~“À‰l;.Uîc7ͨªûhRãÁª¿…µ îÆEö-6 ‡%1ð'—“õ^ Ó^¹ŽnEý‚ SäŒÖ]3d`sÑ­øèyØlai³Zs_XÈÐ9¾m«å‹Gµ°8™­Ád!òéâv/gx¢n/ê~+–È õ÷Š-,{Î^Û´²°%ê­¾ŽŸ"òì{ÌPt?ê›-|3S¤»¿c¼>’ d8]°GY¦3L°8KØcÄ7pv¿0Ë€ÑÜD(2\Iý¾ÇD«¤ïÆ›½ßüä;m˜ðv«ªµK´„÷¹Ô%?·qó‘KS»…Zàâú+ͦ £ ›),WtVÎëX•Ê›5æêôÛ2—ENÁv>™Rî킪$ñÛ‰w6¦}£ßÇi5¹âjÌMDzéz iÔú2¦öe¢Gö圦¦…5B‰l¤iûÐGÊ ÎÉspæô¾œnèÖå¤"Õòít—d«èiÊztR¾“•ÙÅT·5ªxý³.·W??( º ãã­¼ ÍE­ Õ¦R¿“\šl©™ÃdéeîÊ2 œ‡äƒ" k®¬eTêk —³Ñáõ=·i“„­vQ;ÄäÍ£{ú# XØó“š‡©ã6÷+ •ݎ¿Ӳ}–Ñ@†}xœ²fö¦tÅ;¹|”Ñ*bQÎÐý¶±D™J,(Ø\ù`0œ’héSÀ¥i§ŠHÛŒ¬ŒÙ¢Iô›Ö·+ôl­Ð…|ñnÙñ,Öá?G¨R§/Ágs“©Ö¿|¬L„ß[„œ÷ùPÍÄýéÌtoxç¬køü»ÍÇÑ&ËdT/í&A2 vÅû·¢H¹)ËÇμ1M©yŽ^7*¢Óýš³bÎ9S÷?¼†Îá k…ݨö¢ê-kÞY¾ƒUì½Ïµü±¤ê£’¯YM×ón€?v±ÍÛyØç³O°âÄÒC˜äD×ÁÞÖMÑþÜMIü&Åp½·óա̘ræìP’Ø7£âc©ÁZ(×x|µË°‘w{|œ=ú]ŸèímúIi‘OAÙÂ(f¶6ŸÉò§Ë‘¯6·~`aT 36H'Î$uL±Ž;{ÐÉ‘lzc¦LÚ¯ò·qÄæ¬k6½Æ›šÕ´d¸no9Kß}h¹_us½ŒýbWSÄgég°ËtYëtµ^S2!ööГ¼=—Žß%}íóQƒFñ²SH ‡x ˯@ øS} ʾý©ûÃ9$'ŽÁ Íò ¸Û‰Œî¤`¼4ÄÝ–c+¢Ñª‡‚5 4ÕUdŒ¯´ù©Ñýt|ÀQ1‚ﱉÿïZ&ùª£×üŸ¶%~‘&ëHúD!äç¢ß–…ÜIàèÜŠlŬ’ºŠÀ¦(%¡±õôQš ÷N„8²dϳhpæZŸSÂÊ܈"mèHΘ2ÙÈ^›(Rß©LÌÄN¼½pɆ•ù©ŒB&¹ÆB˜% V6…ð Ö œJSÙÊT™ÄcAØÞ>(?‘DByNCHSàÆô²7 NPVåsh|1WByt0„ ÀÂ#þ­Iå‡#Ä ù/·a["´G #}ÿŸø[ä¼0h‚~âñ@—.áG†’HÊuc™oxÖKHü ¹sÜQç…gl §iù­…]÷ndTW'üúø§‹¥ð¬Ñw…JÝàŠí†Í/ºz×|k*Áͅ㮦 ^{8sÖ¥FN¿2üøºªág윊•|;ßù>ßû{éfðÊ÷8óÊ·½Gà×£òÖßù9ž–Š*ü(Ä ¹Ÿ?ºÛOåÐÛ¸â“õžíqL§åȪhSw÷„‡ª=–-à‹,¨ï}½’÷8ÄµÜ .ô½é¤Õâ-Îo¤·qñºË]޵•¿ÚFkkp¬iƒ½ÂphèÌP^Û@á¦ðŒ¶ìÎÇúÒîŒ~œdÑŠdÉüf?€J7Á!W§¼¡½E³'m«Ü ¯É¯Ê=Á­ÆC’Ñ3vÜ75î¬0à"»ät,pçl2p!75Ù^ƒ÷¹¹EC÷ŒMüítj…Fòy`¸Ñ,;1§LÈvHyÂIC{]W~¯ÂÖŒª6.®Ž·MËõl_MWIRÒ@æ®ð´ÊZjýÇû*„Ùw¥nB×Çå £è!5ìkZo; Í}ôS^¡¦%0äÎBüòã=d ¨~}û Q§PœV¦¾•ºÓú" Q•ø" ú›IÒmÔ™3¢*ÉEšI:FŽ"ƒÓ8X™³GQÊ LYX¡yR'KéïkªxdÅk¶˜îüßx¡M¨ÉÙŒ‚â¯óÈ®œ³R¾ÄT2þ¤Zñ§n–C ö#ùLP¢£sc§µe]¾ÀÄ¢65~K¼ä¹ÄoÌ‘ó•0eÁzqé«Ç»Þ[-¦#q?©M\ ±ÛHµ õw}cº¿ß5l×¥œ÷ÐÍ.e²³òѦM"®ež„6[~Äâ'¯7ä0½S›‚D·Ã.kÌ¡#lCE÷sظ­oæ4u¸Ã:Rò)û æ÷ÏÿýOþ¾ÆÕ^L7÷yN†nžÂ6fjž†„…ªÕ&ÓÆÜn/ä߸|ál¾Qª«Ä\-«kƒ¿§£†×ª~˲nÉ|²ÛyÅ ß|ñÞŽÍ3Y,L)ß‹T¶øƒ˜¶½=*’}§à%Ç0:´¼lm§÷ùE;RZz ­§ù¨PVìpo|URz–¹ÿwÜ,Èü°Á60GX†ïøž]®aHù#”¤\]¬Ôõf]WgÛ9 : ç"@ïUYJtGü™±F2 ƒëß:›…ÑcÑŠ¼áåÉŒçõô°sÛ>jÒÍØ ëÝé„7­mëx>?ÒF†h[Ú«¸ŒL¡½Lj‚‡l†h¯Ëj¯ ¹õf¹úì{>û ñí°­…¿ýiñ–qŠ¥›f•K¥ÍãÄM¿‹ö(Ž°Í¼¯·éµð7î%ÍP<‰“n”á3ȈC„î2(XÉ!"ßÇü ØHh5C¦¹i ÅK¹EG±ƒ-ª$ƒ_ømOÒ$¨¬ÂFfF{NyAy‰oŒ]Å=šøm'É'W&G é„yµWïØ\¾7Iã¡R|£©Ö@ë1fªL”‘䏿É]nýdn™¨kÚH¡N¥F[Mðaìœ}Cºa[Tih?“ ƒ”Eë[HŒ‚8ò‰ïË;ß¾æd{°$îÖQJ Ê(†R­'E}ö’VSšLÆ®–™¸ˆ€£Ç«ãmÄullûQòy2Õ!iq«¢!.s»YâP©·‰þG¹Oôì·„µñm×®Ùé ]1i¥›á!ª†OÂøW .—³Âd>ɆH?t·ƒ†ÍU ãáïòáîb>,ãŒ~—¤Õ>Dæõê¸=ͲC>ƒh麵öÚŠ9—Ž?wÎ%GÇÊп²¾Iµ9œ™‡ç®×ÇŸÚ_¤›-‡A.„ͼÿ~ñ}'îî7 Wÿ¼¨Þ_RZ¢/^`Tîòò\w¢Æ@ž©bKpW¢šCΩFH‘(Za‰p0J¶ŽÑWn5ÄŸa »Æ#sôú`¥ã”{e<¥ü¦ñ.]¬°¬y]’[Öã{]'E%E¾¸¶ÝB9ªª,Õ(R‚€‚XäjŸ,yŸ<:el8êýù9†ðO(±nÎj?¦*ðÆG¬øòz$W‘iüÔŒhšo±)†küßÂPØ™µ )LmÅÖüÌFTþ5àGéÈ5º¦¾ôÎ çè6d©Ûçâ¶ö]Ï$cÌ`\œögµRâò£¹¦Måš 8­®¨t?A+诬O%ê Zï`¾É©€§hÿÙÈ#Ÿµ`pE!…%ƒ%‡¥@¥„¥‚¥HCÚš½š Jö:ú³E‚†ãB1¸5•-–=•#•3·`Jo Áé›öÜÕ\°<Â<¡<üÀ¼ïymy«y`ùD”é1ê»â¤+Ê'hþTÆÊÙÊʤ*&*Ù**¤ª&ªòÔu_tàQÔ²!Â,ÕiÑ)¨}äRU¾«ä\¬k’Î%:VuÀåüA°Gu J²øm|î³w5×HTÕF|“aïÏßaµÁë_§®]-ß¼<"Wا‰»Ÿj=‘I¿åSµ=”Šô½žü^O^S—äsØÃÜqhžÛWS?€x«ÙýS¶f€ná`ôÀvéèÑnéd5.˜7Êj‘h.ǬAwþ²½9øÔWh#°Pïõf½eì7%Þ•[bÂñuÞfY]û –Š”,j¥–e”e®(YæTçç˜|¿Â·öh+›áŠÎz”ÑušXHßš—3t²D ãaV¶î[œqîqôt(sžFÍæ3/N×J8ÔK2™Ûz)Ü+H\.­ˆ4@qbœ–ZyjŸ®GÍô扤Zq@Qifx§ë8¿—Æ¡Ü ÈÌÉœs†šH– %Y¢Úg¶™ún³î>Æ9á°Ÿh5(”ò 2=·À¦älÌ(.²?H×îUä,”‚‚Ó]NW¨u’î÷®ÓäE®Ÿž²Î)£7œ.»{%»* ່àî(xª}{?¦f ˆëIå¶¥v„(…¯ø²{cï2&“UIVgÚG^¾×ú9¢„êHh+ÑÈ(}¸|—8ƒ}ÉQ‚¾”Ù$õ{ª­^›·m…x~qBË»ËN“s¾ª=—™©ƒ˜ B"Xx 52-_d–ƒd(ð}ÂgQbÅü`$ZÇ‚®-Ú/:¶Ú÷˜_6_Ûr{½× [+<±‘Ô‰¬…h·1CØ“~û-« vൖŒ­B—«>½t²'áYU¤ëõ[É#Ô™“¼«’ê[“h÷hvsî×]2“Ê#vry*E¬e¬U¬µ¬*­¬¬¿TúY‡UÆY§Uæ'Z?z Å Ôõ‹%³BD p¿K'E¿§þbi—Îfh1·Šd­T%³¬Êñž¹ÙDwÓÿơ۫ÿM=;ùÂ{—ŽãE·î\w·u¢+tì+¬ëÅŠÒ»©+ì1YB÷¯­m°°ä,8Ó¹«)án\Há4 Ñs ¨noîîõY¿ÙÅgOa kÑdöÃÛ°•CNòZŠN+â’ÉM‡ÖN؆It{tãÖ~C¬%rhÖí([qÚfÚÿfWÖ×Z»<ñºÑ_Wèn_ô¼>¸4îx‰Záî´³4Q»Ò‘‰ †,«Ì5³,ªBf 4$›¢¦C½“äé ŽyFÖdI‚Y¸Æì£Ùëa. ¡4Ó¾ñZ5,þ°6á Ö·nSÃá]QM1OžÞ„6¸3˜ÀÈK/[Öêl> •ÚgŒ•\ ¥ÒúRŒÔ¸‡.L×öÉëHA<>ÐñÛ—6™ipè†fäÃ5•Þ!ߪ4P½³IK_4x€˜äŸ/¶­F“Öçn7uƒ¥a|_–P½ÆÑÆÞvrXa—V (¡3j~ØÁŠ4ã·V‡U­©˜â´‹†þ¾•:‘tú‚“ ©­dñúØì:…c‘è` —Ü$' ¼§µKFØ^µi÷òÝoÄ·GÞ§ÖÅÝÜøwLìÆù>SìîÝtÇÎÔoÓ~T"œ™âtY”;èÜw]×^‚´Ì>Ø>º_þ8Òmô>Û=ôÁšnò¼ß¤C¾÷<ûùÃÍ~±Ù³ÎƒV8i„7à¢þÇ=JÆ-BÌW÷/§4+ ÕŸ¤¾éTyÒÌö[ö¯¢¨k¡ùôÀauP…õ!êª~_ß`‹êü¸¾)â^Ä^½j< º™œ/;’R^å;z0šRÄ3åœk *Œ‚s8¬Î1»Û ª«ã–™w]RðÃ*ƒ¾ k1E"Tò“l(½'¾‘ÄL ©h® ÕiéÊ\•À`¸¤TR‚}\Bò7VF¶…´RéAK'רÎu¯æm§õæ•ý^#F®½ŸSjvXñÌ;þå’ßB¿Šy$Nt å J‡«XZÁj*eÕµ]¹µ…&c™üHúFʸÆÛxïKDð4R›¡+N¥8X*„Ë»×ÖÌêá´F{‹íp}f §¨·)fúLCûø_ݦ½Ph\ ›éÚÇqµ‰µ@û üáZºo•XyôQ…©ø—W”VÎCÀF· ±ŠÆ4 ,Z·Y+*ñËk”è¢èz™!°´Kx2}:„S=µ7`z_§.ßd;bÑÔ˜ J«Ïñ~e"8ÿaŽ|•—öΩ¢KÓzçR™ÙÍ#¿cNÂÍmuPöÚ©Ör˜ÚË×vp&‰š«µ:Î.¡F:)Çf¬Ëb¯êúÂÓ×Û¯v0 /#Éùpƒ‘DÞ}– Åw±mëmÛÄS­Ÿ.ˆâ=2–¢‡—v´5ã·îP«AH†kÚhÜ™«ñ®±Ðÿ²&³…¸ecÈ?Õ9÷æw£Õo²¸J™N.øLÃG2Ñ`—­† ”ðÏmÙV$iêiÚ«úÚ,‹:òaÐ|WOkH½ƒ‡zœæØŸ¸xàF™+'¬d Ñöu¦Ûª?ævµ~´L3ë¬Ø;,PAç÷«¨NrM;—Åqå;ÿ˜¬Ï™-ÆúzA¼U«j™²Á5«›+”¥)¢åèÃ9ǵäÒ%Ú"¨XBÚxÉ2;1î1•H_,{ÛfqZÊ+áúêè‡f Ô졲xNT;˜xi¥^މ·¥€ùY&£à {~aç7£”b*ògÓsåPAŠÆEÁ|ð\!Û”³ä‹«7ÕŠ¥J›J‡ÌSo—ÏÉÛÍ@ÌaŒgÉWÉÑÖSí?þü¦5%1 EâUÅbvÓ´™Æ19îTûñãé¸IBvÄÐOô¸`nÐe»²¡ÂèqâŠ?¿Çy8â(þ>ô¶ Ý;yш” fRÞe‡&èš4ФÆ‡)gÂ}ز/ú™G'Í3´_Ú? ­_šýjàÞãi÷ ×gÒu#ˆêºÿ¼`¹­ìªØqÏ WÏráˆë;›cjy?Ÿ›¢;+zгjúc¨Æ—òªãÖ¿Þ™ýv{ÛÝfõˆùøJ㪫²ƒ7®ÉjÒJŒ!TÔ&n oFO¿Ý»„Ò0–UÀz2cÿ0ЏåàǃÕú9žÓ€NvZǵJ¾Ðq6<>ž`»£Uð„ Ƈâ¼Õ ZŸ‡B„BàœpZ4R¹Vþ—|ë¶p&2¸Ž7Å{ ÿsÂQRÞdeqJálHMÕFsTwºí-Oo²IÚ°ñ€É æ Í‹-‡^…^x?éßèÝʆqǤq(‚DqÓ`ܱëÉJûR8’8¤²œÊ´} _I¶¤I7Qt )_KŠ|²-“‘£íÐ…q~…µÁ‘-ïâÔ”Ô˜t º®©6£ÀMÄ|=®ßå¯Gì ;âÎÆ–É:òï.`ÈgtÐ9Tç-Z,6ür%]¶¯Š™ë¯Z\xŠ×¡¢T? ̓ Á²\¬œ%_A¾ÙûŒGºÇ9IÊúÉ2Ne’¤˜¤„¤”¤Œ¢\Ñ–A—šÖÂFQ‹ªEÙ¿rl„tFtÅd‡Uºú a D †(†H°Ä'‰0‰ˆ0¼J"ìÍMŠzé^éYéÝÆ]fJ–X[šE‰ÜhEl2'E«Ñ½¬é¬™¬Ù¬¹¬ùB×hÏLßÊÀ¤!±­x[g†1JL¸!kËW£æÉ7³.>›ä*ÔK3öhSj–¤wþh—Ì0ø©í¾P+M»–*‰5ˆº{à{ÄSÁ“Ý®ò)wÐcÝ¥téõ`ò?ÒW¾¢væÑ•fé…¡ MÄóݦŗqwzÚ|¯ÀñfÎ]iMŒj¿ ºü¾{ Ѭ’ÍÍ…hæóKfŒVraÄrûœà,ÂraÂjûÿ•küñ°Á]qÁÂÊðÕªìBôÔ RÖêQöh–Ær¤ƒe­JèÍ´¶æÜ³´ßnן³Ö6 z÷ð:õ«{Ó &ÐÂÂän­ŸÛ"Ԟ͇V£…œ5î?ì’^¡<è—™rþÔN‡žƒ ­vÍ€u¢à·Š¯§½´·_/:Ot{fˆ¢¾Þö_@bÙÑ4× Œù²v–cTûÔ´¾Ÿ z iÁ66~oH´›«wž#šë,‡¥{»–öœ¿È[©NØ"OBùü6Eµˆ,&°oC²7­¥|Æúü<4m‘çO¢©lÝÞi?ùŤÃ>æ+œbqå×õåÎnFPÌn†»^e"QèÙ°où…±ËÇ"“üüHó«í½?~Øý"#ä¥48Q;c¢„B;­XÔ£ÀÕ!Þ3cÊEÒP-òÉWv—ý)àgИ"m) "ÚX‰rH‘ÚD‘Ewâ´DSíðÒLßgâ¸SeçBCF6*TZ˜¢óX1‚Õö>‰vTè ¥™OmòFºfH5¤kΚ ß/'B7‰*†Ž{¿÷& úa¬×2íœÒwÔ{!€lcJÇ|ÔoG$£–a!2Ç0ýþš¨sŽIEÏÔô3X9Ì6ó<ü°S4ÕØ—…eWý|òr|a–°_‡Iæ)jh†¬6òê± …ÌGÂ4HÞWüGÍW›‡÷I SriT{øË…~#ô„÷^W-—aWGzM Z'<ßÈÅçh¼PïüoÅMö®‡~wô-9lçT]wlù1&ų\E£ì~ô`®#E€±lð€—ÃÕüˆõPÙu+Œ2|\/dWÄãL‡e÷–“j> ®Š}$[’רØ5Éo;—¼~õË%‹ÆTç¹HGŸ¾>;‡§vw_’9.NåXFeÞ?¹!ln}X‹2¬`äî<òé\mš ŸÄíUœÙOü£=k¡kYº²}C&=šúv×E¼ò¶"ƒÚ\Ø/¾»s:¸@­m±s Õ?w¯½QfºÚÚümRÒL•xK<þãÛ•ü‚ßâÆ÷Ëcµßè«›aäI[~íváZžf­ô7G‘ìºà&ظ0¸‘ 9~À®…°-Ó]åXéŠÏûØR|rÊkÉ„¸'J‡PÆ2ßè¥Îä°À¯»£…wiÑ)ƒîÔ1–£ŸËB:i³Ë»Òÿ ]HËu¢*+Ñä°"}ú$4ÙYO–3S*:,Xš_:A£Ž‰_Ÿr]§Ó ó´&£t…nÀÆ Á¼.¢(Üæ]V1í{#ÃÏ+U%Ië&•˜ìß:&v5¶Eœ!Ñ~d$´ieBw°Ç¡™ìaa?þ°B`øš|½!1Æ¿Ö%ÚÚµóû·¯‘µs¢KHHD(eî½Íq#=Ë~Ó%ß2a]ÑâzÃô{ù§ÎtÉø¿#|÷j^˜‹éÐGøšÐÄÇêÄÐÿ~÷äë/>ðZ%éW!éŒå[†7å»ÞAsuïF|}Ìðdì䨠9(›¡¹NÁ~ë~ÿˆ$K–½øûÚ‡íí×ÙÜæ´23ë™Á#ƒŸ¦Ô‚gíÐ!¯‡@tÄ ü…x‘åit»ø¦æ¡Ü­&oÂu@‡¿xƒY 0­N$ú‘ ë£K“ÛaO@…ˆRW¦0ÚïYtÁ]v.äš 2FØTDN‚lAßb‚oÊ:ª“M26bº­~ÿziB.Ò"ñ^] uÞɱ·»¨ìöj‰ˆ&g»}7Û€`úá!ëf|n“æWàɣīÙAˆeÍeÝ7Ë'¦ß_—™OuGBºŠ¥•AÕB§ikaºV7û¦u Qƒ¦j  ýBPæ£ïvÚ)i:l*goD@?M(©\°`a rµø4p LJ¹xÍÿ`øT„(Ž4}Òì ùn ü[Bäí ˆûVí~D¶ÿ€ø…” ô£¥£-±z;Ávm»·$-k+éz/–(” %ÛøíŒöZÑ|zPJ´=×=÷²•òj} íP`Õéºe y"¦¿>5HÍ«KÁ›Z“tH)ûÖ¬ò rÿ­•å…QrNBnÄÔw¬²¿Ð±ì[§€šàhÓW4{IùGm‘\s$o¶ç²î"|æ–vŸåƒOæ‚ARÕo8ãðóC“جeBO‡‹/él}æ…ûFµŽ©$®G¸ê—&¹9ò›¸Å iëý0ļ.Œ}¢É¥YCäCxµû˜Udñú…%„Ϫ8ËêΣÝñê¦Qà˜Ëâ‹Ê söä’NNàÊ•±¬`ÜøÙžòŒÍI¸žÃ§[è‡q ƒ„…s‡ô+Áô#íç6ñ¬>j„­è¨NrU)V©œpö™=]¿pÁ ¦?Àþ:|#л¬ËwOæm§?@Çw’×2d¯Kã“Ì‚q5É™Ëgµ¦Y|P.¹§¸Á@FJç;%x\Ë30ÃÒ–ÌáªQ6û©±.­¼ó×—: Иo*š,6¥¸£³þ™ï~›y—ðªÆƒ,‹-Öq«ùïk&¥¤¸CÅ«?.RPÎÕ‘µ*AG,ÁÊu' ¹¹³ó Ea‚çY5×q ¸_Èf¬.S¢C2|r ÔùÊì9ÙÖ=­žÖ¯SU´ßO÷Páõ1‡š”u@…¨9-×WN8 ¤>âêËÔý]®îRPVåz*ˆÔЧr™˜Ý€U)Î+ÁÿrÈOõA[h£$µ9ÙDJ•X«Ìc{›5ò&fefÆ,ÕõÔŽÏlí,u,Ü2ŒTœxY¿.H*ýM:ûíÁ0ör ˜z6«øäl¾šÿ[š×ïÌfÖùˆØHm6î½ W®D z!\ó'ºîr%„u'±·_7h]ÑTxÄ›Áù²üøÊ»q¦GÊs¸–ƶž¶€æs.P.|dù6=ÜôÜÉe.ö«ñ§Cxq*EmJò6#›Êº ÜE9¯¤Ÿ\ÜŒ}R§k’­‹-ê4V¿‘6·\ý@YúÃÃÕŽd%üÇ»¾&‚~wôœõÕZAóFuyZÙÙï ÚŽáAFã5 ®¯ºv<£ðçÐõKX†îpÈ$<‹«r[_AŠàðÈ×í£Ò£3ƒpp,ù$Sô~Ïu;>w÷Ï+ªÁ…vK¸„œ4 t×*PÉÌ„’†¬HÍîêñá¦YŽ4$éÁWiçÐ’PçЃfwS×ð!á K[›-`¾žt9×¥Ú?>Ñ©¼|› I³fÜ’9í0%Ì}¸tÃïǃºÌëàƒß_iDÂqª3dÆÖÜzÿóèEöF;Œ½ý ”ŠjÅÍû†ÒDz›]µ[¶½(ô ×áß‹œÛ>*b ¬ |(<š°¢V?sx«fwìb ü«#””@ÉbÝÁØlA¬JÛË+@†Ìêbµii±/Ì^õ'&1ó“|ë“Õy$·ö´k¦{39“‚dˆŽŠ“T³zS ãoÒm^J²4Rfcâs¡n Úl» Ò­ê„ÚñfÕ4Ðtíìu=¢R'à€Íöc±×—èC0([|g‡HB)œÐ©Å/§1Â…¥¾’×2Âðö´A¥?&ØK· GuLØãÖhbeôAû‚­·†¯»+Çë<¡nÇZŒ5 EGz•‘Û•±Ú„êyÕ\$xŒâ”g—(‡-?씂x!«§Ñ·ñ…_ml¥n,!ƒ`öö®fLÕñ•ù¢@I=Œd]NW3i~“\òŽ›Ÿx[×]Ò@Ì*ðãÕHIX’R²©+)áÚæöâqQÎÐ\ piSè{h-ÚgÕ6aoßÏ碧m ÀëZFÐ-Q›°SDYÆšÆbÓífÓ*$º<â¾ÍŒw¼á€âõÁ®ž‡ºŸÓØW×HªSõÖfj×Ö’Í·K™3† 5•w}_ÌÉñúáÈéªîûÑR9?fkýŒÄ(ÚÂÔæÔ—¨RP× -/i1ý̆: Yóåd"”OÝÞBCþû}ù eA‡ª"íG„ªÛ­…2¯!ÔÍ”|ë¹ú[É;_}Ûó¿"hóàÄ )§'½æLï0Ü«¶‹Óˆs$„L›«ÙqŽš€‰ìS®ÓÆî¡!˜Â],²ÔÃFýF‚~næë“Æùø‰ZÝ}x‘¹O1•U7Üž!Ž˜dvkÕ6{x ôæ×Þí5F#ìû„Äᔟ0i\…-ÒÓ8äcظw$7ÊõŽTœzë…Î…U‡íƒ¬}E]¦»±s½­Æêâ¼5} %•v>~XW1Ñc§U¦RðNjÉÉN\ÌQŽ!Ñyò5Ì#‡*ÚµIwÎ{)Óµ!}éÂWï¾¹:*á@ÍTfˆœÑlR.nLcõwH¬ÒÒŸ5Q IJ«æ~)|©³Tª 2ydzoCF‡å>õ;û§sQe9[ïô‹…Ï–†ur°{ùP1jþÒQéNÃÊÓ’ÙüÓU8’˜kÔÚ6u½öÑn<ÑkCÒÚP4õeƒtÉ.XªVò´Ü2pná ±©­¶:õn1;tìÒIÇÂè7¡cJJðïáûÄ]ynàÁõcAºÃOPÌ®p”=Ïö_É̬ì¿YƉÁ¥9)ƒ÷ûzV=Öúº—Ò¡ËÕ¾‹>âäÞ¿²h¶wú·x²Éž?ÁÒµZÂçàu:aðqQ¡á Ó@#J—VÄÆ˜ÞØxZ×:rúÖ¹ÚêCæ›nF•hë†ÄÅ]‡¼Óœ¶fõáVÌö:â m±Ô!g+GØ/3éÕµBÐ'E8qm Ax¿ñ&Ù{ æø¾ã¾oì¯ôÂ3ü"Ò’_bO}Áöþ¤Y˜²'îœexR?ø‡Î’QÓÚ•Û"O(ÒÚ•±¦ÒE6¶uÏ÷'‡ó¶J#ÇÄ@r±o æ‰7º‚.õLý Êå™X/'¡õ´h¢L=\…bD_ +°Ç}èÛ¯í9÷#NÏkÓá0,… ‹÷ÚÖ…µÉ>Ý3»dêM脈ڻ½Ï‹k¼µ¿|LÙRÌÅÂQ’Mý9„¥X¼èl5ÂyÕ”¯wê;R£SSùi"®µ‰òç±>-¸nÂÔúï7¨{nÐEr¥|ˆæ¥Èü΢A±o|uIn€p)=#àQ›?ø׌’TIâ\žÑ&?âý3s/\~¢Ä †ƒÿö+ör"sÚG òýS‹ÊPôzSãÅ©*ê¾\Üå áiPí{’„pËÃÐÍ+Ù“šhž¹Èbeéi•Áìïð¸rà2©Æ–^‹kQ © ';»8êc PòÖìzŸÃÍñò*“›ÒMj—Ûàlàá,×6®¸Ø²OÀaFv›󃮚>¸L±šªêÉ• ,,®šµbŸT‡Ü¯P”ÅLìš9*[Øi£r1>&º«+ ËÆÐ·^˜K8Œ‚6íè› ½YÞ¦E¬ú¢j£"“tïC+³•[&5FÎÊ%ùy07YÂõÒ\÷ˆÛ&°·y¡É[h‘M®×=9djÝ„3 bk³·R¹X,¦K]’/ÿ^¢¶pÓ+ µE_…Ä[AՂ̧aj.îwò61S+¹‡µ}ù›à‹{d³å³ý¾³úí뺻¯(WÍ•ÒPn:ÛÜi²•ù©»"ÚëtÕü8!¹¯gâs}Œ8 ÛÖCvyïB|]JýõF©ª¡|?2/NùgåA}¯e`¬«Þ¡‰¶•ž³htrûqávºA8K$TÛ♜?Q³àLG^YK7Ò:Â\øëär+Xû%ÚÒ$v}›9AŽo»Øš vTËõû‡ÊG¯ämä.kj@ ÅRiAÁ‘öðª¨ÑÁ¡G4Þu{u ¾ÞhøxÈâ‰Ú„Ï!°t3ÿù ¶¦ƒv¯!”Çu?Êp%I ³[•Ñÿr³}aÝÞRÛJò¾Ûa»ÈKÜC$eRz~ZÀyóbε&K‹êmcÛ Y?[É÷K¸j!ÇW©ÈPc4âñ¦[Sª*]š+à4©#Pi…ê’šÃYÌd âίþºÛÐ)W@aböG9aú1¨UÖçÑcÍ^¼‰yR;›¡j¨±Qì³Ù [,ŒUd6C«³³û †ªåZuH„6Ùa— 8ñTºÊhRçÊS„2â!u1)ÜðLÐŒo±ŠÀÓP ‘ ’ƒØ?*BW7á jA%ÀBf0rÕ‚Frmiôy/d›çè^-çU¦p7æ3¼‘'Â×§£52³®·\X1ÄpIvøÔ䀂xJF`¬¢¢ olâ¨aVÚ”c?5úJ5Ù¦²Ìô¬ˆV3§CP’jàÒ¬ Ò9®ƒ@J@þý{f¾õ‚ZÎU¡l u“„À&|írX™Í"Û°8¨ÕÑCiý¦I)Ò€@ÂYŠþN(é “(^rMQ~è#›„w6uïã25Á0ŠjA±; µ«B!¬âð%b8Ì 1LLb(’•ˆ4n¡ Í®ü…I=]gV‹…8ÐÎy_³éxÅ@å½èÑØï¹tåÄeä²Ò·då@ü/aÃN¦¨"žªA³†ÑšÒç¼l“nžLX€8G´žÔƒ ûF~6çYWŸúiÞ$ÓÁ®ÍþV ²LÏþˆQðšØ@2¡myð=´Š‚׻ذ^™f“~|Í.ÉWÂþßå–W)mk2 áD¶ƒ‰Üs2e]J„Ï­Xßuë;¤ŒŽaÀYc~ó—œd–$€ˆf—i¢DàòûÞ«Ân¯MÓÆdš®^3g±—Ås©Ièêy áZeÉd(ò1[[Š"9råã$oÞÇv0 FAÏ«Hü~-*¸Æã yÂa72ÿK¨Iï(…“Ÿ 8pÔ¥ÑW¢ÇZÅ£”9Q¼ÇÖbb dÝÂÄ¿~BYGfÀ‡ˆ®ŒÃ}'N¬$A4ùbÂ^/eý!ûä©~E t‹]€A~•­Y46ö>mYï.<…öªY>*¤Å‚c_™~"n¦Šwk‘58AŽ 'ïo°¾™Š¯QŒúòœ8…ÈéIúÆrË7Æyæõ¿¡´ÃÞhàQ'×ÌÒöÿx¿½S]%ŸÄ[ àÔŸ“ÞP²Î eñþƒý<¦4lÈ :•ËUª'½®IЃàÇñIJ×Ú“‚x$¼ÜÁHiçTÃÑí¡~‰‘zÝ«$Z6}M©ƒs}!–Šðˆ/XÁm›fA ¸Ãìy™ÜA‚^Î`‘¹ Á)¿êÒ–¼/Öç.;ìŽôøï_óÛ=þ>ËeÇ?zã}³Ùívõö8sëêŠ~ÈN7 ʓț*Ên~ö¡é÷Î&³ïïhìǦßz¾ÁÁ~`7;1²~÷G‡çš4YF)cøøfíã±8±ˆÍ ïË=¿†”6\?°Vè6áŸx»³ê11…b!ý`´sñ‘Ϻbï]`0Üž®˜ñ’bEËŧ’§Dë.@Ëë÷ŠeÅï‰Â¸|ãxþ擈T ê­Á1Èg¥IÛž83ûŸÕÞãØø…|'’ ÝBeN?XUF ßgŸŸU—J.G«Ik¥ :öy±Á£HE¾r’™’-$< ³ÁŒã5gDã¯aÅ›°&]è>ˆkŠu#éºñ!˜CA&憑¯¸Ì«ÏR&Kö0õ“FÕÝ›úr¡öÞ4ÌHè‰"rL´†AàÌ}΃ZÂ].úÀxë`ÅXøQiþ4¡*Rd9~ŠxÖº­ÇG¥ÁcA@L_‘¦|N?&F¸IfŠ–“³»¢ò¶ÍUúmœ–i\ßž³Ãå¯BF“•Eƒ_ÞŸ õ®ñ(…韃þ@Š,Œ'ãçâ×+Ï|—·aþÁ±÷Âö}C¿gïÁ÷Ò´r%§¼q#Êq®nmª1^Ÿíî1ìÞIzî÷¼Æ³‹ÃnÀ!Š)Ÿø½ÆLÎkû‹qÇzé•<ÉG‰[* ™åâÄ”CŸj`¶>…ê†QöÖ»ŸNˆ]YHomCè –ÐÁ¦=Ì÷ñN§ÔÈxO®»ÒR½—êÔ5„OSè ^ËÕŠÃ% ¶ô]xÊ$¼Z¾3gu‚aÿ˜I ¥ªYé‘’.šŽ„N#ýUÓÕógm!).Ãð&fæ‚õ5ºÒ)ÎÏ8>Sr|¾7› …rG>§kñc¥ ¼7÷kcSK~7¿ºÇ2–šïŽ7wZç[ºN½n·èñyøî%ÃSÔ2íZ¢—–Óö{+"¼…9WÍŠ{˜à0vסÞfP.‰µ~-Œ"”Š/û%[L:Îú,õ#Û0ÍÃhoW9ÊHÉYê*[šxYrÓ¥VLÔ^-öTik„ àm®• H ºf%Îq4°&áuV`¬™ò”$4~?Õšy1–¯A®´ê@ȆkÍÕ÷#N¼ø]ââ»Äçlʧ†ã Ká!võÛ¦ gÒ³ÔvvcvM  4¡0LR¬<šA™Í÷ÉáƒÇêñ Û¨d^ÑÅ •7ó]^^ƒ¸­¤P"T;Óf|ãR¢}=vÞ lsgeüòwùQlh ãq*–»ÎÖ}©H/Ë»"Nº0‰Áõ‘‹K¯]BÌÿBSž[¡‡B“ý}y/¼nX¹íò/ I}:kj<#Nwgoò$Õí£F÷¾¨ÖÓ_¶/û¾`3å?µ‡.x*Å¢›3†aléšã¤ Êê.A&JYàh¸n8'À J5„o]c¿¤m ÓRl'ÇñéÁüÄyE1t1ÿP'}¸äs†mÍžHÒÔÞØ# ïû>®áü볦‡bÃV°®ö˜Ñ„îRøwˆUç±q÷ml™o­#e'$øƒ#NÍ`çˆìɷß|{°ºQwkùí¡¶Ê`¬”Ö$žR­¾ˆN`6ÃDo•ÿ¤:ìo4·aÅ0þYCÚàTdÝ·¿`h>@|õ¦/ P§'fVüeÎ>w Ý·7”¥¦åAÓØ›ª/åÑR'|è»,Ÿ©’Ÿ²þ#l'@5€ÕÝðÓ:ÿ(´³ÀU‰ÛpÆèñÙüDŒ ñN <Z&8az?Á¬¡ Ú~BØDk"H3ô솮ô™YÖvre Ì=‹¾• ç¤NÀ»8ñfYééWÔݤúœçµ‘ßÀß™ù¨jHõ0û%ÞÏ‚ë…駱±Ê3ûúÿ|ýyQÕèÀŽŽ ›’<Àdϰ˜®ÛÓü¸%âÑ^éžÓA1ÎV˜ýu+7Ú:J%x¶s¹Ë¼Ø¬:â8B:>fT…dËa‘ãÇlZpÈ ‚ —rÕx#^–'½Äà-TÒä“ãý³'U+rfQK†«ydåg5\ФѧåTý¿µÕwÂI¹E!vCN²]Fñ‚C ú[ëMl¨##â%]+ì0æË­„º w;TwÑÙB®ãMP'„ÅšâAéb1«Û[q‰‡»P¼rï|E0§è‘ïD4“òª¤=,I_e°ƒTŽOq–âãÄ5Q°©†Uæé# ÄFߨ#Äm‡3φúß-…^æt“o«Õ‘A?Z/=ž¼ÓK»Î\Z™_{´þ\ÛÔ»íÛG€IãÄ }ÁþíÏUÞVû ‘h]\«Ô´ØšíoM¶L™Ž>ë±ég«阩•.Ò×Ù^P [¾-åª%åŽ÷¯õAhêIþåçI˜ÿß~ž„“‰•ùŸ¿NR¥ÖPBS‡xx†Œ:ÛÆ&¢04¬·üëxÓŠCa¹3àq1¦%ÿü6ºÁÍV§@™&Ÿòô{ÜöÑj%êҥ懇7%’Å›ñwÔ¹$üDÙl~öÒw7÷{ñ³VuŠˆŲ×|+h%ÃR>ˆeºŽø:ù箟hÖ[— 3ÃÔãpËiu%ü£'(Ô! â ?>p‰sêõg§ ^MvkÖ$ï´ž–žóhÅpÒƒ¢{—‰Ñks«æ´RÍUƒöÃÏÿV…;߇÷ëì[!»‚T§³å^ÝÁâ)ç.É›¦NßÏ\ÒWÁ÷þ¢Ñ‚ÂY—Ì ¸€“ØÞr¤’¹gVŽt£Á×oto)‘“kM0t&@®Û`VÕ–€… œA€Ð,‰ãlARdÌfã¤Yf²{ê:®œGþ1g(õÚE2#O¨/òt`è§ ßãþ²ï—‹(ˆ‰¡R›GŠÍ}ßïÆW1©õ£Ž‘‹”! @´×Õ *à0(b•@0ò,}Š6LŠäÇ·ÞÒ@וEHÍt#;(Jøða´ˆÊqGƒÍsiÙµZ2 ½WoÎ1Ý^nD ìôËd—Ù~­‰  ã[$hŽaîK0‹/^ä.{hé8ïÕßZY`ît€²Úã€D¼%>)òμ=§þ½¹¢R­ÊîVãç¿¡CEYèwŠ!Ú$˜í™„† ÝÞÒÉ»dx;u7WUö Çr}ª‡êCKŒ«R:Â{Í·{c EÈÈqAuôk«® (’˜zgGµ»k‰…V0î"qÑý¸ŠJ»ž´ÔêV»HïAÑÀ ³—ßrÔj >À0êŠ]$ªÛ“` ‡ö>HÞ«S³>éb%€K]I[®†¯O/Ï€·?³9§ŠVšu÷Íà-’gL¶å®¬†dífuùº&.Ì}5„ogMç>+{ßÒp׉‹£dÝ*¢¡d9žf”z_OIƒMê'µZŸw5z*t[¡ij·÷þĺ´#ª!x[±JÇÁµÈ<ÏC6~´Y._ØÔfóòA ôÉŠj*Fžš¶ÚïÓë­BÚ=\íµ¬ÓŸv/5÷î!ûyßßL•úÁohv3èa@òôO~ÞGhÙê¨àh_Åü©]cš¼n=¶DžÜÕ‘ª–6R²h*Eºæ ËƧ V…š {å^¾ïf⺀¬ŽX%¸ò¾˜œqräò0Ì/qÖR§HjêB™SÅØ¥Pô‚œ <àRŠ+ë"ýR!qŽÉ )6Mɺ½õ•RËÏÓ7Ä?£¼½§B¦ªžjãüÖ’Þwõï£Uæ¢a3úî!­ŸÒQ\¤,5{Iñ !O”_M$:z±ËHå‚2{³5–W'vªØ¹ÜªkW@äö`eÛ¦éUUê9c4.H;¿Êž¡Žn×Íùr¦„h\¥3Î}¯ÑMsÆ©ºª*¸‘¤Ib»ò×Þ-‘ý'b߇DÅÑO:~æ²¶iá÷íÆ(ïÒ^‹Ù§,Z¸„†¹U~JsøQnM#™»1÷óÁ(žä›ê¨Äc‰à§äR3eQŠÍÝ_Y|3Òþ8O©Æ€Ü¤£ÃpÔ, xÆä‹4œ¢qÈÂÕo¢ÝÓ#`/èTÔýF[Ë ¨}<:™<íD"÷¢·³xZ¸”O‹2[5îÖÂüx¤óÖ'‡_|y gàˆ:‰-ô€Š² J¿ûôêþ»ð…ß)Š t{3ÙMH¬áy!¸ ( BêÔž1íÔ¶«Ý}ä­ÊßÕëûx÷„3•p®H[ùpÃÔLÚšED§¶>(…n÷§ÀÃäNëý,§ ]è}¹TP!yüå©y¤‚YâÉѽ‹Ž (Ó˜r…ÁÙÌ!ƒíû÷Â2õ*ùkvz‰yH"`:©}Ì®Úñ‘=àEäµ¹Uàx2Ó{ƒ³£õ³Á°Bù.åqñFMÇzPo4R&Ûrfš˜9N|9Ö»»3T†v5j¤à‡¦9ñç5“áØÚ>ZÍî±ç³XEÝCœ ›=L?‰{xt“ÞQ$Ñ”*õ[Ò¯CZ‹GoÿýË)ÓI¶\Z^“ý[&–@š>žŽfÓO2.¥ær,s£^Щk&$Õ{Íøï. µ05³¸^ë“G<¿¥¿Lœ¨ØŒeæy-és*âáîŒw–G»UÊÜ“~…Ž Y2Òð†ßé²L§j} §æâ¼›ªl¹äꮲÉ;ª8z„óÛXñËDþª ~\û]sÛiá˜#ý,·~ |'Ë“•ñÊi–о¹}ÆÊ¹íàmýj>ß(ñÅ"s Ä~njhš˜ºÌw«õS( }v¦ÜП¿#ׇ‚›xIé¾èn¹ ʶóRã·˜”Aô?¹³œœÜ¡_„ä¢ñ£H˜p»BÃ)oGò*:Ñ^Ë™¢iÌÁYÍ AâÖe3t†Ó³w—,8G Æ37À›˜¶+W˜™´{Ž¢ qÒÜûàù,ƒ)³2þeȆ¯½²²³–8ÛÞ3]ÁÖŠa¼Y½÷/D/Y†â_ü Uò¥#ÎýkIñ1&¥[n–+“g¿ mÐFŠ.+Xò(KßA­Mé2›\l½ºTO9ßèãuHÅb®ôMëú)rXâÉJ\ûû>T}|I¤÷~ŽªèØÙkÄO¦Êƒ[No³p¶ /d˜?z¿{†>€ðÛ6ô.F…%Ò“mõ›f#†Ëµý½ª¤ÊIÆkL¨+æbê zÎIìdÉi•ÈMTÆ¥KµW›<ó_ø†®Å‚fŒS^³³\V¤Yu¨ž­éåÆÀ@–»UÕ¡Š<Œ lhÑèœ5ñk ÛS€´±Š%û—Çͯ ·AüÐ*«ndÛëzäHꇌ ©‹žc rŠà`¡þq8ì ³ð™‡?úõÎÅS¬V.ƒe›Wõ쪧Ž;X*^NÅ5ÃälÖºäǔپÈõ»:“€'évH’Å¡²JÝ’Ê„ŽöÓ8¥á@Ëö¼jÌH¤Î–¢Sâ[=í9O‘O3´:[aŒ™.îþŦd]<_ MRÅÝ®y†.;çË(È´ª N7pXk«ÚÀÍR]Ä«/¹wöê:»:Þ·¹ëѶ\ÂЫ€®>»¾[ö™'nQfÝšfȲ«}þÀ1}ÜÏKâüº^É[Î#fŽQíꨪu9´œ‹#½"Õ¯™+gš½t5c•Ó*ØúÕJË&­<ò¡dCÉßðX®º^\ªWá·>TbŸWØì¯È¤‡æŒûï8(ûV‚GÈ–ayÁ¨…±a1¥¥Sîk,euCCÃõ›£Ñʳ ' ×ofóåßZPrz]ò§ m²uš•óQAÏ; $Ž4oªxSÍãÂ\œ ÷Ý:8á%à è#çצé‘[Õi»Aµ ä¹üQg‡¨ÏÈÃhýÒq{âÛxa\è*Б€o´Ò¶²ôÎÃæ¶ô%í§Î{EÁÉAHζj?,sš4U/¹"—Q×q›eZ?{Æ›¬Éü"[6Æ '2ôý ã±òCn ±d'•³¼xˆ >@y·4§~PZO$ãÓ„4 ížÙ$òׇö‹|ûûiý1fM˜Æ0JúûÔ…S°\_çöŹרWg=–mR ÄENQ?µµ¸Ñ`Ä¡ó';-u?^l¶1ïuo˰öOÌíÖÃý¨¦B’É~«A­h؃”YD!íôˆ_^¼å]FE'žnb%DH]à+¾"O°ìX6ohSöÔ…’Ö/B¿CMutÛYÖ{©+ÎWÞ¶mþÎ :•K† ÎméÃvê“Â\TjyÁ  ;?¿©'ÑJØ!!€o ß…ýº `ˆ¡ŸC;È?©¼øêÞ­dܶyHIPyÙ4¡ES ϧNËq|ªª~7-ñcNŒn.^Ó©›¥ø§'ƒÛ—¥Çµ0z~ï»›…¤¨£‡³‡9d~¾˜íÊï‡ß«IQø‹MSk•vÍ·—·?ôîoný.梖|~wÀÜœ’=Ü] \£>Üíל]ÝÞœu”.úX"×Úç{Tb6Ú;¢ܱÆZ•·ùEBGr›ù€.!€E)pé¼™ìʉÿf¸ ñ†{*¨÷êaZøanª†šÀýuž&ªÕ¨Êd´œí»áÏå$h‘5ÅaP]æ4˜UÛ¢or©0c4¿ƒ& "y‘dqé5²„$ßmºa'w¡®v¼"Ó¶fïmàýFÀŸö«ªœ»ÃcènÌíûÞ¯}.<&þÎ…·äÊ–hÛÞÞ†¢/lfºÌý€Š€æÛl^ kŒ×sîBPÑ6ùÚí£Ôý!I`cmÙ“]–º½žWËŸª·o”9!v42ß„~€{Ë(f(UðEmùëwZ—¨÷”ê¤÷ƒœiP(]–ÃN>²ói³b}?rQ³|¾wYÊöz =ޱgîá„»íG¤\É)™PB0–þà„7ŸåØ3Ò݃Êòà;y`DãOy)¤þZŸ Ò}ùÝ£¡ ÁrC›¢œì"vèTõ°=µ©é,)Ä>ö<Ko Æì)Éûæ)S,vȦ‰ 1Ǫ‡ˆ í«€û°ËQîsgÐ\¯‚ñÎ?½ÍòÔœeXs[  ­™\Í&û8¼£‹Pa¿{dÅ55­Ð4Lᦠ¨Â)&Õ©~?­QWn ç\¾0þM} ¯l‘ç÷9¤…ªÞ‚°¶LŸ kúòþÁ¨÷€ácXÃïe¸E.Q%rˆ[{& p'F*‰NTl©kΠ\±ß¦M'+zô=~Ú0O]ª­ÈÑäø¡î>M«é„@ú dV‰‰•âÓCÒô¨gK9•;¥:¼­ŒdS´6‚,²Òwxº÷íܵ8øÉ¤{6µqfÓ‘/ Ÿ|áTÅJŸVĬM°jyMåŽ;¨G½ß}lEù#¸µr}ˆÒ©e™šÐq1úq pD­Å‡õFÐôR¯ ÁÃL7N.3žŒÝ ºtË1äélÎ%V{C…Ès)Õ´÷u{t#\®‰Îr &FÐ[®##ÑèóÅnÐ6‰²'p¢K*y 7P¯œùØÓl„é !ÅJ¦É 80$¿úÄn¤kƆ:”EeDɘ£h+¾ÝË÷GBt|²z—Õ§@ùΧ®ˆš¸ÇùXöË4ö}xõyò…Û¸h®jÛ}o†ÂGà˜0‚3_ ÇeÏÀË í¹®Jc@±qœ@§¤©“\#ó'8@-'›4Î.rƒNûhJ„ÿ™Þæú3ÚmL§@0:c©œl_+ºbg½R¤:O«úSTZF+£òOOÐqêŠp¦•inEø ªþ䮊“IàCEÂ¶á ºº-gi˜ø(¤ËŠ¡”o4µµ.’CAwôèùpË!ã¿©*€µ§Ã%B´Ã gpÀÁÈ>; Ì*a¿ö¤£<³ŽÊ§‡ý1ݨ>=šìÃ8+B)ÅñfbÒŸ9 ~Ó5ŒZÙc½0ð»þÂJ/÷4waŠ-Öo¶•W¸Yꨅ”;f®ß¨¨ 37µ4^‹éµcPHZõ¾9äº?+6mùÚÈoÈ8vîAðÔ?\Ö´]O¨LFŒ+Å«ÏPŠÅŸªwè&“ ‡öEÖ„/¶9Ÿ,ˆ ððkµÖèzÎqæêF6ô°†“øÞ—žè«È£}XÁP¥ÑØÓþæ 6*àãÂOϳåü&sœõÉñ¦ÃtQ/$ïL5I,ÕÍÊ÷Yï–æ0?Í ÛÆÀmº<Ò`yoª›aŽÝ:ÜtþvÚ­úòísƼÓÛ-_KT,”Àµåi'v޲ÁÙÙ÷Þš¥ë?ý÷Œ¶tíÊYÏà0U!¯®j–‰ ûº¸§)õõïê,'Äezåñ úm¶ã]cõêrª"o¨œ 5”’Å”†„±¹hÉŒf^µC~¿Ówf^N #hZ¾O-MgªQ_eúaŠÇP½{{ËpéÍ«d©âˆ gĽ òɘ«;©sòR(”wž17¢¦Ð¿ºYô96Ìúá9qÊ_×âW“ ¶¯À§ÐÁ ÅOί·…ª})ȘZ©8ÊüHîã IÿŦu-´a3úZ[ë¼ìf3–Л RÝ3PÁú·¨Suo’T‰Šz.ÉéÚÚ¡±DE¼I=/²ùÞ0kõþöø‰ûEÖ_ìÆ3ýžt’jU+$`$žäÔÊzÀŸEÞô5vØV¼ð¬Ä›¤îÒ-zŠoVT÷åD^GB‹Cäâ·"…Y{‰¨Ü½¿,­kñ¢ŒêÞÕFT„ø°: ‹d˜^wèb"Šß2Ý£'Ù]<ÜßÞ§®àzP³«héÉä¬åßâ ž«ú#™|ñ¿^ :¼Ó:×Å¡!W脺ì,çæ¾ .&¶Ûœ!u“„çzÛ@‹ƒhß‚ÇmV>ÔývŽG9ÿÓDò“,¨·=4©=î}<íFÑö4~uŽ.¼j ¸|© ø]-Þ†j„xEp¡`(áîª\«#ßÁñà ²”­þ¬:ž:q‚Ã)bêKûðE5–:л`XÍçrÁŸ$L„Ï0,ñÝjªyþ•ÆýÐ,í2æ32è“:¡O ¦ýºˆãnÊ]ǧ¬/AÁ›e’nK4¨¦ÚºÎAñ=ÈŸpËX`÷ªäœØÕ¹iIRQ#*8øKµ¥–<¤‹¡rÃOËúÇË[S1{èךcZ¹ö¡…6ú«Ÿh:J›¹ÐÏ–_yY‡î{~Ti“jëõhË{ŒŠ®*¦ÏßB¶ÆmɲÌÚÌ wó¸Dš½Rí¢7àÿàÙj^dä¿¡Ã^ÇùúÓǶbí¨/˱vaVßYÊA-â˨ÌãÑÀ§ö ˜ÇMMÔíxª³—·`cµfu/_w¢hxgû5Oî|’”×3DiRÔž!.¿ŒÓD–„,íØÁÄ‹Añ%YºñåjÛX@³4b%íð$yìÿ¸¥glyöá¬:€qåC|RåÛ²H ·‚Ò 3ðQž˜¹Ç =›>›5ñsøSdO •ªHÁW$=ÑôŸ¨Y³{g|œFPlˆ£5C%÷ïú}û¦Ùèý•Q“>‘{‡P»Œ›_Z°ÔË™ñjA‰ T¤ªAƒmÖzž¡#º}½©/ µ7Ã¥9¸# Å6+·Ì‘¾ÿêµ½)–Ún±O¹Í<Ïê¼—»úÐ×7Ú ×ï${žçŒ¥Vœbt¨ÓÄÃä,¬y‘‹[ˆ!=â¼ZïzÎê…ü¢!EÉ{N‘§Ú¿bàÓ…)jsQ´Ã¶3#wÞ1 ‰ ¡;-ží  ÐêÁ3çÖë òt}ǵ"ÆašœÌµj*Y×êÉõG9<º„ n² ?>ygÞ©ãk˜6TäN„)Uë5–UÞR¾<"h˜>DaèíX­}ÑV^ŸÑ'ÕtS§bq¬«¾ÿ*4¬%tª•!l?¦ŒÄ}K)OÑ•ƒmV[†Šh“¡ñÓU˜Q×´9j 7ÙßÓ%EòK²hB¬3Ól¥‹qñT,B‘†|–UÜŠ"Ü ¥Íe’Lõ%–Þþƒ²ð@ºl¼Âw4¡ª6°tOpÀÃ;ÅlÙëŠÖŸú¬Ô§†ÏrŠ¥¶àÝ~¾'ÁÂh1’èQôÀ}µŸ 2$“Ì2V Íû¦²`‚ 9„¶Dóºm,÷ƒ"¯ÒY<*rÜÆOÎxÅãÂfŸy¨ .¦Ô¾7«*làS¨ö `}U(PBÓ›H„Ôì=F¦¦Dû ßò)WæËDc›¸†Eü9E0Ĩò*º Ñ|ËpADQ‹íöÜ=tÕËz¿R^ÛÒ’qVcŠ`8ÃU¡öHɨ®»$üÖÀz2#BŸ•!FãÛ½‰2°~‚öÄ~R|—FɃîh[¨Êë±rϸȘ-GRPìrûdm•[ä7ƒ0Ì;af!µDŽRëÀ}ò-ŒRi!1E‡ Áë®`p¿íWï¡u¦y«.<ÁÝ¡ÿÄ­¾³Ù¡V2-8o1†HlU´$±Q¡²ÛŸŸ¼&òV2‰Ø6£Ì/¬ì~iøP†Û:¨þËi×Ò¦[‚ |â›9¯VwßYý× ˆK4ŽAXWÊ.8\k~´èN´7&”l'Êú ”òÁC6FîˆyÞÖ’8YÍ‘;Âb 0¼iŽuÃZß®|ÀgÏÕŸºz¢{»_´(¤l.¬èBÜê÷Ñ€&X!TÛfCĵ!Å/îO™^Ygør„yéúÈ‹êSO·Êâxè2F×lôzñŠ9dij&2~Ë…:‰†ÊqQŠÑb‡;·ÿ@‘Ò(4DaœÒhº•S*Ú 3JÕ†8U„·‰åu:8tî— ší7¦ &UoN#S•Z,7å©ÓÓ&ºû&ѼÌY1Iè}]Rlhè™ä ƒŒ€|/Ï+æÏ§!%ÓL©ÇÏñ`— 9‡£|8߀eï)ô<…ƒë‘§p` V]ñpS3ZG€×PʼnÆE­«e\Ï2ÎVîÒ©ðë›–ÌÖLàƒ @1(ÿ-Üo‚¡ïtrS,;AÌÇLÆ2Mš.™Ó߯uÇ¿“ñÒŒœ«(9Ýô=ç{ømãì>ÂfâÂìéÈ8°õó¤(ìèÔõæÁW÷ŽÍ“*"²Ùò|W9‰'ØoIûÓÃ>x§¸^sߢ,ÄÈ:­-Y­­WÙð¿Ã) q¢â·fVFPãÏ6¯lñ(P©Q^j¨¡ ‡±­Ž;Ù Œ~‡å: Ù¶¥“ðº‘á‹`vòNT¯))dAëúgT ŒYÅí9…þ]ÜiXkV£-yX&8w ån¸¯ Ý-?¥·i#rü3ˆ©ˆ>Å„HöƒmæBQ*©ÀÑ¥ŸY½rþ$/*»AÃ&£ÆàŽãib.òVz,vÿý DQâkÌWíµï?ÓÓµQÉ]¼ÉU¤åz¹ Ù«—烴FŒ*€Ð¿A7R¬dÑ®LƬÍ#òÿaìcÅ‹zF_tÙ¶mÛ¶mÛ¶mÛ¶íµþ˶mÛæ}ž÷œ›½ïÉN‘9?Œd´ýµMa¨mSİTà/‡9$–TV’sÂ"'`DàÈ.•TR˜ K‰¹{HÐwž Ú‘q˜}™#C䀒ãÊ¡“è'ó$Ìɻêx]7Ú„±ð2¥ƒO¯'3KdÊØ Ë«ž‘—eD*¨H*(+ü—T1äw’QTø])ø —`EŽ8L³(¤™”Å)W´=’´ÖIR‘EQëÐ~/Š@Qè ƒ°DÞ{Us|>šfUÑÛføø¼FèõU’Ì:3„¢í¢Ë’ ˆ¦Ø]_à>= k¿÷†ÆFd5?øy¼˜ÓûDDþ\Ö6¦œÀìðp7ÿ¯9¾Ï®žØ_Jþn`Rëï}žoÝÔäÁÔ”õh·ŒÇÀ§KÉî4cÊOlQR¿sãàôUk¿d-g\¼€¬çŒ1äýÕN0 r”z/Æ|Ú–Û–Šz2ÛöÚêµMa >–|OŸ+sZ– ¤F½®bà,8Š» ØÜ½gù2&~à2pþuñtuQÖ™xl¢ù«j÷ÐmE?¨°Å^2A™jÊñx¾£ú-žZÄû^P©7›"OöQ¢Miz¨ >Õþ³Y°á› ®oƒ*SUã.Š¤Ùœ°|hœ6Hé š|£Æ)²wx\rLÔG7ÿpj¤xºÔX;nþE½¾Ú‘Äþ5AÇåÏ‘ðèË¿.:X[[‹.âý…ÔÞ"»ñ:Êk+6ÿSÛYöºg®L;1b¬3w}ú*·Ü@;øùðkíXÊH}Y²a¤µO·Þº÷r«„HÚÒf[ûèèÀ8ËFÑ;›}4pR¨˜ÒÜÍY^)5Ä—s8Ù•L’ÕìíÈ^S}ðopÇ_´sJ@@Ê)v°m…¶tEH„홪֭¨î‚LŸÐá»SªâMwæÿN€ ›Væe?<¼(ŒöÚˆ‰.ÞðÉ —Wïð( ÙD¬õU¼:t–¹ô\8¶ý'öç鳘ëZšüé¦Gÿìö %xoðÞT/”e÷¯e0²F±š/Ñ"ä9œ#G¢gMd0|*œAûÕ_cvòUW¯N[o·eyò´fâlÉé»yzº‡rëÂv!ŒùÓÔüìsýÍôzõŽ-vMgÑ=å"ŽîÑua…)^ÄvÞ´ûÝðúü褆6«u‡¶N|WïÛõU)w½˜ ñ‘£…¤\Ô“Á¢×W±°\þ¤$L™iuKŸ'ècÔ¹sËïm€çÖ½ÿè|åä¿:§~‹wjj“¥È®U®¬ÿUÙ:òÒ”%h;ò’|ÉÆÏh‹Þï¾ÌÄÔüZ$Û2unÍA]é€çÃÊ@ÿž…Óø±ùÂôKRSÿ(òØ@ùÓ cÏÙ­¬e®¹Œn³³.K3îTX½›ÒDüUà6o›MSªNk·³ýu6ûMÌ<}óãö¤Àž&Û)ªYÝ64÷-ä®hüm4“åËO=ÀkO¶ÉXéúÄIòÒgõÔfðÝöÏêÍHúr×£›rÛxµ±ÿW´¿ØÆÃníÒ7Þè²sJ odwéÀ|íîÞy/4Üò^»ÒwÔÂ]íæ±Eî`¯þ3ÜÙêv…¹²d¬ºdúýJ½Jt8ÎöQ¢2‡Î‚Ÿ¹¾#`¥4÷ĦiÇ7öÖe²ä­¶¿ {ÝÁ¥ýIåÖbø(,†Åµ=·ðÞ]Ðcy)¡É,ƒ•µýËÖázn),}k¬€åµ=·–÷~罡Ñÿ}ã~h±øUL9º0ÿ(§Ê’~¥vï0xŒvsúä2å´Å€ª_”Mw `»‘é‚zn—Aã L0-y÷p¡L(¯§ï5< &K³¹g1?õYåüû‹þA%±‡øÇ=Sdð•¼Ó³Dm¹Uî±Mpûé6…†Ï~>ÊnáÆþ‹6;†ýœ¡2öÏœ½,7FœWÞ›©JÆÐÏsr04.‰sCþaË[#µF½,fNAN(á<ÓÏ$¸£@·K'`¤ÉmýÓ‚7ÁrŽHƒ¶[—Ä?µÐ<þ°ÍÏjIÓ¨ ¶Gä¼.‚ŒUZÃì ´0X‰;3;¤†¢aB<«ø­¸tõÀÁd£!Ù×?H£=9ˆ½4Ïp‘=}’ÃõK1d[‰ µÇf®»ˆ1¸º™jœÆÏ[åÜ^ÞæíB}iµ‘&vU4Ãí*z³ר3ÿ㛂¾IÉPÄŸ˜^ÇGª¶U–Õ¿§ÝB(k+Ï$˜;Þa¶çŒ!B#5q^”Éç_ÀÒÙ"\¦ËREy6ÒPzf²¯JÉ7Ö4õa+œéùèŸá"cUù_(Hn€¦º§¥Œô®éé£Ï¿¼5qÜ<ý=-@ÕÞ ”ä[¶Û°{¹ñ Z{ÆJÚþ¬%2ˆG ËWAŸ-!¶P]>)0¢(óe¿ ¾¨Šk Ÿäýú„¬ÿ‡ËF,ÿï.1s01üï—®Ó춸Âò îö³Aå—FÝ\;£Œ‡)ÜrQ\Û8ÜAecÚP*…ízæÚÜ¿Œ¨§ÜhÈ»WèÑÉHÉ!²*d†ã™Ÿæ¦·fïìåèb £g÷vu\ü¼%Jÿ1 _Úþzö9?*nܘOÙ»%.>6ïyÙs“ÿ©õek/ÿÔíäH¶3}ëVj(aœ†kdŽ}Çg ÔÎGe’™°ýI+›SzUèb£€sÚ²Hàƒ_€DŠàtÇ(à:ä ®r' ¼"#O‰„1‘S×H+`;ßé ßÀ”'^È8ðè°¡DašCjæH”›d¬€nr}÷ò‹Ü‘#ä&ççs”Qç–p!»išòóßÈÍkrÞÖ,HíÜïFÂÂÞårH y›§!¹'ejƒ»g¯ýbVù¯žxÙæŠ/qUÏí¦ÔUqs'ÌbDÑ™rƒK¯ â&w–ŸÄ¶Y qu¸´ …s D#²Åh“Ù·ŒCȆ¥2gÀe³{žv9›]’PÂ)·–^É·0çÀU—ä%îºÏ)¦PNoÎçÓÁß•yžà*\D¢¦Í)LÖ4ô";}Ø%8ŽýЗN’¶wO[¤êµ¦áŠZF÷Óü)Ñ\ÿ“sÿyéËÃó&B—÷ ³›þgï´ÃìérSãWl7EãUZÊv$ Ø&Êøº±¼™d-ÎÁ•{@,ÊRÒi0¼’A9)7@e9¬“Y–Ö¹Q¤äN^e±Pš@#ûÏ|ƒÛƒ/þ¾Š1roÔQì5CÔ¿­­eYõY‹ð«<[á‹ñ\¢å?ç*Ýtân#ªâ½m÷™£àÚK)7ÁP ;Ýì ÁaE^9RŠ&)ÜéC%õÏ÷¥9žå_ˆ×Ýå¹ë:œ’œÿ°I]h h7íŠË»ŠïmÙðF¥<5ý=[ý=Ìò‹aéWú‰?sNÕ5²ŒJ]îa¾v ™xºé¿KWnz¢yñt†ù¿t"s`‚¸ök ¥×Y†ÔbùèGߢ܃”9æÿˆOVåz¼Ûh¦_«y¨[ÌÑ_±ëRzgÕ“­¤‹T˜¦­A^­0ƒ/ rš ¬1Ó› åÉ@u9o÷¬_“SÀɤˆgv!–¥c€=ú"Pì—‰„ãÙáÌÄñÔy×½…‚Óël—¿ ²“Ø¡_ØÚåè¶·úù‹C>Q3†¥íMîù'Ì3ÀO@e¢t† bÀñãÑZßßÙ³$01“ÎJ±T+…MÏÑùû¡[AnÔc3¬‹(ïJÿöòáÕ^œ|¶–çïœ2– ŽéŒ?Ð|¬í¬_@”6Y-"Ig&&)÷@voˆ03t¤)–{K#Û¥¬´W¿ÅÂ’[H3/»f@@6½Uѵy¨ÃB‚Èg(B¨ciw!CfÙu褣. ´êe‹cv¼­bÖx¨ÃôQ,í •#n&ÛÇ/ºµôÒ°hT·N_¯ë}œßSûs)ñÐcÌçÿaÃI÷7fccÜœQe:NÙÒ'=`š¤Òÿu“<þ墶gÌØÉ¡•JQ'¡$Ü‘ýÎâ·ånBô/!>÷g8O(ips$|êÕUÙÛÁªA—rÏá†þFË™äû˜” øXQ4©1ÊB“qš›Ef) ßò¼8KnË76½\sxÞÜñ®!òbØÎ®®n.YàȬzO/v‘§º–•3Äø¶ Ý”=È­ebE£kz7®ÖÃÌ<û&lX‹: '÷?cˆe*ú6¿ªŒ‚),bú““ëÞ%©j ðGÛ¤rLÑs ¦èw6JF`¥Séj|³þÀͶ¸=ɦêQ»§/ì @Xýºôw%aQ# a1D†#=`{ÅÂ΢ll\®% ¯pÎzú6–DêŠI¤ƒ«``Í2½bÔúÚÞg†àÚý2™•¬u×?g8Q&¬2Í,°-I ¤IªöµZbpMð±SLËh ›i¡ç;ú†šû]Í ³8v¶š7E£õnà[×A²2íŽ9‰¶Š¹caŽSDZh˜<°u9Š'ú}î±ÏñuÿÑi™º/ìO•ök¯øæ›®‡VVSLìÏ…„c)ßã\Åó0Ô”9…©šÆ¤$j²cäáÔ».º‘"mçܘ³&@Ý b-å>+“; ”½˜ÁW¬èÙ‘ÅX*!'Ô¾Ùßèy{ÎûF§8>Ò›0‡ûOx0[d4s<ºÕ5ù«¡ŠaÇRÿ¦\œt@„ÞC j9<ŒHšô(%¡É8­­“ô€×‚ïÊ]ÿ¿ûç-RMîô™ñU_Ý\¼Ä“Qñ^í.Ír'%m;Šýa½ëèQm+Û/[سyµaŽäÑ?aó‘ïàk N™ƒ1Ý4¨2ÐåT¥àóý9¾-â=cš—Ö¾A‰Ï7V¸¨_Ï Îý^©5"†òV§‡3ÓSvñôÉî g÷\­'ߚƕþniød¬>x‚•¤o°Y”ñ–ÕqviÉ~øF€õÄû<ÜËpJÖv§¿ÖÁÑRJ[ê9ÇJ'¶Æ™œI`;4Š͓ĀJ˜’‘›æTÚÖûù~¶¼%hãŒÎ1IuG²öú0—Vº´ÿ‚#٧Ǫcku€sZªp«ç«Œƒëß,-ÃÓPbôáû?¦&šú›ò‡ÛSüÒåp]„¥„Šˆ˜c*õÆjvÕÚêŽGæß:mBÑ<½ŽåÔ×ö–ï’»+Ú·u‘{¶×û½'ú›ó×3Î^Ð1‚Ì7e3 |#!i²Ò°ÙT"gªúï®$/¹•©žá-ÏÃ5# ಠRæ?‘í¿‘‰ÎSðù*iÃBÂy <(Ñ-èB@†ø´I†UãÄHûØ ÕŽxh1sßcðÅÚD‡_`Òñ?¡yj­J[½P_¼Î 6=ìÿ‹åع*ípƒ,‡Ö‰A4H!tØñ7fiå?m`˜Å!A/ÂQ«ÿ;]€ØÕë ?§óž±°µÊt(Ù\d~ËÏÚåÎDtKK9kCßþoíVG]]hÄùoè6jäÙú§#!½’}0‘p8;’<‘¾àz°P°Ísç6{Pi5òåù¡ÅÀ*·Ûúü`Ëš¤A%éSk¹VÞM ±íz>?c;rÏˉ~l€}ê­;)k³;Xã‹èd%͇!ñ–c©_mG ¸E…jµJ;IGn…%…»ó•¢ÊŒr¸G&×\ÒIYüß,A5\_t$ûðX‘bl« vgj@Oj÷|“uôcñêÖÛe|Lˆ9úÀŒ¢ú¡|âåò¿r=Xe-!""â˜J¹µž^µ¶þ‹.ø@cH.œf2¶ÿÙÜåVg´×{îÎõ{+Z½Öä9xšå™×N‘X¯¿iÏfNUeíM¶“[lÜönZ1¤õ‹!æ_˜uèJ¹ˆè˜]耧0+&œÕƃÛt…*fü¿dm›¬ÇK›qœLÁ÷|ýî!ß *Yé_ࣴ=góûÁ]W:Z^Pn÷[ÎíцìxÍÔµH•‰Rw9÷ÝC\'ï`£[M¦¶„­^K¶}ç çNc~èc[CÝ-'1f%ÕÎr^UÚ¾Œšr_ZóO\«"¨0¤–þ?îR#õŠêùrY(Q˜ÕœžÍwŽ?Øé6W0xâÒw[¸{ý×)»rGŒˆAù†»~l€©ø'PôZƒR)ïh&Én'žŸ®IieÝ@øÄ+r]Û­aŸO1g9–óHvf æ­õÂë–Âf˜ìÛ¬!]>õÿ6$!»™ã=“D3IÀ¦xQñ€úbàf‡†‘ÿƒòUR¬²:¦Øø–7’P²$ÈÖ“XcЩj™”|Ëê‰Y4åˆíð:Y޵Ëõ¶03`œz]¡€­=¸BÖï…ráß¹h=_Sœ¥«˜W[“…XØDÊô±–ƒÁÅšª²•áÈFÀpò IM‹¬UÈÝèû·ÎÌ”<¸<ê7^•&ÌëƒþH_:C'†}¼s©%ð uȈ's¹”k“ˈht >Œ¶÷IÚòÒœéÛý*ns$fbxÞjäÄù-º`Ùå,µfmœºî /ò¹)û6AÒF ë™z[}ý6W!&êËö®Ù`@´fjj_\!ªlLSu„Ë'Þ²äq¶î±©žÓÉ4“$œš·•÷ÖSçû<2<ÿÁo“áæ”rû#J,:%K¢ Iˆ—TÍBÙq"µ Y#µrK2è÷q–|\öeAý ¢qs¨kš$Ÿ5© …ô5¥Mä:ý‹ã¾‘ Ó`|3FÌ¿{MÓ²wý‘±D3Ë™ûRÖèW#'¬³,ú xsjó öâ‡Å/˜s@y•Re.ô'Ê`na¿íâ8ØÝójÙ—¶ ­(=Ò–&H| ¬ðÂÈC33íä NK3mÑpó\[>ݪ T…*8ë½!F(.–ž˜!‚¸qºqÃX00ÎAÁ8/Ø èia˜Ø Š–{™¥ãË#®6_êž%¦ªul™Åûq°!ÖÈ*ö¯“¦Ì4¥‡~hK«Öý)Ÿ›€¾¼?ŽN¾™Š’}w‡[6lwKîîñê‹™º‘´=';%™x-‡ôb¦ÂIn*ÌW–°7Avp§ ßR'6G6ËÑ~§ˆ.uíÇ¥íô,OÛéÌfbކóƒ¡#FÌÁ >ƒ¹j {aðÑf'ëðSIõÇ(k¬@»o=A´¢fe˜SGš‰.×Zþ‘+;­.Ž2y‚ÅYü?Û\%Ö—''_»¡ô®Û4™&§T&SñÉö–RÛ,6Íςտ¸0IõèŸ[c†µZÛ½‰¡Ý%wbîŽê²4qä –)f×:ì· è`¯ûÑz¯‘c·þ•ÞëËoùú…õ¦Yl’¢ñ~F%ôàáì¦ÜPÄþNzr‚º¹tâÎý?ÏB<"pJy“ W­¹oØŠf¨ª9š(—¤®*—wi»Å´›èÕ<{t›¶‰ôbÆM1Ñ·±­ÝT:‚^W¶Ž|B3ó›QöqÜ·Y3q³+ÐÓQ³4Õ›=CãvÎ2­Ãø,iz•¶dx¥Í‡ëDãã_¨e4Q}%uÊDÇûí6|Á‡©-—i[0C¹gŒòùܬZê„-’ZùR“¨uGúº`áélZ¨" ®|³C2=šŒ6ÊF—­fùAÃtmô ͧÆðmÛ h›ftYBïé/´u°5Hzi›Š8šØ-'Ö˜eªÝ`è×-è«'FÚÈ:.íÓêL"öçÖvV(Ç(wàÃâ.çp³/jZ­[`–?8%:‡½uèWZG,¥¼…ÌšÅõ Û²w^ÜUX‹Þ˜¾þá£á£§–ž<³€!:ì«©T÷ /Ǥ½xÞ·p³A”ÎVŦom›WŽý‚½½¤Cv²j{À…®¡Ø —ì.êÁ–QÒ]­ÉRôd´Û»|bÞ{ëB×Ï×ߌôÕb¢(§ÓlœBÒ^ì6¶ÒpÏk¶½ñBü?©”y²ÙöÖ]Ëìë·KÛÉ™ÞV£!¢fѸ[ކì$¾¥g®ÉÒ·Yî–h"-ÍÜ*-U]©â }™'L×K4¬gKT`¿–m†º{”(fúi#½…&­œ…]p=ª+®¯ùÛuÚÖ‹ukŽÆ+î5™Hצ ®\R3Ó‡1T ëX.je­vzºª–(vÖÚödäÉoŽY¤w!݄͎Е®TÕ½7ôš¨[/Z¯¯æû¦À¾á wOxê]ÃãÍT•‹Æ‡[ã#§|ú^¨Öû 1…p2vS,N^l}•Êã¸õ®ý{â¿ox²e¤ ϽkxÂuãkϽ;?& î;{ø¹ '‰LMüCŽ«ØO±k'{KÎfÑÿžïìh5ø\:Ùyï7øÍóŸK²^'éÞµuÝÎä?ô ú[&~Ý[ÁíùÆë¼'ï‰ßíûîÁ¨PïÀ—óÅ•°ß¾XìOd-åþ²Ÿá~(’{ò¡_ò_áÍ]±¯„ŸÃËœ‹ë2 ñT_ìUÆbÿC˜éqÇ…’Ò›I}œ ¬ÜT)à=¤¶\þŽÚêî<9Ëýu ŸîYÁTêùH20¾+ƒ9b „)LÁóÖÒ‚dåƒ$* 8⟀05ûµû}µç’ê("sÉN¯#Óy¼·F£Ð—¦û÷ÛÁ úé±CÀ7ŸáH(àjåú ™UøØçnÕ¾éQø±[ø»e[ñB (|E~_!´7M£Cº˜«G Ã:Ú¥r xåS[êJ©:¹ÎšS ¤$9pW_á¿çªv›wÑZDfµ¬»ÐúP¾•ã vÀѪ֬U`ýeõGtYœin¹<Í¿ióêSA ¶Ç ,“KIfÎß²ºëPwy DyKy_œiðÂ]»ì÷g¥;ÓqQ@@¶ú‘1(æõÆ”¾©`_öP„úšž™Éº£eúå Gù8•>‹ž]¡î(îi÷¯ÚŸ—‚æo•ŽËÆI+„çj; æÇÅ⦫x@øŒWRûJIÅýŸr"ñÿDô¶±æU'|Äy@„”¦Àñ6…PQYfD?kÊdxE‹}Ê)+=D%'AØÐx x„‡hR/"‚“Ï|Ì2|ÊV ¯À üü»øhqÞ@䨹6-à ORö> JãÄ)%ó8M‰©„¢8P5Ûcž‘Ïàt\ØÇdñv»ê²éæY‘ÏDÅ|8,r+[ßЬD†7X¯XN‡(™tßà2`9qa OLªí[lá>÷­4nJ8!|oŸôd»EÏ`ħ€ Þâs©¾(DU<¡¥A ŠÃ=ël²î„Ï An?ûrƒ8˜4Á€´C)BÀ/RL$@§n`0esEÖ¼ª3$ç[Ý(îˆ%ÉÐ,À êÊälôƒ¡¿×k®o;7pqìÜ@ûP'µ0Ô:@„*Ò°œú£ž bÖ‡ (4‚öÏ-PšŒõƒƒŒvÖW¹Ê! õ ¥8¤A,XK3¸«B€S0ßÁa‡…üfm}Ó·0Bˆ86:‚¨7¡ØðÊDe­S1ºn”DÕSK³öo¬Œ>h" `JV1¡h‘ù€åuì8ÒéSžäMÞý7êÛvØœH>AÃý0 ˶f´›½ß&œš‚aRú%Ñ€aÀˆ©É›LÆ™œ>ò¾%ýläQégz×ÓŒï¦ê€4,Ñ¢k¨’T]ã’¾ck*¹öÕúý¬Tø¥S.°ÁU‡øUä ÄH«Ã¤ûA.è\E5R­¸óÊ@ÜÔ`‹\j‘@«œ¢n GÓÙªJËÔ4 Ñ6«Õ4 v©ìà°ã4kuG ¢€½>Õ:CU/›\…ÕZ«osÙû^ˆïú²¾ö^ŠygƒW®ß´#ÞàW³ÏΚg>¬<›~“~‚a̾èÐòpzP.ß’gÌzõðføsômWÉK^O§N¾-_™ß"~&¬ZÏ-z5òz´§ý;ùøsõ9i9·oGΦV¼–ìžå¿oXX 5ðú4òzìZ÷ùòúƒKÓy8;üþ^¾Ú›G^‡VÖ>>®mz§›x¾Þ¬~.¾Ú_N/)¼pÞþ¢âû?S.®U_ÏôMÝ .ðÅ+‚³> œƒÀÎÀ}ÆrüƒÇãYØiYŠ}ßp[º.KŽzz3÷/oÖ÷½£—þÅ‘ãÎìbƒ“{^ççÄžrL(gÑ·ÐnBÀE;è’†GÆÙ‘ÇXj$„²¢‰à€îR€& º!P!Dè)¬*³2(È …äS\ ^ KŠ]¥ÐCŒé8ÁÇ^‡Àl;EÀ³º Ÿ(¶ÇØ2J“ký¾Xü­½ªª¨)V¶Òâŧ‰8°‚LñüöÌ7‰“e—Ͻˆd#¦}&ÿ\nšàTûJ^®ÁßÜüL^Ï÷Hù|ö[õKhöcxP ¿î¿l|ü›¸ƒ‡«™ô‘ïŽÖ<ÝEj«x~±b[Vž|¶§—G‹ßƒo«æS€=ŸÎgPPSó&-Z®,ú4ò;´'ýº9ù3u9i¸vÖÝìÆÿ#?"ª×ï#Ï/éÑîÕ ñ/ x4ÿŽ'^¾ê÷úriëÒñëzgçÌÍŸLÓÌûr§g›F>V”Oñãœ]Vëßß±‹ä3gõLýUÍÊ~;© fA“Å+­NF9ÿÀñ=g'Q&›ÕäËsÔÔw˜Õ}@oµ0Äi‘KoáqµJÛ9v®<`fñÛ`é|¯“›œhâëTj Ï¥³””±…ÐêM4RX«Ò˜’@=1 ²(p­i Í45¨aR…ôgpE6>˜Š=îT>²«Ê&ÁŒ‘,?ðáU±V»Ubì¶Û¹Ó(43 ­·Qü†=¾‘ÉžLdoS>¸¶¦lnN*‰‰ŽXG'„qÑï„rƒû>êq=­¹Ôs;9_ ”¸±{”3 ²ì(åÀaP_ãÅzÐýrߨ9Q7L£+\E–w=ýÌᤗþÿ!o?hG]Û“$F¢ÌEbµØØøâ^ È?QkI+¹$t´çõ!‘QÔªšˆm5ísÇv] `@GU1ý<‘×@´Òq ÔøzôyþAML[[\¸‘ññÁ˜ú)´v8Y0°Emá xk^æ¸(ÂÃJuq‹€lLTÆL:¹[jóò–;¡•64pM§m ¸•»w’È î40©†‹%¸Í*‡¶S[xYiáÅe\©ÇÁê$^ZoúÂÄOlу…í2|ÿy^éâ­‘t5ÉžkÂ…•{l­ *Ûä´Ù9ÝJEÉAïÏ ŠÊ.½WÑ~7eiH_Š!K¡lk¯~TÓ….Tj¥¼!b+š_¥°äYÍôøÇËMü”])tüZØ,£6†ØÔ–AòIñ ÜeÄÄE™›ricqWfð„°!B*Šªâªkð®§ÆÿÊîÃ:büÿàHñý0‡15cÅ ¬Eg6‚Ñ*"½QbÔ£þ])¬¥L•‘*´ Ɉ‘츟÷ë, Rg™-AVÞAW¦Âœbý ÿ¤…]U|Ǥ ¡Ç»HŽùÈÈߨ4­Xù¿k1Ý­Kàßs?A@nã€lHb$eôƒ:l:4ÇFEu‰ ²ÏɈÜÉ“"ÂBâVrÒÎ%"P˜^8YP„ܸòÆÒv/Ø„áív'…TZû}ùBÂa‚zÎ!ŒøqáeMY\jõÖíh˜Æd¼ÄùçlEL¶€;‚# ”!èà›„ÌRU¦R(a$ââyâkΚ›gVâ¯1&þ—Æ„E€¢ÃøÀ„Ìd±õ,@^êpY›@MïÈdÊ´3ÿÅÏŽD8C®«@ˆæk; È@ƒ°¾ ˆ4ÐÚiTQ5U íÖ9æûÒ1.¶à×Â~!¶)Ðý¼¢´=&’šràåÁ5Ó–ì¯%Q€HËè ±KÝ›H_\¤»ŽšÌD“7ABr3A€Ù‰VK¡C§+5É•˜!pK ÙùpÔ®váøW÷ ¸P» |ÙÖ"ûBp»ŸÑ9&1ÙÛ¨ËOf=$°&%$_SFElîÏ|Ó¡~ý‡.ðçÕ™IïÎáþô¿~Ô¤k²h*â,è9žé’ŠØ¶ ܽ Šz ­bh$V&#tE¸–.;ö“0¤Gr[Bÿ°/ìÖà½j6á9ú2¨>ƒµWŸÛW†?t¶…hÆÀ£ÿ>\ th-Dú…bª €‘Q­ Õ#úµDpÓàžC$ì ˆŒ)àñ³p&¼!W Õsýªõ`9ŽÑÖTׯwˆnw —5õ­!ˆƒ©85ge!EâŽØ 2åß_ëÍh"ö}†ÿy:[‚݃Ÿg‹'² ˆ'‹Š4–1ÔµÿÔÖïzU’¬ÜÛxR34‰ ÆjC–ÉŽF¹ÜOŽ¥ÙæLžC Hìµ@ÊkI±ý2®ybРgÍüÓé—ÁrúixøAïîOÃFnzö ))£Y4¶,†Ä|JŒ[7—®¾N_WÿO~C»w“Ïë£hXáš=ûVö3åö¹w§g3Ÿÿ+SÞÐaóÎÙÕ‹çʯ?Kù÷‡Ý×QŸÚÝR£­Œ§‡Œâ¥/>ŒAn'jaB×}WYa!~ÁÍK^ ¨W‹Ã¥ôY²}ò„¿ “c˜oç|¨H†€Aƒ:»Î›ìÉüçC«0ļŠ|³ÍOÌi *ÈD±5Äø‚šb³OE& ªõ5^9-hšß޾©Oç¸ÅÇ8S±Fkèj>]+L­äYð‰Ú7gçžm%g*Ò|«Û0ð~U—¯ ¢( Ä~cðjÊ”à¡é°øL¶W‚eŽ-Ú’½Ïú؃ƒ7{ƒ*Œ-%íd}_Û tWÚ˜ä¿3}+©µqÁÁ’ÝÉ•"#ÞSÑZYhF“Hl–É÷}Hh )›Ä“D®8üZ`9ÃñFA=ú®•ÓÓ¡ÓÛצ¯÷öhø«[3ç ¥/þ¸ã_»ü¤%rp“!X§ª Ä >?üwED¶­–üé¹-”ӒN‚m•‚}‰l™á!¥¬ çUyAvK`#Ó£€Ý£rL–`P)~¶ókæ$ýÊ÷÷=…ÊŠì2E]x1oiX” ”\Õí}FÔ€ñ>q²Ù‰ÄQ­‰)",{NN–± éÙcÃy<ïw`7hJ^âpø²;¤ÙCÖ¼iyÓ]ïû ¾‹Â~hü¥Ûs›ö]¾k¼œ|~mZ;;9vn<»lsn«ØÈÇø 9û=ÿn+Wñ9Ô^Í5½–ó®ãüÖ¯åÖªg^‘Dï­Ù4¡ÛG‰ˆ&¦÷]]Ä˯¢¯ÔÑ;¾‘ÙÜäÓæôzÇMŸ>o̼“ùN< féÙíWÏæôF3¼Û¾|þñÕWeW°îšŒ:΋j>ÿµkÛÛ˯ÝÕñݶ]ï\Íá3…Xıg_ý˳§ßÕ©×ßÖÕ­ã/ÓµòÛy’ÇgÛÒý1C-ñL=XûtÖžnžo¿kSçi;o8`›Æó13Â϶U½³Ä¥ñ7= ^y^Ï\Ó–ÔÛ³αðÇÿ ·ÀϽôïò÷Q}AWè³\™ez@4SY9¾I„h¾ç²%ªD+ä¼ma¾º¥m{õ!§½H¡õŠ…J± €‡ à³uÚE°ôÅI‘$Ñ@hAºDx÷`NŠ#0Sþ ì_J¹°äs/u›âÝ(m–¬ôkжWmNi#À@š—*íÍfš‰¹×ëúç¶³FÄXJÃ3§­õ±œ½Šj³ˆ"lLwÁšx°¿…t"Þ ‚«’5º›ç¦žÛ‚¨Ê«â’ ót,þ¾æÓ@±¢* Øü«&q„Ìi‘e“æáB¯ƒÛf*6ËÄ @È[áv"ÃúTU X‰DZ¤-(â–®]Â$y a7aˆ‚úR F8A©ifÿÖQo1©¨¼â;G^óƒ%&âì~‡°AK ~ªâ½”3oÐæ€ƒ¥é×¾ÀJrgÏÈ1-PËJIÚP;ÂX ÿU äˆáhù]PÉyc¥ je0û}‘×öF×´"#+ û]vÇÌbO޹ߵlsä5Ÿ¯ Ï£è`?o\#Ó8‚.“è=Ø×áÆËŠ•o[W‡Ø•Gã¿®o¿\ÁÏ>|wo×·Ÿƒ[÷>†[%MêYÜ¿‚ ÌQ@IÚŠ*Y!ú¿úŠþª†ü¼óòôÀ¶‹™yëcM†º©L¯m;Z® 8¶âD¶9»ìŠì,æö÷ R‚Šõ)ý°ù±dBž*$Cñ1ẍϋW?/âWê*¹køåM æ¦|ÒžlÀ:ØY ™ØÒ@4Ë’û• 2Á’ˆ4è4Žªƒ ('JðµÑNÔ«Qú«ÑÔ<¨ÒŠeäBß{:DÙD3øj·R@ª0ìª@SzÏ`¤*BŽ›DHß¼õêÃñð½·÷ÉØß½p{4Šl¢×%Rû¹ê5¡w!=Å´W+E묷 ÉØÓ½q'ÓêQ€­LVñ+ŠIµc„–:/è'y½ñ¿Ä‚q§±DŽÉØÛ"cÿáÝÿ|¦wG»‹Z½ôo¬–x>ã]hÌùú}S>²ÃRlë#7Ω {{Âx6‰³Í“ä5æWíÓyVÆ–ÇRt3îéxߘfÄâ¸Í kÎóá|˸s ÇUÚÞO¿È6¸_ÚŽõÊ*Ü0"sÏà¥e “Î@‘|(ÐáúÌxa3¤([¡õs ß[jÊùÈ6W( Œ+À2f! 0Ų*Ú/ÔCŒètJƒ$„ˆ–¤A%8ae‚)”ÇÅÍŽeâ^·¨ôŽeçtТô»äP#(_!+Ïël/Œ—·)#zM‡èDhšôÀV_< Ò?ÿ¡<ÔúÉšCzjóú÷—ËŸœ÷˜_x_’½´/8©)ûŒÀ€7°É\˜Ò­)‘Âû  ÇpšàCÿ[À(ŠõžlKš¨Ìæ5‡Ž<$ÔŸuŽSÉ&вî`¼ã´ ÿ9ÖÛ©¸ø¾rL~[m;{áøg¨$!0~óEꩵA(ð| à§]ÓÑB$ Šðã;[ÙËi½x9‰x#ãØõŸçr™SƒEzõj…'~F8Þů&N‡†€¾E(ªEª.æˆ(uùd0;ÂÁÜp±Â59ð¹Œb«ÍjL031™É¬– ;&)gXÒYà X‹ Ðj¬H#è;a±‘ªš†:»eš£2=V “#'Ý™xÔÂÅxÆÎM­Á8» EtF^A<ö›¦²Ð4ÎÍ•˜V~•MóBh&Ͻ0;ãt&kH/Ñ™DΈ¤H;+‘„Ï‹V_«*æ»Äv†H;çH5¦¾_T6Êë´RÛ ÛM;¾ÚÛª1?ß^þ,^“É>áþúúÝÿçù÷ÞQK~+¾=ÜøÅåß°ñS(Ί°•à€,9ŠË z²Ã"Me™rÒ‚—¹öÄ™Ÿï.ì4ñeAF¡d>SÙÝÀ¥P»Š?°%÷g•¸&zŽx·¾íN­ ÏíË>ç{¤ïöÎ>>¼ûâgèf'XÉîfê3Œ«àr’Z„° Θѓûc~ŽE_~ë½L!k¾@*ò_Tj¨T~#BLÍ"—S·oCýéÝÒŠ|ù{øÏÅœ T¡.Ú’'â]þFüûS}y¸ñG¥Òåõíó­ƒóÕAA{|>?žF³—±š_'·tñ‡ÖÕÞ#½i8|« ÿ¿ªÕ»«ED¤ ) D‚‘Ù,…!cM’A„EqkŠR;`–K^Wv+h\sÒe0J’ÚðƒQBªa ÎÝŽ7s+DV8Úa„?;÷Ô4”Bø³’‚º¥Œ›NSl‡Áض£ÕHËt9¨Â¡éë&´5|÷Ðæ¶}sÞJ„&„†[öõa…&¨Y‚°ŠbërƒLtDg yË .å½d»äIfaY¤p_FÙ‰oNø0²‘t2êk†°ÌNKÚŠ_Ímس6lñ¥aÛ½{µ?Dô¾w…ªi‘óã¦c¸zÝ”ÈMÚ†ÞJXÍÒª¯Æ|™SÞk õùñ˜=lìæá+Ÿ¼:û EV|«ÕßÎ pÝ’,Öi]ûÒ`ÿFÈíáñàïl mËÓüXã뻗㥩ÚD²ëÉÜ]AN4þ¬ü?‰‰CÇ9µ®^þy0Sš³S æŠ#PÕŒ}I5É¿`WlŠ6:tœ d9äºÔh¬ÂiV‚ïklcÀ³ÓRÌM5eˆqr¨ò®a .Þ×K´kÀØz¯ù¡•C›tî›_ˆrDéš %¼@Jƒ®CÈ–ì„3³ŒA—rÍ®F OÂý“IÑ‹.»¡„WÀH*Hj¼ªëâÈ!…–ŠÎY~ …؉¹o᛾¬„ÎņÅÑ6Í9·j0º+—x¯å…¼|»€ôöôœ›4 L/UÁÄG0¿åaGÁµ˜hÈFñy GÀ‡ø-’ ()¢ZY…&Tœ 7²£6¿XzU…7â+Çó/»#•ÞŒÙUp›r3 IÔ 1öV=CS™yùšpp@rL[zš3÷S(¾~zSrÔÄÆ…ñCƒe¬ûˆŠ•*9Q÷ä6 †Íý°ÈŸ,ä2nüßÓ2®ÌŠ;£ë@'6® /…cn3 ú/ Y–8Å^œükOÉW…‚­S¤7¡×À †(â,M+8f*𸸼å@…È"g4žÁ@mÐsi3i‚ž‚ œŽv,ÀÌ3&놃0va]‰Ûrí&ÈòYȲM¡û_bÿÝÅ ËÒàÁɯè.`˜"ï m ýYSÖfßuvd ô ¦0Ž™ ©ÃP¸pxš‹ÝB(t $%nÞFß²ÛNÕ¬ nÉî5î©Óàm™Ö–ŸÍ»9pQ3ù˜©ŠüÄòÓo&È•·êW5¾Ç[+çΛ€ÁÜÂBGã9g8‚åkzæúžW ~¾è¤¶é<ÝLH“"Ø) }¿±ªÐb`owct  ¥K´0&+Úî|ëZ}h´ªÿÝJo<æ`WklàˆŽñEž¿kÇœ;… ¨î˜Ž¯ÞX£LÏIÆ„r5'F40l°ƒ‰H-ns #£ò©«aœPC-†3!Z^òh‰¦UèÎdž¤Ñ#‚VòHó‚»a,9€)θ.˜†98Ùäb ¼ì<íHh)¼j N*ÄM5~­± –O6[(`ì-Za3ÐþI³`E ¬ž8'H¡O,(Æ8 b‡”vwÅ!‰›ÂøSÏ„-Ÿghž:jVqœ“röŒû×ôÀ$rIÕ |l…*>­ÂÆ  çQçs«¨|v@ËaÔPB™Ò 'R´ŠséœØ§? g|t³‰|BØoe+ÞÚï¨LF ÕþiûñvŒ’€ð`â“é–]|.§#Or<…mžFfŠ”Lèö½§`ؘ—¹Šði‹±1âZÒßÔÌÊËÐ<þk<¾Ü[;|~yßÀ3Peb¸ }yu{<<þíž<}ÛÖÕÏïÒÃÌÅCÚ^oÎïäÈSêÿ†xõéü¾[ ú];þß'´¯tërôî+uþU®µ¥¡Æo¶_n—õ‹ƒÓOÕÞÈ]>¿_Ì…åúû?Ô!TP‹Þ6ô "Në¤ô„k05¹š!QÆ…_ÙPlFÌS¦^‰0 ~e:–¸F]„œ8e_pqAkmÙ @ÁDœ!'¶FˆµÇ:\müØ:Q‚AûáDÚ*MOQ4K¤óÀk †žcøã¡DEÜDüÂáÖ¸²”’~p¨v$± l7ŸŠçq”w‰ÐAº2A`u7jAð&¡Œ&°R‹ˆ†š“ÌNû!èšvBéœãúsš¥0—b@²ýN*Õu¬"„ˆØxÆô ö{Sñt…™šP+²ðúyÓáX7YÂt 7åá<,s­º5ƒhŠ •Mïø†n[CúG.C`Ð%QodÀþ`⬇#ƒ‰ÒÌÞ ê÷ÉN ¼ô0Ù²®‰´ša‰ýã©ûÂR¶"O2Ÿ%ß_LE8Ã[cª–ò¹zF°~0æîà&éÑN³|+ºÇ„uëŽ6¡ä—S(ˆ±Î¤>©Ágh8Âë`8ÛÈ’!VnuÝ F„JJÈ 4¬¸˜Œ°dD¾ü”‰’‡#‘ÄÆ´â°À$Þ£J4%ì@þ Ø У²½Ä›Ðw é1 îbòVsØ`‘ï Ì 5@†FËÚñÀÏ4Î{0D»ÕJ6l“‹Zf̸88òYºXb$‚ˆã¾zF:=ļš8{&Þ‚÷o ¨â5îÏ9ÈÕ„ö„½!–. ¢ÔZÀÃð²­Fz-Œø©(èm:åüçŸ"¸$StÑè*ØLìfIhá‚`rϤÛó)„RÕgC£ê{ûùð¬Ïö Äš0ú]‚àe“¡ £&¢å Ï -0çäÄ2¨/Q`õ´e¢Îï±æwCûɯ¢'ópèÂrû´E72rLb—0L(ìï¢ÊqGU4ÆPùÑH'ËÅß“6è °Ô‰d%ƒ†¡eH 00ª„–ÑýÈyœ$Š Ô@F ®ø¹K¦¹|i“e÷TH¡»¡¯ã¾n¡Ä–‹ç¢x}ªíý°W³Þ`újÔ“s¶5 °êS8e õ•”â¾×î †ïáÍ&hã¾}4²&¢r(œNA(”Q ¸bqÄ<0R߯¿—ÌÌl0†ýA°ÓK¾ÿͧûH X ^,‘OM!y]QK0:jÑ À‘kE ØÁ옊(í4syg0‘•­-Ïü("(#©¶Òì¶Þó†1@*1†ÒJ) ø™lï“wæéºC·sTç Ø<ïÜð;t&Õ·Ò¿vŒƒ+˜ˆr5€ÌÓèöè› ¡ùp·½(×uÀú´×€ÉÌŒ{7нƒ mdfäxβn:I…—áç(Í\QlõLeK`E¸½Ð¨Š{(’(¼†Â5ÊGÀ↠L›‡#Ù“^ZÚØ¡—Uæ­6Hk(eÍ‘FŸQ!V…±.6â5Sl8`ê<°m€¨Ë’ªàí\C•ﯳ[R³íHnŒˆA;²ƒT3î½Wuð%)` ¤E U> ‡[œ¨­úeÄ"¤êzÃP¤Ì99•€~ß Ò’/‘q ÉÌZj4.ýV­ÖÐ…S•™(×$¦VX| Ô×C¥=è8oÛª A ÍìÝèZ¶Ð”@˜þY9mÓ­s£Ý"ÑA.Ò FWg„Yu VŒÞZ}׌þÜÞ5†Üï°[‹ñh8{¾—®ré˜ÏîBTŸ†Ž.émׯ !ˆ©jW.˜zÙÊ,ÃNém,ÖGçÎà)O*@ÙÐöª1³Ùjë&ÀUbc(Ö²ªz£aÂײÀP&¡ „°dL*Ä~* §t‹ÃhÊÔ¨ÌV+rò±"t© neNlhµTž¢ÍÀ.wæ ƒ_A•Û`›ÑñUéJ¤h "¥î…¬m‡ëRì¨ç’x9gÒÚû)h•À–¼KÐDdTy´b^°<‘QÅLp3ñëvš²àuùÒ^ÎëÉj"h[ê)ÉÑØù´ÿ»ðÛ]»$¡Q5CßJ4¤©×k|ôóHÁ=Z}˜€lÜœot7oGæm:¹á¥j4Ÿ·d£+ÃÒû¦ý د‘?¦ ‚ÔaTÂ%¹€1v¸ˆ#»1%Œ`%^¹žƒ»™ô/0¡‘p‡ ‘Ùƒ†Bx÷À» €0Sc­"sûœ£Û$3$óS‘i’êS¹žFEÕSˆÔs£çS£D=€%&Ãè'‰¬J®Ày†Ð ‡Ð¥üæ8ÓÈlAcA¶°|tÞßyñáÕ0|¦‰õ’•ÃÔ/•M vÓ•/èew¥ƒå¹eâÖ -€!ÑYÑxÖhw‹û+›™*—(–1Á,PìÂÚ˜mÝ*øÎŽö¼lž:L±Õ™.â ô娣7èv™ {yí„´¥ÿédé™~áö¢~ŽÝ­å‡ÅÏë5‰Ïóó»4ž¿·³GG‡FŸ~÷ߟ‡§¡ÁçSùÓÈ{ovn^n®ãÓÈãÌÖÒH»ú<þXÓ3ý/wǶÏ8®èKHäíûÈãq¹<þn^î¦3IÐ ÏãóWµ{ôÒ…—ëƒÙ‡]#|Ug U=Ç-:ê'.ÿ¯Éy=¥,¿Lßïi²˜¿ç?tâíàÁ¸ÕCÕªjD‰ÔÁVÈÁ‰‹xkfƒ¥'³O/ƒÑÓúðÅy´+xeMØëÕ¾€ë»UÄÙèzq€³Ó!¼ßFÔ+£í|rʲ|UŒ&L ø‘ö4Ja,PSsoHÌe6‰æãDn8hNÂV†@â0Ú?±Yw—Q]Æâ~‹¼8äÿCcÛÿËÆv&Æÿ½1gY}Ëgì¢z" `í*ªïqû*EöËL=‹)HK%6ÕôÍq®ì0'ë’•ÑѳÞÉȪ»«º®T*{Fñ…>|T_MÅ÷éÝâÛùáçéÆŸ™Óûûuôtuöný½þþ´ùqáú¯å&7W¹¯¡›ÓOl ý¾ü>]E£³wÿÌüìœ µAý1O¾¿Z­÷)ÿlý:7MdwwOm]U?s»Ü¶Ð"|¯ì}þÝ€ŸÛµ ãÈ˵ÿaðÔû³mÍy4šR­ž<¸­Kä ‡ðD³ÍÊm„2Ie”t´@°¹Q‰Žî4$M˜€ôùfÇB#ÙÍÓ/¸ZŠ:{æ»ßÙ îfw¬û÷>ž¤L "gËÅfÆ ÞýX¥‹ä˜¯“Ñsž)pñCþ*”õÙ4%rdÞdÐÂ@Ô<ÜÜ÷Šý.Ý ña¢“ˆä •€„ÓXDb ›7ÇüaYÙ -†Ä×ý##´Ö˜Ni¦¤Œ^ú˜H†t´âî/ÈðÊy¾Ày›Ž§œ+е õF«‘Ó˜ÈÂ|â[™¶ûý¸WùíBÖÖÚAxr=Ú6qšB› ¬!­n΂#lýæ¸;@¨¿”÷çÂÖÖè­tÒIùúâÒi®Ð\x+ˆ]¹:í§ï˜Àß…±gÉWˆû—2GgÂóÅî“ãïæèry#µ.ËÍâëh¾"®‡?vBáQåŽsü‚«Ò×ápó¢(‡S0Šk}q}ûk×B§õ²ãN•IIWÔÔ¤FTg49>FsN$X**h>!žÏëI¿N¡ìˆd> §<†Ý¬eŒK°6jšNwN.Xmà!±»é¸k–\F³0å´J¨Çn¡¹b«çÆåbó†RòðŸo(‰dL]ñŒ%êÈI €šáéJ㮊mÅ©Æ 7û^¢Ê>ÅÓ&èBSßk¡ñb¬ãLV‹^:QÞ³kŽÖ2ä6$¶¾”ËNÅÑ6~ÙBV°i³ØcÑæµ{>ßnÏéÅÐÚÓGpLÁ¬ð˜á€àÉyÃ0È(Gv®¡ r¤L7ˆ¿ýx ™ãt œYÍjzh[ïf䇔š5^|,ÔmjÔ½"©«P\½JcõoŠœÏ×Û¢‘ÕŠ~yþ= MvÅ4lõk¢«aÖìY¦^þØq–¨©9$ÔZ4IHI(9&š µ½'X[ÆÅ­@IZÌ~ŠŒZ‘Û’½Æ”FÐ{ƒ#hú†üåm‡{I4Ø6Z8¾—·Î°IѧÒñ†¾ÆZ‚7i¥x• ñгâô˜¦2͹[b2dÕh¬L‰æC;Ó 3 ?u:oÆi5%Kô~îÐ)]×L[‚Þ, %»_ö“L¨ ôè,¸Ë€}zÔeapçd¾ø.`x<‡¤‘ÐÑÛ0fA>FUcßµ‹•Š`«‡–‚Ô-ÃBr ‰ÕmäW]¡ö$•ºøÁjd©ÄˆðpñÌUç)s‚ýŽEúÓ³æ‰8W™ªó:D^QÐŒ¯^º€]›µ>‹6ßëñλ T>-®÷%~™[‚gúç. œRˆZPfá 4:m”—¦ö1lc P!þuiOst!Ç TâÔlŠ&ëÆ>çã 7 óG ®ýL– Ô—„£Ì) Óh•Áf\^`h§¤z„y2È®’2yAg C­JຬŸÌ˜YøªòŒƒ4^Í<±¦(€Ò:„À[4Q9h™W;| J›ª+#N[ô !H,Šô>­@‹0qB%qQA`; `«kxW7ÎÄE›M›‚°Yš*Pe—Æç 'þžN2w„ã}¶jJ@‚Èeeð•qMLž^¸ýóœl—¨l>‰äÂôÀ+ä.R³hIÏŒƒ{*±Ž€‡HHØôß[¬°æV„É‘ð$,Á>ËBôãV±y§–UÝ>Ø.P»Oÿ'T>ææ˜ °Ç>Ôhμ†ìð‰½d—'¾I@šKñq9n÷?ÕwªÌ›L›áqãp3c&áƒÂK¢4u¬€û  ›$6™MKÇ©Osô¹9¼Wz;·¯ì¯î©ð¹#}.Á e¨ÙÏ¥‡«Ÿ¡™ð“nÞ­¾Þ®=}§›‹wâÔµ¬£§¾;}Ý»[ü:‡‘ïoSô÷ï•—“1}zÇÝ»y\ùÙ9½ßíÇãö·7øöeÞwòCõ·»:úY½4h{¯¿£—#YíP`D@g*¤y?K ¼¨ÑùÓ¾~P„O³ÈK9$Ð~Ò2©å–à‡$Z{˜ s Ý œ«¦%ÅÕæÆ|ãâˆÊ‚Èu"Œ`BÖ°~ÒÞt™ñU÷‡_•®óßDð¼Å3øA†’×bîzŒ©Säyó ÌTbn$—„¢‰Õ•w]¶^ˆDÙ‡Ÿ¨F$¯ŠûDêÈÈå2áQUª &e"€æÀIÇý^8º‚;£jÒKû×PHtLVìx@@¦1Úm`E)©"#´bfF‚0ÜM¶&M‘ ³WÐÂÈÁ¨xÄ9Z$s(®Uô{Ñc ,H@Xg+íéÇkø¸{Í †‘вŸ{j¾*(‘(Á©=ãÔ7Tî<+¶ÎK…6ø}¶ãg„™X“>DÞÞK¾¿‚$4„ NEèL(Iði)‡ŒØÎ93 2Nɹ gDp‡ØqëjLQñÌW³¹6¥ :ª£Nà)…ÞÀX;H’É€PÔ¸+1^çIפ”(ñŒËñHJÖ…ðódæN’¼b Åùæ¥yE­ ¯ÆI¤vò‚’Iûþ@œ)x÷ª%ô]åR:DŒÂ»–¼ãƒÒ5óPšz`ì,}£þ Ȳ„ò(!ü׉œ»‹Z˜YòÈ/‹Dß´c¨¨$´|–5O¤kçÐU#5ŒP¯qº2RÈêu )’f/]Æ@•¤ŠÌŽÊJ²›<–µc0ì•RfL{$ÙK7 °meª@/ê`ÂÞ]ô‰ —±ÁîW?‚q{DyšE÷rèο˜õPcR º[tšã€Õ“ꢄ†”瀷$`iÈ?ÐØ‡ÿð³Ò18WÞP¶±µ«ä@‚)­äk6%Ç• '²± Õ¢Ug9tŒ,8J)têuSƒ93*àùß°…„(nž]‰š½²S:„M­X-W *Åâu—YÄŒ@2RòŽ€0LHn4K·Šv+º/"«G‡¤ïèyL`O 5À»P„jÀ½úê«‚ C‘éË~ö1R“7£'`éŠ`Ð Ö4‘k/§Ü¡8t”èFÛir 8k+ÑfCŠ÷ŒE¡ð zd…*I—‚U= ÒfKZ†÷nN³š ˜œªˆš0K®ÞB”„û™E Hw¾6„ëö‚n5¯øL4ŽöDÕ¼Z c­:9l9˜Õ·Ÿ·ò×·Þ$‘!AF&Î?gJúÑçI=j¿æîdïÑÚ¿­[kô†»#8;rÍ¥»5T|Ì|,w\³fòX+h' Ð{©†c™ŸI9‰µ7.µ†wi• :bD±éd•aB/½p>Q\] Š»û ä:*l¬Bóå㙲"˜â(Àäî’P³Cñ9ñ<‘Ži@|Û o$æ@‘j®w«‘ %´=£I@ i£‚‘“Io’pq gQ¢ÝêâÕA3"Z[:RI84Üs}|Z:¬Æ,tGˆ¿T6OÜÃ7 LÞ¯5ÕN‡¾©aDlqR`FG—Á"vvê1…K…Á¾qžÓYÌÎ ,ƒ2âuTó|š²|öNj©øì3:k6Y|”‚Å Ê¨rž¶KÊCî4Z¿”ÞdºóÃÞ¬ Cæe¤ö‘G½$‡Í ±ç¯—‘ð½ÝòQä;tþÜZäŠÝ¤äÏú`òâu#v’I9 ˆR ´€¼S›©UTÿç+›ê#»—×»ùØAŒ£Såè¥[Ö«ŒBÓ//O·ï#´' ?§ˆ=šƒÇy8¾vјCÃ^PPEq!‘ka~ì6jNñ”À 9Ë3y6±2(a6ñcåO,~NaF:¹3ÙU¢4ÜL93ˆ©þ¢ƒ=Ý‚RgŽÏ¯1{߇Bí­Ë’Eõ›Ûɻ̽±X_›‚—'î€vx Å|`2Ú/ÄUq€Ëæ³vwåyï“1ßûþ"$©ýè­µv87ù¹ÙÍŽFs÷üQÙ|Ù\ž÷Ckôß×Û­+övùº¾¾l⥾¿Ç%Wÿ?&_¿‡Ï—©àLýÝÞ÷Û“õ;»º:ÿÛæï‹«Þï9ùú½ž=“À:EßÑá“ôvuyÏ—«ôWœ|}„ Ïûã‹¥p…ÅÊëúñ5-’«®!Âs¨,õë\¿‡„û´‹9ŸtῼÃç™çxº%Ôâ=¾ÀtR”€*Ò,Píp,àB©‡Ð0ÂS±1;ݰÎÞkYÊð»uÞxÛ˜‹ÑYÛá-|›f8—=ÓÂëÓšÆ[='<Ô§Œß×ì±¹Þ_äw_ϧS$Ž3ørþÍ´ƒü·;i*ÇáêżTò,OAjáxÖYUeÕóê#Ûs™ÚÑŠZ=¦ºˆù Ò!~ÆtŽp»³¹hø¥¯Zl¼C`ÑÍiéÌØ|\[°|:;Ù3ŽYtBöÍ9ÖÂÄ6¸„ÌyB+Gˆx¹8—ŒMÖ†w†áº›Ù¡^•‹b*Lô磬D~2kËVá/ˆjåZbó¾6¡GÌ;jçÄÏn[­ ºö*½\ç¯Cž.HA¿µ“jrC(Š2‹OŸ*·¶²*xc4-ê­7SÙSWåéôzE½^ÎÎ/éW‚,1ÏáÙéêéü:{J/OÏÇ/sôÃw\¾ÛÉ85ò‡N&¶‹<¸L±€·[¸ªRBÜéhNGî0pó¨Cž®‡pßcE¬‡ÀsÔ•)@T§.q)#™ý1jð‚:–Ë‚STN*Î2-d°ß¯½uséA½Õ•;1^·Æ¡îÖIZBcæ!Za1ÆJŒúeLŠÐ¯‘~EŽHÚ°:XìE[O98®&`BL€œé‹ò8Û÷IhÜÆ„¹j÷ªq ·b†“j³YŸ‘QrÀ“¹Œ¸™Ð$€eÎ|VÅ% %s«`¼EnÆÎ¹©Ä(À +z±¬ VcV`«E÷ÿ¨¨çx§+‘PëqG°¯V“Çk-!€ÙÆÈ7¸»Õ–õˆ†Ù¹“n{¶¶ÓœÎÞŠOžtÒSÇ € Ï:ê( F Ì¢’Põ`¬ ¤×ƒÄ™âu’ÆÕ õŒ³az“|<'~¾z~8Ôæ¶GzúÆ"Œw0 gµkŽxÀœöùšlÃóÞäk[¦µõÄ.O¶cŸg»¿ã 3Þìûí*‰b^Ÿ7Tg·tã¶òÜ×þ í Ge{ϬöNݯ¦«[9GØÉÄ_AKá(¨0Ù`ŸL°Ív£EŒé Uïk©±”µ6ùÑ»NÚÁj3Mø;Éû³xU¦Ùv“¤–Ù1uöì’àœˆÝ¬›F3r=ºb žU¤]ÛÊÉÕÁšŒ,NØ…µ%.xíXQÄiÇÖ¶ðIM¿2jÁƒOç»iVf]6QSÔ¡+kXÓˈŸdzIØõ…y#Ïz‘Jô)^ÁJ±š“OY„—$ÙÄɯÀn"rˆÑj¸–XEë{’2°c¥¶0éÜ]w½Æ®Â’ÔÂT›àЄ֍…/MàÆÙÝ;M-:§[Ư¼AòÃø2%ÐîùàyOQ4âóD$Ûx£Õ=J{rËP¾=§%ˆ?E¹Iiðh»GëÎ%„šÈ.¼ñÞà6Éñ®5ºÏó<ÖMœæ•óùlWÈ{8vó¯S›ÚÇøÖPÅ™ŽU2q¢Ñ‹žªüâP—¤ª_òªjŽ Õ8;ãIѾå´ŠŽ˜´èl&x'aÔ2Ý,HÁz&GrÛ±ôÿÈÙc¹–úJv5mIÙQÿÔ^·3‹%PGÖát9]‚¾•‹‹ }=lŒ¸›O)œ£óçt^ 4om¡××Õ—ÝíõttuŽRw¬ã=bÝ‚›Ÿ^Š£…h÷üö½ÿÒMÝó<}2¨ƒ|wªªã é¡×3¨Øøj¿q ùã¡Ñ­ÒêŒaWÕ ¥Ï£Õ¬Ç”ZÓz‚:]êaßæø•‹‰ y‚1ÜøØSåÙ›朑¶ nkfÙ·Äïún #«ŒÌIÜcÍ(‹ïU:ÎÉä /›jÜèw¡`äšF³( .º(´j³`ãÝ—ÕGœše5þìbò=È´µÍêõ‘Õß; ÊÁÂM ±!d†ŽÑîÊ{”A"KÞ°Î\TÀØ€PýH­š›n±•§ÞÉLƒÞÞV(Cj²Ôd­J¡¨ážõ4¢±ÑêšÕoî¬|ý€ZÚMüa¨&ÞPmþ¬šc¼ñ~L–ý2‹ŒÒJ6ß\?yÏbí·•§¡ÔØ*ÓwzÏÚµ:ª´úªM°ðr‰Õ L.4U³1ýÎD €ÈuÑÝÀK÷ÈbF1ž^‹¿Î…|ÿ·n‘¡¥VV[­ã]FËW)·„Þ`IűöÞNÃJ3•ñ.„ëVí£ªWŠÓ|P*FAå)@Ý=nO([½‹`b)ZY`‡}R%Q]•fð-]û¨:…EW$b@›È[à’Ìù#ŸÕk¯êt:º€†E4!¯Ã­)o9ÎitVò™è C.Nh #ÇWߨvo'ƒ ‰à¾0A-´e^·1b3,ºÇùB™CI –Í›ì,o9°´ÀE™õ B86ÉÑh8›(L:€C|¥ô+A© ’4µež áÕÝïF‡~v F,L8÷ ÕEÞ¡›èº!g7) Àë“L"]å™9Ô¥ã_¿×ôa•{gQ?Wãg¢^]þÁycý˜}•,­a¥"u½9ÿ€Í2‡¥¯%nÆ Úkõ™Už#+Y¶t˜îó–`¨¨ì†¢cÛ¿f Àõá*?àè0à ì Æ:ëT· 4Ô[Ыcõœt~ÿ"l?ìl.âEg—Wbæ…¦~V­PÓ;õ”´‚š`õö-ëÓ€²~Jƒ\ ¯œ?f[åÍòì°AT5”càT—°]¤6.ŽnàÞooUTŸn¤I-'ï¬íöñ©•> z»œ/Œ´~"">«1”\¹r´£@¤+)9ûŸ Iú1)«<ê㥙ogÅ‘!a·#8,ÓH¨dõ@‹ }YÒ|\49xÚ{‡n±vª``¿Ä „ÎOïÆç÷æöæÆNd|gçféñàäñ38QŠ«ç;ð'ÆR•<•uÒý"žLÃŽÐU&ÞŒ+1RìÿÜ‹bÑL™Þ›Ó„ŒÝÅP-îŒO~'=[ :GÝ7 º½ù¸œ6ìU„= ¸ôÑNhǸ¹øUȃXgK½Á’]ÎÔ|£•Ýö ”g‘à N‹±t“}Ú}3ç‹®>dÛ¾¤ÇŠÎíÚ¨J€«4¸w•Y{z‘š¨eå&+k/ÙGù±WÁ׸U5¤Æƒ—Òƒ¢, }»~M{.ž[¶ŽÛº1—Òf“9U´ {õ:Mcæ›ÂyžÀSiâK|á-K–ZGüB[=²Gõ3Rýó£‡ñ@MÃgoBçÍÅ{šBYP¼)‡Í›Ë‹aÎYA›b$ГœÏén0€ŒŒÈb¯ÜÊM‹€pá2¨Â=…—1±á³<Ùd1äÔ3°Dm×¢¹punö“Ô‘ŽNã%D}’4&üœ<þõ²Ÿ›#M&Gƒ¶Nž‹íQói:š&ÿ¨dóp„ØXÀ­¤U>XVÍÞMk}꣟ÊLS5MÛ'Cô0–94)D rNÎ1ËS.ІAÝIÞ„@62ð‰Jãiò v¡0—éÃ#)€°  ¡ö; <·z¦¦j5V1ÇÙ1ÏÕ+/”8¹n\ÌWº<(Q_ DСËX3ç¾ –RÁÒü%•r{c~y‰o´hÿ¢"ºt{8 Ý7‹œ±)zé‚ÕC _j(^o 1<‡YPñŒ¹W^„fñ…¥ˆ ý¢_m”´ èT»ƒñ¹i ÀI„öEÂM·£LJÏ'æ Éj-•w6^·,…ð6ƒ¨È/Ë µ¡á~•9͸Ԙɸ÷i<ÒBa.;u‡##lóû‚é¢cÈ— R;Õ—‡:†._Ô§ýSb`¾º¡‚Ǹ£‹–‘Ú¹#Lç‹­Àã!lœQ\A¹Å˜OÇ–¬Ö»vF´ŠpÕ+²„éê_—2$Óév<ß‘ÏCfÝ„ל¥} *?ää³[xÓœ@>\‚ÜAÖ)Œ[=Ò d&òu[_E´H7‹Ämš;þ2qeûy« UÖ@*iwš¯+Dsݺ§"×BZ¹|‹w¯®°zöÆXI ‚pî Öl¸.\Ű\Gù}½C‹¥$rg¥Œ^Ç®J=ì@JœÃ?åãÒ  ³p2fOä!‚E½Ô>öü'HI†®^çÜÞsd/n}}]Ýÿ0ùxtv|ºvøá–¤õŒ%aàʳYr¹°Ãèö¸îÒÿò|÷R’\FûAé!!4QÞ’(̸T<,Á¤sµPöº¹å ò\Œ¸n§—ùM#]D¢‹‚ù!ø%Ì9ºù^›ÿn!k‚|ˆTHËk˜·?˜¹Þ70Áò’§îôxyüþ.>–~~/¶îÁ3Ýz¿¼.Á¡aüßN~¯~ÍÞOŽVÒ·nO_O?‰w:qøbd÷Ú––‘IO›ETMƒ&÷Ï @U›æÒ ˜„yµiú/1:š‰A‚a æÒ`6.3‹ñøôÙúÏ1ÌæÒà’΢ӧЇ&N1 Ëq)‰~MAªo(‡ŽJ@`âQkŠA`ãP¬ÜBJ ‹‚ÂÄ' HgŒCBõ>|, ÝÆ" mæÑ[8Ä rtnÿîÔ C­üûðjI~Ø»êuãŸý»½|z|×ÿ<¾–èãáÕ·_ßìõ+;¾®Ÿf×¾ªßòíÿ¾_–fn軦lã½òéßàã¯w•ºØò>¼üŸ–Ú»ßÞòOÜ;x‚Á¿z˯âóùötü{FŒÁ˜{<;6ý;|;¿¢üGfìx–AüðÿFë…1~¹¾Ÿô‚WÜùoçÁÍÇaú.ÀA2bû+  @>ŒÈ]3à¤w€¯-Íàn~çJ¿[¯G“rBVO¦¡¦éÆ^Ì8§H]zE<–ïR 6Z`TÕœå:gXÖPÍe®Tm´ÎžWú¢‘ k©ï«êt¯£¸W¢w‰u9zbÁ«©GHélpý}åC a•?¶}fÌkÄMÐW­› ÿNz6Ý®8âöÑsü×ÑÊ8³¾H= Q†AÚ@1€‚ˆ,#% YBEþÒÚ¿5ªºÍÝÌÝ_ 3ͽÍݺª««½ßå)rÛ•ðd†LE7ÓÜ2t׋[úÛ.’ì@º’îŸ ßœ løò+j[nnH4ŠÈ©ü¢›Ã¶ƒ¥@ýT‘9uÂиaÖàp©æUô̯èÃÑ)À9ÐdZ!1 Ù4ì¥E²ÅjÀÖ˜´”kI A™@‚Dˆ!4–E½`ÚEÀˆ%pÉ(ûx"š_#? $[1 »¾ðu ŒiâÏ 1äe"Ãñ¬¨'Ä%Qɘ/ ¾Ë(ˆƒOf£)ų¤·Ä9/0ÔLrŽ“31¯c­~}K~– â›x$Jz"ŠÕaáËŒKº×¦¶^cWÈßs>2N§£ËFôã&O+¡«Egd¾ÉÃá†Â\€-%à –Icþ6WKËQ¢yvÔ{Ú?ÐÏ+†6xéÒû‚W¦}`t¥ö79…Vƒ¹¯`$aåQ6+ˆ·¶CTù j²ÞÒT"—H÷.'(³žêÆ+ðº/õ/îH¨´ ›·yµ*ãX•‡-ËUVºŠª½©…r梁_"W¢)U*R©©’SX‰»sévñ|cR}fÉFb±Š©ÈŠM S6º±e~9pÙ9ÎLŒ3’Wü›CµhøA€ùpÕ¦W@Ÿ¶ù©1 ÏŽ'×Îjž¼ûT_‰¿…¾)8É9½‹í¹ö­Ó·Ó¥ƒØß®ÀN1:dÊÓW1ùÜ šrœ„V$ò2Ÿ:´äöŽ4ƒé j ^‚Ë!>ç®Ô$O£Ãj h3œ||KŠnÇðô¤éáæ²…Ëò×÷=½xe•­G™þÁ µén¯`€ÞBóÏ#ÉÕ­$ãÀÓ!qBaŠ»¹‹ÑöZŒ55hÔYãÑ¢t©_ùü¼•YÁï !…k…3¡ù‚Ãi•S½wÓ¿c°–Sï'-¥¾{=\õ@ÏÁì»-CcJNºe% Õµ;ÿµˆ6V{ô]Ë H\ÈVÑb–p‰tÛmS=ª,•¢ü!5dâ—ó0®É¤gËÖ¥™(ÛdH™"fž{¢Â.‹M«È©€×Âò¥D¹’e¥Šï£:Pž‡²ó`bJ“íX9T }·d<]#Þ8ˆã\,†}>:œÿV>.Xsm3þ[>,€Çõ5pp=ÞÂ’ÀpÁÆ{Ž£ðYŒÔN/Ÿ@/ûTZpÒ½¼®'æÜà“V¢aIš›×ÁËâ2 êƒP…² Ë +Ù·•\Ê©ÀgRÉg5%’I‘îL]ªP‡žG ¦æzÝS¤Üq´«Æ,ýÀ,£kQ _ÿÖbë0Û:¤[Ø_x°Hé +µzwÝVåõ¤Æ©:z×ò™ÛìÖ)}‚DgÍÎæ:·`1€&Ë6ø‡y§æÀˆþn¦jA¥Š7’yÎ4U )´ŠõÜÞO¼#·z_neãÀöç³scïúª£Š£#ôbLÀµó}«,ÿ·UYi¢Òðвblí(W‹>Ü®(üÍõ: g)’À®E¼øO› ÎKE¼Íž%<&ø²ÿÝÛ%ÜôóOâ¡‚·æFû%Ðñ˜» ä¨B!®tŒÖ¢ZØ\[ÊÅ­Uùå? «ÿ,ŠÅ!œUH.â›ÉWÅTƒ\ÅÓ vÉä¶ãÒ½/Ib}ªåMv‚-å‹Ç¹ªR4Æxn(Uǖ䪹¤Ü­Võk/ø©Ôôe„£é]x»½>./>^~fž~ÊÇ®Êë—ð=1|?pŸ¯³Õ÷0ßÚ¯ÎκËÇîîv÷þ^¿]d§ü¾??n}>ÍoO.–Êã«Síñê÷|{¾^§~nvì›&ãò½ŸêçòóòÒá ÿàJ+Ð.«ÙãÛù}|=Þ.ˆù¿ª‘yþ^O‡vŽB3z}?çúðç}EëIOéßà3~9?.ê—æü×–hkø}ýŒXHgÃŒÅ<—l„›ói”͉–iÁFu¸u«å ¶ 'H…eiÖj"Hü3»s8½Q1c’eß½æÙšP¨ ?Ã$âÙÿ#b÷gY$ÛÞâŒjËÇcüjÔ0‡µ††D´¸iO0Bœ"FÓ`½è_JgÁ²ogüÛ­‰ ™ÂÓÜWèqáŠ` ¾ô‘›—3µž‡:pîõ`ãøf\È”ÏæYq.Ø„ QÚVr€Œ˜W!O=#6:íÓ”;tgh}ê.ôþf¥“á"¼‡:£±'¢šMö0Õ@Ù'gkÜó(ShÉç`œP:" D„ÊÊÓ-Æ¢ãh8€ðˆÆúw8$J‚Ó„Ê7ËxJ@§½k‚h&i‹üm¶¨P {-Ò"EÒ+ÔÊ„øD£SÈ+"Aš¸TTNmFý-îƒ%Ðj>}Ò®¥·ºcµ¡¯ðƒ¹ßÊA”W5²‚‹ÌsÆ^ó™‰ÚÚ¯T¨Ìë†ªß  Ã\Ѕ⦒_–%ÉZÞtª53a¢€KŒe½,”-EÓʽ±æG€t@Sµ»v²» _¢i½b)–Œ½FH]Ö%ο®Ïî è ¹eVK]Ç;`DÇ—Rn<Õ¦ª?¬s^­ZH‹¬:ÔfaÔPÅñ e"jBÞ\ºFÊ ­Œ\×VD™U»~ Uå CâQ"!¡bÊÀp—ƒJ‡e„ÞÌ %}/™LÙÀL¬V¯ŒüücM@˜?cS(Ï¡öú Ë5Ö¹ž?”d7yÓ9…¥ºc:˜®DsÂŽ {Çs<C¨n…ÉèbËPŠ ñ¥av MÞ%D"e”•Ìá˜õ¯ÞR,]BÐ|h&òhÒJ–¦—EŽ‘wK%!’|D…«ä·«R]‰¼u§ü]töI*QyŸU¶¹2n²ª $FkaÄR9]ô3ôÍ÷! ¾v"C§[Άõ¤< l·ž­xØmc,ñf¸ ×r´²<Òyé”lFÖyìÀŠÛßœ…0¿Ú¦„C#A8kŒg1&+•ŠrcÄSÂddÁÖÂD0©2ù%‚•:ÝRñ ÌJu9ë’uÁz°ãÜhi–,WV›ýPŸ¾íèåäàù¶àÊÀïS =±=>~ Þ½}é«üjë‹{QŠ/Åááœù™8Àƒ¼á(ÃY sÂ`ï×ßËÿ^`I“±âµ ©í£¢¸ "À;ì9®oÿ{ ²=½ƒb~ì¢ Œ]ñB"W,.ø»Ÿìú§5LÁœ¦—@®k ˜aOZÞáøª[× iõâˆb:âS˜-˜E’t¬S%;PÐWWAøŠxvAAÒ*¿)&uäcSiûÑG—ô eE† a[†r ¯‹^:[ Ž\ßARlÊDôSJÂõP¨d[-'7Ÿ>â‹n °¸®âÌœ  'ª>±X¨®‚²¤ ôt¥f71œhT­ l[ -È!ÚÆÖ`f+,¾ÈÃü±j©Ò Öí ÷Ž•bÑøØ˜øÏm£:¿]_?Ê’MûðEȇNÅ5¥?áömv°‡ˆ‰ü…}?³+L“ºTФo4‘*jÖà¢(`ÇÈbÑŒAzËIð…EuX$&ñø-vADC &ýípâ5 -tÄ@ 8 wWŒ®$‡ùEÿÉ*õåH›Ïƒ­Âùz«ª?u?¸ªÐU7 ~LÝäºT µ7½èR*ÚàþàÆP¬ÏP·…ÛÑ=ŽÀ…²xÊ)2D«Ò×Ü!.ÀŸí¨ˆ]Ñ Šå5¹\Õ®JW-kšõÌGr1¹<ÜînvªV;ê}~”~;ä]‘ªC4Ô^À¶…#à-)€e.I­`ˆ]}ÀÌ2 ¡¯*0œ”å¦Ñ¡3‚¦éÆ"¾›oÓ„äÈÇ«a5œŽvR5ܦ»²óÌ.1%«€ºv`Ùˆ—fݘGvU€îuHìèIÙP33¡ç§R®cBngRîàL›ÁnmÕ­lÄ)XȱãœÐœå7œ¬“”£’·ÓZ›ÙWr6vf|ìIÄ&X1d¿.È}]^;2SvNìíÔÛâc·—nú7¼v> ÿ6`ãÍT¶ñРs±Í\½àwæœ\$¤—×EŸvOwÒl‚‡v#w–kî°K¶ã(‡r±ÇðmWa6¦)ácVn× 2j¨(<àóV–Áb¹T»³j·5œ.—tÚì*´«¯}ãW~˺ق0†7F‰²ƒ¶"Fs×-‚°Moº¹ªmƒœŠ{]‘¥7R)Ѿ›¢ÕC‹îÞí¡m 0X©È+xwx’:¯l~á1~ù ®‰.µà´”B»ê¥mT‰Ž`tõ¤®À»Ðpm¬™æöoXÁ|Ó{îµ «×Ýi1Diµ2„± &ÚÍo¼­ ªâ¤…ÏAD!ÀÔEPݹl /M™&)>µÐ…– € DT¿¢PC✶íySkÀ#4`Ýd¯ÐÅi{)ĈºåäÜΤÉêNîê¨F@ž»8Ä•Ù|šù??ŽwÒvóüÖžü•|[¸«‡yð¤òFXæ‡"¹å¾ ßè”ù÷ÏüҜ̤©û"•åk¸™™gN)ò‘Ùù,íPœ‰3½c'—OÓXîeU>Ýù{~~ÉVÒ±,à?Îc~‰Y ¦ëÞM+£eèõßXèRË&t9ã#¤›Ê~Š s6ôT}¥ô8 Y0Õ0Þ•€|G‚àèƒu“Ž‘,Oa=E¥¢¹ÀM3-#PÒ’Äÿ±`ò±¨kPãñK !ѳ&J÷»"Í­ÃhöÆy€do††Ln^BξtzNÍ qä´¡0OHÉdº;JÑá(‘Rû­ FÑœn¦Âw"†‚€L&?Ñùº½Êgºaë+Ÿ¶Num*]è 9ZÎn´O,7²j»d”ªCí—ZÔÏÎXS¬j¤ÌK‰(™”#¼¥ªGí¯¬1\kå¯%X7G †¿ö¬²Rª·¥ªB6öˆÍ ¥°œ³.%Í–lvÔxê{ŽL!Ày“°‰R WëhÜì“’‘B‚ù´M-&PSb×ËOd’(B«hʲQ³Kì?ÒÞCyÄt×J¦BS­I)<§®eX(rl*!lŸ[‚‹T=Oí ÂÁE^T¥˜ñI;¢•ÖÝв$mãéç!6Œ”󠯞" F=i[íÃAóìuKU¾«Æ~&óD:—KÚ íòžH‘ÞB×§$,œ å­ˆ¡ŽÿkBeÄw´(´ “^ 2^­7 V”P ¹EÉZü`}ÀŠ`ÂìŒn‹×:ÏŒKÑ¥dy¢ØDRÄè´Úf]ìáÜ“¹w 3õi jé¢EjMSZÖͰ|ø6†í J©æ•Ù#:ó„¯Ðj ˆ)ZêOZ(GÐ6¥³^Â%‘5$ÿ;•¶2Ž©]iBÔ)¤`P/A[ªâÝÍqõPŒµõIäæÅÆÁO[~ç¹C ^”‚ȵrI/¨ï¼µDJ3: šM5‚àÍVÄŒO³³æk]í£6÷ nâF!èb(ŠóÁõ%©-.«@¥î£ÑÑŒ^S¼\ÕkP‰bi«ˆ%òtC…„é”ݹwÜàï·ûrÜŠî¿äAú8a¥Ý1líâTVÖš>(€;k0ñVm3cÝ*‘jØ •EñƒÆêÂM¡Ì#”ýᚘ2q]!PQaH+¶[J·š#qÀ(µZS[7‚æé§ôWeh€éà FIèü„Ù‚ª x¾÷ÚJ7º³G2—øÿ0òN±Â0Q—æ±mÛ¶mÛ¶ísÞcÛ¶mÛ¶mÛæ|ÏEÏ$}Ñ7uQI!•½×zRÉÞsd·-H‚ 8&;ðÍ”C67BfK²3ÀýoM‰^==ߨWG[[òú~¿N/}ü>7gm;Woîs~B¹¯ê~/h¤q²H‘ è?ÌAW™òÐ?vl”ÿ­°/ákúÁ%›D‚ÛúxüDóþ8MHôòL où×áéíÞæÛ­YJÓîð·­ž£¡[#)‰Ñ‰‹’Ê)¨—êyŒ¬W™¢^\])‰±E?&¥¡‡”ÁÐKLgè&cy,œF™¢Rž®•”í~(\OF| Üöþô–tàóé%áÌãÓGÊyl¦nTžÆCÏ5rôª\):L‚ã£à9Uü|þH¥W ¸tÄ„zæ£)Q£“Tlè"“K;¦€L S7¡üßVF} ï#%T{žÛeT»¨…^.ž°“/áíûúvBXÔ";øEv~<€íK.ôT°uâ®k‘"±Ðºo:ê¤)$ ³b‘Õ%[à&­R:ƒï¨I­D½#AïÜ22²àÙ»CzdýPã K°¤qýÃä …§à¬Ø <ïHÊ»Ž3*FÝœ¼æÃ¨¹t±îˆnB”4#Ôdu×H&Å;í’ª<(\ ÐñÞ¤¶tÞl +þ.#è÷¸_¥¤Š<®ÛJ>¹3N;P“¤7P»¨?P›¨1‘ý•­èƒê½Õ¤}1—Ûâ3#–Î 3†œP0„Êg ¤òð‹ðZdzNùÎ]pù ëx @‚B$QbÔI=Œ½·Su¢I›â%–Š·¼÷µð$2ºsÀvɪ΀{¦È¡Äèq54 éDLô'%] Tº!þ¡×ýfAj1‚cN*wë×-ë§p˜b«F9XåS5‡)Y°¸JLÊ ’Çikzû¤%OèóÜü<?“¼3uâÀÿ¸ÝôsivpW„Q÷còBñ6í'…éà=sX¾r€üÌÿ ‹®¤g×±ì¬ptKIÑ 6w$"¡‰Àï2ZŠîæ ‡±ï9¡'A£)ýò­´n‰9‰ôùÿ1ЃÙ¿Ø~&òÔ˜Œ­ÓÄÀV£Ö @°Œ´¤”P¥"\Ý9˽Ä3gc.àŒv à™$ôª¨çTr‘[KïÇÀ¤ÏÉ vØE&yŸ<%ާÇíêЇ$³?­ÐVY&aò)–—Ú¾#^ Ò–fаâTžjr³@ÛT-è¥k97à„wU .d¨¦¬ à{Ð5È@FŒfÖØ¹j"Ytƒ~•ßúKWc²V~Èb£5Ç`P€Þ(h!xéD¶¶­“öö ¡ú¼˜ËãÛ2µoÌNÈ¿E~›2q£x®YÀœÚ+¶wØÀ1àG {­qМŽÇŠõŠú`Ý@ølj‚¼¨É ,½…ßj¹_7v€{R@>ƒDŽ`ŒH|½aož¶Z&§zÆ¿-Ï´(:~n'4墘ßS4Þ4F ³ ¦%Ö“!Ðì'”Òè8€)¬#~Ìû,&œœ —WÐIÖŽ1)<Þ[Ø\ÚÄæp¬{IS§¨³X— Ás½\O(ËNnpºÊã¾.eÅ#OëŠ{8oŒ“œÙ-ñ„?MA¢ZT3ÿ\³K¤­»}}þ®Ì|ÿžÚ±jó£ùŠÐÉùˆäþݵúåíìѯV¹GÁ³çÝ­1Ó}<,Š>Ó¨Œ\lìì8™Ÿ\­\ÿ8=œœz=pÖ1ýéù}¸´õÚÃ}Bÿ’Y&qѨ¨×©¯¡ÇµÝÝ¥>îèæ ©Úzú:òkïõ àöy÷WéKržå–¥ ýõ8£¦G¶Ð÷ɳÔ ?°{¿£ËüÑé<´¾ñ«:Â^ÕÝ‘­æ„3PJj/"µª:'ŠØ±ØÊø×³d]'ßR&±°ØV©¢òh`ÔœX–èTžÈµ7±äÇYøë$4ÞlBD´»@ÙfeŸ£ÁZöÇ»/ø;GLžï•)©×•'šÔ=8­ßD\Y§ÛÁ8&™NÒñlÚ%yJô}¡ (HÉËg ž#Vçì®Ñµ¤ºv?ÑÓç°ƒÕ‚Õ0øsl3, ‡dŒ{­±ªrø´¥ÓîÍÞ®±ë׃w\y2ëëL›Oe­„±_e]å¡ÅaùWŠjvkÎáiðxÂài¡j€¿ÞÅ$qFü†‘Q*k ˆãD™.eBíÉ”"i€«ª»ÜJ(ì¡¶†ÐH;¾gtìÇ^è¯:—;ºOb–_²çúàà„‘á yR!†sè;ŒFÔ)Üý`ZÒxjÍаëS¨,x‚…¢„û‡¨ÁSZªh¦ÌàN’«Xdj°lu¥¨‘¾ôãùq? Ø+èFKžàN!;K€à¢ØFÓDdCÚ@±Tà½fGvC¯ãpV 4Ï£$&ødâ6’FÀ¥°Î·€-ŒL¤LéV¥ ‹a”0åÔÑÞF϶aLÒÖ¾ýÛà.¾ÖWyí¡ü¢K†§ßÕ‡ ®À 7£Þ\šÐ¿Šz Šõ™jÊyͶ@£„¢’&ˆúa£³â‚’Γò‰§·‰?è%[^ÙÁw½Íåvpžj™Më¼{)õŽÃnh{Ú[ÅÎÓ…Õ ak>‚íÔÙRõ¾á )c£ŸY®è*¼ÆQr£ÇŒ|‹íZ¢Ûƒ´Õ˃€S”Õ#E4F}/*iu\°?•xF: OMNüP÷·ƒtßç†Yð@ÏLDNM_Á¢‘l°˜“T*Ti<©6‘ ©*,í7yìyœGAÙƒ|ƒÙ‚EÈI•d$¨q¢¤c jFOæ!^æ*=6 p*ï¨FÉ›׿{Ð+H#$”*û‘}åÛ ‘RóÀäI!(%«u,¿Ðó“ M±¾˜ß%:Tá²`s“ftdí*QÒìmîA¦•R”ÃVX* cXåoHÁ‚_ÂÛ$´èVÛõr[¯1 0É@HW€±PœÚÄ2‰w(7‹¯2òuÿº¸5tÕõþåøj¦°»«ÝjÚ¾Ž=¬Í¿8ÊlYvcs«‡=r<‹y{˜1[~oªâýï=óu¤:8u°¸ª}ª¥­Ï ràoxà ‚Þ(Nõ÷Jk/DõþZTÍ"øëÌ«à£ì‘—–DØDì1ô¶DÓ¾ «­ ×?|öÓM}âFEm'PT  „èAÇ¥ #áFPÀÓ‰¬ŽMJ5ü•Eîd:‰”‡µ+ϵe=ˆâ¥³©Sbeñ¬ÂERDýɱT/èäYªSus-¬äXrÉ7ëžDÞh= ¹ÃÉ7‰=Î~NÒ',ðF‘ •ÇDºâÈ7yßNxñi·y?´,ú¤ o›ë¯&ñ´ÎUÓШ²}PhEF~æ, ä½øi‡h÷õÀ†vŽF„—ŠÂnÂ}Œ½Î«`¥/¯”Â3¹Ãq/Cqñ/6Ó|ÁÐwŠ&<¢ãHúæ½qà }è%¯ñ¸sI2Û£¾ÿ’†qßþÚ5LÚIëAâ“Zþøˆ#‚´žÒöàKãKFúͰ¢¬€©ìG‚UÄä`&``V"0íi¤zšÛ!qªbM…Ó*iøÔòýØŠ(¯ÏMâí²²ÙæC‡÷©ôMƒüç%g~û§LiÃO…4Á_óg$ïi0ú•lnÏ++- áfCαð ÕâO8= ÷ÙR€bˆŸÜmÂKÂïÀpi €g¾4 'žK?NØr€ƒ~ ~7ïïÔ‘Ã"ÏËH°ÅÉIáÿä´,xˆQ;+ìØø8Ipzžç9¸%ûî”é6Äm놞 X¢ÏÓ,Šª¾xõ19b{,—0k”\¶24ÜÅ8P’ßæ© W¡¹Åù,¿e½–F/¦Ôø¡Ì´èû\éûk²Ñ< ºÕ“–‰]µ‘ “‡ €±‹&É á9 ¾ÒUÈr ²-'R›`1(`Y&ŠRŠ·’uÖ+òëÉPTÞ!—ƱçåA–…ýP]hTìzó”“ÕâÁµ¡K©R°ú°§¸{Ïñ¢Ã`1XVÕ ³—Wùï笙¢‘c&”!¯ ä’¾QtòÍIõˆ[YÈL+ c‚µ÷MØíÎZ 6ÖWwäüqJLœ¨ÒäÏ:t€†ÉÉ™Õ Q”ñïÁ@‰1‚6,É›ÖYï“i±ƒÌªù¢"]£C– aZJ©”(íˆôîd™² ç#ˆ‡õDˆPïˆÀíE4í‘>àa 䱡©¶T%¨r•÷+ J…@a,ªL¶òü4þEJ‚(àõô'‰ä»%Š£e„ORo˜(œÄ ˆ‘$ÖÕ'i„ýÛУišè$f™#7JìTFó²`äúÜÖ– Û¸Èf••êÔä¾;q¬ºÃq>pTËz.äèi×ß«æC™››õMŸÃ·ÛÛÙ®±` Ø¥Á,¥ ‚³Ù(p(6g¼^Uéè–ߣ5›jcÞ~åvãèÔØFGÚ@ÚíÖÜÓùkö˜æóþû>KÛøÇRÕøîÉ«í£ÑöLåÞ ü•)^Ÿ(X¿ùõp3œ¤/]! ¥aÕÊX@ òì>7zP³ÓUÙ®ßWÔÙI98[Ûèn·Ñ…CîÊ“í¦ë«Kö¤Z3Ä઒€òå…þl@öÅ” °écâB¯ÕT2AŸ[HÓyÏÅ*Ö9€dóª4ßPv½íPÈX×ûfóÝ3/da€ƒã-à‘S㡦!XçÜÖbØ!ÜEÃ;š7&SÄ(V4¹YÚÝšoì&;®çž‡Ck}Y„-ìó÷!’½p‡ßº#Á¡vZÎd ¸ü|3d "é¢kA v@§åù¹æv\8Àqãï:]b^Dú4ðñÞ"H¥‰·®ÓUæ:,‚?ÑüÒÐmŒrj®ìæÇ¶°¾:Â"£;Ý¿<æºåÁÐH©èµnF+äk¸¶Æ7˜§[£uݽ˜H[[Lš’; ’¼ArÉy—yu¹é&ËC™%‚cšÍâ’‹ý‚ó+ìÓBÜ;Ôüg§oV~g@ÝÖ+J¦:Iò6—ˆBØL+-ù g.&€5btÓ7+ ã:gklw|êòíçµ8pp5Ì-@s Š¥I~ÃòÙ$&‡…ð(­$—x—I,`–Æ'âÜÞ'ãô («(ì4 åòmE~–²ñBÆQ]ß÷'}û¡b‡~ ŠH£ìZ$p ³ü 5@TçÏ}ŠZó`KÐ8¤JA&ø*Úuhß¡úó]WÀéæZ¸w|[¿°F¿yË {ËÓbÝó79ÇœµVƒÞtÇÝÙ‹¹úKÎ}œäïãLÉoI<)¿ƒ+ƒ¦X&úÇs°Ñºž"‡dÉN¡s22a†(Kô4¶,²ñ™[$,q6,éÒ¿Ã…Ñ«Mþ9’ŒdMîPÃlUØB#ì¨aÎPd¨&Lø4w€å°“µ7ÆfTQû=éœÎ}=ÏU„̩ܰ¢·>ù÷å ü³uÉÊ*áÔlX ØF6 챦ZW(K^˳Px±²óUWø³ Á:8Ó´e›nké'ñçÙ “¨ÍóK˜vv¥-t .ï3ùåƒ&¹ŽÑq(¹ØùY‰ü‚Ã3¥‹Í€º9=xŠ[ʽPPi€” PMRrí‚dó¼‘÷ãíïˆëÂâ|¾8r“MäÖ#«ù…‰ ÿä öH\E'Ò…âÜ\ÙîºÔ¢<Ým׆,y™æ¥5Ö¡Ö*žBÿGwOõî²ÍÛÓº7ýsk³c†ä³žáÕÀÀðÿÐi‰ýÿ®Ó+;Ãÿ·ÑR³ú•ÓV+’/P/ð¯‡Øe0º?€`kÉÈÄûrsëRRÆ3–V¡-)ÒEÁ›oÛ/7½H·¤jÛ°ýÞ­:4½Iv‚? ;Z®^ûâRdBZh®"xˆSWrH‘d£0—«gr÷µCSƒ3×ã655#ô`êé¨b É+Ð(§-%˜EBWGK¨X«1$íäê­‚Ey‹µˆE°çñµÑõ_…óÍ÷ã®çˆÂ§áˆ )þï -pð•g`ÏÒp3ñ[—á<|×[ú‘Übãùà‡Cóöj¸p q‘O´O¸pX(¼sÛyÿy!ÆÈã`Îô#9 JÜ 5ü;èñt}$Ñ¡=” %RO<–O5»¼øuÙ췔濼³ :í¤,&]ûÆn"È,$öû@8d8]; ½Á¬ZäÑ_w_`ˆ’b¢D¦¤ Ã=èe~®"Ãà /#”ê´ðto–˜ñ(ÞT’uáR(½Q“^¯Îf&:^“\Ê 5Î<î>‚KˆHÓqˆÌðøÊöz’Hco¬ÆôDy9ÞJ \/¦hÍêG¤Ên2z³5»ÜØuÛ4¡^]¢2néòµs䢖¹î0õ÷…ż”•©™ÊMO-¾D}ÁÌöedéBÊúJ§¤½ø o>í<·3Ѫ]JOÀÙ½{÷réh€" .ìP°E‰a•~w¡ç®Äa?m•³JŠ5ŽCz5­}*«;ˆbîÇ¡Ün++ùͰaUD£Ar:c zù¯*ý½ÉËàùy(y h?ßžbFÑÛÈÊKO£dc(O΋ÆzisñHÞz‘`ª(+ʺLÞÍ^ŽoÈ“Ýû– xðHÓy°¢Ëì·ââlmì8k°àB@ºs#$˜û†±lqŒ<[±¡S¥íDÜÉb÷ûE¡!©ÄÍJZü–* Ž+®â¦Ñ>•£xW·”ƒþ[ìVÕ’ŠåJ= » @ºO©ŠÌTt‘½D8¡ËÆÑR/ù#Ì4‡)GÃÈ`M™¾uá$V\D‘ùŸ &¢ù_ÎŒ„‹"Ò*”Hz@)^ Í[no.4úãÕì‰ HŸ^’©N•‹{—xPפ++®ÍÏæ¦/NM•l¢¹©qÇêñdt\±0r~Š)Yß¡2§OV/õÜô•*rп¡}ÂÎÞså0—Š¥`›»×e¸j°ôû¼ZÄv¥›w ×å³MªŠµŽ¯úÇ•b+h\,1ñèi èaш<ÒmöJç0zLšÓrzk ÎžºÉÜMªâ`/]tµ'×$š@¢/í3©5/rß›Jq‡áŽ‚Éïä‹×Á¡w‹•““ß<]Ûê%n/tY«¿ïO…ë¯qOÏVY=¾ëÕMÿ†FF/cù÷PMW¨h+‰À¦Ž¼}Ú»¨Z­h—>ZÇ÷ßQï:CyÀk»»º{”¹6<Û|úýæjù̪&‰Ÿ~S»%ŸžÉ¨'0•åúºÅ§O‰vìØ- ÝÛ²TgˆO)s&|!ôú¿­ªT‹«¶ìÑ8ýÆ× à´Íj¯¡/["@n ¹¦Ž·r÷¢¶lK5š#‡¼Ó6Î*©šxöìe[õËÔ AÇ'ãüBßÉ“xú*˜4&«Âóæ²p²v1ßÌ/8Íôl¹?±vÀùW¦~ì¾æÍ7nrEmS+ôEHÔ3 õjø§öô+}\‰…Œ3~A¦z‚Êe±å-Òû6ïòïí*,}W]ÎÞš`¦Fë‡ï"BýLh¯©-÷[âþŽÐÜàX`öI§É_ËbÃäŸ1HV£ýç`·9~М!Ò:‹$–”0ÌØjKUéš/ƒ+ºýµ‰á3ûðcµ];ÿ~–.ÏiÖñ'쇞ŽãÓq¹=·¹ï<ÜkÑÓ Ÿ‡ /hëßÌÓé'¯kû(ÜÜAcïªfÐÔ¾£¶\’‡ Ê•c6ë4õ ¢þÖ·í´)BŒaÑU;?Ÿu±r# swíÕjÚ%ñG‡•Åfkë*ýzÑ86ìðŸMT“õ¼ÜÃò3Ž(ª†Ø/(IË H9{{Ånû}:*š¹Jolæ&31úX¢•¸;1ÝŠ>IúÆÖKÅ#~lNwÒ²¾ºl?-R#GØ]•Î8wéÍ%“óÙŒ$ƒþšôí¤m51rÑ÷q]˜Uß'ùð©FD“žæ%u晓jIRŒÝ£e&œ™çÔ}ÒгZH¶0â#â0´«ÊA †VWù¼÷>}ð¼C@‘™™8Ö1kÆ÷‡H¿à9Þ•åîy¶öÌѲ?àø»)~òxâ²– Ì×7¾SÖCÊc–p1Z(f¤ÌLûÉÊò–¿F¯%w×_ÀÓ¼Áú¾×zú|½…Îî>bÍwŽ›÷fK?BÔR{'ch-9Ä/òzÞGÚ8<ý¼2먽G^úèõéIcÞ¬6øw1;íû@·ŒÜÃǛӡÚY‡ÙŸ¶ìëÚ“º`RR¨Që°ûüÀnnîâfŽÊƒ´{ÁÚÎ’Ür»ß™ù.ŒÑ¡?šLg¡‚UB‡Uie£Ð',Ü0S0!œÉ .HÈr: œ¬ÊÛÕašå€#Z°Ç*M ¢å¤¤é\ôâà˜’6ÍÛQbå£åH¥“‘;¬@$9¦e³±g¿84³çæ-â>‰lU998Õ^šKpm|ÀY R%ãQ y3aà´òë W§2‡E½=ÓÀé ‚Y=¢R±ÃäƒáVëU·tr§Uie§Ð7,ܰS(ÇWÁbeKL‹8'BM„ 7ªåØ4æ°ñì 1“¤â]V)qcg6â´¹Ib²ýiñ LÓÕëÝÚv=xê·5aÁeœ ‚‚*<ÐÛ¦²UvÑJÌ­qÅô4èa›éÏ+[´1j·†62â‹!$³BIÀ>D‡.áYß´ ׺ïG9MÓ™&¢€$%ŸEbIÒMQ’@J>ò‹!¥²ÀH+“ð“B]‘$Ÿ®¸$µJa-ùÈ0É-7mUL—QøõÍCà ÉËëƒ#e…@M+]Wé…anÚ&¥1¬Da/ ‘òKV©OÒ¦=_¦³ãâ°•¢ÞÚD¦©wBoêMÿ]TygÅߥ0Á·èõ „´B#ûi£¼z/Êœ>šÔZeXkõÆÇŒ‹5m•˶†* sP¢ŠÅt¸è ÖkQÈi• wš¬±!|GL”™Ò¾MKžË_ÍUúh¢|msAƒ'j$tð¨a¶1Xµ…u2FòÛ‰(&Ȉ2¡Nd?Lˆ6¢ìjÙÔÚÉ–g0i0“ò¢N¬Ð%‚b–ki•O‡’«)YØS±Œ«QGã ž\ES—0¸hhdWBànoŒµVÞ|g,“Jê®(¡‡/.…‘ÛÞ*r)`H:ɵ%©LqB”$–HF\7WÖƒ¬ —`˜‹J0 aVºI,’T[AF !Yž+QÀ-Â6"©H‰IËZVZN$zKð‘à'ÎI(›GcóÖÃ×¼î&zWÒ⿵Ÿ_¶WÀ­Ÿ(/ZUãå¼jÈaZ¢0;„0l‚€Ÿ,ûcßÕÒô¶›ž?µÖ«JT_g8N?*šÞ…(ÉÐÀ¬Ý\Ë(<ÆaK© ÖY‹AW \ãÞ:u3ÖÆô[™Í[y´rGUžšÆçÀÞîÙ§å:ç¦ÍRàâQ–¶8q”¾MzPSßÐLk®8£%åbF¼ä.& Wsì/jÜJê‘ÔµLM¥oë*yyÞÒNé&:ËÞV¶vqtTiÝf¢1/.\sQ9ÇÏ “ Lbd^jË0HÈìë)xiU oÂ’Œ ˜0!`Z¸‚)ÅjŒãíæDCw¸#ÍzŠiÕùs-°RK$J(ÍW¢·7 •É­+hŽ3ÎÀP–?B)Åi ’ijBšÈÝÛA³•Œ7T„8cQ»› ¶û;¯2•-îoã…Îcÿ´; £Þ5€bÓºL[ÖÜI€Rì©Or„+DAàâ$ßi¡]vY');ÊŒ<à$›}½i—ôŸ®r OR§Ô©Nu¨pÎrQ¥TÙÒ ŸVæv¤/ë`£ ¾ié= ¢_qAŒ‘WT™X&¶KèT!¤M÷æ,ê&ÌËP¦EA¯–:ªêè¼:FE5+#¥ƒqJ Û%R`ÛFRò:d&­eIl1 C Ø$¨²NKíc®"À­ÚÔP$mSe¨H% Û0{¬Ê&qÜÐFQ´aá*ïv ãŒ"VëêèýìÓ¶»4Â…³½<1Þ×îxª–,e ‹tH£X®`(Änž¡ç *(clƒá”XÖ5y~.Ë5æ¹ Õµ![bé‚ÕØmö^’aœ.Õ¢ Có¯°U‘È©æ(‡øûI¯]—žM5¾h-edÂÊúìþ ý]IO™òbµ°Ø¹ðz·{2IÉuÝTµ_¯î=Cåvøtÿ[ÃÒ]_𘅟%ýy2߉rËî|xëÃû÷—ï{n¦ˆæÇÌÄCïÈÖ¹ÎÁµ~ÆÁåÍ•¤ÿÙ’3\2Ã7·ØÞ>lÏúÊÄð@ûoáêýA;­Û•[N”xÒ@))BUæ•êç}9nà ±£oÄ’ü’ý®e¢ù'Å2Ò±êŸMϰLEÎ=Tá³ÆÁ‚$uTPÅÄ!ÔÚÛgÁåjÌñ—Yº9àõôjãèƒX’rYqv¸Ɇ(ÜÐA¹[Vÿ ÷ÍåÃÃþí°ÔH.š%ÍOõÐdgd_EϧÃ8J•Àéð]~ãýé=Ï[©ót3$Y»Ìªƒ5¤¡Ãj1¦1Ó~Aý¦œÂÖwW…ÁîÔïÊŠé=Û¥.¡þh¿ÎãÅù¸øÉÚAOâÆõ£eHTŽÊ[º;³Z)ÕÞ¸‘‘'—úâvn£j3—åH½4Åt[â°d~Zm#‡~w5éÝÞÕëÝç˜y¨¬Öì%{½ïÒ¾jÙׯ ¿|ºxÍyóoôæI4ž½—HZÊËÇPÈ÷†$y êÎ܃_ªîé;þå~{ÒñÑœwdòNÔy1[.c÷ ÷ ?꾯õØ a®-Ã\+ñLÐG Ä …Eª}3+.Ú Eh¶ØÅšczÎó"Ž Ñ±™Ç\Ç ØJ‘b‹³ÇÊØ•ëRÕ£ \ˆ^a®ƒØ }ÉØ~˜-Ã}6F/|™ŠÔ£ZÛþ7„y‘/ùOèqÑ뇨yðñÖÖ‰Ã=:<\i®0_ú˜QW³À%Úé…L$î4·Lïv‰Kïl÷¾‡éƒÞïOûïTÔñsËT×Â3Öœ·çš,åöŽÜìåËá³/ÌV3¢ë!MÔS-[ìSêƒù›1ñÿÌã°ég{ž<´9]Ë™\c»ÿá¶ù}—q|$Éÿd‚‡ß!^‹wãî¾QÅ|nÄý‘2–:²ÉB‡ý£ñý{}[¯O)J*G~‘+T$öª7rÏ»TÜÜé»s ö(۰(?ÖZÀdŒïÃÏ꯲Ù…Xj1·kv|#b[\ÇŸp(¯÷óVsÛÕEyJÓǜݯ»Ñcë}µ§éùÞðý >:³Zë:%Ñ\ýƒsÊ÷ªc 00ÊþWH7µo4§Ž &›8Ú:…ƒ[º`6‹Õ€å¹Õô[çYµpWÑÜÉ£kM´9©épuòðߺÕgô°"Ô{›¿¹v- Ëá¹,_[ãsEé?1}‚í rÃÅÅÖWýœ®ÄýµrýW»£¶=ÔæãuÙKýÉû´³À/ ;€³©ˆVBMÝ*¸?7—6bWEÊ‘øA’éD³»Ñlh¡•‡Ë{>ñ`Îñ˜…ÜláÄ)ÍFÖVp"7ñ7‰§±ÉÆá­vw÷eÄ_æìQÁÚ˜‚Ø 'Ý”âx  ñf{‡ÔJKøžŽ'&ìº@÷ˆ0.wBQ>p¡ÉF E1ƒyÌn¥qN-ž=ùl°â2MhïÒçÜ2LoÆìQ:1 oŒxeÛx›nL†¢oÉG}4Ö,·Í^|Ü»–AÞ&8Ì./r›zÒ`±úE"ô!ð‡ÈaôV2ë>$¦á·ÿTœãÂ×¾ ®Sž¢ý)^$v¢o’Óµ†‰§{&¬šA_婉¯ªV%ᣀ‹v«ÛaN:t q~]Ê¿¾ö¼¨Ð“üþ¢9þ/»þ³r°1ÿ?£·Õ£”µÐ~€þÙçï¥üEðŒôD@A†Å8IÀ!‚INlïÂfà§ãf$ýšm3:WLçÖUÕ¦õÌïZ^¯Ša=¢Gàåe׿+m³"ÙFŒøS+K§~½+›*:›ýÁ`iÖÚ‰N‰×üìúÅÀÇbakR(G2ÉìþM}Ùk}¼½I ‡Õ bo~µÙçAŸÀ>þ1”¬×ÕÝð{âjWýÔÝNf›Õ«@½0—˘E§Æ}oÂÊäž&¡Hú]Ñ‹¶š•k÷©©Nû鿟ÉEÀ|d$¯ùwû¶ 4 rèþ…D7ØÍùse¯Ë*gPmòUîæ}×zÛ¯µ¸Ž%”qg~Ÿ¸óufôf"m ˆå ü%‹ÿâ?BLtÓ´®…Âù÷ ÁÃŽ´ªZE»’]öý™rnº„ãìXFÏÚ}7¨ö¿(Âøìp€‘U–#€É^£57XóÇócœë`e½ ì4¨Š¥›f}-õáÀ®U}1þ€f‚ÖÁ›¬AW}ÀB¦׫ŒøŽ\ÞƒVR›|"ã±}7Èä<åÜÈlÌËt L¬ÊÚÀ¨äKæ…'«Œô“ìüýd8D¶.dzD“-M¸äËA·RqUvNØ g¢WÍùµs¢ e<± »kºï!rgåîH¯¹êUjãL5ýÙX¿k$[¨…0Yܶã·Ù-ç=Xw¤ùùïÖ¶afùeè–sMZAcÅ^JékVèÐ%A«`¦¿j€—F/V2!¬s` רvb+Óࢂ,›$_ê¢gÒÑ*È(+»G»º:óù¤ k1WŸ°=²;$ŶD¬ó]àdÊó“ÉÝ!ÜF±t ™-ródÆÚö™ ñl‘ÍÓçÛ÷EFkNî9È£m±øi%ø·Ë7ôr•á±gÜå7 S55Æ>{]·5îÒqÍ—Â¥ ]‹±³‘zsãaË…‡~”âÓ·¼4ìõÏ6ìvkY7ð]ø9b ¤þlVY´lvê7¾ùdÁäRJ‹ƒn1ÝÎÆ}‰"`|…ñrÛ_‚Y õªt÷»7áKgù‰0Ýü@&Ê!™ŒÒ –²ÛKfJ,ÞN¿aD$¨0¥QîÖ6µñ»…Uÿå5˜uWàÂ7£´üd£è$ÚM*øê иÖlqŸ ¼5@ÛpTÖä—LÕ66TF¢¡on¸=9¿–úÁäÛÒÅ ”Ù5ÚöjñÎ@Î÷@ë¿vczöK÷4Y >µÈgìc<qRË´ ez`ĉz‚’Ô_Þ6 …@Mïˆv$ðÒ/÷‰cG_H4kb—eÁ–,¥2 —><#*{Ëä2”´2®¢fpA0|t®ØØyyj›Ki®Ÿ¦45’$-\t)¸~à2ê䃣·2à;mÍÒ½t†<ÏÝ3¡:‰þ[>:µjvG@#»Ø|/›=ÿ¾Ýåó6çönürœ'¨e0‘‚vG©>FB?4ÖO ªO£q|^v ž¨w¦*z…F¶3{bö¸.6FA$)üNž-êIÁÙ8Ä/‹ãòŠäVíð'•;·áF\TÃùpƒüð„I£Rºek”Ažq¸åâÄäó"œç¤t·.ÐTLìôQºŸ,æÓ%[¤Èš\(ÏçY5‘ƒÍG&ûÝ1¼ºošúK§\5ËbP½†ÃTK*”þ®V”Y˜º3‡’-«– e-¡  ‡ ¾SD²RC/‰‰êL“œ ‘TÑ/tD“&,[dŸJ üòJ?¨*Q¨Cš;£QI»F¥Zêþ Oë|À ÍÝjD œ\–§^)²ce—7µs”!]­ÙH¹²4°‚ Tˆ {ïw)R¨=Xx:„¼xh³Zý7:edù£r©Z«æÀ§‡Y“ðf‚ÚbÇ“6•ÂA™-?·êëe^RÈÓçûLu,ö›©c‡ О)oÐN*0<«EaÖãÞ!,çñ¨D+pÅ# [Þ1ìÌI'£¤>‡ P(ŽÃÚÛ5³üån“tf,©íi–r!˜>µëž«6£ð˜ÿ(²¯K·ežUÈpÇû0™-…J>u¯rLN"eà)²D«¹7ÊmËO_·nös,…{R¥jÇ¡÷ÂWÙkKbÿðDç¡I¥\æOévmoSfÆ}WÒ3aCŸ%ô<3SÅ–™MfL ÌÉC*^âLHëkΤ,Fª(°ãˆ4ÆÉû÷ÞªÖ•‹æ¦®z–=G36…´ˆ4­\ã;À·Qg,Õ®ˆÑ0¡š(›Æüø~ÞÐLÔ˜7iyR€…1ömEKåÁKiÇ Ûßsk—î&êÆ,(ÜM`Y`ìËU¥á¢ØiÝðìÝS30S²¹óðsS˜÷ÄO-é X÷İe9αÉpÒÝ¿r‡Îo|EÜõÏ+0´T¨t"ÊæÈçlýð!F %dÛx ½hXУ º"‘ÌHt|'Å­'$‰„®Ë‘¾< “|{;5-»ÒÕµ•ù Ÿ]½ý®¿|øÅZ)šä¼•5Ct¡Á0¸èþÓ¦…6.Dò9QÈæeà Z­ógjJ°64'z\fîó6òèºzl7„ÔÝP;üÅ¥–LjWlK„brµvm‘Ô‘¥ÁEp¨Ëgž p ;¿‹¤¾:ây½bx6÷ßVÖi ª«ÓtiY8žM_S^ì½ÑJf~ mˆÎA9¼Í?•£µUn#©4o$A1ÝfÐKÄX y›­ “65øèW ¯™ „ø›•ŽÒòV‘¼|üA6ãÁàÂV 0•éÖ ;TàÓûß¶u[óÛi÷Ù#ð[ÙUÕªeÍ+æå¹ãáo„ÞkÍÛc‡çÃó}!Á£“_ð ¾ ð]äÜÞgàINÚsìgûWH§Aj„ƒi­^Eý!ýäßJ Æ"ÚKóÉ€´jkþ[<]A­Öj_¸= 5gøA¦páPÍ« óÂò=çΤHV4Eh0KFŸú ¤Я!¦%»ÖãâÇKS­Í6`qUø:·Jq˜ŠE—"¯ã)vÆ"_Ô°fU¸ÄR^®ý&L´â^‡5(²³¨.>ÇÕ+3¶h‰òæþût;hæpË…â_ªþEÎzU—q^­r³?yÚ¥ê†Ñ/ñfÕ#ì”ö: OÆEÛÏǸÆ8‘uÞù¾¥G4+™; VYéaµùáxXážÁýþrô%¦`dát´“11 DCñ7ÍoQBÕ¡ª#ˆâ;SËÌ–?Z4Œ—?ùppmji·Ò2gÓÕÞ€)~º2÷oE/R ïÑý¦~FÛX‹‘Z€j€‡€Ž€³¿«œ³;v¼ÊŸ›Ù§5lxé‘û5n¤âäs¶PâΜ¼ñÓämPzQZpܲê…Ú9¦ õãlŸ+(#Ÿ¿ßÁÇæZ Œ/x´ÔaÓ£ô i-G¬~;…ý3¬ec¬ÙØ›nr½á‰ÎC‚usHÂñÔÖˆº²zË2xQ'wuË%#q€vaW¾¬Ç*]ÑóT†"¨éX ؼT¨ -ÝHA7º‚n¬þ­ŠœÜï¶Á‹Ÿ,Ÿ E›ô.ùјäÅÜ“ {õ3vsÝéÄJcâni’Íu¤@Ò±äQV꫎Z"à\ý8JO®•&~¸À.Á€„*¾u»K%™'QH3© v²hœú q°í‡e£¾¡–Z^‘j˜¼1Á¢i¤o“è Ï[‡<Ñìc¾ŠÃÉ;ؽì‰án%3,×J¼‡×7Ö™ù{’ìV5ts^蟂öØ+ý.¿ºcÔeûµ¨ii{־ν‹?s¬WþÇS¦;žÎ£J+zp”GÏ2šXOí"§Òh‡”L ÜAa?9U7„àC²¥!þŽó±9AØXrœü®žôèžÓWq=œº/¶ôp 9™<ü/›«‘uŠTO¼œ =¡s)Z_ZØ~ÇhÛ‹9#PdµV%fFþ´úõÈzË›àI¶:j=–ËwAõ‡çò•ìBót¶@|*ô2Çy/ئ¤Ýß:}u•kFáJ=õ†x%ß§„” ‹#9Ox.ÂD”ô!Ý%óP?Á zΈa`YâpA\¯ñ, ô¶zêjå—¦r·ìežÌ NÒvD¾òYÅ)¡Äžðø Œðþ`ëÒ•:Êø-Ê:c#©¯Y„Èw¾``jú 3­qôÐG Äaèè"*ùTª•…pÉqÚXj !6, ¤ç³«ÔGI¶iE#ò7µ|Ô‚Ý麋æSxuc$ìXqœ¦åi3)ÞòÒ±«›“q,%Œ…3ÔgC\»É:9¥ÓÁ—\vìÂΠJ݈mP{&‡7ý<î[÷‹õñ "OªŒœª;RJVGv*‹–¹7è êµ¼ÛQ_‹GG&z dC%t©å3K‡IÙÏN‡)OU¬î²+j°güpƒó˜G†¨gc!?°ÎÔo­VažÃFè¯ÔÓ‰—Z¦øœ‡Mñu']œAk–eår„ÿ`Øò²âM.m ðˆî ‚ÛÜ¥jàZ‰ƒVœ‚?Q ƒøÑ™¯k‘Ø%ëSG#vF¥j6û<݇×øL¤ÇÐ/`*â‘ãž5S„ ËÑG U2953ÚÌ4G…uŽu/&Pr0è­ªEf…¶ NÆ%G¤ï@õ$23)ìú“ëüÝÉQ¿4yŽ@—V`´P#‡¸y[°xSÖ­ñ®tFñ ŒhÀv»¸:° –»ÊZÏÉ'NÅÏáònUƒ;oÛÄEécYÑú‹¼û"!5Jô†dRm]œ“&ònÖ´—,¹h„Qß—ørÑEG€,‘ÿù hç±mÿzUÆó¬:Ü6/ÀL@þ›hý¶K¡ê !ø—Oq þÞ#z¢€É_|=¹wJåg¡pçŽÛÆo¹’øûð=#7uô–bî ½Âð pŒ¸“7°ëP‡ç’yÅáEµþ+>ª”x¹Õs®Oz×[¸î;ß$°³yPGLc“´\³”@6Ö>4¡Ûáuís”)]h™@ÒÚI¬õwÔ=™ˆ¥Þxµ.¬´0°ŽÁƒ 5ÑXߋǘÍRlk(IÉ‚÷y~NûŒçŽ» ÿóöû»'¦—Ò3~@¹ž‡‚ùnæßïÙ±^´ªêP‹ç¦ztŒ(6X#-ÚˆßñÛÂòæsy¿°c)ò:úú°Ûþ[þ’îŒbËÜñ§V?¥Êyl%§¶õë1<'³ŸÇžÅ“Îa'DË‘û®´¨±–\Wßù Ë ºTí ukÒ¶'tJºƒù4­ÞlÛ+cÕ7Ãͬqw'æªòLnvÆäñwâ~-6~¿þa®´Â]蹸bc×Ô]XމžŒ„¸Z5`£7“ÕNXØû”dé>4ÿúñÙ ït…ÎQ)œò†×Ctz³!š~5Øf5ÙGšA“Ðyã‡Y™º;,¥OO ¡Ó—p¡’"IÉø cn5x¯…ÈvÉîÑIÂÕ^Ý]:[Y±ŽOFÚÛ„¡Â*5&^6zØÛpÎÅÄ>–/š|ô.ÔÚȨÁw0/}h+ÐCÏþç‰õM¶mXú³a‡C•k?G)8 Y•|Áfˆåïƒ(]‚QøÊË£ST;ª†ÒÛ‰ ðyŸm}¥Ø¢ó<ì‹:…¯‡Ãèv°×ˆ“h»T J@$ãŒíÒI(άDz©3zÔÆƒ½M0ªxKVˆõ¬Wþäì)U×6òó@U”w…KÛ»e¼ú: Oëýþþ‹”\¡½ H¹¼Nªƒi‡aÐ ÜS†×~íËc”ÂdE?N‰xPÝVnáDµ²ÉbZêŒØb]—ÿ±™öüúy:/îÄ#9©WÌ)î¹ïÙK]û$h–}k¿U>,yHKø ›‘øOƒéï²ÿÞ²÷‹¯¼#Ô P$tß<Û= õÅUäšz?”–/Â.Ö¶~5`Îo·­_gŸ³\Ýÿ3ûpZ@¼X~kBš« î;Þ•/š§V_‹J|’8lµõúºV3»ç³+ç×ãE-¹1¨æÇ`>2äaʾªJεD¹Ôë¹~÷“ûAn¸‡¸~]Ç{&½]ß[?´{;÷€à ãÐóë=ò Ò³ÉÔç%×ß¶ÖÑ„ ëéòO í8×ÝrÎųæÖçœÎ >ÛKÙiú¡±6N‰ÃáóÐd…KϹ1̦Î[>ܾ5f m»2¸üe\ßI­Y§,ÿØýUXr«÷vˬqýW¶JÙqÄùe˜f™Åî†rÛsû}ãM}Ÿ-lXê#®."ÂZƒ°#”mýï¡WŒS´ðy>YtÁÚˆ½ADsêöìþï÷þ©ÏoOx!¶VBd”vKåJÛ7"6¦¦¼0NeН‘¤É¾×slT¡¹z :MrxÁÖ>%m“‘êŠXE•{Á„m’:¢P–¦ü ð\Ó5Ö¯÷âÖæ‰lcÉ—ü4œ´U–ånÿ4C–m5\®˜ðzÇsVYEGÑecË)Š66S=Ö–ƒÍ *5Fö$M€Y\Öq¥€,9ª’)B—€ŠÑܰÏF¯áe…J„YÆF³¾à¢Òȯz]Øõ7ÈÕ†èp½²ÐØdƒ ÓÐú¤—#F]R_ÑQ3M% ¬Y5aôÁ·ŽÑÖÈcKŽý2ò.±©5X=È9±y"ÐõŸw€µàÐU•vXøúwæI¡z¼MlJùj³éê|# qbv°KC}uQUoàÂYyßZn)Æf–¿ûoe^×6.‚®Úùn#LŽÒ'[Y…½N=&[_1X"ÄÌ7¼É! é8#•º^æ¡“gÉšþ&oðÛ¢ÿÝìuKzô×mÕ…/–@›b”fehÍVì'¯·Šãž^ÞuâÄyŽ¥_– ûø<ÍÆ°Ha>Tg°Ïô·võ/:¡úõÁ$tÞ¢*NBÿ’‘gÊl»h@c:+`ùýÐ:§N«¨ûV;f‚ì)pf[F) Ò@Û¶ PiYõÛ„Ç "ilj„MV¤XÔê_èf6ªùšfŠ2¼Œ5ï7Ò~Ëõ‘¡¨2ˌɇÏN ›^ ¼óâÈaMàÞÚ\)¼È¯§NÞ´J‡z`8\­ÁÑëü‚ˆ®Â²#íPv ­‰`F|µÁr#¨.Zÿ%Wt{%×'À•Äpd¨˜Z1!›+~Èä=ªw$  r*I9Z bl4,Æ)ÄŽÑîU>^9h˜0tQáß¹0È^™~‚{¬é÷‡<†hñù/„Ãío\èB8;é °ò<Ë3\—.á+Šæ|5(2ø¤ÐfÞ_jèsØ?°Ÿ j0¿_ñ–À\HH;Ý't ŽÎpñ@8UPyïfFl‰R#3 {v)^ìü‰£½VÊóTÂt7A“—ö†Áe2ÒUXyl–‚’ïAê¸ØIô¡qZkýËe Ô¬…'á*›ávì Ѧ¦°ƒRŠ˜MªgòÖÀ{‡ÚûTý‘ŒÊ¤4L¿l¿C»Íù¿eË—½éö×dl[ìÞ¢TxŸùÚæ¦üŸžJõ»—J’"ª ,ôi÷!ë¹OT2}ÿöžIôµL]DE\ŽàÒCNë'‘ YiÈk9vòòˆ²É ™™O(A¹½H‰à‚ªÉ/|#˜É¯“80‹‘EȈe&"2Õ/d&•‡-øÜ×¾pB(‰}¡@èËFº[@/ ã¶ŸÿW¸fѼÀ˜=¯>YVï•}t_˜°Êð;0\‡áÅÂ^’[Ÿfv}ȪFjQ4tUÀžÿ4Zú@Æ*6ìn6ƒýuO®)»&ž#ã’Œ–+":ì!»#oÏ!±†·‹€yø9Ÿ œ‚žŽ”b3´»í};Þ¥Ë9wVvÊ©fx#È5ØVµu£!40 p=oç¹3 ŸV<1Â¥©N-÷Õ6So'¾äöOåÏU[ÜZÑ€EÝOY‘”ÂD>þ•s&CXtJÌs‚WŠ3ŠF-Ãã5Ý/Þ½ÑsM³õÓH¡ëKuÈÄ âA {w!» •TD&R·3&î̼쌣J“d'TòR’Qnbrï »?!|ÅÙ\ûžL¯KÊ\¤JF4éãbUäLj[’µÓc 7tŒY.¥ô ˜—G(Æ]‚„œŠ¦›Bž7ÔR6Þ:¨†¯ÜTŒ?¬žÏ‘Ä[¸ŠMRUkßNƒ8À[RVýµâA€™²DüØ.BhàŠÊ¦¡þîߕҰY+Å·WPè¨ Ž6_{ë9‘Èê_ôÑ4 `)(,+dýiÎ<ŸdTQ狨½jEUœ¾»’)–Ú;ÐdþÎŽŽïcõSâ´ ðÞPƒîë'´TáÑ$ŸÍ !Ž ²;Œóv¿€îïiëûït½€žÿh‰üÎÕ%›îb¸à^zÀµNg”—;×Óqô£ÄaÎ#Ì|hZÌËp¤Jt®}ËÇÿ)I¼h$F‡Æ ÑÑ!Òû75Oé)6:f2Îï÷•ϪÜÔ&ÀŽûߨ!ÎÒ²Õ€}ŸÞm ‚ÙæWÓ»#ƒ0íç+g ÝÓŒZý¦––ÎeÑ’LP Ó‚~|Nj§èw‚UÖgn #Ô£BÜbæë'¼¢óè4ñ!°éT¡ÁUþ±d#€Ø²æ.¬3“Ž »ñs¸æXS]zbT]Ì£ •bCQa<“˜GKoœ¸©‹‘ãEÞ&fAVæs–'Y%×(@.[€;zÕŸ L[ÄJÑPwå°€¯ÁöÛX§\‰;—9J€~ºÑý¾ñoþw‹Õ~ðléu”›ša}H°Ì$’É`êhÑeãü›Wî—9ð,ËÝ+^ȵ²ºû. 2<ÙàtaÅù¿Œ”ÖÈÀš~ä$Ç<,–›Ëþƒ—zàÎIê]!÷¥“›Ð:f=Ê Ò·>LÏÆKu¯mʬ4kvwM¾h®ph¾Û’Ô*â/²—f 'Á¥tE©8nD3ï Œ"È©ŸŠ°v/ÂÉ2QomÅgñºEÿi<æ~7'~• ‹å•g‹Ü?-A’ o¶IA=8KÓ‚}í}‰¬eõÚ"ɪ¹ç—¬]Û|‰:žÊM¨ÚMËa?–€e]R£D§5¯›|‹ðæÎ˜d ,BÛ3oþ£É-^‚™ õ\âM-<0ÚE×ËÛðeæ¿v6mNeœÅaÏsÅ”UqØÄÐØÿ¶Ì¯jbW"Yl&ýáèO™d·LDóNÙO@ñ2”N"b¿X\*@€ Ði|”ºÁm{l?ãb¯^¼ v‘by]$’uŸ –ï;Ñ1µMDËÕ\% ñœ@Úï»+±qQeq•úJ3z†(.¡íì!%jŠ lûÉ·xd¸6¢è‚Âvi€ãV!ݪM_MÒÜçoxC­ÇzôUI¹¼A-lý™ÿhh*ã˜Õ*̶F2 AŒêU/gÛ;?“/÷µ¬1®Æ¬ü;$sPKÄÚf÷QFxÅx‘ùŽ·°NÍ_¦M¨¯.{Ô(ÓËȶ 1u«6Ž[ž"R©¿ SKõê‘äݯ¦½dÕ£,¨æãZîâfÌù-³¿sǸ2Äò™ â°ŽÄâ7'ê ÏÙ¼«ôNÔ §’ÝåaP›/ëM'c3Rf×íÆUg,+óù¬ø÷ÞðÈ´£ÅLm3læëõþãŇ‹-$£æ'®Y#ìñG;4éñÔûYð@põæImD¾9vN”Ã÷÷Bu'}V˜—$¥ßâ›ïO¯­(>Œ9 ˆ?kòñkŸh')¹‰òNÎ?VáÞw–ýúcOê»8D__OK¿ÚÆõ{þ¦É¶”®æÌNO|NyŠUÀ.g¸6PY,¥>£Tñ&Í/¶öY®ïS®KÖ§ô"ÅùЦDIž¥øíõ/‘Ï€sÿTsšâe¹®¬Ûe”í•tëL_ŠJÃîÀ.§WG+­2ý[Ý#ÖjuõlÇ;ÌK•¡…Ë1Gd?GøœqŠVÈÅã‚æ\®©ˆp˲žOz1[K©Ý…!y,Èš.‡rê")J™6—øy]&U”[½ø—¶ sð¸òz©âU0™c4ÇÌ/4^YPÈn@´œ¬^G²Lâ‡9;7Bá‡1ÇLÜK¾¦†e'ôW†9‡èeÎjåoúå6êÀMnj£dë6þÅ Ê̳ 0}Ýk:ÃÚ½¬ÊˆÏ¬]œÓ9÷ì]îìš.jc mÏ=!ö7'íb5#&õæyörµ ¿"ƒ©c‰ÿ&%!ti`¤ººçAÝÊ&´Ú<*X%  Ù@3íW´/?"U=Ûú(|å}Ž'=ÿ+KYRÞæŒ^¨ÈgÀ qX9¤M×Ç䳋³¾ –k?¯Ñ„g‰°4½ ¥¶§}ÿÈQµæG¸"ƒ ºC#)š|Uï|e!9ö¦D-èЕž\ÿL’o¿Q‚ºd¹åŸÂ*9¦—Dƒ–Œ_´W¥~(* ú;Æm”â3­øÂ‚ññš"Š˜oŽ?1“‘Hèù'×ù5þü„mݯl+9…K|”çŠ榰)k†"Mï/aswø' Ú? :#åÀaÆ[î¡Ú˜Tœ$Ó9ÔÖ”Ù ©žòDû“«XÙGÁ”°)Æ+:‰Ý¢ò†õ€\EIŽúFö„÷nE`Kó Èjã Ï"&,)Õ58#l·6âqŠÜ´ÊÖêÿºá9 ¶œ©_–Bµ$m[=”—=ÝÄxY2Ü‘œ1;t­«]ùÕÒ;Ç_ªÏ‡~ËR3ëöüIH$ší6šŒƒépËkYMÃÔÈ7U@wøÅ ÉlRåfØ÷GÒq­_ C¬®=oì¢-¥îø:Ü/Ìïr—öp8™Ûà²Lú_ï:¬ÓôäZ¡æ½nÒC$ G5d®.ö¶œ–ìÈK“ÃCÇ øºòçÀÆã†ŒØŒNê‘<š£™ˆ¥{TŒÅÝu3¡ˆ»ºXâ÷l$_ÿ•‘ÞQ»Çùãè ±F¥¯g&0Ee"«Òb®Uíýβ¸b)au_BVDáþ˜ Q£ßS©pN#"û~º ÃOFŽ©.jFÐéX²Çñðî × =Ï{€ó’äÄý–œ.M¸þQŒîž¾É(/aHRd;jêHbýSì —Bªì,R½&Å÷åÐÁ ?m3ÚЀÇn>,}¿áÐY:9À'ƒP\iÀ¥ÞGçÙüÃ"Yè‚Ôâd 5Áªå…¶©T€ìkN‰± Ô±öšðyÆ`W ^˜øÃʘmE½\9àùr)®œ%p,¾È L]ó9°\ öiY€Ð+ðÈP'° kÝ®"«µŽBßbø“-+—u¼tkžºçDnPF&1öî‹(Êì;Ÿ‰>»ÁÊïo½Ë/¢€}ú÷ƒzŒ_ êÙU:wux= cIü PlX>xùipïF+GÙ™°GVÉð„L¢/*®àìÃ@ Ÿ—½©ÔÞ©(?iÿB|Üæ+»µ¹èL˜Íÿ±ç³ÙWøú~×ä×Эž­F“LâH:`ô¡ãX¨qH~ ÚÖñøªó¤È#s%F– †«N禾IM7T6V¾s3•ÓöO…àÇÎc,¿B6Àº {Ø&Ìg^Àª’H"öø»,•rçmë6$Ôgá¹½‚$ò¤W™Gs†2£Þ.>íkd’“sEKHzà²=ñšqÓ¥‰1‡1 ºãÚyRªt F¬ Îá¥û4êÐ#B‚RwÒ Ž2‡¶ æ=Ÿ~×(ó| QRÊ2w*5\Ü5Ï®©t¹Ör‰ ÔÌá Qrqß÷K …|ö£ÒlZÐï¹ZçŒg6¾ûLFâ>ÝÅÚ­1 ÀŸÏx·w«ŠA®°ih>QΆºJ)‡Öú¿­Tö7W èØÖÒTí¿ÌÛåän›=D§y9—ÞDV\æÊcÛº€r·1îk;)}ëíÏ£2Œ6þèfÀ¤‹ñ¢Ð¨d¡.EÇw“û/rß3$÷J®6jE-{mA>;ႎúˆo$±R›VéI¿•ä©úÊírÛÈžP“¤q›ÞŒa€õC0Ží²¶ï p´LB…¿“æ¢èLs"+Kê~\ZNEXJ“K[ ^è¿{Äa’g©§§“2âà+Ü¡™è 4Ç2&ÊIY= ±xƒþ o-JVzzùwº¿®ÛÅÁ9x+Ì͸k±ݱ~0€pgè‚Â}|ª²gK=±&ÚL ¡\˜©•8HÃΧ‡­¡lAŽ‹5¢‚þÉ‘^dŸ‹–Öwd šÕ2öÆ•£ßï§Ëm8^Ç„½Ë-€výëËP…}¢lÀزÁbŠOË\òåûO>ÀÈ}j×ç¦]ú_)j5-wï§ËRüb}ÎÖ䉥»$õ¨–°ItO(Œü‘иQNªÔàÛ&c)¨Éç¶*RÏ€_hCla}ô c&ú]dL`#~¢©<ÓyÉêÇ1ë¨Æë+£ïç€ù /s±xip!]Aˆ֡5 ¯éò%6oú4u•êíêW{ž\å¡vÕ™ºßåQ™[Ê6EŠWß³1‰ÄÿÆ#{åÿG×g‹ ¯$>ñ„ØÖ(ÌPï·§Ì :yìÃÆ6à‰6y~”&†í¨Å+—L r&Zôij)¢éÖ :%›ŸÝYwûG¬š €¡.‡ Bw׬^oµ13зÏÏ/"04ñÊ,Æí[+TÜX9`WM$K–•»ôî–r í¼È%]~7”´êçÏ#hs†ræ4›rêWÞ.1Ù™ßBhÜÞ¶ºér-ðÛ¦ ÑÜ3¿0rê[䬂ÎPT¡PÞžMN¤9¹‡o¯ ·,ÜXÌ9¾¥%"§™•ôŸ>¥Ê¬~9 Ù³–r½çE.[¸LÐÙ•;±¬¡KObçÔÎŒ†œ7Deé ƒX€ùyÏb Ü;e~îßrñ÷ôMq´ÿ¡”„øß,BR óý"w”öP° òÐu†Ž£àä@@¹È>½˜*¸HF<âO ˜W1ÞÕ8téyë:ÑõÄÚQ¥—’oÕb¢^yçíX"Ü îG;‰.y+,%ì'¤”°½£^Çkn×(äËE©‰¦ €’-êQ.Ã%ŠY¨H¥> ‰àc…·T¿ßHšJ©Ëž=¾yÖiÃm™d!zDR/t=ÔR¦´Ä>¢Ç™å†œþ‡!š‡Ö!t‡ŸoìBñ5´û9õn<Á`;h ÿ±ÝkÕRâò„|¨öö0Eësâ ÆSYéªo«ÏÛŽD %ö|uªà½;¶º$‘(Í(€zxËÿ8*“*¼üÿ€ž!jg$‡s2’Ôl¯å›übq X7‚—v¨|œæÉ²7¦‡Ù‹ßj• µ#I4Ÿ ^ )$4ulLB³¨–%:Vl¹ø¨™ß_Eepq¥’¶?¿+˧ömÛN›‚š tBŒ•Üž¤îñŠÊby ;”\šäðGF}}+)ÀiM⧺`¦”)‹k®~ÕšltJ“m62¼4r¤ÀŒ/±»SûRŠÛj}³Bž2Ò”‚ ?}ð-ÐMætœaLG½0t|Õq`{¨[&òš,¥Db9ô÷Ûà˜ÉˆÍ€ÖªO7=53 cÜ•§h¨ {ÔÏ}°ahêBëv¼\7WàÔi$þ ÒHßõg,|—`F-Ý4¨7\ Ÿf„}b|Ûî¡AH†z=­n=Ó9C„6\0Kä“‘’¥ 5§ â^ÝžíuŽÖKÎö[t–´+v›¯8W›of­Ö«FŽÎ³€òcê^g“·2hLž™‰ñ*"õ-RÃâmbs›ð4w™^‘©â–%9ÿšì·ž¸î‘16T8W>4§8ESæ-,÷×èÚ]]”ì8Œˆ°Ýo<$ËŽè…KßZ‡QÜ<=•‘½f šãL%p=].¤±0²5ð:_ÐI¥zß"LõÂYy“aˆ´Õ± YdfØ…´ùŸŸÎÏFÚ `‡ïsÿ¼ :\¤Ìã#zºBFJ¼{æ£T?qUEç±ô\Ô)º“,ü“„yЦ²­°Õ€mDËâY Ó7 Ô¸Ÿ¨b´íûúYŠÇax’,O¿¤§Žf"ÓyÃu×fGß œÜUÔ Pz­ŠM@T‰›“Pàg¦Š}e;” á€]¤ÃGB Nbi˜*××[yƒ¦„2|˧¦·í¶`ኋGœi;ïë Åj.z,~ùŒw™¥ƒ{cNuq¢Žâ¹-†èÆ|>f'¿ð®È£ËÝÃm7_&^îEØÄ<»tM6”±W´Bwh•ÇÆÔI•a ظ¥š%°éÉ™+j9'§76© K“âAÊð-îfË#Xœ «ZfÛ) Ý h¿‚x2$Lw±^“ºÍ~7€ËxÂQþPÇ8‰&]ðÄc3$"°‹æ¾@ »e£Ìiõ… w}VSÙš¿¶γÈËAe]‰ºä˜m K]D͵‹ž•¥£•ŠÓ4³Ë3ƶåí¨çZ¸m²‚ŒëDçu oç ¸?ŽÆ§sýGI?ɺw’ÈÙ ÏÅÉîwgF-í ®¥Ò1ê/™%˜ìÉr€Ggß°3ymq݈€òG­‡v~ª+>ýí¡~+L@)Ä¢åÜé¼\Æ4ȨJ]NþÁîˆí¿kœÂôE’/É915Qî["G&&ä]IÕN4Ôí‡OœÙîÒ`%CÌ©ê” %Å ”‚¬K÷'W»ÊBÔ,œ†!7&V0wì&4Ê™x…×[#!+¨É—xœ ÛòÂ[üÀôûm“Á¨ êQ>YNd½Ìr;’¦d¾Œff5“$Ê¢¬v€ëL²¹ ‹pføû?Ô½°°T_õÐ\Õ.&+êÍKYbq`éñ¸¤Xô1`øBZ¤9ZE'ÂWDbÀ Ü­áƒúÑAƒè|dÿÈÏ;­*uvAD¾ÿ…â m.u`¸CQâí²|b(ÍÀ!üc6_EH7’‹uˆ{EÀhj3?B¸+nY… 7—ÊÚ4Œ3$y‰¼¶a MFuiÅŠ}G³ LVþgbÓÞs³“Œ¢Xúotrƒmˆÿ]1+ç~«Š³<¢üyD³¥ìôÔ¾N°»g­eư|aá[¹˜3hp4ræ ¶zpéŠñeˆ™²¦ýˆÇ,|zkáEÂ5 ³y^ÚB ztcÓͯk L¢™níH±È#ÿÔÇMó™;…8U³ì% °ãÿb!Ü~‡?æ²ó¾Í}äZ˜1 ïU¤. à4ÆÐOø~ËÌX¶ 4¨/­›‘ÄBÀa$|*FXS’1¥Ü}ˆhŸo7M‡âËYPw›ÄQ¹œn¤ÏÛx®ª©´údÿhD5ס¬‘¿-ilÆ:ƒn‘{=¥$åšA”j ¥áãadUoÓb!Tæ]ƒ‚¢89Üð¢zkJqáûµqÞÔŠ‚4t(Ä€1@ÕÿtD,ûc¤àz@ç2Û¿èL¡ñC™&Urã~­k?=“”4t»èF,õƒ±Ú1šö£´Ð1}W¯Åɸ+óG5T O4ÄÚòÒWÔ8ûÈ!—„|ng"ñ‰`Ó‚€ÄÁÎë0vÞåÃ3ý³/'`Ç—Õüý©|OòkŸ8ÕŠ¼o¤?¯ÏÈŸ^wÌ)¬£·tŒiæÈˆæßÂ/î”›žïHãÏÚ—ÆéïàwhOÜIæOÕ<®ßSì„It˜Ž¼oa{˜Ÿl•âîÌÙß°’ç×ç ¾¾úíÉ~¥DXäZXM`HÑvÞ [ ”‹!¹rv™ 2‡…÷ tÔOÜ2ÃøÇÊóGw¶/Ôö¢ÜQ=g­òÕãõ~êÑ3A·5þ[‚rûG…ÎTz€2yëœû%ÇSîÝ2\¶—Ã? ùi85ù+œ? ÿ<Dz}IœÝ®%¶Ó礀¥ž£?<_£ëÁR€ÙìßY™ ¹©¼=ËïÇ#NÐðþµ­jÄþÏöyÌÇl89Ü*!i¦µÃž„}®^R8<{3M¹¯=LÕƒöÓøÏiêáyUê%wvÈEûÜožú£öòFPhgU¿cräÓD…O_Eпîl¢¸*R* Ò•3íþ”„A¶˜úþ5|¹àÿPA´2 R*7{ì0•#uu¢5“ÁyñºÎO”ªUá…¸r…Ÿ)gF|¥>ÖM®÷Q‡jŽ@'ü¤~© úhQƒo1åh—Ž÷—#)“éÊ¡ÑÉ™{ å¥ê“åž ÆHÑyžïGA’ö€ÆþUÇ ÙèÔäÅ6%<iìᮀ¯fq^Ý’ôuÛ衼 Uÿž„_(6º±Ò¯n¹~HB’“Pñp+óó@>/’¡êÓs£RS³®ëYéx@=w-±´£ ôn„rõ«zz‚ó©ZOR0yí@ŸSÍÈÎÈá±×yòhr¶”ë¤`H¤8œ””Š|ÿÃ&£þãˆ$>„Ǥ‘†¡"wI@w‡óòOS¤¶÷‰H»èzbQ …†¾’¥•—JÁêǰ(O¥lN:]e †Z &ƒ zgå?£@÷ÔК(eWœ(ÓV“›PëÆ#¼; ™ßP7€µŽÎÔ¢ÿádí Žþ_²Hˆ²1/ÇŒm‹ÐGé˜Dã-ó*ÇfH\¹5|E$L•CQPùVUqdÎ:_4%k÷Íày<*ãÃǧ3IQÖ‹I𜦪 «Þ³øÚ¥3ñÉÅuŠK,›Æù„±fÉ`v`DAaµw$8QÁ«Øg°þâŒ%%?&®¤$´ ïÆ„_-gÇ>ãÏÕ‘´§iî Åd‡9’žÌ,*XÝ.=,Õ%<½ Çx—í“*j‹O¡??|çêà ÆºŠôø‘® qëÛ5ÕýÊÒkó÷Q›œé©Û5cqsx¾Vœ={ŸÇ%AÙ¢3jñ·.-WÝ\6àù¿Nè$bŠvh©§šJ.P¸T¯„¬—ÞlJr¼Î¹?ÉòÿÅ!ÝìY7}o©!“ä’&;}®ZŒÿ”å€î?¥E…#à I V¦T+Á9B¦ª";ntÄ£ ´¥ †^ƒ&XéŽW‚ÑxTYa~82Ëpâ­M¡Aå…4ciˆæÙ…šaá–Ôç£oÚ8²GZÄf‘Â4Òê…D?29ZåöGýOYåî_‘ouåkÒ盇½Ÿ=\`UeŒ3…¸9Ç¡4‹Ñ_q|UÈØ¾_Š$¡úÍî(ôŠ¿©ßÁ7\¦ÒòÌÛuѪþ˜ƒý?qÄÔ¶Q‹ù8åÝFoV±5Ɇ¨ßt@jlq¿!ž’£’‹Fœ™Y\e¹M´{éŠ7ER²M3 ¾¸VTƒ:õ“´H*岆Wg ÇþY5Š‘¡œzØaY· =¶ï 0K¥Ñ¦ŸÂŠz5, í¶@€kà¢ÈÈÎr¯À§]dpqM¹Û•´aÏ¥³œnÀœéaÆ ž¡"¯)q<ˆ^Gã¢Ð™9Pƒ“ã¢uRQ0>kOZƒèÑ¢ð‡JþTÇÓhqIFg¥¿ÐGÈ‘ð…z¬ùuœ8L¬ApAÝ«NpQ ´$,³ûé“›²4)CÝkðet¬˜#‘I2- jè•Y”ßbQ À¼žKà)7 ÃN˜PL6¦š² Ш”ì(ò„!wQT&¼x—Ä.¿š²—&³AY—`PÐÓtXµh Xý@ÈèǪ̘ª Ž½ ³Èœ®Rý l¬B $|ûæ’ÛNš˜!!Fã’‡úÏDŽÕ§Fªƒ˜ÂÏ}˜A¯›ýr””bC¬1Éd¢ò€ÙLJ}, @äšW%z/ÞׯÑ:=i(Ëõ,Û%ïÓÅx(E÷¢‚—Žø|BQ¡vý{·;oXX\Š´àEçhé!¸¨ÐèŸCá¡]w,¥°jÚ\ŽìP„‘"ºÿÎMd)V§5;‘J@˜mè)îVó_Ùˆ&ËgƒJi"mþbçBø]á0¦æ ÚO‰K~+ÿ­rc:j^[òžÚgÌTV$ Žž4À¤K.”‚ÀE¢éZºôŠÎU Ú§èþ*&:è¡åâE)ÿx¹1í°c“³EUä1µcôËæk€=œiŽr²‹V»In¼ ro ¬¢rþoœaQ|Ÿ¦ö¾ôÁâ†iF¢+ŠVdñî”S`Ék¦±±Ë>,€¶Ÿ˜=UÞiXn׆I¼÷D)CÂÀ¤¢»~¡Â©‹÷«"رýBýâl^¯1@†T 5aR›Þcé;­½¦^ÈßKí¥æ$fÅ—tb¯©fFu…ŠÄ«Ø 9p¸€žƒzO&‡uG ½Pzs•E]]ø^gXע؎ё+íàöÇUzàw “V¢f1À¦xJÒFxí¦cýn¥÷FÐp›|¡FþÝṁ›g89Ž^m¦¶ÜK)|P¼|Mj4àñ}ÍGX$ætçHKÇÔ¼è«?ÙohsØþ6ÙFm×¢C»PåCÍÑ¡÷Àß8ãAø#ׄ'¡ªaò¾MʨÒY§Í3…ù©ëƒŒqAá·öù§O#ëðÄœ¼pӹ̟XqbI‹-sæ¬'¦<³$¿#‘ãº5—vÝóãpbTdp V3òIêüfÈòKüóš>1=zÞ¦PÎûu—`˲õoKŒ~”ÌTE‘·itd«N»Vq¦úíïÓg$ÆÌ~(}aI¿D»ùýHÚS,­à-€9xaIËï׸æW#æ•¢(RŠäf†ÕJç8Z§hOè`Uü~ÌâNSñ£Œ>U³wÁê°dˆµ2Žˆü.WzW* xüÿIõOûš´rãfduµgXªÚ`d)c<ýeò}¯úuÉI(êGkz>Òì(*†Õp¸7„d¸ƒ±SΪܪQè…S³VÏï]¼„S±¡ i9Û„~£Hë·%3A;ÄYI;s'Å?…¦US>eù6bCNÚϰl¤gäµW‹æk_à?ùÏ:ìMo¢Ee’™ûùÔ±„¡Ûλ_·ÆWß|–¯ÌŽÿŠUÎÈ—!Üw¯¹šÎ„ ”M t2gòyõÌ=9»žJÃsru‹Häý@z 2¥‰5‡™™!eæÌ hxÓxÕòÛÑ¿D,þôˆ,¾¤l»)øë:ñ¼úÄ2TUW˜Ó¯êœ©ë=KZbµöË·¤äÖaŸÀžpJK8JdÃ; ,9­…LÛøt¾Ü¦Í .¬^|òÕ¦|Yë½ù4ýO³Oo_œËHõBª¦áìBA{Þà˜ÿlPt© D›¾Xsóiœà—Í5Kô¯*&1¹f`æT_½4,tSà áqt|²Ö—ƒ½Í1špÐøJ±+á^$³»÷Ì÷g hÆ ](Ÿz𦉒–²ÏßUÉ·axo…ŸFe·5ÑÏþ!wRW – ìI`‡”D`EO¸4Ù’"¸f¨£A×F‘ÊœŠc+B.Lmл€åwñ)À¨xÏÒ,Ó()]áï*½VÉ2iýcIêN"Áp«ÇŽ(FÕþsÊ d±ÉI¸íÖ ÆÞæ^÷jW°QåS³R@N›HÒ-µOý‹úý>ñw[ûB-[¯Ç !‡ eĵ|È jy£3½DT:ÃÆi#³$°Ôk5›”ËÂxG‹(×]‚(½LPy^y£slÔjùǺ+à–¼¨F,°5e2XJ$Á þB8rCì>vYºÿ±!@’œ¤wl‚Ó[¡ÇI€ œÚÑ\Z(Jdáçáµ°0¨êŸNdè7íiÜPYÁ¬òú2XàÏœWÊ]Ù$ðù=¡€"B<@«êUï¾VZ«VO«z׆¨Ï=d—úò¿ŸßpÉt™ÙélÎ Ë? šJÑŽâPùO¤o±•×çEOóÍ.ÅNÜÉÒž82u”žuº³Æò~¤ÎϺY0…„;ŸtdÅqQ®Û™››;Ïo,ZÁGÝäÝÆz²ƒÑÏ{‡eq´†ÖíÜÀ@ËqtFŸTg±N^ûöß4<¯ì@™'ùÖ7¸t#½Ãõï7C»mp1ªËA€ñغÎðÐä©ô/±˜Z¦?æW^|ÅU×Ë®:]_B•Lé¡ 6WA}­çV‚¼LƒE ¸ÄCÄP݉¼dÛ/eqdu÷à×ÇáO±R¤ð*|# T¸G hú±ÈeƒÇX9Ã`íÕÙç¿´x€Ã»;áð¨ñ{åWõôâ­ûìR´Ë{ÇõµÓë™™@G‹ý¨3ô¦µ½ 8‰»«¨ÒBV¾v÷ªºV–ÝŽ2nŠ[d$‚¼i«¦´þëYªf>¬Ùܬa#Â)ý¸¸}¥”mŸhÝûH&˜èX,þÖí©°bÁ·šåý1ÁÈ‹§.ï¯;ò/œ‚„9Ü;M›`@ 9slêá#ÓÁÂ~æ[‚¼ýn¼@ÿ>Šé'vöùšÛ÷!}–#)†kÀ_³$â0Vnoô4qÉc™~Ú(Á™$Ö<~vMÖœ¶âëÎ9Ëa|•°“²¡ZÃäGC¾o0ÁP¼ØV¾ª=´ì¿^Nèò ª.ìyY2Ž-\ßì)°‚$ÙˆAêA¼@x0R"]ßIDA CyQ#Ú„Mµa øŠb¯v‚!î¾H–e¥',MÂ9¶ í„zh¿§CuöQ9¾¶ –spHIvF ´…á'üû'=Ô¶ F³™@€jòG ~¸§ pîÏH¹8ºuFóWÎ`ÃÕ¢¸6*šGs9îA ødáÏ·­8b`{ñæ„ >¨ŠzÜ»K«îç嘢ÙRa¨{ÜoeÔ© ß$»IéR¢…ÚÄ:„l‘VÅu–}é|•î|Hûb% 0‚_Þ›…,ûƒaÔ!(WÃè‚öÏÓåÃVöa6"DÀ8°`«6ó¾ ÷z-ÆZƒJ½:û‰› ¹ÉðªÝ˜ñ }ðc^v?”ê_˜M`9ØF3bPðr`mˆIØP º¯›èwNorHWX ÌŸO0ã=ùEj¶HoƒÅ½‡2~HkNz—ŒÁ~߃¨a& Ù®ZAm"(L)¬í÷lÔUvÙrxV7gDAû·½™¬ïH/S‹95õÆ<“L—<¢˜)ìgaÆD\".zÄÖWŒ¶LÚ£rû[,5DZ\ÿ!A7;õûj4PúK@’y ð^Xa­_Ȇ„ÔXRô– U–ý›!ˆ§gíc{ÂÐ\¯ÁwГ-‰Öît|ë4Ëb(ÿT‡¼$±ÞQd<™;6TÞÈŽ3ô,wAov°ñ ÎúÈo¾žýàdk·åù1a^.‚èd-;¢·\-Á$ ‡|”¨ Ë0CE€Â‹œr žoô“<{8&U0—°¡´øþ™‡5X’ÑÒÖ3#Œ5L5ûÌ*¢ 7IHã0t(Dmqñ&NwiÕ ¸_% …·$´ŒÇÕÊuŒï9r†^S-ø®×û½ ú­05ƒÏкŒ)‰4××h©É x,ªÃ³å…hí“þ±bÇÂÌàÿE–^ ƒæé©ÃR^w¾E´;ѽÁí°îˆSš˜¡·5¡ÞL¢WÑpæ}ÂgA¶d…EWßySêåÔT€He7¹½ 8d>þ•äl…Öî2dDÅ#ê‘\–HÂ…ÚM*]™KôAPpÆ´Ît¾Þ±¶Mh„hÉ¡{¯›å¥Ðì¢_’Öèì²Eíh%uÍt×:œ>«5‘G‹N&P\BŽe$v xZÙ†Í C¿Oò+L}ˆ@©‰…/Í _¼­nÔ˜Seg U¥•®[«7"«’"… =ô£Ô:óü]›s'àò›2~³ðé¡’d±xç³÷ÔÔÀVÄRÕxZ±>Ú=Æ5XO8ßka ⿵lL›h”´(¿¡’×U¿Æ«»jO¾ìÃS—k \Ýu¾?ü3Þ,_HY鯴dés—×›"Lf!WxêA2ÆòŽ™Ž[pM{x9L¦QÔEdåO§lšÌ™š‘g)\[1ƒ>ѱ9úá0•ÃDœ+ì+¸ç“)1üUˆèÍ@àþä€Ýú B¾®‹A=Bh%³ ¿;4Hé½5¡ÿ.a»âó¤Ç>¡òzuNc]¥×.fÖ%áC S( Œ´àžJ¯%-,Bqއ„›Ñ[D‹Â"¡ÂSáª1Ä3Ãßu¸ÌzQ Y˜ÒÄÀ¬I(/1vÜ Ñî›`ÝÏÑØ>='ƒb°‡ØfÊX÷>ÝŒe¬s}ÉÖp‡„Cs,¡97KwYiFêVð¹c´sÁ1ÉRËžøÆÂü¸SϾeðMJ@Š÷Û*å^"7Çó ç¨N¦q õØïD°‡g,cÚ©Æ:óØ,Û@^Á¸бŽp;‚Ô,zø:Â,¥úÀµ‘_&Ç€O™ÏzÑkÚÂlÅ;/¾Y—Œ, N ±Û+ãlEŒ0_¬Mf<]5¬ _±zaEPU–Â’zãT°‹"|?®æ¡±ã6xÝ'‹7ƒÕ’Òñ`t|¶g!²ç3!döÁck²È[YW•D£Ï\ûpuh«Ú+ÒèOÉ»4æ[ã ›æ”üåž½J³æµD‹&74ËŸØŸÝþ–_³ú†Ûa'ÒÐon¿Ï80„asˆ?ƒK:!$¤0uNÙ×M›JjLÒ­^ÙWö?ýnš4š •ë»ÎPPyÕ“H7½ õ„Bx)ÆÀªgÒ6ÄìbÔ±(EK¢h+­Žz~÷.õò£ ÷Bù¨µy”Rm(‰UœË- ¦"÷UâË ŠÂàj­‚:˜áÃ;¼Œ\A'Rê8Â…²PÅ•2¸¡]=ÝV=Õ!¨"k¥sËCèS%×[ÜkÜ‘_mT HUâß¡’uÙýj¶»‹FŒM ®æ«ÇìççÅ µïñz{ÇM¼[ÐxÉÔ/ödÉ r|ÂLc%4;!«›ëØ80Ò 6Á°h¡A‰l÷%t³Þ©2¶ŽäMè|uŒÙõ+ïap\FÌ•ØÏzÖlßN›&»-—4§sø /Rù8©`ž´ÜÏö<Ÿ‹ÁûTj¾ê7Éußbîœ#ÜdµŠÓ ös°a+]'Ý¥ÂÖ_~&Þªâ>´‡Àœ'ý OÞn¯ «”lDå ú£ìÛŒÀÊâ´ÇÒD–l¿­UøÍ”Wm4ƒ ËÀO':R»Ä'J?ãØj­”®)õüøâ35µî{£rÔÄ g[7‹yK@ˆhH#à ¥<>ïYx X•“ l\ëwñúûŒ×?ôwÖ³3î. ëWêåÍ9ÒvÕ4L¦±ü¬Î} «Ç~@ü@þôïöv‡î€Šq÷âù®×ì„æÑz}.9Ý@ÐŒG}Ñ u…mô:…¢X¸Œƒ•ìu¶çÚK¿[šÓu|zÁÊ}PÞA˜§¡TÉ—NlõòŒkmZÃ8°–¤x¹Ûo,Öèr%~wý^/§Ëk”ÛCžÖû”åþÖN“ãn±¢ÃÒ F»µòz‚Å{¡›Âf•¬Ò`NË Í®”e¼ÙvaYµŠÞz`MK¯= 1Ò~´.)Ãt"N´)t„ ö™áÎý.ôP ±f,–)dãQãÊy§¤BëØ<-f£w iôØ0ù£‹‰Î¢èà)Åà†<<ÔJ>+GöŒ¤ø‹Å}¥ñgj}•3îXåÐ/Žß@ÃÚ¾É+™lS˜ze‚?W¼’ÙebÄ‚f\J;ã,[Óøu „1[®*UÃÄ©Yz°ÓÀ^Æþ.÷ÇT:/)^-vú—I žÐç¯K!!:Œï]Z)vÿO{çÕ²íq‚ $ HN2@rÎA@„! ‡00 #"93%HŽb (‡DÉ(A²A”(9ärÎ-ï{^½ª÷}~ºöþï^½Öê^½«vUWmžïï|'y»Ÿ;ˆ1þ°h¢Œ?uI`ocž ‘0øIF›ùcîÓªN Í­>Ýûçž £YAÁ4Ý…£ÑïÝ™4éLá­»üê-{ë1ßœÂ\ GzÚw¢Æ­zç¨`Ÿ¼¹‘Õ²7x ëT¢‡˜‹°fvî¢Ê¸ÌØŒHÍ€¥ŒàêøúFqRÍý@kè=±€õáàòÇn×À-ÖÒ¶.x3õëÁB“­ºh)œÿäõ ñ6þ’^ÉÐå]2ùµ¸4æ¿D"ÅÇJ¥¨ßjÞ$'ºÚá^k¾l(ð#¿ïÇÕãPºØ¢M‘ºIΜÚâ&®ñ+²j¬EõûŹCJµÜ]Än…[0ïk¢_3ií!Zò®ÐÆÎ–ÔÀZ}ôDïçÀ™o1Ù±=,‘ThštcïN/õ£•óYä€>$pí0/ÚÉô´`Û}îÕ.ä¶à$­Ãä ÍHàcÎý8ë'×&` #}G.– ®`6W3×UHŽÂ ßü:Bsï˜e:M/´_Ç™#ZE F³Ì­Æ6è}h¹©eW§{U #„Hæ…/1·~óÛ x³™êVz\Ö_T+.Y¼íÍÐíoskËßL6‹ ®¦”Ô({¶¤Œ´soþ…J_+µíá_]þC¡Ó­)@ßXä+Q¦‘T™û®MõtrL<*ÛÅõ¤%9.úªiæ¶΀râc†I˜ÍKáùìé-;—["SäFd€²çKÉ(ÍÛö,ª ÀÀ¦u± %KŸâN@ûÔaʼnu†«í£Ü»7Gf¶ûìÂ=ÇA/ŸÐñE¾ÅõúïŠ^«Ú˜ÔñªŸ:š˜1¡]W  i¬V e”uû¹÷¥0ƒ'ã[ô…)9ØZCÝ^"€C\­_8Ôí"oˆs˜ŠÛ}Pšàƒ|Ì%ÑdaôÉuÄ@ÖÆMCæUpìb~d³jÞîàl(ŠÂ:ßÛÆ!Ce•j¡JB¿òJ~ì¾Ø7L®­ßÄÔblâMÚ åÞÍ5‘§ŠNLAyð‡jw‰ìä¬9™”ˆ‹¿aô©c@A̼àNÆ^B¢MúFÿþÒØö·ìÝC­–R×™~{+[I¹^|âøÞ—yFxPÓÆYÅ×fÅXöF¯ÙSŽ”Ä4X½W¯ƒ«>ú)~?Ö¾yS¨w‡Ïͳ|øƒwž˜ÛÍXöXŸ8ïpçeÁí”Θ”álå\²\!&†èøÈb©dÞ*UVÌç;-l 8û¢ è„KQEÉ9Ø÷æ:›Úªrù£ÇK¢aƒKÍÓ\ðR«§‚KGî3k!-øÄiM,¦`ÝCx—ÿeúGc¡BîP±¸²ŒvÏâòGqƒ7ð¦ç¿¦ªi)Û]a)'Tl“ÇŸ]_d";c†?†}T'Ï3M’ÐÿôüE­:…½µR¡N™Y׈Èõø _¤ã¾¾Èõ‰é^ÆCc$†}*#RõE=ãÇ.^5•Ô¸®Ãaÿë2²ªô5Ë×Y]¾Ì/°ßÍž§êCÓ8»‘ï¹á^§”Üfh0{è¨Ø{Ö”¶RE–©¦Áç7r¤zƒDM瘟#ûÂÒùŒÄ[âby«Ø9.ÖE©>¼Ó82Åd}GPÍöÒÁ*ä¾Î‡ïðŽH° p2b°.«ãy¯J0OˆEõáäà«$e2°Ó·D­iâ¿Cˆ2++Û„¬¢ÿÒ%nZ˜1ß_ŒEß±TXì;b]a -š‹àÜ®ùúa¼ˆï„Þ|T5ÒkiÜ óI€iÑD²fõö˜z–HÍŸpæá¡æa 6á 4›pËQÕ˜¼,i_TN³‚kK,©îf!õI]Î ãw¥t•YhlïÛªyS²NùZÕi£[mWí&„W7vµ|g»²¢éT'ý» Û#¿€âá$-¼+†œÇ¼GmžÑ¬’Sü…£S¦ØæÍCñHÍ•±…äÄæx9l8èã_÷3½WØ¿´2åÉrc3+íÖ¥Ò¯tÈ—+ ÄRyŽYb+6ë8&•-RÔ«ô…ÒY¦‰ GÙËiòŒ•f¾O ÅãG Ð!zdÃe“wñÖ¤h¼bj«r¹®å)×8ðõÈÓd›W®«Jl«Á·‘Ñhïµ…‰P¡ËD˜;Iq|âV•¼édÓ€¥ú|í½µuòŸ„R€™o¶…~Œ®¾¼R‘ØYåY×ÓµF"¦¡S?™#~sá'g¸n«üG?C¿Mþü< ñjP®ï\ 7÷×™?•ý t½ð ¬·KZ«¾gæêk;åéßß赘•¯´/YTGí¨svš/Þu”yöÈŽÄsçpT:.­6ÿh ý±¢ÿM™(EÿbÉ)ƒFjõüŸ~ì™ÜíÎâgŸ¤aÖ¿rÄøêpw±yeì×jŽ2Þ¿C H÷ð+À/æyû6’=ð?‡Ä"õ_ðÇ ©nTÓ¿vkq»–1»˜‘Íë X™DÊ]æáyâySX«FOʳ:vR·”¥¹ïf}U#4ò‰Ä ˆ ŸZ’˜Ëòôé/wg+[Ùì»°e—ï›–¼%aƶšìudôŒŸr6¹Øu £ÞØ ‰ž ùÓ¹n5²YûX‚(~&Ö Ïü”)Hq=”“ù×,ù1““ ó–¥-Éþp%vƒ û®!!#Ç3Þû|µ³#Öe¾Óâý^E~õÎü|Çþu¾ŸnºRÖ U—•ÅlhQ†e†ÔÈË­ $G›cásÖÛV)Èw7”Ø(V(‡)nCpaÑ$—âuˆI¶Ú_0e=Ó‘ºd^øàDŸƒeR’±nª¬¤;äH]ô%-Ü&¦K‡ÐwÎRó5ÔïµP²]íkîl2ˆjÙ­$™ð”Ó²#o9Õì=Ù4­ö+¶ºö¤³dfVñL¬ù‘U®’'î‡ë°¯ÓÄ,‡_í÷ô:%vpº‹´£¬ì",3¶dåyØðã×7âgB潟Où·V~‰â’Ë÷ìùÔÒ¦ vq5åxöU®¯>4Ùp#‹Zô^%ÅYb†^¤;Ìï:Ï.ï‘~ùƒ•ñ,¤_Û•«Ï¨F¦ú8g†¶Èžqu(–®bn¨å•d”K¿‰bñþÿ‚¯i-Kù³®.ˆ-3¹m•Ô\R椙?‘æÝä Žˆ°“”ª uÒu¨¹^ÿ=âîªg×÷åiQí²¿Vœr*Ö‘à+"Óü™J1[£Þ¯ìíŠãø£ò-Êbú•,‹/k›TôÙeª¹lA†l.ÇäÓ†7g§UL˜™òoûq½W@]½—«`¶vc­…ñu|8£"ª›³õÝ",§Š«ºê5Gýt-J Çqä)äŸ9ʉ˜……$häÞã²n²¨ëý¹ò®|AŒœkp ‰š^§QÍÐrΦd!ëWïìyÊ’¹IãÓÒ¸~M°4ž39ñ\v>‚s¢^©À›ýw{±‡|b¡Ó÷ 7=s©8,R÷ҸའKìOƒ°¦Tÿh½Gú~ìí“ÊU4D~¶¶—{M]½x½”&Rò鉸܄]á[÷¿|V«·î…=ÏCu‹Ö‡){].S'wŒÈ},Æ¢¯¿³ïØtÔÖ’hÏQÂéØšÇÝ›/²c0Œ¹÷’Cø~Þ C-^bs*jÚžÃÁHˆLܼ#ÒbãÜú%sJ;Cy+µeIå †ÆÃ¡-<©½ˆÿSÛ,:@_~ÙüäÉÑ»•ЫÄïï|˜$¯µòp¿ØmŒ0Ƹœ¶o> ¹šd„xZJÅôX{%ŠAüê·QæXñ*Oóe«Ì»î—uOb'ŒÕz£ðWõnÝöæ5û{vyg¯T/l{²É—c¤íÛ¯Wþò ¢u¾QÍŒA‚Ìêôªo^@ çÓæõMa\~Õ,-•eîöænP’`_’ëã‘[d䟕wTou˜þ<"SÅjéÎÉE… u TnÓëqz¹Æ‹üe× 0ÜQ©d†æÐŽ‹èÑÄ )P¦Ú§”áÙ©"1&úÛNÌ+"ªJ¤8JZŠafÄ•¸0á_µx±q21Ó§½l¡XKU*!œð4y++bÔL ‚Fe¹ÈެâF¡Ã“§¾§àr hYE\O©ð“¬0hilVü[‰Éü»ž‹Fˆbfo'=0³xEß-ΧbùVËw¶W88WMqÖ‡ÒðG"9Ô.›կ坼[y%^¡© +hÝ}Tês‘ ,„"pE¹T/³«S‡C’~¢á®œ9xP RѨ£Žã:HX"·(ö¢ š6H¸"7'ªâ1~?ok“DÑ|Å–¸‡Aè*:ffüBŒX«ù°ÜÀ‘J¸s@$9J% Á¼m¾Ç†VõÙDÚÜï¦|½8gkÊ¥÷¢z é4`§PÑ'‘'*©YÍ£G¢è]¯jïšyJÆNd«x¸{ñá[I]˜ ~Ëà,T=ëqEyªÙaœDÔdÁ@ AAP˜ , ¢ÿî…B‹(ŸÙ;ñj»»ûž9ú[áU5…ŠôQŽÿ·½åèëàô{#5 ^wW{´ú>/\ÜrŸ;‰zÙ¡]Á¶ž([;w»³ÆVUßRWTAáwè~h'gZ /D ü¼R0ÆëLKõ[åûÏÏÿh (ôœA¤Ïkÿ¾ûwû{<(‡ë‚ðÿ© Òi™ > àó¶³™9 ‡.h2 ãÁ!PÈM z±Ÿü‚ X~Aƒ€€4)øùñ À3'ç5ðBnг…¸`{Þy[&-}N“þ_ÖH•:³ "u~®àR0ésy€@0Èù˜A`rn^@i 4øÂZBÿÍÇY­»º;¡ÿÞ/¦®þNgå0A¡0¼ ¿·@ÛÓÅûÏž:»V³’—¨Ik¨AÕ i•³ä¡2@ U©³Eת)Ãe@ ò**Rê °†¨•V©aRp˜Œ²ŒŒ´H"­€8«xŒóO½Ÿ…“‘¡T7Ô %"@€ @€ @€ @€ @€þ_ü ½úÚopari2-2.0.6/doc/PaxHeaders.6153/pdf0000644000000000000000000000013214015716535013636 xustar0030 mtime=1614257501.156014763 30 atime=1614257501.252015069 30 ctime=1614257501.156014763 opari2-2.0.6/doc/pdf/0000755000175100001440000000000014015716535015106 5ustar00builderusers00000000000000opari2-2.0.6/doc/pdf/PaxHeaders.6153/opari2.pdf0000644000000000000000000000013214015716535015602 xustar0030 mtime=1614257501.140014713 30 atime=1614257499.084008167 30 ctime=1614257501.156014763 opari2-2.0.6/doc/pdf/opari2.pdf0000644000175100001440000112466314015716535017012 0ustar00builderusers00000000000000%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 829 /Length 1440 /Filter /FlateDecode >> stream xÚÝY[OG~÷¯˜Çä!0÷‹E'­PC‹òP‰Çb…€eƒšö×÷;K˜õ0³c›RºT ³ëÝñw¾s¾sYoãÌ0å˜eÞ³À„ðLp¦¤fB1e,š%˜pÌXÅpÛ*ɤ`ÖÊ”ÌiˤaÎá ã™ €òLq¾Äµd ˆ‚[²%„†”tL[7Àa„dÚàˆÀX¤¬ ÌÏy"Â2¼ ÁxÁHF–9ŒX£µK,Á̱ɂ  ’ÙÀ$¹ç8“š æŽ é4ü0ä ŽÞ1<ç óÀóÜ<ðWpGØñpŽ1p„?\…€°© þ)ç‚Ã`!q² NŒŽ Kñ6Ls,-à‹àð[x’ƒ32œÐC[NADì¬ÖdÚì*ÚK?ÐE8HþÎéÖh‹ˆA±„>F9 ¾B,9©àR$2Œ³Ø ?Œ n Œ d2™€Øèd C@(+È(Ð-)+ •UzBGÂ’‚”F9º¹¬ v­!M Ñ¡'@(ædspBÈøsšéE_‡jÎCÈæl [ÒCsÞ‹€r¾„tž´ó’pb/ êyuE …5ö’˜‚P蘒 8‘¨V ^¿fûÙþÏW§Wlÿ-{1›Ÿß,§{ãÑâz~u¹'^²7o/Δ³øsgœó!-W´\ÒrMË4ý¸z™áŽ¿qº, Zθætü–Zhù@Ë-r}׫õG©ñeä7¡å†–q¼;OÙßaŒâ•Éúå‡ùºšŽoƒ×éí^æ÷§+â/×ïM"‹qôè[Êh“—ã莬¹“ô1út—VÐß»ó£`B–Å^¥~_Ä¥†n‹*·¨Ö-FÌUÄ—¥kv7Qí¶§s{:˹Óxö*†³Íîy Âùú7ßF=Çi ¬íï–W—²U—³µ©ÒEš>Æ'Ý~›ݬc¾O™~­8zÝKê÷îÃq$ÖÊvƒ7í*Ÿ$wÿLSìöKÝÎÙÜ9»Žy£v?nSú¥t_îÞº‰»œ¸['ðŽ–ïø[þ"ÚΛådC øÜ¨ÏRa”•éô!Þ»(žPû5^ùcC“ó¥*ðå*8.L𶵕ú׺´€Óê]Ux_E©î®¬âå¶w³ÊžEÌVþBy‹éådþ}ï wí`÷ç϶ØÚú:ˆ¥ø¾bÿ0·˜ÍðQÚÍ“Z.ŠY˜p àC»“ä°Ô'+O Ý1ýQ5m;?/=ÂþØÕ¦Ï,{¨Ç'³tæ¶w̯ÕÍç5ÿ·ˆ@‹ö­ú½ô”÷¯"³v²,¶-å-·ãdüOÑHÛa'O’gU¶r§ÑñÜRLÖSLö5Åä¢õ)ÅT­Ú)Å>Å,y3ṦŸª§Ÿêkú©zú©~¤_|$v¼cˉ]<Õtv¾øËõ¾Š2ÝûÙ“ÔÅòÁ¹ßXü²m@'÷‡åé>ìçt¤e²Üôó%Ñë"šýü߉ ë"ôtþ Ëóo¸iþÆ÷N‹”è4ûmôØeŸ’WÛ‘WY:ܤòÖ^Eÿk«J^íTÏ­g©z¹¨¾–‹ª—KǼ>ŽlÇé[‡œè,ÕiþÔÉ™:«¶sVe¯a/ d–[ýÇO©µ<³z;gu/{I•¼Þ©—Ü”^ò÷iÖêzóÐ}mºÞ> /Resources << /ExtGState << /GS0 216 0 R >>/Font << /TT0 217 0 R>> /ProcSet [ /PDF /Text ] /Properties << /MC0 218 0 R >>>> /Length 3468 /Filter /FlateDecode >> stream H‰ŒWË®IÜŸ¯è%,N»*뽃X Bc‰5²€|y ~ŸˆÈ¬îs1BÖh|OvwUå#2"ëÃo>¾ÿ˜Žï~ññxüó‘ŽUÎZí°5ÏÙÖñ û§?<~wüíñݧG>Òiø?5üÓ¿>>üê‡tüé_Ÿ>¥#Ÿþø휣¬#á¿ýÛÎl¥VN«yŸÞ?ûûÏ?ýåñ˯vüõ#íø÷Qïávä6ù(ë,cÔ£´sµ4ŽÏo¾x{<Ó9<Íç\ƒ†Ïr¶ª? ‡>빊ŸøQZ>žý,V'vÊóx޳Ò'ý|ÎÓüÛu¶ŽøÏÄr>Û,4kÅÓ\ÎÉ3ÝÄǹûIûýD4ó^½„×½ ^^3'­]^Y…ï¯NRȽ#&ëç¬ãŠ×r®ttÒâK˜p'u½+6ŽŒ*Ô¢ ;Ò’Q±ªo;Òt䊵ÜάuävöUÜYä%3#üÁ`k$ |V ¿Óˆ4X:kVÒ{­ïÚÙ+»Ïõªo—·Ç̎DZÁ¦+ |?«@;cºFw|ËxEªˆŒ< Ë^eŒ‰µfÇÎ'í1òMasWäúÂëum j¾ìïµÞç;Â9Éåº(shEл+%hŽZ"]Þ3‹ú±Ó+Ã3ïGQÞá—€þáñ[jÂÿ§þ:ð÷=õÿ#¨ÿ¦÷Ùδp^!éæ ½w2/:i\A 3ÙZ°Þñ»Õ%&åŸvŽe¢Ùª·9Þñ{™*tâNŒ0;£G½újÛdÙL¾ß#&ÊÃ<×Êê›Þ¼˜mÁ×*m)F˜ÁQùÅ‚S6éôDIß±!U>&sLgcd“lŒrƒý ^ß-‡2Ûm.Jaã_z+¿Zî4Xü.ê3ëây;¦sâ€IÖ4+Áó©U‘êtªhxÁ<°mðw òqUŒX¸Š¸Û óX!/0;%/²¦S=«±ß{©¸Øõš…|ázV™'Q:µ±ñÊóDNÜÄQE¢4èÇÓë9˜~f²;ŽbFüÜ©uË›,V›èÉIÕ<ËHò›jQs۾܀UL5| p6BUb™@²CЩ,.RÒëÊ™5‹$–„²+·Ê"kµ±¶sÎèvAÝu ÊD-ñç¤æCi‰Vre +HÇ8¡ÕE:¶œtº“NQ>|p¡ÀÞ¤S²“ÒžÄy €¬#éäïW·À<ð'4œT_˜G9ð“¨$•£%} ÊÔþQƒªÎ'oÑ#£~1~›Ð^Õ¥“iòÅàž3#Þ„¦+§Y»ß£tچ͆ÕH-öžþ9Àµ4 þ‚]ÔCI³&¡›§Ú§N„u†`Ýù1$¬s"ëøc!q3U‚y¨€S\].© Ò)·Z&M%-Ž3u6Yí2„Cÿ¶L CϾQÝ\QÃBúlïû‚ù/ß*¸a´–Ê;}øýWúI= a54tF‰/E`®FæˆÅøé.ÒÌiŽÀ¡¡s‰¡Tbr™-àPY³ÓT¾‰Uâù Œ…ÁÆXY_n›­ù¶eoœ†©oˆe!Þ˺tFî4KbE麫ÁÉÂé\Ç´êM¶|Hƒ#e­Î)qê1ªª»¬àE 3D‚ٹħ(Ìæå2ñ1Òîqåá¹ÙÿBŠõw8ég¢×Ä"gqñ³ÉuºF 1á÷dúÒ( ®FÆÉ›¡6Éé¾/úw¯÷—°Ã%ù§ñbÕ¶WøÔ›ôÃÖc0œi»ï`¼‹…à2lÞ‚tñ@uu™Y§n,ÜмšÓŒ^ÏÝGVÓÕ«ú°ÆNòª5eN‰«ú Û¦8>-7y´›ps‹Z¢zº‰Œa©Ù›(ýìà1õÀ@‰¤ëém¸ÈÁí0‡pÉ€BÙvStxÊnzr:&ãöJ%[Rë¦yÝÜ©n…dï"Ì2GâË`Ç;x×+\7B®Û§#'MÚ5¹ü[â•g1K”dÞ*t½lëBdj_£Ò×éwÄA£ŽcEâ} ‰©*\®œ•ÚzµRÙ#m4ˆu_ùt%}aÕ]ðªî‘4½Í츴ÜßÉ¡îr¸A(Ûý5çF ¼Í-«<Ö/$v t¤à¾3ñbjd¥´0$Ãâ³–ô{Êú!lÑŽo^%¦ô!!WJ‹Œ]ÙøøÝPê¨ÛœbAAË¿\štgݦXb¥úò.M_­p ñî‰Ë*ÈŒµrx^#$o½ØW_O~ÇÃEº[¡3¦_NÓÜF~bëàxLãvÃÇ'd w]cE#ÐvÍQFë ¤èJº*>ç”ÏEc;¢¾ø ¿ÅôKsUKc̆b•åsŽƒÜ43Dƒ²u©ïb×À69%¿"òJ€¶gË ƒÍÙónˆ˜,³š7cŠàòzK~"‚†F&iÙĸÄiWw ŽtØJrMªdboñîBÕ~;5J`锹öNE¨¤bw„N¥çd@_ÑPœ´5Wå‚—[¥T#ÁÉ\¬ßE"0ÍÇŒé\ã"ÏSŠâ_®èCø”±‡•€“¦  ­áCGÈÎÔ]ÕM0üf²LÈ׸.s$¹aŠæ>E_`\$¸I±Ë¡¯áÄ}ÿØÙ²# Ð#ŠÃáf\꒨¬Þ E޶¼™ ˆ#D®ÈÑ)Ò^‚2ùsèdSYÆÕŠMRg£9aáÈ£ïBsl½Ý椛NJ KhVãÎd&Þ&{‘Ç&¶xg®–3k&L+j ´$U]¾ÍÄ$dìþýÆGƒV¯n‹ÐI,½.…·ØuCimËm¯tíºûˆßÉ$ºKª4ºc?àS¡¥YÀÕZÚ$K rK¶êãXYWÛDêŠÀ¸TRëú‹™jÆDˆ'Jx±ß£å lð-Á¥aŒ•Uñg!åˆïBéÝ´.[»çZUåY£Ù x÷XˆäKÅMuq_Aï°{RQÞ 4”`m.æAŽ7^Æ8ë”PÎsð×Ý•LÓ 7³x–ص¥ ¡p»Ù}%P¯:UKZ=ëE&Òj½‚ ÿmJD!1†xÿã!jØSU*ʯV–ü¡ƒjs …$éY‘*á¼Õ?BoЧÍ2{ƹê ,_ M‹Ýq5ßÕL`ιç<«’ßx·F (Pf&P™¹P‚ñÑ'û<ºÏ©/ÔÅ5Õ!>xݪÞ&|5ŒœøðUà×Ð^tàm²‡%"¦'†ø’°Ë¹ þñ@Xæq(˦´*"ŽÙœ‰<”êSy?åñ73&Ž­m Œèɽ|ÌÜè$¹Ý÷qø8^¬d¨~#P(q…©¼þ<ƒ~*$Ä>Ã>wZ6¥dMÒÍm›P‰y¥)äÉ2'¨cB¡¬âéðóÖjÛÓ=ôz9Õ>}l›@àüŽí÷7VVÄq4f]=«ÓŸC{O” à Y¹­æ˜ÙdN¨â>AûùëÇ ¿ 4ÿ_Ó endstream endobj 223 0 obj << /Length 1075 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Marc-Andr\616 Hermanns) () %%Title: (Opari2_CMYK.pdf) %%CreationDate: 14.10.15 14:58 %%Canvassize: 16383 %%BoundingBox: -25 32 265 115 %%HiResBoundingBox: -25 32.7266 264.626 114.5576 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 367 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 0.2 0.05 0.6 (C=100 M=20 Y=5 K=60) %%+ 0.5 0 1 0 (C=50 M=0 Y=100 K=0) %%+ 1 1 1 1 ([Passermarken]) %AI3_Cropmarks: -27.1235 26.5576 271.7354 120 %AI3_TemplateBox: 175.5 59.5 175.5 59.5 %AI3_TileBox: -280.6943 -206.2207 502.3057 352.7788 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -102.2378 160.3472 4.38 1815 943 18 1 0 46 128 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 224 0 obj << /Length 6042 >> stream %%BoundingBox: -25 32 265 115 %%HiResBoundingBox: -25 32.7266 264.626 114.5576 %AI7_Thumbnail: 128 36 8 %%BeginData: 5900 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD6AFFA9595953592F5953592F5953592F5953595384FD6CFF5906 %06060C0606060C0606060C0606060C0606062FA8FD69FF59060D060C060D %060C060D060C060D060C060D060C062FA9FD67FFA80606060C0606060C06 %06060C0606060C0606060C06060559FD49FFA85A59FD09FF848484FD0FFF %590C060D060D060D060D060D060D060D060D060D060D060D06FD49FF2F05 %0659FD05FF592F0606060C062E2FA8FD0BFF59060C060C060C060C060C06 %0C060C060C060C060C060C060CFD49FF2E0C067EFFFFFFA90C0C060C0C2F %060D06060659FD0AFF2F0C060C060D060C060D060C060D060C060D060C06 %0D060C06FD49FFA8062FA8FFFF840606062F7EFFFFFF847E0606052FFD09 %FF53050C0606060C0606060C0606060C0606060C0606060C0606FD4FFF2E %0C0684FD08FF2F0C067EFD08FF2F0C060D060D060D060D060D060D060D06 %0D060D060D060D06FD4FFF2F057EFD09FFA9060C2EFD08FF59060C060C06 %0C060C060C060C060C060C060C060C060C060CFD50FF84FD0BFF53062FA9 %FD07FF2F06060C060C060C060C060C060C060D060C060D060C060D06FD06 %FFA88459532F5959A8FD0CFFA88459592F5959A8FD08FFAFFFA87E53592F %53537E84FD0BFF7E5A2F592F5A7EFFFFFFA8A9FFFFAFFD0DFF590606A9FD %05FFAEA7592E2F2E2F2E2F2E2F2E2F2E0C0606060C0606060C0606060CFD %05FF7E2F060C060C060C065984FD09FF7E2F060C060C060C0659A8FD07FF %842F060C0606060C060C2EA9FD07FFA92E0C060C060C060C59FF840D06AF %FD0FFF7E062FA8FD04FFA78182A7FD0BFF840D060D060D060D060D060D06 %FD04FF2F06050C2F5A595A0C06050C59FD07FF2F06050C2E5959590C0605 %0C59FD06FF2F050C2F7E597E532F0606067EFD05FF84060C062F2F592F2F %062FFF7E050CA8FD0FFF2E0606FD04FFA77B817BADFD0CFF5906060C060C %060C060C060CFFFFFF2F0C062FA8FD05FF7E2F060C7EFD05FF2F0C062F84 %FD05FF7E2F060C7EFD05FF7E5AA9FD06FFA80C0C06A9FD04FF0C0C067EFD %05FFA9A8FF7E0C06AFFD0EFFA80D062FFD04FF81828182A7FD0CFFA8060C %060D060C060D060C06FFFF59060653FD08FFA82E050C84FFFFFF7E06052F %FD08FFA80C050CA8FD0EFFA806062EFFFFFF59060659FD09FF7E060684FD %0EFF53050659FFFFFFA8817B827BA7FD0CFF7E0C0606060C0606060C0606 %FFFF2F062FFD0AFF840D0659FFFFFF59062FA9FD09FF840D0659FD0FFF5A %062FFFFFFF7E060DA8FD09FF7E0C06AFFD0DFF84060C2FFD05FF81A68182 %A7FD0CFFA9060C060D060D060D060D06FF84060659FD0BFF2E0C06AFFFAF %060653FD0BFF2E0C06FD0FFF7E0606A9FFFF590606FD0AFF7E060C84FD0C %FFA9060606A9FD04FFA8827B827BA7FD0CFF7E0C060C060C060C060C060C %FF530C06A9FD0BFF7E060C7EFF7E0C0684FD0BFF7E060C7EFD05FF7E5A2F %2F2E2F2F595959060CA8FFFF7E062FFD0AFF590C06A9FD0BFFA9060C0684 %FD06FF81828182A7FD0CFF84060D060C060D060C060D06FF2F052FFD0CFF %7E06057EFF7E050CA8FD0BFF7E06057EFFFFFF7E06060506060605060506 %050C06A8FFFF590606FD0AFF7E050C84FD0AFFA80606067EFD06FFA8827B %8157A7FD0CFF7E06060C0606060C0606060CFF2E0C2EFD0CFF84060C7EFF %590C0CFD0CFF84060C7EFFFF7E060C065A7E847E847E845959060DA8FFFF %7E062FFD0AFF7E0C06A9FD09FFA8060C06A8FD08FF81828182A7FD0CFFA8 %060D060D060D060D060D06FF53052FA8FD0BFF7E06067EFF5A060C84FD0B %FF7E06067EFFFF060C06A8FD08FF7E0C06A8FFFF590606FD0AFF7E060CA8 %FD08FF59060606A8FD08FFA88281817BADFD0CFF7E06060C060C060C060C %062FFF590C0684FD0BFF5A060C84FF590C067EFD0BFF5A060CA8FF7E0C06 %84FD09FF84060DA8FFFF7E062FFD0AFF7E0C06AFFD06FFA959060C2EFD0B %FF8182818282FD0CFFA8060C060D060C060D060C7EFFA906062EFD0BFF06 %062EFFFF7E060628FD0BFF06062EFFFF7E060CA8FD09FF7E0606A9FFFF59 %0606FD0AFF7E060684FD05FF7E0C05062FFD0BFFA8817B827B81A7FD0BFF %7E0C0606060CFD04062FFFFFFF59060D7EFD09FF2F0C0684FFFF5A0C060C %59FD09FF530C0684FFFF7E0C06A9FD09FF84060DA8FFFF7E062FFD0AFF7E %0C06AFFD04FF590C062F7EFD0DFF81A6818281A6A7FD0AFFA8060D062F06 %0D062F7EFD04FFA80C060C59FD07FF2F06062FFFFFFF7E060C060C59FD07 %FF5306062FFFFFFFA906062FFD09FF7E0606A9FFFF59060CFD0AFF7E060C %84FFFFA92E0C062FA8FD0DFFA8817B8281817B8281827B8281827B828182 %7CA9A8A884A9A8A9FD07FF840C060C2F84A8AF847E0C0C062FAFFFFFFF59 %0C0C2F060C2F84A8FFA87E2E0C062FA8FD04FF59060C2F84A9FD05FFA85A %060CA8FFFF7E062FFD0AFF590C06A9FFFF0C0C062F2F5A2F5953592F5953 %592F5984FFFFFF8182818281828182818281828182818281A6FD0FFF842F %05FD04060C06060659FFFFAFFFFF5A052FA8590606060C060C06060659A8 %FFAFFFFFFFA9590606050C062F062F0606050606A8FFFF590606FD0AFF7E %050684FFA80C0606050605060506050605060506057EFFFFFFA67B817B82 %7B817B827B817B827B817B82A7FD11FF842F2F060D0C2F53A9FD06FF590C %0CFFFFA92F2F060D0C2F2FA9FD09FFA9532F0C2F060D062F062F2F59A9FF %FFA82F7EFD0AFF845953FFFFFF59592F5A53592F5A53592F5A53592F5984 %FFFFFFCFA68182818281828182818281828182A6FD15FFAF84FD0AFF5A05 %2FAFFD04FFAF84FD11FFA8A884A9AFFD2FFFCFA782A7A6A782A7A6A782A7 %82A7A7FD22FF590C06FD7DFF7E060CA8FD7CFF5A0C0CFD7DFF7E060CA8FD %7CFF590606FD7DFFA8597EAFFD66FFFF %%EndData endstream endobj 225 0 obj << /Filter [/FlateDecode] /Length 17494 >> stream H‰ÌWmoÛ8þúºbŠ’HIÁuÉ–Ûl·M°IöÐë Æ¢]eÉÕK·Ù_‡¶ì6Ù¶·ûeõÀ²4|8Cg†Ô³¿]]Ÿ¥Es§Ï‚‰ç:ÏžM[­ú¦=wIê^TÕÐõ­ü|êòpâ”^Ä‹ñÝveSŸS5ÎMï“ת]ž¥uÑþ[ré¾ÔíFÕuwêžœ‚rSö•ér«ÚÒ_L_¿}5Ù«Ó½}(œ©^“RîM¸ÀùˆM³ª?ª®+32ˆȲf¨‹²^gͧs÷Ìn໾D.Ðú²üYwOP&‘/%xáDúÜp"D$ÑaÖ,‡®û«¶Yê®›6UÓvçîôAÕîkµF‹rßêªj~u³J-ßu™7uo¨ÍK­Šª¬õÙOåú¾?b¼ÑºÐÅïòÒ ±˜—•†7ªw9y4½àþ"ʪx3lî4¼ÈȈƒ î¶Ã¨Œ6<q´¸Ø@r­ûS†³*ÆÇÇ3‚û\oâãç ܤ{2}Î=Ï}ýÜ÷Ü·Ï…ûê¹ôÌ‚ü­`ºáC1 C~õ|Gá;œ¼»Âê˜Ånßëú?§»Q¶ÍÖH:ãûhÂý@Àñäo×ø$ Dèrß³ì½ÙVX}Z+ X n‡Ç~Ú­gŒ $a€'ON|ß‹\áù“À‘¬tǶÏamõÇRÿzî¾ijmÝž¶ýµ «0ÄÔèn[~*ÝÞÖ¥Y2iD‰õûë¦ÐÕ¹ëýç•"wøán 7ª]ëÁØTCO)ï-`]RÚ„·.·º¾i~¡1žqLÆ¢ïM‚0òÝpà-Fb˜ió˜ì„c?ÍóýÝÚ0¾½!Dг+„Ée[®Ëú|7Ìhñ¢-‹CèÀVlo4“I|ôKö?;d̾ïu½›7i}‚Þäõ5,æu1m6f :“¹¦•U³¶mã3µ û°uÞ9AÂ> M¯;誴›H¶nÕGmfËÒ¢Ô-Z:–¶hfÓ¥.ʪR,WË¡×ìM¼ÑìrOsØíØCYŠ"mL-Ëѱªô'¦Û_‘òå^¹¦žÓ¶«>êªÇ®¥U_ZNyÄ)GNMêÖXnc¹Í·¹Ê`©ƒ¥ªÃ†‘[¨õZ·¬ÀµfKø›u½n+3‹N/Mü±»¡ªtÏPƒ¶÷lMUº¸«à¥ `zè‚-›íCkêÃFPh“ÉÌŽa47©›¾Ð+–æì²«Tw-6MYÒþÿA×l3|)vñöÿM[¬4T¡^šçê–ƒ)ž#AA¾³þaЙdÑüZ3ýiY© ="ºÊ¥ªÐaìµB*—õãa¬Qq+½i°U­úÛõê¹53ï¶j©Yj#ÝÛî/g‰‘ºÀ˜ÞÐ2\LJ÷/V'½äVX”K £ÓFŸ¿ŸV­²+šmC#¥LÇMo¤Îa«Þ…,³-ì4… ZëCžÝ©N¤Pûûfè"KB4?zNmdäãàrëš +¿8׋‘taI—–ty¤o?ïK˸µŒÛc5·¶©0+…£;êmb£–­‰w}¢©%%„Mi›Ñ»êµj‡M¥†yˆ}á=[*ôsnrª âÇÅM‡Ýã°i *Sy½lÌáâÜ]|¹£?Þâß±G$ö¨—-á7ÿ²FP÷&Ü›vÐ7[í¼ã’ïÒ;cÀà&ýaP^$+ëÒ¤8J>ã" vâ„¿›{ˆÉAÔ€¾TUQ®V sÜÐŒmÛ¦–¨%4ö¦ÖA}œ°Ë^+×á‰`(&Ÿ\žDLmÑáÓnIÌfºÂQÉçá.ˆ‘|¿éz­]?ô ¹BX/®6wMµ`öÿ³™ ëÞÜ}…µ2;‰ófëÐéóªÐô¢m†íE½jœ{\½A&7]ÞýE§Íàðt=”½ž¨r{úUEØÌZíÚFt¦×ýÿ·{Ïô ¸Cw+Íëºj¶GjG RÊý§j·ßV}U©Zµ.ÉGÍ?•Ø ¯|tÐ}}‡RÕßã0‹JÕ:íëçú¬ìÛú®—æ(кY;t÷îMÓT£ÚÏ›Fí;1I ÿ¯aãŠ:Ô—µuÐcK;—–püËYû÷- ñ¯¬}ª°ÝÒ¥\>eà‰öÑ’mû‹*QÙmñt$¹2•rYé뜎6_Óf¼2\ ©èFÛl¶æ{Ô½¾W[M:ûû91¯G…”ýãÒwvö•šˆo¶¬>jaê2ö¸s÷ä¶®ÕFîz'§.?užãï»Y#÷?œ@2ˆ‚8H‚4È‚i0 ò`z!ý0ÃP„2ŒÂ8LÂ4ÌÂi8 óp.<Á…/ðA'„"±HD*21uÄLäb.=É¥/J!¥Œd,™ÊLNåLæryü(ˆÂŸ‡>Ý¢$J£,šF³(æ±ó؃8tbËŸvq§qOãYœÇóÄKxâ'A&"‘I”ÄI’¤I–L“Y’'óÔKyê§A¦"•i”Æi’¦i–Nt–æé<ó2îüxæâ€LßÌÃÃX½˜£^J@oo Ì9070jn.Ÿ!þÂV.yDÀäxBÀ(yL 3 'ÌùÜŒÇ(qp3W„¸Þ—øÐ‡Ÿü„€ ûa Ì€œ0÷çvbf<ï@“½BëðO!øÎcÑŸÃ×úÎÑã–Ì}¶ÈZ$„7ñ±Ú7瓉Džô9 ]aÎ,àáwñM^ÖA—LüírÀ câyQl$*÷Ž”~ohÏfcýØ—ï­ ~üde€ø¸2P´ï?‰èIÈ'!œ]J}Žï ©§û°ˆüI]ûDç”â!%vD R"›6ÉË)gCÊÕˆr4¥Ü4Y9§lô) MúEå]JÙf2mNùeR+ücUÕÙ•ÕGEõqM¥ MÅT"Jã4!¤@F°× È s*ZTkfT$fÞ Cppƒ©™$DTÛYBH @úföʹANUŠ—­:˜±“‡A@Ýÿûe³ã8rá'ÈwÐeû"ÿIc`€ÅÃç…O{,0ƒÅ<¯ßŽŒ¬"«$JbOÃðhåazºIJªÈˆüréX= 1½Œ,¿ø[º GÑÒ^]‡íØðÅujCü c¢Q³^‡²è»æ‘ÿ^_ù>ãU‡¾«ÔvÕf»{ëÛl¯cs†’0·’âY–dtžœûÜÄ„©|íßúÎ÷~ð£÷~ÂÉ@Èc±Àø©¦zjRU?å#Qþ§‰R†xpצ/mv&Êóë8ØŸ¦NU\+dÇÉŒŠWÿ±’ª>ŽªºÊá¨ÿÏ:àÀB¢½ñÀiø@–—^àÆr¸³ÈÁÒr¸¶l-‡{‹,.gø ƒ!ùmÓÓ<Ò¿êÜ•~-éÒ†Ö4[Ž4£špÍ.Õ8O¹Tå\ç,ëLi R‡À Z?V;Õ;W<$ŸÉÓðË×ÔtQÍuO•ßsð@üteÍõO×Ö¼¶¾¿Y^ó6Hج²Yœô‚ŒcÚ7#9o¶D舴'˜ñ»Â¹Æ©ÊQçÙV\*]o;m¿ùÚ˶Ʈ›¹SÍ£êCØU㞺†ý´ ÚG¯wBùÍð±Òˆ¶7ã[Ä!h}` ’$b;¤ ‘·„‚EBºÂú"ÄB» [£`kXsäía ""´HÞ$Ö%èÙó"´JÞ,Ö.18¬aò– MóÿE)ÕN BÜ%sjLÉ|ù*—Rù6”åÇ©øŠi½yœ¥1AH¨&÷t¤‘”³3ÎÅ*á€+¾I ‡&Ñ ®]_”úo[çl±Ý24W×Ôû#ßzß;©d8¦’!¡ÝlÞß’yGÊû[2ïHyKæiF¿]nŽW¡XGËÓ^ø‚G»è¹ôÉ.Úßï£75>-ŸÖ ã£ñоj†? Ôºb8füW×o¬¼¦.!Áqåûº¾9fqüïS}°ø‹°ø‹°ø‹°ø„Å?˼âÊwxÜ90Ñ;<«Á3+<»˜Ý´â½f¼§Ç{ø >Œ6~Vâ#:¿âãÎøØÞ‚ïÐã»´øN5çM‰oé9 ¾õ„o?âzœF‹S©q:%N ­…F\pppÄAö8Ð[ N¸ÄI;ôõŸ Á-zhÒB›•ÐÊÁ( ´› ¡h€¢¤m q©‹ÎÁy‹@ÿ }0¢zÆv‹©Ñ)%:Æ5+ºgÆ÷óè¦]Õ¡»ô…ýV4®^Ñ€3Ñ£!‡ºtg‹.­Ñ­-Eíª=<£—=zz@owèñ½^¡ç‹ÊéÌ‚ f¸ÁÃÜÑÁ& n¯ÊRà‡(\à%eg pX§5p\çàµN„>påH†Â À«ø€ð-à­L½ÚT¯L1h–Hf¢EÉRÑ6Ù„ºmÊi€dÊ%Ú¡Rñ–L¼M>a¨¥ F Æaªá¦"'ì…A¼+™kÙ&Zæj=)ç.(ä”ESM«šëJeƒ°«mMÙ\ÛTÝTß>Ó7Ux“#Ä$‰v2QrYL˜ÜWG6u¢½L(š,µYÉd2³™P”J8ù<§àÀ‰hj™^f¼(X*Y-µ …Óô7åL»èESÏì˜2%4[šˆ”QHI¢àéš’¦¥y4ª™ê¹)JAMRŠ*䛎¬Ó{LWSÖœµMÕÍõ /¹=ÀAr¼Á·®ëžq›Þç²»–£è¾IîS¹½/·±}“Úç2;IlI#ûÆêgòú.­%³wbîY}˜Ô’:uó«œ>Jé0Žwí»æâ®]_”úo ü© ü0”…þ¥@µ—Æ]w-Ü0è}?ɧ/o¾Ïÿ.îbµý­u׺Úí™þ®÷ž}?÷æOèôùØI?o¾,ß¿þí_¿|ýíÛ÷Û/ü·_ûõ—ËŸþñýû/ÿüöõòkøÕ¥hû?Ëñ¯ñåÅÅ1–£ÎÇÐ)?F¡S~Œ:C§<£Îýq±+Ãr§ €®MXòt°E¯'rŒaÝó\ lé›9¸rÂ=Ámû_É¡ÚöÀfÛ»°öœ†#Ës›˜Âj¨[Å"LÚÕ>ŸW†MÑvE]6šmcì¸5öÛæ8nÛã6ÈY`í…c;®’EX'±šØ™Ôï®*-Éÿûþ:ÿÀò\ÉÓ?þU\šV%ºA] »¢iÕÙ‡Þq¥C³µ®(d‚þàÒ¢J/E\î={Ãûò¤oó¿ÆûlyBç”ôKC—ôt‡§'¡`û×lúžmîÙÜ ;º`×ìÞ.Ú±­‚ £ý¢õ¢é–ð.ø,:ÌÜE_Ý>²Ÿ´ ~‚§ààÛÇ™YͨfR¿‡Æ™Wq¦òYˆ¬E«®C‡–ÁÙ^é«O*´ÝV%@ªª•µ}¤P}¨.T M+ìÜÛ0Œ‰•wtW·×²ÔÑk>¨ÉJâ,Wc,¾û(ж€(ogÀÏBQ×ç•¶ÅA¥ TÈÍ)r:ÒãXßG{ïûˆßÇ|õû¸GÉÖ1”Ζ–\W¯#±·Ò§f½±Z»†k÷*^‰#Q`áä×™_Al즲H(ÂżVnîKŽ~ùÖ¢º'¶¹›}îÉ:Ƀîh§Ë¶ºÍ ûZÇÅN¶Í.ÝíÒínßïö oßñâ–‡=kÞ"Û¦g»^Üö¾‡ò~BÍ‚«_æºj•š]S=áû#!Ôä=Í3N^põ4Í(¤+S¿à…°Cvii¤h*ôô>ÈŒçë-³¾t ¬óÊ1T]½4%h±0Ä4³Àìió9Îë8ÉÃT9òîÙî©3ÞØ¸IqºJ2ho«{QýQIößáD½9ò¯kz\òäóÙʨHí îk8*Z¥ {bd ]t„L)ꇣ¦£ÛtÕœI%'”â×*ì3m׉mäxÓ9Õqè©™kÎB‰¡“ªm®óÓc–ŽÌƒ^oŽÚQQsü–ÆŠy+›[¢ÆòœÞ:ÅzNtÒúª9íuêë®åêUê xVËë·×Ùª#º%OèKéB)C÷>¥Ê•ü¡ÖœÈ´Jµ£pŽö„[ÅÛ–Sr+‚nI¼1@îàü‚Üö8®ߣƃKø×ÁË \=Áá#ÜÞã([|ÇoZ"ܴ§32Ã#>I‡CÓ¨Ÿ©DÚ8$Ï‚„˜E#R©‡-rªÆç-‘]n\aý‘æn:Ô{„]‹ã«ñmJ]ޏ ÍÂmg ëL𤲠Í[cma-QÆv`/L¡z!ó´¡vùJïÙMñ¨÷®µéUne“x“7h;ÿÆMÕÖTåÑoÍO¨U¬5°5´5¸5¼UÀ5Ä5ÈUÌ5ÐUÔ5ØUÜÕÀ†|B”Ía¶&ÌFœ5Ž@;G %Ò÷H+‘jo 6bmÛâlS´MàV8„3¾e^æ€ûqÇ{̺7'Ý„uÃðÞawÇÝxwä]4@"÷÷ùÞ²¯Ño×÷þFN!x’ÀÁ '4yØa§âŒw:Œ,“Ûwüý`5šo—£d×C[,¡!ÊÐ ­m6±΂Ö=jEØR' "FØŠ¸Õn‹IÄ­yí¸š ¸"rÍÂC^ñ–ásè2ìšo°ËÀ« àÕ¼€^Bò ìEôº‡¯–ðÕs+Qüòį™\³r2&&¤°v£°ž6*²MÓˆ¥(¶ÃXÄ1™$D–3ÙNeä2T3C³g†gÐ:YBŸfËÔ¸Wa?‹»6CÕ5wqסЌÆª½”åU%½ÎéÕ?ɧ/'¯ö¿ã¹m…¯p¡Ó®ªõ‚-~(ѶxŠÝظËP]Kÿþ.?p¯½gY8^© ½¯üûU»*GnDŸ ÞaþÖ?ÜH­nµL`>CÂfw ,1„°˜µã8Á7Áñî²oŸªRI]ÒhîÌõ5Ùx ã¹µZRsê„À+™%Øõ9?Á®Þùðgù68Þ"íͧ'e¦‹ÉÀÆMCpV½êöGø ï|òÃl­Ç;ü27d©}‚×7xÇ.ðt+Ÿ·³ ófÆi±q]ýÆù¸öî¿Úþnþîx÷ò·ï^¼|óêî}ؽzýæ.ýzóÅ·ww/Þ¾z¹y-C›Ñ=î(¾ ·ý¡û ”’x‘ò,ỵ‰Kš]´z,ÚÌjÌâX\"}É ƒÃ*c‹Ê¬ ^VšÔäå6ĆäæDr¬7µâdÍYŠæœ©Nѱ´~ÒüÒ¬<×t§nCîÐX8Úê»V^]w£¨ù®ª·k©å" ªÆÞ—IŠJ‰NŠ/z€²"IÙ%E§e*ò¯ÓÛ´@ÎŒJK›˜p–˜œš516ÝŸ¯LÎjsv•Í9ä{¾èsä¾áìÊc1:ëÅ×Wo—3é €²8±JÄšŠš!Fy™Õæ@ÎLŒUjjά ZS¤¹ƒÁ÷wÁŠœ‘Ö†(¢TdµÙ|d둇ØÁbv³HžuGl3¼XŒ-cë Þ ËgQòûÄg`2Ïì’wØ1{s-svb¾.ÂÔ[‚#[Ë€ ¿ÇûS5<`C*?àáSáôˆÒè!¬˜ÓZ»ªjþÀçR5²³±¸ S..Ê3\®<£}ÃCžz\åÝÊžàú¥rc,¶gÎLXÛ=’2 ô·h÷¨ŸGs²ÆZlÝöT3wy©ÃÛIwwâÎNùs¸jÐ+{~nÎÙ›+:Àʦ o˜¶L›¦mÓÆië´ù…… òèéöŽ'> ‡DG¢CM@-umÒÁÆÒÁæVºØª=ïdK/ Lrng?lÃW¶ œ ½å¼éÛ¶|¶i`‘ãMç çmb< ×ÄÔø¼kø&–³MÄ:@® £bÿ&E‡uç¿0ƒÃÁ¥k$Ÿ8XŸ\â`\4Þ]P‹>÷(wí_íþº¾•Åc£áñ5&»“p¹ÃfèV·Ûê[·ÂØ3]án­qÝ*©ÌUUîÖ:×­t°–:©t·Öº¦Ú­’õ#ç¸Vjå:Ï•^§Lƒ¤ZD[r}9Û:ßuÆE¿AR®%¼ö4ÚÕÔy×™/¹‡Nò•Áiò¯=N€‚ï·ZÚîTH¨ÂH¯³_»e|j@hó£1AÎx©«Äšcå­*e'ÉtfôTŠA(¼ÞA©§Bnóœõ˜kµIR¯SæSî3×àô'ÂghdÚ'â'äRžpÀ  ˆI²å ¥½ØgYð'(…pÔðØ–Ö!7 ¶‰/w°ê…@¥‹/@Ý–­ÐÔþï8­¢Ï½|œÞc%&|œÞc¥"|œÞcm=àq½¶Ÿ›¼íq×t!ì °‘`£ïñ¾Ù-Ä‘ÝÂ…äögÈ»<Ðë<ÂŒ]2^w ÆöÝjèTvR»¡ý= º4õr•~Ú¦fjýܧ^ÚEíÉêŠmŠ·Ï¶~)÷Ãû€ºt7ûèèxmâï3ð÷Y÷ƳÃ=–½kÖkF0¨í"¯E}–Ý2Ù_`Äžé1ÂOCpóx‘ù÷DZ£oÏÑŸÛ•˜šˆIZ0Y3¦Íaíh0¡GLìs¼Å|/˜ù1à0ÃÏtB|);ÄLÄk]ðÚgÌ‹3#`"âe…´Æ1=i¥¼VZ-¯—WLkæUy]cוeëÛÕ]Þ©Úk½¶g䤕՞Ô·”k´í§Žòa¨×h³~¢& ¿•= &CÇ ëêœP‡`±Ê­¨û€g+ô™s$÷~{ê&ßCŽ6šÜûÜw§÷ifðr¢ÜÍ¡$Åic¾9D–jêÅrs°–A#mýˆ7ÇØÊ߻ۤª5ñÙpþÒ çq<Ç—9a.NØ]a´P«rÚž  èÃÀAñ>}(ôÀp`<(D(@ô!ÑET¸PÈPÀèC£]|(„(€ô!Ò€%=œTH)@éC¥€4ZV¼hx.èçz|&¦J-‹ÔÖ²3¡Zõç q,qÊQÊ @Lø(8ÇTb–ð%–A"–Ø;•äœSìKJ%N9T-Ë»‘$èsL%æ^b)JD‰m D°MO-Ã^tå8¥Pus½›¼›òä\ŽYÙQ;"3ùÔ`Æ€_#~ Ñx66£5Ñ… üÏ}ÒÎtŠ]• 2º à³.¥~oUgvȈ-8 (Š ( E*·h‡ «¥QuksAJDì‹%ë9ÓŽ%5‰j–UÖ$­$®$¯$°(±Rq-0H+-imR[*¿T€³ä&Ñ%ÙEáeé5Lµ‘!”˜$ED‡I‰I‹I‹³"ææ(ºLÊLÚLê¼ê3)4•n,ÞI§“R&sRkÒë¤Ø¤Ù¤Ú¤Û¤Ü«v“z£~³‚›ÏFç—nt0ÃF) ÏljiÒhYœúÚu}æ'U+ßíÙp×Wj%Iü€ö3žÂ~áýêjU™¶ ^õqëë#ׇÖÇvPü²Óǯ. º¼P· îá’ë¨/ƒ¯£ƒ_‹Õ—>ú°;ÄyAm¢²|3§á•™ÂöÒƒö¢êð¾U¥;: g}ÈQ,Ó-JÝÑjèô ójÝÕkèô·*v—ðÐaü­ªÝ%=œ±þÞW´oˆ_Waãºë,ßÓq¦LƒrNk®/g[ç»Ûw‚¤\èºóÔ5ºÎ»Î|É=t’¹ÿÔ»F@Á42xl` •¿BÂ¥>¶[ ‡¦Ô€Ðu ®TΣôšcå­òÏ'Étfô$-\¶Íl™Aš²’òÊ-û’õÄñ]1ÉÙ"’ûÌõo,¾¸@ Ó~5ıµ}¶Âb„Ùƒ ‡mm$\1¾µéÝgYð'(v× 8jx¬67[\Û€DKÄ ¬z!P©ÁRW͘2šÏNúÿÀI¯>d`?<,ÁŽô¿Çûfw N¹ë"òÌ'õÖqì­HTº±tÃwc3wbꆻ£(_m7Ô独7P•$ņ,ÈÂ6„€‹ýÞ1öL"Â1™q&QÂ2-F¦‘c‚âÏ=ód)Þ%Š['ÖoöÌóDÁþ˜D\™OŽ\"ެüH-"× L2¢Ù–;žNÛŠŠQÑå²U¿2“¨5‡Wë‰Eò`‚BŸh׿=Žv¡K» ZÚgÐ¢ì± ƒe­Ж„ë“û êÊjŸô>)~Ò|Ý&å×]hÒéD¡¸0ÝŽ¦b ýù"ÄØ %U_j f±è3Ü Ðs“*å‘Ýàv`©'±C4þÈî›ÄhWb5mPX•˜«3ïC,|÷Õ?ï¾y÷æîý›»×OŸ* ëà«Ñ/!ý²{÷ÿÿöÍ‹÷ï_½»[ñ<š'HÛ-þ{þü€AûHeëùÏøÇïñËßqè§Í´ùÃæÏ1›—4÷ðñê†y3¹% j»y OZ†œ‚þ²ÆûCÐðºBo¬<~‡/üo93Ò Ÿ ´7Ñ¥J=c­v›è§'ºâ‘ö4YçÄôDÃË`F788z\ÇË›h³Ó°³¨·OÏ;`U i˜&‡Ǩ'þL§\,®i}™èâÚ‰?ÒÄÉãŠã¤^N†~ˆÖy½ËêÞäD{¨çŽƒÁu7õ¢x9qvÍä’¿ovŠ`ôx¸úT2÷çæøe®¾*™û#Ô·š÷PÝÞíY¢öðWøâæ‹'›çÂoŒ[z…Úk`æÑ oÆ Õ7c:;!8· ㌅iN°^â8áÆ—¨†¿¬‡ñò=j2 ëE. ¯‹<ܼ€÷X2qÝ0Œ ^é[öiÄMsÃÓ¦`§4ˆ%Ömê=áÌBRvé´¤™eî² Øñ %œt_N9£K˜‹‡L?L˜Y¹2?`)ä]ÄaÄò¶¡Á%á.Íua h¹¬ŒmG¤­-„}cbáy´y®›äe³7i¢År™Æ¼Áóó-†1!mÀ2qp,ÖÉ47ð…á b'ä»™‚,€¸u“lvÄ¢š’ŽÃ¸ÛEß"°xʾ–ÑÉàØ®š£ v–Ê‹`Ê?ؘó^'Í?‘' ¢{¾ÝÛ”ÊÍ` ’˜½3Ù®;ã:¸SLþˆ 1±çbú±ê|ƒÛ¹GÑ~}gMoPAs 68)¾:òø^¢†N&¥Þøù}6’Ú§¾Ÿ°glÙÎïaÅfþÕ+AóˆÏÝ]F€C»=P,^Æ>×ÜxdkÖúŒ]Б|lBñ2âÕ™'#C`L'oÕˆE+³í0îpêÏiÆ öÄݧeb1m²“ÎÖçûèÎNrX$ïÖ1¼w⢒ùŽe'Cˆ¿I„XSÜsrÊǬ°û÷ß",¦Ô•è)Z€³(ðÒr‚C{&l0ø>ÓmýìLÁ¸¯ìÁÅž—Þwøà†8‹¶—elƼ-¦TÇÛn>„ÏÀf‹ Õ<«X²âNî åŒíWPcÍ™‘žÚå'0Ÿìe‘;Ì8û÷–³o'»Æ>(ÜüŸØ„rOo«ÜctNП\GÓÙAöÉË9OµoÀxE>XŠˆƒÂÑ=³1ß%#U€9Kp µyk•²°âu8»,£mÔàăD5Y®Î¤`îY–Î.Z=Z=¢ZtÀ‡'/%¸í°Ø.F °ÏFs/7W¥6#x 'Ò•uûvÆr$¿6Yà_IÈ¥Ck°Y´°‡»K”OÛœäОyIî[îyì•SÜ•ÃÙûäÙÁyi=ôß<«Ð|*MÆÅÈ ©†=‰9oÎ4ñ_K°#ÃÖ÷Ë‹ñ£>ë­ º»Vk“3á¹ga‘Æ(#– }þÕœlHådCó¿`™lü-áÆcžù¢Â°?sƉ>ÀëÊã¹ÚÞ JûÑ/ðE6ÛÅIç›ð²•!&vÓ 1} I‡Õ+®–cé5ˆÛÙ²Ôû¥e”{°£hª´ Þ¡ÑT,;yV›?diá¿„-7žñ† ˜‡M··äÙ±iæ _‡,xª`•R5ŸïoÂà-Â{1½²“ø¶åÌH ¶Šk*9Œsµ(£çȶÇÕêê`m]µt½ P…¥Yù`àØv(_]O}!fetóûGÚ» f…þ¤úÔÛìæ,ȹAñÿIÚÎà8Zà^àiñfšÎ°h×ÇŽvFŸ¯"¸Ÿ\\¬vµ¾~ŸÆÏ*­žYÈÍT?`wòÄJoÐfOpc /Ø!JTªÝid÷Þ„‚Ó}3­Ð€íÐò\Ï"–% Íx&íœò ãšË ŽûÍxݸ였ÍHõkM88ÿjrn#X è¸Â|i-5À%ä´=_M)6ëûÙ\ã¬Ü ƒ“p:ý;àkT⺶-Ï‚´òÏj” h™€`+¶öAúÑ-eªqKpÀ¤±²4'€çáàÝÒ'89!; žG5NÈpÀøîe\/²¾{K€åB$ù8œæÂ§5ê a;LxÚ> œ:V`¿ó8–Iæ¸2  — Jtló{V¹2®–ÉC´ÈZ'hß6ciÙ%ÀýÐÜ^p™eömg»»ÖqŒµxÓs*Ž­ä‘Qß VàXtÒÇ—XfàHÞTÝÛp'JssT³•5¼;¥zP1¾›@zÐòçî–Î !«Ûî/áy‡Ã/ÑÂôm—5}W!ÀsO²´@kž9 pa£ÉÆÈ Ø… Èî@Êà^>ý&|e>`Í.>ñ¨¿Ïp^,}œ4÷Ö9§>kãZ­í¯“ JÝ–Rå0&%.q ×Að¸<ÍÙ4Áœ8vR°Ú‰¼¹ƒ ±ÄÈ‘¹i”š8UZ4m¯ÒÚa€£Gøgz ®=V–‡##àFÞ¹;W€­ì\Μcx—XÿÞ()Û¹&ÀQƒß NcÇœCBwx7>B¨k¾¹;@xõN¡âà)3ª¢v‚]øŠ3zÖÁÉ“ØX¤Ì]²ºìÌ+þ²{Å ¦+%5ÍU"¾Ÿ ~OC‹º¨(÷‰4×ýü§^߃¤¹jäžPÁ³3+¨ÌÙ”uO•¶Us9Ë|ÆJõ©U(Šûû¸—+J€Ý6‹åŸDX(J§¢XêÀÇÛ\7àŠe×€¯Í Œ&û7ЯŒlî¡a^oþG(¶º®)hy˜Ë"@¨{«S¦Ô©z2¯®›¶É&[U+úÓ%~eЫéçȳ«)ÝÆÃä`g®˜ëç ÚØ³°tü³#EˆÉ;~¥k]›ŽK!‡æjJf ©hªªÝÜC9õ“vÜá6kì ¥˜ÁÌùÂúb4LgMÖôm©ªÁß„%|çe©0!ÇrŸf{—¾ÒɸR‹ÆJqÕ5œ@=m¾z.À…?~Ú—8&–rõž<ß{È“+— uÇMt[‰qÿœý®ná§‘>×\Œ»Ú`ßí÷qžÏas©¸š›%”›+É 0&‹cî”2ƒÒ+ËÕìfP)Ï÷²…¶/«:gÑgÓú´RÜS Èq©ž|ˆFÝÁ)%mñæžI㳨6¦؈ ,áÙÙg‚vòo3gãóžÓŒj‹%H#à`¹ƒK  7ûíÐà”X¥5HÖÚ©W€,Gg0Ù0ä>"6%Amåý|«á÷»DÍÊv©ðÕÆü§IC^Öè¾[÷/Ѳy—g ~4·’=åó_%<îãŸ6äŸÝô@±K‡ïj ŒfôsuÛŽ ’d‰î H€*R\)'Ácm³¹éIÞO{›åņ·õúÓ‰X.½N¹•¬ÄdXúLhkÎâ…)¯·evun®áŒ·G˽ Ìx¦äâ¸Ah¼XP-NÚ¢0\rŒƒcÔ¶Qv0Çsé˜yrÛ`® 4Ïü&IÿÔ»Þ¡âOç’­q 'äpø/388ß}œ(Ê¢§wðôtÔ€¡F¬¶w˜ö ‚Öf‚x[ªU££L²ž¥ÆÉ}8‡,àŽb$ÉVÂ8[IX8_7wXY}$8"ÓŸáÚª3ùÖuô^*ìðñ]³ö¥,ãd¿£Øq×C;ý ‚ßú?<à>•q}̳c$8ò]Ïg6¾ÀýÅïGi¥åÂpi/á0Uc½(ú„»¯ÿú&úê Wû€!ÁëñõvÐøÞ9è}UFÝ5Ý>Œ÷åçžåß«ÊÊâ£×¹>°~KþѤöص2ZšJß|•–ÜչǮ»#5@·Ñ.D®‹›Sœfv%!ãæü\Ï ð¬¦ÏÛ¿?‡¯ƒ2ÌŠ„[-·óyµmÍ‹„Úð§Ÿå ð^j.ƒß+gª7(j•f•.ê¥-Q™uÿ„••£“EÜr÷8=}CÑصÜýÛYìXY›¹U|\0KÂ\[N©oÙd ŠfPqN„­98þïsÈ^Õ7ïß'?ÀºÙIÒÝ׿ב¯v¡[{LF`£»¹YN]ôàœ"‰ÍÇ |B(Ï€ìË©8²»°ƒîVDÂï!VèÀ«MXgS~ÿº;·!€kPt÷šë€÷ Áy9ˆ±,Ô%ù9 Ãbëµi–Y”Ór!JŸØ¶érÐÕŽËQйF\É, ×Þ¬j_š$ôg~}Ÿ9ÿ‰+XxÐÞ3Á>Y ž5^Œp0–#$Úçân”ÐÓúÈëûù¼ „˜™ÐÅŸ:«y¿LØ'Óü$úTºr*9_ä«tÕ«´îÂÎ5ˬÆfê•ÛÊÀdXH=¶ËQÍ®³o}÷”“Óò´fK sWœœs:3rˆ“¨P‚¶3ÑîUå\¸¡›ütëªaظˆËª C÷„Ýšvr‚SÙ²%¡Dó,æ)ß«åØÌÃIâðî-/ó½*@•7ðVb§‘«£]߯ZÖü<ìm&.x×ø¥òÄÞUà¥_ò‘i}çYlœ‡I7±Ïƒ#©ßï»ò]»áÖçàh‰Í*ŒFvÆãè+ºyïê—"bm%¸ŠXàa JÆ *À'Ÿ§Í&;4CÕF×çÁ¹XÇFoD¯Ör«“ŠÓSS „t ËHuÎ<ú `•ÇŒñg÷T zóìMÙáìà”,ñ° ’óµÓÀÊ)qÆvpË:/ñý€³¬ÚÊØøHœeëa€ ßùWÉ ‡ä].CÔEBÐÕf‚c)u®5 ¼”Í=•—-v¹'/ÀÛ¸µî3úÇ@1U“0ù»™Þêq¨ò¦Ù6¾XÐÀ¹#õ\mFžÏtkr ‘Ùõy µ¸Bñ¬–Á݃È™0 @Ö7ɪÛ>¢„¼Ì³{b‘D¿©ªp+õ6„ñ¾C)É–ô4ÐÖ`‡·]ßc½ã÷wÞ<Šã÷dZSõ¥lÉ¢QsqôÁ³crˆ™‚'FšÝh™ú^…ƒö`0fa±P25öÖ_[,“QfyvB”ECQ7–…Ëì¸Éô#›Ô¨ÁZÑ8@b¯ ‹—{è^ m¥òëgö2ʘÄëûý¨–¼ûpüAÿçR§SNžÅÏR­ÞtkÑ9÷½©_ò~Ѷ]¶³‰Õ¨.À½)Åð`-^¶Q×äøëw¬O¯ Ä> h<ü÷T†L¿Ì€Oûu3¨jÊ•TÞäYñ(W­=ÊüõTÉo9r¼be öž2Ãl Á¹§ ´;®“¬½l±eæ[õeÊÔˆŒ‰Î€ûY®‘=4FÅõÜ<øa!øu4G÷hz’`¬*æ”¶¡aê•/H!hbV¸ÚòVqp ‚¶ üÉB‘ x4æë4.›š‰y žß4€|­Î)y’²Æbåã°13wÕ^(¥‹°È¥cÖÍ^!»V!C×/öM³óÓ¾xæ ;gÉùLÖŠ‡NÔIÀwï<Û¥FÜðVÍ}¡­gà°á`çÙ¡e`Ñ긇Lj”DÐ~¬y éí¹R9޵Ǘ´Ë;‘; ¿ß—óé,PF{^e¡úÞÜÚry¶QÃàd5‚ƒ4€ ê0_mž/ÿ^Œ‚´+ù½X³ÆZ^"Ñ«¿DÀ©‡™­*Œ:emäÁ5Øò¾Þsçõ£(Y~Ün$Û¾W¶áL9b'«]Fisù*H'(Ÿ0Ò?šjH@xígm³‹ö¨·_ª/> G÷ÎÛPRfsËòGÐêŽzµ£™A•ïêMevï^ßož=Ù\p+%™œ­x.µà»ã](RÌ$?; ©£ea`¤ò.@£¢0Y(ìd÷ö'a öLÙ@yº ¨—Îþ–¾›³$t±¡ÁPÑyþ¦Ùù©C±ñS0F’à™3Ÿ†mi'ˆìòi³Šºf0dÞ×´+˧àÕCØ\ý$˜ŒjîŠæ÷Ne¶“<ÛŽ­TLØUÎ¥¢ OMždj{ÃÞã0ž˜ñéê XÓQPl7_Œh¨³œ½ e¸àÁ m jãå÷:6¥ò˜Ñê½¼R©ƒ÷¾ï…u×5f‚U‡‰Ç§J‚«­´Úk0ÖXì²UÎN™ÆÙï® ÝéÁ*udð"ü¹¬‹¦`lÝÛ˜îhÒÃËÖŠýàè- ´‘VmUM›ý}-Mç§´DÓ'5:HŽÎ‚œIvöh^ï;m‚ʾݽ|BÞ6OÊxœˆ×äe9çæÊ³T­F”«1XX>©ýI¸«æ{‹¿`U7$|_ Vi&iÂ0Î*Û–ø²è#2À'ylp±‡õýgàˆgì·~Ú`íÂä^ê)âhSŸúÄÁx,¥TÈXu‚ p]ƶ·ñ$ýº2>vÿíCÊ(”‹êÖC_u„u#ù¯+’úS«*»±ìލ–HÅ³íº›=j‚•v_ç!e\k_ts “œÂð«è aŒ4ŽÁÞóO€"¾AÙè°¤4ÇÝ0ÝOŒœÝ'k pß-¯›7,`mÛA8šêZiÝo Ã*àºìîTïPmOö¸Í¶ qFžt-ë´+ÑíYGÇ{ÄA廆î4€Ž½8@ßýÜ÷ ¶¾-ëÁ0 %«ºVu÷ÙgˆPäÌž5µkWW×e-ŒÃleè‘Y‚%ÚÂÏÖ]@³kuž¦9­2fx?XÇbs§@QÕÚ·±! ðk¤ÒðZÊÕÜU%omϵÓÒóÚƒnâ6bkóóý¡0´à¸X ÁNÐuƒ Hž.³®,%t³åò˜°#ÉBXF׌†21q­˜Ÿ»«ðœƒ7‰îR²C½A[˜ ¡1:¸Ž:çYË|Ý¥h¦^õ"ਲ਼;¼©‡0P%×`*F-f×glºjÝábuœq‰½q ò& dUUQPderYg¯½¦p×ÒV˜3m³°oó¬-L¦ÃAJ ÍögÌãt–à K@A/„„3>äé ¸9âB¥iXe˜‚½\± Mæ¬n‹–âÒîL`½ÝJK%‚!Ú(̶9LÕe='ZE@Ìïm˜Gm¹„–£Z¬¸Ã\´ŠlÝ–I”8hs˜ÎÝefQ”(œT0"0Yûg÷€C%zvÙâ­B8ô=4B]{”¨„ÆDYìÉörÒ91:k`j1E8 ¢—Im7&RU@ŒžT.çÀËtàm© Œhœ+‚ª Û"ä›É PÚ¦î3B`+‘; 'Ó]и¥šªIˆà/7ÿª#aJ˜Áà΄UQ{G•‹ÊM3eÌZÆJC€¢Oàâ)mrq™¶¡ Díè‡"x¦¡ANvRÝ®Côl05GÇ`qÒÓ lš€JÖ3J “7M½) :¢ÊU6p\,Á2f X¶Ú—ƒ–ië¤?öZ,‚vzðv´j2bD†‚;\K>Žá†Ö=Á†Â]1Azå÷ŽÌ[* ¼ðƒPD!Ðwe&€éöÖ|QñÅ@Ý +¯“÷E ð[­Ò)¦y=ðlFFQ&ÇC#ÍÈÈblŽ¡ ˆEáÔ ¢#™³$ e‘e7ºKl…¥ñ[­Ò(¶¿oa©´ng“8ì-°Êê (\Ïg©}iÝr˰`™£Ua;À¬l ¦M9=øy‹ËÙ²’1(`P9Ä« ›`dOàúd¨hºÈ!\‹Y+œ¶Ù‚-Ì·„èéµ´P¦ƒ=ªQvƒÌ¦ »®ëŒ;o„…pÜL ˆÎ*u÷°z/^eƒþA†Ô™°v¸ñª—§AŽLtžbÒèÏÌmIѺ^÷›8-6`ZKíô`Ï4²Œ‘‡Á ægƒ»Ð7¨£;ƒA{tާ»‡È¹Ÿß|õäÛöÃoï_?ýøù?oÿøòÓ§7ï|úæÇw÷ð£ç÷÷/Ïo^Ÿz"|*oÜé þ½øéæ3~ø“ÿ½ø‚_~‡‡úé”N8ýíïîôZ,ÿ¤cÓÿgÂÔ•• ¾»„±z’ˆ¯»ùþ5²^½ñ|w#5_22ЬƒÈD1oxˆ}P¤÷7ÊÝ0båCزÙ{K5§+BP)ÓǪ¨Ì{•5Ljörô‰DKªMûaðSÖ@n4<–gpÅ(µ|Ô«>ñJǪB°qs ·5UÒ!„¥ô¢ÚXKœ±Z-k\Óä »y¬UP³Ö3))ˆŒŸ({»g8È+9¼ÈÐRú‹½^Ëù(äcYØ…^—ˆσeh…Ð÷:hµóÖ®ë`›ÒXRAx½Ë§ïë»ÙI_E 8ÕÀ‹Û¨ßàªB…1ûqk1«†UÜò˜ÃŽDà—ê#ÚlÁÉbU»yÝ@F`D ,¸Û`”–C½M×-09Ǹ³ûÁvL–[f–ËëtqöÈ·BcÖ³¬Î‘G”w΃ÊãBH:?_±£@AG™ åh…rÊõn„»ÌzÊí¢¯Ÿ±Ss¨Ôc)Ô:Ç\*…”{oýoGJzìÉo–»I"”±Õ…“ã3'=nÈ1éqßP$ß yƒewž,&k*)ÞÕ×q¬(Ôy‚¥`(Våc¹çGÅs² ƤÍnˆ/aߨyhìcò×W&=ñùÆŸž|àݹXYCò/aO¸H ›ÎÁËõzM˜àüe5s7†£-VW³y E ,L’ZvzŸ«%"0Ðæ£Ýl·ã.¯×9}õÃ×O>~úæÝ«Oïþ}ÿòã—Ó¯=úýãÓ×ßúøîþÇÓ£ïß¾üðæé¿ÞÜ¿Æò{ûç/Þ<>ýJŒžþW£o¿Q“ßàŸìɲ|C9âg­1É2 êã!¡)ßóFÀ’«Î!KÏ—°ÈN­%Ô5Gž†6Ð,…b“|€vO)ŽJÚm+´n,—N'fß·k28+{¿p*õŸã!ÕÁ v³Ý»¼^g@®It@–, eŒ¹k5£P)²$,ÅW¾=àù÷[¹&ж1hXìñ{?v¼–@—ÆHÛm±×Ж¯ dê`ÁØ«ÞÙ ¤Wéê”êeZíf»ky½Î3hì' ‡Ô ºÁ*M.–B°#¾>ööùwá ) µt-¡š:WB/CÒÓðÓmÉãü›%†eùàrü¼åÏ`<‰0»pŠœ”¨Ëc}ß@ËCÝl·C-¯× `þÎÁ¿a­ãAKò=¸ï?›`ÙЦ‚EC‚®´$DøX™}-¡¸x°•šb÷º@ `MEeãæzºpŠœô0óÇ ´ü1ØÝvkózÌÓ‡µ58Ö¡—ŠìòÇÛÐ,|[xúL Á ”#6&0•±£…œ”j”¤]5þxÛŠÕï´…âÁëÝ€ÁØÝF’—Wp û!‚–A‹v³]çÚ¼^å€)ô’CY)ŽÑçAlüÈ dP‰3ƒX2|åf n˜æœ@:“ãÒ²‘:•ZSþ`+*Âçƒ×2‚YÄËmW9]zmts†X-ƒíf»Îµy½Êfw¬;cfÐC“f~oÛ µ©ocoq‹\ÀFé„^¦F™[­Œ?£ö´ RÓî¶Ð3Å$Ãôºƒ#s`0ˆ|µ4§ ;}&Ð h ´`7Ûu¬åô*Ì_MA ttÌ>‘¼£­]ÄÆ³¹Äoi&Ðà*lÎóS5yŽÛ1Hɽö Acê¥Õ|°D;x] #˜70á$cèÒ«Ð÷|@1˟ź,÷³N—W üy¥‚YZ)“¤q—Ì´•doÕîgÖ šïì«-&k1gUçÊŽMuCн[& ùƒËê×íõ…æ2MÍç*™õuÅ,cç^\ë˜Óåñìÿ';ò¿±óçà瘨ãß‹/ø?^ߔӣǧ…‚ú è;¡ï¡È€u·­bdyòF§ä6ÇöR/N=áH%ÝÖ8†::_ÂIFzõZP;QÉ(Z7„±Ê ^‹±nàÈiuJ`.l+c9x] E ŒÏz%^Ë+|õµ]F`àp°¢Ým×q—×ëŒAòK4Q•¦Ódjv¦qƒQE<xI&E)ªrp‚äbÛ@;*Ïl³”pß\n¿­oO8‰þhñtáRŠÞ©î]Ÿ7Ю¡n¶ëD›×ëÓÿ=„·}vŒ?äÚfî FÐÍk vp“(!xKüõ ´ô•–ýÁ6£lŽN¯ d–AƒA·9–Waëï+ÕÁŒv³Ýε¼^çàé!\UΕK[ÖS¸`D]‚¥0ÕÊ´€ÖX øwÐRˆ‹?Úb-‡ž^È,…ƒÑ’|/¯B@X/#0ÐRÈh7Ûí\ËëϤW[r!¼Êž`K|¡¿¹Cî•àH £U©ä·‹éV>5xb‰ä?Òt@÷®wСÒðóÜÛ”m#é‚  £! Ì Úbe.W옋ÕÀ™¾Úå^Lóg¤×œ³Éý4Yke9Ö]G–H¾NLØ+Ç% `9ô¸Žš¼Gg}WòYKÉ3™ýÚ]¬Œéžhc5P3€‚€ÅÞVcío.:,'eëb­.ÇzhðÄÿpSý9qR –c C7À;䳡 it±uÜFÚX Ô   `²J¿î¬r…r¥-¡ ²u±V—c=4xb‰F iUŸP œ—‚€¥ÖV²¦Ú®ÐµñE£)÷®Â‹›`UÎÃ%O7;O Ú(†ÕÓ+"‡fYk£ò‘c<( ¼~ï ¦\qó@z»ºø¿‚«{hª.ÖµX†lßÿñG_Ÿù£ßÝÑÜãÿl¸ÊƒÊè~Ë ,s5õ7¢6…<÷½çÂÎcE¹Æ ÀKØFãnÑ=¶¥w°]`5ðf,k˜L”×UÆ%¥{ç~¿²õ±V®±rý`,º$í endstream endobj 226 0 obj << /Filter [/FlateDecode] /Length 9253 >> stream H‰´W»®,¹ ü‚óÚÁ6DQÏÐ_àÈðæk8Y àÄÿޔĩîûŒ»wn]ªT,©)ò¢–èÕ"·+S+¯ß¾þþ®J­æ—üY+§$?"¥6p Lüúýë—Úk¹R q­Nùõ>á®ÐK} °^r ]©ôv‰,äÀßA£‹X–±-^I€“Õ@(X—«†þ:H9_Ì¥ŸÎõ&ÖÇZ¶›ôéÀò¯ô<\’s_.G£ÊmûWsáµ:¶·€ûU;©}=’ÚBoªžsóàÊ^έ×tÆJú½Ä~:L÷‡ý€EI“<R±$—˜OaŸŠõ±–•±>Pÿj/­‰]ÂÞô†Î‰äJ¨õ Ièçr*Mý3TŽw,`»‚x¿®ONÛÀ˜bt L¹å3V\I ‚ÕK Z®–9¿R1¥6=Ö-à2p‹õ±––±>Pÿ¦ë"žôuJ¡ŒëBÂ>ŽòÍÏÅA>ÿíà~‘”õÕϯmÿ(æì@øGÔâ+`ð¬T \äW² (•S@¨j}¬åe¬OÔAAç,¹®"KÙÇqRL………Ò¬*réY6zßàvµJ¤Ê_Ûr p@ áWò‘ÖÆgì¸Baee¬Tû8Ð;öi‘{'uë  „XkiéÃ5p#ñ¬|£úÒô/Ðøæá_—µV7y‹¶€å]*)«òE½A¥u›¿Ä=ßbûÕüÛ¬ªjä×É*…¿”vS  „ZëÓݬ–ƒ¹/ãâv0(J_óï¸êãi™«kxD –“ÌRSêz-+8Xkê„Ýb¥à8¸Y T 0˜Òv¬E^ɘn „ƒP{ÄZº›õá:XS\W.¶>Ë_¨a=Ì£¾¦´-L5êÎûz”¥jêNYJªnϵ±äZýµ~ĶÄü`507ËßÐÆñurJ¹â b±ZX˪}ƒe»,ž‰WÃ-}G¶_U.犟Wûý€#^-ÑVˆç•Sð‡¸<†ôˆåÈñÁjàùÍm¸¤c­=> ËM«EZRŽòfÀpì/_á%oþ÷ë¿ä/òÇß¾Êë|ýúׯ ðçÑZÇ2ª_<ÌÖÐì ¿çò8ÂâÅ\¶fœälÓß'œÆÃžWŸÑ®ÞfK%ÝŸt 3‹>Z´œ ÷x±ì~‹eqÝX ´Aá„­'1ÖÑþî§€ë™Új]¬K×õO>Udu«Eõ'2öK:¤õ öQ™Û2e•ŸScÂÀS¿Åò#Å“ÕKü**µ×Á9š¿ Ë÷þ—}[«‹uYmÒGþŸÌ)rHD°ž¥ßR÷ –E?WQ$““ÞÉcUõ)¥æÀ•=]•×­t±q?Æê@Uûíáèm½Æ*žô1“ Â?Uëb]^Æúôà£IE–³túpÊcú¾¡òXVVcJe™ÂT’ÊçDì@¨ýˆ•Ï/Ör:lm¿?EDZÆ\ã”ì)¬áÍöûT«‹uIë#ÿOæYœ;¼§íþ]µ™ðI‡†ò'KÙ°R¾Ç’4~¡Ÿ¬T \¯YÍOÖrqÐÚ(¡Öb]^Æúôà£9E–Cµ@“x  õ/QUWr€ÒÀ°a+}yÄ2zoDŽë“è¤<ÀÝ :Tò¬ £ÀYüãí‹€r:…ªú—JLË“Ù;Oõ)…nÜKÔû)ƒ/Å;¥ssx툧?Ie;vïTèŽ=Rr­Ó-ùOfYÛ kÛB¶ƒ¥0ÄŒ/7Ç®Ýt •‡3‘aÕØo±QÚÙÖo¬ª–L;ì©4ÎÚM€‚°b{¤¥¤ß9ðÁ„2÷ ¹bFâý€«®à?Þ…[®‘Öx’®­ð)w§¤v2zÌU-ƒåO5œÒ4Ëí¸m¯à6O•ºXKɱ>Òÿùˆ²Þ§LúÀõò6°ÏÍùHþƒÙd74ö!´íƒkÃVóã_§”±w´¹DþÒ@å[,]ó½?Yp(Á5Fœ€±–ÜãCÁ·[­‹µ¼6ëÃÿ8›Ì#F¹“Û4ƒs84+·îÐzÝâòÉô˜DPŸbkóá1ŽÑØ­ÇÈ6Sl­Üª\$´;Â[ŽóNÛ~4‚L‚2âV.Íî¶ p—V»;4µ¬=`Jëóù¥³—~¾Æÿn±Ib{¼±¨ `7`y6¥óz¬£¹ã}Zªàvp©õ±–—c}xðó!d®–ÆPjÜî£Ó*ê`aVWÆq@¿ôH„ƒ%`¶Û±2Úövg5PÀAÀ’k[mŸ±Žþ®åS€bðOµºHKÊQ> ø`™Ë{‹ÚÈŽ›þ¾¡ý¢ìkAïj‹¨‡Í‚yI«•‹”¯¯×xã4°¹ÏÏкæÒ“TÚ»ñQùíÚÞ©Pi)9Î{ö?ŸBæ6ÄhÍ"±>*Üs@™«Ñ¾èÒU|*Ü÷bñËûqt¬œ @`©¸Ÿ_'k¹Z w Â@¨u±–—c}xðÑ"Ëcmcäön ÞÕšÔ«˜ Š·´Ñšÿ-LnN/tÐyhn¼/®Âòt묇œƒtnW·iÿ¦½ZVö:Žàä¾MÀ†ð{î—deãMÈ&àdŒ"bA~Åyá·OÍ™®éž9±­Ï& TꯦºÎL_D¡‰ÕL á-ëgÖü:…Âõ©pýØ`Ó3Z¼‹)/ýžÝò§~tÂÞÛq÷óÉjÁKÍ#¬saÅ\\s;H©ÖÄj^†õæÁ3ëÇèM5ÊÐÕÛêº ·µ*M¥Y+RbÉ£¬(Hsÿ±­ç|°*( H pñkB!+ª~HáP àr°Übmº‹õæÁS[ÈU!<îZXnÚ5ýK÷u9y|nÁ€t]³ßbQtÃÁª (Ðo@XÖ@C:*W¨‡é ÅšX›-Io çÐüÓ‹Èö0”/Ûí©ñ³õ’xÇSdÁæî) ³ö½Õ[,ªP>X-8ð÷ŠVXüØI·ÛH.Û —ZsÇ4­Åz:0w‘ßÿã‹/?|üúÝ›ïþóþÛ?>þ賿|þøâ›Þ½ÿ×ã³o¾ûöû·_ýûíûþõÛßýíÇïß~þøÃúò'ƒþüõ ùþüì¶ó÷ûúóïÞ}j¸p©y³¼îprb@ü5•k±ÁòÐb;g}ß Q:]ÖÆ¦—šbÝY4уÊ÷þØX#þÛ×¶+ x¨ZkÒUÖ»OnGб$޶­‹Æh,´èE¦Œ*”Z¢™A{$¤:_¼!4ˆœüæwœÆÒâÃ&\l7Ê»=š ?ŸÈ´±+ÃyÏüÓw¢ë×=p§ éõ€ÇJáçEÁ6ëëåR~ £ MýÍUo@Z¥=ilÃvô;«EÁ$P¸¿\yc…+䛂ÓÁ¥ÖÆj^Êz÷à‰µèúT9éY£Š… 4‚@ ‹‹bKª‘Wà’¢ - u„)X%ýÎi@9ŸÆjÐs}NÜŸÚFË·§¤}¢ÔÆjNÊyÏÿÓ7£ëŒwì÷OQ¬e)1¯·9 gÔÚ<Íëc^ë¤y>ñþ1–8Œ;«§ºGËAý±‘^ïÏå]Aú'bm¬¦¥¬7žX‹®_Wר¤K Ë@¨$a}j|i1¥×Jý¾×f@87@½ÕƒÓ€rþ*þƒ\÷ý‹»jÍÒ;ôt§{ªÔÄjNÊyÏÿÓ¤yÎZÚ0ãFqOá‚-²ÑÖâ¥&†Ðé^ µpêïk:רQ½Ð(wVŠ‚U?FKÄXýØY¹±n t±ÝÔšXÍ˰Þ<øôiV_ÝC\MËA5 ·±ÌÎxÐð b¢° ¬u¼®O88 (çëõeQ ¡ñcU™s*6žãty:•šØfÖ³ÅyËÿ‰åhžß¸²¦Z8·XxØ-Zs ,ŠšÚS2 (‰þ›ØÒz¿±*x)X nMJ½²\=HªÝb5/ÃzxðËëÑüÂÍqM z½Á9¥.'àCñ‘9VÔƒ ØRθ˜k¿*xÎ_+ìÇðk)·‡À³äÏ)s¿à+!rÞ“ÿÍ«ÑW¿}5úAfö_½ yg^˜.C £—&7w¯çrˆùóÛu•\åU"xë2žfÊGl“¼ §e]à¶ ƒ:ÉccE“ôÞÇ]ÁI°ÔšX“®²Þ=˜å÷ t>7ŸmCR1.F®Ø&ª8J’}$•å Z•Šq°¥aMh\Rë©€FArý±‘Æk‰é»‚4PÄšX“í"½;ðÔ>4쌬Zcì}=`<ÝîÅ>ŒmuZâ\o¢¾ 8Õc háŒ7¡¤ŠÉù´Ÿ0mrÕ),¹Jã&€ í±&Öd¥¬wžÛ†p"/mùGtû”Ä@‡1¯ONËÀ[2 ĺSŽX<ÀXÃÁªà°*€ ˜]sÌt, M¾À@ŠXkÒRÖ›ϬCnŒ»^^¿ÃóŸþ%àRŠ)8Y1\[þõœŠé_/>±—¢ÔƒUAQ@  ™ С9í N‚¥ÖÆj^†õæÁS~Ž.)ól©, ·Ñ“¼XØÒœ}1ÚD)K8ÕÖ€3ºæd‹+TyÛ«‚¢`ÝáÊ;Ø;«nø6á ¤X«i)éÍgv¢Q**£æ[ZþF_Â(JkÌbî:ýó­eÒ¿’¼?b1Óôy+ «‚¢€ »ØoÉŠM¡”v(R­‰µé.Ö›ÏìDãCõè9F:i"¸ð[ã.ÉôÛºÑå`@Л?cq„¯ñ`UP@áV,Yë\švÒAªÝb5ÝÅzó੽häÖÔ½î E{|ÃWJVæé)„¤ÕGßÛ‰ÛÐn” æuÿ,|æU#gÓûqúÄøsê´‘š¡Üsç~j‚ãþTØs78°»AÚÚ„|Z¯äÅ€ëcç^o±5ó V÷÷¶à"«ËÆ:ÞØ)``ü¹jÕHMÊPÌmè—v•_¹¦´Žú*s«YS œFSÏC:-&c٘¢ü`t3à›‹ ½àýž±.pòY¬ ´kŠ…×QÃ9?'?_ç\öM­6V³RÒ3ÿ'v”qJ/‘mÀ㊾0æ“ù\[GQ Næ¾Bõ%^óAº×¹›V#0¬Éö'/ÝÁÂÈ4žô±m N‚¥ÖÆj^†õæÁ3[ÊøyÅ‘N€Fúz ý%Ö(â[ˆÑ—$òklÍ€4Pf‹ç—CÚI›Ç¯ç/(šk*ý±q"{ïBÞÏ'HûD«Õ¤ ë™ÿ;Êøqjl¸c¹G¸²ˆ}5qD¡fùÃ^ Hû0¬ú#›oïõ`UP€p}¹ªùÎZƬÝÒ@ª5±š—a½yðÌŽ2~R’÷ÏqG[ô^,%HQÌŽöı;;ú‡­ ÐkFæÙ%wJ :Ìí- p¿;g±ÍƒÇÛžiÆ¿|ÄbWí!¬ Š(ŒxV:²âÑ¢ ¤Tkbmº‹õæÁûÉuÍK ¬2ËŸ…‘H© +‚|ªÐY}öÝ€4‹D>b‹™íkÙ¾Üõ,xîg–ö”Ò@ŠÝb5-’Þxf;¹>T`I(=¤e n"ÎWVÀä8(…ƒ€!çd@ê÷®ô#vt½ÒVE T‡‡‘µj[Puo!T»Åjº†õðàç×”ëÄùqZÓ[§pŠ«m`¼â‰,Äø«Lgu/Ú±÷{lŠìz†UÁKÁÊyÁ¨ÿ“´­/©çl¿¤j¤æ¤ŒGúÿß%¥áµu_Í€þzÀh²ƒc€ã]9Œ¹9…+‰†Á­\‘à•o‹k¢4±i–r°*h—×ëy=6VL~ð*ï N‚¥ÖÆj^†õæÁ3KJ¥¡Ê#E?¯ËAÂcØœG¡©f—evnÝ‹þ”»§þ„¡ œ±ñÅû^VE?a<Ò9§+)zÇÊ HE¬Õ´”ôæÀ3{ ~]ÛAŒ½-ÿc‡ì¼€¥%™œñysêÑ€´/ùkw²±Ø|{¬;©br>Ý#ŒD›\àE K0›ø]AÚ'bm¬feXo<µ¥àç •[ÚA^öÄY|¥¾Öé‰LÎP_bŠÑ½R\Ù#±ö–ZJ¯ÃéAF”~$ßú~:ÁåÝjc5%Ãz$ÿ̆‚ß_djó…óµ1á…Ì—›³°ŽYwª¯¡gÒ<”Ûÿ²_mËmãHô òzIU¦*ŽA$É“/‰+5ΥʙÙ}sÑmq#“ZŠJìüÌ~ÌþØ6. €TA›‰$'|ˆ+uÔhöi4ºOg=[E@²žWšÐ‹Àô¡SEèùå`@LëÙ:ZÎéJ6ÚOà8¡•Œì·+pfWê­}±mÜ<âÜa:xXÏ’˜w-¡v¢$ëzô1¯k9F.Ø#Ð'45¨ŽÞç ˆÉÃH=[GÉóºB“EÎ'ÊQñr‚×Á0Œ’.‹R\:(Áô Â3Äü1BDϪ‡sÞóê@-_ 3©Òº^A<Æ¢m#2ÖÖ§k½®ä`“Ev‰8± Imœe?'Ĩ·4KðùÁÄ ¦,KVlã4â=¯>¨"@Ë ,Cè•[ÍìEÀ=}íEëÙ:^ž×•l´¢È«b¸!qB¸M!Âð)Ž•)L©(ƘŒb¸° m¡YÅvC1Nf¾çœ€buJ‘œE½ ˆ t2Ú³ud­×• ¬YP¤k–áR …iSæà$£Xß4ÊÌí°”‚.¥ˆ!G,ŠVm .žWª¬ s–açp^Eºò}ẞ‹ÔÚ9Fž¿ûý$Í¿cIÉRyþŠpÛƒaÎ&J¤dRŒE¨šUÝe JЃß,†ÁÓŽ…R"=wó—–åÅUy9—Rðé!å¾m0}ÜéY:2žËâª8U6×pË´BØæa!å+7Éc‚¡ff‚" ì˜@š©)áÛR°E•d½:ÐD€9DF*¨²QÇ«~±»@‚˜E­oëxy^Wr°É‚’)ùn.&9µDt ´Ì KMVäu˜øY3Ä ² ÷>kK!¼ëÕ&Ì Â™Ì%u¼JíÇ“n³ùÓ±z–Ž”çr%í'pœ}}\Uûm Î3é‹…0Ú[Dïž¹1}©icž-AEÏ«¹÷šé­µëÄŸ|VÝ ˆùÃ`=[GËóÚÏÀ&[ |F0ŽV›yÓEB°ûʼn{Õ©0á£"6 æg‚õlcoÈ[¯>¨"°ÀÎXÈ2êzmÇI?Úšh=[ÇËóº’ƒö8Î v )Æm l?“Äe)6ñT`Q)P‡Ï¼yamcx ¨|lJ¤¾ŽéCF»Y=Ÿr¹Ð[š÷}Úô™X=[ÇÉóºÂ“EN§ EÝ–â¢Ò½ Bn¾b ãÏR‘x æf‚÷l¡~8‹{^}PE`+ØÀNy^3Z¼{3ˆÑz¶Ž—çu%›,*rÞK1iÖ;ƒÌíR)cŠˆQÔ)cØÀ9K©bVm#žD=¯4 §‘Õ,èfe´mM´ž­O×z]ÉÁF‹Šê™y°tR›B„¹›¡ ´ŠóJÎqM@PÊ<3òˆ®Ø2žðžWšÜ œ¦8±Ð©ìa4ë`@Ì ëÙúlÑéJdµ²þú¶Ò¹ »´9:+^[dº4Ô8‹±u»UÈš[MçÙ‚þM{^}P€çšAŠG]§jÄ hÓf‚íÔ˜£e½ö3 –Ç—‡GM{ZŽÛ²®òæ~ô;@OþømtxÑ6eu3zr1ÍçÅñ¬¨&ïòvúþ~^ü6z*޾jôêT›<‡ß\‰þìÄmH_¾ËÞNóä-n&ªnn{°Ðë,€qò,#™RšÑ351dmn(+˜@‰»¶)Œnµ–ñê&‚“GvÍZÁç]˜¼0‘€‚¥œéÉ=f%0ªÀäÚRèÛQÌ»^Ø l5cçP 2 xYTé; ’˜@Ç¿ÅLè-¦0€¡#*"‰”ˆJ̬æ§)SU . ókt‰PENå,6MW0xzoˆhD…!-LÓ•ì„ά™U†÷¸I„/.Á*Oõ§R,E:èÊW–¨}â‹#@ Ê—ê.Ñ­XƒiÂT&3\L¾WïüDp£Z*P¹–Û’Äži8‰)59‹81QB˜I:1Û‚”ø6éð©– 1l&LÑPë@bÔ²¹IùìR†‹ÊE™†,Vs.-%‚™÷“pý~äf¦:®¬Å„fæ&ÍLùC™KƒæìÊ™¤L¦7!¦ªôÔLD¨*$¨)¨ÓUOÝ“T?u(?¡Ó Dã8eš(K2SG)Õ[x’[ÑØ$•E®þé¢þ/ !‚PDø¾Tœ|ù²ÎUs¶Í>>zÅ/_T“ãf¹˜B‹n‹¦’`"ÁË7uõúx ­üà@ÃÇÅMYù?˜Éý˜½º<ºº)®gùxÚäU[¼.Û‹ñT6ê2 eYN̓¯¶ ¦UV; ÄB‰,ÚÉiñ±Ìe@Á”º‡BÊ÷+¢opøòÓq‘_gùr±(óêX×ä·ƒþÆìëÝLÂþd?œHx¿Ÿì¢á××׋¢=þ [Û&ízãž¶£gÿVÝÖzð3©–åb1®guóû§iÙáýù~¶Æ¸Ó˜•õÖËl1/Æo—kÞÃðzv©’àŠ[6×ù¸¸ç›^çÐö÷Â`rP¨ËYÞœÔÕ¢aNpåàöI’MY¾¸›×Uñ°tÒnrœ£pmµ iu‘ ¸„Ë«]¨«º —ÏÁ\>ïPƒ¼«Ëª=—s=@‡ü.ÌS=7ââé¡‹zÙŒ‹£Ù|š‡OWºÁx¥ƒÚ­}WAëâsLêyÑäm½Fÿy|Üu¥“úv^/ôvñPšAð`øÀ‚¯Bšn½´Â‰¬Q«>‘hŸÅô‡8œH¼×D‡ˇ0[öXÎÊö]^®[LÞ´ÔÊæ¬ÉçÓrü³Ì̼)Ûémц3úegçúØ÷eìÖ×׋¢=ž-×\Òw”éŽ.òuÑÜ2“HmÚÆ»øqìèãå¬-šµß><-®GÏ^üuöRØ£&ò8´$§Ey3 Ñh¾}Q¸§Oå¤S2ÖÛ_<‚ùÜs¹Ûk÷Á<îwÀãèÕåÑl>Í/ƒ÷r²¶M(›­S©¯þUŒÛãzYM ¶ãzMõ›˜¶‹à»êœ YûÒ&ÛesµœÕ¸M>˜üÎXýlûyF’PNWù¢xÙÿ^Âņ7œÞ©­3¬ê‹¶lÇk¦–c¹PÖïËYþP;g¶Î†R«–·oÇmþqfþ‘‰æ÷~;y(Ì&Ý¢¬ÖÜag}¡;¨±‹zÙŒ‹³&ŸOËñ[ʶLj]|ŽI=/š¼­›`>îÀÎ^ÍI};¯e;l{ö7l{ö·õm ÛÞ/±í]79HÄÙ›º\ ûÞÞï{Ѱî=ìu/¸­ëÞž6‹aÝÖ½aÝÛ»u„ëi1­Šê2þû•ëÑsÁä›|R.Ãg šÍìï 5)gy,·bC{]7ói=«oöÝ-ý•;Z0ù¡£ mèh{ÞÑ^4õ¤,šA¦ Mmÿ›ZÅ:ô´¡§÷´A¨ =mèiCO{ø=í,_þ÷?‹ñ´hþQ”ãégù§*šKö+w¸`ò‹vrú?öËe9m ïÒM—t€6íLº ô¶ÈL> stream H‰ì—ÑnÛ:†Ÿ ïà›NÓÆvt±¹ŠcÄ(vu¶8wMb¶©C‘n¼Ï¶wûb+Ëv,'»Õ/&%'š¨ñLÄ3óÏÌÛÎïoN.a‹ÎßÞ\t~{H¤Ò½ã3!#Cêmþy¿sòQÙígËov‘Òò³ßzo;'ÿT‚ç¿›X#Ôý®ÝœI·2ü^a©XRæ‡XšæÇúcü›üƒü`'CÁ­ÐŠ™'Çd6ÿKSg){û« ]ä9m4Hé‰D»ŒP¡pžÂÖ;öÊ¢D†2'+¬KPsï\í §‘aéLp<\5¢Šag YœH§d˜ÕæÚ:ü¾?Dï'“ŸŸ8¦+¤:vYe??íOÐX;Ãî¬ÑJÝðÞ‰ ï8HÃ{g–w’™[w›×þªÖåzmGÓ:«ÏÞ”®«ã8#;Ί.e:cK×@“¹§å¶h:¸t´ ‡;@‹!6Œ[&o´ÈM†•3˜›7yæºsfê$)Sµ¥ëO´3œ«¤ž‘ÞwÏQ”)ËèÚП.í¦zâåP鉖ÏPʬ°¾rùnqÇÇÿ/¥Ê%·¹äÌk •]‚µ–Ei‹¼',ÿSÇ$ì½Nwýõ¿žƒ"Ox&n̽cr׌3ytí¬~£nË,z¥¥6ãM¶E1öÙÔÚ’kG8:á#E4¤¹`ËÕ˜)ÊNÁ*iÄ\– ¦–¹Ù¢Rz'ªhÑ¥,M½gÙ;x>ð¡< 1‰ßÆqFö˜En¶¶´ÔUôZ$û§›Pý1éH´+¤K²åwlET{ÜnúœPu¾-‰NÉ0« ̳u8j'©Î„¥IC¹|*J½}õ³64½„zïá)èuØRNÄd®…E»-ÕtønT}î¦ÄÙ²)~+/ð&6¯ð Ôïtaœ%û—å3œªìLT®âŸ[¤&G—eï?tº—‘g£×< ˜g½—"g Í·ì(RöÎ0•å#O‹ò}¢á”Ï3éLp|š©ØvÆ™~ ug…vŒãç>£uÓ—¹ªómItJ†Ym`ž­C0}*$"–Z$ c2÷t)åÁ«§=»Î~²r€åï IZ|y›¡iq€@/ÒûdHqçâÍÉäËèºðhPröκASrFâ~†×êÆÜ{Wèõp¦"²3imíèÝ9 ôÃ<„©‘n ˜d€äòã׿ÿçß3I#2\Õ£Jµ(l¼ãèé7âv Šò³ tE=ÕÀÜÔâëߎO›Zyï}ÅSlX$~%sïgǶçÀ@E-‚Vˆ’\ÍŒ—2áH ß×"!™…Ų;ÛX›t¦¥¾_´hi;BY››¬Á@M—µW1{³Ã®hH"|ÈB¬ÓÞщLÔtÃ帮ŠªõÛ8Îȶ¨ÎcøeòF‹ á•3ŽÍ›|g>‹µ¥êa¢ÆW=®_ ^ºøÈ?e]úÓ‘âxÇ|âåP鉖ÏPʬ°¾’ðífÇÇ;á9Ц\r›Kå¼YÙ%XKºsfêdž?Ô¢¶ôÊÃÕŒ)ErB’xÅ๣÷Ô»D!ûB>wôy Kg+ÖÖMîªÂt§yõC°À±iÍŒ½à)PŠ,•ŒSBÊŽYÚ¢f”°üO=ÓvÔíl¾:Ï{;(uñ„OFsÿuuvtš5^ópõn‰æ]i©Íx#mÑ»)¼µ¦F`¢Æ×^íukÄ3 <àd6Ò\°åðý`Ç €¦T_lˆþU1A”4FH _ÊÊØ{¤•V0ãÜ%N2‹ÏPeïlR(b¥Ë—V>γm¼“áeWŠÞæõ7À]/句ŠÅ†Œ"ażߣCsE66:Áu¤0ös^±_li"WQ’%˜ÂÖÿ³Lé¾F+_[{çaò[ÀLù h™©58®ìýçŠd5L³4 ´’0%’Uo­ZF²˜Ë2ÁÔ@Ú–…èÝ_aáYຳÎnmYíp¢Æ¯vÛì‚HML·qœ‘mQdžqËä< ®œQå_¿Éwô®êa¢¦W} ýª[ö¾GÚ÷]xZš²Œ® ýéHq¼e>ñòN¨ôÄ Ëg(eVXß I“q‰qÇÇÿ¾ØEÙ”Kns±œ×@+»kJwÎLÌ‚›Ò˜>£Qy¸š1¥HNH·ÚÀ±yîè=÷.QȞϽC›Dƙċµu“û°ª0Ýi_ý,§G7%ÁD/xJ Ô‡†"K%㔲c–¶¨%,ÿSÇ´u;›¯õÞÿ{D©‹'|2Ú˜û¯«³£Ó<˜¨ñš‡«wK4ïJKmÆùh‹Þqx«mMÀD¯¼ÚëÖˆgxÀÉl4¤¹`ËáûÁŽS01—e‚©tæW úøí¶ˆø˜Ì=-o°E>}B¢À^rw€@/ÒRµˆŸ )î\¼9™|] ÒæónçÞèV¼Ÿk,u%ïÓÄåǯŸÄÉ,$¿Â³E1î5qÎÓÓoÄí@;ågè‡zaËMmÝÀ­}qiJBJôœj\¬s'2@Ü…Š(y$`*C)1;,æKt {ôðΧ´‚Éç.q’UÝE ­ìâ-K¥Àé8“|¼j¥ÛÖÁ;Ø J¡Û¼û¦8?½]/ï˜yaHÆñüŒ"aE•þ”ù¼£õºpì¢RœeJ÷5fëµµw&°Ìd(³ÌØr¿¶÷ŸtÞE¿Ûéçß»üßEþœÿ¼È?è ¸Å>ËlÌíHL‰dÕ°Ú²¤NeU½ï¤ž“µ2¯0÷žxu˜Šã ² L´3œ.e:c0.yAôî ’ÙhHsÁ–‚‘vé@L#æ²L05Xåb[ä`•n#ÃÒ™àxÂõkd\?@Êq¤:Ëת[W¡_G®v —†ªómItJ†YϪ[‡`špµÉ B È÷38KSÿ[ ÒÃAz!Æjä9m4Þ^¾‡è.{Íhmj™p¤ÚÒ3÷™šÞ;™v–Åç¶ÛC«ÏÞ”ö»WÖÎÔ@±“¹§åe±<ܽ\HKÕ›áÉâÎÅ›“É—ÑuáÑ Ü<ïvÎá©jÅûyùZ05KÞµôòã×Oâd– ’_+Zu©ð¢Ê€6Þyôôq;ÐNEùÙú¡^ØrS[7pkD\š’І=§W#ë܉ w¡"Š…ZµKp‚K‰Ù¡Ã‡‚’‡w>¥LÆ8w‰“¬ê.JheïlR(baØÒq&ùxÕJ1¶­ƒw2°”B·y÷Mq~4z»^Þ1óÂŒãùEŠ*ý)ó=:xGëuáØE5¤$ ""8Ë”îkÌÖkkÿ‹ üÁ0“¡Ì2ckÈýÚÞ;W1o^ô»~÷¢ÖìY<áóËÆ<Ð^Ä”HØ¯í·ž3•U5¾“nNÖʶÂÜ{²Õa*Æ~Œ'Èô?ÑÎpº”éŒÁH¸ÌѸ(Hf£!Í[FÚu ¤1˜Ë2ÁÔ`•‹m‘ƒ^=-˜ä“(>ôìøxO»I© |RÜÏlþù;®¥Æ§ §nþ§;x¶qì2ºÒ*Ÿ ®êÏü¼#®Opl]«&VÓW­&ÜðŽuw,gâ|m¬'‹»NHÇjJ·0”誥·Ô…”𥬌½GZ¨ˆb¡„­!/)1;¬Jö…yôðΧ´‚Éç.q’UÝE ­ìâM E Öœ¼Úø8ÿ ̶u@†#¥ømð_öËn§qˆÂO°ïÀËrt­T`¥J{‹L2I½¸vå8@yúu’–¦»#ÕNºÜµh†úóŒçœ¹i Ðnfgµ¯CØiCf7Ü5„º|¯ á½ÙI »3y’E™$0Ë=¿ŒÎÃÄ[ÀLÖ%¦½\eiíI M$kÊ(±Ç •ÔWñ‘š,§·\šq­Ô@¯mé Í9^º…µ¼Bhkøx¡N‡ü¼ûË9¥ÖëÛÊ¡"S /iƒ£YUM©‡ˆbOP’²Ò¹5ª»àîs3)<k%l(Kì)l®IØ/õqàbt2¿3Œ½ðYe¦øP_ÅÇ‘fxiÍð¥5‹öbrñfå/Ù\g+g˜,7£ñÒû èOT¥S:ó)ƒ;C~Å[£Ž Þè«Mõ¶‚ÛÝŠ^%¼4² š‡¡‰âf\ç[“¨9if\[E‡gm>]ªÙ\•|PªkßÃ1\Š:4¼ŒÃ ŽÈ.ÈaŒ 9ÂAŽz ‚‹ÌC ÉxžW%¼ˆô_47?—;§˜­Ã¹Òl>åé®h&ÓÜLgdp¢OíìÛ€ë¹vâ =×NÜô\;qžk燖˜¡è'\¥¡¨¯1øÔÎÑN÷Ùû"»Þ¯Ï»K#ÕñštAõEuÜÞ"ý8†´ó·÷G”ï%_ö'¿®¾7=êËów“tjÿ!É;¼73's|tªûß”š UÉÌžíB=£Dm%m¨)ág·‘ƒ¼¿¾Ôü^T©ž ˜¨J§t.æS¶+>Àa(× ¥ÉFôÈY} i3)š|\±ª,9“mO~Ø ®Í1Z›Ì1‚:©Cƒ7²ÀA1Fž—dê6Ò”yÍ¡Œ8Ÿ±=÷xÛTíÿXÞèÐ? Ô:‚5 endstream endobj 228 0 obj << /Filter [/FlateDecode] /Length 13136 >> stream H‰ìWmoÛÈþúüb >œ¨}çnóÉŠë …ãç$5PMRs飨$þ÷YŠÖ‹miéÖ’|'±ÈáÌî¼>3“FEœ\Vešßxo~޳^»øç{˜M“cï×Λ4?öz_òô)Î<[Æ·žeµÍ÷°ëi•LðCï¤,Ã;ïo‹Ñ(Íâ2±‚Ôë}È«åÓ«»[{º×[¯å0ù˜”7Éçë š\}M¾§!*älÒ²Ðί÷át2Iü_çäk†µklb÷F¹âÞÇâ]4²b8œ$¦Q™Ä­pàµ@\Ø~-{×'µÿ¥ð_OÛ}~†¾–hÚ%=úмÞ—áí(þÊy9vt¹Ï7ÞÝ;M†ÞÛNïòëû3+±GˆËYÚ$V³¿Äj6,è ³‹"$®ª…=ÓÜ´e»"ög›ÆÜ-²%éØ,vQ™}±¶·eKˆ/]M¹'ÉY™ü1MòÈ}³Y‘ÚºyqY¥•{7˜XîÏi–¸cç’ÌÖ-¤ÄÕ¶|:þXù½…i‹"¯©+”ɸøîÜ ùem:e¶ƒ0§yœ SèÏÎV•ÉmV§Ó²Ek¸—ØA¡æÎ–…Q4O³p“/L[ÙºmYš'á†0Ì­‹Â,úXÄî¶Í¶nY‹¦°¾æþ kƒk—¥¶n*GFî9Çi•n Eûîöy –ÅØ*-óÖÍ‘úÛÜš¸8Æ;Å0ûÞ9Û³}–­vš)8ok…û®V¸)OhL×hìõ6Ô{žŽë†´^Ç__âòaòyZ^O3@a öeJ»,¦e”œd·£Ð}¡Ú°E.mTl¿×Ü=_7é7·¤¸Mʰ*ÜÁt.°£r&ïŠñm1IwV²iV%寻{§ÉÐ{Ûé]~}f%öhÉ¢„¹fÈ(IoFî©aßzη±éGW#g“fÜÛï´Îöüt¶åç^Û±aY°ãnvœ||MÊiydÓüfÀÛE¼-,ÏÖ-*®¿%QÕ/¦y ºõ‹ y´ŠÀZm˜pwŠE—æ±/hY-Nhnƒ¯u}g÷ìÀªÛÉ4kµœXöì&DºÚtN’³2ùc uÇ©­[˜—UZEš×Üʉåþœf‰{¡.ÉlÝBíjZ>Šªð{ ËEv6¾¾}YøÚ@àaå;¬|‡•ï°òí˪tXùv±ò9O—‡•ïU¯|Ã2„91»(ÒÉaéÛû¥Ov¾×½ó9ð°óm1*‡ï°óv>·ïèä%ƒ¿çñýî‡$‰”ÁE‘ÿލà”n·&÷“›4_üй¸µgˆúÓåÝøºÈ`þœÏ’kØ$»ÞoEuÜ™Â?â}‚ÿÔ#ößÕ¼ü¾é‡'¼Þ¿ÿC¼¨W¿ÁN}HoÜéÒÀ—4 ¥;ûmÈÍ;ñ¢Nó|/Ó}ÈÕ "¥€ã=ÐÉefþnþöo:JÀñ¢&t›—®&\øðk(_K.½þ¸3ú}ˆÝ/>Иq!@ujuö •Š¡ò¿wj·Úx¡÷ˆÒ ¡þÛm¨õ+Cë'ð¨BßÁ›$ \*…Ò–PŽ. 5ƺTë€Që|­¥u)UÊØ0œ BRIÁﯨßuVîžéµ¢&jÔ]ѵû€§Ûœyá8µV³YŠª€kûjÿ/꣙giÔÌ?Úoó|«%ß0SL)&`‡?´ÖÞp®êì )î)ð£™`õ;­ß~ÿj]͸ᘠ,€/çÖù˜ÂFrŠ÷2ŸÚPo¦ñ¢ö—™™5ÝZeû{)ò˗Λ¨WqGyo޽«=$ 8 ÿÖ.;lrZ„<ë܆ íw4híº£ÁCç=I[ëRTw½S‘#Ç:?É‹Üc\ëº9ˆè€ˆJY@äÜ(p<¢¦¨ˆÀ5”ʇ€(´o”æ5 6/ˆ )9 ¢óȤˆH8X’¾r|ЌԔ۬=@ãÐø‡Æ€,@#¦Á‰ÆgD-0íf$<’‚à‚qÉæ)3È,¤enQG«6òžb|Å̺†ùʣܷUÔeÚç€ b|ɨЖ µ6ª>ÃÎH„{¾F¶¸E&KÀ¿ÂÔ¼'#¡n|¦ ®Ux-÷¡à;îK ‡!¾€>h ÊÀ·@(Š<ˆú@tÒôŠ%_Eª!i`Tpð5Γ]É| À7Ô°GK ÁKp¥€þŒ– ¹]ƒ)³¨Š ÐUs I9÷®ÆÅ|i$Ãï> ÂÕÊç   ña^?zö}·;£ÏÁ·Ð”ôñ ¸tÖ¾À–»´Í¬Tõ#i9'¶JÌ£Á3RóhÐ69kàqMÏÚ–¶ RÏHÑ•â§KsÑR šV‹W+V7E<“I?@0„K‰RÂú„hp;f„ Ê6"x4L€s5…5  «ËàYˆ`‰„\àjëR Á»Æ§gÕŒ`Ë9Œð+ G£)<2˜ ºÜ‡,†9Š@G ÜÄ%A=) öUí3 Óлj,UM’Ü6 )錋$"@ƒ)¨Í…¤VÐñ• ÍûlbÃG+(Ó¦+àJ¨ €XA âv€^¯[#¡Ð,ì Að~ŽƒŽÆÑC ¨5œ3 Ž&8xpHºs;ŠÈ@Ô£HP"PußPØ‚q%µjLc*"„a¦“æéü)ˆ0ìá6J Éì6«!4ÚÎcä1„ S¶¥‚2ÓBAÆRØü ý%/0Ù–<Ì\’ˆP 0U¥†½÷qQøÄ(¢FÕpñÜ[û®·à%e­‡$À_),$½¦æ5ƒõߺjÔ VùƒÊAbûÚÁä9Õs4x¤~,qµ‚€è^Cõ,ӦЬÄJmµ’ìüµ\KHZ­&K[©'¤9VÔ<Ú竘ʞÂÔÕnl)Ân öÔ^Ë8ŒÁ=¨~×øjG<˜Ê5ìE3§#쪇‹’½Ï†ÿ¥ùÊZ!PV¸B¨ –sÀŠóŒØÄ (X‚àqèh³Pc_ƒ‚bÝØÕ:§  q_aKb8Kh5¥˜;«b„”ø 1ÄB~Îm}—Û„#8Ú0¸‚+Ú 6¦EMk•ºíSãEW•¥šàíjbù,ˆ ¤Ö ->Os\n8—/”óOdøÙ¯¶Ý6r$úþ‡~ ¦ÛÍ[³{÷Ér²ƒ ”ÁÀI †#+±'²dÈ2rùžüI~lO/;ؖcïË®Xi‹¬*’UuŽ’ü¬©:àVÀ~jT?K”éáUÃ?TO`F%«†K¿êP.uEX”Ñ1j;ž¦vV ¢t­ªárŠîaÆ—6ª¥¦VY¡ÚªâVY Þâòs*nŽY­\‘Åá ŠzúV¹…Uê²uCVµ«î7¿õ#ᅳûßõ£=â΃Õì÷[ˆ÷Ö›çç³Íùjy²þ’ýƒ fû/ñž¼ê÷“Íf¾^Í?œ_mÖ'¤öæËåüiö3÷ˆýÉjµèh¾Xž¼[̹>?_9-9ÜîÅçËÕzÓnôOüí5á4¡X¿Xž¾þrñnµà±>žÀƒ¥—<9¸~ÿõû·³ÅõòÃÕ×ùùìl¾Ì²<û÷jýéû·õæê)rñz÷ÿŠ¿!ú”éìUöç_ev éG¨ƒšùs‚ç|È㜃È4ñ7-4£}÷´ºê¤ã¾¼á™ßQêî×à{‹Ó½Ž'Íàüa'yécŸœæ; ÉSš/´.Ú‹p]%‡‰Žn'ŒiX‡5‚¢DÞ(òË'ÉõÞ3œ?òÏ¥ kŒ¢^ÑòÖ5Áqø"²þDpî¨ñÅn$c/Œ÷íN"œCæÂ7…ßpt)Édž¬É2ß`{­½w¨$Ù“ ·ÍŸèNÌ æ[æ*GšEÉð®<¢JCÕ1ÖãÊL æ­)ŽÏ' ·L3:«4ÑÒñÝ©æK«³ygº…x¦7‡ýìmZx” -›‘±#ŽW™u¾ˆÁÐu ðÍK À0Ýe!ð²é{¨ QéO?~Íöús¼`>,N÷F-‘¡†&ž¤yÇo­6¥-i[.6ÀKè=#x)I]- æºîe-2ÖTW:-1äI–dÇW ²¤4ieÙÒÆdkŠH JëÈ(S([h_f³ÕÅåêzyš]\γ‹ÕiŠîßF|Ý…ä¸]Yk\CŸ·5® @P8Ö8Ô¹5mµ0ejÜótdá=B*¾¶ª.­ˆM¢‘½·\œpÐÃÐIY(‰âÛNÕð Q4Äi›ÝÇöï°,à^s×bÛ€¿†vÅ=-O~IJ¢sCê$Í‚ {­•5ÔDQ¨§¢›º¬+,˜ÀüG:úRù£ÚAwEµ ~©CIç¬ÌÈùõíËn¥ Á†Î1[FÑ Û`“å£Â6êˆÉé¦vS¥±£º™‚<ÉCa•UQÖuƒáyXû?Ë&'÷6YQj5?@Aü­wk¥bÂøúîŽ@l%bŒIL_‚¸l¸YÇ0ÆDq]" ›çò&"v'’ˆ†Ñ„ŽÕb–èHˆ2õ914ÑBv:žÇP—ñÞé6CnÞÊCPTµÀ}>„‡ ‚¼ècP?Md14t­^°Øn,2ÇLzG>âÏmDdÛ¸ƒˆ S.²Bf•TË”) HÑŽ<€¬ç³³ÍÕŽ‘ìÉŽ‘ìÉŽ‘ìÉ AEÇ@ .ù ›A4mEy Ó¸pLÄÄ×ÉE—¸™2™ngûÆ›‰âÇ®¨‹>¶ç€˜k퀉`ZݱTTEeP%»\ä>Fû\d £h?Zõ#l ]úë)mä"JËp=<f[IÀ­$P–˜¾„n•ßÏ@”ÒÒ.ìŠÊ›DO‡aDvd Ý‹V”..¥ÆdHÍ v–„Ýùq[«t8½®ñQÑ­Üê¶´Mõ îј¹ÇHȉ´ ±]?&kÃ@×JBO¬¦*#g3í¸Wìÿ@ÿz¹™/w8‡ów8‡ów8‡óŠó u“E‚bÎèeÓTFý[Rð|TW²-R…‰™1 ¨¬GZ]7óC P8“¶ÀÄ} ÛÂáoU›!èÔn_*0kzÿ^6û˜ ›hEŠÁý1ÀàK‚­—én •^`"b¼md*òìHƒ²Âßp‰,MÕ"Leäß 3C™a:Œ*ô¯Ök§nbÛ˺þD;„]»¢4:k+îapeG+9©¡(šÝJÂ)ÿÃ~µíÆ‘Ñ/˜è—6nñ~y´fÇYyH$y4vKcö2žÃâ³ÝçëõyÕþ4§üùnûã¿VïÓòmLyxLQá)} `¹š!ºðº¦¡¡ íÅ4ž”z‚tD0êH" ß&“o“Éd2q†}¹Ë¢$%x·Lë|20Õ=4£È´‘…ÄGAJaZå4æE9_~Ô#¬&/—ň¼>Yðþºar]U…´W#NSË5<ÂT?—\Šß-hÈ¡|Ò_ÌKè6é¯Gxùþ_æ˜VIÞÈQAÍÆ8ž×)iQЍ¬ÊÞzHvECÏúd"Ù–ž]îöTgßS¸ïÊÄ œÄ7y&#Öi55þûI9FGµÆÓx1™8o`¹ Öì‘rš´,¤ê£)œÙ§å_§õøëµbhs>ú––D€‚ï¹)NàD˜@`°W7\÷MåÐúñµCÐTO³|lýŒæŒÉ£kÈÑVQ³|¨Žkì§-–~Ý_b%|¹ÈhùÈ2£Xµ…Ö®.µ ­IçƒåVü9¹ßm¼)9•в5vÄ઺}AE $ã"±ƒÖ”ËAâeÓGÑ ›ziš­Óo|ØÇñp{7°D m,i-ʆ/¿ˆ6 º–Á| ½ç_jJ×ÈA¤ބIÕ¢b=æE­M 1d‰4Êøà HJl‘å‘:Ž­|NXÝâÈÁ1AT^/ºÕææÃæîö²ûø·‹ëîfsÙRû?ŽäþnŸ’Óx't@‡dà rª‚‘¨>t~øQ6Û€4ŸÌÏÝÛ!”椹 ¼[DT ¼_H›LÄÃR„”´ôÖOA7xibeã€Þã§4ƒJ?p6èÁk3í_©øøßP¬)´(›¦Q]F{K ˜@ý4UÜà1€È¿G&„ÎÉ‘ÆZÉùJ"dDo994Ç‚ÝKÎÝäDaÐ{øv )=#‡l¦ïíMâ5žÌOeÞ{ðÉ>é¡À ÝÓîèl·½º}×=9>~¶ZÝÝœnv<Þ6ÏvÖ䰜༱½î©Ö8WPögYzÔžìŽ~ØìN׫ÍöEðk6Yò ·Æ"Á"PÉË!àutG§ë‹ëW¸ü6vO–Ï^¾Èeóúíf{“>åx Î/7oÖçÏ^Æs˜{¶û|½>¯ª›¨5Ý!dÆqÐEYñCÿáb·[ooO×ï®>î¶ìÝëÏ2„hŽ7›ë½Ïo/Þ\¯_Ü]]®?¦]j~ÝóO6Û]½ˆÍ+Hô+­óç·—gŸoÞl®ymÎaÁm–<ùÍÅ?6Û«ÝÓ:XüžÊ„‹Ä©è¯3¦Œ¶’¾¼ß8Ñý?þÑ?;Ó½êþòWÑ]Bú§S4ÌÁE‡SS²D"пê´Š¤C›è¶Äа= ´¶ÜÖôœ¡!7¢Pµë4*Q²<&úµÌtA¥õrQ$‘`BÑK¤CÞáÁJ8™Kø…½”˜'CIô¾+¶QïÆ&-šM| ö”[z­ª e±@Á–zU-íÙ–dgzöØïyÜsXˆÇ”°ô9mkäzoTU‚s~Q Œ» ×GƒH(?hK‘ý$uRk vyÚ^vÑETÁ5QÓd.3ÌàYÉ2Á£QUÐö`Y#¨H ë%Ž"i²YâÁ¾p@6Ú U(4É„÷¡Ü‘0ØËª¤¤H–‰mÛ]nÊ'!»!ˆZhÓ´‡ ¥e™ÀÛã¾£%EOQø8ž–3íB0iÎà¸C`¿4_•QðJs=‚ÚÁpieûà@Õ“¹¼Åä-´Õ¤–÷Ç ?ë¤ ÅaƧ豩r4©ƒ7ð¢zÃÙºÌQ15*7ÍÒ¼œg~ìM³‰ì0>Z2=t<òEÝÀ=’±2È]2EðûâÙõÕj}¶º¸Fëx±½ºü~Aú¿w{uývý´`îw¿0îRY+Îÿ ‚ÆI`-¨ªMB/Áÿ¯¨Àª°Ÿžè§—‶éÍÐkÕTcY0®Ë™z¤\[n-:Ù6£‘L6Ïn›¨›š3·øí¥ ¨ØË_„ÐÇ“!<ªT\âGÇ0݈úéö~z#ö+ªNìÔÚ3² %¼›®+W÷ãÝEqÏÆôl É'Mhz¢ÜÖ\;Ó=µnîqµ< XNDXpP°Xc0+Ú4j:R/RÓh$pË”9·Èà@Ó)¾=”3 ÍÏÎƹK£#‡´Nñ­¨­ ÃÎËôÉKê èZZj$Ðç4£C‹ö‚{ÑKz‘!ÇM˜õ@³‘2IÄÈ]Ôp"–¦6NA”ã.f¯.+êlªJV ÉIV‘L”* ”ó 0å05±ä.ñNûD‰X lh÷L.RÂGA Þ€À¬£™¡Q÷f?¬Ê{À81'…`˜†H²½Ä‹=+<@DQ“¤˜Á?ÜÃáBb"ê)<6QÁ£x$×E @`a=&bm¤ƒ'ü¥À"ù<ÑÁ.‡ˆk¥ghrÂAÍ8]%ê¼ðeïMäšÑÖª4Âo(׃ñÊ9} üzжI€‚²pb0¤‡Þ¨ì¥óO“Ÿ¨ã'JÕUrÐùP‘Ö…‹••ÌhtD›Ÿ#)‘‚À4‰,uŠfUÊxED¥¼<§i‹š­JŒ)EY„(Ðs/A]šÄTЦ,®àYêàG‰A‘R ç;Æå¨e”dCÆ Š¥3wÈÉû¨Rè~üó„ï7Û7™&È_œ&ô 5'€ àüh¹ôz |š€™K,ÔI੨LƒI,,qUÂåRñ­@‹r+ÖŠx_Ö‹+<K@Q¦'Büù€hß\"›"ÍVîJU H7UË^ô%ñTBqÚ"ü=¯Wľîð“ü¾pß,Q6Eì¤JàW¬…¼£h-ëÕ¢Ø5î0“̾ŽåÌWе2jÕÿQ’­Ç!i\õåž¾þ#AŽæ"q“ÜDÇrQ$ÕÿQ’­/wïŠÖ걫Hôä=ѱœùJþ÷SãnQ¶¿'cœ¨.÷óôdŽmžI?c?U¿\ôSOQvc¼¸øÙÏC18³ŸF|9÷œÃÁïp/ERÜà—é›`ðÓÜ‹Ezš¡Ùb&w˜=-0&Kš@Iñ \:ú˜õ6a(¦Õ-~r‡ßÓ²œù›gP¢Ž§€Ác4Å!€ej¢à¡^¹r– !‹I, å57Aà ¡JÈ™C2;Øh©{79pZ)|Çê8V §ÖD&§ž¹·¡Nl§÷"ö—¹²ÊxCWÕAå…Ë_èý)â^ýšÏó²BFz½ù?“žò›®ð¤›ÓàBÊP Mô0Á݉3¡”»YH—„>ñ@^0æ|/þ 1E ø”m%‘S6zÏÃB¿šè©6LØpcÝrÑXúǾ¹QÒøÝä'î«mÇãˆ~ÿa^H@Èíû%yZÒˆ!@ñƒä~[¬¸´"@\‹ý}Ω¾9k‹ÒêʼníLqººººêÔ9X4KÖëÕ<ÍCt~¬Ž\, /´BŠ´J®,ã"Ž ÖÔá›…ggaÒ¨u“‡ô¦(Û¶jÇA™‘“2f­4 Œ’”ÄIsXvZ ¡jÇ¢X”üÒ³q*«,+›´Ì8©—J8œ—s4ÆhtcÍnvV°c›²EÂ,O^Sñ;,¨)¡eŽvu6#-TÒ6YéBÍžw¡›åÍšÃ^‘`$Nb$¢[š‘$>z7 _ZªŒü¤mØ,"[œãUŒ¯ÀEMŠzæ©[fv[«{j±ŸŸo_ÐçY+o•ðììÿ7ýôþðqZOÛ·ŸÈcõtýa±úBŽj!µ á&“Š0:v ʸh–TÉ)Êh=3­ås?>ï†æ‘õÑLP¤Ð™Sw`t¡[ª?´ýÖ#¬‹Ï#Þ¯¶ïVªvûoœüÅ¿îïo‡»éýÃí݇RníËú&: êÊ+D ºc1y;ùÐÆ4_OÛ÷%¦TšÐ J‰½Š•…JŸ’1,PŒ¬íQ:r»}º0¯æïÓÕO§Ç7‡ýéáAJ¡]Óyï®_ýXøó¯§‡cù©Vêìîôîpsý*ß  ·Ÿ?nF³zcV~¹;K£ùRëßò/r%‡µt?á?Ujñ7uhˆš6 L% f"n&Î(a1¬’f ˆh£µ”R·štžº›µ޳’ꃒVÄñb•a¬ïÝ{3µš‡âˆ7;Ëë P‡ôRPWiLv\²¸`ÇÜqjŴ̧Pâ¥öÚ kœ.;ÃÚËo³žÕžYXv›ìâ¬hYfHTQµÔ°L‹ˆ¹¸g´õ)ðI²7I噡¦‰C¿˜&å}œšÄbK“<ö˜CLÝ´–Õ~¬î†Ù3[ £û)a¶ðw«‹à{¨Ue¢sòÚq‡W®ËDí–Ù^Õ†€,ÓÖ}XЦržö´+èäÇo Úâö>OW7Õ(šµ@*ÿÝÕ¼nÓMæ®·ÓÂÀÙ„îâäùÿ.v=ÎŒ-´óÐDZöøzqêe^É“uË$Ïï œ‹ÎO½HÉâ\qÏVº¾?ÝOe,çæh3¨ã0@…\Ö˜àIVIÿ„ut¨¶0.˜N”.‹Xš¡Ì5 üìc¼fæ¥ÚVXÔLÝG' §ºÁÄH:8=öê¬k¯zÐÃÕâl—L;íþ§K¬¨R)`ºÙâ ´›çf˜Ât§Yº±(y!à dÊEéºnÃöL‰* +ªì£¸ ÃP´¨Ñ9Î?ÑÉÏütCÝl¿šÙ¹Ò°ÝQƶYÏv«.ë!õzÔÝÑùÙžŸnŒ½/ o/H9Ú,2ˆõª€ƒ#ã Cáþ§†ãƒ­bž0ˆã(â´IH”EZš¡d*9PíñMÆl€þ^ª¡íÄEÕäÐõÞÅ©{1›ªÚNÍP’+ÑŒoj¼ÃËÙ™žŸY¸N2Û^˜YÍðXË}~^˘N+#¸c¡æ5àQ©TœŠð'la³ÀøÆ ú4'Lv?üÌLu3QXÝÆØåluõé¡ ÇvͰ_õši£z9?×ó“ë¡AµË%¹í…ìaÙG4²Õ(fT=§¡Dç8,yƒñ¶ ¨Ï–Í–AyA(`°9qn43ÍdØaÂù nxx醺‘ÜN·dÁOšM²…àûFͰ_õ`ši~ñr~¢ï€Ä(žè׿EMlàuÎÅÅç ¡Ž3&¸aC¡ÄÌ)7hB…Ó”ŽÐe _i»nA5f ®ÓnöŽæ¹`÷Ô-m?6{³ÒY“ä2ª'üiú~Í‚u=ªþU¼{Zœï{ 0ghh\^8ôœÄˆ4ûÌÍìï=@ŠТè­²è—fBY(ƒr€·à³ªÀÉhÐßÞÙÆÁªºE¡‚ š‹nèÛìWÃÆªÀøj^ÈŒ½ºµºÅ\cé¦u²8Ïw(f ]Ç\}^Çœ1L¼å˜óS«9‹>< ƒpp$D­³¬11SæuaŽX0°­s!ž“ƤJ?™V*…ÝʈIbòZ“á³ÅH7aˆ "0'leÈ]X`g&ÊÒ¤MÐ-Å…¥p\•á,«¼-ct|›?¢6…8¸ ç-¡®sàÃd³P¨´ ^G9*¡|Àž È4¸J[»¨â$vPÈó¼Ém>y…žWš£ŽrS¸ÍwÃzÌÁÊ,S¤ªå¨U-PÙõyáb¹ôµEO›€´ñ!¦ æRå9‹r s¥ÏlFúh9‹³p$O†þ©µ×ë=ÆLЬ*àæ·äܼ R@C‘óeÛn‚]9q<“(mžX™”JL…ÃRðyA†Ë"zgTCæ„4~#c×’ÿËÍÕõÃãöN÷·Ÿ§¿Áô©Ž‡t/§«·îßO/¶ÛëýþÓñÍéñ–ß¾œþÊÅó•ÓÕO§Ç7‡ýéáWÌŸ¿î¯Þn?þóûýk§»ëW?Ö:ùù×ÓñüT6þ;tØÝéÝáæúU¾Á Þ>~þx¸ÑÔ¯ðÿáBh¾¶˜"9k’—ìVN¬ÃXÆ1ÑþlM 1áe2¾xɆHÀSl.4ޱ]œŽS}GAk[MœtA‘Ãr6±ˆ×ò®[®E ÂoÄÅ-Œ*\YyEitèì°œ<ääŒB‘Q‘¡ÄµŽ¦”¤À ·F˜L€v|¨ô„GøH…®¦AWv+A²B˜²¥h„°¬°d™¹oà ¬·!K¡åä¯è`,Ó†t£` @¦à¹*UØ@𢰠1—˜7ðxe G—Pͬ…j&‡¯ÐeÄvM!—HvSÄžgZ®×`‹(‚tTÚ{Œ°»ma/Ñq:XâÓE{Àƒ#¡šñã\áÉ¥€$¾˜+øÊ¹—†M¦ºÉ–¬ÄHàäËð¡¥6¢y&||Ó}þQ$aî\ä*´§Ï¤d/1 ?3»ƒ²KƹfŸjt.òØk¸¶B“Ñt´e ǹ’½|•ƒÁçCØÜI„ÿjv8®»b!RR,51 &"}?)‘Iâ ʼn#c-G ${ÆRá,¤7˜±°0 ÆM¾#Ú ï±P—ŒwFOjωòø3Ù°¬abÔ[€(ô,sß "Þ«Rl6ʸÒZf˜3hOš]±ÙF$A¨È} ^b€\¼#=YßÙd{Að˜÷ÑÙ€Gɬw€ôœò«!o!¾„˜it`˜ E+ZÄMµb ^´1 €¸•ˆ¶¸\§?èúD$Ë.‹T27f’‡ANô%ÜД!J«çÃÆWßàŸ5ôo0#Y _8€ºÉA˜¦pÊ…ÆdE§ô H0´ è'#LõН-¦EsøgïÃà“8öEåЀCNà-¢íLN2Fê Á¨27øESŽ@ãª,c Ÿh‹åÔ£üÊl° +‘&¤Âa…¦° É U!i‹Àž9$QpP+b°˜(uÓeò>–ʦð*p(…Þ…öȹ}v…#iÒèE¿U·À ëÎ{_ÿV+ÊÏm¬ W˱¦¯©)ÿG}¹ìÄuaø x‡³±dÈ}¿,MdEN9r‚)ŠFŽ#< Jüöùþê336 aÀÉ‚ ÌéÓ}ºººê¿$ ‘5 ö0iæe =u¤¸­ ±­D`@7Q@n2¢)nY=ÍqSkhè€~)‰Ñ(‰+ä@Û–nÛøppžÄ©Ö¥(?2mð“ÝÐ.»…ÜœTQÏ 6yïwѱ¸\ÊWÛ—ûÞãcƒ¨2"Xg–.à/² Q>Üz(âØ\¿[×&fc¾Ù£{ƒÁ lLÍN<çší¹$ACÓÏ)fum^eM¤ D;Az*£¼(’(zÇX§ÆñŽÃe‘³Ä‰7’õ´¶7 ÔTÐjÙ$¬)MgÆôÖQCéÙY”m08 ®x1l+䦒ªnu…Sðì›´”Ò›n$îÁb#¸›‚U˜ð{Ö\Hq( `KEaTú¡Ä´r+‘k@ÀMFˆJ®¾‡0Jg99Rþ÷ –“ê &€gñ´¬Xê~Öj×C•S2)×HËÕ4| WØ…Jx.9î¶«aafov/´ÛR2½jrÜ.Ø;î.Ò-A‹«˜†j¸!¨Æîjü¤ÆýîﱄðÝ7kF5ºTÂÛ™ÊÙZ´©æÍ Ô¹žÄë §le#¢.>ª]H”ZAå&•ß„×܇](ÝW$zq£™-o~PZ¤ ¤øH,ˆ˜ªx¶!é4ó&(‚ŒÉ:è1b?]¹e5€"º}-êÐ^MY[i^RN,n¢|·½é~Þ×ê$,UfÛ—òa,¯\±ò~x”ãÖò@É ±Úбwa·=²åëÅÅ=/ó±aGÐi6.¥Ï^þC-þA€à¬Oä*‚ _õ1U$é cpéŽ&íe ˆ5"CÕìÏíÊ d,IÁw „Lß øxíƒÁfV3…ª&vúÏ.ÙA&a&~TJD²J¿TêÎC^P‰^p/>V)á #&À"‰ª“¨ô]„G])Aü8áX™´4hióÈÈsàÝõ|=Xaô,zMNÂ_¥M–‡ør]O ¾7u. <î2;Y…  $\ÔDXôX·vŒÿ¦ÍÉB§H£Ld QºÙÉMµÛ ü›‹yê³Ëâ”m\Ì¡å1A “WÀênÛªçiÁ:X[±7[: !°@ŸxS»…kþ§)OH\ªw"…×°Ñ׋Œû_ác‹+JûùùÞj‚!\ѡԊ,“ c=$ÜÎ*$©¹ˆÍÛ–óOµ½³;^Øê´^½y^m0<ÃÜ¡”h‡“–ݯœëõäx¹‚îÔ »Ô×ÿ%´ÀóåÙô/Ñîéh¯Ï7v´ý4~zö’>yúü¥?¾¹¼\\,_/Þ½ÿxya`úó§óÅø¾›žž~1óÅòÍÛÓÅ·WïOǬpós/þ>?»¸Ü|È]Eõ„‰îøÅòä§OÞžÚs:>$‚å<òôû«w‹Óé`zuñfùn±ª¹j¯8îú?þdè¯)M?L¿þæ¦Fy½#܃ñAŽÖâUª«4H• Aùµ ÂÉé@k3t`Óófúz`õE毇ÒÐëPSY ìÖ¿€¸kïÖ΋¯GlçæÃþ±ëbÜŸ'x)¦„TU²(Å·–)C še0g{ Ô6H³äœ; 9!µ 0#†-ÿFÎwtÆ]1ý#ÀhžŽ endstream endobj 229 0 obj << /Filter [/FlateDecode] /Length 18721 >> stream H‰ÔWÛnÇý‚ù‡y@ÞQWß;~âRˆ!ÀNÉBôFPKJ!"’±¬¿Ï9ÕÝ3“]&¦./6!ïLMWwUuÕ©SyŠ>…ñù«ëË¿^în~ž]Œ'çg/~¸¼º¹¾Ûÿöþþá¶~:ÄןƓ³«ûw×g/ËÅÙÃþõþóÇë‹7»ýÍýÝåÃç¶ ÿ3ÊøöjؾÃSýÛþs°ãÉ›»»ËÛë«ñC;ctî´-üÕßúÿíèn·CONÇ·ÿ>á¯5ãÛÏx±e*ÖåñvØHžÄ„<‹6ÎNÙ…2J˜¤¸´6v*bEÆÝ°’Éd¿}› ¢cúÃnÐ/ÑujÆEsyŸwï¢nAß¡›¸Ø¾òå—ƒ É#A›OÇ™Œïýh&—DœgØ&/9åãP:? þSÁ¦¿l²‘8™âí˜- ®`ñíð¾FþÓðB>$Dœ¤‡-`h‰`g³Œÿj nBÒ„®½#!kXÌ”³)+A‹ÓùÐEˆ“ qj;À ˜zœôé÷Ì)Ï¢j‡E{¬NXÉšó>ÕÌnþùðWü…º[ZÙ„óuãÜdrËÉ!¬%«³š !µü8ïá¯êO:ô[X¾©r\”ûû:\³¨YÑ÷ ÕðóæÀ/¸ÉÞ o4ŸP޽”ŽÏ.d<û7~ œvqtêíJØM;4}qk‡ÕG^Çå(xªwäõT¿¸píõQHŽ Ækéìîþn´.ZõÛŒ*™).¨‚²²V"®bÊÅÇ,è"A¥EAn‡ÉGŸ=}‰(Ø(SqgÁNSdzZc ׯe—.è'A©‹`xHÞÚqÞf“¦,ÑËrÖ,^7hYÕm^v:tl÷¤ñÿŸaIc+¨ô€ŠEq9+Ÿˆy~* w^…j9X†0NÎø¤U7Ë<°–Ap,§¾hXücX x„ƒ&­¥É§¼Þg´ÃvÃJ†ØÕ‚7*8¶Èê´& ÚlÒ¼h¶zÞèзo9z 0·…¼¿ ä(3Xò˜p€p 9í0È1N)†èZˆUãS ÂÜ›ñí…‰œrèt]PC•ƒ‰«5eâm¯vi‚~•šÈ£ìƒO㼋eb»ÕI]P£«Ö,kš½Ë.>}{h±5j/ÔÐö†MÕe†Öûɺ°ÎfôL¯IäqÎ"²³„…kA%’BRM“Œƒ 6·¼ƒ[Lt RKFgË&+Q;i7¬e4 AhÙ8…Ìí'õ÷Ý0ÓE‹m‹C¾=®a²Q|©qí/¤ kH=’Õ£Ö ±ây¨æä# À –s»HÊ„ÖbÁ¦R,ù[™l™€À•ÌžÑ rÖ”šEðÏâr—]fA;H/f–›ÀMú&B¦ã烺`7ÌÆtÑÚÝåУï€ÄÈœ$±!q{aŒÑOŒUXàuº5* Û¼-(%v˜hIÞ%vÐþWP­ø$•+£ñjÅͤb!âÒçy\ó™É7ï4Kúy¬ó.S*¹ì„OQAf>¯K 7[5¯š-Ÿw:òï{ ¯O–޾õ… Å#^(<Ìýï†4 Q+ALÑ᥋Æ",» ò†ÙÁ®\öÓßYÆÑ™g‰A+ô-fÁ|ÌnXdÌ ëÆ¾ Y1Ú”ŸšHæfË,šío›ùó’ý@·çM*}$8¦r€™bÖ0lÈ^@ø«Å3Ê‚n©)“ÑBظVª@ì¦À&c3Xcª©ç8%œVg‘¬¢€)k„ {[‘T‚Ô!B‡Æ [*º˜Ž[E÷‚FŠ%ð– Z+—ÉT‰ÞP@ÜŠÛ°:ÃØ]Žit[6[(!³K! _Þ,|óð.IÅ<øÎªÐ @P("tÕÂö1×FO,C§úè-Þ"¦Ð’$éeáz„ï–)Y¢Ó^f8;Õ ‘®!9!"BCe½÷CYÛˆdãCÊ Ñ4Ñ‹òÛ’#g¹Zj®àÞ·|ÀÝ9& Ÿ0ÚÇtn8à ÆœÐXMÄåoIºyd€–t£ä§»½Uø*™í™lÄÈc‡fc2Cá¡ê"–WpxšÅð‚t(l’6LÚi`qËúgÏÏö/nvû›û»Ë‡Ïã_ :A¨S ÎúÓñùëýÃÍ݇ñd»=Ûí>ݾºß_ríéø#•ךãó¿Ýï_]ïî®pÅüüeøüÕõåÇ_/qÞïÐOÎÏ^þÜòä·÷÷·õS=ø'ŒaW÷ï®/Î^– xðzÿùãõÅbM[…s*Ð~iÁŠÆ¬O¼De¿ÀÅytf¸ êNÀ`%¦JÔ´ƒñ’-o ˜gX]¨ë²ÓQÖ³±Ÿc£ˆ© ‰Ø"ƒ!5†À%¾—LÈÖwñ¬}Tºè„ˆ}‘ž€Qç”A0¤u”#;¯ËæÐgÉ• #;tá"ÉÖŒTø@Þ6¾‘M€pˆ|бz¨ð‘+‰‰Ô¦@L \ÄÆU *‚Á²S"³Êqà¾. ïbÑ<+%êoö… 5Dù2Ç@­ÜPQJJÁ¢b4£31l ñÚ6²YDÉföX…¡‰°AŠxÏ-pg |:ÖðEä@8  ôj[ùKòìŽð|xÚÙ0áD¨¦ýð+>ª DŠAËßc•÷;žj6¹êTP¶@à6ùcôÍd¿=¾ê>ÿŒ ’Ùh9Q Õ IùKJp˜¹Ïf&9I NÉspÈk«DEG™öf϶R‚®*Ñb¹ËP¾@ï $Ê€…ŽëF=s´Iu’”ŠG˜êȉ)5Ñáè“3¹$ž„#ÒгÓÐ@ÒZ¨z±Êx·' ¤ÊoÀËwªÓÞS¥.¡ï´žäž7 ð…À†Òa‹éÄøHÚ?"÷Õ ‚©É†ÅnEçñê-JŽãIX¥ ‡M:Ô±I”n:qµ†”l‘ÄI+&OÊ—Hȼ)@ˆ fœ4¶ÁÓ‹Ž3Çêr1‚y’IAeŠ3–£³?û¨Ê©ðIgˆý:çU¼‹ñqMCàPUŸ9©æS­íÆÈ›T 7óG"œHŒ˜oÇ/¾Ê?|ÈGÖÚØ€òå• çR‰iÊNG–˜p—œÆP‹ °l)5q#Tk ó•ŠA´¦ºF ¼«‚’Á_t̳%k?iÍ=˲,SËŸPÖ€%âÀýØþP¿Ö°n@;œF¾@œSjÌ®ŒÓ¬ã@ƒ–Eú¢8…guÌ#7ƒ¢$–Fz8æ¥ê™ ÔìfÙT\T¶ÉÝ•þ¨ß¡øÊ•D?Æñkç—ì”ð†àÚ´ß&EúùÉ9ðp¶’àLnH² (€`ë‰%5˜-5ü ‹ ÝÑÿ²˜x² 1:!s&õ(Aq:ÖqÎà-^™9©6L‡ÊŸvî¶ö(«ðáHk“9P“€_ÑøŠ@ÁTó$‹³!9*‰,@ëEä)4§ý‡ú²Û­ã¶¢ðèæ&€]`”á?‰^En¤uЮEa8’¨±åÀ±Ñæíó­MΙó£À²Óµ.tÎðÃÍ͵×^+åü»ṀÞâ§F"tÌ€‚b ­37Ñl‘g CV„ ¦g5Û”{£·ª‡LÌÎ<:£z‘¦° mÌN<§ÒŸsTÄ=–—ç’*Š2/^±Qö¶ô.ðE9õ¸îG8‰D¹Ô‰ ‘xI"ENBn#é“þC›ªV±QBYSª%Ši+»&>`¤%×g…,¯š_bÀ˜ ¦§ŠBíuÉœÁïé­ ýM'‰ûhÍ}–ä Š’Ÿ4×yìs…ÖbV…zÈ!®¦%p ˆ+ØJ$³z]1T’¨™„8©©&íž4×äDÕ¥3oMítivThÜS*z+ƒ!¸=Þ°0HÉtÇ»ö4~ ÈDoO,Òw§ ¹ÿŒW…cx%.î,ä€ÖÍd«¢°”ô€÷’0lK ÿñaW÷©qƒ˜OaM±µº¤áH2–¤ûΔœu*‰± µhµ\ÔŸÖÕ&ƒŠR…ËöÚX3™Š€ô½ÄhHEžn¤VoSr—l­F­:¬&(ÒìºfˆÍx““Ý@C „² 4»T[µ }5x¸I}ÆèŒ¼´.+øBˆF’ðWÖù5Pt0ãeÇ4à›ä²{1y¥Õ`‚åÌ"u¾9NâG ŠEٶ擬5µ"Ú°”{Íh¡D‰¨U$ºPj¯,ç´–˜{Þœ³nTNUDVC4^ÑŠHwó&hD»Ÿ[uÜÑ]«=GÍ‹[ɪÐVŒ1ˆ-W' §njü~{Sûü^Ê"a ˜™½s)/ÆôÊ^+~³»“{Æ­å~ñZîk°ïãn' YÓï×x™Ÿwxf³'j r „ðJ„°äLýÊNH×÷:VùÑt$0¬wKpTÉ.#FÌ“0TÄ!z^ >E]¨ïðéå.*@Ù›¡gÔäͦ¢ £Šx°»¤…fâGÏGžD¸„Km‚{ 3D«d: wjÅ‚Rß0bÊÌb œDå IT{$‡Gsx„Æ"Þ€+£ÖÂf"-m.%Iè8_-.ù1áqÿ•6yâ÷(=û¸VU¹p¿ËÄG%1qt¢77+ÇPêPå$AÍ>È<æÎ¹É`Á&L#ØgŸ,¦Ÿ7¹+J›ç.k6M Ò¨x)ˆ{íªŠ§\¼¶„i)â;–-\~”¾ˆ.è⾡šéa3ÑS·Åò^’pÚ‚FôûõŇßÞ§Æï@õ?­Œ,(Þ’“ú¯ƒ'£Øb7$ÊN¥h€žælËñUôël«ãnõö¼nÐÂãæS‹Óî5”jÍ¡eûzyvüãóX~rˆß,áòÐ>·EŒâa¾QGBpDìC?¶+9 G”éN@içO6F¦ C6GäSõy?9C1.N”fMÖ"–°NfÕJÀ¢áß\] ¥$s8úûÇo}ñ¡[Ûê¤ÒWíîÊïÙ™ßÇ}\í õÙó;€´7x(Q„&-û08ÖGê³ç·wSÐ{åÇ}ðõ?¢Jà‹Û×·0vOÏÎÚ¸±gwŸÆMŸM<øâkþöâíÛë7·O®¿¿ùùí#Ó¿ÿòÓuÿ2}~ñúõ˃™_Þ¾øîåõWïn®®î³üéë¾üÏO¯ß¼Ý^d®Q}ÆÄåù—·WOyõÝë—öŸ_ÁíyðäéÓ‡PÙÒ©ì¯È×Z$ëºÃ!Ýè š—p%€”*%š[‡pˆ!Jáp…†!æF„Çn@Þ†¹¾ìM)‡ïØ=m´d éõEÎm¼CÛl³tße¡ì欱î^r|óÝþö›ÇϾþø}pyóæ8ùç§?Ú½-Â?îÝ–TÄâ‡W£=*O4ó‚VX‡kšª¦«ÐWÅÄ ÚÏ™[‹QZá¼e]Ÿ¸K„~c.ÿqÞÎ¥öZ6=˳–—3>:Û ñ>\Ý›Íqš.Bo³œkCÿ#l!3žBÕãáê1ɲkÉaï ¨a‡]Ú›…z©ÒFT2/èÆ5"~L×Ôj‡@ÙõV§ZFÐ}l…Éã3ÝVè#ôvÛµ0]oT¾:èöÃyt ‚þ­ÊVNÃQLÒóúTîm˜MTÇ,´WµíéË›Ëë§—/^¢±¾zssõ—ëA4ÿÿŒñôò‡›—W—?\ßRõóôäõÏ/Ä ï:}Ü“¬OârdmÒ@<2îáÛUJB;—rãw иÃyuâüÇ¢5âÏ+©”*ætޔř˜ÀŒV A\i@ÔAË*rTsL´&  üxö€¾®Ï—‚¾«©ùÝŒzîc…wxkˆ’hZBÇg „Z†ŒcR1_¦2Q ö‰ ~¢qÉ[Ù \7¢ÛóÁœudB2¹9—ÒOÜ(ð’;c!VðUŽîˆFa ÊVùΚú‰ŠNÄÊ1™ $¦s>j£¤PX¤ÏÖ=¢v˜cs•#`ÑÕ^5ÉÑjÇjÖ¢ð½**Ï=̨¯ÅëÖÒ“ÇPA­iq6Ç'Ù;ºVÔ^"Ò°Ä7;’î¼ÛÜ–rç÷¢åó\–Ò•Çâ`aÂ縮)p ÁÆ f@Š“pä^ k K؃ñG3\’ÈW ^c› ¾’}ãy±Éýû¼ý8VÏÛò±Å¼¿ÇˆcÞ¡Î[¬ã<rà>²m‡ž÷O­´Ì[^FêæýÜôλüŽ ˜÷oÀn©#ŒöôÙUÎÛ]ŽÛžw×½BbÞÃÄŠ›y΀ּaËðׯ—VjsˆnLë JPT2låÉ6λˆÇ\ë#àZV4¦µ°ò8(¶´—£Uß¼_~Áˆå¤Šçý2¶ROû³Ì;:°ìË@ìq†ñJŠ6Ö‰¥3OOì9Í;­üµ›³2ܼ£8£Áœf: G.`é‚742 [ ã’Dk‡ °5„Çvl¿X—6Ú^Y}<â5…üÖÖ­Jøúcu«ŒÝ&ÆêæÌF$Š5„´«…rp NM¡„íÔÊK±9=/J]ó~/uÊn [2ÉrãNÈ4z©–m»$•¦n2¹¼Þ$åFíØe‹19bòu`稖ìmNN® dÅÒÉodž¶‘ÑzÞ j(Ž[­´>JÌö1ZÌœCv[©šê²++Á®SXk/LGå™zãHn¿†{£Î{Ç%H¿Rë J5g'Ëj ‡¤’lŽOÕ Ú8F-Xu¤j‹Ä_y%07Õ´2\ïìºöÖ $­ ªädFâÁ…® V„'ÓÉŽnðrËÓ!s—iÕ÷ ? }2-ßb|{Ë(±<ˆ“l{®òÄâKy:èL)÷ô–GóŠvJX<[w‹]Ï…fMÑ÷=€aí²N=×±wÐ<ôÂ®Éæž¥ƒ>|ܨO{ùq»?Ö+eoŒ}¬*ŽeÇ©29/GâæTþ+¤•¡Wê=UYÇB¬ssJ-÷œ¶EÅd´\Ú{’®æ2íÑJ y“‹Æ;n7`¼äýNou¥}Iº²ÛJn+ý­ì·2äF+‰®ºrì!÷§GGBûñÙÅwgËPè?œ¹éÁ³ÛÛ¯®¯¦ïß¼¸º¹Æ+¸ØòîÄgçéG„[¼þ¿øþ,&Ìãð<óú0Wü¹WaWÈC^¯0Tl|[øÃ;Å}ƒ.Ö-\Ç"ª®Ã—ЬØã¥k-yré^îœ~§FGB‚y0í|o*žod!œç%µAÜYšo´ÄÝóºjï¥xedQ ÅŪ~[ýJzÕîÖqÑ'¸ï°ØE©,?w·ýe)n‘B…‹¤F … KŠíº2©ß¾çÌ\^®T·’èr9äpæÌ™3Ú-å¿4¿þ>GCqžPªKó©k—…ü#¸|šs'®ÞIÅ3&äõcÐöçÈ3l(~ý}.ýħÐîˆ)j;± ) ƹ0ÎIlüitÚÛÐø“Ö}Ò÷¹1I©-"þXUç¬_+r‹6¥¥?²o¡¢GºZ‡ïIú‰cEžïÊ'£›Ã ÆÚ>,«W.HªQôNœ ˆ·¢ŒR⦿G)ðq!É·ñ"¬HµY“8¥nm'ÉÉq¤žbÔ£ózÏB12³HYA# ÍÖ–˜°(U=MÁ§S„ùT!,w…¨¨”‹7Á¹ ª³tß…¡)–’¸Ù%I%y¯¿K-J·¬¥Èbë‹Ù&éÂ% k¹“Ò,;„Èn©ÒOܰ²J’ÉÏו ¶^VHUüP˜Ši'ë¬dF²+\Wˆ0ó`ÕÊ”…M „+Ù ×V.–_ç»DGÅ{µýŠ ®(ææÀ…)–½¸(Å'Aª/0|dÔ¶*äÜãü²†%ÏF©‰œ‘à†5˜¦¾RÃäš™>‡¦Ë±Ù€Àt(1=ŠÌh¦ƒ¢é¡j¶h6=àM_ÊÃÎ6Ecúº2}á™mmš¾|M_ßæ€œ’„l!3 ‰[ºžòL&“Ùk™ÒPÙUù•ªÌ†Ì´mO+Ý™–ƒÜÜP¦²iY5ª”(¬;Îyb-ŒlZºÎ_³¹©öù ÓÞ‘ý0«#ÙU³úªÏ1í{ò“Mûf‰ŠYÃ’CgÚØåøš5ÀmO,)XÛ¦_røšÞjãªjû­hztÅY“¡eVleü™€t]Ù—|@š3cÌ׌êC öнØh˜ZV¦­«\{¦->©NÓ°i*8×øº‡,0…,˘øBv«|R^¥³á¥F(*y‰@+»Èo!M«Þ€`iE© håªH«ª–`ô‹K­òUÄŠ.¢D`-‘= t“9ýO˜ ¾oUw‚æÆÑ"ÉO\;YOiÈ9iŽ‚ç¤ú‘s 'G!m N>¯±VðnLYwÑÉ+BÛl®ÙÅlÄEß9õ)œ* +›=“sJi΀ׂÑ:)œŠñD/ ‰ÇÊ8±fΑC%Á#ëRþH)W’ËÛg›ˆzÀ첂v.çê†#K›ƒ(Ïô º'¸]’‹uјNnÊE €8|˜ƒ$KªŠy™ÃºPŒ¯ß²ùjïh¯Èެ~dW«§ù9íkò›ë“KXjTJìÚÐñ4Ï_ZGi†9¾júš§œMI¦Óâ—|÷h‘QSv\mÀ×`O:ùuOÁppÁys5Îr®Öþ ¾\jô’èðõCoÄsgJ„z.nž­åfzWç«P¬¾Ëó’Õj÷üM|ºØæ,ä OSŸÇmª{4ôpÙ"ªÃœ`r®Ü¢V‡G`wÀoj¢¯—bY+JOs[vùúZš‡Å; ‡îÔŸCØð„DGÎXÔ©ÕãÝP"]IIÎÌ%ùÊM_Æ|z_ nj8’ˆHnÝAÄL±!_‚jñ- ꤳ䥂ÊÂé· ïh׿P`oÚ‚0R?/v?ï~÷v÷v7"cïnvixñrx÷íÂÉ¥^}ÁÿF4ª“Ëšå»õGŸæƒ,7º¦I‡²ƒHÅ¢rô¾h³)—¾œº‚º0«Gs'âŽOΠEÏ+¿ÁEÜÚòÔ–Äz¢‹ÎÓù·!n1ÚÒû¦<®m+Ù4›§2³íZ›¶öžh}-Óí›æ»íÏ}WÃm·ß‚^5;u±U RÂßë™­æé•‘ZjvMMoI¿)ùߨ>±ÛªÃV<”¼SCîØð -èG¦àµÙÏ”¶l™Ë¯ãÔ ëöÌ,f}”7‰è›€<©o}#é{M&•®#õ-«Åà*ýÅ«ýý^ñ+(Œ8od.t :=æ”) £ß‰N=?g9¨-˜b@¼“Ÿ9w`Á4oSÀ2‹-étÂT;˘̘Ù|ÔʲcˆÃrºŒÁÓ‚+n´\ Ñëèfý’¸,pŠB+â’ÇCô“Èñн)À18–LœX-®O:6òYóÌ‹,Ÿã¤ÚâÈ#c@v¤µO‹ \ V~/vZØËùÀ9 fYU–[|˜Eâ3…’„@©ÏNqšyQa 0WrOd M‰‚ñ25 Xñ2ÊáÑ¡2ùx’€!²¹­ü–«Í¬ªÖQœsqžuz……#‘®È^}K§‹‘SJApºcYœð¦ > Pm gù•)ÜÌÐÔÓ5Æ¢àñ¨‘ ¥ÜÄ–}š'1²‹Óé5xFJÃ^ˇœ3AQç3¾OD,Òä4¢:èÀSÆ%²æB¸(ÿ²ËrA$-õIv]¸¦J^|Œëjו=ÎQ=¦”!î˜"¢~šr°°ðÖ9–b¥c3t  óȉ{PÏ›•Â'8˜†Úüé2é¸Ã}6 [•}<+Œ.ŸE|µúQÁЫ°¨\w!Î&­{­ÍEª!×5z‰°2뽦:S 2æÜ>ã|ñ™®ÉH:Ïio? Êôv‡²Ï@Ÿhášæ v¯ ™ì¶ >¨‹D»4Hî–wÔ#©·èµd*šÁ•%»–}u³®ØyQ:ÃP–§O´{¾l]CR›ßǤŒBC·|¨Äb¸§ð¯p´iI:¹©L^¸ÞT²/ Á”Žp½S䥠X,f‡&\3yà Q^•¿7Ÿó < I0º¾s½;{Ï&õv¿¿º»½><\Ý|ºÝ?ÓK^cI §›4: †Á.àP;Pï—ÿž}à€”’tÆÀ‘/ °YøÁ’(g°:TxiKZß»;N žtc:îÌÔ?e‰tD‹¢ƒ??Hg8»>öÒ³ÿíÒ ¬‚|#ÑT%§¬3Üù3:øÙž“Ëï^=<~ÿéúñÓýþêáÛð™v¾ûá{ñê p÷åþëþføåãÕ—Ûáîþæöåð{ìú#þݹ>ŒMß¶ÓÓA%æ³EUâse‚Êàç U²Ï– 2C=[,Àê¹³#ƒ  Ï– ÙꙢ>_6Àèá fÏ–’°ç‹‡“Ë£äÃÉåQâäò §)"þce«í(!Ã㤠¬ñ£ä jv„¤ áQ¢‚†GÉ %Íc„…^ù|i¡vLj m0Ï‘´8F`œ\îÿïV …òj¿­$ýñ7º¯]ô»z|¼}ØÿxûáÓ/WÜö÷o_ò©¸ûìþþóÁÎ×û«÷ŸoÿüõÓÍí/ºËm{ýŸ/÷ëAâÞRº6ŸrùzóÓ·»÷÷Ÿåw¸<ƒû¼òâ§ëŸ>ß\¼Åc3¼y¸Ú¸}¹ûŠÆáÍn<ÔÁÿÆÒ¯Cþ:üó_ãpƒÕw?îÐQgÈ Àä@êP˜À¨   ùb'u™KÝìqifíPþÏ¥üµìÆ’œá„ÖåÌ ÑÌ.€Çõf9Ë%t¾DxÔï”`Ùµr UVsN¹Í4×gLëUþlZçó1Õ¿‹ ­+qð!ª®]ìŠ;ÕÁ‹Ýá1#]8¼«+Å%.lâ}O„¡ SùÜ|Íg¬GdÖk² ÿå¼Úvë8ŽàœØ¦9šû%yҡö0‚"i‰±H 4…Dÿ–·üXª»gvgwö!±™g{gvº«««{øO(·âRÒLÃeEÚ–v˜]Ø£´À·é’nº’ðôa÷r`l>Ÿ¨­c´Áíí%ÑX¢'*~‹³†ÛƒJ~Tòc9\†; ×*ÐT^gë/‡(8L µ  ¡6XoKD›F¬×3ýZS­1%¡ 2pƒÑD#XÔEz ·E#H&)¿<@ˆ³ö‰ù Iµaºü0\ b±,è!ýOL‰‡j+ÉGI&3é`ü¦(#‚âå΋)GšKÛG9éVdœä“™ìjþ1}¤ýÔ °â²<0H¤¼ˆ£W ¦ c¤»×ËÛöÕ'øœù˜æË⊦Å_ŽÊæ© ªâÒEΰLü'‡ÆÒtiI†`Ô%Œ½â³«£KN)ãy¸¯yoñ.äÐSÃ…°z]-©–ùº•À²r…©£wÕ’ãž)³PGµ· €ª}cAY5î,©&ƒ¤K¾ÔS5æ]äP=wÔ·ÔÕHTµCgµÃzµSj§†ÔN©©uEV÷V…;£ß•wê©R©Q*TãU'(jGw:]º<ü*úšM‰5FTMÂFËC)±v6™ûp:nqÍÉÈ1'¨½ÏjÁ°ý ùu[/PÏlý¬d„›'[š³ÊïúWÕî í åœæEï¼ì}®_hN].àܨC”bâ2ž_TdúÝ‚ËpÂÊ Q"zgËâi;{‰f ¹‚±ƒÓœ#è;©Y%Ж.µ€±ÃaÊò÷—Ë·yy,¼=Ä:mš_}æéö5M¯ÏýB…m»·¨Á4@ Û˜†$]©$Ç8\%FÈÅrÃ2ŽÇíðŽŒ[zÒe`±\ÒJR,4’ÏÐ\š;`"¿U j†™†¤àmIÓœ ¨2T˜5e"L”K¹•Ñ‚¨W Ѓ+:ößQ-‰ÝqjÇ«¥Îù¦.FµÅ T‡ØüZ6¸fÛâ/ÇÑàÑñh•͸&¥jøuÜU=y+ªãø\|ÏÚ»\¥ó 5›C=èh0„` &›`½ïVp1—øfUh*UÅ™è2Ë£ ‰BÖô·À#Û NÓ…ð§jlp6ò|ÝíouöXU\Bõc :ÝüîSOÿÛ©©dT°ñ´ÕckpN­Ä·[@ü:öÁ^iD7Z#Ò½Q2zCG¶o4‡ŒƒêÀø{t‡eúÿUñ¨=¬í[õqä?· ã¨A0Ž¥Ç-h«CgW;JtvµSõgW;jtvµ£GsT$é³&QÖFU‚uG—`ÝQ&NÜŽ—{ê$|«Od݃iO£È:ª”XÇ<í)UÇÓN«:JwjÕ±_­é?*V_LC‹/u=»zùêéùõýÍóý§Ç맯Óy}ùôì›Wß÷·ëçç»§ÇïïÞßÿöütMË~üúùî|úgîåéÓ§«•o¯ß}¼ûöËýíÝo²ÊŽŸ{ó¯ÏŸžž—ý ÿ¥©ê«7·?|}x÷é#?û«Î1æ)‚.[ÞdfD‰müfÒP© ìD´J$¾Bµ2ó,\¡=DFˆ%‘Ó¢§+f+üG|@µgÍ‹å·Z^ÖÝjÙ^PýÕµ8"žªÅÕ <è†5‡¬ú˜µÀR¡S=v_µ\3 ºp–TŸ¦šI5§²æZÍÉn„P#kÔB›J,µ0‹Ù×~ á,ªÞ×åÞÖ¤\‰hÕiFƒ×!+¦ºG?Ø_7upYÙf­+®=Áb.>”§c˺†U_Ä\è«U¬-ƒPölˆb°ª8ñJdEd'³¥×%5 S®¶¢)›š¥ØáJª| $qˆ¤HHU„e<€0ïœ.b³3 KðI“+…‰°8#V¬ŒSôöŒk !ŸÍl¡O8Vöú :ǹ؟ÒnÊâ ¹ËUÝe—V,é7]âŽ<äÅ !Wj1rm0¥ûXfì ‹'ºK‚(Jbš“8qš½¯iF‰HAgÃÍ ãÊjM,¾4N9=ÛT‰'ÅT:¡$þº©WR'µÉ§øEÎóJ‘Sà5M³©ŽÊª ¤ŒZÑÅiS—Eú…÷}ñŠ­É˜\»Nl5å§•PP‹Á¦•˜Ä‰å†ÈÉr3wM© Í;é¤ÈVæV–™ù,l)K7µ»³– 9JUH#ŽÐiUCóÔ(&BËס¡¯j 0Öz§NË;™7Ô£YȳPMUd< £u–°=#ŸÓ<’°ƒÎH 1‰Á º9¦"-‹Z ©7 dBEÊGf§fq(¥1jF¶À0Ð)NcoÝtßmwø¶Ço‡€¦Ô¯6£ÄvÖÇ‘íIJiÆ©§‰sÓæ&ÍMsÇáj;m4!Ÿ«l¤8XCšÇ<ÒŒš•*)ÙÅyHdÅÑmhdA’©“õˆ5+—iQá¦jUÔšê5Ñk¸èbÓÎ&M[7â[/¶ãõåáôî ë`~ú@·‘·×w·Óû§ëÛû;ÜJ>Ÿpñè3ô#€t'°ã˜s@™É`ßþzð@ÓY1¨ö ²¶ù¨£ ¨€{†ôž¿àüÓ ·„¸(ÐÇé¶7QéHFŽƒüÀ&ìýµ†Pg,¾"NºÂ60Ñ>KObÿ#ë¶;B=p²Æéã(̈úC6ƒ4_Ê!%ǹT›A}]PCá #Ñ-ÑPIjŸ²Œ•ÅùÚRÜò|A=%óÕL ÜL)DZ:/K›J'_p[ FÚ dEúJHuâB¤ÜVœŸ/ˆû.×£®¨½ Ït. 9_#F…]PSIAKÌ©P»#.NEº ­A ¶-â €ÚKO1²"ºh¥§ g¡â]¦Q”~$qßnÑ¿¶Wñ×jO ²€†Ï î(ÔH{$·*xèØ7’#dŒ&þt¿ºzÝLËn@r7·+ÜxGÇòêv_í=n|½Ù fTÜ cgñu{€ÝÏr0tHKÔØEóÞæÝ–lƒÃÞ‰ÝÔ¬ï¤ÜŽ)ÃÇmÖ ÙÌq)ŒÕîØ ˜¬*(xžÕÔâ:U»±š¬âÜXrêÓ\¶n¨[«ì}Õþ¦»6‚ÄÙÆ"›‚ÛˆÆØhP‚eí»:«m‚r£¾AuAKÙ•)Aü²‹W…¢ïøo l 5*'¨=Ý<’¹ëlþþ> ì"êZZR…»¯KlU"ã ]^K0ìbQºlk2Ïàí5}—¼ï![!a«þØw-E-±Z˜C± É·gí{jªŽKCèEWDw:m!êe2Ê)ãúZBÔc  EbUûPŠ„rÜnÂ=•¬ˆX vMëG-¾(G€#»Nx¾°Öâ¦Ã ƒµ*´gœ‰È§¦Ù[9í<ãû¾Ð Ÿ÷ßÌ|·¶;Æ+Ì‘ÝsuóÔž3¾ÆÞ¼=¹‡e‹JÝ:ü&ºÇÖ™‚ÓR`‰ódÙd2Ážï" 5}Ç kà°G„ qn{:†;„;Θ#¨¹©^f- ì+TI¤R¡¬Ú~˜p®8v®Ü,]$÷›áYÞßtáæ;Ÿq„HÕãóOñ™xðbY>ä`NÓœÇsªg4Ìp9#jÂ1Ù6HžQËðÉ£;°'à51×K·Ü*ЇË44”]¿•æ±xëýXàAý9’À‰'ž±‡É©ÕýGz#%žŸÌÅ|¥e§7æ3Æ‘ðŒæ¹g\Q¾ˆ©y _€Š½bQWÚ¾ÔQÙ9½ãvàýí­9tØ»± +âðõŸ·_nûxûxó’±O_nåþÝ÷÷Oÿ:/<}^î?üGþxiTOŸ·,Ý¿Ìi>dy€Ð+L&”Mœ@J‹ È3ÐçR€Í©\ærš Ž6 Å=àaîàp=q,f^ùaëÈSg›‰Ž“nòïDÜ4:Óû©¼®s+95›÷2sîZ§¶öÞisíÓí§æ{îÏsWÃs·? ‚Y5t'uqV 'ÒÃ?뙳晕‘ZjvÝ–Þž~×óR}´;«ÃQ<JžÅ4ÐÉ;Nü ø±r.S?àèb~–rfK+¿‰SO¬;33Íæ(Ÿ17>ins#™{‘ÊÔ‘æ–5bðMTúw?¼ýþ&Õ—iñùçAŒþþ#5 Ì®øe©‹L/_÷5‡Á*•¦É]9ˆK²¦ý¢q  œÙ^U}J^8a4VøR}Å‚/ƒ]’ãâiæ yÒEJ‹:e™hˆ—b“€G½4>4WX+?JÃ/5‘KÀuÏØ Z⾎x›Ú…„ÊÚê ÆÎõ¹yËÍ8œ¶ç0cÉJL™vÈqâJ.R%+~ÕŠ,æÚ—¹…Ê“ó.}ÂvöO™v_Ç#SæµËºÚáâRé\qiÎÙ´'ÉÔ±5[t˜¥W à¥h¯ÎÍk(ÖX”ÐJDRd¥ä÷•WŠàÕ×0ìZŸ×k³ŠÂ‡ö¼Ö5)W¶•U ±¼DãÏÄ”7Åè5ӒΤڸ¬y_yÅÌÇ{$6E)C«^ Xíà%'% |¶ËÒ’+)¯OÉ™$$Q UáY‚æM6+7Hà#ò-ð z€Œ»­I• *×JPô•×›`hQ8ÚRÜèÄiE`ªôËàc"A‰éª”f>Kq¥®íaE4“¢Ü_ža°Å§<ÖæŠçñ&[jà <ß»J©øUú“<‰s§I`AoBÞ=å`J%î ¯”ÑçÃžÕ F#aÈþCY ˜¸´P´Ä%é1ëØ°¨¤+BvŠMhýù D Þ‚ÅÆÙ#G­sÏ ÈJ.”™{!l‰(€\µmšéßÅBð&w¹C2¿XÂZ]‰ZÌ)i¯Í4ù}±†àAJUž¦or> ‡Õ-[@FQ¡i_ÊhS‹Â .²"—5ê’&°“½æKnBc‰ä7{]þª’’à/$öq:5¦+i`¥ŽÃÒÀ°Bây좙ÏqØà¯ÁŠÃ ©'8¤å­×²\¡(0W¤Óª=ÞœuxQm|‘;=–ÔöÈ8„ï+ÒJjt—¤Á¯¹îi‚’Fbá"ΕÆb=›Q–nm>µÖ¿+aF‡lƒ²;Å#€º0¢Ž|zE$¯£¦¨+¿,\Y‹×VÂêÖ^°TŠ4¶¨"yv ¹MÚDðqÙ?ÀnûqÛŽÀê<ùå5-ÙÅaµÎº9SSZÌá ç°d{U¶gF5Û¤J°Þ…M~ º”)ž$ ÂMý:ÉÌ‚duÕ TT5É’F£nÕ—jÏ#„p@¥j×PØeŠ C<À)U7° ¾@8+Ä„¸ú Û ª€ôðzÛ—bïogHHÏ&îµAÑdÝ´ò)ÃlíBfÓMÍÀ÷³’z½½üòëãÛÛO_þrÿõ¿?}ùíç·ÿÝë÷wÏBžöWÿùõ%MŠý3ƒëšO ýn¡6)ÛO_o¥>³ùLE&ÉÛùòú|ùæ‘’zy’ˆµýÈ_D<¾¼Ü>Þ°õÓ—[¹Gm©CÏ,(‡ÕÇ$¥\‹J¡®ÈJ½òаTË+ÒÒÆØ‡Å¥mä%,/ L^’˜0¼&2Åò¢ÌË+BSÌ®IM¼ñ¢Ø”ò‚Ü|ú|Ip>}¾$9Ÿ>_ò´+²SÌžbtAzªÕ£â“>(?ÅæQúôù’EŽ/ˆP êq ô>(D¥V.IQ±»&FI—ä( è’ UÒ{P’*Å>*J•ѯÈRí"W„),¯ISíÏÄ) ¯ÉS½òŠ@ÕÆ~A¢ÂðŠHU½ô¸LU»+Bõéó”êo¿¿Ý…4Vй?DÝýxo¦ñé_±T\쮊¼í¹±¯K(H¢›ŽWIµÊj•º„ï*‚$ÁQjE|Šð‘v™™›7¼…½Mˆza¥Jò€‡N CÌj6¡yï%r¨»ä™©ÆvrzЇ+:]ï"í…RYä‰VM]×$ÊGºn“¬áx(u`÷JÛ\÷m¢©ÿê‰/ß:QöJJ£pÑxì·¥ú;™åâc¹“KÙ»+ù³+þ€Sj/ƒ°þzVK~Ô·šŠpÓ碙ÃrñB¨Î K0ŸP£P¶È›Áæ>èt >⡯< ƒ…HÒW%xc|Ü–\Œ%1³HÓ@¤äÛ|à[’rH™¼Þ&«ç½Ë' F.!XX¢.Dd_þÊH’t¡T¼{¯ý‚‚™ƒ Z1aÊS¼_¯Ô_•8eU‹piã *´‡Rh¡4uHÊOÂA'[Y|}—”É_<ïåýó¤ô$ø2ºýví½:Y¼;©‡+Àc= =²Ããà“‡]ƒô8iö8ÿ„ ÐýDBÆÕ–䜯7È„ Õ× 8¼JJ/ÂA´¹’DÞ1iEÞ b#C‡7ßr“ Rþ?ûÕ¶ÛFrD¿€ÿ0/l##õmú’<­dÇØ, ¬°@4ŵ•¥(ƒ–ëïsNõ3œÑƼ@d“žTWª:'kKà ˜ÏL¹l"‹Æ“|åó’È—cÞ\,„…”7óÕ-«i“!>Q¨¦møé/⦚D5ªæY;4 l¬!cbÑ^–ÄZs±ˆ»¬AÑ™U•Õx.±L ‰Æš­nuYj`»èû¨î€Kª„!5ªùM´(íPZ á|Tж·Ø%¾½}øÁgOl!2"¸ÙÎÉO÷Šüe2;y×h æmcQ¸¹l$3Á‹Äz×8,æÈŽEã¾F!}í}ÚYõVLÁÓ÷ˆîZwé„ij"¹y( ô¤ŠÅÅHû÷Úæ¶i”–y÷Ô͵Qqù¢Ü‘³žgð(²!í²ŠC4—’¯ä&,à‘¦,^`pSØùÐ}Ò‘åèC¨©-"I®Ç2Pòðhl@êla8ØzK+•W4k¥:õìÉSMÌÙ9uOöÓ›cÌ]G¤xsÙÈ$çm£Ó<ˆóË h¬3ýëc7H—ØvúÃúþÕÍüþæn5[?æD.NDžÿ𣶟Ýß/Ö«w‹7Ÿï×3.ûåñÓâEñ',TÅéÙÝÝrgåëÕìýrñæáæzñ9¯2ýã^ùt·¾oú þ&i“:,TW¯W×·ïï–òÝ]ÁƒUmy~q?[ß¿@¿|À«_I9çž§˜ Ãÿ½s˜‰¢¸á/¿O6 ¯Cñ7|øLÿ.\ñ¶øÇ?Uq ë¯ï&Öˆ0)I[b¤Ò¶Us’Dn4mL€°4›é„”î)“44o`‚¬Uà KŸJ}/lŽè¾&ØŒÕÝwöîž;ps˵Ηºïõ¦|±·óßÖŸ] \…6´ã º\ÛU|í>…§6/ÍÔ©»¢ìRv/Š÷Ž»Ó.ß m^ŸQM^%`„ø£¥¶qÑmæHô爖”’ùQG€n wà; Õxš’–˜Õ,I±hÏIWƒ¢T´Âå¬dMˈū¢¦ÀbÅò½òÐß ÷ Û ™D–I6A ­r).0*´”<&ÄÔ:¦äer¨¹¬ŸÐ[>ñÁ^¡—!!ÂJ§ýHM÷È>Ù$JVx<• ¦&®q¨é^L%•kéÐÞ"âT:h3‡vÇK1q5»¥RYÀE´½-JQANPÓ¥…0Ö?±•ÓàÂ!h¼TÇÞzvØ­` d™˜P hTËÚdp¨f«b~wûéîau]|þ8û´(nï®Û³ÜìŽâ® éãšµÔCv6v° ãqèF÷ñÍfÑCø³«>ÆŸ]  \J¹Á9\@:¬}¬Kkè¡îã=‡¡ƒø(æ^òߦ®éE^ÿѵUf‰?¯g«‹oÂÓÓDÑ6DÑo^ÜE—ü Q¬j¢Øù}à˜þe}Æ1EmÉUÒ!‚ B/ÈKaŠÅ˜"j1äd¦X!SDïLº"SÄ[ªè[LQx"Kœ*ò•’MjˆD•Dq€'Ué.O4¬–]žhjN4ž'Ú¯óD÷-x¢;ˆ'Ú#ybçýå@˜ÊhÆ!SÇñD»'Ú#‰ƒZó—ߦ¥ÅÀgÑ‹j*oÅ„TFN É Õ‰o,J½´¸ ¬ŽeC1—ñª,>V 6¤b)ìÂèdn›œÂ6ІäÄà*_eƒ€²QÐIÎÁþÀËe-ˆå’CÁYö ÍIð,ÀRlîäèÒªªhÎ…è Wáå9x¢²à6–áb#äówl‡¥ˆï-¡ÍûÑY¢Éô¦ùå6ƒþ¡þcÚðïW‡Šè§$G'%ÿNZh<"1Òº©‘n6>9$½ôÐ8:AÑâI¿áïR‚.Ù@Gl¯Ãó` 4Œè—h£«û<â_8޽iÓÁ²­R‘tÛ™XwF8”‚÷Ð+!Ö ;G>iüMzÓÆéËV? ±fZ/¿u/Àä­œ yp ¼W“Ô#u[ra”Ä £Ê'¢9q`û˜T&ž`œiÉ–³ Ò( 4É£•¤Û@”]äýØ© °'@Tø ÓÈÐOÔCt-@Tn¾ŸS”V[ ¦*•¿Ë:¾èb‹‡ 4ÖV œÔÖˆ;ðÏk2ŒÉS ì¡N“ü\ g%^#µA4&e© „Z‚âàd7nçµ`ÙØ±QÖÝN€¥er*—Oç±¹\Ä''2!V1¢RÂð’#ƒÙi'³Ø’5ð”-ƒf¬ò>‹ŠuŒ…Ó ’ µ¦*R)n"^ñðñLˆ2› ÏA‰#Ä^D" ð@"o‚DYo±ùò !ÁO *ÛUH*ò@žSà©`¦B h«dÛŸ€YÑ{ŠIR ½$À“D v’G™ˆÊ+ÙdPçD"$’¯°“X‡{Ù^,³Éº#4Ï'b’¾ASzh1:úÜ[H&Ùéœ5MJºY;ïåq«êÅsáqV›ô¢8½¸_߬>ÏÏÎ~˜ÏnßÝÝ ­h1Þ,¦)DEDƒlÙ¡p¤`È1ìÖT¹¼Oß-fË·3Üø;v8HºXÞÌóÙÞ¼Yß\ÿ´xÌ>|ÿüç—Ù{4«²øy=[}X¼ô*w¾ûšG°’A°Ò ûñíÄ“_K©@ZT‰j¶1¡)ôwÏÆá­à»ª¸Y¿£ºº&ŠÂή²wnÙ»'u<œv]~R &óU­Ð0uT‘û~ˆ õ„`&û2‘@Ú}dw…/Z³¥É/ž¢,ºì:5FºÁlöRб§ìß v¢1¢¾÷lü½ÐBh`ž|@x¨ xVXL‚¯s·µa¹C»,=ÆŸÇL£8‚F£ÊÚ¦¼¶ cvMÈ^wŸ-kê£C}ÿùDœÜ‹ï¶ÝH?‰[‡æ¨2`Aß„ôíÃkIt_… h)á.Zyú×vê„¢Á8í€uÌ¥g£/óÁùøµA*YØ\»§uÄDÉ´õ±¼c…ægWx>ÑØÖÅ4L]ÌÀÔÇuÛx0²)QzØf(ŽBwŽa××>Ÿ]­Zì¼Ò’*ާ ¤%•žÄ”Ù$ê9ïšëêÚvM<)— Dl†œ4tžú…þC}µ#» ÃÀøn_f¨áŸ`+·¾E&UÊ$÷Ï’%‚´-KIñ^gA@‹Åbí¿ÎK qÏmcnäæt÷ zÒÁáã Ä;@,â Y'á4ú³FNòKRJ’ïš#@f—>Ds¸´Ãê¶™ËB¡íž/„-Tþ×tó‰ÌóñÌÚhdmÓÒMüÒ±½%‹RšÅâMæ”´è÷ëV±4ê­/Ãⓨ="} Õ}†è¿s¸œÛÿºÛÚ¯¸šœ“Ôa §vÆë]oïV*޶ƒ©çS©è #„MÇÛ×ùºù¾ê¾§A)yêæIiÍ<ÉàJ©1U¥Ôx‰!®’W¥¤zq§Þø€†Š¤ ‘ ö6zùRá ,ˆÖ¹LYI…Ï1$`Mk®š„%X­Þó6o½·\8Î=ŸÉ¶‚âJ«˜¯TÊSQå.ÚüT…‰PòEÙ"_Àe"N*„`Ç¶ŠÆ…¥j›ê1)N«‹*ˆrFAD É’÷›—âŠ!ùmYPÚ3VÁÝ~Hî¨|&»v5+,NbÆÅøb*gÄLröMQCrÁ@Jtüj'ç•Ùõ&?鬰¿ÿKîùTnáM†,Su£@ç\Ôô Á"¤€0 憭ñm ²ÃU(&A{ ŒuÃàp¬úø]@ríìC¾ÅÜ_¢¶ _²ÛzÛyhØyê”g0®X/eÝw|z3¬ûNwÈ$ÿùçRÓO“¹:™,¤LŒýb²k¯($Ùr.PºÊŠ‘Í"›EæŽ§Š²ô,D‡’·“ꀹl1zÀ×OôŠ $×NâXfÖCh^8‡ã¹ÏaDí‡CæžÁ4âº5¾lÆQ[ø“è.wØŸuD8g!§r©¾°”þõûú¯Ó j‘æfÄVlH ‡æº ¬]M›OZy¯CÒª°ä]XÄúºk„šeµÜ.ÙÓý’ýôf"·yûC-ÎÕ·†ßŸú”ñù,”¤1qÂ"”¤sôR'é8y•»6`+´˜„Ë;Jw¢ARÁ%:VII×é$Ðè²=ïðÿã:éhîùTnФŠÚ6Dø x›´õ2&åó ãGP\Šb(ègSnì¼h¨˜vÞl&”Ô,õ¶Žp®j(_ý]ßUïê¼|yn ¾˜îÛÚ¹Í$ú°0ü`|e endstream endobj 230 0 obj << /Filter [/FlateDecode] /Length 5700 >> stream H‰´WërÛ¶~¾þxFê„€A¶¿$ÅÉøÔ‰3¶Ó“™Ó3Z¢m%é¡é6~·þ;/v>¯R;IU·Äb/ßîb /dœ‘€,7ž^¸Òã"(> ‘—†ž`…z2‰:”…£I²C:u^9”¼ìlp³±s:òÜ2++1 –æÆQ$öÆ9m)h½P»08µ†F5c -ÊÖîPh¨µkrh„yäìbìÿ©síüòÞyïPúaíDd2%þí-„ëh9‚½ÓÄ¡s#÷»H!Ð.O»Ë6˜ã€Ò²èÂé8p´ÜãˆC#£}Œ}ˆC‡†s·èÀè¢Åï 1ÇÌò"',¡NÂ(+øä̉"/Š"âr/ x")Ÿ<}½k7OGì§ÎüJY{Ÿçé.[“›2]o²¼" ›7ð‚0]n^¡®…Æþw~$¥¤"’2õÉaß Ô?:£aâ…zb¬—ˆ˜|@µÕ È‹ =–$ñWdC¦ ^Æd¾zºÁù3 2.=dž)ƒ×09Ÿ;¿ ꊀeÈšˆª¸°$Šc|P²˜’ON$=ªz2ŒY¬òª¼D&/f×nžŽØm—B¾4]x\"§;K¨×袣µÏ¼‡PWøÑÒŸ•ÕËͪÚyZ>’_Aš¸Ô`K¢)ñ/ªr“ßÉ|>[­vçE•*Þ)yÎßðw¨KŒ£:†ÒHÄTÀwBô»’Ä[TçÙª(×8â/4VdZ_*p8`YtyL=2Füó,ݾI¡ÿ3xÉd1;y]×ÅåuQîÌV T꺸ʖ³“d ÄÕã6[¶Ö;ë5ß_Ô2C‰‚’œÌNhø.­ª¬Ìϳ›Í}Uj/ï²ií–?/Šmó8O¯¶Ùë‡Í:»7\l¬îøó]QV­"7±©c°<Î×»«b«×|9‚¼¦L.Óû*#h¨ä¬Ló›lªû“éP¶QÀÓG,þ… ýM8yCþó߀¬AýpŽ›6Àá§œÐHßʼn'D«•º$ôNŒÎËxزrš…Ûl[YW [µjk¯³Ò·lÃ8RÓ52DÐA×½è9q°·Ò8ÒÍUШn®Ô %Zò¸·Ú¶…èòЋW-Ob ŠXlûV¬|fèVQ GÐELt›¬– rñ5áP}ñDõ¼ç[ž?Ç2ê“Q"†í–ñ(PwÊT_•ø4–Bi )¬}êdUxBõZÜ2ë5’ÇêÌ ®ú´%ÔÃ3™5{VTK6ÙT‹nvÕÚ ‡-³;Tåví¸#n¥Ûwb1pª™[Û¬]uû„zbåæPkT²¶›àvâ,j)V½P»44Å£Åt{ž{˜j[=Þ¡¦®™ˆ>Ⱦ gèÓ×&Ó.ªf,mè" bÞ€B›åiwÙFlÒ!Ü‹×Þ˜ÒÓ2²ÒÕÇ4ô çß G­éƲû ”ÞÔ)ê!Ó4póûÔ=k¡ÇIU©)R ZNEìaˆêðv‹¢@¿Ý)ÍNcÜõTõ4S†S³Tdª¼©/ %‡pS?ºypÐÊéÕ”0/&¥))ž$¤EgÖ §WfŠÔ)cKrGzÝ}ÖÝFwä†;vÕÕá ´ ‡«"ƃN\Ç‘^ öTÀ¾”Ô ŸŸ‘ýüyFbŒÜSÓóÆ&ÇósÒc^—ÏH|^ŠUÕS]2|´¡zq÷ʼ@ài‰±ÌŸ EHÔ7îG<×xÕv­fûíêM¼b¬°k¤%±úÂÊ‘(sN;$ » OX«Åô¸S[óVÚÂ:°¹¤‡Û9æ·ûç OÍ%ž(ôxOÉÄ8‰\Ä Û3 1Œè@¤ ®]à€p «'[Ä=ýÃòä'[5¼2Tˆv*j,‚\CB`xµPÒ iú’«¿íž•¶ÂMŒêõB¥]°0i(x‹„&íFƒ]+íö»1m…Ý¡~·5P¿";ç¡ö,bˆS´$œ*«> C‘4m[Z\fÏJ[áNökÃð=f m(1³±1ìZÇ5A5›VØêw[#Òá)’Ù]3,´†wÕвQÊŽ1ÝUúÎ32 N8Å=Šë(ò#O”Ø(£ µŽ¬†}G6·7× B]ÏÅ$àÙaŽ61<ÛŽ©†Ë¦¸X";”Fðࣆ…º–#´RZ?iT‘qÕuGeŒ}ªÆxëî)€Û7j¬I(Q¨R½ Þ]¹ó–Q3*.‚(о"†ÔcŒJõ xºÅù3,â•ã‰ÄÁ³š~¯ˆX$¡j:"Šx ú‘dºE ûHs1!ÒDKT)^•z´Ûv÷t,`_È™¬7’0úz©I–rªÒßê ì%ÕÕu´ôgeõr³ª6Ež–äW&.:Ž p¡N‰Q•›ü†LæóÙjõ°;/ªTñNÉ pþ†¿Cs|Ϩ êQ¦ÚÞì§V /à=Z#n¦Úïìw%‰ÿ¶¨Î³UQ®qö_häªFÕ¹ :4—±‡Œÿf«Ê1#óòáþ–¼Ióô&+É’SN¿¼GÌæ"Ýn7haw·›UÍy ï}röWº%.aä]åù#æ)qÉ~ ±_bÀüj«U¤«Ûo9È×`[f­âëò 굊‘í!Âa:Ë‘äÛžòß‹Ûm¦X´ŠÃ|—Ùçª*³<ßnòM¶_§VaþÈʆAø'“<¿©2XÊ«‡ÒŸÏœ›ÞøÁgé@8qf^m;ùÂÝ?ÕËýoýûÐgÙížEm–©_D$W™¢Â^­?Ëpß_ª}u#ABc™þ˽ƒ¨MOi˜¿ÚïŸðn©iã!~Ötç÷³ ËÆ°Äd-ì+iàÒµÿã v4 à%Ì'ö§Ž‡OôÁ$ÖŒ€Ï Ü8ýs—º£HÔbSãf6®¦U/@³êƒq©»Q€[#š¿Ž[uºÿýÓéqè,ØÉoÃóäs˜;yÜ;þïyñw®˜!ôÄaé-°á‚÷g˜/þÊ쮿(vwŽï«Í‘Vü‹Ût“Ã`¨SÚ¯Y^`ŒñÿØÜo0[(…c Uºúô]žŠažÞoV­¸IÆÃâSFή¯ï³jªc@¾8ÙnôdU”^zw‡ ™ä@(«Ã7é)%§%9¾¾FîÀ}¹©´:¦ílÏÊš¿4ŒR;ºv£ú$¿ÇئF²‰ýlæÝ—›û»múh–ŠÅ7’uRáç9Þ.gI” 6bIƒÿ³_nKmcYžàt3UøÂÊ>*ÅE“óÐI\Ð3“®$• cwŒLÉrÒð2s3Ï0W}—›µ$Û‰[«¨¡ÃÖÖ>|ßú}|†á!328Ø­ÈàÃ%üñ8øSNð=PÁÛàãgœÂù‡;¼(ýŸ<›ÁÓ`gØÙü•Ø…§AþÁÓµ(ÍJfe¿&§ŸÔûÆìIÞØõ—|¿û×½¿~|BçïùŽgÝä´ßΦù†ñV–¾Êq-i8Gé៽øÅ·8yzš¯+|Åõ ¿/_/%÷ÁjÙ?Þºo¿ÛbwˆÈ³A˜ ¸ò5Ä7óÜáo¯¸”p» ••P+¯þ¿ííïÍ㨃[¾·ç“vž¼ø3>écò ù³eÎ „T†ÄU-qM‹’Éhv•s& é$&º±¡0rj¨¸W’ ´N‰µÈ’ªe ŒNJK.t^2”0Úäg¸ŽOŒN%K“‚¹jÁI8ÌMœÎü08YœÏÐhú"mU989ÒVõ´¥l}4`–I =š @Z ¯ Ö‚ËšÄEâzqy—.¡„5x‹–‡O„Ö¯!sUÛ\žÌU-sM˲Ùhv•)ÈÖp’M¥e£9ɆdC²!Ù¬N6XÐbn “JtÖ)ŽAsÍÚ‘[;$›Ò€- e˜W°v¸±Þx<°ÜY Lr¡ƒƒ©yÁ·ËœTÞ¦rgjAF^X/ ´Q/誵[®ÛÃÙ™¤I›†$ùEÃê5÷Z¢×¼ðÆ9d—ÂqbÒ2É‹IÒIôDŽ$˜e“¥ù ¤ J›%ª““†uIóë:IZ¦ 1i>&bÒ&1iÚmTeÔ?_g…¡â'¨°„ŠMBeªuÖ/C í·ÊKájE éa ¦ÑÖ+æp—‡ÌyAõÌœrR‹÷0·DÌÁ+݆í°e{é«|›ï•3„µ^ÀA Bá…¶ [áö|ÒLæòd®j™kZ¾ÈF³Û¨LA¶†QC8)Fºá¡t^Bæ°Z(NZ§Äº dØã6ùc‰É§da-!÷ÌIèMäëϪ}YûÜ: ’[Á‘¹$’ÏJåSg¡äŒ=°¥öÞ’|ª-÷¸åC긩Øè¡SÒj¬öXLBi3p`…0ÚåÔ€ï®,¾¸eæ¤ó¶°UH¬ì™qÌòQeï…RL, ×íáìLPòJT¯kF ©ìîr¼1®Àje"ÎÄjx¶a;‹ªæe îßo•Bžsž—ÐÂ+Å)¦µr8¥!÷Êx*¤+í,ËÈYÕs“ž‰õžÒ’ã¬8àÒXîI^$¯µË˘Ü]Rzãyî.ÇË_a’sM»8¹«Zîš0¤#ÒÑì:*sͤ$ÊšêZ„L0HM¡à^PzZ«ÄÚ $È@d 2huR‚XÈãÞ Œ ¹wÎyFZ¯€8&Ñ5+H’‚HA¤ RЪĸ±§NØPYÇ!1Í )¨ò R[A$5 dNðn 6¥È±©…s+weBƸ€sÖ2§ÔÂà܆΄ý¸qCï²-tÌi¯`ïH+ ßWÊ8‡P‹”ïZê»k“SqLÅñ”gƒû÷[¥ÀçÆÕ‚:CÊ+•¯U˹T8£¡âÎ:*•«m.C檞¹˜Ô\÷Zb^óÂê:Ç'©«di’¸H\«—̽%Ò^â‘ÐL)—‹ Ö¨!qU\\öq‹‹´S˜9ICn’(mŒbè!+„!=p`š“×›HÛ2Ä @l‘U5ÌJàÖØâl­(“Ü*™TJ”Cl3xÖM“8í-‹(·QäÞ¹ÄÆ¬]\^ýÞ¤-¸t²ˆ6õó3¢ðȦÝyU¥ÓœãCD¹KiÕPŽÚçPPÜ"¥j‚¯³zúÔN²ŸvB¯·i]­nÚ¾ê&æÓ®A# ?Õ6ª$NUS…€K£¤×ì¦ç˲õXƒÓ™š M}ÞýÿëK#Ëe=µ4nv =|¸y2JN»çí«¸ìÖßñ¤ ž¼}¼{ÑN]ØÑxÎÎ%ýógÝ‹vœ¿ÈŠñ÷¿{ÿ ~èfQ9„2> /q6ºØ;‰:Øç8=‰‹wŒ:“_úµÄ¥Í=ÏÒ¸¸Äo5ö2:ñ-{Ñëññ[—®u!NE#Ê`R“‰UP ö*ýñÔÁ빿Åi'ê7ïµÉ´ýiŠq«{l§<ÄL©Ãn/ ¢ã3XáÑI+‹ƒƒ(Éâ ×÷ú¡êûäûf³gìÌÖ²ÆñF“S§¤œˆ$ÙEÃá¨v›½l€Ñ;íó)ññàîÄ} ÅžR),ý¬ãÊ¿9Š¿©½úpÈ«@æÄï ²ðæð,}÷¯esÌ´ &¸LÖpk apÖ¤c2à¡°ÚNPÛü»©`ÞËþÕÕeð6ê}]!_ÆÀFòéèÈGå×á½’Ùìòi…‹T÷˜w3V¦*ßÈbby:WÒÜž½1U´8:iŰK(̃v’ÄI ƒF®²8_¼¬%ïßëýuïó9Çg†MZÎê7°~ÓàU§ûý~T?O»G­è´û=ŒÚåŒoj:D—•õùÏ…üÙI'­ÝÏñ–]æøêณäãÏB;Š”Ý‹è¤6ž1;ýt;å?à~kÇÍ8!žm0϶#Ç,Lƒù‚Â.(h·0o´5õ(†œFé×q˜ôÒT"äfxÏ·8Í÷£zµsxÕÇïjuÓ«òA…V¢žpFÂ/§$Çà‡-0ð½[¾»&Tn òV·àüg£~'û<†ä£öùEg„äÛÛåpð¦žC>˜Ãp"»§3@êæéL½ Ì;L¾ã¥t¾Î¼àxeñ^þý—7þË‹äô—4Ë»ÑÃ3Ï|y×M)ÜÝNÎêõâô~ Û´uâ,‹ó®6Žó–ñg÷c#êõâô6_œ|Æåó¡·sûìNãdìwÿ·ü§8ù“OýšˆïìG¼Þ÷*úÙÿ%1¦q6M ‡{,xÿö÷ذ•£“¨õN¢Q#z°bwŸíQÞÂÝ¿ïqÆ‚x¦hh¨äZÑ1¿›À«o÷ÞÓµgn´q÷"6ÒØÍÁp¨¯|VvÞ]ó—_Îà¯í^6¾öo,½µaÁùº›¶¯ºIu€„¨ß¬ §n/ ¢ã³¸Ù´–ÅÁA”dqmr†¤it´F­Ÿv­ÀkŸjµ;«,ïãOZÉ·rV\:º> stream H‰ÜW‹RâZýÿ!6òÐðJ€Db^DAÄF9$„$æámï‡ÍÌÍI€´m™ºÕeÏØUVÌ^gïµöë¤ xŒÅÂO1M×Ðcªm›Š6Åb?–ª¦Ë0áþzª³©º´€ò@ ,׸"æ#×npÀFÇŽ ­•)Åš&xÅ îc¿Q¿F˜Õ‚"ÙŠ®seÜÏE%ÍU6¡¶ÂXªªÙ»tíWcM÷sÝ/ÀTÀXuC~*=þ™–ß)”ü¥ÐXD³ž«¸G­Ý÷VáeŸbûÐOµÿ~y’cÙúro{ËûoZù÷õaÁKC…°AÚû¶ãoŸ Äå¢òÿ0¥Ö䯯íá?y[ª"ý¯ïb‚Êœf°T õc¡3¨LgûŒ–üÚ Lžæ“I}&ë/E¶gû¨Z¿VT‚Ì}&èÇ^#øåBN‰ ù™”×}¤¼~µ´A8]ÿ…Œ±n£Ï€:œØMS™*Ú>ªÞŸù®|o×µuÇ” §;šüåw>º™¾šÂÚ@FŸ@ÿ”Gþòɺä,¡¶×†€½Ã ŶUhBŒu&ê¿ÿe9ÚtˆÝiŠ„Înü±U‚À„õQ }Ý8&ª¨¡MìÆ„´±k??è\›ø@ݱUEƒ˜e›úbÓ¿ ׫ù1ýšâa¯d× c«ù —ä­TÅ~Åêðª+dú6ü±Nóî M`ÙÐL¼@ÉÖMl T IŸˆ”TÅÀ$ÝýBþ™pŠ¶ÑšxŒÈ&ÓÉt N ¶*:ªºÉlš‚#«Ïµ'9B™ó6Cw[úwß;›  ÕK`#×u]ª[˳ÿlkøX”hV… 2hnÔŸñk¹—€Þ®µ£›™]¨:Êj ŽêJ_Y©\.“ T˜öX¦ŒÒª¢2Ø8įmºS," Ôd”ê_‚š.-PO`SSwŒuus>}—AZ3¬å5ƒò7p“޵ ŠáØ>é™%O?&M"ïî‹5¡¼BfÒ;<šŽm ¢¿fB<Û&Ð, m#½"ŠŒYÊßpOÛ4Z‘€¸O±¾8b§7›ï ±Ä*²bƒ±âŽôzì·²Þ/£:Ц˜BìF76%|;Nˆ†ù¦,C·ùö`²¡$ßÀЂ±Þ¼Zk±>éq@–ýÙa«hµÚº_²÷}›Ç ` Åa)KGÛ2îÎûE âÃû‡=;oêkBÀ¢T¼Àw³Kc›D2íý` ’NdÆ-"A¦7oIšHÒîËc÷‰‘T2—£)‚Þ®³µb?äv‡¬ÿŸ±f¼©´`µýœ]Á’nÊP~_@,u­Û;æ@÷´Á l8ª­ ¥Ë®³a±ªŠÚÜvósö¦  m.§l"²m¾Z=Í Ð½ ]cö¼yÀK½³hôãµL¤™àób9+LµÃšxEy$­#êî²B… ÌÝE¹‘=/Ô¿GŒéH´X!§a"› ¥Ó–0¦ñôS|Lž0¥¸a1Ö™:3Åú¡¹Õlnzy[gJYØæ•³²$$“Ñé»PuùÅ£1\ ¶0rÙA"Î.õº…òcÏð2rD!{Ôãæj´w&éÚø§ÎŽèü„îÞ>|g;|²ûqÐ ®0dJ qȬäâaGŒ]È“ƒ°—,qôÔt„ɰGs*£ö nfó3z@ì¤c$¢þ̔Σ½•DÙâ§:zŠ< U¹zÈ%NçGl;ÒVú@vÂùy —*Rî6ÆÏ²OÅÎDpî:>Â>z'òÐ9)wk¡YQ’ÀÂ}Rðʤ>[E&Ò)@›ÊѨ <ÖdN ŸG&þÝaëíȳËÿ˜)Öf™ƒ0UìV“¢Kü¬QLÑËïg M§¬I†5¥*/ „ïQjV¥ŽBº—IË…OT_¢qKÄ!§Ò7Ë•‚ûz˜á«¥P¯Ïç,T—ê*Ó¼þˆ—ºòC‡†žÛ²F‚ÊÔIÈ-ÉÕ£n57OenqL%Ö­Ù•ëibj)PŠˆ‡øÀt£P®áÑóâAÂéñ·jÖ{ÆËbiýTêU®Vp>^­œ‘÷dµn?—Ë•8)œOÏÖ~zg¥¢<¿~ô*éFþš\n¸šO`¸%@ÄÎZ.f½w¹CNxòR-@몾m$oñó.x^ *S§€)vìol§f;諒Él ›BôÍë6šœ&o„+9<%G¥s!-~g2^ ”F%Q@ÝqÇ9=ÿø¶V»™ vSˆUçœÏ,ÇËÒÌS­~Á>Õ¯cJ¸Q‰±ÉU’M—:òøè±´"²›Êiå¡‹ÇüŒj-*x=)n; À½în˜vEv;”ACµŒ i¡c~:«XtQºk±ô€ì½­ÁÍ¥ÚÝñýí¢’ˆó?+I~¯øƒ0ÛiÈ8Ú0å¼ÀÕï?cë!¸‹{z‚†¦B¦É‹lã}çØ7âñZ…Ü€ÄË£ÄAx« ©’&bEÈÑ•hv½…“$.»q/¨'ÜÜ–—œªuu¶3ë!W¸ïÀ¨ÄõkRŒ$è¶5™Eѱa„£ðúlµ-…Iô’BlõÙj VºýËÍ G®†ŒÈLÏúî‚ ãì¬ÇÞ…%ka[õt®&JÞFÛ^(ÊÖ®×Ò%n3±tAÄ»}Ð:Áœ »$°¬‰ôØ©ÄΞ{Û›æur̦§ˆl¿³ŸŽðbÕš -…rá¨l{Tã×Ö<;bJ—|AF]´êŽ8OlÛéd·VŒöz±dL©ùíÕ¹¦¨¶DŸ Â6c„¢¶T̶Ùnæðþ·ØDmgîÌwÎùãîMÅUU«ÔlYë3ÔÏäÄü!‘¾ìxYîäpÁsâágÁàBxAãåþ©>©Þ\ž¾ôåI9-èôoùö rÂ+áùÌZ¾Q_Ã_”þªh1Å"-êgÊ—¬k?ám]AZ¶¬~ßhV sÂ2C†Yë©g¢¨ßsº“Š5Q i1}Õ/©åûÃ2ÓnÕ5ä¤òêeZÚ·GU¯vªG ©Òt£`!±zäË71£~X–‡´U’í%D=:೤¾qÖëf6ŒH¨±3Àð˜n @´ˆiÑù¤þ*¡?Ò9°UtÈ=Z¨fÿO-Ó¬±ÆûG´Uã•¡T7¯(y1Òmúò²D¡W=пÓò\j Lï5MKÄVе C C½ÂàÀ¨Ó2„C˜åÇPFHaG÷YüxxE!PlUëùb4¤ïeišµÿX®€Ÿ)V—–Y®HË«›Ö°>õÕOˆ[+Kv¦§seÖ¾Ë?.Ÿ'L£ˆ(¡´\F¾@ÍêH~eãÿC­©Åˆ"êf§Õ€©EY‡)ärôÈ(1ºÝ<å^¶a"Ö9DÒÁ« ?«öS¼ ®ñåw*©Sˆ€ãÍ „ˆ•©ž½³Êo&SŠ›Ëg—:!-,%~«ÿzK²²_ï×[ƮޜÊ(ë%ïÈKn§ºn™_ß›VÎŒÕ!fº¤›V¤Z“Ë7ìZûð³ZIR5|7ÍfüÑ›ò«]Eg– 0£ ÌŽX Ÿ– ƒÁZ ]ŠlAv.¡¼ÀÛ©Ýžü·Âéý›$}éXíQlå»OƔҭåƒoWç7gxÞ̉ªc#á<;K$ÚØ‚%Ç”Æ54+ë¹®"Ùž_l)0y:Õ³?‚»A‘«>ØnêRLóE fJÙ7&Œù°™GÜñÔb¿Ã•4•-=D¬ ŸáFA£ÌüdŒÙyîpŸEœä>©âÊï ßœÉļRfuªñö÷5ÍÐ{ßI7j­.ÏzúAoÕÀptá ùþ]Ç+§à®p——ßk~s¾ÒýÏ5ë€ä©ËeÝysÆRÕ^)Hã¹ôLYó¸DæKÙâ‰)2±;ƒ‡ý«í!à M¦…€qÐŽƒN9?uy/yÌë½9¡]õ`mò/0šT/LäŸõe%¼ü\¿¯ª×bˆR½°a¥üæº!X)0ÒÅóHtC")/…¼¥Ð ý„^s+A¼˜]Òág˯Ç$7X9e¨—Í•|OKŽÖÚÊ4¥1¢Í+çÃÉ:Þ”\¦Ì„ê:n7CsR¼²· ßdâí`À<@ÙwÛðÒ°ÑDóU19UÝJRjãnTÒùiží±W®=Ü‹ûÒããpd^Ñ&òÃ¥.–¨ÍÓⓜôrâ•ó«5wMÕVé ç?ÂÐãaºçÇ…ý s+÷¶j‡yÄbö+Ì’êZe9⳯å»9ƒ×i(²§¨N!{± 6Ÿ›dêla‡"ð „·wJ­¶ò#ƒÕr„úâƒ?3ì®7I°–Æ‰ÝÆJ­Ù1¿ywÄØ1‘>dKÇé ©óY•Ba¨1Å Tš9Y™·fYÆC]ä]éÉ/j¬DÎBÜ`ys=Å“Ü^Üm˜û“>}\‹ØT`î£a­ÿ12£r% €²Dô@H™æÚt‚l"Ú8e¥ÆUP…fkQ™byz¼âóÔªYt|„K4’é§KÚÛRÝvé‹Ï°7‹5ЉíïTª·\QÉÓeš_ǦéŸZ¸ˆCÙÕ×O¾þÒS•晆(R2…]uïË& EêÊsgƒ¹¯L1³KP´J@œà !vÁ!ì®ô‹f* e.†§@“Þœº#V‹ÿã¼Ê’W²è ØCRàÁØ< ɲ°± 1“ 4¤maI)4úèè-ôzÑ_ý÷þ{½¾)yÁS½"(3ïÍ{Ï=çä^ŒUUõyÚWŒE0²-ÅX>ä÷ÑãáYô¨À€„J1¦ØØÄ^6à÷ Óbà QµÏäúZÀ)Tß2'Žª6 9[köä:93xßhó\ý!ºµãwÞKEcZN»¿èå4ÕJ®õ+¶“Üy •˜N0gÌ-ηö1«ü80íÎc‡;ºÖSÍžœ™Êäü’×®—?_âžKPï†èGQ²»Ëï‡d^LH€ˆV¬²|2b*݇‡øËI¦à ?ñØcçÕ=É ©\ã¦SÙr:ñ¯}K˜´a_À¬Ú¬&ù—Z ³Bè²ùf¡&Ww )}½‚aríR:C¢RQ$¥ÈÂqž­k»=hDù¥Þãå‘ë߯ï˜6§¤\}™—÷ÉaPÖ+œ‹÷ÄéÉà~OŒÞ ×ÅÆ`ü„=/†¶ñ½Ýù9åkíƒ[m‡˜ôa¹p‘ëuÀ8¦.f«O¡Ú…iß=ñE.‘b“Õá4òr‹¸XbÛ6ålè¿m°ªFÒsÐ õW(R=xpÆÜ„zÅH2E¸J¥Š1ÍmÓå†ÎH·¦s£ Ùñol„xµ›…kÎz ÊÎæ*»ÜÇ3Á«‹|©p4·øi‡WØ4<©"5ñû0/_àõr N¢o€‚DƒgO\–pe¹aƒÕó™zà®Ã4ò· PÊ©À¥Gƒ¯Ûž¢É¬xdÒ—–ÍFÒ¯»€äf[ÐÁè˜=Éò'%J:æè~çДع“šEb›åž§Æ©˜•e©í­;±O€2^nY5r úryÿl¼À /3Së0áì)ËO Þ›ÀɃ,™|;Î\º,ǾŽô]¥Â]ݵ.|è>OÖ¶©öK1œ?tž”äùÛ~®(5öÎ|U¤‹`I)ÊsSù{m€^‡"À:ç·ãŸ¿Ý ÈÄþ7èÆC<Ýt 5øõV¬Íèc›7¢;|\åª÷æÉ{¥ËÖüÇ*? ¬ŠÙì¥ý&‹_¾šrcV»­T¯ÂÒÙ8ã'…ÒÔé{U†KrrñຌWy<šãbÝÅ6Óå‰ä·Ìèâµz‘ú¦u¿H,Ô}ò®üTùis<%¥> ´?æ„.yå¢ÅW ŒtÓŸÒ@g%æ¦R ¨ƒ{—)[¦9Ù¹¸…Š9H~^^ßIÞÎ&ÝÞÕ“KÎ.Êù#÷Ê?Ÿ3YYS/ÝWмe)nÆ*ÀYû…1ôÞ7þî7ÀGÕø°@(‘¼íônóB¿©že|ñ¦§¤Ò Òâ®¶û±ÐÜ·ØìœÈè4ëð{fùrÑéÔ÷³Ï©Á#ÀFäÞO£Ð+W׋’óMÉâ³mzûìV`Fð>n¨?^=¥ïÁ`¬?3ãa<7‹œë«—žiî^½ìøNýıðìõÆÎØô%îØàØânñÇèx<Ƈ8^¾ãzƒ^lš^È='_ÈÜk\Y ‡½»€’†¹è]ÛsžmC;_9ÌŸ„çߕݳû/kc“>xY5˜íaœ+ŸÔâÜîc6†·ëg‰íÂþ1ØÝ’E­Ø)¨ùÝÁEþPÖ‹v°|vš­u{§Ö)¹ã9ûa—i’‹7vî½ìžüí|+ðœCa¦|GWDD7†­ÝBœ` {è¾F9E¢ÿÌ”EÑkb7±DLËîçðÿþñ/ó¿ßCÑŽ®HDÆ-ÛTô G~‰Ž­¨¢TË>²$³o¾yÇÆP´¬Û —IÄÑmo•—Ú1*ë#TU,Ñd6Ê+‰¢M,¨óèYu޾é÷-ló&ÑÓ~'æˆ%¶M4ïàã™M6ÖˆN¤!ìÃy×-A3T\QtÙÛy‹-ŽšA7Žm86j –Må—@3GMlÕ¡?Ç‘‹ª2‰] *1ga¿l^±õÒ> D3LlY°¡áªb¬ÜC}þƒul"âØª¢cdÙ&akå¾8W7I_QqY—T‡¬U‘Æñ~¯1mbxÛN7êŠï’³¶„Wƒs’´×"‚u{|kAÃë«[‡ˆØü‰É$¢`W…lŽ‹'Ö´eÖв& 0#’Ÿ„t±°¬£«ƒ~‚Ñ稿מ¦2Ú›€wþªŸ±û[*]VèÞ² Rú 6§©o\°:6À¿¤*’ÍüdâeÈ1*W^šâry¥×_Ú=„÷Ò€ï.Î쵘Œûî«ÿ(~@·Q‹Yª†­áŽú=|Tqß^Ÿì’Éó'Zi›L7ñÈO,ÙÄD¢  º„}Ìü[¬þ!ZìáÊ ŸÒU‘ÀÓby¹θE²˜5¨ðÃØ9n.¶lEwÛ¸‘Mæ𷙦,Á¿6ËT¦§¬÷Éxå%¹åHl›ŠF‹ÖÅ>†Úœg×Y•Rh k=ý|àµìãnr!RS4Ídù}ݵ>6^•6sÒÅâ­‚ß×ϦDþy\ŸÌT¹W‚ˆ®`ãöÐÑD]PÔq-Ü‚-dA™¬`Ô²]ÀÛ):Œ¸ª:úëHÄŠ†ZV¤!6uÊð|Š‹$¨‚XŽŒ æÝbóë ¨‡C £¢ÿèCß§_‘wŽeüùOE¤èþ pîþ†×ˆ?¸%Ã$SÐ4ô»!ö,TRЬ2ÊBÚŸÿ–†ô‡{ýƒ¬þGµ•žd Y¿Þ±4rx©8ºˆG‚UO|´1H¦blfo@7 J= Éãß¶)è–!˜X÷Adõ¸±ÂÔ&%Ö O4¡¥üÂ+Ž{“/†Z×ÀÔ§P+5¢åˆTÚˆn7é0Œee ™ÂJQ™³UçOkw=™†ßâ[à*ÀŠù1S‚%Ù,2þ6þÃÞ´ þ§Ô꾺 ˜oì&6Û7|E*ú  ‚[geò8 ?úy`R°ÞêRIDU±4/—ð…Øžó*L¿{ßÒ±ô$_ZetEDt㘅æ°Ê¢Ò5-á'®90Ý 0 ±"œ& 321å)ä;z%"ñƒ¬'é~‰3'ì“8¤D&#LɉšWbéLÊSòâh>w×û…)#~ /§ÅѼµê‘ cÜô{ä©u›,õ fôÖói¬ß§ù¼éd5L?p0쇎 ê'kæš»ùMUŠZ(±»© èý²i} ŽQ±ÞÚ´ÿç¼Ê×Su’èä$ƨQpßwÜÍb5ˆ¸DxsçÁææÅ¦0¸t£ßüqï—¤NsºªºNU™`|N±m«¶£¼±2aÁ:ôÛ„Ÿwü0Äæ©ó1—WÆËçÔ¿®´+Ü’õžÀË #Ϭhîj,&‹ðËj&ÈᦠŠòÿ¨9”hºH΄9ªG1Gâ‹Ô³ðÒï÷/9£Ì6À,J_J¹LŽáx#»t¥©Š¢’+¸1’¢Ý¡Î õÝÈK$œ‘ª=)&)Ú;Ýt¤üóûlì~ç`Ë#ØILì˜ÂI‰³_ƒ©Ê[i'£¸/@c±¼ÇiÓ•¾ág¨‰Qê…æE•äe è±®)²îpUˆüÕí©ÈñÖèÏ$huFÊ*¬[îÌp¤i)«ÿ¶e4‰ýo!ÒYÁEN!—âþàï¦,6kR¸©(\VAƳ„ì|^r$M_é¿/³@PPÔP›ÿYÍô噫+ DVöZŠƒ©æøu&Q¦op,šþÎÆÈàÀ)·@=í)Äà_‘¸«,”çÐûBÇÂ7pÈ=¼õàß[_€Ý»õèý[£DþÐÇ­&”eÞtêx¶Ì™¨¨s°.8À„ƒÐÍùYh$ÐL8–Kº×üOÿRHõX’Œ†B../€³´Ë^Pa²qš1Ð࿨ÎTí°â‘ È€íVÍa-â7¤b­üæïÚAm ¬/w2à S™ãð.Æjþ–¦¦Ð‚›£-$É(ƒC-ûáúÊ[•_ºª°š‚Ù­¤î_‘ö<\³>6\«ªÿ4œ$m7âžÑ`Ø3%Çåv?8uk*êâ|ã«éÐ¥ñœ(ì¾uçÐÄL"òž©á%Í)¤£ƒEVZœéšþ×i”±5ë\¯QwºŠº²)c)Ab´ítçU-_¢ðGnº‚»…#D þqò *ô$gŒHCÙåvWF'Šî’› ª 9¨”bj”­P ÔhÄqz°æbÌhŽJ,+¼Ã a4× Àlk•ëGs¥ƒqHûâv.þ÷?ÚVZœÙÖÀœKØí­Ä_$ š“$ÙÊ„+ŒESc íö;õ•dN›iµ]ë=0 ×§¯Ño»h&M„˜4CQÑOÿ™µ¶Š½}µ€ \,Á?“qù4íêÀáÝõ°ºÊ+ÞBDwŸ1p`ŽØnÀðîê úVq±œ´Ø‚aÒÕ‘•íQQøJ§ïjï–ûMeY4Œë¡ájou8¹ºúF¶g4jðÛÒÃð–`5èJ»Â-Yï ¼¬Î@ñ™16&peÐ/Û^¬DÑ¥­W X{$‡&a*PUàõÔËh9¬‰œ:»¼UíNìù†»Ø¨Wð(O`9Ø{{)5Sq”Ñý\Y9?IVæ4A™+ÏC#5©H³Ý³*s:ÿHÓ“"X>$x|g» ÿïÿ&ý¡_j4’±²ã¿ÈǾÂË4L…Í@ °Ô#ð'&ší¦#¿†îïO†!) ôbyžª­ëî^Ž+Ï©aþ×Êr½ø’ð…8?áû¸»¹òü:K›o,œÌ @Wˆ S­Aÿ}ŸŒ°)€¨·Q-rÓ5î-´¿òTýë±o˜ äãwî² ·•@“}-?5ˆþÎZ^“a-V¿ò¤¾µ\åµ(ôîÃÚ"›uš©ò{¹°Ìè$Yôonû¥QC,W>¾}÷bDÉßµH/óïʳç¡WüÁåwð¤ºö½ê¾º„¿-×rŠÇv-¯ø³ ¸÷ãÆr’ëÜ-¯¯<Ð¥ðs_9M„’–¬JÆ—ÞP³[Úp£mßKýÔIÀœÜZAe´æ.NÉZä5㞃_k╜–w®³šªf´wu”é´©p´ïÛO„AZ£?£oK6ˆ$-Šu©áK²g¾Ã„A‹ ªãpàMÚ*úÝÏŠÈ¢H5÷8^4HáK>ñµžï&¤4iÔÿÈðí&ŠTÝ~¥}wž,ñuD X -U¥ YL€ãî›dfžÂ?©ê ØEzz]UÒžöªÙ3òrâ+UsË,–ÔûÈF›¸ð>«Ÿ<óIý6)`±²zýñÄt/8•O²š¾É[¤¯÷è)E‰šh‚jšVIGêèe }9¤Ý‘¦'±çÙ"Œ$‡-,i"<ï{H!‹A›%üª–hhÒNb¼{¿'¤š7?¤1¤±¥ß[j†Z"|úGlfÓC’^W¹˜û'¾m¢H©êS·xDj°XYõÄ’±†t8¡ªò`€&­ÝänYaùŒ$­u“/ *1®ß†ri’V>×Õ}Òìµ_óÞðÞÖ'›ØÏBÒ„bî«%Å6Z#‹tò½ßDŒ$ßѤÑ÷"Ånº 4iãÔ~’òI›v´- u,éù£1¤ªÏþlmRàËíSdÌV«I:h¬XÒ~3>øÂ‘–ÁK~¡Æ)´¯lÈ=˜Mî2HÒ—qNÃ’¾ø„‰b“‚7v@Û¤^C…"†´x½Oª%$é{p0Æ’^y¾¯lãëgœq_4iëyµN{ZA$éxü6±IA^ie¡à[àH›ÔW…-£I«Ïôõ›Þm H¯<ªÚ ¹-ÚiÄT4Ô]%b’r×zí hˆ´º”(H:Ô»;1Âþ¦Foïwëg‚}σ8kŠ?g"»ˆÚï©I|’ÂX'*MÞ=Å0VÎG§¾˜&6bS7]¼W1§§}ú©{ýˆ±ò2ÝZ3+lÄf~zøýt‹>KƒLVG[­Cxý-ÃÊxó¾ú¡õ ë÷y+b'ÚÇè"‘>þõ*ïKœç¢Ÿ J[µ€Ž €/[Q@ÄÄÇ dùþo’nIIÚø'?Ç©w¿çœû†ýo%~ÒÃ/°ð¬-/Ö·:þè÷Y6Öƒ˜Ts7/#è)æ¡7Ca×Áª¤JWÉR©÷K?FÕ‡ú¨_}¨]&ÀïRõJ9ñ·R)'›Qüz{’>`4ÝæYÌ(èÔ¯¤¼tÆ6ö%Ûç_J*YnánŒ<¾\Z—ª˜üWxŽ€ ÖÖçÝ|‡€ÛU0­:qDàCè1Ë-Btxé,èN³£!Ûi°>KÒœZW¸t0”Çi .)Ëé“‹S-ž#ôØL–E;W¤þ-§Âéyªÿ Ó©öA”7Æf†SABnÁE¨&°\I§Hý3œž‰Pý?ÒfGzO­­4ÝšþL3"õÏt ÕÿÌáî‹ávNËÕ¥Ûîíj fy¡¢˜ØzÌ™kw§«b>f¸G?sžçøNçý .‹ÙÇßw‘ŽþŽéÖ™–íôÎêÖ·©™2®Ó?í•‘†ÓÁŬ¬½ñWjl Æ¬gŒ „T¡”`Y—ø>=E¿ ‰žCœkò†ÕøÏ+˜ û›SIBlç/\£}ÁvÄS…·_}dú»)°§ :àŸ²d<Ó!¦˜¡•®½¸àãqU­ý^#©™1 ¹X“Œ'Ö^èÕÑŽí ÀVˆâu/'_çU >à²H+¥Ôµ{PÖ'zH±ZLŒzª_†øî‹Qô-GÑÑcä×QF~€#?³bD†èé9:èìÐÉm¯þM¶'(t‹yÕ`ÚCe5™Q,¾þ!´¼ˆú,{.b4S‚Ä1î;î–“e϶•ÎÉJ½¨ÁoåÝëŽMòA•‡ÅJ1ë.HÞÅ"¡'±ØžQlI8°²7{!ðv£ÓÐ0VÈôDd4•¬­Å6îñ lGQ;- SkW{¼8`Ûs+õÓ…’ZIm¶xSÓ1yw0FqÑ=5ý™wrq¹\Òk¬u>QV˜ºÈP²’õ¬èÃþ§–š¯ßq$$H´nÙ³cs„.¨s®5e‡V'ÚTÝ?Fa&l–NÍ7àŘk’õ …jìyínŒiJï>¹wêrgïžÓß93·›dÀöï¹k—^N¶ Ðz혅IaÆXLëéßÛrÓn'¦”ˆ†ÂÇ>» ÏÈÄ@b6bå°x0´Œ2#K½TcF’w]š #»»4ßlIö{§%ïç+wŽã€ƒÅ@^Ã5‹˜Øš‘2‹šU!-׫ßþÎ4uR¼ê ©‹ýd+ð*Vá9Ìè~ù!wCÊŠÇUÒY!‰.\i7ƒ<@=ßC®ÂBôÐüx=$þ¥æÓÉuÿ(ÆÞæ÷LS‚äÓI(œqY\I{Q¾‡GJªº£Uì%~8Zňæ·bÙX´â¦øí8\Óåá&QÕ±+à<Úÿ$Ñ» Z:A7%d®8† lªV ½´•h)\kzÉ}ô7T„ÑÉÿ™ÐE³ìÕá<ût¥ÄªÎ$Áq¤éš‚• ×}áiÓ„}µØ^¡x W i‡¶Ü«&®kÈÛ0ÿM§¨MqíÂv´Ëð9±S$c€Œ¿‰£ Š¹FèÍŒçí À´Æï £( ó{ýð¬y»¦Éëâã Ê i#ú¤a¨Âêúhðv-H)º‘ß&ª0ó$_EGZs}0%‘ŸœÚR¸ºQOÊoõ#ä·~MÛÚÒs!‘Œ?ùßsÚ¿¢öøí>Ÿ±¼WœV,”$q%Ábù\q¢Xä‚'ì·¹òó†\ñŒ—ƒQc;۫0N¢³ÊÐ’Nu - «C'-k©‹ªS€gQ¹ÜZYUÀïŸÞ9;·Îâ,õáOH„ÚAQÔ:Ÿ6ÛéÃÃwlc¿·å¦÷¾ÀŸ)ÂÃaŒcù¼0.z(YÁ®EÂ4+¦vNüG£wßa'z”¬b¶¤Çöµçå=à ‹ù±Ä$jVÌT½‘ÈîI9«ûž»vÙœÉVI+…vÌÚ0 ÂcŽ»koºqi“ïK:(º—r&§“¼òÓÔ–Ó˜ˆN—ÓˆÑÀïò2NG4°/.Jb88¢Ý/É¿‚gc"šÅ•Öã…h÷ ÿˆ¶£”Róõ{æàÝ]»89ÂîC;1ÞhàŒ¹ØáÁïh‚t;äæTßm+É×E´ XS„«š\‚ ‹’Â"7>VXSh'ÅTú8˜«ož‡ ‡¿ãi†›µÇ÷:_À];aȯ2Þ;@ìþ~0«ãYf1µÙ:fæ-3¥û~{ObwÍ Øa<í¸K{¦‹+-;¾Ï9j4ÓÒ°­@ÛË åiwI+ÆZCdŒ½† }OãBÈb §A-êdÃi°ÅqÓ8õ=eH‘R:œ ¿Ý¹PðÆÀ˜·¾§q¡u%ÆÑ÷FOÕàé1Xll…Å€ñêMò,ì¤Ü­¼vTw6tçBaÔ`|O6¤sa>C\Hzɇ}^:²Œ7öFë ÖÞé«Ô|3H&ÿ‰ùz<´ˆ‹}ŽÚ¥4·’–?¾C“Õ!J—Ädhl¿í¦Åeï¶~¿0Œy«'P±3ŽN Ì‹ìå=÷¥Ê¾ø†H˳Pž˜®œO2Çz9Ž´ty8Š;h üîÏšç®ä ¦‘-ÝuÕØ@YÏØÀdvþåák€«”nË…T–JÂã6Ú1¦dúÜU§.}Á@>†±Ž¢°Œñ 1š²‰eO2è¥Öùä5ÆXöç5A‚% K h+Ž­b´EZiލGÆfÿ©ª„¤ªR[€?uƒåªW¿Ò\ýÙ—ÂA‰8~Û3ÀÐtŠLòá1˜P™•w‘òJÀ#«©‹9Å#KÏ‹÷%rMóHN'ƒÓSmCJ*Ám‰µÒç•2ü éEQŒmøØç•xâƒG“M<ÀIy\Y’2è±Ï+»Ú¹¿ÙNNë‹Õ˜®Tl‹¥€·rB‚ú…Toª¸ d!ÁnŠpÅ8‘‚$’¦«U:û÷¨±YHS±õ^9YB;mÜA±!Õtxe¸=öÕ(ÖžŽ¨Ín|§ipw²¬¤’\QèmEÙРº?CÞDÿ1tïñî™;>šžé¯ÉÐ7K­œ R#zŒP¼†«xÙËå«aýiVieåçB5¨99|%t4³Qç •Äî÷µòl5€—§·æ,nõÀPG” ¼¤^³Wf,là¼tÈ‘ã Ã¹È$Y.„Éò´ tYà@‰,7i²Læ¬éT;°›¡r§Ë€H€‹ôDõá›)¯¥WIÑm‚24¯‰‹,ìt^jiqjT2ïK3tô6ÜiÓ-Æn9׈m”PLuɺì‚=ºÕ}?0Xús°ù¥À$Ø|“Dçí<ÿ(ïdÞüº™®-ÂiRäþ&iMåÔxº¿Äs'®¤¯Å@Sù®x[ –u/îâ_¶ ¦ÒiÃNæÐN™ÌÆT¯ Ç ÞÅm{좘Ò$ûIÑNFV}E;{ÛDãòdd'»“¬r,+¸âó9œwKñ¥Ã3–W)0¥é¤±)A5ÓéðåëÞSB+49a™…ídj ï7dx,Sš¢ìòÛÅ…òÕ(”ê‚9‰0Á™ÜOCÛ?/à·Ê„0W‹}›r&¾3‰NÝIe&~1ff­Ê$HSE5n‰Ø2Mž±Òfàý+¾ @*©û° :¬tdÕW´Ó›Fp˜%/BZ%Z£åCÁë"éF;¶ˆÂ_ŒƒÂ>&{'èºjª\ÞDü{†ÃÚÓ¹@wƒ+ÆÃÞ4úRÍ{3g֎ƘbNŽpñƳ·gãï§Ä¶Ö †ÐgJ›Úaa$õŠìl2†”tŶÃŽøjÁ!”S{dl¸ÀíÝ”T‚¦{ÆÊÙ6Ö0?øQ›˜ðÛ«9¨‰¨ôÍ[µ§ñ%æo¯A¼½ØÀßÍa¨×0ÑáS¤9šÑÆŠÍë ¥ ÂÓë1»Ú¹¿ÙfSYoÅxΘ¶¢é‘ì3gŸ—Ñ£WŒ²³íþu­ ’f]®Å¤vò0{–òÚgÍïPUfœÓäí<ÿˆoÝ?êºð·wÅìC1‹öD¯‡ æaCðÛfcH ¡¦ƒ¼—¼1$h@pňËCYI1•¨wÅ"à>Þ—\(ûsA]Ü$qS¨.Å¿|cÏ«³¦¬åàãÅUžp§²?·“ÇÍk™1×!;Ø•®•ì0E*Ó±ùñÅÕ^ÚhĆT øX((¢#”ˆaé¬ÛËQÄüö²Ðtj(%†Ã…`1U€æÅ]œùÅ¡ìÁ\꜀¯ø<P²ùHs,–E Êð×»à˜š%%ˆÜ£íF–ù1¬qŒ-ù¦¢q˜Þ^µrw#»šýU†ZP%…kiýEcœãpž/'ÏÝÉ’ó Úh $pnzâŽÐtùy˜ú¿Ý~5gøó¨ßIûà#–j'¿Å²Ÿ¿b€/]Çr‡¹¾¦Ç2Íãb,{ÑþËv^~Ųý×ûXæþÇü«¿<åšý}«ÐóŽÑÉdŒ‡\O~¢¿ 7‡M«pÒ]ÍçÿÄRyûúí_WîÝ$àªHƒŠ×‡­‚…£ÜŸÇv­ ta&'Sœƒ&l8h|å ‹ýÔ0Ùý8Õôù¼œ~ ÜÒNã—/9®Sëòìà–ãô ‘ük÷‘S¸ù©\˽S'¶Ïwê8óžïÔœj:p{XOÌVOë\ÿH€Ÿq§å_IÞ»Ó6æôÕ0Ó½ãÿ~bì¦ΜþÎLÙN˽ßiüòÝb9ˆ¹?×Û¬\Àú¸ÐòœN«BpK2×ù⽑à:=%xðfYNÁTz¹^TUá¸æ{ô—WˆŸ«W¥ïn£à;x÷y_ÆoOb ç«þXÇN'Ì™"¢`óû£ þw6ETJT‘KªÍ¸€)!ƒm_€­>ž{Z™•ªÚ½nSŠ]\ŒY”=»èåR¬UB:qCÒô(AÍÅ!Á~JùØeìàîáãÉKbþ+`¿-c„äí1N-ÓäàÔŠ)”.¨ '3¾!NJ°“Nô¡Ç%<ôðÆc“ßÇ{¬Bl\­ŸŽ³‘òÃXßÕÖ›9ëî$¿¼l^@÷Bª¤þ冤éQ‚²v5/ÖÛuùI '$*<;S<¤?ù ôÒ&_/;++5Ø^j\y¡á ô»Ó4¸¤¾Ûå†:ÀU|y„>UkÊ(2zÝ è*ÍMÍN7¯y>\Ê.§¾Š ô—UP]W½Òô†»\Éú:4‹æ#M—5Šó×i0fâb((jßãAÉ©=Q¿`ßõs‹JOÇGRRBÔv2¬Nn7Í€:¹“ßYgu 2nŘ”3EA¬¸KÄJ»CÌÞ1ïœz–Em(_ÐÄïups5Öòù˜PHî~»Ë¼ö4¾d {ò['2ó¼u™ÒÚÄЮG7à,t‘]hº‹Òé~¯—žWgMôô¯Bå‰Ë-ÃÓ½¬*KžC¦^¥&¾/|ËIȯsÀ“iL¬Ñ稳]…œÎDv_|JÃd”¥³n_:®P%…á(’f]&$•„S)V¥æ*«&ä²q)…Am/+ × &ÁÕ¼R \òTÒçU ׳ÏE^įT·…Ï.Z¦É„ÿy±LðØ…2áqÙÅ•ˆ]DR“ŸW ìB §jåîF©#Ö(ùóBãôÁ<àÑ[À-Æ¿ÑSŠ’äØjêA½ã½ CˆA)³,$BaÊ7Œ§õ ÃUDvòh\ QƒVD¾v„½\Š­+íd%® + WW²ûjø ¢ÿk“*) %¯›WM"Ä‚G¶a@jEsëÔ4Ý®vîo‚äØŒÄqãfžNP¿™%ÎJóòµòïŠ7¨+=!ÄǾÖ›9ë zÇÝ–imKN™+òÛ «̾B¹±u;ˆ/Œ)‘è rt~¯×¼œmcöª•Ö0ôÇs|ÃØÕ=&tP(˜Ð·)»Ê]‚Ê÷‚5¹¨š4é/F“ (·7ûá&Ÿ6IÒÍiq‚tóRƒ^æWœu:ý©I;´r#™÷ƒ gÿ…ªSî!;÷Èœ)‡W•¸²¨À½®$%ãòˆ: ‚ endstream endobj 232 0 obj << /Filter [/FlateDecode] /Length 10233 >> stream H‰¬WëZâ:}‚>—¶Ü„pf¨ ÈŒ¢ x„#ŽŽrÿ“´¡MB’ðOf>Àµ¯kïµU#oÞÄ‹ù›@Z/—F*{›Éþ¸ÉgâÅÎ0å|[(X*zÍiay½‹†™hv™ ƒ¿}_e²Åß/£6h•2Ŷz/ÅÊÆ«v{/WÿSTï{£~¬ªö“ú÷lxoo‚«ªs(Gg8âK4bÿ¤«…Çà•I!WíÞÆ Õ€eáüšRÔÍ÷ík£Ö_Çpo{G–·ÆhÐSÞ²|5F×I­0‹þ˜+GÃ<¥ã¥é² ÍÎSNÚPíoK©÷Q%d&Úf>¶`¯Wá@å—Š*Sݧå$0öshqÀÎV\(ÅÃѰ ÄMv™^6±|ƒiRùƳý¢©°VH[·‚ìl£ŠŠº¨zýóÝÞGYNî…Õ—ÄyÓçݼÌÄ1ƒ½Ã£zËG¾0q`c£†ÍÏ`å䣨%E>ky-`ŒÆ£ˆñª?–qæŒGI1sRÿ†ò ÅùѰÐØ4 ÂA]ëºEL“fðñKåí§—Ja]ìÔãDÊ&Z+ ÕÎþ¤EXŸ½êËvXaº †62­§É‹ñ`œ‹'‘ÃwE2t’»4P­§õ³fÂMt„æ˜ VŒX _‚` Œòý*š«ƒ¹ß™fŠ»¦_ƒT¢@“o´å$îº,ÃB1c¥ñ…°ú’8Öó²*á¢úà Âzíਕ¤aÇI”"¨Îš)_‚P­öR/z=öûÆÝ¯^K iØ›mÓ|æÒ \Qw£¡õt¹ !EB¸_ðvï| (—„ÒsŒKˆŒýâCÃÞlwR¬€-ž8œ†Å£!¯ú’8’4¤Pˆ-fãLCˆB‘ὤ½VzÈÕÙŒ& 6 –³%´û7:þÕ8dÄ/Œ9ƒà•”öF¨þ«v2ã´×Ó|ÏBà1›ASQ%„ŽŒÌ`.”¢J,»Óé‚zŒžTƒà(¼û¤"çÁ½-:=¨ù÷ÅéLe½Án1NoöQ=Íen1œ>± âÍ´‹rnŒV픲é"wµ ‚«*sµ ‚Í4QøÊÄ+|ê}? ´,F£ŒQ4|ºNP4ŸµÅ ,Dlnœ„ä„¡ hˆËÎæÆSÙ…±Ô¸[ —ðy§ÄA**ìõ*°÷« Ýmûû9´Ø¬` V†d2VÌß4¿æ®ì/ŒÑ ß–¾+9#5Ir7­¬0„Æu ŒÂǩ݅ápé CÏ ø”' w†éR÷uMÖÑüØ0ØZ(Ü\N¦¹;€VBñ?v‡KR+0‚D`(ó“[ö¼.5ü¶/|XvÊõ+þÞ¸ò Ð0åä‰ÄÖ´+iß•¢ñQêö“²`<~ö ÁÒ#:Âw9@—˜Yé»°åà±·pÜüdÚC¸Z.éU8N ÇGõ\/xßÁç<ÿ'Y$*­2|î“™«\Ø-Fe ý¯¿Ât?k}{_,Muó3”ÑíºÔ?’©åi-Lçs^FSÍÓOÝHu׋Šì½ýpí…`£`ê­Åú%y„÷a4þ#ý÷†˜ÉÐìÆè·P¨=ûï‘m4Û{à]/Æ&eTQ=³ÆÅÛ¯[®Qͬ÷ÿá}ÅfoØÑÓ_¥[´÷7ãQ yF—¡÷‘73„ÑÓZaþp#­þGö(£ŠJ$ø,Í5j\äŒ_£ßBáÖGúÇhïYQù±/–Y¾Ñjâ¥Ã5ª"'ïžQ ÞJ¤Èè•Î5ºX¶ ®QÀ—óç£;¢ª£Ü&jû¨ÑòÃë‡Ìïþ¬?>©ß¡9Füò[hþÇêþöE<~G}‡Öd Äüô“î„y‰|xËMç‹õ‚¿¢ÜEÇ=ŸH­A±rµðx3C+änÞ¾J¥vsÞZ„Rª½Ô‹[JÉ~Ý ´ãŒõÇ ©y™.)ª”SÁËv J-l”÷Ž"ÔÞC“ÔíbÉ»A­+©tÁg«A¹d×…Ÿ§(7Oäf÷)PãÜ<¹2wÏì”° óUÿ[ì%ªÙíÅÖÖ½ÄJ¬`ÅәȘõÔ øß¬öÓrB‹ýZÌЊf㊠5aÄ¡…$Ĺ1ºNj¨jÀBõ9Y®^øG¥9Q±»Ôœd/È£Zþµš‘[…sRUšÝ•€•,¶YO•Ôî‰ÙNKa§Å½Åö¾Z,ûÄ@Š*›áA¾˜³-2LÏýú\n .ÜŸðØkWàAöÌOªœûŽS™ L!àƒÈw­ëÌš‚M“‚rg2}öyžåçìFÉJ—ruv‰’=ùöƒe,Žg ÉÅÍ%39±÷Xö\Ý^Èê¤úxФê)·í¡ÿ»åyëúaUWQÁÏ_«¾Êͯ¾èÇ“Ó5k i);\7ÉÄÉr—‘ã’3ÇNå‚‚¥æ«Æ —ÞÁýÂsêÜ-ž„¢¬Òó~[)õ׺DíúeŠ»æîõs§%^Á…«Ìn†½÷3c¥ñJÙl¿ŽggÌ„õÚ×iû«2FN´3–~^—l0e…©CÈ\&¶õáßÚÁÇ,ˆªFëC¾fïøšøôtXé 1É] }°³É¥µ§úþÖI÷Ä|Pý²SvýVEúÀÃw%uñ 4ÙÊp•’QXú—M¥Ù£´ ãÂ$u²D…ª©äj!:[¥nŸ*Éå³°dÍ W)I¦ã-y¿ý†™¨[r·€²²mIÊ¥«ì©ÇpmÒfGEª§b¤² ÕÓóòïŠU5‡û IÀ!C1bv‰4Š]Id¬ãKßÉO .Îíwé VÆœ2Jjñ¥ÄÈP¤†È“4ã½<±æØøÒW Hæ‰:LA €Œ T!7´ÊJ,'(—UäTo¶ƒP¸¬|Q?m.U–Kà®ÜÅ)±ˆàºäð…tjÄ䯭o¶Ç6yåž­¨+Î1³¾–¸s}¯Ü:© 3„lÝVµ<{™p>ƃtÓÆ8ñ¨ÎX2°äÒ …MEÚ©4½Ð2áï+Û‡/¶’ð -†f÷•ŸÚ/,WŒÑ ßö*ªÙQ±»TÜf/¦“÷ (7ψ;Ç~€•ÑuRãɉ:°ò4—M 7-À µÊ™‰û¹œŸs³Cr–ÛÉÛºÀvì©mÁ>k‚N¾"#Ùav´`ߥ6J©˜¿Qý@(Ÿ°n5 1;¢Ø>Ñ©JÒûEuŸ–p7@!W²¡¹ê‚ªeþ&*Ñ¡Âþlx[ÓUã{t(¨ùh9¹—HQÔÍ߸cVš¸Å¶z¬øÔ\.1äšÜN‹»+}T/ÈÎ[9ù¸'{XZ"œ‘:¥ág>Í ^tžëÞÂ;T+ÐT®)¬’Ôýb%œùm~òÁÝÊi‹jVøÇ.óöÝž=³mÞce˜ÅˆE‘ʼnâs%Ù8ñ/‰*ÁB±¹¿Α„7Ø&WUL]P`ÉÝÁ8R3µùBm¾îw«±™#}©(¨ï•ôK4Ì•¹»ˆøñT¾jé”L—ÀÇ“`WrD„Öäqbÿò¬€ÏòS±X&Ž”“™¸kc|gzðVë ‹™¨ËÎJ‚™rÚKáµ®óÀÒ_À}ïÛàBµÛöä…âXÙ§#®>VŸÆé;"*\Äc—ÅÎ8$ ‰+×­Ú)ÔC`¡ãÒì»A¾2ñ ŸzŸÆÏ6+V ä]Õih=b4 ­§²8LR$„±€BNÃ7}np›]Qw£!“bIB|Ž‘`2÷¢xål?…VãÝ—†Š¢úâìCC Uÿ`Іü-æÃ§¡ç SØÓ‚ýÏz•ï§ÊÑ'ð!@Q¶Uë¾àZ—¶Z½¶nW»Ùj}ÿ/ »WÔ{ýþáI˜LÎÌœ9™iÿh,ªE¹{G  ó¡%÷Žªìè£óдt¤r`‰;”Kéy©L¯)y¯]ÎcO%sô]<…Î:Ëeë ¯.Ï9Ó{¼;„¶:Ÿ©D’·\þ;¾ƒ9æ¶#†óŸÊe¼‰¬¸Ù×ccgUÎõÆ‹-¡÷QrÚáò´‘@ŽÖ’Øx æØk!2t²î¤–1ßêˆ\Wäðã¼2«¸ ]»ŒUt¯ü?Êžj¸õâ1¨-BÀîb®Þí„2A{‹I— (q6”>Ê̱êŽËCîWž¦|”ô²Ë×O% zÆ¢kOcrà¶Þ8]•jÇØõÿu¯„±ìIõàÀ¾Ýgöý}ix\"—Nd„:CÚÂPÊ÷üž0„c#í¸0„Ñ?- qÿ<" Tp°z÷;ò¥âÑœT€ÃPæûKò„óïƒû ŠÆ6ã"È¡aîuϹYÉÃØ–:­¨ÎÒ06“èÜêšã]ø$Ï4°˜Ž»Ø”ÙÅŽóh2…ˆp¤å¹šƒ:Ç)Øngd„gsÐÙÒj‹íŸíŽy7£/Ðx‡›:¶†¯Ý„í N8º‰#嬛5Êì~¿„í±ôÕÝ g“ƒÇ~°±t¼øÄÀà´ vÙ;ã2aWNPúä@©wŠ@Y4 båNœjs ߯o õµxwrAW¢Ñßzj¢1ÇÑìîcáà£P4‚“lF ^õx1)ìïH‹c z+l‡Ì£·Á~EÖºÞøáI§›˜‘ÓÊq·Ä"Þ ˆá‚x[ø˜ "º¿(ãqö¶A¨88JIº‹Á·‡‘{{K÷Þ,Ú‘ –dÿ-âß[舀?)ÒÆÛç" ÿ¨0l:µ^‚×ІEŸ,êÈx Aóh€7>QÃdmé÷rÂUä¾× -Wzz•Yµ¯Œ™a]äÀjbºY³EŽÚ)t¥Z¹5Ãh—«:çœêŠs럈sâ-õjMǨ¾›Mýb¹AN­1t{yyùmMñΉŸ@c‚¡Û®šð³ü+×kX*W¬œé; ´³aë¸c,á˜ÂùÐMΆ*{‘Çl‚¨0Ù´ƒ„Ô‚¡m·d‡Ã~vEü‡¡=”…»‡¥ ÿ}„1ð'ýh–…D¾0hðxS…¶˜»L`à¯ñEaš &ÞV¡®’,E?­L¦ B-÷;΋ë¡[§Ôˆ›¼9‰¡¸üofM~ž2µX'++ÙÐ2L±:OFe ú¢™É’‰ùûDL£òS¸Ë6Ž+³Àâ ¼7+øÙŒ˜õg*߇¢®…ÙHJÇ«ŒÛl*›oó(6ayy-ò¸‘ÃϾ`ü»óm$ZÞ̶Ì4Ò†?˹lOI#BãŠ&w ŸÅÝs Î;¡¾œ„cñ"ØÅþ ^oÂá ¶¼ièä!ŸžE÷ ®7*|N® Ê 8H‹Et4Ä0©N0Ñr4NS³,~ŒóO7ˆ*„:JaKGàçxk±bÓÛô1 k0 ¬&7à Öd;$…²Ä †‰-¤¤Ú¼©%«ÂG‹),(|p  Lxï*Õì› ~è™^³®ÞzøðTîr+0}ÃØLe$K:Å:ƦdõŽpôiéE›-ó_äJ¹ÑÍÂÁ?é›^¥0YææpÓŸ¼2_N0(Œw(ño`îÄDÅr—Fa|k!^á ’z‹"Äšð‘ú¡œJ ©h»¿è³–êËËDª¼'ol&  íjIΩDÞÔ ‰©òãN“D‘Ù(Ví–.§tŒáƒ„™Ì\Ï  ^ä[l†‰E¥âw¾vX)êBÎÒ“ZÆé Ôh®Æª+…,Ì»ØF5k"xµVš‘…iŠ­—¿&Ý&lÂ0À}”ö °…@¦dh~,é$:>m]‹ÇH2)ƒ9µ*ªjjv¶|(5RQ(l/ òJØ3Ðï·sºÔ÷S´CæâRB ¤Gºô|ËËÁÛ¡Ó«È¡¤_ð콈>ö¢ý?kf ·N‹KE?aRzëÀXöwH½ J& ñó»u‡‰&.ì €6ôÎ>…§¦þKI¦ô»z÷Q ¢:ˆ–á”ÙÝf\v„­¸ˆ¨6 šb‹é£ ¿)ýºM—LçVby¦·­}c0_"ägâÄ*pÓu öyóe#ý*³EíÁ‚àÙ ÁnØÂ ]t °†ª<3A€w ¦ðk>2!€Þ8!¸Q÷ 03Ù B8à!Sج²™.ªzÞ›ê!ñ‚2¿ KAßT¾i- ¤xfvb÷‰µPÒ!Póƒ!Öcô,pÿì‘LØ"•$&‡RÉÓÎd†=#å"Ã÷A¯ýãÇà/92ñQ—xFÃY•Ǽà.ÍiŽs°¥ÛĹHp‘3Ž!g;4¼½&¦™–Û„èqŒs¡ä$ÓÀµßGÙÑÐÈr½àZ)„í••|Û6Ö)ß’;8ôå9Æ\šc‚+ÇþÉ„xyŽ1—æXØ3ÇÎ6ÁŸ“ È€•cC¸JÎ.WˆØ?™Î)WÛìbš8Á}§}؇"ö—ÑΩø=`&»L\ ‚#vö1ΩC>ÀŽlš.¬ A>§#W¢©»«›PÓW²Ë„tQÀYâN#qܯú4|0jÿRäÂŒœly¢yô! œáÃq¶”D÷§»«H²}σwĬ†¯u`ö.RÆý¥øK÷²Â6YËOêßoT´YìH¡4Y<| 4ÿFÿnàÛ´WÙvâºýþ¡À`<Èa´™B€0t˜! C k§ûí·T–“î^§ûœ{_¼,—,©TµkïºÝÙ†OxÖ•dŠv^©W±`¢J1‚*ô%·œ¤Ç‹Qi"ŒjZ¹°?w»W¨ãƒw¢O‹×Ц[ HÖêÛt2£wÖ#êõ(Ý¢„+Z¡¯, ÄâAr%+!ѧ†QÕ§\¥ÃÞ^]¶^Uà Á£kRèiâ æRuîìÅþ[ U#þÃ¥ØM½_¬6¡né²ÝÚ:´ëòœôôÒáVüÈñ/oqÚ\ÝmI–û7”Iá'!šcRnBjíìŽT%ƒ6A‡ŒBÂHœwÓf¾Ë§6¹”Ú  WÎØë|ÁCL1ÕŽú°5œ~º l³nÛt—rgÉz%OJ„<—žú¸Ÿ}éÂð–+>¬÷IØ~¤;ã”V©±eÑ07èÄj]r]Ó±!¡5ÙþP?@³`=«¤¿ñ‚ó_éy=¼z©j•œSÉl/ã¥Ù)¤—ò¦’L4œÛÖùÚÝÝö[`©i‚úr.\%n’‰r)cެZ•»…JW ¤çVV¼íXÙðb¨’ÙsmvhùOiŒ ba{0é¦<}øá›‚ªhÊ‘6:‰Øïÿ_à1ìý/ïkÎÍwt±ØëW¨ÿ´KÉn¬,2eŽ?5s¿Öä?€/øonâw@Qù ðG uì7!`gŒ^¿t¼ù 1㿌0¯¢·á/\É¢E1ª7¯mè[ÓþÛY̯>^„S¿ |ƒæ†p*”êr6‰‚º°O1×·ZÄ i%žÜ`÷4kN ¥ïÀzõæÔ×)ÜÃykà)¨€¡kºrÊÈvŽEÄKb™Þ®O^A¤ß†ÚC`fª5KrÔ ´u)§=(œn‡›®HQ©|^ñ³òÓö½K-ÿh²t•Ä.Dr-•.!±ošˆsÀt/ ‘Žf4i•&È‹ÈSŸæ%BØá<µfÆïÑ—/  (ÆÒ’sE•¤a<<+R}Õÿão1™%Ò¤¿¦çV¿ªÍw¨ õqüÄ[~”Õš6ËÙ^§AýëÁ=IœÁ§F #p¡Af :RÝÈ4ÛÌɯ±!ÛuT«Ä#–›^ Ìzcx€tðä*\õ•zµn_ê“Ñy èöÓ……\1ø»Z•n×ÊZéÀ÷‘5øˆQ'ÏåRA¿ÿ(ÔhÂÞ€)Ý,Nñ ž3jàÜìJ} í MʦnÔš~ ǡԇÊê£yˆÙRÅ“ ¶­- Áô"à>à¶—–é¹ò·f†sžàÎÓìļ„¿tÚŽJ*h'G›¼±‹™‰˜…G|çät%ìÖîï°‘´y}\4øb(/Ðè×Çi}òªÂô9½ ºÐÝ1]G³£öƒ#ýº§+Â#©Ëc.èõ]‹–ü(…+Õª6 ¼}G=ÄlµVèO$êŸÌjdìû‰£ð(¶Ùœµô»Ö:D£·÷¨Ñ{ªHlh*TƒW÷GrºHö]Á|ž ‰Þ©´5ÁsL)yœ9Ta©.>¸&ÙkÇ—®x ;så4$iÄV£ô›/ȾvÃsgúµä¾Š.\ƒ‚7¡U9ÕfÍŠ\¢Ø5äÓüé]%å®Notðì˜dîBú‚4é$xÄZU™eÛäÃ!ŠV]Á)¡>ÔšV[Õïs  :ìÛËB¡„&ã'Áæp2¨b$qSK±mMåD¨©åXx4ŸÎKÍÂkŸð’U‹³ %.F«¥çA¿}aiÖ½þo—íª_È2èj>Åk»|'¿¹£u,©F‘±ÉÂCÿÙÕ+†›hSo¢Íë’‹‡S™ó6ŠN ØÜ˜R‚^¬'ã›ÛÄHzahT(ÚP/«øf’oGXbCä0}»î*°@Ys¨Å/ÃÚù°ý6 ˜i_g=ÓÝóÌaƒnÖ1¬¢"†1æ‹Í/Íg)²óÎÙJp°ÖÚúØÝR î@| ¹³>:kñöᡘ˜æ‡òS2\Lt è€$Š]²+äùKƸ‹cÚ‹õ{ªs`•,»WPÜiå1 z† ûhSƒúYˆóŽVÃcfO)oŠ1ÅÊ_‹`]Ñ$3èB³&±o]M±Ÿ‰÷*æt_xï3SWÕØ¼–ý ö=í(Ýe°Åt ®ϳl,›’ýmvV6(WF#O‡ÿd| ˆÏ¿%ô˜ö´?^—ïÍ÷çÕóæ›äKùH¾ªiÝÍb[z_.;Ë¿ŽÖöáãm¹9~»øFò·fµšˆYˇíb Ó©‹Ó¸[ÊE¶9Cñ+y‰b©`=&Ë늿žYê ãkQ:{*Ì+ ÒÅ%ÈI“ň“ôÒ-®$:€ROrŒ…¨6ô’ ²5 šˆßZ¾>Šb£~‡×熣’œvÊàݲ#‡Õ%©ä‡5Ðç½Û9ª[¤%çúlÝ퀾¿ŽÛGvt îm'õ#Ï —×QN&¡œsm/+A8IÈåè×+N¼9»¦þ]SC–“óÆ‚“ý Ùûßi§™`ňÒׂ×EžS‘,Mܦ§µEb\@¡J«UÆÓ(!Œ°mu`d÷M(!ØÛËùQ`tÚ‹t(²áE˜êØŠŒC”Q¶Äc÷âè`²ªºâÞK"™¸p2x=ȤE–Ç`Ê9pÿ Ur2Ô*ïšÚI@°šSNGNß¼;Lл É³7…Ì‚—"P+¾‹ˆ% ²d嶆C¦ÐZ¹ÓÚV‡Z%D_êв`÷JÏé9Ä…2@0لжšÄ¦ËB€aW³ùÑ.Э‘A2eæŽHÛ1?ò#c€A]v7:»`²áÆ,2»äÝV÷å‹ÔrZY>è}Ìúë£à„ó´âÏÖ£"ýVÔC™3ËYQ¸JÜ$åR.´ìXÕEšs(´¯9ÒѽÒF^'~–^ƒYÔCˆžôš7mþc eÞ%,íç}”lU€·‘Æf>Ö3ɪ±šÏ _Ðy_Dq Úu[¶IrÁ_ìaØ'ìïõHuÞÆš‡CÙzơÅá1Œ9c¾ ëOû úÂn‡.Ú#¡ÔøÚÏÚãV¿/3´ZB¡¡Õä’¾]ÑGÖ®5Ò~×üy™qëâ|Áž:v˜¹±aî6—Ä;P¨«2°46ždšÎ*ë^îŠ3t—…)pª§@£àޏú›è–<±Uu¢O+ŒÔ r€ÄLÒ«Ùg¿\r¿?”ÁP"`è¶¾¤Ö'!…ÿ’^­miì@øìXP Iö‚( r«(ÅŠ"+[± —NÛ/ç·ŸIöêµ¶<}Ü&“0™¼óÎd&ê|øÔì¬X€°ŽÅ²n¶ÈÆí*FJ·Ùœ+=äñƒK¶<×xO1z^Ÿãã/¹~uà}qâý8¯AxN>Kp¿1×X©Á²é™MIežMyïËWÞ<±b©åEoôEÅVågd8¥anôùÔ7‹–µŸúÎÕ?zØ «)Íå©ÿF”³ã¯x™Ãf+|N¹‚\þœ+"¶ŠZ/‰ž«´ûñXÖZ/—mx ¿åžqu¹2}m¿ñÑ+ú…]·á¿û¸”kØ „ÛþõµŠõ3Õh5*P^ºï5«,“gÒããS5ÁFÈ“¥¸ k“çàéUÌ²Ó <ŽWä]ØFñH.t<—¬õÝ>å±ÁbÆv«yS©ÀvÁR$öĘÌ1Q¤»haÆ'r{O-ö€‡Ø¯f¶ì…½Iû,ŒÝ‰p¿¤~?îþÞûe8í vÍí‘bùë‰ïvɸ˜œnŒqj¿³fPvhØ9ô¾qÊB<ìZãã~÷!"ñkK6\²ÄA*^ o]€ÝA”…ÁmúðÕƒàʇîÂì ‚åõï@äÎ|äë Ñ}X3Š‚‡ŒcŽK>ò皥J6V¡{ý1œv@8\»±±ù „”åuÔ¡ó*—3ÅÞ "1Ž}FEw¾ Ç*½Å»V|Ά¾õ±Û/ª0–›…Te´ö¢ò/½ÑìÍ?ÁiÈ–/8Ý쿟…²i.ýlùî5âÛùâböLÅ,ô{l(Áûo[a…]Ý'_®žvïƒûº=¿Ý€ãqù¦ÚzÁ±æÓ†;ŸnÌ1sµ¡ “ÐÆ»œṉîìRïk†åqìŠ\}tѧ¡|—cãõfÞèöáj#öª0þ,ó±Wì¥ ÓÚÌÝÑò¥Ä>Oªîø/ˆ-Dž©˜®7¼†z+2 ùü5Öá¿´Á«“¯¶¶~ŸtÙóU„v.GçA ãý7 ð"„„a.6±eKc´!©ŒñrÓliLW¿Mu¾CÆb¨“ÿ*Äu(8½ß ?›F·x«ÀëdÖ®ò ¨ëšWáíð ›«C˜~OhûÛO=ÞÛB{ØUS#óxúÊ>ow>Uí-í¾ºŒƒ?oÇÁÉå5œ²³²º·Ûµo$œdÓ¤3-"VoV‘÷³T¢tÙ©2kzrþr^àÍ*C [ÏЛÝ­¿ð¢ÁõèN¾~à.”Q`áf}{èŸRÇþ’o´¸Y‰w[Á“+‡ »àÉ•ò®¿¶¸•z Q#vJ¥¡¬Vòvæ øTiS¦;Ž«ƒUÆQÑ,&Ø–$|Òð86k»n“ºŽ;]`³Žø8 Än¶0«þ |†Ì/©fÇV+ç/ lç”¶‘„Í&®vkÜ—pJ‘ì9‡vˆŸ"tYß3o¥oÅ‘Vn&ú–ΘCŽ1Çw®‹p WÆîåæRÎíT»­Ôi|KŸð\cûµö~¶xÔŽîÝGé“ùÑÅÑôFö -\ÇomþJ÷ÇýzÈz]Ƚî‚Þ5êI!â¹l€‡Q•™ÑB ¢$ô]Ç’=„/wù@?ۣ•\=˜Ç†] R®ÆGŽc•Ç |"œ·‘~Ówøè>ŠÙ£Ávqß±g< ž5Ðλ J¹DOYà^©Î]:x‹·fnÿ™ð s¾Ã}î%¹1ÖœÙØ¦:ã„Ø·@ q¥Ãͨm<Ž¡eé~¼Èà”Šv`Kw`Q ÊR‰ñN‚»”z‡LMêö÷;°½ø…ß\b;º ³å!¨]0<¥(©Ü¢+;Øa¡ÀlˆxŸ[Àl¡È¦QK£îÒ Ëh ’ÄÓ;׫'vr!ÉbÄðdIGÖ&,Ü@ŠJ_V‹wã£aOˆw¬'yž-OH V ÈùЀ…38 ;ãd`Wï9\¬“¶l®Á Y©±-¹ùÑò¿a(U#¤_š/ÌŸ«ãÙýúÉœBɹ¹ZÏÙµ_0§õÁ/ÓˆhÿÃð}Ó‘P]¤ª •Ië†+æÔ‰$Ö§B¤Ÿ:²VÇ÷«ÇÙt`ý³LÔ9­·kÇbV´÷öaïžkpvÃ’$áû`a_Àâüu~)f-³t`1U¶L³=Î`'Ÿ žÌÚthþ´çç«™õËï v¬M¿`òßAôCTÄSñú‹CvHKà;†‚&Æ$±óLpiŒ(üa¸$Òı@UŠÒI‹„ÈH%Š&> ”b”N«Š/›”(ˆRMóeë(C@Š JÒ]‹‚'ÓuDôŒ*Ö*S¤ËØvYC &Š'¢rÁ]ÔUD3r`NPšh:ÓìŠÔ4ÒÙÿuÿ2®4«°‹Èª'¢š‚4ª‰šŒÀ,ÙŸg¦)„)v$Þ-&‘{UW­Ç+ ‹BYÀHuè5ö¡Ðà²4“fH¿N#…`DS0DÖ<Éè(­+°GA2Õ¨/Hgªs‹‚'R5€ 3,|AªL™ÃÅJ.ظg;s2Ð$3®„¹JEŠøçW©'p~ÛU$T€;à)BmÖyžòð?h2_È&`4ÕUQ§*H½ù®Nd 'ÅÎ$1.Ô v€tÀÃwrCsð`^XƒÇ ¤ƒ‡åà_SL§³Õ`eÎaE|°Ì%„ž).G³L?q·Cbi”…ÿ_?ùõ endstream endobj 233 0 obj << /Filter /FlateDecode /Length 3791 /Length1 7261 >> stream H‰|V xSå~¿s’ô’RH“ô–4=IHôBiÚ¤-µ×ô‚)4ÑI[ÚBa:©:±à—鹈(H§uâ¬0e2Ñ ¸±)KçnȈ€f_NKuò<ûóœóß¾ó½ßÿýïûÿ‚Nˆ¨X7:gåÙ¦ù”Ÿ†¦¶Æö ¨PžoZÐ!AÇ3ˆÉ/aFûÌ6•o³‹ûv¶™?s΢'(Ž-"·ðô§­-Í_^ü( ^ÄöÎVˆØ¡ä¦z¿†·¶u,¬\ï-åþ ö±vμ¦Æ¬ôÌ%€¶ ¶5.lC‚HÈd{inc[Ë´¹ö0PœoŸ7¿#ÔÀXžo¿¯¥½Hç>D¡‚ÖB …pPðóÈêþšNó7ÿáÕJQ%pQlöÕBºÅ]6¡ ×5…p&”Ü\ÃõªàŠ`WpQðÞ`U°â“ ³"j?þWK 7B|ÿómt¼Z£ ÉméVa Ãê[愸Áù‡˜7aÞ=ÂÌz”Ù·”y×ÅüYŽÌA?³r5ÖàqfâZæå:¬Çldv='ñsfÝ&æÊfY˜ÿϲ¶³v2{v °çEVÄ^™AVÆË8€Wd½†n¼Î<ƒµò&ëä-VÊÛ¬•ì–°VްZÂZù-«åëåCÖÊG8ÎL?Éš +æþÈ,þ„OïÓø3‚èÅœÅ9|†¿àsüÃßñüçñ.à_øÿÆE\ÂW¸Œ¯ñ ®à*Ÿ‹×p7ЇˆIAJRQERE“šb(–†Ò0ÒPiIOñ”@‰”DÉd #¥‰RI"3YÈJÃÉF#h$";¥SeRë²i åƒr)œä¢|* B‹â*¢Û¨˜J¨”ʨœ*ÈM•TEÕTCãèvòÐxš@wÐDª¥I¬ÚÉTGSh*ÝIw‘³¨¾_‰ÔŒû©EÖy‡¬ò&Yï-|²´ò™ÖùZJ+h%ùi­¦5´Œºè1ZΧÉ3ô"í¥Â'í£t|³dxºUëÝOô¸¯›B]Ýp§¼Îºë§evƒ2$©r–;@ Ü2xÀnæ–˜!UD[Õd¯Õ'ù%ÿ¸f¿T%µ666¹æ‰¿o´@w¿§xÍRŸa°Ùâó²EØBöã÷±‡ÙfËØÁ 6Rfx¤€˜Vëä tº R·Ï`6K•žZo Çm0û|l¥Œ”ë‡g%ÄÁ1«ì܈ì÷Rç ”ðùýý=«9Ðé÷ü¼Ž~7z¾7@øþ@éÀg"ìQ´UvSg­<Õi5ÂV³ÕÌqúÜŒ•á©óVr¤f_&_”|¹Ó!á_†üã==Æ¡1kFð“CksúN nÄåþ äc‚ÿ|Ð%¡‡¯8P¬aÖ›óŠEW±˜—›%X-±BDåårß‘côºX–ÄyêÆk©³Ï¬¯ï1$eÛ´éÙYåézA“§49ª3‹§•¤jM#H¯-)/ˆ)*‹S06)Á‘_2Üè´'­•7,>A•œ¬Kuy2ÓJò²Â—¼-t‘¾ ë|;ù/E%c;]Åäȉ×kbÉjÉòr‹…p, á²(£^ïÈqº¾Ê¯¡VGF» X–ÒVYÛ茋ϻÛŸnNu”oˆšà±¥'Lm*+UÓ;ÆeœZ=L©›ÞÖ÷±RmÌÌ7kOE©²Š¬CN 1ÑIöT§C-öÿ qð{ƒpŒ/ Κ6×Éa%h¬ZÊjIË“»m”FQ>)E§3uºz¨V)ô% [t)ò˜ìǺ(”ò:µ¼RØ­×™xaÅ‚‹“üÝ…ÒUcnMFFM®1ÅÑ_W¬ž^X8½zäÍú›tO~jj¾'ÝîqI’ËcwÖWU]ïtÕ‡êØ9¡|¡DÆL¿ÓÎòàójFh¬tÅÀ;™Qý_ö«.6Š* Ÿ¹³´Mk±üô:ØÖ–nÿ,X j+ݦÝ@—¤ˆüDh;Ûm¶»ÍìB©H$úBx° ( DÅ5Á'‰$F|`‹1&Š&¤4DäALj °~çÎl kÁòÀ{ó͹÷ÜsÏ9÷œ{îÎÔ,nuW¶.ο]¯ŠŒŠ¦uµõþ–ÒÒýKÁ‚¦Øfaݪ Ð……ËVæÌ+É|vuÝü¤ùçÜ·¯ò9kÀc´OJgVÚÏ.Ê–qSö<>#{IÑ¢¥Og6õê¼Ê¹™OÎx,3§´¾äö¥e}ç<û/MI¿QWûQggÖ S®ú;§ålsáu¦ñŽY㉼D¡kD=._DòÕP=–(¤|×5Ì>åI}ÍTÆ”q®Ç€TEne„6‰•‹×h¡ºŸ4qÇÉùT°m¦¼_¶™J±wiÿ^tLžÿr¹>‡öñÿ(× Ëß‹¢ž¤_—ø\&~EŒÆ>ã2ÞñÄyÐ+ WAoþ…\4ò™çP‹qvÑb®EY\¨ wh>ã¨qÔ(è"¦Jêé›’òY$Χô!…ªC´R¼$Çœ[Ä7•r­Ëz³iÙĘë¶]3wQÜ ².S)Ÿ¶?MÊ÷ ×´<_ÌÇÂuJåÝ‘b›ã…úP¹®e]S øØÏ5¼œÔŸJ“ö(-‘‡Z{¨ªš,JZgÎ;Q«÷’§WĪPQ§'×7@O“[= Þ*Sýþ1ðŽÓµã=˜¡")û=ø,ÿ-þ/XþðYöSðÐqŠJ…\}ßùÌua/Ũ ÔŒÜîQÿ´LÜ-ëä=]%ë)‰aÜSŸ!ŽåæØ€ ð±ÿw€ƒÀ&`5ð"°h|@=Ð<í˜L?vË€÷€õÀa`è^üÀ) ÓáàpÙ¡?rLd,ø=Cü:oÚ­ã¡¶ÏSÚO“ umháGíQ{Ô¦nü:­ŒQ?¾Dc”æ¼yÏäÏ%Š/T?A&Þȇ’/à˜›‹‘Ýw¡ÿ±ÓOCÿk§ŸN{éÛñÀ]ÊuË€ë=fÔv/fé£O·¶F+QŸ®a;úäÌîIQÞ¬ÿ.eØk·aÅtÐ-Û,30»cØ_´JkÄ'b,2©‡zq24|Õ ÕQ¥Ó[^3éÂl„Âù0Ò!¯QxªBoæC “š¢rd€ Ûñ´%×bÖ”³A©möAß hû!­96 ©%€±)­ëx²ì€³fütFh›\Û/}ˆàÉ}^Ý'íE%—5D`y:{Ú@íäEŒÚi#¹e¬¼Ð§c6$}1£¶‰ý®Á¸>„ a=àÚ‡)ÍóvÔ÷Ùµ.£lg¬GÆëÎÈÇÐcý†Ì”E[1_‘¢•uiNfõ)×L/ò“Z“§ÂÏì3Ñ-91ÈÛã-ȃ%exvcÆÎ}Tæµ7Œü%NàŒOñ;IäþW€oÿh endstream endobj 235 0 obj << /Length 306 /Filter /FlateDecode >> stream xÚ…‘MOÃ0 †ïý>¶‡z¶³|í6Ɔø¦;`ÀcÄ~?nÒ²ŠP$Ûq^?±‚W 8)èÔ£¹1 ‚†‚@ób FãÁEAŽšg¸+/«ÚRy•ì4Ù›dÉJõМ&´Ñq˩٣x µõ!s–{åƒw±Ujh¬Ó~’䶪”3µ¬— €†,½ü|èpü«˜&àE.«Z¤Ëœí+ ½ÒS×6*Åk÷¾B":­ô¡¼'KŸ«ÊP¹[­·ï9»K =ã–ùçkÏš‚5 ``ñhm„±U/ž6ÅGÁÈ&H'9ˆóaWÙ%F‹ Ãñ¶¸ÖÕó{IÝÓë|ÿÕÉEŸšPÈB ó¨ÍÛwiÞθẕ'á±L,OLœWçüX…è endstream endobj 241 0 obj << /Length 1920 /Filter /FlateDecode >> stream xÚÝY[sâV~÷¯PåIl]Ê>É ƒ¦0"’˜‰+“ ²­*& âšýõÛ·‚È3;³©©J^¤£î>}ùºûœÆ6µ'ÍÔÆW¿_Yð65KóMcÐïkþ`` lW[m¯~ýÍÔÖÀ{«™† ´’Üj®çžëÀz£eW?_™¢ëò}“_ýxë8šånà ´üQ³Pe¹šï†kûZ¾Ö~Õ“Þµgêóžoê!-SzÆô´{׎=Ч½ßò·¬Íg¤gDÏ<-=ÊqÿÉÏ3L7P –iôKIŒIUz4a‰¡» £¶žu Œ ßwP×µí Û´kÇ5üË:‡GIß°|ÇBɾض2šÂ9=ïX/»4yÕ¨ëö@©ú`{VÜ@PZ³õ èy­ ?Ò-zöéùõC¶ab–ežÇšÓžcêïsðÃöz¸\=¯UùGL»}Ù|êY&ê!θؑ3ÛeÕ³<ý“h–íœkÿ[`ä| £q±/6›ýêyùØ0ßÝñ00õÃ10J+˜‘•[bm–MY ¨Û‡É?Dêù×ëðöàÝjýjjòže›z±z®ZÀŸUîÇu%k£]±_Õÿž€þ?©Š/ú™0¨ù슧ZžŠª@L„°È¿°:-9‡¿8v ¢Ï€s‹Ç`½ƒ:TOûÿ`ðEÕpK¶ Ã[lúM¹z–úù.½ü}ÑbœÜ/ˆ§x €NÈåN!“­žëz#'%ûú‰˜­Ê¢Zûoµÿ7õ‹ýùUGÙÖb…—õ—Ðr\Þ.Œ†2,m$3r_==7‚=œŽ¨òÅ&×F ³ø† NÃøfZŽÌźÜK£”=ˆà ¹ <}Y­qÑ×û‚)¥pöõa·*˜)RžþPVKvàsNÅíÕ‰úKÙ<³qa/RêCÃÛz]~0M{Eu†· /ËØû¨ *›¦Ów5ªÿ£\+Jó¼lX¾yçÙ͆D_Êê‰É«ºZ—×8¢cBJ­ ¸l'€¢ùIÉÚMì$û/ÕIxîÏÏë#|°^Õk¥šškߨt6ËRš¬Qõ´|à8)ÁjÿGŒëÓ©d®©›rÕ¾r æþؔʎò‰`hGLimïÂÈðj³,q‚‚1^Òþp‚ÔVpYFÁy±l *Øÿõ R9 ôK´€Ô‰Vp–cº „ ‚-¬ªà*´ÃвÜYjA*rWÙ)À×õ Óªi·`êGu× (Ëí²Qìr# ¼è  HÛµsÚ•(“ÊøLÏŠòdù¨©Zn‹S™ãnÇ4¼à<´¯ü¹ÒÎ_;Ìóâf‡¼å¡ù\åS§ñoW;}Ó0סç›çžNd¿ÃTP·Êæÿ¸}‰’.øqo‰¾ë«Ðžã{\¦¸2Å%WŠtöE;¸ÌÚ.{|$áǃhƒ‹q- kj^Õv‰„rºq[7ÅñŽ«F4¯U¹Ê½Í^=Âå{)’ûú±yÁ$Óu„uoÒ¸àX†ã[çˆî?+¾LÕ©À¶T"^äîRÉÝé~Ýï!¡§“‡Kò4‰³Þµëšz–ÜæïñàÓ(N +ÎLæ÷i<žäLŸ$ÓQ”ŠŠp&»†É,O㬳EÞBB"°ý‡Pdã쇋Máìže¢_æi”eÇ‚kMmIŠ"0JÞͧ1ùèXºÄ“†³<Ž2ŒâH͆ÓÅ(žå[9D»f :–3gߏÒÇãCöIðŸ7KÉ-óî¢t8õGxOãü¾+ Þñý6ÎgóµÓ7õ[ ©!ÏY Æy<\LCáÏé<É"–¢Œ"ugÃiߣ>ÞðDŒg,aÓwô.÷ˆ”MÂ锩)Ò$ÍÐ%‘Jè.˜Eb\숧;ñŽké7¨Ó8¼™FLã8aA©ÇÅ(N£!£ö†)ñì’fb^¡BºS‘ÌæÑ0>~E¿D, ’t߳ܣB¶I5šE?“§  6vÅ3»cS’í@ÿ`zæYiíTZðq*-øh•–yQZÀ•®.Ò莂Dª"xg‹›,óEñ÷8IFâ5ŠD)wì0Êþ-“,;êiÇ$¿ßY„ÆahâèEÁ’kñŠ“”·8osÑ"'žåQš¢ÆÅ<“ d±ì„K*.eÑaˆ>ƒ#à#µÏáž P‰¤„ Ð±Š¸©8³©{?‰`7UkŸ«ÞTŸ”ÍVE=ƒªæ¼¾Ô DŸ«˜RÔÔ‰L9«&Í¢ñ4G³aÄßj3—:…xÄYÄ!+Lãì¸_y‹0tEFÍ\÷2ƒ`åÑâ–ßÔÇüǤ蒃>]ú­«@/p(ð*ñÎw1åªÓ@pJd±`v&”-†2³7]RÇÿDùŸÿ½âùøú+þ¹BÿDq½ÖD“ëý¾”þÃ¥Ýÿ‡4O endstream endobj 280 0 obj << /Length 1088 /Filter /FlateDecode >> stream xÚíZ]sâ6}çWè?X«/ËÒc’Mv² òÐIw×V¨g ¦¶™mûë+"™`ƒ)Ðf¿Ä6ºÊ9÷ÝkŒÀ ð¥óGë#ø Î/„pÚyú†@¤ï}R)À—‘SÀ< =Fõy†Ÿ;ÈÎu9ê|ºaPrNÁèxˆBÂ$ð9†ˆc0ŠÀS·ïPÔ ŒºÇÕ•ómôµc‘Mìj_:Àe”@*(p ‡BzæëWé¬P³"·ß2¡õštoù¿¼ Š›ç´+sbÇ%¾è>ô/·Äœ»æp;+2‡ n-Â"NgæÓ`™“í‹yr)Áëi·¯âÓ ¥k(a%.æÐGÄ.Ú%=æ*3gQ.¦:V𺌰!:G¢ ×ó¸9x;®örìÕ˜KŽiÐG:-A·Ü{½‹Á/uX1Òœžv§¦…4ª£â!®•Ǻ^I)μ’Ä(¢jL@Ï¥Ðf;°+ÓS3ýeÇa)Ã-†µ=–wX,fdtå‹,žMÌõg¦ÑòjW(¹Ÿ¿h¥cQµVZÌÃ\Ízýz²3)Ï6=OùòøÌ÷ gwñìû*WŠÔîJæÐSA¾ÈÔr¯°vöW^¨éæÅ8ïâ]渘›¹ú:Uj;ÓR†ÙÚÞTKY],ø´LY¼KŠfd%¬oB\ÿLç‰*7ÝHíâDXPƒBå³J4Œ6à½r°×ý‘ïêï«F" ×UÔ(J5öt¥‘Y1þ{  ZšD¶*|› bÍ„ÕëQÖw·÷?YI®7SÖ³eç´ì¬”C_­‰lÂX»ýÿbkûÓ `¶,¨tõ¦’ñó²#Lç}¯3èSܲ'!boBl1O§óq1ê  JZ½ü÷ô¬,ÍV[#-’üµÖÓ-¿.¶^”²‹ Úi©9±rlEÚÏÔoá_ƒÿ ÑÅæ³»Ûûáèâîng¹Nðž=3ã/m_¶ÍÒݺV n´ìÊ㹑åQ-סVXŽj¢ƒŽã™ÙHWë[Ù„mi^n«LÍBµÑ Jïl²­‘@”Hn¼„ü³*‚8QQy•‡¶W›okÕ(•­Û@@m#,±·º¾‰Uý«ÜtÑÏY ÷>p»Í OÖ+öw0“³œ¢½ ¦’ä¤5˜w$`ߟ|Jì[ƒ9 Üns¯?µ?¯Ée> ²ôðR…¶NòްƒJÚ:Éià®7‚Ô‡‚ÉÚ›!%ôÉÁ=õÞÒ“]- ©T]:/½!ã¬æhLû½¾Ê†vfï˜$ð)Ÿ,øÇ™‘¬5½ØÚ0Èëe2NâߎHv&DËF3§ëÑæK{žvCrÈ+{[^Õ#Jìë‘ë+oÑ­ÿ^*ƒ endstream endobj 301 0 obj << /Length 546 /Filter /FlateDecode >> stream xÚí™Mo›@†ïüŠ=ÂÍ~Ì~pmGÔCSnnd9°vlpˆ­¶ÿ¾kÀI!$1‰ÔzO³«]fÑ3£w4‚–ˆ  ïΣÖD‘"XK‰”ÖX3@ÉÚ›^”Ú³KD04úQÝ\# àv½Bß¼¯i|Õ~ÊeãðêÂû{gΑƑ”Å D‰ÆŠ ¤$ÅDR§hê 8ñ1Ã4™Òþ'³g+“v÷I„TøÙf›yp_><‰¦!‹ÀÇA(„¨|}'‡~ðO¹¦@Àç²áÔ ‰µ!•X‚h³g5í8 Œø¿6&5‹†‘ìÖ&ßÎûàS÷Q¸¡›×p'»<©¸¾Ž:¢Ú1îg2†#õ%vÃyS¬7lVš¥;ËòÅþ¬À^¸ma§^]™êÔ”&OL7Šë“îžÃÞ¢ÞÊoî¤ü=Ð+åü å_æIYÀ'„åÙ‘R£%œV=H²ùAJÎó€ßÂ+÷vþˆô¡tC8¢'¶“±àªáxŒÃçuþ¬†»{SÎVÙÍ_”AÐê´é9ª(¶Ò\Q|ôª7¸þæqwRÝõ7#2~AÑÅE¿ÉùÏ0³áÒ-œt>Hº…ëgFÂÚIi×ϼYƺ~f<Æg›¸„+¬Áª4³ÜI“ÒŸóÔV†¶±p,Ô~PQÝÑ:>ŸN?„uΆÌ>ª GëO °´¦z8˺ÿ}-“ endstream endobj 313 0 obj << /Length 1419 /Filter /FlateDecode >> stream xÚ­ËŽÓHð>_aqr6vû!0h,#'X­:vOÒǶÜö ùû­êªÎ$‘ÙÒœ\]]ïW—#oëEÞ‡«È}C‘!ˆŸWo×W¯¯óÔ‹—aVæ±·¾óŠ(\æ¹—ç"L#á­kÚÉ~TÃ"béÇ‹¿×/äX!B„I´($ò‚" ‹Œù¿Ü¾ùz#ˆ= ÏM;‹8ó»zªFݵ„•mMÀªkGÕŽfF—ótæÞ2,óiœ´³:{¤fÒ<‘¡ujÜ*v¢æ€>C;r-cœ[GÒ5祚’7o0ÅéÉðNŽrS±êž_YA=Œ·\W©]O3ÒÇ Ð,Ì‘sgŸ0@n”bT?mÐÚF›iM}‹8áçn7V„‘8ãÒeB{ ^¼SFÃñùL{†°seìÆC¯Of§ë™árºÉ¶ROã¤ÁJTÒ]ÎLƒtÀõé#å óíì=Fпj¨ ®'Lé+BŠÄO\³Âß­Ö±Ë8ÎxÏÍÓ0IJò#a9‹£(ò¿·¡»y'ŸëêlŸ¾ø'¸Øã<,–…¤TKLj~ ‘]ðÎ,CY–ÃboFxI÷œ6ô@daTü©ä·Ð,ì»ÁÿOéløj½ ¾ñ+vl»w ¦¿¿ÏçÉ'ÝÞU¸&æ‘ð÷'(îA==YßfTûgö—¶rЦ(7üާ§ïø³ºþþ—Ä݉ԭpâ>¯WŸ`Û2¶¯ª`²®¿N™Çùpß÷ë«åîP endstream endobj 331 0 obj << /Length 732 /Filter /FlateDecode >> stream xÚ•U]o›0}çWøe<àÚÆ60M“²~­Óšt)}˜Ú*¥‰“zãkTuÚß%6YI³J}òÅ\Î=÷ÜcCÐ tê|Jœƒ.P„c)”,‹8Ž#ŽÂ˜aIQ²@×îáçÑEr<õ|F.Åf\Œ¦gÌľYÎÆÉÔcÄ]&g“±ÙLp8'ÇãäÒ»M¾8ljóË¡@‚ ŠB‚#)QE8bÍsçú– ¼û‚â=n2sÄE€ ÎÐ¥óÍ!¶‚™èÂn±mIŽ(Ã1¥¢ë«/!)&}_Jq/¯ÎÏGÓïf=äÁI<† ?Xi¾M”éªyªô<ÍÌC[§+»_._ê4/‹Z×M=Ìhz¨¥·Ì²Ò£Â}ÔÅÊlתê÷n]gœG@‰a³¾aε/„tÓlC.01¥ÖæA¥óé¢j[µl×sK솖©ú?•d„B‡„v*‹(D>£˜[Zï<_‚Äe•®53ñRgŠâeL:ÈNÙs)L:Æøù.d܃üojþ–PV0Xl¿Ne^yÔPÓ³•-rór¡;ÔÂŽ­m¶"aêïà„rCa&»Â”CaA…MMH LÖ€^wÖXŸƒ¡ÞÅ`Öp*^G 1·9m½5ÏÖ\“Jç½ó ]uði(7‡ Ì;`¯Z§ ´*7mÔN-]èF§™þ6º,Þê¡ÎÛ"Þç¡;3ÎÑR¯Ìžïù ?”÷?êYZ,f™¾¯?šÍ?ž2XohÀ7ÆŠ±W=7×~صZyØ‹­d±+БͺŒYçF<ÕŠ0GÂkEëE¾WݯºøiÎìVÒµªÛ¬ÙŽ:UóÛ®R]ÔÍÎ@6D-\yÂm‹Fçöe®Òº]«\ö3PÏ rášx‚˜¸C¢û®oÂíý–ËûåßÇ"q¸h¥½hÙnÝ¿m¢ô endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 905 /Length 3057 /Filter /FlateDecode >> stream xÚµZkoÛFý®_1ßšl‘Ἃ €¬Ø‰Q¿¹mº©aÐ2ãh#KE·É¿ßsG#EŽeIÛP ¬!9ÃËÃû¾—£„b‚)á˜ö<“Ñ0%qI9Œ’)§0âZ´-3ë¤cÖ`ôÌ:,ZÙQ22)°H)Á¤¶˜Q’I§" ÑÆÇe¥“Ai¦18,Õ§'‚²ŒCã>]GùHÏÄ£™²O&J.ÒžFT”q„1àÀ3-"] L§×0‘imAwjñ+™vÊv”UxqºËHHS†¡ =‡Iï`3*‚ 81FÑ•ÀŒ%Æ€¨qp‚™ ‰]’™è€ÓV tšYz9…°ÚáYÎ2¼nwàcb Þßú@t³QÑ]‘9Að‚9%°ÆKæ´à†×ÖxÍœS´Æ0çSyË\ ¶xǼ ¾ɼ(åóJXðFà·*HÒ[ÂóÎëŽ šù@ò †ùHƒeA[lÆ]Á³–á °`%­‰,8ZŒO‹ñ"-×¢ðà3äIm䵕IŸ¢!1}ÑiŒžEïi Ô)¦Å¤O‚¤FZ#$ôL :Ò`ˆÐtèL HðG>­ƒz‰@:@Z-"¡E`ÿ4)Ž’ª@×qÜÑÐr)-(xIi€GQw´¤;©¬¤"FÊMGÓ5ÑiMÄBÒ7À”0 vâo«Á©„NÊHGආÕI˜„ï¼|ÉŠ>+^OÎ'¬xÅžMﯦՠNƼÇ-7ÏÙO?užý©½ÃŸÿSÑ£N?vqdèçOaôsO?cúÐOC?Cú™,&æë_-.wÞÒOµXšn/Wzþø fðÿÅex þpAòzñ„Ïh¼'o!Ø[V › "òòe§èÕUI”_•MÅž½ú·‚ËrilêG¡~â‡çyݤfϺד«ŠŽF÷Ó¦N—z}ƒÇ“ëM4ÎêÉõý Z9{uÀF뺬¿°È…À’óa3Ó»²ªËñär:(G%~.{Çüü¼“Q•Ó~V×ëŸ8ü‹@‘3Å«ÏoïöÙ‡r4­:ÅÞ1+N&õm9Â;v™ì§gó¹Ó³cºÐﲦ¾Çyÿ¸œ~¢åcœœ¹«X±ÿ¹yÝoðˆN1(iñä.ßµWN«ƒÉ¸aÅ»_Þô~ùãÇÞäMU^†ãêÅÑðæcÓ)öÇ¼Êø†¿ÇÝñt8¿Ð¤êiÓûXÖÌ œÎ«j:¨‡wÄw ôR‰i‘”(ﯚ„í  å+ÝÞÁ3®›Sö^Ó0±Ãÿ>ÿá%–ÏÜ€CЃCŠæbίÃqS[ëÒ»”·Ð‡ý«j\1ù|þ*§½×â×iyS¥`ø@´ÇUSBKÌèî!4-«ÍÀa*³z þ_ÙÕS:…ñ•S(ʯž¢øVOÁ'«¸zŠ"¸X=…§åê)D(=cFу¬KèXý[UOaÞP… /.AYNîo÷F“Á';ÅÛÉýøºr--˜su: ©DCTÊ»7i.‚¢ï¤4÷ŒƒŠŽÊ›)2…™²îíM>CÓ^ÐËÐ<ܳ¢H%/fóåípô…=ëMØÜ(X2Šçy~8ª åH—’>Óó™žÏô|¦çgô¾‘@âÓ’‘ ÇŸŠ'õuU'N‹‹âMqXôÞËtB²j¾'…F¯5G —)¸‡–zˆÃ U]öm^öaxs_W|PÞ¥ìR¦ä¬M,Âq¤Ê䨹T~DX‰eð(ªºMO“TqÔsTšrMuRô<ÚÕ ™çÙr0¼â¥“4žÛ@Å™äÆú 0TÛ"qÆÂíQùá¸#nXÃí‘´Bz.À ½@ÙŠªÖs'ÍZºm6 N…Î"ÊL'È^âZ ¦m¥°^Ã0ˆžK‹Ëb½N˜öÍÔ”!N¥©µ@£äZVØÖA( »@‘7(£­)ëZ®m&*0Q‹H„GÖs·ÂyN½‰1ŠÀŒw¡r-ˆÐ¶f‹T õtd%tIŒÖRŸ:r±ÞJöÚô\RxÊ$¨¬€ÿ&n ˆP+ |ÊN¾öx÷ÚÍ>hä#}<–Kâ’µÜ!³¤˜¶.¶˜Ô¦F„€â_ÒŽF+¸wšv³Ò§Ë•R¸›ÜÞ©ËËÑðê2|lQ3=}•S (³¼m+(÷ÓªnPD¡K¡OÍ>êßáSCË=‘½žôÏ»GG­C0VÚEŸFµ„æN¬Æðk¿ûz¿}ÉiÑçäD©eäõj?Ú;ï]öÏßž¼nDú"äÓƒ´ýÖ‚ Oô5O~Þ êň8û>C½˜¸Ú]Ÿ]þÚßÛ:ŠH?tjJ‘‡™ 쯱ÿ®{|vÔ¾FÀy{G !9¹2j">‘žìÿÞÿ¦ï¡—wi¹Yw+É£vtéÿc÷תµÖ@BjýRÜM¦o)`¤Üƒ& €Il…ÁñhžÜ€æ £†ç,jeéÛëïèGý­â÷íÇÓ³-ŸÛIoyí&é­Z+ §Í·Û¬¥úÍI·ÝZ¥.aø n¶ endstream endobj 342 0 obj << /Length 620 /Filter /FlateDecode >> stream xÚ•”Ínœ0€ïû>‚T¼þÃ6U[)­š(UÔVÍÞ’8»nXŒÀ4ÍÛׯ.Tm/ØŒg¾™ñÌ-@àb…¦’Ôoýr±ú¸Y­Ï9XÂ4ãl€@Pr¸  6%¸‰>íòƪ6N‘‰ï6_Ž8„H‘$‚@ ä" ö—ugóªÊ­6õ‚õ›£p aÆ9 ÌAp€|û~öãrp¾>§ô@rHeêÔµ§§QÞÅ ÍPTª˜¢èWLÒHU¦Qe?i» »3Þ[c©:o ã„K'òÆËŸêÊ䥮·A˜×#ª¯›¼ˆ ŠÝÙ›8aXDÅ.¯·*œëÚš°{öZ¦©÷þ¯×Õˆ)u« kü¡×|ñá²ɘ`‚1ÌÒ4¤Ù¨öÁÇîM\v{÷2²;6ᬪBìCØ^ÜYÕtoC ÆK˜@Ƥó 4Ð1œëÜ$iÊ#¸ŽqT˜ú!²í[5DçÍÓlÜÍ-!¼i•Wüý>” c¹’>”ÌÕ•ò©dï‚Æ¬ø –M ú°†DŽî뵑A–± ða¡mfîÂMc’ANäB6¾e’Âì]©6ézmÕRbR@Fåɉm‹b„°¦Î9žt~.@üÅ‹¾ß/A˜++;R[U-aø)1)4¹ÝuE^©• ~:j«—âq…áødHgûR›…BwÇ„ü_ü‡„0— u}âˆdì²84ûüѺšŸ¡Ñt|`é¿M]Ë‹i¦F}=´×J½~þªqùõzsvuuø<´ã“òf£D׳·e˜»y„Óúy³úBKä endstream endobj 351 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•¹Â0{Å+“‚e㬯2 p qºC©ˆ !¿ ¡JE5+y5ëaÜÁXªYTÓ…x Ö–ˆ7 ‰spA“-[\²ùª:Äú”O´ó™¦/×»sÌgÕv[}×û]ÞĪ£zª"é“·Î{òZpíÔ¥a´ém¦2x¼úÍbJ2R¦ù³:*¾øãÈi\RþcÇ&1dúVé~GSËÿ>x endstream endobj 357 0 obj << /Length 1433 /Filter /FlateDecode >> stream xÚÍWYoÛ8~ϯ°/vk«:,Û °é‘"EÓû°È-Q2Q^’ʱèßq(_Š7û°‘ôpæ›o’ž“;žóùij_7ˆpˆŸÏ'ï'ïΧÇŸ»Q<õEæÌ:ÓY蓉³HÛÁ‡[k.‡ã ˜ÂáÝâËžžVI¸¡7P‰çŒ§{±Ùÿž)‘˜Ý?Îùp<ðEæ»ó0tæn<†Vßô…FßbèÞ ŽÃ‰?H$gšãذʬ‰Ji€ëGƒ¦ä•æ©Y~Ñ€K%j’«³Ý}l½.DÂ4Œ`%š8KVæ·?=/(øö>´´p¥¡Ì*˜öQ§Ê†!ÀDÞ¢AiA,‡€ý™$WüêúìûE@‹u]¸ÃqƒÅª% ý÷}7Ž"ãÿLÐ= ZËø}´Rˆê'B«8g9CR:1„À¾æCàP à -ê*-Jnv”œ©Fr$Óê_/A6lýi­Td®^#8Vôƒ®IÀ|Àj"XAà+¡a"þ6õøk©fsGžâ4Q<±{ u<Çw$æ¾>qn[¡¯@…¨r³£_f>—;~ÁÂͳҼ$…&I úvÔÎÍË˳ïôíÝ$N@Ì! ´’rÍD¡À5ßµþC5EX‘èÿ™K€Ï]/lÚàxÅý¸"vŒÕ¢¨‡ÍÇŽõ\iötºƒsSwÓ¹3sã™çSÝ…žͧoÎO‡ã©z×LŠÀŒo¯®WßîÌÌu]3U&0l­HÝhœÝuþynP=¿9ø×JÅЊ¢ØñÝ0¦F”óŠK̃c¯Ì¤Í<,Vr(KÕêð'sècäÓFË›ìƒ0v}oÂ37 )ùnÇãl6ûcþ&øÿí[ãG 1ñØLI7Qqö•ȸÁLÏ'˜mlZ˜²ÎhÙF Vå ÐK¾e{ò¢Z7Ú UÝȤë h›"¿Dýb%Ô6K¤Ä®UX—8ªx•b’¦bß,kt]B]&{ ·Œ“ãÃTŒ­ä’)žZk/û²IÕd™x¢U¬S c¢N¨8ˆ7‘œ³Z–qˆ^fHNPÓº‹ˆe«é<ɰ„qp^K-YõR<&›x¨ƒ€ˆýTHyÆšB3{ïâè8!âé?âCð_¹¬›õí©¨ÀÄÝͻ۷Vg¯<`>-ááµf+|öPy\Õvƒ5¨F6Ñzأ 3 ó@u[ WèÚµt Kël׺ۓ'çÄ RYKë’­»ºÍiZ+%–¢úy7€ªYcI©Cz¸Ü!¦¯Fz(Ìš*Ùºu€ŒH»”°#És±•åÚCysìêU_iÀM8¬ÒMÃíƒ Ô¶<%å7|?,»}åÛ^,9ô¡£y Ríóôµ‰yŽÀåð„éö÷1ë+àa—>÷ ßFCÞ_hKý_ äÜÍý®ÓK,>æ2Ö{r­ ^) 2›’"mOŠ&ímåïh7w1R)”LþärÔã-wsÛ´îïﯯ.¯ƒû‹o¾þøø 椺„祲m‚±LÛ¶ÙÑÝ>öÚjÜüÂ9}4Ì#úµ'ìµnÉßûþ¦‚=aŽÚ[ñb}×û`ù´8ùª£ endstream endobj 363 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚ­YYoÜF~×¯à›¤…Øá1¼Œ8XY±ÉZkÍdC Èž™^óJ“”4 ýø­ê.žCÙ2võ2Íf±Ž¯¾ª>d[Ã2~9z³>úáÝÊ3Bù¾k¬7ÆÊ ˜åAä0ß6Ö©qsrñëùÕúí‡SÓ Â—éß7§®ur~}y¡ÿu}~êY'¿¼=ý¼þíèíúè¯#,X†m }І,tVF’Ý|¶ŒÞýfXÌBãAIæÆÊs™·raœ×Gÿ<²Æ^ú¡°(°lô2´È¾ ¾’—7ï¯Ö—ïÿqþûçSÓ·¬“+)ЦÖãf'h´ãYEsü±aè­aFÌóW†i N¤µ‰b#2®^ÓÛˆ­|O¿¼,ª¶ÑZ””qΟ×wS¶ Ê~ž«\-{ÿ¾mžµ¡†—š*Iª®x"6‚§g¤áêüÃ¥£ÇmÍ{$Fª”/Ö$47ËË”Õíf#µ´ØÌ>Kt 'q–ñ´T µ²)>dßqµÝ¿-þ)qÛŠX†† \!´ÞW¼øãjw¢ŸÊªeQëí ü1|ù;¦ã€¼€|À<—¹1ÍTÔñ]Æ_—yuó*’'¸çO[Y¶Õcì¥9=O^50½"-–„âqÜ”¹HŽ)ljHû‰<®.áñ0}Ç›¬­w½d-ŠmÆûÇR¦\òô˜ ’4•É—ú˜xµÞñš/{¸)e>Ð`dœâU€t–÷EA³‹›N£B²‹8ËÈ“]ùà†Œ•6qý…œ¯$¿çX߇Œ8Z7²ÍA,FRÌl®y˜l!¨·lË(Ž ^é,œédušFÑ}ÓCϵJ§ žL L]]ì4¦ î™E™ò${)5ž$¦w}Ë .À»zÿÇ•sûóï—×ëø§gó8‘e=áÑaŒ=Í¡'õ-bf¶Š%vl™†åæ%7eçÔ—%®öK¾í¿Ùè=õ\M)š7ûÎi¨¨ùš¢{ÎÌ)ý9õÃ,në¡G‚2`¡ƒÍÈ\ùBdôãƒhv3yɱ="í!ú7iÕTéçgVŃv—¦s>8NÊj/ŠO–gýXê[Pý<ÙÇÓÆÅ~û¡÷I©(4=ùÄÐcʇzª±ŠkšIã&¦Þ&Ë|î¬äÀ§!Ýð˜N‰Åþ“ìD–J^Ì;Ù},U˜®•X¥S`OÂeN痢ѷJ\LkêGuïÆ$çé,î»®¯ó(:‹wû9Å z”‰;Ëý¦c¾ws¸ 9„¢n«ª”ý’÷°ãÅB‘áwí¿ЖÀ/ TùBšy Ë(|½-Ú'Øõñì©n‹§j+žÄ]þ”ÈxÿÒFØm«*Yneœç½›ØhãíÁj‹Gž"‰/f}û.cä·}¶¸jFù ÉÃÄõ53`¥•w-Wùt´¯#Îô!Á‹‡–ÖºåwËo:Õ¥>K`5çÏ´lHÔYç¤ël‘;‰@§;Hêœ%ÓR†ÇmÖL)úŽÂsEg~¾ õ×B'ïÆ¿ÍfØ•¼Žï »O±,ž$ÏË{þ\ǽÆÌÄÔlW¸ö›µ™· ;ž… •ñW§¦í€àuSV_Yc‡§£"—²³›óº†z™W>/’²…œKÄÍ»!spÓ=Þ#<ë08þ†üF¸ÐíÄ?ðºí¨w×S*<’·ä|^°òiÜ_i¹êaÖˆŸß?~#½&D§4ÊòΫ§¢4Ñ—çzÔ÷¥Y«Ÿ;7€ÿj©Üñ]|/@åÂÁpVErÊ¢íÞbßýںߒõÅ6Á³31b±›rt”ʲ}qN{f‡ÿwf£±•Ë,7šø9áúØË¥R|n ·ˆ)1ml“¢DBAÎ wõåìŽàåI[Zˆ¦TÊ_š•Éñÿ«Çòïýë|Ÿß¯2×ýîw#]_ØÎý#íVþ^'¥äfÅJ¹ýI¹üÃ;×]‘ÇgvH—A}¶?u0pýL±=@V?uW18.iNÁºIÁá'Ërô¥“ºîŠÀ¢ã£EžgE`Yóê1ΫŒ³dÁ9ÏgNdw’‚4?¬3©]-™nNmðyl¼~¥.ðº›7Ä2d–íBÈóWó'Çñ&r3Cf;sgñJiÉáÐb¾ôCR\'Ð𸎯ËS£‰5ŠDÅ÷÷§Ž5Y«ŠÅ } žãæØÌÜáæ² ;Ih?®ÆOÁ2ôÌU¤öÙÊ%8m41ø5ñ4P»[Q`³Ö’)½¬²–äñr¬¦ 'H–턲Í"ϧ“i9DCŒ—¨rK·© )7J@µìùÕå4m7¦çùÀ÷ ÞÒr8Œ$ª¡lÈUFÊ»›5EbuX$I‘úI‚)À™;$ü~Ìp6㎢ÁÿLœ„•pôLKy³mŸ y¥&¤‡ƒîc?Œƒ? ¨úÎP½ŽÜÕÅ…j‰8¡[²z…54Ó šaÅÆ»ΪS¥J09§óë 3a †] Â!Ašxnàоß]è§¹97/ Xeþ±ÑêÔ1d}G-. Ed&8˜Ó‡¢B\¢zw —z:Ö]éiòÀü Þæñ£È±ƒ´yßyGD®Pn…‹ÝÈD³IKE…õ®×ã¯NxœìôHçé ¨°p¶i«Œ†¡º¥<‚w$Ÿ4ÉíÈaB>R±Â/žûU¨¨³Ô¿¸¼+$Aœ‰ÿèPafÓ áE†u/زçËC»Ò$…– ¹ÜPýSÅŽ˜ö,ýd­,’²FR>óžýæ×ͬ;N0哺Š;¯k±í0A_UôÓ–€1؈?t†sµ„.u#:üÕ7À8œ¡3*ô:ã`ÃgRÉUNõZÿ”Ÿ~­Ÿ*.õ@/¼š,> stream xÚ­UKoÛ0 ¾çWèè*Û’íìÖëÐaú6ÀmŠ­ÄBýÈ,yAöëG=ìÄi.vEQÔGò#EÐôyökÂJPˆR‚³$Ai–á,¢(¯gϯpö/3´·–5¢,ÆŒÆ WèiöcF¼¯«Ùõ]£ /“$F«Íè3 1IB´*Ðsp£ç‹( ÕÖÂI»V6VI‚¢ï拲ٺ3]z#§ï-‡kíÆÝMd£´7«E£EáÔ|·«dεl›+£¡'NÅ´N.ySTB9ŸnëÖ­ëñ©%¯äŸ9¼ãŒHЫ àפ -Â/sQËf3IоˆµEbšJ·õ²ô:„ÛÕí`5&Ï1¥Áª”ÊåÜ_[û[EÛˆ©ÃQa“v²êý<Xn³71qƒó >˜(ÆÒ¢0Ái–"xÖØÅôEljõ¼`,™ޝï€GNÄ ' {ëCiƪØïœñ„@1ÁÔÁx=¤§\õ0Õöi:(-ê+c7E·H^F ³„5ùAL¸y!ˆ³h°Ý—Âׄ»eä ÈŽƒ¾t¾º<Ï…RCŽ,:Íà !Q§|, Àƒ-ÅË4œVî§ñ".Äe^F逵”Û²:\ˆ(Jq÷†ðEÞÖP€HÃlh#Z€4L¶Ý9ö™+·Jí e“÷×Õ†š}^ºô¦×OGõhâý=‡Î])xá|é’7À€:à´=a„ÂHÓºlQŠÉ2žönÕæóˆo0+†ÖÏNÚ7à­•ÍÈø ¡A ƒûÆhÛ¨FʹNâUå„qœø‰`t›¾ÉÍN &ºk‹>70ûµspò÷‡›ÇûèÀ¿èá­ÅðnU‰ÂÃzÂóÝLýnëÇÿ#0ÿlf}•Í›-eœ¹9g‘a­Ù~;í<£²wÞIÆt¤¬Ýô¾ÝKѹ‹…Ð\VÊ1Z”w§¦Å6Þ¥,óß„ìÀ4V'ÓØ"Àºë[daÓeBò'À– “›wÛþ8`t{Öz€†¼–}|0»y¸÷ýêk‰'™ù´zÿñ²þÝùvíwKÙI[2lþnj¦“ŸoéùÚ4 æ endstream endobj 376 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•»‚@ EûýŠ[²…1°OJ`µRY+†JF)¬ü}wxTTV7™dNr/0Q±?hO¹µ á ÍŽØÂåÙa@—TÇâê›ÜeÎ'Šæ,¥â¤hOÕÜÞÛBNšZöá,ê >")“·‘è=ùLã1Š®g qv“Ê=¾Óæm­býF+®‚—/×Ü0‹Èˆ[ß…¤ Ù“¯ŸÖ£ÑåNÂ>ž endstream endobj 385 0 obj << /Length 1380 /Filter /FlateDecode >> stream xÚµXÛnÛF}÷W}¢kµ7.É .º±á ® [/… ¹²ˆÐ$ÁKêü}g/¤Dš²,»‚ìj9<{fxvvÆØyp°s~„»QOMÕp~ôûòhq&¸Cä…‚8Ë•ãcáŸ!î g™8wîé:*YÍæ”.Ÿ}]~áhJÃU Ø™ Š„Ú÷—§óÛ¦Jóñ‡Œ‹DýzŽÔñ\œ1æ(‚u€‰,Ë4“óeú(ç§EÞÈÃîS3›3ÂÝ/ØÃ°% Ä,Ô p'ž [Öf%ª¤™”Q]ËÄ̛Žkû0IW+,+™[ì×f²jó¸I‹¼ž0šÍ¹GÝåZÖrüXÿÌåx“2ª:[µDB9I =Ï8¹ÅÂÆLÌXT‰þ0Uhj,«"–um5‘9ÄYmlÞÖ¾êMÏ}Œ;àÍs?¡t¬–±»±W®J™_^@¯®?Þ\P»mÏ(v¿G²ç¡âñ#M¤%ó(£ÜN‹•“Â~û±ÇÍ:ÕáT\üÀ­¥4 ;âTJjrs~äÜiƒë«Ëkz#À•ûÎ?ûŠ‘‘5Œòäe¤¸‰o7á¦òÂ"*=i1M Ã7y¸¥ÒûjD‘c­Gp "Ê‘:F*"KuÀ=Û  T¡ÔfŒv=ÏÍØtP#˜Å_2™?4šÓâŒp'„£G…:z$àˆ†ˆiF_0fÆjp@9 ƒÞæ»…Tÿý<ù1ƒm¢¬•Ð#Ìø+éÿ|7 ýu ÛC˜„ÛØ;ðÕ+¬³;~˜¬=–™ü0±œM} ¬"ÈØHÓ;>@@'à`æO|ÆÝ(FµËQ1)å ¤¬Á—Lfø¾²A]ÇÙɸâ‚LDÐ æ}{›¡>)â›0¿Fžr{[ÿ¦œ¡ãàÔuT_¬N¦Ò A^!˜9 <¸}ÃA ¸„ä5J2 –ŸF8[ZíNe$´I(D ?ðADùa§J½ÕèëˆÐ_Ê}¨ð:û¥&¤“ývÚ1xf®2êZVöɶ®žçÙ¹Ç <¸) ¢Ô;Ü¥² öÄG!ëÎÒª¶©0Kó×úÐÖ-°¶åŸò§9äm–u®ukú¦Ö¯ašÉ 7©@Ø£owSîp3@|“ ÿŒ^ïåŽ2Î[Hˆ§õÊbœÀè#J¬Æ8‚ª‹`Œ»òaÈ\Ö1 lëÌ«R%Qö‚Èÿ[Ùý«}\®+%õDðD€|Ñ[ßJ»t5¸rs¥Þ Œ)(²¨­åð†nu¥9y'÷•Ì“´’P;ê;häïÜ(Þ!¤&¥P…1²ÛÑ|ø{§wC¶ na¼‹í•ªu ð8û„(Ø{'åÂÂÛƒÔàñwñ¾‘I«€©[ÍGŒìUUÕ#B]xpÜ;ˆ7Q¿×°u6•ñU*Ô=Ìëà âpsñ®˜ŸY•õ$q÷©·xÜì%®O¢¯½ztµÎDè}"c>vûj²6OMó jÅC­è¦FlÖ¿é¤g–©KƨÍ(!YHÝIÛs bSˆz©¬ ùÌãŽÁʬ6¥­lÚçE£)m›íA§å09{85Mðy?ó÷Œ@ïS´ªôÝXR˜˜8ÃÄv™~ß?¿Ð])€7µm\ؾه ¨ÙÌM‹“ÁŸ L¤¡w/šëoW½];#nž˜•ÔZìîþbcðBc:ŠëäqwÉÔª©lîksõWS’íú) úCýëÄéñ‘Ïû†§PåšÏĢʙ§ Tµ±ßgçßö.ê5œŠÅ›.Ý¡ehàc7~Zý OÌ® endstream endobj 394 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ•¹‚@DóýŠ1`ÜeOBD <`3ŠHJ Œü}WŽˆÈ¨§k¦ºçq<ÁQ²½gÛƒÒp”#á&!-4lšð=Ú(;¨7qb]¤hÒÌgqãëÓ¹œ|^d—üç:_±Â³7¡‚CÀrrÆÀ:G.Q¸¬í8ú°«ÀI¦Ÿñr€Ò’´’a~¡a7Æç7]ej"ÿI\ÏIJ“ 2ò >B,­æ Ž?× endstream endobj 402 0 obj << /Length 1490 /Filter /FlateDecode >> stream xÚWmoÛ6þž_¡/d bIê½( tëÒeX— ó€IáÊs•%×’šfØßT,Gº~Hx¤È{yx÷ͽ[{¯Ï¸™ŒQÄáõÙó³§çI䉌Åy"¼ùÚK9Ë’ÄKÒˆÅ<óæ¥wíÿ´)vÚÏ)3?ž}˜ÿz¤Ç(‘’…<“¨„{A"X%tþ7]Òõ-ï Þ¨¢í÷j«êŽþ¸o;µ0âBxz†^Æò$ ­%aN¶Îg!÷ô5Íý¶+@Џßõ;ZѵîtQé¿‹N75­Uuú㺯W8kiÚmŠŽ¤Uaw,Œ÷ׯr_—N™;¡Hh–©•=|ù¬”ÕY¸#•^îg‚ûè´ˆ}í64ë#UÅnWéy @!B°<Ž ƒbûB™€U¥Jd©?ßè––ÝX6µÝ¸œIîߣû«½Íx]ø£4cYj´WTVu³ÝéÊ… }=¾îhB0Ѿº+tÝ>8dEÌ4WдÆÀûíÓ ç3Ž„»Þ‰¨/wª~s…eˆT«H4`Ø5袪ª™Èw”˜°|uùæJÚîÒŸQÚÌóDÂÒ,õ‚0d"–döFÊx´‹Ãáíq‚Â[8wÄqBd‹½ºÕ`Þ¯ÛsøcC×þ“ñÆš³$‹¿ÏèkÕ-,Â` ßbt§mr—“N$ßïD³3ÉùZ.¾ÌàúÕ¾WNyÂÌE#ÜYŸ›ëÌ¥¿Wm_QÂât(3©ÌHƤDZ2ÂlW%Í å¦,$]˜%þ«Þ¤³qÄ+humµ9-Û¯áâµÃ]ÂoêêÞ- ÚÉ#‰Är˜æu*Z¼QjF,. àÄ= )~'SÀì¾ÛèÕf¨úÁˆµkyóXíâÝ»w‹÷ï* k¹xd÷i›ËòGPìKSû j€Ñ0‘²k+Œˆ7ˆúÚ°HÜÚõ\P8ùZlw•ÚVæåÐId‚DÆÐÁrðÏøµ½r-a±Ö•b+:1ê=‚C—ÃäØÛ ®±NomyAVÇã<³Y«>÷ª^)‡º…iúV•ÏŽŠÏµG*eyÊ…m!gIb«æ‡YpîÄ:Ô2v^ë[Z ‚zû‘ÄçPDí\@Kj_Ðâ?³ •0Þˆ02Žç,†¶ä,‚ÁhŸVK©Œ»«µdu صwH¾¿(d³˜Øò鹇×1™ w7Ï'4¦,2·aò„:¸$xÜØÍ/&“Éh°WªºéT{Ôz€ ´ëG­êH öž<²ÃBæÙ‰B6¼J fñ³r& ïv´µG"RVëö(_^½|{!-Ïæ)Ã<<,ÏW½"¤¢Láª,õK]éîž¾B¥¶Xå«Jð ª*v¸ÔÛ)è(ñíh?‘)j´ˆè=ÖqGÙâîÓ„^)Àtâö´+ Û®‡ôÀ3‰«Ü£Ì]/ÁôÀ‚E¸cè¥E_K¸âUWYd ؽÝöEf¨µe’A'ÿnoøâ‹.U9zí0ІÄÕÜc2ÈK>äe×4•ëªÐVs€0˜dnïûåA/u—·³ð!éÿ¿+¤{S´ßöFkïá5ùõ›ˆ/#’^öζŭzF¤3AV×—Wó‹Ëß?ÐŒ1fùÐòõ‹¡aN[Ò»Ó݆¶ïQX£çä5NíizMz"ȼy–Kû«¹r3Ì`÷Õ^×]{¤?¨:éXÉ$ÓrÑ)µP¦PÆ–b?7Ö˜­ wÄx¨BâŒhÿ€½í³œ€@2·ÙæŽ]&QaýÇü”Çw›¦R#,,@j¥Ú¶ØßkQÈ8´r㤭©çŽ^_Ø× 2kd´!ÞáÖ“ÇpælãB V[pøë•Ú+@¨å“îÿlÎ6¼‹’}8 þ$JH‡òåQÅü> stream xÚµVÍ“›6¿û¯Ðq=S1†N’©Ûº©Óìfk“CÇñA+V—¯ X·ÿñ} ¯=ÓCNH ½ßÇ{zˆ ôaò£?yó‹=G.ög†üYžƒMÓD ÏÂŽ‰üíî~úuùè¯6SÃZ¸ws¬žŸÖ¿­>¨‰?µÉÝg5^ªÇýj¹ý²Yݯ|õbûÇÖ_ÝO÷þÇÉÊŸü51A€D°ë8háºØµlÄ’ÉnOPß>"‚gž‹ŽÍÊÙóžÛ3Çh;ù}BÎU8.Z`oAÌZ…;Ç–i¡…cbÒª0 z|6 &E^N r·û™ç’3Zò໩áÀ›ªàj`’G"K ‘ŠRÐXüKK˜ª"-JN¼¯Õ ÓòÀ2¶¹{”"- µº<蘀¯ŠnvÝv²`y-YIžOáë7"jß ª±ë!Ë’„¦Ám®,ŒiTìÞ}%s¥Õ BòøTTéI  @Ä\Ä\ªY–×l[YK›ÅUÀi@¤ssóHœÄSrb’þs «?EYTmî{Ñ4Žy ¦0€KRô Æ|4âaÏ] ,*rÎD(˜ZÞHÒ…Ô¼ð´T“#•©HaIŽ x‡™]¥>Mä…JAŸb®c‚41ª³˜1VÉóxšXP­Ñ(wµzY%À§©ƒÛ‰F¥¬aLâÂÞuˆºÈºz å(zIeÄõ˘¦QE£WoÒ!ñÕ£±Í^Š„÷ëÕ$aÈegªÎÑy.í ’·ùÈ^DСc&Y¡ÃeáH£E/šË^ÒeÓlÈñÛ¿@í5çQYüêyûü¸Ü¬-]íúz’VÉ—¸¥1Œ\Ÿ2RÆ{ û*Dj„åãú¨&Ù׺D_TmÙ†¢+Y–¥»¤=Ùm?ଈÖëÛ~QïÂeê®Uع9eÏP£·9xÜ´Zç‚O[ÕjEóŽÿÝunÏìQ°®ÁtZÂ,޳cwPuÃû^±%ÂÎ0ž*;pö\÷´z›Ïã¸h#@˰ŒÚv ;Q÷Wh"´”‡B{p3û"³Ð ‡æêz¶«ñ—®muÇV!]žè"%ˆîŒ×Ð#¥JÄ»·çbêÒz¿×Ž +†ç˜öe'¢JžýîB™%#÷#­ùªúªe8s1Ü!7<‡¦Ôê·ý·E•×ß(X&¹‘ãLFï›hÝÍ䵋Î|÷œÿs͹¼¤éHö;ðh¨šÖø?½‚® endstream endobj 414 0 obj << /Length 1125 /Filter /FlateDecode >> stream xÚVMsÛ6½ûW°Ó¨Iá›do‰k{ÜilO¢œÒN– ‹ ÔTÜô×w%Y¦"µ'‹Ý‡ÅÛÅbiò”Ðäæ‚ö#áÊOýpsñnz1¹Ö2a9Q…fÉt‘d”äZ':Df:™Î“ÏéåÒ¬;یƜç©ý9ýí'€pN͹¡ÉXs¢³íîß? ñ§¶‡¹um×lVÖu¦+k7Ú»<¹"ÉI¡µè±%`3ľ šÖ4ËÓ•q#FÓ©p½Áã`VúãFc¦Ò½3ÃN·´8Y¤ªªG õ\º'¯ižV¦Eil¿T¿–s;'þÞ7Ï÷¾œ\¾yó ^í ÀXžd¤Èh`I"¤NÆ‚¶?®æh¬)M×õj3~Vvý¡‘Zi÷hŸJ÷U´IíþrfeaÉö±ä™X¦ê¬›Ÿ;×±ÓHßwËÕå6§þÛù;›ƒ\¿ŽË6ß$M;L ÷?CüÃOø0¼·w§ýìv:péaåwW7·wçñ? ðö÷éÕݯçñ>ŒpÚ|À»{ðáÓû«»s.»S< N²"–_dÂ[åéÌ8œ´k;+ßüB¤³znQŒ^·þÿŒ{UùeÄ!q±q³.hàrWl¨Àâo³ZWvÏþ¹ì–è(D¿G¹öŽrõPq¸gpéãRan¦rQݸù&ˈ(ôkHˆÈ ”„ç¢×&x¡ÛŽG:"u5”Ix!k á#”Ë—¬Æ#9Û–‚ÃÔ€H²ÁHei»¬7•¿£ÒHÈàœãl›Á~Û!¥©ÊâwèÊ8"Áþ ¾C/¯8® 7 åE0Qäꨶß9ae»eÝ)czÅ+½àÁ; ô霡OjR= ‡倳L.؉÷”©^¼§£pZž ÆbJ±ìˆ‚a@’› Ù&>.ëÅ÷Cl¼ "` z¤ƒ & $‘S쉗,Þ¯­ó¥TP6›’±ômx`Û ð­B÷ìEÖº!º ñ•ç@ÉõÉ‚ŸÅYüsèN·áÄ¢1³ë/²KrÿÕ›Xš*ïÙý°º9/uuK§¤/t±>à>ä¥T"}I°:;|&#¾ŸTÏžtã}ûÖ¢æ+\T 9Lb3ŠÚ¥³ºiì¬CY·„²Í û5O6´2ažrЉ.¬m³ûÁ”ןÙþ÷ÝÏ™®®+⫤L?Z»k“±Ë¡ KßâøÉ‡›‹äsP¸Š_aX\úv¿)ŠJ­í:ïÅ~ën¢pÿW ‚^{ÙS¼©· þ9>lЮ¦ÿNa› endstream endobj 418 0 obj << /Length 191 /Filter /FlateDecode >> stream xÚ•P»nÂ@ìï+¦´‹lÖ÷¾ÒA&€„qì¥B®@¡‚ŠßÏÅàŠŠfg¥YÍì ã Æ·úõ¹´‘’÷ò £Y“’&_AN8‹UÝIÓ—:ÄÂӻݶ{lûaæÖí }©¹Øo›VÊÄEý?d½kËQ6ªuSUvfTLÑ{„)j‹ãUFÆ)s0™qŸ.¯°Î³&ï êGñóû_4]È’ï(¾öðT²Ž|†©†ÊN!f׿üÌE endstream endobj 422 0 obj << /Length 605 /Filter /FlateDecode >> stream xÚÍTMÓ0½÷Wø˜â8þJ‚¬vW qË 8¸‰»µ6_äƒ]þ=ãNÒm»qAâwfÞó›7ž2ò@¹ß°õK¹òGÿ¹ß|(6ñ–$ɨÊuBŠIÍ´&:T¦šùÜìM?Ù!Œ8Ï‚4üV|ºà9pN˸'a$Òœê4Güí³iúÚ"þ¦«ìŠU`|'Éh®µX™$0%ÈTì=Kš•l9u I°à§ç‹ï’„ääÚ•¢ îgˆ{‹gÔ)Må± ìWÆøó&žÐœ‹µðÝo˜²µ ÷f°qÕ•qט¨Àñ؆ }€¸m›)»v2®ñ×´ö·óå]]w!ÀŸ\û€a¯±¶ã4ðb¶0… ´ä);L2Ê8Í…"‘à”çÕY”@KÏàÝÍ©„Ùåv§9…¹ÏæÑî\m¯te ("!iš‰Ó9iéq!gEá>¦N[† S×ì÷¦Zaصhu*hÌäº3/qm=ûìê -‚ô´^ 7LhÿÜØvBb˜v¹an¯VÈ`ëÚunvôþSxe’'ÌW¶éÚh5)ç¡—<]Â3ÙËy–]Ó»zí(µkó'Û/P³|+;–‹š­]0f{x?B°Æ¢ÂE —4ã˲¼¯*ç/4Þà„'OpÄÈÓÞ•{<ººž_äc ÕÃa—C·;†wîáÚ!dJ³¶ 7? ¯,›àŠòDüŸ{ÛÃC±º ÿ„gO ¸Øàê`Ô?]ôDR!õ_ì¹úÞË×{þêÞÛbó 8Q ) endstream endobj 427 0 obj << /Length 172 /Filter /FlateDecode >> stream xÚ•»‚@EûýŠ[BḰïqÕ¨[˜*‰6RXùûnxTTVw&393‡ãŽ=Û¶ÞIKNkð„pš¬‘0.'!th’òPÔÁ_ÓUnlbhL/NõÑMyÞú´ ó}XÙ '«5Œµds‰GÏš–£‹³ œ„³ø›=¤¤¤ˆõ7va|úoÎS™ˆü‡¸4HR‘Ž1ˆfz˜¯F™w=û endstream endobj 432 0 obj << /Length 1156 /Filter /FlateDecode >> stream xÚ¥VKo7 ¾ûWÌqÈÊÍ;@n§nãxáî-) yGÞžý¼>;¿Ì’ *DZfQ°~r)Š, ²,e™ë*øþ²Óýh†ÅR©",®;Âñ J‰X Ad°ÌJ¥éÒ£q#©ßšÚhghñÙ,¢(|r' O;LÞ*QFQʆò\DŠ "Z,#)exÝUûZö=Ú®%|F<¿Œã e–Å ‘(‘— A¬wà[g¡mÝWŽÒpߘv$ò°o7¸Ò‹(¬íø<ÉÓx³º¸½R4Z€ºv´ÌBÉð‰0í8¯¾(ê¹Î"–!~DÃZ#íB0-¦f.©«Šæo°T™ŠÔܾï;OdÈ(["ŒE‰2M)M7 5U†½‘`»mm;ÝÒì¦7íõŠæº­h²ºè\¯­öÎû³SaàO™cèÛÛøÖ°%=yÑtn¬Ÿî4Lžðù®ëªw0M¢Ðu§.ä%U^°?8£õ†ÓbÚ ‹¸]·¯+žSBp5¹óD§ƒ™h? ípñ„AóþZ¨4œlº®a­M×4>d¸¨mËÛ]aq´ØiL;°–Nõþ ¬ƒ(y‘C5Ç"U]ø«Ré¡Ô—ešf¸ŸUÖé{„®ÍO€›©°e§a‡­1•£}M;ó" [A íW)\-•þòq^rIy- °núÚÇçî¦78~x‘MÃÆpÝÓcר )XwÂÙc…®éñÚç—Q‘åqO=Q¹(d àÈD²”œIe"c™% 0ðE&T~XZïÉGqí%0’ €ëDgoH‰ÙÔ”bËɽ%,Pn¶ôbòí6ƾzƒ‰^/þ°íßb)$ÿ™åJÐ|ÿNùÌÚ«ôwzجµ,§÷”æBAþ¹Á(n0Ÿ®>ÿNMìõ‡Õh0SH¢iÈÑLÓÐR Ecð¡[×ÐÙG ‰Gšáëh'Ou/¯«±­xäÊS‡®ÝúCÿ„à^b’äÈã#g>tφbØÌ-ÑܺÉWãÛŠ7Ò¢ϾaxoNï'{Oü1Q-Ò;8°ñ}$™% wï ý`ŽZ†oe N­E˜—êÚÔ¬ŒQÜÛºr,:0Ú¼ý™ ‚–bЈw$¡7;;clÒwÖ1yÅY 'Ajn«zºÇ “}ãÓ‰` fûÊðÞ=_¾ßÞ”º•m·,Ê`ÜÜM¢p&ÞPÏ’+9™*9æJ^Ý`›þ)òþ‡>z3ýŸµ4 ×õÐéðÉŽ;þ»L¨A¬²­muýjhúdÍíPݧQ^ÔõáߌwGè/ O/VW´{ÙhgH˜¿ìw÷õÔõ‘‰9Óô?ÄÍ~èÆn|î §×8NîY‹*e?õ};ýOe¦'·žé<NÝÕ9([±;"Ãð°åLã‡õÙ¿Z« S endstream endobj 440 0 obj << /Length 3584 /Filter /FlateDecode >> stream xÚ­ÙrÜ6ò]_1å§QÅCñAÒo²#'JűÖÒ–]§T kX’‘½_¿}Ç Ç‰·öÁ Ñh }Sîêqå®~:{ywvñZ…«ØI´VwŸVvÀ‹WQâ;Ú[Ýå«ßׯ~¾¼¹»zw¾ñ£x;üûëåyâ®ï®nïxþîê׫ËÛ+žüvõþöü»_ήîÎþ<óà,wå­"׉µ^EqìľZeåÙ︫Ö~YÁ©I¼z"Ìr¥ÂÀ UãÝêöì_g®Ü×uü‡ø#·×jåùNây!^ß¡=ǵ×u¾ñ\×]ß¼}sãßßœûj6éngv÷ŸÎ½p]7Ÿé¶ö˜‹×A0‘‰»Úø±ãEŠéÝmÍù&p£œrܹÿ ÉÀ’pf¸þüÑ ]øçáŽxïݦ-ƒÒŠiž]QW© ¤Íc_šªc¬®fè>me_wî­ù"ñº1ö¦íLÎHÞ¥/LÃËõ'†wÛÆ¤y+“ZèŒÜ  .^{ÁJ;IÄȺRÊ “D@¬t•+XîK;aì[œ #Ì$¸Q¡ŒVÏs’0dL¨K­wÅË.¼þ cw z¦\¤]´Œ²«ñµžh.7_ÜNPd÷Ù§á=yÚ¥ n;~¡>ëúÆØ#ª|<+K;ÙUš²žÑž˜²÷ä‹{Œ ™Ëà…@L¨ZS‰d@žX”bECsúëÜáJ½LQ ð­qL\FV0X@I†ð››µÈ•Eei¤²È¤übf+O;Q /莈)|ôýpŽõû& õú5.+c]Ðñ*]ð5ꂯœ$ñ¬¶T}yoåv¬7:q|WYÜl—ö-jkCø ¯Û‚•<eñäÖèX’쵇H±[÷»œÐq¬±Œ³-/•µ…/é〓h‡»u[ >xÍBÈëJ<òSÑmyôöæòݵÿœ'öU0±u…r9³d6¿ŒMÚ;I[„@^´ܬ/Ú­MZ>5u9ÍŽŽbßñQ°.1cVFÖÀh€. ´åC(åYO·Ï¿£VÀHã'Šõ+aÃßÊdšLÖpšT*ûìâòx¸”犓L””tH5’‚“ŠèaE„6ÒÇå–Cr=S²oym‹]ÞôS“ì|Óžè‡å'Ž‚Á¿ŠäŽ],£ÍáTR‘ÊD¼Á#E¡hÙng9‹Ö±Gî¿Údfˆã°ÆYŒoË(€¤v7r¾%bêdÓ²~óx¡»ñ,.óºN4¦µ|)ÿá2U Oh8m÷äAŸ¬7Ú×qà· S 9¦z<'…’|,ªŠíü:yWB¥éA‚û“!T6Aˆ9§Á )OµâéC!çA’lÙSLP‰â`ð€zÊ-A®T9“}^Ú)rùOmF ?tV? 6›ÛÓ%!ùAN ‚ †‘þá€<¬ ÀÈ5¶ˆ@È7ùTjLj— v“= hx;˜ˆ;%úFn3QišÛ|0Zø«‹W?üÀC2~X^+EÎ…¸Æ9Ö) †Öi[Oœ»Hš!ŸŸçuh*%ê LLÙ«ƒMãDµÊ•¿½\äq,]—sN£¦˜D¿ß[¦@ý9å&êõ#ÒeâeIjx(®W'¥B›¥%rºª:UZ Rnö¦â®ŠOâÂå„ѦÕãNîáKOf8+8¡ÿˆ’Õåfé¹öÅ$R§$PC§$òÖ¥I9ÜQ(ö'‘úíߘ??çÙm_ Ò5<ØŽ¢Þúæ§k¼â¸ *çȃz§C°·¶wÂÌØYëïqêŽÇÍîyýòPè)-IĺܯÅLuw§b‘Æ×¯ð6Z2AÜÝòœü¤Fì²9Ý!.¢É([Y·üÁº½=Œ+}ÀzTx3ª°—­­ßàƒláÒ!daˆ‰Ùãb÷ˆü¹@( lûHNTÂ\*L”À§°ƒƒ™”ŽR¡V $qÂNZp`c ì+LDõ p´5ïêìeÄöÕb§  Y]uiQɽdœšu}ºû~,DÕf%‡±€Tœ(ˤ&þ‹Â:¹¢³>ŒÃZèþo9¤–òî\ÃÝÛÏüú>ñÛvMŸuß“UÚtKOëiGÅCýý|Ò›æMc3<ÛR0~ÊÒ÷Bˆýž‡˜Ü’CZs…´ÍXIÛŽcyhG…C‡@\ÑqBÇ ‡ŽCºCÊîTà9ú°E@Çõ‡é¶cøb‘ÿœ›[ÃU%Aü‡EO/•P¹z%ó<ÝÍnDDp êZßðl¦UÔ&­¢h •óò×óhZ“à±ôv‘ÅÆâÝ䓱=Â>m*c —ûŒ—3Fš 6~ í”è”oçB2> :šùx¢ÇlTÇâ‡7JÜmñ¸¥à§c ~%ˆ‰5V‹<5¥Æ²KL-Y9È@jÎþwØS¾ŽR—~$@&ï‚ײßqékÓØ˜‘ˆâÓO»Ó½ž’‘O"üW“%ΛaÝ /¥Ár¼håSä°/–®ÿìç!‡›ôÊÞ¬«¬°+®¸+Yu›—éð÷7Xq.L\½åúÚÚËŒb†@ÌždÒƒcßñlÉañ Ð~¦¸¯9Uÿ‘¯:/mS@î÷¦ÞRQ,˯¶ ZÈ)äÈw­ÛÖìçÇB>òô6Û–En‡$=•Ù_xúžÿ6eÑ,®«ü37MÉßÎØ*_[‘\W,½Ÿ~¾m·µX¡Ý1T0F§ýRRùÒJâøíÕ-JêùäëS½ÚÚ ì÷¯ýþ<|S­=7ñüŦëo¯_ðÏuÀ1FIo‚VþˆyÑ&¹Of½¥¿© #'ö¿ç/êŽÿòO(©ÐÑZ4‹þ/È –ò endstream endobj 447 0 obj << /Length 1021 /Filter /FlateDecode >> stream xÚ•VÛŽÛ6}÷Wè‹ Ä\’’()( ¤í¦Ø 麃>lC‘¸¶PYRuÉ"ßr([Z7AŸHçv†sFâÞÁãÞo«Ÿw«›×aä%,U*ðv^ÌY¢”§’)áí ïÁOX¼ÞÈ8ñ·n»µä~“ë¾/ëƒ7ví›ÑÜæÚž?r.+ݯ?íÞ¬nw«VbrOL1’„%2ôòÓêá÷ ¸{ãq¤‰÷d4O^, ØWÞûÕ+Nys&#ÜâB(Tè ÉR!¢KJ0>Ã!8çDD—@$‘n 9â2¸yeãÞ&ˆ˜âʆºß¾úóN®7ý¬ªôöÔãYùCcåeÝ$ùãI׃½l13“•.¬&ƒ‰àÞ%6l½ eêïŽeoï×÷u6Œ)—oìõãXYÙÓQ×VzÔY¡»¹[sÈ›zÈJÒºouýn‹À¡,"‹0o ªÖÙÕùN.@¸»BcŒÚÆHü¬#Û‘`¢¨kÚST³‡t¦2åÃ=ýÝZ`+NŽp“úÃZøT“tV0|RXúæDáûVçeVÑaÐm ê1îþ²–‘OOˆëgwÎþFÄoÅ&pÓ¹ë#mOž eS¿˜»ÔuÎÖg÷Ý` QlŸÄ(ôv]Xƾµ*Gºh›¾Ä$˜Ã-C $ñewÔ=9´µ±>;ýrƤ]&@€ÅI`m›ë¿ì3ê@&îMR–JÊH^íÁ»Zpñµ›Í€ƒ®!]D=M³©aOý;÷a5ÉÖËQ6AvÀ ¡!/%ÒE*ãÿ‡Ér3ûÌõ»â˜Å> stream xÚÍZÛnG }×WÌcû2rȹFçâ4hÜq $5C—Uj4•ÇÒ¿ïáZ1dK±WÒ"éC<+-‡sHž!9£ÄX\p‘«qQÈ‘ÆèX££ê¸f¼åöU4‘¢“̈’äˆ18¥<ˆ\bÈ(»Ì ßW—3´kr…1*«Ú(ŽB)x(Ž˜³c¬Å+ØC$Q †OÝYÄ2Á½rÃ7oÿh_ÍäóÏ>¼_@ãY[ ’U'ï håÃÓÏã«öóË‹ù߃áãÅå´¹lW  _ ŸœQûÁ°M`Eñ ~W*^‘Ð8³'Qåê‰"ä[¯œºáóÅë…ƒOzùâ·__üöügsO/ ¸O1Þ€ˆ1ûŠ*}ˆ‹ù´ùr~úÇññá«·«PÚ §î»yUö¡Ý¼AV“zEA鲓¾•w¥YŠk4K´/Íê5ÍRX޹WºQõ9XÏ„¼†’D ›ÂÓ¤ÑWN#ýqñÏG>?ÿp1>/õG: Å ˜^Éç–ðê­ò£?ó0úa$ç#™4S.!ŒeRe2f´E±‘Q×i…1÷‡µŠGYGÝöÅÚ^0I ›ÝNß@æ‰÷È™wêýí‚N2Ý ´ i¿‚‘×;öÜ©öIxszÊÈíº²„†Ö2z®Ú5»ZL2m“ÛÙfµˆ÷PárZ÷¼ìYª³þ€R]tÍ·2¤¬Q(—ëÜ™—¹´,si¡åȽæÔ >áƒó”gN,?(ê€UÏ6g²OW—Ÿ'W'¿Ÿ M¼jÞ_,æççó٢ǢªWœq¿ÂŠ!V¼Ö2o]®jØtTf“¦–€p§“¤µŒp´Ox<Ê¥ö˜i#…¶¹A]“'ÖP÷‡‰RiKSÉÞn X«Ç9ÛU4IAÿ§~¼Î{Y}{ ¢¨­}Q_uGZ‚(Ò½­[•}¨­Û km]-ÝdQÒyùì.m)v§íªìC´Ý »ñ²öû\ï•õ˜¦=™úµkø®U™×«2oU•…å®!¼Eêâ-RoJ]ÉÛOÛ÷l«÷ã=‚óºu_?¦@ˆ¸Nˆ¸!V²÷ÚŽ¡=ñ•ì>¢EÎÛ½@ÆILóv×”æå¸[ãlÝ «šq¨?T–+û”K7YÔ*ñ~YõAEƒQ<º 4y¥>"Fõ¥|²ýï÷BS¾þ޹º1Êž;<Ö-¸W·àÞŠ¬ »KH Šã-•ÒI±ÆâµÆûe©&¯dÿÕ!ù ¿mnÒ›yñ^Y¦è­Á¹?ðàþ î4¯+§öù±^d× ðFàx¯ endstream endobj 456 0 obj << /Length 181 /Filter /FlateDecode >> stream xÚ•;‚@„ûûSBá¹p¯¥Dsj1*—X*‰6RXù÷½ð¨¨¬f'»™Ùðá(vAlÚ€ea­BxBY’*c¸"—6CèÑ&ûSy þ–nrÇ ËIë2-( ¾ “¿ùÚ—ŸÌÙß›´ •ðA|D»I¶ŽYr®ñDÛú¸«[ Æw¼ ’F«8¿Ñˆ« ùßEW™ÆÅÈ×äs’6ÒFÁs!–ÖóÄA¤ endstream endobj 460 0 obj << /Length 1251 /Filter /FlateDecode >> stream xÚµXooÚ8~ßOÁ‹“ÖÞæ4B`:Nbl°Þz-jéiR¯Ú™Ä_;²ºžúáÏÆv !P*µ};±Ÿßóû÷ØÔmÄ ·1>ríÓñ|5TñѧéÑé¨Ón4»Žßë4Óy#pn§Óè¾Óô¼Æ4jܲ ‘ÿ<ž×=œÜMÿ¨­P<Ïi¹]O¡¸ Ði:nË\NWgžÞ~vq=œŸ×€¸U®æ)Á»ÀénÓb»Žßjkìe'ò…{#‚õ.`’@)Y¿ay¨^pý†#¤3”ÐG1Rà2=¯§Á‡”Ìqœ³ :×Oã“Ý$Ãæ›M¿ÖÿKIÞ7É0L4äA‘3Ä?®–ö_ôœvǸ @„9œ%Œ¾ ¦7W_N@Û“û"ª÷*¬¯a’GÆ»b­šüíú.‡©ùM$@d·O¨\Ø´ŒßR(¯¼í®Æw' éí5{+Wõ¿Û„lW 9N€å ’¼š]¹OŽ Å%b3ÊmÂrœD&¹Èr±v.'ý¨§ÿ¤ðÞlø«ß|·Ó#ÔŠ}ךּ[V·R™à™ 4 ïU¸¤ØRo1‰×–R/ŒáCð^3Èdµ£dƒ(Ö_*»:Íd uëj(·n_ÊeNöú@We Â2l[«*Œ e$' …4&ø?•kî€,&®™îÏ}´#¤Ô‘ðÁUÜx†Pdê%Ï "A@à´”Â=5X^ †þE¡s) z´ÐsôSáÊø¾nâ ÈPtÛŸ|_ËnòÛårÓŸMEàƒ #ãçm„æ0O„lÙýÍ%¤†…»-¬>ï·PíߪsÈ0Â[ZÅN¥5•©×€s«ØjÃ.¹Þ¶ Œ nêsY?'2a0Þ§ŸªÒÀd0ü6Òåµ7«Ý|Ü#[þ&˜Pl©ãzè]B¼É°F†Ëž„4ͤh1Às,P_aÆaø„gé&%OYŒŸ¸È#¼j6ÛN”\™. ‹gjBê¡ [(˜[ñY…]O/G/VݸM¾C6ùúùËd0ýj/ݸÓ'2¨!lÜIVttynÃ)¬CÃ:¿dB óñÅ)ùèÀnZÙåœQ*úŸÏ®ŒÔ]#ÈÂE¥¼­ˆÚ¶RHÖs´#7*§PTóôÎÞd4!Îy¥¥,†xŽQ¤jÀÕk;­V¥›®iZ¤džä’9¶­…È3JÒ›¥tEu½i¶rœii¾È~Œ.¯~|º9;ÿ\A3ëŠ#4“ÇRrŠ>"Nì”ý|¤¹‰ŠTšFÕ5ªÐÜè¬1šš´•nŽ-íyZÙc³fv„Œrn[±&[¡[ÇCV&Öéá°¬(IÊo†ÃjÜ¢³7ϸ^Ú –øÓêú%zµ-"g)$Q¥ ‹ôɨIy±ßׇ*ØÄ·¾?€Äû÷oLcÏÓ¿%äimÒoMiøBFo—£Édt>_?ÏGuöåL]|ð­*OWæi‘AÙ±£¡¼¸Ç|cþšjšxÝöàì·ÒßwÂ.Í¢‚b¼¶ U—AVw3”ðH]ßÌu®ÆöΠÒÚ|iÌöµß¡<ê{ðÕ˜Œäq@¾§º$mýâËôèà°¿ü endstream endobj 466 0 obj << /Length 1964 /Filter /FlateDecode >> stream xÚ¥YÛrÛ6}÷WðÍvc2ºQ—6ÉÔV¢Ô'qcg&3i&†HHBM,@ÊÕßwIâB s©^^ìž=gw! ¼­7ð^]Ü=]MBo,¦Ó±w»ñÆ‹q0^„Þl1 ¦Cï6ö>Ÿ,ÿ8¿¾}õáÔÍæ'çAýýþúüÃå¨_¾»¹=¿º:ýrûæèÕíÑ?GCX}à ½Ù ˜O§Þl>棉¥GŸ¿ ¼ž½ñ°ÏÜ{¨ÞL½I8ÂÉƉwsôçÑ iátîÍ‚Ål0,-ŽgÁ|N‡Á@™¸b<爞úÓÁà$biFÌë«M‚¶B™¼—ï°¼ÃÍ1ë«uA’¸ôÂóÃY0ž‡ž¿&Ó°ÞãêåêêüõÍ×Õû_/>^^½¬Þl¾8©_L½ÿÙÝÏê1¶A=ò¯ž%d]cÂ_Ô#²©¿¬¨¬X–îÐ^îS9âKˆDÕ_”Q‘##ë p”3~¨/[;w€‘þ^]^<†J¨P±LÉYý!Ѻ£á±püQð¨H3ýäYmÃáEoŒ—Ëj‰ÁÉÒE%¸J.ÇÚËŠ§þxÚ7·&B7V’U0uÐv¹œñ|¨ßAöþ_R„†§þdÞµà»#ßõ½ÁV ®¯%”£ ¼ü× ¼_ÿ ¦“=†‹a½ÆòéòÉiÇg‚=ùå3B£¤ˆ±ö¶;±Ã(Æü'•Ø5 OËOŸNý°D@;úM‡zjÁžù&ËW³™ÜØÊÆåÝ1bÕ”Òw¬ÔkŽ’ò#µá+–MY~³¼8Ù¨Âà`›ûjJAœ­"¾BØÂBÉ-ê©ÖúQÃ=­“¶æØsNbÜÒ[´c$Rï¦H=_KöÝEŒnȶàøX.Ãíew8ÉÜ~mCTºn¥¤îƒ³[ŽRyûä»}P”bñ4aÊ <Óù¾‰Ëu‚‘Âp„ªZ±mÁòLYùüw1Žý,`|ûB¯9šC«"]º,íH’j×zny‡Qe†¶úžPZñKßG¿< ±b ËœlwÒÒ2‡-Mî.“3= Ípj† 9oÍph†#3œ˜!,Öå$ÜŸšWff87ÃE=Zq,‘¾a›üqyµbD­çLÁÕÀ'Áx2µ#VºOè¶EŠ˜Âd]ÌÙF˜¨æ yÖf¢iy‡Ó”ÅdC"iS¥)eJƒºÚ ó”ä9Ž[y›Jm¤8&EêØ‡³Jòƒæõd·u§ÃÝŸ²4Ù‚Â8l=ÖÆrH|c¨\CÎÉ­tA(7˜+“ð‰8shØò â iP9¥¢ ±¸};•x‰Œ\´€º^?ï|zÉrùc“ÎZ˜ HF‰•Þ¥¿wÁSÇ~S©î¾9T!®,Ñ%£Ee⯦ªú/ÊzØ;¡N?~½—•.t°:ÝL#cˆˆ“Lñ²~šå­Va[`ul^¡lÒUÕXØò±†tºlÌX¡ôs°è9ƒ h¢¶z·B(¥Ç×Õ±îB«@ª@_æz‚«#…!(F]Ê•„mÝÛ'"è²¢ÑÀ7E¢‚M¨ÊTç9(ƺ¶zé†XKÝ÷·ŽŠNCC§BàG“²ö´´6?dÐ&ÊÈr¨ä§€ˆ€þ ‰>…kX1-U·»Ò;߯VðËŸÛkZLeSG0yl‘êwоGì:ç‹"É…­O¢³í5]Ù\d¦nÔQ€¸(‰,Áb&gɆ¾½€:L‚ÚXÔú-ˆã½æ*´0­{DQDJ «Àé¸*·Ê. ;À¨ÀmdŠGXÔþj0”©ªÍ(h! dš:Ú>TJU¸3¢”`Ö8¢æEû8eNÐ[-Ý•ïØCOe‹ªÞUñ±êQvÌán·àIÚΠÚÄ•7Éf#lÊv[ÄÎo{(޹.¡¦§“êìæT˜uFé]Ò­õÑŠ `‹>àt@¦ø_uTÃUtm“@÷Ó…ÐŒ7i¶$W'£ºêŒ0í/#4w&•f~k›bFõ©Œ¶ätqvöØ?ºèrœ²}«Â‰VuÐy%ýoŒëÏp@«õítÿt’+MÂ` _õO£öÆÿÉA4 endstream endobj 470 0 obj << /Length 1838 /Filter /FlateDecode >> stream xÚ•Y[³Ó6~?¿ÂoNbr¿0ÃÐBa(ö¤ít(3(¶‹c[F–òﻎ´²-ÉÎK||‘v¿ýv÷[{ƒiðúîËÝ ~§Á,ØLÃízl¶Ûp;_Q~÷áã4ˆáÚÛ`.vÛà|½3–«E¸Z.à8 îïþ¸›êµ^ìïž¼ZoƒM¸ÛLgÁ> ¶«p>››Õ,\íÖÁ>><Ú§ôñd=>JX¦>E¼Hر4$ÑHûoºšrá\gÅ®ÌÔyV©ßº¢±:’\ýF‚IÜ¿ &³e¸X®ƒÉ.\®—ʆvA½Ûá¢~‰ú)? ’ëµH–áúŸH-yóð(|<™ÍáÌ¿¼V— jnò¸Ã’«1SeÆJ™qÁgϤ–))ަ¯!‚iAEã µßñ`űçPAÏT?}¢¢b¼èš£Qá‰ëds8Û†»ùΊbÅò2£•DG.–½Ò™ÉtˆT¶áÚ"•ê`¡“ÚæÏu%'‡šez¿‚[ÉNÕ:°‚F«H/ýHëЩå,ôYvU:++ L1‘¤­ÿÛlX4ùbÕ9…”n"Õr™=# (@an•rš°¯º€ž ‰6Gp.ÇQÝR %†ç`Gl: ¯?ÇÔ*±…H'`¤ê™ õ½Îˆðd"4:1¶ÖárÃ2º2%•¾@¿Ò¨–hÕ•˜ÿPN¯ãM­~(­´iÞì¢%Ex= 6FåkÚN#&Ÿ/u03Ð"s™ $)øÑ³!Ëx¤9颵o·'âHµ'1Ç .=9ž‚ÝÅYÞ+üÒ»dË—,H#”HÈœ’É¢æ‡%N3£½†¸$è—š5´ö$ çmOÑ´õÁ¸'‰ô&WhÛòžQÙßIûqÑ4ÿìrƒ•kÍJ£Ô"R  9?Qóñ£Í¹ÃgØÕ)c‰ày»Ú@÷ëKÄ`y‚Äi[§#e”F‚î±âe÷;æ×±º ‚#.”ŒŽ[EŽ\,o6áVö¸d!@’PAQƒB@¬“v(X¢‘ÿ·ÊJÌ*iá“RA}µ]cÑâFœÕr’œ¤b¢íæ`§YH2SQd§g4‹AιA8$Vcz¢/Aº£So+ueÆ…±u)GUžà ŽòBzÉP$ Ô36 _¯ÇêÉEŒ7´õ¼?±xÙ‘œz°i[SGñWR0€Ý”_oâo°%„ñqÛè{édĔӢ<µ£m}©«yŽÀÍ%g¦O˜€h^TN<¡/ö¤‰ ¤ñ¤S[Ï\< .ÇRª÷Æ™vÈëcêWó¦ ôË–·æ¼~ÿ—ºü’ǦªÝK¨ªDÄ·tÅVòÞi„a°¥ÍµfRä9 ¸MˆÇ†Ç'÷b?P¼¯Åå*XÆÎØcu¸Ø¯%ðL›ÆÖ,kèÖXr•p.œªé•2öð-ñgº× v7|°èðýúÏY#‹!±™™Š5ê 0_„»Y?þ/UovV:ÓWÒŸùþœ— usK+5…÷©@ÕUJë}ûüê€ä 0> stream xÚ½Yßsã¶~÷_ÁñdÆw‹ÖOZjçŸ/çÌåεÕö2i¦†HHBL JÖtú¿wIbAÝKý`Q$,¾Ýýö[hèm¼¡÷ãÙ˳«Ó™7÷A0ñ–ko²˜ø“ÅÌ»^Œý`ä-#ï×7·o–woãëù›¿þüòpóx?®¯ï??-o>}zûÛò§³»åÙg#˜}è¼ë¡?ïz>÷çã©&g¿þ6ô"xö“7„uæÞ¾z3ñ¦³‰?›Nà:öžÎþv6l[̽kq=•âœÁÈ¢…rKß‚áðÍsÈÓ5Û9½¨oˆ0g™›Gc×cRHžÉBLJúV¸¥á‹¨¯×<¯/Ê`w`Ò`áOƒY½¬àEª•C©+–6cª‹ˆå4”²ÿS¯¾¨ùO#îòœ“ªóeðç#ãÕa»)»> stream xÚµXmsÚ8þž_áéÚì˜\›á(¤¹›&\ wéô:‰°eÐÄ–¨%‡p¿þd¤•ß›¦×ã‹…Òî³Ï>»’k­-×:?úrÔ‘O×êXg®3è÷­³ÁÀœt-/:úôÙµ|ùÛo–ëœÖî03²º½S§×=•ãÐZýqäêµ~]ÏúëÌž¹k˜5{§7ì[Kßúôúj+£(|c÷]÷õ #‘Ę¿ù¼”ÛXöÐéö»jâ¨ü9ÌétÓnß²;gx2T3/µ˜Ø`5Ø"ï­õžl·,\}#¢­{–¨‡(  Äl£HÿG0õ\é_ å…!öÙ`Rj{OY´#b£æÂâøIÄÇyRcƒ‘AöŽwˆþ™¢kcV{õ\“GB×j|ï1µ²•!QE” ×±mí¤­ìͯ§³‹ÛVÑ®Ü4eâhq3K§9ÑX°¨ß´åHL3K]¹¦hb{6/o®§`ÊÁê,M˜ç@Ð!Þmp¬MÑKBü|â!†AˆX™[ ý¾^N ÄË Ö^FÆÝ³oF %Ž=O~Ÿ—ü¯ú¤§å­ÐPí—¡C“<è¿Þ¯ib#^ö“~ñ·ÛsxkܾU¿$|l§Æ‹=8’Ó;λs"ß,k™w=¿ûñ KB_ÔÑ}™ -øÅ/bTKŽ µü×°d!Æ[SòæÍTžE&gûÁx¤vCªùIx"Ee_å·Æ0 €Ay3B½0ñq ©¬bk@º'‚EHÈ »i«V‰vˆ “êé3ÌiKjfͪ€VѨx[ˆ—Œå“­ç£w×¹`×p(­œ"…é>|‹=ì+â2™ìé®/×,¸œhEB"öŽŸêëbÿˆãËÃÒ¤^ø {I–  9÷zìv$ ¡AºÍrYÊK.èØÆ ¥Y¥pŽ3S«›´ã’/TØq"iY‹/Aáã%¡(BJ"PQ–ˆm"ŒvoSâ̪.Q™„-&¾)xåô€‡þ9ê´Þš…Cü=Þú„ÿWwu„ÿ'Ý–©2y¾Îeq"^"hóM]Tsu¥My?·onÛ_ó}¤¶8mÊô¬ñåâ¢2_f¢è ÛùåMcfL& ë›6¬]Ô,˜˜*|$ë‹ýbȪ:°0d;Û‚JZ×Jž†òª÷ZÿS¼~:,xrê ;Åäéªþ8½ò<5¶Çú¥ýîîöj>½¼[\Ý\O¦£žë¾RèÕ,iÊ ÊÅKk»æ‹Ú\M³j¯‘_zߢJCŒLÓpàó,Õ®³ãŽFÍyp£ÆË8éwÛYc2ga©teÏ3TfdJž&¢ÉŽBH ÷ïÞy;›_´,l02‘O‹j¾ïÉq e¾xhU£ƒƒêRe‘A1K¨_—5š&ß™""í&eÐp5cª’Dñþ…þ¡ô|ùö:m±Ð¦ ž„¹–“ &e•@õô™±a MÒýqÂããÄ[éÀb‡{#pº„¦z>^¾oe4!¼±Ãó‰ €`гI_"ÀwŽ%ÿ¡¬ú{$Ô+œWô‘õm˜Ñ³Gé¢"Ëœšàæú‡Âá–è‘0­–EORŒ Ö.ÆÔtŠásÖ_@l—âl¾CÀñ]Õžg+"‰Ñ™@쌳Ù¿¨kFeîÆ¡5üŒÉŠ1qœ&“¤O»1à&O•Ñi£/~t9ûö²cÃ@ÞÆ^¨¾ÛlgÌP-éûm]4jü4o™€Í5+\,5žº øyÏe¿Ú­¯œRj—®‹|,Y)»a\¼¸1ðˆ’B-‹·1ó+·YUô²l{áòøs£Î“m¨0<‰ª!*‰i¹z_¾úÊí󵛦;Ž"|"RØÒp<{ Î#«Ìœ!OªÛ˜¤ W ÁEçÙ Êè ä)±NäìTÅàÈØµÍE.®T‰<¿¦Àú£åÇyñnÇùC LÒ]Œ2·(pC•^–„ʘ­ŽuŠŸ¹À8´ HžÐ.®?c£i”7Ï~6ˆW4)Žh2¿±'WæãËöâãb9ýШ6¹ 0=³ˆØA8Å•V‘ç¬Q‚h®¯§ËêmxïÌœ¼ä.üpÞíYÒà~ÿ4½ïI%éžåL§ß×wà'½òÎÿ½Ü]¦ endstream endobj 482 0 obj << /Length 1617 /Filter /FlateDecode >> stream xÚ¥XÛnÛ8}÷W}q ÄòýVÀY¯Óº šlâ»è -Ñ6šTIÊŽ÷ë—’HZ"i7Eóɇ3gΜª¬ƒVð¡öÇ¢Ö¼êõƒQ8 ºÁbtÇݰ;îÃq'´ƒE|{;ýxy»˜Ý½kt†£·—añÿæöònÞ)®ç_î—××ï¾/>Õf‹ÚZ[Zoí`Ø GƒA0ÂQ§DÛÚ·ï­ –Ï>-¹Ï(Øçonƒ^¿ö{]yƒûÚ_µVÙÃÁ(†ãa«y8î…á´Ùo‡ýñ ððæ>Û[.hŒÃÞ Wüøyv÷evÝPÏ䓾|ÒhËX;ãâ{ß5­Ö[±Q+„ÕÕSDÉ ­Cž.ëêeÖÛ å-õŠÀ)äÅ5]ÿ!ˆ6Ú2ıĮݑ7óUáS»v{ƒÂë~á“»/â¤.Ô%‰pÃXßiÚ6Ñ3Xà ãç©7Š›˜Âܶ‹zA‹ÿÏ„î­ð·28D4„‡†¹%Té¹Âã@Óâ0µîq™"#²~,î#ºMd4Ô”bnÁ1 {£xO®»°,ó Mq|ß”Û9§‰@TõÔhÀÖPLÿÜÎêU8Ä0Öê,îjÎù ¸5¯Š«=ÂØtÂhœFPÇCì/€¹DT]}”a*@A µ*Ć&@­^C{ÜÑÆNáš` äk*î­VAíÖŠÑ­…[žvÅIµôD&‹ëFhu8q¡|³¡\¼©š,îþmõ[(„¡°Nû~ƒt5ÚIF× l¹?› ¸“!§cåèRÙb)‘>´õZ±1lË|.¸j{…Ú&9^¼þ'\ î‰}býýw8T?ÄÅ~®º:(±JT¥Â#†Á-ƒ2©I§˜c\‰Ñ\…ø }9Ò?ð ”Ø—vÓ‹1Ö¹2*Õ’£ôAøóhw2@ʽú£gÝ+¦Óú…ÞZŠ"|Ìúˆþ íVÂà ½3íÊþILé³÷íÝìjþw3´é‰Tr‘о .x¹¸ak›PD¯¶¨ÛØ ³KÖ¤ÐȪUîôæËÕüÃãý|¡U’b”lhh¸«d2õ‰iŽÂ­Å×<.&gIè‰ýR—#²ÈÞw„ªý¦Ùy–g‰rTò¼ å‚”Eˆ)ñC1³ÉäÕUþPeª )Î6³Ç‡×W©ªšÉñqn•+¬ô&€s{È(!­9ö‘j¢qº…•A†ëQä`”Ö1«"^írœõµÚ›ìê5O£” ºEÿiç}sŸ|™ûz”%!Æí¥!5fHÔÔfñqRNí(ŠÑŽQiù|…ƒŽtvë&ÒO}9;l $rüÒ³fÊ ŒO—w““Ä+]ðl ßç^tºá¸]%nØ´R5Nš)gͬÚq§¹D¤¹Ž¢‚ežõƒ·¥ ŸéÒ€5ÙiøSÃH`™úÆÓl°H‰L'¯Ê$ò5*iÌPë¡ÜûLfÓƒW>¾©:"%²_âÃ…M £ A?ÒÒ¼o)ž2[½Œ6œ]_×u™eØ%†ËTÐ,ºŠÖ:ÿ_‰@Ø)²µK^4ún?)íúýÌuÀhJâ“t*G2Éɳ\ _Ö­Ë<ÿÚSÌs*eNvºCý|^û‰ž;ÆŒèšH ²iº¢Ó½©ÅâlcÍcÒ˜`Tåc£uHœœÐhR ¼ ̆Xˆ“º¯Ë76õrjJÜJÙÕþ“Jea‡ªŽšìôwod%œlù–“‹jÀÞìAL¤X2á¥xAŸ2.GÈß ÌGZ*ÖãÀcÝëüüüè¼(Ä…véqÒÒ^ãlÂóù–i£GÕˆ>ì8z&h¢LÊŽ/ÌQ Û'𧪯rÈ#A˜SÝeë%Ödˆr’@~<Ò©â,-¤hs¹gÝ7:7ô˜(•¥*ª’™:‘>…žéË®cEÏøå È.ìè2¹š_ÏNÅ6#¥©Ü EÙÚ÷–V›­9ØÙ d–ò³¬¿*¤Øèg:…™Kž`1Êhq{vöÆÿ¥Wî endstream endobj 486 0 obj << /Length 708 /Filter /FlateDecode >> stream xÚ•UMoÛ0 ½çWè–vˆU;ñg¶u: Ö¥§®@YN„Ê’«fý÷“#Éhœ4ÀN¦Mùññ‘c°1ø6yž$öƒ1,óe Ëy p;¹ˆAm}ßA U ¶»“-H³ÌÒ…µø=ù5‰=Ö§åäâk^‚VEœ€e3`f ̪,kpöEXð†®#Œð†LÏ–6ˆ*˜æi8òÙ}ž/`•8Wæ\Eê<Êãø¬Ò=b5”‘+8ÜÁD')a5¯φ}<~¤,ßwfÁù|@Îÿw-!.´3:I¹7[¢ZÏ]¡WÊ×ÎÞn(Þ8ÓRÆOþ’Ä+2mQMày”Ì­½GÈ)ÓuÒFòŒB²EÞFwFÏÜ‹$5•{ŽÔ?µÏãñ¢&/Ü06uþÄYŒø«{!RÚ ª·Ÿé–JæÊ§¦6bË-hr²NJbËòêúæö½®ø!ÄÓ¨)ôÆÇè~²t¦Aya$ö.,joQîžN !}Š6dûN+çë±nqg$ñ*aЈ&²¥œJH ƒŒ-Ò÷NJa‹Û理¸SdàîÑÕHÊ•¶‘l@ÁCŸö°.rRä°Z6´zŸâ‡'…E9o>Û>÷7?‘íƒËK—LR&°Hª=Ù†Jµ"tºÕ Q¦f&f¦z_XþþÑõqB“¿ØЊ‘Q4V÷HÞÊ 1˜À»7u²\DX¤ß¹Àø{õ¹5|TŽ¡}ÞÞ^ƒ•ÑaxDf§Û1&Óø^ýy*­q'#¦üU€0&f¨%oŠ2Ýz[Zæ©EÃf{u #ÕKqä~éEº騺M³ËjXE_–‡›-+ìbûŸ½¶Ûgi¬By¾è÷Y–¤0]Tö$Ìs¿ÏæÅ8ò?rö$ endstream endobj 491 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•»‚@EûýŠ[Báºì{ËÕ Bˆ"lG¨$ÚHaåï»áQQYÝ›Ìä̆ÎäÈþ$,uZ „'„T8ã8Õ€.9^|ò&ÝqcOç¼Õ¾)øÜ‹k|U¥}(Iȇd‘ÎÁ0jµ†±–Z.ñI×3 qV‚Å;ßis„T‚*)b£%w–×Ü0•‰Èˆ[×…$Õ1&Un'‰õj”ù"º>  endstream endobj 501 0 obj << /Length 694 /Filter /FlateDecode >> stream xÚÅUÉnÛ0½û+ô"Ä7E‰ƒE[8¾%E J´-@‹AÉ@?¿¤HoŠä ‡&'RâÌ›7o†CÖûÚ¯0»µËýìf9»šs °„,á,W@ (9\ˆh –9x ®·[UçÅŸ0"D7á¯å×PBŒ‘$ˆSˆ1v·i—:ç‡Nï²n§•û¼m²]¥ê.튦Á§í8˜`Ì|4KWúh7‡F?~^/¾ç…Zøç¢^…˜Í)·_¨U(¥U)ÇÂǽšÇ10á<öbqÂ] å¦h €AÛi’±ÿÑhåÓ²tK FAcl *—t²_a·×=ëÖR†–”ÉZ‚Äp!Üs!Üèákô¡¨³r—+gi„?Z²ŠD‡ÞðÓ–€‚&{ƒf›ê‚<ëƒh ÜŒ bœ@ÆÈÞëóTW`Kz—K Q’€ˆRHİ7æ…*óöLÿ‰:`…ç<ÂÎ|ÁcIJMª=}zBŸHˆŽìŸн3h‹`7‹¡¤"Þ»Uwu>/Jõ=­Ô(oÓ/ 2#F„cH$½LuW·ÅºVùceûÂýVÔ GDÿ#¹‹½c :Qto_‰cìoV“QÕyåú»srÍÀ<ŒÌ[Õ¥FÇÜÏgÕfºØ§óô\Œ!¥ô=æâ+ #—*O޹Ÿk?p&¢i9'ïÁRfæMï|*!Ž“aç°DÆÚÛŒ¿d?NN A…LAÌÙ9ÝÚ:9Wní6þGÖhS§mcžýzíK×ìtæ eRúýJ7ÕлlÚƒßV‡éºJ§ªu¦'%¦/Å©žûr®G_±Kм¼Š—¶4öŽlm¹îªßJOc3×­ïæ£ß¿Š0˜wËÙ_ëÀX© endstream endobj 545 0 obj << /Length 1316 /Filter /FlateDecode >> stream xÚÍXYoã6~÷¯Ð h’uEĉw³ØÄ®­ ÙE È´-T‡«£ÁþûEʱ|'u¼}H$SCÎÌ7ßÖ¦Ö>u®üÎyÏbš‹<Û65¢™ØF˜:šãQdÍkz÷óåÀ¿gÔqõ+$¯×†…õKÃú/þ]ÊÕ‘?4(ÖºþÃðF ö»w7÷JJÈßöïïþ—Îßù»CÀ¬ÍÁȵmÍq]äRK “Îãw¬áÙ #Ósµ—Z2Ñ,f"f™pk£Î¬œÁˆ2q+.Ê5ÛZr­Ñ`„×®A™ÆÁëUZDÓ”ÁpêêýÁåð–> ù4ÊÒ§(„éÙÅEr“Ž¿F)§µöóži.)ÃÚe€$“zb—p¤EÉ3Ïåïl"¯åL ÄAQª»Å¦Iž%+baœQ:•?æ¹85˜&´©…Ä `™I‘åZËX ÐpôY‹SÎ{ÄÒ<ØFm±Ír1=Ø]ïú†±)…ÚƒÇv#³¿Q Έ­—½(æ÷AÂw!yÆ"6k㙊M›ñ ³<çÅUÕyû!mÀ"æFô)šP/:2ˆ>kŸ´ÎB‘G«³»±Æôm²†0T‘eבּC2gTæ1¸ò .žó4äû˜â"DZ›`‰˜¶×Ži‹ dPEäà Žåbã¨!ÓZ!Ò\ƒTJö1w¹&Qú~xxö—h\>ªã'䥌Zü1W«B‘XY)iµÁª¤ 1ÁÝB ­Ù†Œl¨IǪ“* k‹%@â[—Ï2)0@•Ðß*Ç¿a†á¯]™š¢ù³âdU4„-³%:Æûù•3•DA¬r^-´íDª¹Kk%3‰Ò0®Æ\õ6²$ …†ê[¿m8ËA޵h~ó,™/“?C³ ‡cŠc5›~ßV6 Fól™ ô:J ,d9*7¯%@ó^Äãq±’§íëÊ8G,DS!û$ J¾vFÁÇpÑ<ÇêNp ®'K,(Ë.:0Mÿ”°¨)þTñØøÒðê#jâŠ!×DÞÛ›r«MÖýcï6ê8z"wøŒ^ßµE„íÉâç,‹÷`ð9(ºÙ\t’·é • TŸøÇ€¶ sÔ TßNN ¤Á ¿âqÞ1T Þ¡ù(NßgŠA3ˆÊS(«–ó`K×=®²~>†v|MC>®–gÁÔ5‚æq§ºðþÌ‹Spð!-£÷ú´§ˆÂ'æO"Ÿ¬ä¢Ý«mÖrï}Æ]óú= ¨âR„ÒßÓ÷Á- ]?¢àÓƒv *ô}ƒŠ¹T žʳj~Ȩr€±‹!»é%hÄe²½øÿÂÓU±,£0ˆ·B´é›/sKßòÅwý³µ:ÉbÈn&D· ÅÿˆÀ endstream endobj 582 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚÅWYSÛ0~÷¯Ð£=ÓI¶|ðHÛ´0=RÈ0Œp”੯ÊN;üû®‡ %h2Þ¬öú>­V6A+DÐïhîL#ŽRœÅqˆæK”œÆ1J2†cŠæ tîaLX’ú³¯ŸgìêT®Š¦¾*êeÀˆßØ¥³^­óÞʧrPâK%ë\—óïýÜûáQÈHÝdHSœ²å•w~IÐÖNÁa–¢_ƲB1BKtæ}󈫚`Ƶ¨C!Jp³xDL1ÙBi0¡„ÿìEQÊÔËRø×åªh{@eªÒLÃp‹‚&!¤$.Þü¦è‚Ig~×+ˆË}C@§ h”t‹¢,­Ró_`˸_ “Θ OQ[˯­¬?ϬN²ßÀŸŒúeñ]S.íR#­½µqÊÛÖiu"­ÉÅ´M½(ê•+¸Y«Ü™•E ¥Bõ8˜Ä4XfË4ZJqƹE»\×ùAzÕÊmèé›ÏûüÌ‘ɘí”cü‚p?:âxpÔØµp-ísݙݩwvAÓ\á^K#îµâWÑßXi!za¥¥j*+9ŸNl+5ÕýŽ:"X¢Ù]31×LÓB–C'5ùº’u/ôÒ¢?ÚY&ø¦Wó ño„ÒѦ4B¸1SS”bfàm¼€ŸÐb'˜€µ³yp€€æð°z«Š¾ÈEùETò©#0áӘ˭µ“¡µYŽXÖ nsG¶ÉbU®k¡~LNŠ™†|G³HG“+„‰•„c¨ïäR¬Ëþ „¾2§ã!G”q“äo,ƒÍƒ(õ]¼Gù¢JOÇ|-¤9C¨¡ ]g›ó«¥¢zÝ)žôËKGfO6ÃØjïëÅFï uÚ†œ{SÎŒ7å6ÃCÞŸwÞeÓmüZ¥o/±ªÄóéL¶éŒëº+VõpË> stream xÚÅZmܶþ¾¿‚Û/ZÎ ‡F€¼Àm€1œ|hk†DQ©ÑôÎ8Ÿôß÷™=%¹dóÊ·[>SZR£g†ç…TJb(R¿ÌBÒH-*-æˆn œ1L5ˆú¸RÆïš‚Æ´KZƒâ/e ¥†!8s(œðH©‚{ †î”K¨ÙïS ]VÅ…C)x1•²KÙ1cl\„ ›¤ú/(‰.4BÞGÙ_Ì”ýæ $7ò_ šeÙ%ƒœ*c%p©ìrÉí ôJø¥`Ε\A‰;%à ò1x€ñ¨ºÝ ‹iƬ(f_Íå`.rôC‹ÌÞÏrŠÞ•BVó_4äRd§œC®êRK(”€™AáÃ{À9‚EäË0™b.Šaz̳Ž(&ÅÜ~*)˜OµŠ3‡ÆÄXï*ÁªC·Ùᩪ`ò5EX2ÔÍX\KL\5W¦©5¡ ¦¯ÕÜPæÞ9(g£w:4Vb¿ré¾4"ã11ïuÛÖÃæL}½DÁë²qŽ©S0úìir!™ËîÉ“Ýþ«ð"N ÏÃþïÿø'ì4a‘† _½ûñÇ—»Ï>{ïØcK¡!Â觌ͪ4>i¬z˧aÀ¤'Ê kþfìÓë«ÛðäIØ?uçžzŠå# èÝ æ1ÏkÖøà7±vsݾë·áEØ?ûêiØßº ¿Hÿþ¿o::Æúnÿ%ÞÔ¯nß°íöÏûÛëw7­¿=x°ÃOßôùõøÅõOáEÄZu`0 q°úoo Kênø=}UO›Ë÷êû±Šäx¬ˆmRî÷÷ŠÔÓIyì‡Hùž±Zd¨ù ñœaÚóñ´çôHkåÇLûY´*ÇÈå@®[µº§ÈY˜]Ò‘V…©U‘O>Wv¬U~¬VåSÏ•ñ‘V©¢æ'ž+;ö¶Í[˜i¥Ÿz®*kU©UÿÿЧñX‘úQŠì?¿ºº†Ä‡œÞ!yJ×êÚæµ-k{xò÷rvûïÞM·‡û¿½¾ú÷nÿÅõÍÜoHâËý_÷_ï¿|A‡ÇÞ 4ê›°†RŒ25õÛ: ØÂ°ÏFû.ìÿrýýu€Éÿôööæ]»ýöÙçÏ¿æW¯ž÷^__½zõúj¹~5Ž"Ë<-HÊê’WŽÔ;ÒSé¥ÉÒòŸÝäç.2d$NHs‡Œ€,"Çaañj›—ºŒ:ÎÅ™;Q\8ZÕ–R™©¤4]xáAPÂüÜx@½²y®c¯Cl[ZÒ1¢`±V{MÜ–…Ò‘¯\‘Œ )6Hâõ&Ö]¦²ùÒkëQšåIÇii:?/’ÓL±_ÀæI‡âu’¥AàDó "ƒ|Fþ; jBƒðÜ—Ë7Tã ¾eñ ò$CLu3òG[ºÀƒ¡¶Œ­•i©N¡q*–ØæûÈá^}ËáÔ„ü7c?¿o¬æ2X”³M‰‡h' *C’ÓTc©Cá|ÚX/>õlC…1¨I)åA­œ$—ØÍ0B|ÑÏœRýQu¼JäËíçgp~T̽“u?æú>Ç£b®ïK9$ß–ºkumóÚ–µµµ½+M|Cꮥµåµ]åñ*Wy¼ÊãU¯òx•'«Ùr>Ü«wæ’çýÀI.…QQÒMŽ0[K"F–;‚+u*UàÅ–©Lbç\—@Y劚hŽjî!ÔX~PÚ(ðäDA1ÔÓBÝ8ÙD(AãS‚ôI4HH è¨êªm^—¼”Efš[5$t¨ ±Üòl]lªyºpEÔV¯›ÅòáØe+î4¸q;&”Íøo¬\»ÄÒhZÎêO~Æ jÙW©—ý˜Ú!—ÍîdÓ8Ž]© àBš‚@ðÅ$/é¸ òD/à Jϸٟ¤h%k‰V¡‚"ZιÏMLÄlNN:d?$÷ʳ˜ŸIciÚæÈƒß U=Ihn¾Í‚àfÉJ»p¤†~^MAÑÏ„ªi{¨_'á ëÜ—o¸´i›Áï ÏRçóã¦J(ñíÐú¹3UÔÝ›)^{k:.ÙdœFà6r؉ < ²Û 0…J(zaŸ}¯”ßLN#)<Šæû¸ôD®1"å™Z½€+tß éüÕ¿Ì(Hi{Î5’vÄœÖ[œ2ñç1"É]ƾ,®ˆùU ÷l–2Ÿ7§áÄÅrìSGÄŒ=‚/Hã> stream xÚµ–ßoÚ0ÇßóWøÑ‘†ë؉cúŒ®­V`´‡®ªÒÄ@4HX~¬Ú?'v¡lj¦ $.6çïùs±Ã` 0ød =ãêÆvG}Æ(ðV€b†0qÛ'ˆYÀ Á#ÝfÞxnöˆËá)ûÑ´1˜} ½òk fÞÜ$.GÞr>ÖŽÓÑòa<Ñ^¥ÿÝtb>y÷ÆØ3~–Üp1⌗sĉ ‚ñø„A(»Ñ>¯•çØEŽMåó,Œ/Ö0§|,FcöZY×hCDäÇÂfÏÂ×$ÙÊ]gÓ‡yž‹u”ÄÏQ¼2-&××»[?»[U»¯Ã^ÝPzƒ%ˆÚ® §RÚ…PɈVÊúqslý"«}2e÷©ÈDœ«` ¶0ÒÆÈ­Cj&« Óg?Ëgiô³œòsÑ 2[©»WRœ(ñK“6Ä“ä«I ô£¼3Ø8)õ_«JÙî0y“¶Â,vÞ&~˜u‡iZþ‘½ÔÛ´Û`NÓrŠT„Ý]Î$U‚—"tÚÎEX¹œïì=¦ÅK²6€‹ßÍÛS&Sr—º„n´eœGïCcïA+”Ü4Uyš|ÔH˜ê‹“ž|£Wç~öýŒN°ñãu-O´=Ä ]ÝãµÖ³z÷;ß/úß,så"΢u\ÅüG¦e­[ˆêD·)vºœ½ˆTßz˜¬!Õþð÷Ë…§ÝC²ý *ÇGþk/ÔŠ†¶lÈlÇέ8"W3žis¨eþß³ˆpÞÌÁt/⇙æÞ‹ ú†1 Ô¸|ÛºÐ{¦%û»2H#Y‡St¬”V»jìæ\Ë縲ãkÓð½íZµ’í Æô¢ä4ðo¤å¼6 endstream endobj 622 0 obj << /Length 1372 /Filter /FlateDecode >> stream xÚÕXYoÛF~ׯ Ð ¨6{ò0Š jÛµ”''0hj% ¡H•¤`äßg†³¤HIvâ¦iP—»;×7§È½¥Ç½óÑ›ÙèÕ™6^Äâ PÞlá…œEAà…±dðfsïÖÃÔx"ÃÈ¿¾zw-ïÞOOoînìrUäw«|1–Ü/è|Z—Û´¦õ]Œ÷mióÔŽ?ÎÞŽNg£¿GÄrOtb¢ˆER{éztû‘{s8{ëq¦âÈ{ln®=m3ZÁ:󦣿FܩΙ4¸Ä‡3$ÐG ã;K$þqÔgÏn0¸ œ›‹dé4Eì|›Ù»úóÆÝ@Œà€2CÂ:ÂøÅÉÉX…ŽÓl¬#ß1ë¬yu¦TëD¨ˆ©0ðK0Có*%„p£P³ZånçÁm /¦Y²­œ¸h{¦po¢ ”€%ÆÁ9÷’’ Ú‹NHgà–ŒZ>p®Žà2·¿†R &"ðë³Uf/“õó ™ìÐCŒ¦Å¶LÑð(ò³"MjAo(Ga¬jî³ñD…Ê¿´v^Ñi1…þ½£3dYÕôB„¥»ùà® Ò¤ªWù’he±¦£¥Í-ZbüUêLÀ¨/—.üoÎGÞmsóêúõÍÅ‹FǾÙîf«á#eAÜ?5†hÿ¢¦³UÕÚšfÛ¹#ô«,6!tûè´ñ1.šE±Àg@ÆáÆ:IË‚–­Š§çW—w—gW´_»s›WÛÒ‘ 0ÁÇ›ëܦ¶ªÐÁª“Ÿ£‹{ ˜iQ–¶Úùyõí0.ZO‡ä­6ÜúùPllN^‚—M‰&ËuòOSBº”ØæÕj™Êˆÿoê?W¹ÏE4Ær÷IçUÞ®ï1¨ƒ{îÂ^vt? õXȃE–ü ôX'ßW¶> stream xÚÍWKsÛ6¾ëWàHÎÔ0 é›íH©3íJÔÉÎh’8áC¥¨ñôßwñ %*rSǮۃ Ø]ì~ûí"h…ú8ºŠG矣GB0/#  ¢Xx(ÎЃsýëå}<žºg4+lÆ®OœK7"N¬þ]šÕYN‹˜‘9‰ùÜmec2ùH­´Ÿ°ÑÈèü¢ô‰SäßþÒlµkiTª¤´Kµ5’Ö 8³©«,¯VÖázפV¡È+p¼‡l3Æ ,»±ÜUé$*sÍʦpúq¤àð<qaàHÛtfq€s肘jolÜ„øó£Íœ4© …¾J3™™µµJµf ‡ÙzXxÊÛµ™eI›˜Ù²©K3³ C_±ñhÀ©cBA°>Å„³=—¨åÒ$—EG¤:Ý•²j“ï¨tÂú³ÄÒÆ{ª¦nଓFY;Ÿx>Š@jŸü{,m­ø0#4°@‹Næþîó=]ÌgãéÂäf¡H (Ôå¸Ê&P·Š@SgœcOpë27†-ëÚzÙ¥È.ÓO%­£_—Vyœ§½vQo{½MãzÄIVeò\ƘúdXü´OÙ®Úæ«ª+ÿ¡òTˆ÷‚Æ *Ê8\)wåW]ϧÀQÑ7[Kݽ޿ûi è?‚¿ˆ"yAðß»Âfm¢šŽpÚŸ.´®t‰œ¢Ní%¢¾ºëE]ÖÐÊ}8·Rf[³«º(#¦¿ªïžxꣿ—´äÚŠ´nd iÑxk15[ÉJÚö™>w=> stream xÚµV]oÛ6}ϯ° ˜X’â—€a@Ö,A R¿%… J´-Ì‘ ‰ÞÖýú]Š”dË­Ñõ‰´E^ž{ÄÁ*ÀÁà FD¹Úááæ·ÅÍ›{Á¢O Ë@b¤„„H,Êà9¼Ýnu]VÿD1¥*|}Zü1 ÔG¡%XQ1Ocnÿ}µÑnï]Sì^umrS5õ‰8§a:Œ¥Ä"ê£ ‰qÑß"Åc6Û¼­hÖêDϪz6híΞP<ée$CÝêºÐÄ…c1’À?6a(á©;÷.7¹‹÷Ñ´»ÂìZÝFóã›û$ J…HlÌ*Ä” nÙ²±^(å{ƒç˜sv¦…Üxáýg µkìä©_H¥ ?<Þ>½£YD ¹1û(9‰hB¥V‹TZdP@š&ALâB:d‹uÕEýûXüM¹Ÿç›› çÂZÊÃWWèþË0:¨nîJÕÙ:¡s²Ú«@œ¤+bb*ÿ(€;mr¨réŦ»¢­¶“Ô.öBÖT%(6ˆ&t,¶þ–â…Ì2¤2ß=Md0šd½ˆÅáN»_ïíg; ¸v–Œ© bK r ƒz*¶Íë–f›êóòŸåbõ-}¬„ŒéÆ£/èæªö_ÌÚÿ]êbyö ðŸ›åL-Þ?z),wuaÄ « 8th¿ý–ù©ª‹Í®Ôn%!{+y‚dª`C¿ð—±$’,t¦,õx:ŽÄ$R” = ØN#%!(åü€«jó­à¾Ö?#XŽÁ?…/lÄTøe«„ë Œ\60ãâºÿ%4Uésaû¬($6äKÎøÝ \rÜæMÐ;à:¯ËÍ5þ+h®”{{ñWרÊÿÙÙ÷¹8oë}d·]W­ !p÷ãœüÊ̱[}”þŒj ¾&$™s=Ë…¡Tkœ™øˆÐž?½ßù» X.V˜"®Šª^=ÃDñðà#‡¸cš$8URÄ%¿Ì—ËÍ9gÞýyXÝsìaý¶m²ZG°õïÌí>âq¨Íæ©î`îW1f0¤¨ÿçP8}Ø•µåP׺ÍÇkà³ôefœ`¥ðš°o$Ý^2gbm$…3A¿*ýÊ+¢ú×VMgÒsÜ“e{÷š ÷óµDY³†Îâ*ùþ.p½«+óÃ’–NÒ'œ l^&ßéTÓöÍêz…f=zÝvóË5Òü}qóš6á* endstream endobj 593 0 obj << /Type /ObjStm /N 100 /First 873 /Length 2099 /Filter /FlateDecode >> stream xÚÍYÛnÇ}߯èÇäe¶«ª«º Èv”ˆaR€$„@ÌÕ!¢p^çïsj8²)iÁS+(äÌìÖœ®[Ÿ>Ý«EB %¤„K¥Í5PЂ²âÙSų¶T-LµàªŒç¤ÚNKJÄs ïªc±ã+îÔ`„÷Œ‚áOk 9ž9dÅ{•B®c©;­ w€cªã”ªãTƒ«†k D†o*d¸{öl·ÿ>œ+ÊÃYØÿýÿ„iSðV‰ÔTÔÿêîíÛ7»o¾9j›ãl›35þm².J½ÅÔëµ?™-ÕÒø¼Gç5\¶ù‹º5èÏGMÙ¤™§lBîí-¸˜IMA½µFÐW©P“dn²ÔH^I0gkÐÍè &®ù°àJÕ¦¦²Ž‹I…©ŸèmUÎÓÜãÀ•Ãlô(mk ÖÚ€ÝÖ€QÞšqÍM^ób¦›œWÚ‡Q:_³àEÝV;bn\ð80¡vdïßùÀöÅáê6<{ö/ÀeŒ|Ío½%øêþA|ž—§i°‹?bÿòúпoÃyØ¿üþEØ¿¹ ¿¢¿þï»_´?»ýwi¼º½ÁÍX»ýÙxs¸»îÇ›y™?úq.Ûo¿„ó|%Õõ %êŒÖ^Í]fóñVÛÎGm×øè¡-mpai2¥mÀD(Њ­(±s³6Æ›p±R4¬+°K§jaÌÛ„ åÑ®³¢%±‚dhpªÜD£µD€“Ñ]I¬ÉÛ€AÍÕò0R%"à]>Æ‹G€¡¶š’e-Ç D;Æ §´­Ù83Ø §ýUØÿùðúP´?ÜÜ^ßõ·?½|~ö_\œ?_®...¯¦Ã=ñ'q«&4¸‹ö4•ظ&!pK,G½zwøÏ;¸sýÀ‹ò¯Óyäk¶wà ‚œÃ6²‹ $Àä*ytw3^â×E;LV†¶µ®ïºTGÁF³ÔVcoØ/QnOç9‰4~cØo¿bu‡gðž,ôEËSåaê¥æ6]_bUûÔv¹íy§ºaW¤Ìr©€ÿ SÏ{‚QŠ”ÒÓÜÚÁÆ6ê„­ñÄel»[b›Æ8™ø ¸O5£ ö›ûÑ'ZyšûÓ€M%cã݉#¶w#6â<ÆÂ ã雇 Ë”‡A’ç+§ü4÷Ǿ/4´i‚¤ík¶¡”ÔY;ªäAû)ìcmñ- ADPa„ºSzšûX%Ç6a’FªãÐÖ~**%SË6&Iñ ¸QUÊoÞ#V{š÷­YZdÉÚŒÝúɆA9OÓF>¡÷û7Ÿ±P§~Ä 6W?¡ÊM²'pæ˜mJ¸2N’¤³Ô›&ꬌ“E‹_ í œƒ¶aJM„~É®™ŸØ5‰‹c Ç#O][‡žê0µ`ý>×¶:iä§a[7$Ø®lH>°epA\3z0ª©Q×€1¿üd Ø·›¯Ge%:†¨~žŠ- oË„ïHR¥uÜäzXUråmÀ^Ž#ûìc¶e¢m³-Pái›­‹f?£Ûb ‰Ñˆ–ÓíßaVðÞC¾åù,žìžÒç p?Z…󛬞P@ßëBìæש‹,Ì`º’øÿZŠRã¿>•¬ å_!® šÔ'ékK‚>Jþ¼ÃŠ0/#ÿþŒ~̪KnbÕ‡¶k¬zÌ:Kë&[3„''3}ˆ‹M&¤þ¶Ð°QÅâ¶ÚrŠ«âçÛÒ ~Â(e×Oq\Ó² Ø8Ë:pGK‘ã Ñ`ÈôFu xYˆ)>vÈs ˜‘b;r*õ °¯DŒWÍÛ€‘ãÌüÕOfÍôþ6ùLþÖåD—-Ëuáu[Tl9P1>%¿$’ø€õötE(›eñWÒ¯F“¤Üø¡~0é?Šª€òÜ X*ãÉ·—ݼԔv4(jKJ};­+R»M‡zB_IfrŸ£Ÿ@PÄÒŽ78«[|Mý8`bÄûÅÔwX «Œ©-]r»SnZ@uþ‰¼66ÏnñŸ¾Á51osUûÒJÖNdè¢ôeè%â;.)úÞÕÿÉÂ~ endstream endobj 679 0 obj << /Length 1262 /Filter /FlateDecode >> stream xÚ­WKs£8¾ûWp„ªEÑ3™¼¦6±×Ëž2)Ù¦°‡Çd²¿~[H`cìL&“‹%CKýu÷×°±2°q=ùNή×ðQÀ93Â¥Á¸‡u / ˆ#LŒóâæ|^Î-›z¾yÔzuûç¥Ú}ž^üswyZ6ÏåOx;½·Ã/“ËpòmB@6ˆáaäsnx¾|P瓇Gl$ðî‹ |ã¹•Ì ÇeÈuì3ãïÉ_¬ÑbD]¹•‹ÆÎƒ`ä¹—à;œ ܃GË&c󳨣4 ঀ[Tq™nëtS´h;5gWŒíy6£ûú¾pVÊî¯ÓL¨}¼)àêB¿©×úq"â,*-‚ÍHªÑ¯7KµFY¦6³éÝŒªí²)b%J\)\³mxEÌÛYKµµ¡åøæËV$b© ÞÄM.èÈä#*N: UÑ»´ÞWðÝ¢Ž¹Iy÷ÙqŒ.¡*4.òàV¬î×1%4 Ÿ‡0Hk™éì|~Ks±´‹uT$àìWâdûyÁëM{ª‹ÊF­i>H—/êßt+Š»™Ú—­.íz›9øPlꃑ{°Ñmmlå2¶MV§ÛŽ Ú!¡>mÌ[‚˃ë™vü•&ÊG‡–õ¡í£Ùjh9º8¯ªtÕоøŠ]lَ˵ÈÈÆ&Pê {c*Š!ÜNf»É·´W ÿCØâúˆîäcU+|±å™kH± ²ãd\Ç‹ª.Óbõ:|×|<¢Äûl‡Ý%¯R’y`«@Ê‹RDµtžÏ€R°8fS¤ßý(¶[¡þ<‰úYRLˆB£á{÷°€Á€Þ5å í  £Ó; ü©´¨z8Òx¬xdÂh'B–¹B$ÇÔSÑQëvÄv’ùűù©÷¤Ö³L¼¨ÔXê5€PΕí£\é>2¿ží¡ÙTÓ‹ó[âpPì"ä`-„÷„8r}ÚÉØGÀŸ "žgØ„ ÀåJr”’û#:†!PäC™—-Gî—å&?m“”P9t[¤õBW£WuêÞH-•ÐÁ2­Ú’°6Ôòc>I?7µz›§«µÞ®D=F §ã¦,Ù‹ÖSI²l´nq•[C³ìd»š½ç휮a)ÛC‹KEÿŠŒzu-êE!,BÌçE}(²«C»ÂÅG?KÒƒ¸WWÛNÕ]o¨ð.ÿ®Gj@-w•< R; m×ÅßZ1r]e.uÕðüq+(E01AÝ‚wÔé×ý4T¶¾ÒÅÈ!ƒѵ *ýϲ}S,êQ æ6yÇàÏ|‡~Ú*Úfœ?É,Øo¾0—éªØöH‘éöGhªª8>/¯÷³Š£‚ßMrðLõy;nK|Ò³&J@ úØsZ¯Õã"×úÐJÚRŠm¥Þ×]îoÃEÓ¤ÉBÛ<׊Cs–bË<ßtnD©½¨²yDú_WM~b˜"zGí€w¿“Úâwòá72ÃÑ™qjü B<€y•ç ®Á´K°Í6*Sºø¦A5¬ú9ð½IfCÛô‰ÿæTS> stream xÚíX[oâ8~çWD3/A\Û±ãd´Zi·Ž:«N»À[[¡4¸%ZHضš¿Ç7HB ´B+­4OßÎùÎùÎÅÁÞ³‡½¯½ßǽ³KƽÅaxã'O`…¡'bŠBâ§ÞŽ‚þ€ŠÈ_‹%”ò9+òI–?õ)ö 43‹—Ù\šÑP>õ öe)óTöÆßz_ƽ¿{$bl$DŠ(óÒEïî{SXûæaÄ‘÷¢w.<ÆÄYã¹7êýÙÃVkŒ(WCõc1„¬CHÞ‚ nëÆØÿ§O™_dSP˜FþíÍõ-\åYeÁ­Ìü=æ¸?`<¬í#¦æ‰Æå:» ‚š|ì ŒblE«‹e’ùÜ nn^ÑAZʤ’S3çDî#u»º†sn®Ï”}£ÈÏòUUî¯2¯ŠRMÇþ*M´â‘“s;rôñt¾žJ³ác:—öØKVÍÌt¾°åöгòh)—+³^9]¬é¾_'ëu6äjßz14X”±ÚpžÖyZÁ&>•-ôAÀ˜+ºÁÂ4(`ON¥Âk fae: våQÑõÇV\–?·¼â@.K¶78§´¸§‰G(Š áÖó,D„³ZähÂí„\hB‡nB‡šÐõÈ9À0†BN52É0±þ4ã´È«$Ëõ õA¤¿1¹š˜Êtž” rb­¤i«ÁÆìie—^fY:3Ãlsbšò ÷Û˨oDÿf)óë[3nÓ¼g²BùlÓÃðkÏ»Xn©=g—$ðB‹ RècˆÇ¶kô÷˜a» ×v…ˆGÔí˜ #BdD„hòr¸õ‘BÕð(¦9iµ^9¢T…ù]Aå»-´%ûUåXi9ýhjoÎžŠ±v•ެ—6d¶,ßkØÝsÔ ¾‚Ðõžõ°­a7þÊG^ F¤¡e" ÝFÆz7Ù%Ö(–I™ÕyœÿЕ 6çŒIMEÁ:ò—,vVÕô±(æ[¯]õëÞ€ÆHðXŸ%9  B8D9·ý"©°`Gu é§n¬=aKB$"a-&,{)åm’q(9µø;ìM&ä swƒAyŒ…RŒRDãÐ2Ƥ7T±…B¬Ç:{ªAËÍŠûMìï6Ä6|‚?Œúóì/E_i–t‘Ù?–vV R¿iQ‚2Ë1q U,ÖejwBª—.Þ 9èââ8ušÇ­Šôžà99Ýѽ›>L¼»üáÒLÃüÍD  .ªjU‹ùC÷ F8‚ÌfQ3Ê,×IZêrurŠtµû°ÅÏÇçàød|óÀýò}ÔÔã•øµúÔ}É¡ÈB;QÚL|bXÒ6AÇ„í…ÔÄIÖ€l^fÉÆ]Íô.Õ4o)ŠØéÔÐ,ò#¤’Ó‰¥‰ÄŸ®ç²CðÛ{¹é×NìRèÿ¹îÿß”Z#;te•1 Q[¹@3`÷²;D¡ÿðé¢îÍ=…*"«UD ï¼€m;)t4J ÅÛNªl'¼V²ÐX €ÒãØrœaŸJ)5´¡¢K]þµ\<ÊrµÏ²{¯}‡¥ ±ÇLa*r¼© Å4:*œÛ$1ÝM]C¸ zß¶‚ð[: ÄĆú¡2uY©™’Æ}¢šË¥¤õ¶ó¦¿è–±›ì¯éÔa^#ÆÄqDü/ÍkXwRkZ"ï3^Ù”ø?²•*ª>œÔZîÒ½öZµ¥n-v¸*‰QȧªtŽDìw€ Oró¢ƒ×Ã…\¥e¶¬5Ç|OzýµOj_W~>õ>õÛ¯ÕéñÔ?ÔŠµÙ†›§±<¦û‚'SNxƒ2ëŽQ•è'¿ù$zÙgÜ·Ú›™k×Ql~Iø9ÀŸw³8nHïúò̶¼á»óîWreİ€[ähKþpþÊ¿ endstream endobj 729 0 obj << /Length 1471 /Filter /FlateDecode >> stream xÚµX[oÛ6~÷¯° ¨YRuÙ[ç&kºå²Ä0¤…!Ë´£U]JJ–ýú^$[¾«Q½˜´DžËw.)ì¬ìü:úe:z{0'FIRgºth!âN”ø($Îtá<º“ïî¦÷ÞØbw‚Ìxyõû…™½¿|º¾¸™z vß©ŸéÕí÷eúqt1}ЄâDÅaèDqŒbP­G_°³€wŒh;/zåÚ E, 0/œ‡Ñ#l­ÅÈgjªk{8£ˆ%¡2¾U„;ãE¾7&c÷:ͤG˜+Àp çŸ1ö˼ÎEiŸˆ¬Yó²Nõ#åÂqÝZñ4ìŒýùI´£«ô§…QÊÉt2»½¾›Mo»¸yèéØ ÅžÔ?½»iÑðŸû†u›ÃØ QѸÝ̉k’Õú!­f™Ø¼Îòòóö’Ð]„@ôC1½«4Kz‚•S(€Ž#Ô9¼/}#óç´æg«°kN¨XðeÚõÃS*ór5’e.«z`GŠtp¥˜½¤yýC¤“CñB.¸ä‹ŒÉM¦Jq ùUöŠ¡°¯ AÁæ¦YÏ*®‘©?‘г´˜•ézl>U\ÎVR4›¡4(ôóå@‚3Qé¦âCÕT Ñ­Ÿ$OÕ@4eó…ÙHéåŒIˆ"w$ˆ°¤Ûiˆ~ê»â«¿¼¬ òâ! ѼCŒÔÒâEéE.­L·ô;õ‚Ø}ÝðBÆáŽÎŽŒ¹Ñj\ï±- ÒÕ;€ÊŸ½ïͬV¦õ »ž•Ñ£íÚøðÕÂŒU-dûèÉN€Ò< ôÚ̃gÏgšííû´Nín0œa.Xt*=0hˆ vÁðÏ㞯 çpBÂw[Nϲü!óvM«2ˆ–NT`Ì‹n—XšÑÆPÇZHóçE'LL¿ö¢«_gÐãk`Áóª-°€]6e6Ä17è* 6pE¾0²:{¨UÑø&èWårçàý3ìïì©ò^Ç4&;zID‹Â6¨ìGP3÷Ë›#yˆ±àhç`‹êc¶·N»|`‚âvÛés"„ýÎÙ¹·Ù&(Þž“½ã»ºÉ•½$Ýæ#…Ûfq{ƒA›); «ÄRð(rÇM]EŠ¢òô•¹f;võnÔ:Ù‹WÌÿ†óˆ‘ú’×Offº–š)63³¥ë­v=é;÷Ë À’|b•U ¸¦!•š„ „1KŠ¢n«g½)^m¡i»ú»áY® ÉRsÌì¿ÞH±RÕ)ÕOº¶5»E»ÒÓïÄÆ§fµ*ø~Dš²½}/̃9JU©>碱ª„í9a¸Sv>eÐ@’¶nW ¯*˸{ -—n›S—;ZÙ5ñ¶ÿwoç²=FõÐùÿ¿2l¥(¡ &¡þb¢M¸5?ñ‰ g¸ï#Ø-zžÀ¤wní„[@ÑBg*Wû¦êŽ*ù¦è8PŸW;Ê‚¸KH(= ×ÖUZUͺÃd ¢Efæyµ+f\¥:¹¹Êtª8ö’ç¬*ñã’¥(<=ûò• !|kÅØ}5/uº©Q‡&°bÎeeþ@€äPÀPàÓCª Uô3)A!î¨Ê‹FÄýË#ý¢±&êCØW5›ÐuÝ3ÎŽ’P³¼µØ–ücÀ]Q¸¾§*ö*1_·ñïšÇ”I Î5SôA¿6ÀÞíçù±O…,B±ÿ= ?gZIˆ0´ï+þ’Kv endstream endobj 741 0 obj << /Length 1933 /Filter /FlateDecode >> stream xÚÍZYoÛF~ׯ`ý$Õfï]H4­ƒˆ›Úzsƒ–V¶ZIµð¿ï,wySwô%¤ÈåÌìß|³¼ü:¼ºä"Ð(’’ãY 0ÒR*¢H’`< n‡ï GTéáÓzùDïó0_¯îæ«YHñpÝËËù¸»k3 šÄ¬&&ü:þ8ø}<ø6  ¤Ô 5Ò”“åàö+¦ðîc€‹tðo¾rpÁà îÁÍàÏöVcD…½µ¿É{ö aB¸M|)ÆI¼4™IBB†inY!²×BÁÑ» Ôˆ2^XA–"G‹]2p "¤”ô"Ündm7„Øê@q!¡n;“lr“%ለá|õÐu2q®O5€±ºB! ®nð61-‡iÍx`oÜ‹ìѸ›YÈ K`Ãeœ¹‡ ³zȭݯ. "PF¥Û­BŠÛmäj¾`Ìܪ†IEškþ¶yhì?Ïoþ AM¼Ø˜Ñ#œkŸäRûm¯è¯}²ÂôÑ(I©†ãÂOÞ#ù= f1u?æ©óìSœ¤Æ?»·&m¼3WëÌj FÔúŽEÁˆ‰¿qqê>z¶÷“‹…§óåÓÂ,Í*‹3(k°J0Õ" hi:Ï¿±…m—–🖡µk®roãĶ˜§™³¸ô€g¿ãXüpß­>ÅO!(öúW`]ÚLrð^csK 4›Ô:J:ö×…‰‹G“5l,WJZöÃËÊ~B|Â’ÆFRE©ë *âPQ>Ž ÇÏO¦'â¾°üÒŸ{¤ Ä„*¤édÑ#…JT.‰WÓ>›lÍ”zÌ1 E¤Ì?p4ç¼/Ðà‚š£\bEéH4}_yQï=ÆiÐ5Ê„Dì ßx«Ê5.™@¾M¦ ó|‚ŸyhA¿•§ÈKk鄵O'F{Àd{üª)"*Ú‘jS©WÝ•G¡¡ÀƒÝq²u}G{oK·¸ž»¶ÉÎûr“)Dx鳋´ät¼×‹ùÊ\­‰¿Ò‹­DĉªÒ£ÓR…Õ'4”N_µ"0–ç5VMd·>[·6V ýL*[gºž“V.)v4ÖÓ èm¬ *H³a¾÷œ*vŸó©û¹¾ÿËL²­¡:ÚÄn¨@„ôÄPU2¨`ÇÈ8’èI¡L že¾N3þéÜv´Í+®í ¦à¨70÷èöÖÀ÷{›cœ½IÌ·Í<1>qVô(ß•‹ý‚NñX$Þ5×ïÁm¾èóŸ>Ó»ëŠS—iWØš A¼²ÄÛš õuÄ·‹…Ï 07q·K³¼7‰·j=óÀQ/H@Úîiõh3Šp$ØìmòžZ»+.üU@"`wx/RÓûÖ9äj}—NÍt-‰x0…R…&͘õ ¡B\©nŸy“B½À}Ú‡€D´”eñê„н~½¼Ú,ojjjÌ?{ŒÓ¾š.)+©7 ¹¯Ê†ùKŸÙ°¢âËØ{ŠÁì‚…>ÃS“Êg/^ÒSï|á䊮 SõùkÛåÏ¡wž­±Üef‹óŸ?½ñèYHZ(2"@K"Å`DÐxU9õ"hu` ƹF>\ç¸Kõp–“ï麬ØÆúS^gn¸Ì×YpþkÌØD*À­réx‡–Uט1"˜_¸î0TÔ æÙ-äJdcë,‚Q‰fêè0Ì‘Š(B ØO‚—! É´@@''‡eèxÚ0Ú€™T5¿;r€}P JÑ“g|\„ï;…ØÃE8°Dª¾ áĺ |‡R‘Óô÷2‘†þq3PóF  ˆ/Š-‰éVÖx´‰Ý@¬Î""Ü’u™9€yCTFuà`8€‡äüÐ`*À¯¤§²%ðåj,ª*»© *»lÑùQÜÔÌâÍ"»¡0C®íìCo²$?ŽÙ…@0³ÐŠí;ú­!î.+ç²À ©ŠËOÛ6È|þê3F)-†ŽÁµT7¡œYÁ?€ ÇÃÌ7S°#§Þ–âРœýÔ´*òÖ·ÖùÂKà Óêì,´aB"Aö°ú|Öߊ6J#É9L‹PR‚–qìóŸOVHèvD™*ª™ø æ>Á®-«ºQã‡à­£ª*X[±î´Ý÷b]cû%Ö–GmôëKÌpxô.º‰Øn {ñÁÈ‘—̵Ǣ̹øÚd›¤E‰ŸÇÍ®)=ÁäPœ[n¡{£¹Ÿz[ºÔÿ„¿öÇZ‡#{ÁÀõRË-€AknSÆ8Î8‚N¡Àµæãxë ïÿÛ0#ÂÏÃm~Ž´>“& Â$ü€¥±½Øy¢½àÙ° E¿/Vou'|V„Òú,°´2Xô‚XI¤mtVòs°ÒÏ?<uÅÀÆ›\b~DtõÅ ±óQ{Y[y/Ôž$嬜Ö>Ù–<©ÃÑÒ-É^´,ÎÈŽÆË`®é1–ïþ'A =BµØ?K?M²¨­ù?í%°s endstream endobj 672 0 obj << /Type /ObjStm /N 100 /First 884 /Length 2358 /Filter /FlateDecode >> stream xÚÍZÛn¹}Ÿ¯àcòÂ!«Šd`,°»†“YÄXû!‰a}›G2dØü}Nõ´ÉË-y, @vw5ût±êÔ¥§ÖR¨5‡Ü|¤Àâc %ãq(¥àŸB1Ãq U×1j ™shøgJ¡µ²É\‚fÃu Z]΂¥Š‘ƒ¬Û4䤸ЋQÆ*‚ULp“R1Ñ,X§1i¶ÉxbVò»pIçg›9@BƳbU ”c˘¨ —@ŽT’OZÁ™ðpÛHò‰…qjL €5?` g©¸Rp')ãMñ`2u™8ãLU Ì™01(°ò¦Z&‡aPj„Õ±X5’!X±º°«ÝJ×qµ¤%¿ PTý. %1Tˆw+”uÓR €)ccðº-awZu¨Ø.“Š ô˜IwR3œÁZ‚íkÉ·'ù%ßg<”U7y~mñ$ß*,˜]5ó:¾1 ÏÊŽ «æâ“ê0üyx`Û?1!· < {Ö+7ÂåêÀ ˆ¦ƒjÐä·B}šñ¦¹XP"@ÅáÙ²Ô×ñE•a£[ ¾ ±Mñ»Ä\2…¡­æW Œüv,èæÀØõ7póÒ†[.«&‡‰K&8]ÌfÓ¸#,Øðo2¿ Û«g\u l¾i Fo³êD0qÕÁ%lVL\u0wƒê6Ožl¶/ÿûn ÛOOÏ.6Ûú‹ùø¯oNÿ½Ùþtv>Nç¯Ü1ÓëퟷÙþü*Ï›í¯Óp^Ášcƒ{¨E·WɑԕB?†'OÂöEØþéìåYØ> xwöŸwtròöM¢ÿ:é ¬¦¼kµ‡‡+6íºÚ¨ºÝÃ?lðw¤$ѽi”¢pH‹ g™¯A𧉥Ó6Ne×ó”¥ï§ìc7¤ GDZ´¨0üh`(`T·OÞÖ@­·ì'IS†ž:XŠàª}Émèä:Ô§áU…æðkØþýÿ„'E­î9¼õôÃÛ·¯?'ÛÒ,ÛZŽ ~µF¶´3Üïè²dÐÎ: R):…®‘…‰D^¹.kŠ ²^#K%EpÉÑl)˜Ã Ùgg§³<à "™ïzê!°ÅþÀ!å« ËâÏ6X.ï¡2¨f€³rñõË4¾é~:û=Ìæ„À¥` 5öóîK„Ê´Ÿè=î~ëû¨½L2¯~QÖ$ï!Ô»¡®šº&™&»¡Kе1ì„u×·ž5ÔH$[[f(Œý-0ÞÍ@¬‡e§<ÔÜ]Niš%î»T§V»vLÐÈ ¨x†TP¾i,ÞDÕ‰êð‘:#!+¨s/Q³wÀÊ·¡~^»T&k4‡¯kÞý‹…ë”ɤƒŽ#§§±›jgCjug–¦ŽëP¨L©`á|…š¬<·Ç>ú!” XÙa€x¡Ø€*0u˜ b»›2Ǥ¥óTt—íÀØÀ1ýI·]¡–„¢œË½P? á^êìd÷+ïê1ò†r'Ô’™¤«yDVÜÊnØÉh©t4öL]îËu]ÞOW¨YxÏ÷@ý€aâR× ™$JBíHþñ%#“Ìw‹¥CÞ®ZsS¤©#Øû „;ê4Èu]AM¯P#õ‰‚ü÷>¨.º]V8™töÂË ÇМÛ÷­p2ò„¢WNFš+}ïgAuYß܆êyÀÓðÊ?®m„ÝýB#솬€JöïyveÕºU[´ ýC² ŠXtÈÉÂmbJºJ–•c–ux=)ªl‡d½Yù¯í}¦µs[ÿþfoèÿ-¤û¶ƒè“þ½›üªv‡Û-´´ahiÃÐÒ&¢zÌ6Ìž Ϩu¼Gn$3±Ú£-†ÝÔš^&ðl‹âÏ‚~ô%¹³{qc¯¼ÛëʵFMµ”&É,€kܬ2ü › ÞǺû1Á«PPÝÀ·Š.ÿÝŠzüf5Ž­ÿbrCöKâlAi|tÙ⟕|u=$+P0‰OÖëQñž‚ºeZ·°'xµÜ.;ØsS¨þ 2¯Z˜‘ײîíãíÖi˜|7r¹¿ìš0x3¾]ƒ7ä¯"7¾—\ ƒ÷|’?‰|lw‰|MÚÇ‘oÁ×–7ðŸð1ÒËþ§"„ô›½3†Ò‡¡£öKß-'.Þ¿PøAÆb%Ô\ü§,wƒ…R’GïÄ£î2Jšq@õ/r n‡×=>ðb<·õÁüs®É à|Wà2I©eª# Ø¥<¦ÔºEu«¶«­~BÇ’ÖÓñuÙK*ôˆq(>$Û¼Ü,«d¥ ¶o)+×U²d ác¥,+ªÈfvÒ¼&û?¤wª endstream endobj 762 0 obj << /Length 1402 /Filter /FlateDecode >> stream xÚÍXmoÛ6þî_!`_d æHŠo†i^ÚKí¹î§40›vȲgɺ_¿£HÙz‹§Ù/#SwÏÝ=w¼#ö–ö>ôÞOz¿^1î) x“…‰ež )ě̽[ÿüãÙhr9î¨Tþ9²Ï«ë?.íêbxþõæòó¤bÿÌü™\?÷ï&Ÿz—“Þ_=š°G<‰‘“J! f«ÞíöæðÛ'£ TÞßÅΕÇx€8 `x_zö°C‹åfi»`ì¥Ð9·ØG}Êüh­t®·}Bü¬@VŠìDÈ"ê8@…hÀö+"‚{’Q„å°› `ZÖQ±&ĈDqµÖd³=ß%zÒ'û?6ºíf bL½BT .‘ ¼Žaò mÜÛ`Š×ùÚ>ïÝÿ³uڇ߿÷)÷!†ý\ÏQ9§ ù¸Ûd(&^Áƒ FObÁ©4%IZ§Žu¾Û¦un–ÏFP(E¢fŽäY~%ÜÓ¥õùVo¶:Óiå1¸¿x·^¸ø<¿B{ }PÂòÓÎD!Gly@ ´cŒýÍzµ¡Ó]¦·Ó$¾G ‡B¥ˆmWc½èK NgºfjÃDì `%ãâÌBþ†1M¼Ê£8ÍVÍõ,‰ Ó±_ØžÕ’Ä.FÛµËÅ.Ù­à‚—`µòB€$²p(A”ºrøKœÎ’Ý\Û„TvBá’Àl7þÖ!K"ÉÂrC–Ïçz~jKb(LÊ¿wH—‡(€W— ¯.Nóç‚ëä œ‡ °#LØIŸ)C*¥ÍÎé×/—ãéOS“λÕt[ø7kJ¶•ã2ʰ&õ=ØzŠãèª,y¶ë4ÎÔD†:—åýBõì!ÚvQò_?Iak–ñöz¹ã„NÝ©™Säd<„VD>ÏÌSœ§Qâ¨ôŸùý@†oÈp±x Ù1Lß„7ÞCj>Ф’Ç­ºÝH0jj›"Í k¤Cáam…œDàé»}Ób“YÙd¶«|6­´p·°PÜ¿ëH(ð YúúžºLç¯á's`þ ?Ñ.?u m®P¯WB`:­Øs–eñ²ó¼.ö’“íW©—Û_ò$d{žÇ³ž8­'LÍWÅLR˜…†êéV¼0uª?`POªÖjªhÓêD¼³Z™9â›"«†ÀDEö•¦,dr³ÿ¾­éBD|tÇa¥ât(a@aUéy'G“ŽæZSPÕp1ä|9Ey£ZÜ;ïVK„}˜û²¢˜²“–2*•Ã’=y×ÈÍ$}Ê]hûÆÖI2WtÂqÓUÅÿÞ.?¹ endstream endobj 781 0 obj << /Length 1023 /Filter /FlateDecode >> stream xÚÍXMoÛ8½ûWØ‹¬Y~“:f·I‘‹¤®÷”cËŽ›v%µúëw$Ѳd)Ž?`O’EjæÍ¼™Ç‘ Z ‚> þ>܉ Ž”âh àŠ Z›6&Ðt5xx$hkŸÁ<2èW¹s…„äX ÷Kôuðe@<\‚™,n‹‹¯Dx६Ð߇L6µ«8ÓÒ +‘mMö"”Ss ÁŒ‹`ÃÅDI¤ÃP°»)Žfe¢ŠF5¢1–#0% VESQðlÝlÙ“a*)œëó†w*5VL¶ÝŸ=ÕAy¿žW×|»˜å6 ‡‚y<«ž¤ñ"Y;ÜE,x<o—3A¡ªÔe¤±+Í."…µFšs(RSemšO'Y)¡2HÜâoçèç­‰àjKÌDù`ºv¹M\ý»¦°"¬ºŸÙܾLÝÉ»Ô ¡ù™Ôíl-N±q¤˜(…%j%ÄUÈ!!$øY(Ë:)Jœ™àþîŸ{6¹vþç7" ô€T~á߯ףɨÌj£}?ÜP"p • .$Š‘•Þ¾«M†6q•­Búõ`/ ¢ÕΠ¤-ñÛ+`[€Іb–Û ír¹íc›ïÕÉDäÚ2`«KqLøú‰!æ¶6Ê|te¡MÇ^° ÌØù𮍯ÌÈ‹ôA‰)§o!ꊬ©9EÔÏôÞ+-÷ï$ê§ãí’FŽ8»H ’ówP ÉdQÔ”~@ng—Éïph‚x_#vû•¯ö)i7èÖ0{œí±Öh6;³›¢]$ p8äB·¾›ÿVâÊžmrÜiø?6i1ãÙÅÊî†Âúu¿;v³ãšZh,ÚÌ ð„“©´iš†J3íÑKañ®^¶ÙjêeEŧ8Ÿ¬76MØä§ê´»€”¡VØ@KUÔx¡ÅùBeàö™¹»¿ÝzjÀp—f;1ìx»ùãPÈR5|¹¶¾€•1 ÓõL„/¢„î¬ð*•CoQŸ¬uXÊqë’üM;¡0˜üÏz¡G øÕqŽ~ÃNù £ûO‹¤43*²¢”ïA÷=ÿ$@± endstream endobj 806 0 obj << /Length 1501 /Filter /FlateDecode >> stream xÚÝXIoã6¾ûW‹Ô’â& (fœŒ§$uœÓd`(2“µ%W’L}EJ–¼e™9õbÒ\Þö½ÂÞƒ‡½óÁoÓÁû3Æ=…"!Bozï…B"B™'#Šñ¦sï‹úñäj:šC*•Šìx6þcdg.Oo>.¦A„ýó3_^_§Ÿ£éàïNØ#žÄH áI¥Érðå+öæ°÷ÉÃ(Œ”÷TŸ\zŒ‡ˆ³æ ïzðç;i1¢ÜLÍàd¬#{ÃA€èœ[Ù¯Êü¸ˆ—ºÒE@ˆ_Ö’5$÷JÈ"글 ѵvH„÷$£ƒ”GhÀi‚"Ó’°ÚˆŽ6ŠÃv¤8A­6«|¹¢³Ç8›/ô®… 'ˆ1õVîaØáN¸D‚ò>û‰®Ö€Îý¬´ØWÚNœLõü>±Ÿ['2Pì?-¾Ù¿…~HKÀDÏ7ÿó íjÅ)Hõvqev²v#º£¿¢Ayú]ëŸT@«ã¬ø®M<â§|)íDDÂOûE{ÏâI: ÉK褠¿ì‘A"É¢æ@YÍïò|÷©_Æ:F’Gõ ’£B}ÈtÉ. ?@Sjà a³.ô‹J$ö\ɾÅn)åÛŽÆy/*À)›ì >uóœ ïJW¿°ˆ¤+à424ÆQ/ß(Ù“Ç-ä…î×¢î^ï4cl—(”ê% ذ¾ò³-A‹ô/ãЮ¹‚$ý ÝŽjaÇ$/@˜UžÍm(ùòu‘¸›Pt[y$Ù”Ù6W0±qS\¿–›ÇÔ›BÇÕ#WÍî\ír9Ä´ÜŽ6â›"—–ý—“5½lk¸{5Ocâ¹k ÝZ_\ôá)£ E2Ä”Súsœu{½³ã>þ®Áþ¸‡ŸNOmï6ƒ–ãË‹Ùôò÷ÑÅõ>+oÛH¨}å%îä®5w/ב}E镺âÚ5R/‰o£èÞhU}[é½âìûìrE_óYl÷ã£d>Ùת2ºý½ë?Gäë‘ endstream endobj 822 0 obj << /Length 1618 /Filter /FlateDecode >> stream xÚ­XYsÛF ~ׯàL_¨™h³7ɾµ‰q:9j+'ã¡©•ÄV$UIÝ__ìÁS²"§~Dî‹À,±·ñ°÷föëröò’ /D‘”Ì[®½£PJ/ˆ(’Ä[®¼[ÿó B_d{z×Tª¼+Õ&-ò»4_Ï)ö ´µ+.Ó²ÒµZÏ öU©òDÍ¿,ßÎ.–³¿gÌbtfÂ…”{I6»ý‚½¼{ëaÄ¢ÐûfVf Î@Þy7³ßgØ#*´¨œ#’{£@Drè‰$·®\6yRÃÁ+s¢N•û}yÉØ "QÞ‚r8£Ýÿ™R1ÚêÝ.„þ×9~‘®Ü;ía¹q®^›U“¤Nnêr¾ ÂOó ý@Î ¥¡¼$ 9Õ®÷}Æ'pèÚB›lãr~Dá-¡ô¿¼8uŠÀÿøáÝGz÷éæâúîºâí——„{€A šŒD$…WŒ™^>Œ£($íšrä8AÆÎ-—ˆ@h„¢H< ÄëR)ã ÷ÐáÊîUY=†ñ£ª3AæÈðY1£Q„B9ÌÈi̦IcŒŽ(Š6=á&‡x»Íð‚Üœ~9'À {EÉù˜× ó˜žrl¶GmDS~XQƽ§ Þq"pfŒ±ÿZÕ1ðÙ ¤!ü«’2Ýkö˜Ä| †´&(lõ-·iû¹ÔØRCŽ\踀êܽY;R²ÿV:i“D è3¶de^ÄùÊ •CµIêÊêû¶M“­}¹…eÖŒôÛÕl!ü¬W…ä¬i2·OVJŸ0WΈŴšƒôxÉ1ÆÚ8¹äbžÔšÌæ‰HôÙű[…«$aÇ+‹#²à¥$&&­Bؕ߫E 0Ð3ãèÊJua«º(•{´U•ƒc˜A@4€‡±UÛ]Iœ[áÞ©1!Þµv¾¥õÖJ±[?bk·U·Ï‡œv°oPhšÀ‡TqÛîXÃ4Õ0N[ Zp_ǵ:§ERŠ ‡s—ñ7µîNûµÊÓfãƒ_ö®yûC1áçT«35-VêŠõ]œ”:Y‹¶ZM6§®®ô“"i2uwPÁßfPÏÆdÇ?µEcM¼Z¾r|uñæêÃû»å‡ß.ÞßLßÙœÍãLÃ#.ÛaûÌâ/7ªcN"‡h¬÷€¹ó_äóÀTʸÇi9ç¡fÑçFu¨)kÕVúhøQÙu£3À”)œ‚t§Ô<8î\¸ì)ûÿƒ$ú;`ÜáfÜ1,VŸð¦—SöM_o »¾CÆ`¶ Ñnìèô›R¸rÍæB<ö2pdÌ dN'¡Ñ¡„©8œ„z#øXd°ëTNøï»#Ì‚Á(E£`œª?J¶Z›kÐqôh*'',8s¨t«‹û?UR[Õ¶µhi×±•J¯¬´.‹¬?‚Æ^A pà_­GÕù8l°í ØgU¨ÊJyÑ–0üí¬ìZHƲª½JRKbªãÅäõ¾,6zбÓNfÆ÷…k!ÕT¯Òøü“v¶WNA­ nm´.\›ñNý|"`燃Ned'Œ·> stream xÚµXKsÛ6¾ëW°>‘3‚7ÁÌä¦vêLí¸sr2Z‚¶z…¤ÛÉ¿ïâAŠiÅ’Û‹Àîbß· Žî#½ü’O^œq)”IÉ¢ü.b2E„ò(Í(’$ÊçÑMüæ·×Wùéu2¥©Šß ÷<;ÿýÔ~}ÿæãÅéežd8~m~òó÷—ÉçüÝä4Ÿ|›Є#¥))£T)¤@Ál9¹ùŒ£9¼{aÄ2ýcW.#.œÁx}˜ü1ÁÞZŒ¨0Cóð¶KÞ³½Õ Át!œíW åqQKÝè*!$®­e­ÈQ GDí7P!Êxg`OAXŠHfQ,öÉÀ‘ÈPšJ/ÂFöNCˆ9¨ŠR. ÔgÖÌ>4U2%".W÷C'AçêXë R$ÁÕ¯“)S2®{FÀ„¸ÍWíw ÃñVQ/‹ÆMž,ôê¾ùjì~qFx”2*ÝiS”rs «æÆÌ­ Lâ(S´]óWBq¬ÍÏ÷W' ¦X<èÑ#lƒõ#Éö›QÑŸÇd „é!¢O |¤Lã¼õ“÷ˆƒªs÷§¬g7EUk?wkLzðÎ\­£-šRã;–ESBPÖ&þƒÛÄ©ÛôÝŒ „ÇŠ…Ùr¹Yè¥^5ES®W`•`ªE@Ð꺴{Ú-í<à·v¡5{®ro‹Êo[”uãl .=`ò7O,^»}«‹b“€b¯ßyÖÕa’ƒ÷‚Ã-~¨# ¤ ÿ\袚­á`V)Ù±^ní'Ä', R»(JÕOPɇŠòq¬ô=¸-ÿ¾Ñ#÷…å—þ<"M &ÒvA]Ï#R¨DÝ’b5³ÉÔL§G?"†¡ŒtùŽæœ\Ðs”K¬L"•‰Ð÷[ï1ê½ÇXCC¡LHÆžä;ïtë—L ß$SBb›Oð׆ô{Q6¥@^ÝK'¬|:1:F £ñ«¢ˆ¤Ùã£2²=TíUåQ ˜Ø'S'À;Ê{[ºÅýÜ5d[Žå&ÎæÏNîJ`¼—‹r¥/×Ä?éɈV"â$ݦǀR…ÕGÊ€WŒåóˆU¤Ùo†ÏÖG‰ŸÉdÁÑ™êçäùÊ%Åb=΀Qb ØBš ó­vÏÂ=|”s÷w}û§ž5†ê`‡¡RÐ#Cµ•A;Dƞ䥄´Ôùºnù祡´ ÏkŸ»%L!Pp aÎ}ƒã#àÉÄ -È™A¥¿=”•öQ(š–¤<-·5ú \kí 0.©î½o®ßN¢»èêýÅýòñÃéõ—k›{_Ê~òµÛ¶B¯±ò†ÔºA/z´8¿A‡ñ4bï+è*§z  •0íZpÁêØó¼|¹üØ©º\Ú9 Ýþµ¨Ç2þÁø§Wî‰@… ²“SS_…~H@çG™¿Ä (6D!`c#žÇk[OTÅw•ÖÖþ­ ´ë ½¼m/v­ ®óWpo" „wd0î êƒ;h}a<ÖúBרËy8Š £xÈ |À2€€^Ï Ôwú€zÝ0#0 vŸÝu–pšôN,õÒ²¿mø,Ý Ê$ÀÒvø±6>}B!­3)•G_âƈ0ö,²á òÚ€ÿ‚lxFâ0²9Ò€Q² ÈÃP•A¨šuÈA¦:æ6‡Û8ˆ•‘ªg‘Á9ˆlžF2®¦¹êó Tc)Pa–¤aÕHuK艶­ï¶¸C]PÜÝÕb³^nzH”'\™Þ–ÂÅß^·÷¡‘ÐbñÇa¨éšî\!¡;‘HÛS˜Ë4ªätQ …èÎ3àeqŠzÊqÜÔý¤ìšzßø®Ú¼ô ±sE| ÿUˆ¥‰Œ> P˜¹C2õL@l€ æC¦"ŒXë±GåH F%°`Qv‚· )cÁ߃1‡[= ˆ ,{È0¸›*þ?6´ ®”€ÓΣ׺y¨Võ¡m¬GðÎÅeWÔö{Ï^æö“m"í¥Ù)zÈ·Üáçg Oz¾ç|Wñ¿ÇAO_ endstream endobj 748 0 obj << /Type /ObjStm /N 100 /First 891 /Length 2393 /Filter /FlateDecode >> stream xÚÍZko» ý¾¿BÛ/³¢(Q$\à>š¶@/$)Ð6ó¼ šÚã·ÿ¾‡³³n?2¶×¹ K3áŽ8y(mÍb¨l!s¨B!Q 5ã’j¨%†b‚–B­¸_R°’Ñr b¼€ bJè”@ÙhS‹1Ü©4» )&×b!¥5Â!±æÀ ã太w*ôH©8)èà ¸I"o¨âuq…"è I ©2FV(¬x^ciò™@XÅ…cHFÖ8B°j LŠ!j‚d›Š» E¸ƒûÄãÕ Lœ£¿UÐÉŠ;x” PU–Ù2\ ¾*JrÍx#@³®‹UïÀU-°F¼^½ë+,†9U‹°:*¡“ ƒb’yãeñ±p7ãߦZÙ|ÊVBÅ¡§†ÂÅ5ã«A#îh(9û,Ì[£…Rð-ß«0Á6*Rl£øœx¸ÃèÀà3:À¢ø^Åöv!q„5»{˜Bit¨0u(Œ1ˆâ‘F<Ž Í>í„ÑÕmݺºe +Ær«ù#òI‚’,þHýdA3ÜÔ?° ;žŒN-rpÏÉvÿR]Ý$êJ˜*ž ,¢×„Çæ¾ƒ ZL>F§ºf ðš²ÑÑ*C†ñ­[fïøjÀ—Q|«êoY0ŸœÂF¦âoáuƒ!“4ÚP A1FÚ<{¶ÙþÞTÀ‰áeØþýÿ„Å·$Ò+áäÓû÷o7ß}7‹>?=9Ïž…íó\|Õì_z1†ñ– øì¶¿`_e‡ šú gÄt–'>(À$Yž`5Èá |.=_ÐöÅÙiÿj<oÂöÅOÏÃöõøëy¸Àúú¿Fuçóõ_Þü{³ýáôlÏfÄñíöOÛ?o|Có…ϱ‡q¨$|O¬ŠMÄRI…›ˆoRRl¤ú̾Ÿ?é«°ýãéëÓøÝ‡Óÿ|H»Ý§ãÙn÷þ]·ÓíZmGžG,€¾ˆFŽÒ)[W£”Á~ïå8™š}:ˆ à#®RCˆyˆ#¸Ÿ×Cã0}´˜Yíĺ®ÚÌ:ô-aÕrʰ&#Y#pçÄÖ$xò<»ä©ä˜ã8šv9UJ‡µÛ2 dWjDÈ¥¢† ÖUOc ¢Ý~ …×C– ÌÝÔÔ÷]j%"§D¥+Tû6ßÊlˆMða2n<ÌS tÇ šúñ×ö’:,½:RGÔvÓ4!å?dÕyùK41î§P*­‡l•§ÚE(OÃ0”45c‰%YŸô1¬\kSœK ûîà+®LƒÆµ4‰¥ÜåÊr[:ŸzÄR›ˆLt3Èwqðã~èªôÈõ`6•‡~ìm¤µ©í#?â" Pƒ•Æ<'Š4vÈ„XnÚËÔãHQxš´k'Õ‰xб}ȹ4Îh3³ýrÔ;xrɆ©í¨kÁk•{Ò>"¸µ¥øÈQyf»Œd®Îæ‘Ì…öSº2„M©OmKWºq(=•ÞÆ<ÁÉk¤Ï!;Ÿú?Ÿ›ù(hãdù¡úRvá^¢ÈÙ «d+æH«DÁ¿g±kd3»¡ªX#Ë¿yåÔRΫõ&J èûÑe v(–×É‚&¥Xï/û0Î|3M¾Ä¦o¢É—Øô}9³ÒÎ\í>œù3ëi\¿@ôjqRd#­“Òˆ¬“-VŽ×‰b¢F¼U”E§õ%•&ç²NoÄ"ëÌÀà?T×MÍs¡ñWd](Aˆ#R¬T ûzÒ½UÕqc(h=#¯Rœ8ÃúÅjH˜žƒÒ*½$©I–­´}ø’sþÅ’ó ‡•©¶·„ïìÌe¦-eª-eª-eª-eª•c–¡5œïIYʺ_ÑÝÕÆ 5ÝÇó³Oýù‹¿þü ùo¯þðr·{9þòîôd·{w2'xª 2uOÑó>û:›¼©BþfÐ2òšqºW®‰ow‰Âœ}kæ2Ã$:´­t}×eÕ¶Z[b†ž@ÕH¿PIrò… r‹æ-–£ÑokXBœ…‹#Ô6šÑhC0sä"ü´ÍšÐP°ï³K*†8I¾ùݬÙ¹Ýx§¡Í†ŠÒR7¡RÓh£vÒÉ8Öz\D28¯ú¦:{®ó}ì&—zäc•)0vD™Éä^J¦Ntœ$JŒ_ðrßç^K;.É~…v\+Qc¬’,¾´ ¯“Í^›n—Í™›B2#æup3[ãgkdbvÊëd 4)Ú: Dt5á?01ßHŒobÖ÷MÙéÊβïÛ?0e/;ĶìÛ²Clûb?ÞØ·´´{ëøöÿþš—”¿\“,m]Z]Úãî87UweÈŒ°O¾ ƒk¸¥rzÒ±•á‚~JuÀž ˜é6ìß.e ëu&|! 5~JVëGïa×)umßÊ4‚e`Æ:‚i´0µævâš§ãAO‚Ô¯z•š8ÁÝýÛ™t„”jÄ·ÎÞ€¡¡Âo-݇b-u©å<´Y(œ·DË:ÁàSwD»VnüÌzΖöîzèwȨǩK Ùç¢"œáô*I ø¢"F2yÁÜ¡"¸ ÜS ¯{³ú¤i™kv?O’Aºë“Fž(ÏG ìœöuÃ-пi^HHZ ”3€òÝÿ ‚òÓöó½ó_ð þ"ÿ•Î|nŠÙTÊO»SÐì™¶ú*‚/ׯÿ ®ºì‘ó±sè´þ˜á’ì¡D™ÉÖÉŠo5Æ´JÖ ºf“ïZYDýkk”Êfÿ™C•u²È–¤Ç—õc¦y,yÍ&÷—]S'ݼg¹êáR¡uß:‰Ë•:‰ùau’ÿj®c8³Ž™÷ŸÁYáTæØÅ†RR’׿mÌOÁXP¯€ÿe\¹­\€ã½Ê”]›Ó qm…ðTúù˜ᳯֶã—ÑçP=¯‰>ŸË" B½ÿ&jlÑ çU²YãµÇ×Ê"}û±û7ù•Ûêsÿ¹â¦Õ endstream endobj 900 0 obj << /Length 733 /Filter /FlateDecode >> stream xÚí˜]sš@†ïý{ 3•,ËGà2±jmuL/2f#«îµMú뻈IŒ_Yº3\Á…¾ïËÃÙåì` è6àæUCVq[\ºk¿qѱM€f@.¡æØ6¿Xš©ÛÀÁ½Ò‹C¢êºò¨þð¿nI^t 8škÛF!AÓ‚tQùß–ß ·ÃÀ|k÷G…Ð]ÍåöM]×\Ç)–&ó™Ò$hü˜2Iþ‹¹?Ës9þƒ,$ å˜{$\ŒW®Ó~ó 7p,ÇÔLk-NÑ'ÉBq3*Å›àˆ,_‚Œ ,5kjJ…ŒÆ3^…‘š :߆X=ý±«ïh ™Í+°Úäÿœú uV1SèfÉ"ݽÝêžk¿©+09¨’ÂúÜçm)ÌpFä™JDÄ&<öÁ·»6 U4¡×JŽ‚ï5Î;Y¾û«‘AgÊl•ÎÛ 6wíJÕБj;k$IŸe'/­­ÈësÁrÉ^å9Ö¼¦šûwŒkþ\±Èx´ÒÕWzï™IìPÛUóü½LÆ—L¥LtaçqDÿ¨‘¡KX•·¿¿†óŸkµ¹uzjû¿MèŒo endstream endobj 991 0 obj << /Length 1041 /Filter /FlateDecode >> stream xÚÅZ]“šH}çWô£Te:MÓ|=&Ç5›èD™Ú­šJQDZ¥ÐL*ùõiÁ™ièvò¤Uʹç~ô¹÷¶"°Œ”÷®òöŽÀ†ŽiêÀ]âX!X†¦Ü<Æ“ÃÕ¯îGeè*ÿ+{ XÚ¦ ,Û†6&`+_Øg‚ºcƒÅ7c@ Dgï#0W¾(èØ¼®™w´mj=™ßnâ-ö¢ð›JЮßLJ éêÀe6RÀã ¶ìn>/M€Í6Ø+†s¬€¼Ÿ~¾ÇÞˆæ^¢jh°‹½”®ÂM’ퟕ'ìW ±Ùú©z£ƒ{ßUl hš16u2Ž 2èœg»Œ¦ÜˆDãvoœ„y‹MÛ§¦›óê\9¯Óå²¥˜®òiòz¯ž±öÂd©êh°i‹%ªŸ T|{8y¸ð£‰Ó6Pí|­xÆhÁÍßEù|ýtè’•«j ~nEá‡IpFT€¨ý‚ô)L¨&Nhƒaþò³ÛMùÛLÔ¯i»ÏÁÏq"ƒU‰uHe¡ž~NÅ‘ïÂ4Ë%Á9?^ŠSûäwg†[Q'›ö‚à‡yO¬#/'»Ø]§Ô2q^Ó4 ) Äf4Ø-r¦PâþíµC¥‡$…qX°ç´p,ô¬pn1lá5_¬YÄ#* /ß 6+ÑœWcõËî¾rI­ÎKKq[ÐX¥›Ý¶‡Ÿí-:gÙh™NÒj3çln"OÅÑ@Ź.•Êœø0μwY®oí'ADÿÐüTé¾”t£ƒ»Ñé0DKäQÏOÇÙR¿0[öÖ×”¥õ„±;kD¶N’.Ê&êeG$í:YÖFGÛŠÿD-Ÿ|À†M˦ƒ æµÓÐG¹H£škÐ1Œ^k«Ñpާ÷ïfãçQê`‹…#Ä2aí hÖnm¨ÊFŠ^îgÿIäzF{eÁ6\ñÈ€?–èÞ÷µÚêÕt­ö:»uo=FÛs§'óŽ]ü¤ ùbž?/ñ¸¬Ý1g‹°/†v™RZ„· ú™ÆßXæÚ°Ž´5\Ej#ƽ6êÉ€« lbi+ ìd×ÀG‰‹n^Û=$ã-÷Hæ.œÉnºŠèŸÂž-–÷ 0é T{6uœ¯Ïò¹ ? ©,!T^Eç‚ß+º œér)¦¯Sæå5K·¦©ãúьݡ»6ï4çOr¯éóµØr~ŽÆÓ _«%úňœ´Ú—±›³Ý6Á›'í¶Ì×r áM(_l I‘ɾ}´ŸÞй`£º–Ëä.ö$“·Ñ¾:³™iáÖÿ€r§´Ë qýH>½žû‰ß° »üÀ_ÿ_Á‰Ð4õCªË3üãÿË endstream endobj 902 0 obj << /Type /ObjStm /N 100 /First 924 /Length 2725 /Filter /FlateDecode >> stream xÚ½[]¯· }ß_¡ÇöE+~ˆ#@Ãm0?´5ü:EÐàÞÀ@úï{8Ëux] »z¸Ðì^ ç IQ¤xvº—V¦xéc–©­ "Œñ§øãâc`”BDmû’Ÿ¦öB2 V¨·¸w2¥ÃÔYhŒ¸Û yÃœÞ 7ÁœN…i@xçÂÒ0§K¼˜£…»9.záÑVxJÇÅ(ì6³Ï"Ôâv/ÂÖŠˆáv£"Š—™ÆELp»I@ÜnZd:žŽÚo”pÇ´Q”]ÓfQe¼)h‡Ô9ZQs<pu21¸¨ãÉsHéÍñ¼dgÆ[Œ^ºæ„FºzÜ>J7æÃ„ZûÀ;ÍÏ ³kŒ9“Š0'ã‰9S Ts´X‡¶&¾5›1ÇŠMŠ9£˜ë8„¬ÑfÈñ28̆ »9•¡a Ö€o›³kw:þZÎ1`qÍòàÇ·Bq{\@¯¤“GqX“µ8‹^z)aiÇkàs†…@|ˆ:Pk<'‚¡E`j €NŒ+…àg­C‘Np´fx¬ã©MŽypµæÐ¥| _B<”EÄóð ’NÇ'"… ñ :0ã4àˆ@«P¹s8s£˜‡g0Á•††8ØÊá pu t¼qט‡g° ¼T@<ñ^.x|óàu$m„bð áЃà"XW.±b¾µáÊBo2bae8þHÂ×k‘´5=<{v8¾ú÷/åøò‡>Žß>=~xxüðêlX´ßŽß=¼úøîíÃûÍRÛWyøñ§¾yúµ¼Ž9Ý{åm•RþæIï ä4ýëÇÇ'H|½…|³…€ÓH9rŽ’£æØs´GŽ3Ç”×S^Oy=åõ”×S^Oy=åõ”×S^Oy–ò,åYʳ”g)ÏRž¥×ZC:<ëÙ¨*ÅÖª™îÙ£.¶ù¦ÝpÍ[£jÈwkЬLs‘9R¨,«uß5 ¾²òÚ˜Íæ˜r1`³Å ¤×Re¡ß[Œhw Œ$ëj*q4GJý ‚yεTâ. L꿤¡Èy¯í^|âH®.~IÈöeöÅ °O¾ø% ïªÍׂpÔÍýâ—„d_EÖbÀÕç¾Õ>Ö@Pj5RÎåŸb]**ý/—÷‘åßâKåß=@œË¿ÄË¿{€Èòï â‹åß]@ ÜS¥ $Yeª5(rs]F-5(²¬¦×³ÝAHlt|bdY­_3Ç «q¥w„ǧ×pÐÀ4PþÑš¤êl '»5IVó¾ÖjH+ù«tP¥6[CgCœ­¡Hôˆ|±5XQÿÑÅHôHe±5.1.ñ2ÀPï‹­Ñ¢ÒÐÝPÙXe“"dXµ6wE²MÔk!P@4ÇR‚d“©¯Q„ 줧r¯GOÛ÷°"Œ¥rõlÄnÂ8TãÍ¢Ò‚g8’Ê(Œ ëõJ5®í– ûƒm5gìâM¡&EýÁkNd¢¸¡¨ƒî¶BxDŒåÚØ "sôC¢ìÝú¶Ø.¢ÄËu,ÆÐg^ÏŽ)VŸ«Œ2âïÒ;Bqzh4£!^çšx«“Ù ‹Öh&fx$|&^ 12ŽÈÎ>ʺzâ)´S˜rÔÂt:Êríl¦ß>Vƨýα’0^ßÂï+©GóØ÷XIÆ×·O½qAÑDg˜…NY]óh›#~ù¢䮉™Ô¸h‚ôúþ©t{Ãá ´cp¸©øÿ áyy=ýÔY>þõo/çúLCÊ8¼<~üùç7Ÿ›»Ei+fX¤sü÷ÜO¶ç¿¶ zÑÇ"X¼§Æ6&_¾{zûýÞ¥_>Qޝ~ýðÛNõo¹§¾÷§\?µÆÿ®ƒŸ ‡å4ö-ÇóÿgŽ'-yå4RŽœ£ä˜òòýƒ°rS¥> stream xÚwT“ÛÒ6Ò„ RE:QCHè½÷*¥† ”$$‘Š ½IïU©*½ƒH‘* H¥ƒ)*J/_PϽ÷Üÿ_ëûVÖJÞ™yföÌÞϳ×Λwøí‘v05$ËI•uu5Á $, 89áXWØß~§) #RÿPFà X¼O‚Åu‘ ÖW X“‹K@@!Hòo -TxÀíº@-$†p*#QÞh¸£¿Îß@n(,))~çW:PÑ ††C! .ësï…¸P8 ëýÜ2NX,JJPÐÓÓSâ†@¢åxî=áX' ! C{Àì#õ n°?£ 8ÆNpÌï€Òë AÀx‡+ C`ð)ö04¿:ÐHS¨‚!~ƒu~îÿl,þW¹?Ù…àˆ_É(醂 ¼áG ÜÔWÓÀzaï!û ăÄçC< pWˆð«uPMÑÁOøg>  Ga1¸ëÅŒ‚eðÛ¬Š°WFº¹ÁX à¢?8Åï»·àŸÃuA =>[p„½ÃÅöP‚&¸û˜¦Ê Þø·Ï†Š‚$Ä…%D0w Ì ê$x±€±7 ö+¾pãgðóA!Q@ü0?¸ ÿðÁ@<`@,úÌÏç?ÿ´`0ÐÅí`ŽpàßÕñn˜Ãoþh¸Ð„§ºøüëÉ Ï0{$ÂÕûßð_G,htOí®’)ߟ‘ÿTRBz}ø……€üB¢ $"Ç?øý³Î]üOÿ‘«‰p@/Š]ô‹ß¨¿{öøCî? áþ³˜O]ûßL·‰‚ ø/ðÿ™ï¿Rþ4¿¨ò¿2ý¿;R{àêú+ÎýðÿÄ!npWï??»Úš#»]ÜÄùþ¥ñDŸ–[”OÌR”ؤŠÑÝwY£¨ÚÉåí»8)}ÿªîü˜èÉEW¢&®Ò¢×Ú^Y’¥CÏ"iúå“!¶É®ÏxEt—á¯ÜOn±AKÑ–©z·´eZ žT ½ý}3Ô]¬QZV¾s„b©U¥ûXTD.W˜Î<½ö3·Øc3ƒÆÇNVaÓ¾ûÅ8‘³§;­­J\SîQˆšhÜBÍŒoFÁ“ã-°à›ZhzU´2ÎÓmqß·ÂkÑJ§× YèW†kqýºðúq4R Èžól£-28†A 9âVÙôRWø[)aœ=A‰^Þ‹ãÝ@ú·=Èa€GI`ôñ&ît“0¨@ÕâHžß½.m:Úæ(Öû´›‚PnòÎù¹æTý-7EÐà©¡pýD/]ŸO+ßSúæeIêÅøƒ•aݤe}J'?~ÚiîÇWÑô­'ÄF·(.ì6åFñŒU1½ÒR"H& ùìsÖæ®°#3ÓN–ì5v‹Vös»s¤ÍõïJ,¦óÇ=.×o›ÝbÿÊH¸\Ÿùz²½Ž¼¯†Ñç N*àܲÚnòŒÖ{Y6¦!·§â·÷l:;¾û^òµ–¯µU`çûåAŽ%×HÛÀv­MYZÏ!¾¶­N1Åvy:<ïmA-¸@ÎIß«Í Ä½´iNŒF !O¹HúÑ ÎøG7&¬“ @7³«Ît}g a¸³ÐÆjS¨¨á%Äù¦Ä'›Á$y÷¦g*…=žÇÇÆºäÝ±Ž¶KÈøŽh"ƒP „ˆØ(‘.mÐ’ÐÌœô ƒ·øF¦¨Ç.Q~1««êG!³TN²^DµzÉõ;|Ш9¶`·2VÝïpÎ0ì‹ôä;¡X^¦ßf¤QͺJ,ãÌgPÕ»¹™Ù7MfíëoÖHÛ‹<Í7.¤œ•º³tìAwªË;3!͇¾~Ù<º‚wÕx£À`lÞ³[âÞc'¶ŽÑïi™èyßç¨MùØ¿lq ýô5¯Ì'Bgt“+¼½Ðož-¹Ô_´p|ð­n^N>vj¹Ö8ïcò›¡gÆØ¢ Œ-Ö´Ü&h^ceé` ÷>ùÚxÍ/8/ »:eþ4¨ù–xÀ¶;6xÁáØ¯fu$‰§2T‚ØÈpÌ<ÙûL¦VÈ9Yߺe1¨™Š³ýJ¬IvsÈ‚ÜxŒ`^iÅ3e7äü hˆ³Ôï jú†ýg'z¹HšÈËÖž*Eß`»ö׺ˆ6 pû{#Ö muòd¨+pai–ê@¥î&EVØÉ [ïîÞ¢‘[eÚÐõU`Wî盟ÆÈÙ^ÚÆ7ÇÞ“·Q´¤é&C,¢€ê€lQ¡ûÂR Ù Ì}2÷ÔG|À‡çPSMÆJ"1n´î­Ãlˆ}@@Ðìs½ÍP!+(²¸/²s.»ÅúþÒÃ{ºÂÉš·CC{²Ê×r÷ã½OÚ:&ÝÍ|á;¼u]‘¢~Ï %‹nTæÞƒ´ÔR_ƒÝ[Ïð‹#{&ä§úfcZI?ô2úòô `±X»ÿ@hÛE)!¼çÌõ›œgœù†Ì'{1•=Ä^4¯hý–Õø92oeÚÑÝä®Ã¹¨Úa¥kz¯­;4ve»P,ë1î‹”‘Š¥ïÎ×Ìœ;+òfÚ:ކ<¯ª&ç.ú,=XipÕ„=Xe·öVAú°S™@¶Î¥fÁxú3ä(î¨H~ˆ!Mù5­¥Ùf·<ä2õ¨ƒ>™ÙÜ;Â¥’Ü’G ÙƒøÁ„r® ѽ+oFKŽêÞ$¬âŸ×¹gzÿ¹Ýó‹AЃAgz9Õq—ê€ê›æÝí:q­õ‡OzãMR+÷3—€ºa®ÇÆ,}ˆÑ3ïÌ.˜IOÏùOLˆ"ñLV$2D˜}È׊Xa•¾¼ÊŒk œÕ+çJfJRoV¨ ”$”îѼ´1¬†Kâ(j 0ù(¨MHäúÁAÌË}!•ÜPíéWõHCC°†—óxÚ.Ù%±âç½*o¤×»zçòo©^ùÕF¯Òˆ,½ëx7ä›sL×iÕ3²‘ò±÷1»@Bò,èq3ƒiU4©4yg-e uiè…Çx8[~<+§Jt^^¯ÏMÒfÉÿf4#[ΦV'@ƒ‡m°WÇj ºŸÿИÁNÇOPnHÔ…æ ìçSý3qzÑŸá·™¥’?ÜyjbC¯sW>¾®·ÿ†žrùª‘îþ{øÖû«SrÉר{†ÂW®¬üæýà|Û¬3[eCb-Šc{Ìw;çfƒZä|ÿ`dãÓú”N¢´ÍC€½AŠ–&G}sJç½>î ôn†îk´ùZ þTD’wR^ˆÕ|ºa>Îó÷R¼Ü|Æbt‡D+DF±3¡8Þ=ïíÊýhIçRÓ0öe;Ñ–IÍ·/käíŒ/ÜFyéOâŒé$ã¦U› Íôù§R&:¢)+5ÖQ« × ¤l·È,q§¯©GÇØ‚UMI|²Á;àÁ ãªdSÓQQo3m_\ÀèÎRêwß©zìåg%ûõSÙrܤðT»ñ„–˪EukÝÙ{aÛS¼3drE×Ôìyæ¾ÀgÚ{üصô´õʲj!\öûñÁ…a#1,¸ÎµkÖö¥]Æj$An3æ&ý« Oöýôq•ê5#ìÕB¨è—·Ê‹ QÝ¢T½^:*oÛÓ"ëžvë±¾3$êD}ÍrèñZRáNy4ˆÈ«žšÈš†ÏÄ<y¹Ú9ÙôéX=GVIĶ£jñŒŸ¨ô´áËÞµµ ’@Ü«”•Xt9 åÆÂ(G¡Òs BÁȸÏRJô{À‰¹\êÌ9£Càb +Œm a7Ù7£9‘»Š^$w¾˜{ý»Rõ)?µKË˦œž—ÂÅÝ“—ÚlånQ³ s6Š­~h¿ß<ÖNCv‡ÃFî6®bATÓƒòø^þ=‚‚Ô|&QñTÂM7¹÷9‹Ø¾UOúÖrº?éHBI+j¾e?õz#£²zѵ€D½w¹•»æ}¥Ú—¿‰Qµ+ÎŒ÷ÚÚ.·:K RÞ ¸_p~fRÄÉ{,Ælùq§^iu1q*^¦cån4ŠÈ¹, ½gݳÂ/™ƒ—h=Ïiø9|eRØ=ð³v¯9Û9Äï)Àò5VCyãòVÿ[º @eqø²ŸÜëZº’NT*󤂹ucøÔ÷µ€O*´2Ìõô8?œ»˜~ê¡2Yß··,,“÷ÏP@®TbÊZÕç j1n<ó7æ „IJ±ó†+ðLW§—ËÍSåt©ÉõÏ6Cü/ý\üuF>-}}u@]¶Ëú…ÓÇ —ŠÌ&8¹„ÝXü¡ÆúÆ¡—ú¹@|(å&ƒþAhÆý¨oÎKjtÆ3-ï®Þá€l1NWc’jó >Zº@]ÀÈ*¾Õ‡daƒ«óĪav[Qw”ËÝw:¹BOÍi75ó3{ÆÓˆÑ¯,§ë_?zsþéĆ´õHXlFÛß@É/¯Èrx¯*t|Ç…ôiÐPŸb;÷¤•î2ãjJr*ºý™8ëÀ²‘÷úÉU®³Ãï¼eYvK¬q¢ªÑŒ8޳GЯs £HTì+Åï„NÅh EÈ«p[­·‰g.Q-MƒêªNã\kò׃B€ù´ å̶ÉÙK ’Q7Ó– :‰ãT+C,ÅJ\[Å_L¼&Ò¡üª#L+!‰È—ÆvŸfÛD—+Ú~¾Jj•{ñEÛË]¸³pá ¶˜µ,s=îïˆÙÎpPþ ìªj¼BEs’À–õº¦P*—›UC®¶6uwp¶f\ºâàcï‡'Á~nfYëü?êt‡p[Œ_\Nôäi'¦QÎ&Ó"H˜š³¤ÞL©Ÿ úúEªë·¨9'Ku[»Kû6‰‚Œî¹í>kaÚ ÷ŒÚñ½­¥e’[/Î=Ú¢÷œÏ¨ bäÓrgYÇVEJ0R­V½ÌÒBå!¯ªå]Ûj«¡t4Ëgw voÂÈò§7ø±àÇ™{ãídB“gN]NW|æI×G’™Cy´Á±o{ˆ–¾J¨sRG †ZÞlö4èþK>Fœ¾æ€l2‹Þ|žÓ JŽü4¥r3¥ÞY…|ì¶„ô•‡O¶kÏw0Ĭ¹Ö•²ŽÊߟÆ×ÎÊ­m~À]–ޱ±JlAûãÿj$VDbRt)?Ww|Ü”vô†YŠòHIV’cïòÞMŽLÞ±ø½ã>'4åÞÍ rvX©ôÚÀµ€Q³n{ÿõ3jÚâ9AÁœx¹¾0Æ ^iúÜýJü`cÅ‹¤2ª ÔgǽKžÞVó–Y3!w·ogò9 µë÷¥}ööŒ›DQ…¶ç¾Ž-Ö{º5Nµ@Úê²¹Ðe¿àÕ¡é¤*ÛT^h•`…'´û]mþ¦ùèäk¦Ð,cùí«…aÄégÝä•©€÷ ЧÞM&†. Dqø7’ºþæoÛBƒ}[ÌïŽç™¾êæ^ÇÍl¸ùx¼zÜ©‡åÍü‘¥"PI¯dJ °‘ƺŒÏñgfoˆ°rד¨•m¥3^9œýZÍt‰HQ?—»<óÆ¡Š“{æ5¤2­qKˆ‹$I¡½å_a·´+|SöêŽÁzR*÷¦ŠŒtseWÃñü¤æÊ‘†Žõiýü‰b­c¨zâ[=£ÞHhÐøÏæhÐÙ%ñ÷Ê­••ò£Ö*édgÑq#¶)ÛtY®îeÜBV³méz0ælíµ$P ëùâQ8åà…uLÚö5ºëÔ¶wýÎÙeµgÏåUVµ™33¹jøv"òÑ–B䢽&P­›Ÿî™<)u"©ã%´ÍCŸ(R”%šHôôv#ãxQ˜+,GWU ÷]]Ší|;ƒÒ†ñшœ„!ïáÐ úàÉz?¶—kÚëµMƒn¿`ZŒÎIF©JµzögçŒÐ«Bi(s;K;e5÷Ö#еzm¿¿I2ç1ôÚšKX#êò"˜r*¹MÖ¬¢Á¸‘; ê#„Öùw4Ñk^Y mÜ ,”r'¦ïésòÖž­=S“–¹wžû.ä§§ïö‹†yòqjÚ]cAtÛi{Å–b—ÝFKo~íɲk)§+n”ñÇ|NT¹«¬'¢mY?»½*¯zû‡!bô ùÖÆ¢ËíÙÜÝ£¼c_- žó] KbfR:¿;I£&ò*2<)[V™§ß’_~O(ý4·®þ®—º#‘„ !ØcMSwÑ;Š C‚^DP—Õ·²¡ív®¬­S !I<ö*í„K?ü驌ÝQrVnÓ%ÀR.C8›´ìÕLbõé‡qTâFhWh5G„ËÞò[…%²º¢´(ˆn@øë”t·û«a¾'i»vŸØÒ)®`uÂ$Fª@©ýá¾Ãc­úl<óîïV¨Ô’±ä)ú¹„ù²^Õ…ÍÝ$QSW?Ù¬vËž'Rò¥VŒêK®„*ú 2<±¤Xô¶¦¼#ëeÝñ„äelûü1}²0g¥©% ùùàÏ+*$/câY,ïz«$M¶]v3+²¹`9Oñõä¡Ö´] ,ë„C ¾Ì+~­lcÔ-á>E®Uo…W_é?=$% !lOA îÇbG˜(¼(’wöøéyÅë·4†m dvÀý€¦ ãK5Ó.ïESíÍ1Ç)«‚ì]ÌPâ+îÞ†£2½l‹^²»üYáÄ?Õ‡éü*ï5}ÃAÓÇw+†ùyà„?ÜL'æ¹Ku2R–Ì£ž]:CÉ VQ¶qÕŒýT­~´?™/6âdáÒmôŽÉ¿§\Dnw´ÔXÃG®èy];pð ÈRŸEž¯*¶Ìêj†“!9;Ôí·a²2O÷ÿ+Í£‚õDÞÀà¼ò.§`1éaEš/%T‡Š8x·Ö˜˜:÷οšš0ëœYç˜)T|¼°Lï~û@®RtÕ|dÛ†l#/×` ±ø ÿ‡aq·ÓFzÚ\“_K°_¯g¯î~Õè¤uÒPÔ‘Çò”Û9æÜn…—^ÖÍ|:š¢é¹6lUÖ¾ÅȘ6{”ö‚G“ž°ó²Çª1m§ò—tN×Q?Ä!Eƒú g^ÔØ—Q©>L<éçê¤{ô‘´§¸àð¡N“€<¨v–ÿýÒ”‘­ò‚Gâî0ãŒúb»B  [Ý07Z‰56Ó· eý." ïÅá•àõ™úÇãCóFƼÒG mu:›o š›È]\‘YÐ÷Á¸T/©Y ß6qªvMKÛÏ cbÏÏÏ0îaÆ¥­NÄÐSÛ:‰\Rf÷"»ZÒãKŽÏ êtìå¢#µ/g^U8~oùÍHOJâI>ý_ŽÄëEód&òs<Ëã†vœ#'SÈ膀´5¹H±«K]½þ»v¦ÌXÎHIœò¤'ÀµŸj«gÄÒŸÑï:‡G'2E¥0}Ê1tžìÌ;ðh#o Â~峊½Æ»5¸_ŽË+w: š<´ä*êæ k?_ÿé.PÕÈÚ6û®0ìF×Páf¯k’©—ðžqöó+ûœ:v8&R;#ÜX­ R*î½Ñ+„𠸧ï]Ý÷'Qו™ e™\oáuF«Ã<.ëùølrNñ[D/åð§ñå6Ñ X¦Kœ”aªQ¹®_]ÞÈ’pëq@@äu£†U†¬¤²kˆØ#Œ$™Õ„`§X÷¼ø©cKptzy錔–åø AIBûζt36â ¸|²Eé[ý³ðîÏ>¡vî圱ý5GD-?\TÊu¶¼ Z$™É"ŸÝqr›Úç,ú8jLÄË­„ò®Å…K;J´2pœrÝ·»‡©¸\s~­¥ØË© a~ÅѲ$:©cNLJ”‘–à j³ux™L>¦µ Í‹³âŸyíÍÏ->”‘j©èÅynþ¤À¤c>áyR†ìX PHiød”{ëäG‹ %ŸÅºø¬ÍíQxz õqKʽø®ý¥w‡–ûÇŸÖ;V>|³F‘‘àúÙz`G¤®ÿaž¯…¸¸\³èx®¨æ•Âm‰è®ñËI6.ðrûÂø‘vèõ …kzÃ7ÙŒãÝ(IÉùþÚ(›^ endstream endobj 1007 0 obj << /Length1 1397 /Length2 5932 /Length3 0 /Length 6894 /Filter /FlateDecode >> stream xÚtT”ïö.)ˆ"]2ÄÐ1Cwƒt§ä0 0Ä 14ˆ Ý‚"HwJH‡4"­„„”¤Hóãœóÿ{׺wÍZß|{ïgïwïw?ÏdÔÑ瑳EÚÀ”‘˜$PÐÔT€@¼ ?hG9Ãþº €F0w8!þ¿ î0 íS„ Ð8M$ æé ÀÂâ`qÀ‰ý ˆt(B¼à¶M^€ó * ]}Ýáö(ô1ÿz°C9`11îßé9˜; A4!(˜ úD(Ä „Âa(ß”`—t@¡\Åùø¼½½y!.¼Hw{in€7åЃyÀܽ`¶€_´ .°?“ñp?~}¤Êâ Îp( áÎðDØÂÜèÃúªmWâXã€ð÷n`^ð¿ËýÍþUŽø B‘.®„/a°ƒ;ÃÚʼ(7‚°ý„8{ Ñù/ÜbƒüîP–Ó@ÐþÏêwEyðzÀÈ÷« ú–•¶ HåAð«?E¸; оv_¾?›uB ½þ ;8ÂÖî×¶ž®|†¸›'LUñ/í"øÏ†DEDù07ÌêÀ÷«¼¯+ìwüËž Ðßé °C „ÛÁÐþ/åî ôÿßZ`0ÀEl`öpÁª£Ý0»?6zùîp€Í=0ôë÷ï7 4½l‘gßÿÀï—ÏHWÁ@ߘëÏÄÿŽÉË#}þ<`¿‹€"è—ÀVÑÀÿvúOª* ƒþt‹¾¦uìõ—ìÅÁøg1-$šµ0ûHnAÑðÿ7Õ§üßþ«Êÿ‹äÿݲ§³óï0ûïøÿ†¸À}ÿФõD¡ ‰DËñßPcØÑjÂláž.ÿUEAÐBCØ£ÉÌä þñÃ=”á>0[8 êð‡2ü†¿¤æ GÀtð_ßtô_1´¾ Nè—B´ØP¿×øË†¡åôÏ>”P¤í/Ýñ  îî_ôêÑ–ÀŒ¨-Ìç7³|¼$ @ϰCºüZ³ €…ôv@"þ,'øÇPOwwt¿©nà_öo¡Ã`>0(Áì*êXÚrZ%Gëͳ6*‰»—vjÂÏ3šg‰êUš°ZNÒÏÊœS/Qží+[:¶kÉ»¾ú2}ä¿ZËPç+xÂàüÍžÁ&qêæs2Ùÿ'Óq#FŽqŠüñB÷^ ú˜{·elí{õÄl5Ý3ÉÞ¬dEÊ"ja-ZmUE™tbF;+z¨&›~ƒ5¡c*¶ì—„§_cÍ£Rµ^2©K¶$yWÞ[êì_ é¡ïŒ Vó YÛg G‘(IôÓ) âU-ä]fzm¿¼ïoóT^…Ãl‚#¹(q-£×x'(¢rÐe=nÝóD×Çí’ËL¹Ï¡uôÂÄ®™ÖºÃï×¾×V/¨3Ü RaßjI¨Ø—}õ`'ïP¥DWéÜSJ0\¡“Ò?G€Å_Þžfð3äg,›¬$Xn¢ïÃÌß!^ØcÝ5a´}nVò8¦Û>ùsÕÄY~tªýö£k[J™º@Nª(ùK§Eý@é'ã CаažH¹\MÍ™æ<Ñ[VqdM|bb:¸Yz wœìÞTóÛZ„Ý.»Z,W2쥽ê±§|l÷™!k›óÜñ'YùÙ3Â×Q­›ÙžyÈ~cÇ™hªòö[q}d›ÿf±t‡ÇäLQ^¶Xí—Ÿc©ºlÏ]y–±wÆŠë£ØÊï¯a»½2 ¿=©ñCþ0¬ /~`ìL¾×*Áý>OC²GÇ @1)Eý 2|äìH Ð[ü­ÓD„AG/Oœícé¹äbWT’TJ;‘²ÍÑr™`6~†VŸ¿ê`dF1ø]Ïü® ¥il…êB W5Yá"€,£«ÇŠ,k ²-+1OZ¿è¯ØèáÀ|“Køš{ûî-»V­ÜÃö¼7CbøëØ—6Æ~L—ŽÄ*ûEYêâ½%§aź^ó¢;½ä³JæÇò¿ ˜{R¼;ô¹!*œ„—­Û: )1Bøt·ýÆœCò`ù~t@‰À¡"ޏàŠÑEU·7˼[–N¶´¡ks3+¢0¨TTjO§ðÝßý3½îÔêGùnè¹}Ú„Ô«¤jÙ¯æ÷ãí-7£tJ‚GŨÖù_Îa.2Ê}œ;©ƒ©¦`ˆbz 9Ð qZk-Ò\$J>póŸY}öä°0>x—/%’î>9Nb(Ù õ‹«mÑßÁ­¦¹÷†9×·¹2ú^̉—·†åš‘É`\’d ¸HH.jòÍMÙCžíì"2 ÒŽ†ë˜nÊjˆ9Ór&t[6ã.‹'½ë_æ0š¢b$jñf”uÈ„Uj4ñâ\>2¹Óõ²u»ÞQ0+ìÏ|elÁ”k“ ŽÎ„j]F«^ñy¾¿¢[ĸ&ªmÊ`:yÛÒœi6’|­QxŠ]g:2ÐÁØN¬ÁÛF¤´ ³ÊUxÕï=Rešcrug!jYíŒ`6¾ì¦ˆØ¾:žî­È5â$¥É´äy¤â`‘xv©Ùm;ÆZåm‡|ºZÿ¨ÖÊ'ý­vnýÇÓ‡H£äe |ZÔÏú™d_xK8©þeß¾?»ã¯ºžiìöKrfÏðï/šº¾>/HEè~šzÙ£{ë³Ýþi#û?4çž1m+¿V×…FŠ€ÿÊSS~÷­aWeýŽJ»Â»X?s'Ù‰ +‹„lÃ$ø›Yè(©ºH°ÈÝ(È-?Zc|Â5ªó±âYÁYLu5ïË¿‰‹?û°o'ÜÿÉ©‡ø£RuœñòÜ6Va3xÔgçq†H?À6é{ãE"S•Ÿ/[~ö£y›j_PË;žªeY%Èãó\[=€—¦KM%8’.Ìëø3LŽSrµŸ#ílÿõzÖ»ª`/2l2 \HÁ˜–#765$?øü0rdZ8Ý+ð˜¬@_>Rš«·hbøÈ­ xðø«dy¹Ïˆ õ ²{4ǹ²ý…ތ֭é,JêoõÝ*W\@ž‚äðÔw'FYîD1Å9Æœ¶8ˆbTæ§òåu*EÇ0ð=vFë¶û5Õ|‘‚°º<ñ—¤X³¹ÿE%K¼š~zq¢–Cîòe%á{ÛÙ¾—X©'ý& ÜQ|,¤ ûNT­wÇÄ”…F{€´rkK!_"ÚƒD ›–&ª]‰Öds–K#P7w¸&ã ã£J·}µ$|ÇM™6ÊÊœ†`¬oý‘?dà¦Ú¦ÀÂY-J$rå~Ê0ÔDÓ@!Lf”'Û¨yé’ܦßÒ¨ÃÖØ áå1{4jô:Ú)Ú¯ääYï·ŒmÜn¸„ˆ|>cùRÌzHË‘-jóbÙ¼mŒ’g´Õ$ïnUWŸÆÎa¬Ó›:3ϽÇs"¶M‘!AVŒÙ§K@ìÝ©t¬”\¶ÃžpAÑp§MKÐíˇèH <ž”}!‰P}”nHŠýéTfçá‚-¥ö{ͤ{Ä“šó:Ë8Òh±ÓFXˆæG$óõRBùý®ÕÉÃ-®Ruñ’õP,ÐKCCJìÖ¾0:Þ¦¤è€y9ËfE¦¢öÙPG¨ dÑô}"hSgL=o"¬w‡UA:dÕ0xUU<¿ÚBBßÕ µÛã 5«_Ž'ÞhŒ+Ù=)M,ŽŽÚ0ØäOˆOî…Ï­e’‚kŸ ïUœŠ ëU}”ÉÜùäåæy‡,@®aºÉ¯¹Ok]±ŠLˆœÖ’¬èâdDµ)ëáë—s°*ü§Ö)•ÓicTYïá7Ñ!âùôÇ­ó~ÂØÑBíÏ×c‹ñGJ>4Ha9fOë÷ï‹ï¾KþQs”jÍšQ q§µÍVÑÁŸ|ë}Z`ôóJ÷ëAˆ³îÀÝã~•Ù2¿(i ʱ9’RŠYyâ!ýz4¹ó¤è1”.fuôhg†ùMz̹kµ;µ½@¨ã­ÔlÁd’í)Ys+=É´O_ñŒ› ®‚¦”cÃÚ0ædnåšñ3¼äâѹÃpñcsGc^LyýÁ{ì;£Ïñ?óÚß L‚Ú«8j?páÙóà ÍR ÍVsF¹,²'%Þj3íyfh91 MÀÕ‘¯ö@Ù6™j ØV]J?¼!.ÕÿÍ^I3f£ÚóF7ÉÕ(˜Â•UÄLÌmžD©úýê²Þ('A“ßÒ“pèdÇ`(¿\~rPm7Ë·¢œà^r†ÿœXÏÈëò™åñÎ~Åm̓သbžç®3>w¯ö°K‰ã²ð‚dØð6bìÛýf(œkŠ’#N÷·¸_¯ÑŽÖ27¼l’{« \žžbêò*ÌòÎŽl,/iÁŒÇTsâž4­£ÝÌ´Éë‰ ÷^UyR5o~Ò¥ˆŸðUHh©0ö˜¥øJØ]µÂU¬j@K¢<òDm· 6tDü-Ž•§ÆbôzÌ HYs»gb7ÅË™ù„Mø ãNL­èir ¡Êb›\ÈŒHÆ‹*øt$‰ÌÎghxu-’Ï—ÚÎbŸ`KúÓÍrÍ:é0ø¼¦ ƒdý1[mV ¶õ‘À5Nçæá$ûú*¸tjžáqצߤž£œ÷©gD”¥5Xå–³‡;NT’ÇróË‹§dÏôµ3?h“çnÉ>+o©G»êKBïÞUî-ÆKé~Êm©¬ü$P÷ôƒ,ý  ñâ¸íùWE,'jî`Ð~ygF½*dJ'§”:ú¬’ŽîY¸«Îg]÷z….xYzÿŒ“…›ücÖü§d‘W¯ž›7蛲5 ½ßºè›SÈöËJ€Iî±7}&ïÀ¥ópÊÍû†<À«c =‘!ó O]Qª^¯Ü¬³{%éÕI£š4ëS”|ÈÁm*}èËéècêƒABŠÁk.І)-“›êA`M§÷û3ø:'ø@>g’Ô6ncÚ5´õ‚2(yÙகCÇ¢C5æAœÓajD{ËÂ3ú· õÕ΀ã%‡Õ‰ Ôº—VŸºs7a¯ÊË4é$Æ:8#pRKV!Ä?cÒ'ê~9´i!¼æT¢ÄJÁ~aâz÷Ù|Ÿí-kã¯uϬ7qÌ'bØÞ_oí¶2®(×}O·«•oœ²› ëY(dçÀ¨­LgÒ[ÚŒËRõºq%Yê4Ë}Xõd(é \ ÕÈŽƒëøtN…S-Âd­77i•]"èm~ˆqL—Y€¿í¯¹(Ê ÈY£Ç}º ä)½® Ñ›ú2d5–«ã׫;ì´¶ˆãvkR“Ã% h³Ü ØúIXc‡U‚a¶XÝÎ-¹ï£õBÎHQÇ¡[/W•@b0+: Ù|9ŠOX"O¥4Õ¶f­ÀÕ‹¿—Áï¥uÿ½³ò— C¶ÆU߀õA%Œ7'¤³´—ôÕ¦ÊÈ×Ö]®Ñ„Q/€-Çk~óŠ„m˜yËÒv–ž?Âê0÷¯iÞVäqÕŒo û˜þAî¦_—ÕðnÞj?Å-¾»MŸ$|ó^¼¹ê‡Ñø)k¤ùŸoÄjìÙWhÍe½Ë§¼@àR‘ã´ªS0oµ•žOYµ‹“F=´¬æÀ]Ñ'¹/Úß2øˆ¹¸NΣzK’¦Â|Š2†zÝü kÒ\оWóÉ5V=Uw+z… °þ&¨ïŠFP,Ž¥õS¹ ¾âÈÔ׃}pCâÀL"¥(­©jür’d×[iéàlé“ÑEï‡~µ (¢‘Ÿ½Gxç«Ú< \pVç[¨pTËLÍèuØmZªŠIîÈÀõƒÉ¥s³±U_ú¾ì¹b®ö$\7úÕàÍž«…ñéVTyÔkTFrbA Ó=>T(ŸfprùÔý!ïws?Î`ô"\¶8tÆ sذ õEÊÌB­FsÏ ,æ[>9Hñ䆰_ZõY–Ä2ˆ[ûÈÜÈ·^àMã±æ4cÞZ[8>™¼¾=+¦ÒãfÈxƳ‰N…׫+;ŠkÈo)|?¤#¢:'j{ °ÎÛ¼åˆi$ð5筩˳'sS´†õBƒ6f¡\‰ô1Lœ€~DÎéFkPr÷m±ÖÅ>U³TÛí4–):D”¶•Cun+I6©ìul> »T‘™  [CÛ£žƒk +¾g³…Û2sLžÉM»ao[ó$dcë•£ŸfÖ³£S¢˜l„ÙµâomXá'´Ë4@N P)ÙnÞµ ˜¢!£$¤ÝI”W"¯óÃ÷Æè;t3¾˜JW`ÿFsÑë›ùÛœžLTšÃgÂiÜ«—´Qd½_òu¥íŽõH Ðt~רØí-œ#ª#ôÇ÷ bèÅ*tLÀ`ï\/.M¦|ËÜÜõ†ðR?³FÖúk…àpœPÃö=íIß~£HH–g[¡<·a åL `”íçœçÍr§óKâUú‡ú¹w¼Ø°¢ egíwÀ|â=Æ•\¶—[øÞW>0/úÎÊH$¹ŒbƹÅ||ðSgߵ܆G%Ù*6Øçp¨®íšL4$rŸ›9ÃüðaÅð Xˆ bmAŠ™‡h£"¤›ƒöaîf#¡9¬øôÍÏI«y?šHhƒÇJBÄ‹—×LYãÕäk'¤É×%:¡¼ŽOêÖ‚ý¿_ª¾œÄ»2Ó%C¥á:óÚ8¦)$–®5°Š¼²[ò>u²¾Ü‚£Ìœœ-:¦ü·KV²Ò+úŸŒžø®ØÏH—Ÿ²œš•§Ü7IöWo¢È÷eÔ+¼®ÕCþ×¹ÓÍŽ_2Ó¯7É#˜þ ÛþXGö½%:TMð)‰û9šLV’X¼*Z†Êi3Éc‘==‘/@Zé\|ÎM÷¿êí”»µ™MÔìexXo{÷\î—è*ZPet?–}ÌþœéúÑÄ•a¹PçKu&Ì !Eƒë#xjš';c¸³2·ã¾de •®Â×–&âwŽ2Ÿ¼xç6Ô8{=¾ƒÈ¹—L@»ÕÖØ9”´mï±ÛqcÁ£&nnt 6ëOKy€ŽAÑ4Íý6ûd9Û÷î‘öeß#R¬ÑÛ‰Rðî,¶…Xà›‹܃ ;áü'“¥‰r¤åoò[FÏî>ÈÆAøÉh¤àéJ‡ß}ô4²C_ss¥òýôL´—®—É)Ý^Ac2àãÌSÑXòë„cÎdÌ™[¹xbÉòO4[M‚;‚¶&ÊçªúO¶JÔÍAÖÛEfõoIGæ²?Ðá×hU.~J…9®ð*~ºïYHx‡_[7tB}ìÕO³e.ª;CšYì2uîo&Õw?ÃßÛãÜ¥ «÷n·~OÛÞ½u]¬hÁÎlùº”j©$¾«éb¢/BׇaÈZAGºö¤0{G¸Þaõ´ËîibÔY+¬Ko­'̬ª›( ÄkRi¿)»ÿzã[‘“®Ê„©QËŽîy{,Ä`ÐFsM³±\-ЕÞ5¨ïÞ»m..º|Jø¦þj»¾ã¹¬ØTºùg{²#‘ùTµÈó=é)Ê—Ò´Xá/† Љi{3Õõ“ñ²~38n“üfΪcSÚ'SÅü~:uò[óœ Öºö¡Œû¿˜B|N²R\ëÇXtØî4XeÙ1ÑŒNüØWhº5^N K®‘º¬»£ŽÎݺ”2§vã¦_X?©5èV§ÕáÓ §UJHs×ÍÉðeòi1åç“/†¯H§ºç·gáÄ`Ô¶M4·L [~ûžVMT­£ ÇÀ¾O·ÍéÒ;°êð#Qââü¸øDfÿçSÊŽŠ/ùävâ8ô @ ¸­ìÁÊ¢G”6Ôöƒév ‘\Ç3Ã[Ù•7ä°/Jf%}P2þOsHoÉ~NSÒp«µ³RoÖ4Ûåe& _)WðÒ’¶£¨²½ý×aà!£A£ó½<ã.Eî¤ôÅÅ“2ÉRbon}ÿ¹ÊX4£Wµ\ÆÓÑØdý™NˆÕuÿµ…¹vù#ýVoͳ΄v×í³ìí«‚aXÉD Ìt;1ÓoœdÊ5³¯9Ÿ-äXìŒüð}§ÖÅæo¹ü?¯—\- endstream endobj 1009 0 obj << /Length1 1403 /Length2 6103 /Length3 0 /Length 7066 /Filter /FlateDecode >> stream xÚxTTíÚ6Ò ÝÍ€t-ÝÝ]’Ãà 2Cƒ¤”tI#H‡€„4JJ—”(HI‡€€ ò¾¾çœ÷üÿZß·f­=û¹ïë®ç¹®=³6;‹1¿¢Ü¬‡!ù…€Re]cK! …ñÙÙM H(øo;>»Ø äþ¡ìv@¢l*HPhyCB"!q)! )  Jþ „{IT| N]€Fà³+Ã=ý½ .®HT¿o\ n€¤¤ßïp€¢Ø r€t®`TE` AÀHÿ¤à’qE"=¥}}}<p/9n>€/é 0#À^>`'À¯‘zà?£ à³L\!ˆ¿Æpg¤¯ƒ€2@! 0 ñ†9½¨êcM€¾'öXç/àÏæ„„þ•îOô¯DØï`îáéó‡À\Î( ¯¦#€ôCò`N¿€Pïàã:8¢¿[w¨)Pþ™ò‚x"ô׌‚¿Ò ¶Yæ¤ ÷ðÃü_ý©@¼À Ô¾û þ9\wÜø÷Êsrþ5†“·§ ) òЬ©òƒ2áÿÛæFÄ€’ââbBðCØä*ø«€‰¿'ø·ó·5Cp 'ÜàŒ q£¾ð>`ÒËøŸŽ®ð…„NàvÀðÿe;ÿµF¿Ä` DÑOüõù× ŠaNpÔÿßðßG,¨§¤d®lÎûgä9•”à~€@~aI¿¤8 $$$ÿ3äOÿ« s†$ÿjµO·ìó‡\ øg.=8й`׿‰þ(¡.Bÿgºÿùÿ±üW–ÿ•èÿÝ‘š7úÛÏõàÿñ;x@ þ(æz#Q*Ð…£´ûo¨9ø/éê‚ ÞÿíÕD: Ô sA1š_HT(ú—‚Pƒø Hë_¬ùËnúKoP lG@~=aPQ@àùP"¹£ž"5»À( ý³®* wú%6a1q€ƒ——ƒ?>ê¬Q+1@ J•N`¿ßd ÀàHT5c0Àî…ÿë`E‚ÔÌ„;ê\9Û…€âAG¯ß†Ty{y¡ä÷›¨vþ^ÿÖ:ìá/ÍÃAÒ‘n/#;¯êé}ù·Æ±W׺c“-bÄ Ï]uprÔg*Ù;ÕÒŒ>5X¬Œšž¢ç9ºšð{ð&/l%S£‰¦:°¡tÂ_4üíì ˜É Nç2)ñ4vƒô8Å‘ØÞÓš3Í|þú±D¯Èö‹Ï%7݈m+É}€ ì‚„%“™ XнþÄ’…m 9bù€$‘ÌË:ËÛDÓtòý $ñR©3žö›ÿ†uböÈÇo󞊜k÷Õ‰×F‘ÓRh±Œ¦ÑR¦äi½B q(‰](Wf$³Ò–zDq¬`ØK¬ü˜-ìHñnvÑS»«ÿh¬Å».6/[лrÊ`·™kòM¦55Ö•¯þ)›{ÚÅHÖq´°“Š €Ýؽ|«; /¯¸´ÔAßó(BÄöóÍ•}BNаM†,ôþЧçJâP&ÏQgó÷×2r:vrM =·5ïÑ{|_Ÿ@ª-˜Ó`ç;­o;Gz£OàlGŒ”3aÉ]9ûý{)¯4Å.Þ‘šñ¨Š#´à=vÜII³!F…˜ÝêÒV ’‹S¬If"ÄE&¤ &:ÛhYzx–RCgIˆÈÝ*_¼¯{&Þ*›q?øhyê䎊áAIÃÆ]ÃÞoX¶ÉŽ^'‚¸¶Ú…ÝV®öåzœZHÑdHË~òõŽ’åL؉ÄüJ¡ÒOÓ;òŠG ~$~Ý>o>.´PlŒ±‚Ʀ÷Ì„lØ=cì²LdÈz=uÐ×Å™±í§Ñüýó„ÜqD]jˆ5²ZÝ’$Ö®üq2ÖÔzÐA§ó¼׫w̹åüõ¥´èf˜§íN³Þ±çª‡J*2bÎÅÇ’"µº¡’˜1f!*„_ï“:L5‡ ÏÃÐ\[ð7¡òÚ琢÷­Ùž´Æ‘6~W÷<¹ècøHÞÞÀ ¨5ºÄ( W»ÿÃÇ@äÃ'A }ñ·þŠðž†£GûÛ6æéUÂuÛ°c,EWËÏ¢ZI‹-“æÆŠ- TOtn„7ì„ÛîÖ¶UÂ52ñ…¨ýfh)†÷8{:½iƒ:à„WßÍõ˜rTÓO˳ےfÑÏp¤odA™Õn©„袹 ½`R+püRV;Ì %T¾²”•.÷ráF2ø8ÏÁ#x'iòt÷™ƒ/¡ò ž•Ö£ZÛ£šÏ6UQ›$ï å‘ÚUúÃ3‰,šwã_ξü±MóÕˆô§rÖ\:»gìKÖ·×½*$ÏX9ùì]ÓgyA_¿;ˆl©U@12ºÏîûaÖÐã”Ì S5Ì+zk×¥YÞ›­Lý$Tn¡ˆ0ƒ7>]öi/8H•ïmLg–NÏký Ç9¸Q^Ýý€µú[KFõ´Ñ!–‘rÆb)fž¡Š+>-Ѭ‚_ÁÕhq—;U‚£3t[QóÊÀ½ª1Ûw)‡¼ÌIsX#À t)á÷#™)n8ìÀxÄÔ@³Ñ9P{¢rA÷˜àhܲ®³èPðÀçMÒ¤uQÛE¦Vvý"…ýlˆ¨42™ÎD­ç£Ë!>)s|ƒlM¬®¦åºòçûòkiž<ó‘>D Ô²ËBˆà uâ4…½T1Û‘ŒX“­ÆûÎíQ:òèˆ6}îÈ& Äìçv¢Çx‘ê%ßSž“Ÿ9ïFOÙ’ª¸~8—Ù,ÌÎ^WÊÝ›þþzp©!ìÌ©|濲^o7ôbö…‚ ˆé~ZŒNâ!gíç;Ú1×¢îú²Ô‡?«æM© | àªOV¨?»£¿Ëæ!’À}ˆaýžûàòû«‰ÅÙðŽpÛ¶Wñ[g§6¤÷¡I›¯m‘‘o“××m¹sXL¶úCÏÐ×jŽ–¦רºŒY‹¤“v2®½mÑŒcñÅN³Å•dI—‹}`ËÙ&¸µÙI “¬§/+Ém±ÇùC‚c¦‡ g3yŸ0ä@ˆîÜT‚&‹L’îþ¤‰TÍ©þžÒt*à €47ÚC¡¼)©£H›š¹ŽêÊò¬ìáAॾ,; ™ãâ £¥F;lŸ_µIÝv½ãîJT½·¸SêÄYÓ·ÕCÏßÖBðVM~Àþ%18z©‡>~ñ5Çèã:«kºþb¢û“¯Ï—@£gÍ“pŠ%ôš¸\ÒwíÚÎÏZ ¸³¾â<,à]XYúg Œw”æÞÁ'·Ó‹¿±çWhÄ’™aßÐsžçM6L]T"+†Kˆä?6XPb’sEXF<î¿t×3o¶|}¨¶(³£ܘ¹ë޸܇³jtÈõ~nÒVx‘ˆ®x}sàÙ?A¼ òˆ€Ï¾=¨¥5Üj§¬,òÏ'JKzïÃLvÌû(¹¤©?]µ”øîåFªîàþ‚`í#Õ>rñ1Ƶ8'jÉ@¹i×Gïh›U]<˜ ì€ð§°À¦Y¨H‘:ùu|:oÐv=×f›ÙÜ—Õ8õЍD¸¶3½9EÀŠW¡Ý¡ìuÖ@Î*ÑÑ( ]@WM_FCÔ1m€à‡Æ–¥€>«È ¶X•;Lƒ¢üÄßÖ€ª‡ž-qtVÆß[χ֢kpcß®Ñ.¶*n¦·½éBB»&4nЬÑLÂüºÅŒ byšžÁ•IeÎeÝh¾îï£i˜®4„¸%p+’ ¬ S}Çál@ÆÅŸaMÕ}fò2²Ø€³íûƒA=¥rN·nþ&9 a}ÍfCŸŸ®Ñ>,sQ¡M9K9^|ÝžsG2«cË$Fy%D°ù¨=e + «ÎÈsøT2~ÐkrNóIÜ­ÎôPû‚ÜÏ­¨]{üŠ×Q¨~þå‚>Í\¨ŠÎ±¡†HØe‹? ~ÞyÚÅ)3eÙµŠ æ?¼"Š/”‹çQ»÷Ô)úK <13ÐF¹JŽí'†^€ ËT Ïsx;Ú,–[Ü;~½a‡ã¥ãµðÓûIÚ¾†.<óx„lɉÂæãbò'z÷tÌb¿½½¾ò ¤€:LÚ°S°–Ù'wTÚ½0|a¡Ûô|}1È4‚ƒƒHEó°ˆHÂ`˜Áýå3C±IÑ!ZÙ…“va±{uõXœÛÇêb\z0€ºJýãóÃØWIû•憻쑳4Z/Û-JèŠ{EšþÀþî瘳÷b¬Óî•0F¨ÜS}žêéY§ÆS]ñµa%ËçØKÖi&»[B:ƒá,ÁSG`!õµ{[n¨3GŠg|E‡Ñ}<²O2•Ã!ÕMš—1²Ç=õ^1Õ¥¯^›g/ÌB»}Ù¬…3`ÉêlL‘ñ=7ìèbònãœIg:i_vò²ÎÄ*‘Öþñé®­ ¤âƺìD !“ÿ¡U¸—å ÅŠiô÷ \´Ì{ØßÄÌ"÷§Mãö„_^ÏÉÞÆç þÏôŠéôaï r$¿”3%on¥ñà3òºx*†òÕó½‘ r«#U—Èý:GzœY×üt‘$D`WP­‚ž~¸mXœ‰4Ê[kC`eð¸ÒÑö„>oÎ{xžiEÛêÖ3ÃníNögBDÊ× )w{”˜ÌαHª·S%»Éâ?±‘TïäúbÕÙ‹‰\–ª¹Ìö4Šæ+eïlæ(VT“­u=|9y2J̼úzeZ´'Ž)º$yêHè…3Í;¼š3¾yãBñóN,†g^%åÖ)ßøØ"èlnø‘@}Þâw©Îv[HYº7)\Ô6qw,ýUõ‡ÉnµñìtP}CNJ¸,Mígê;Ì<£]U؂۾Øý±F÷Û¹––žä‚Z»úô84=ž||.gÁòÖ#üeDaJEd~Ë:c¦¬±s•ÿ;õ\ –ŒÿUžž7¡C:Î^iE×€@Ùà1:R¯©´?*ü’¤Õ]QÓ&š›Z÷Š8¤Å¸øó­e欙.<;;iŽ£‚Ç6‘q(…ó¤€F¼NsÍñj8Hfub äée7Ó4Ýa=ÙíÞRo:ˆ¨6´E¦è‘?§ÇB&Ût7LÒ“Å®½Ü°óý×MÎ2½\õ¦ã5¬,9"ôŠñ×n6Md°3 9­¢ù%•ÃPY½«Çwºa„Œ ©-¹äX—îóì<éw¯ð¹‚¯Ç]¡}„žÅjlô&©ø®·]Ù”„tÑ'Sî;= TM¥)í{â¶D»–M*ÀFi¶¶íJ‡Ì»pgswg³ݯ£Ä<9·}¯#éPÆ4ÏT8=û!’ñÔ“jX÷,Íðsv,¦ãZ¥ çÙæ³g &i»Õ¦ïcÚýœS$Mí퓾ù-öÐN ä–™ë)Àó8ݰ†HŒMR5íç=ÿÂÉCuóÐ"Ôäì)C?ï~*ˆ+_)ìAË]0:é|ÞVw˜±¶^|åk£Îžý}`=I9K§!Sž ±ê×vî¼­TÍ[3çõäXuõØ9ýÞE_›!Áð9Ûw¶—²tŸÂòä÷œD@Ü$6"Ut™D{s shì<ºÁ }tÙ»¥ÒÊNÏײ°†½<»hë…(Ün ÕHéHzb@ŒÈŒCuÎËuå™ížÜ˜µÜØ?óì˜sH‹¹æ¸Ú¾ç–6ßÕÕmÇonŒ$|8èÃÑR7r©¼º%¢‡Ö¢c…hô51ðL¡Bt¶OÖ_<áåϯ­,2}ò´Aí«é•k‡öDTouçŒe7X‚\XÍ•q q¢§ÏÑi’vqÇ‘|CÆe©ÉŸµñõHÚ~Žrû³â®†TÓ‹gk–ŒŽBiÍëC­¾CF¶–Ó9´D|øÏØÔ*Þej¨,šÑÉ{žâøO?m£0XaW“íïTŠÆ¾Xº(R×^4pm|¤×dÝŠ©9b·ªŒ{bB°2㌷'3›™vÇ^õ«¬*4¯ÅÙy³ö‘Í>Ø›8ç}ȃŠPÒu=awçb‡3¸·–„H~É^Ó©ÏÚ^Ïyˆö²y`žî슈üBRB¥î©Í7)sZi RæäÇ$YXëÒX‘JÌ©x±åäIkšÒò…,&%1»¯T¦6›/"Re§-â~Þ½Ikzꪋ”ó—­‹âÙsTÆè~dKØ… Wôj(‚r¶\ ”e\ŸÝyp~¹X8Ì †¾QdÆ!D£_x«Hk»ˆ¾?›N`’~åÍͺÛ(ýýƒqFf¯O×èÉõWåGò=Z‚©j¬â¦õ@¹mlôsÞÚ†³‘@ZÖ‘ÙêiÙý°/ˆÝ•Ã?¸–ÍÚB˘ﵸþGà'¡ÈýÑ1Ò“b³õÑÊFÞÒÒW5µ¯¯%âMá9/æ+ý··FúÓpL ã•Ůս\ÖM±ûIÄÆØ’¢ŸÆsÕ'5÷Äá>Êø¨^µ¹x¿àéaQ¶®ÏÖ*—5²»©XU`‹öŠHìÔ(«íÖô7—‡?% Ϊƒ\Òž¬²?GœA ¹îêˆÃ9åÑý°8<ýo_öíÉFpË=S³[W+4Å©•3µo”1}ëó=(pª?Œ¿c{aøƒiZYç¼ø,¥•Ê/ËïSwãcµÖ•\,ÂG¬‘›ªirãQA-Òö˜Ä>?د˜ß×™X‚æ±mŽÃÁèq¬êOMéÜV«±#ýãN>~sRÞN†)TÞVþv/MœXÓªž;òn¿Ñ²Y„Öù}â÷=Ý·x©LÒ£¢Í¤Cû&Ú9—ËEÁׯ¹Ì,{´×z/äÑ~¼Ú·]&[bEŸ¼¡uý\Ÿ™:†á;>øß·LZW¾—>R8޻Ƚcà?™:dž ªYvŸ{êd¤x`Ï5ðX!0YËß\®ç$fSî{Jݶ¿ÂçÛ6ӵ︿_)ôiH3Odü•%*¡,~Ií'X •ÑïŽ3pùŠ0—»¼7÷ õŽ£fÍ ¹äô> ¢d‘[ùlJ îë|n;÷"†{.›?ð•~R[½þüwa£ŠÞ&b¿·;û¸Ì1†¸ç¾J.S)ë7Æ7¹¬ UÐ\Ç“‹é¶†,Mÿ¹ª XoF÷b=½*Üu ^)`+ô‚9^?ÉÈ‚öÄ"/?÷³3†rïz ]­,½®b¥nöÆÏR§Š]ñö/Õ#Ê­N9ép)ÚÊ¿f}ÚvŒ1|Iw~Ro %+t¸$ÓÒàøÐ¢‘¬„®?b ×x GQ¹}½qI¥º‡Ã·6ž!•Õ¥†“sSð‡i†Ì>•HÍЙ. O·Ê Å,¼Mc%î14o¡óu:E”G?àG»¨õÌ ”^mÉq½úaqq’<é`Ov_‚,Ý’&»éâêíÉŸ¢lDsU-.C0Oþz,.{ÐÆ!ФdzýÒ¤½0-™|;Þ"/kÂ4C÷‰uÇcÀTãrç™WÕ©ÓG=?dÿ&—+ŸÊJ~.E¯]EïŽþ¸ÿòµ,{ÞÝ%sy8¦“thõ †Ž´·ÕŠùš}öî¤ Wç0_¿\Ú£ˆN±žþ„²YþwÓPrŒzÿüŸYß ®ŒÉ°h­¾í¦.gˆUÒ0Ù—e©fnb¶æ^­‚ ø'[°Î”Íõ믋fÐ]ÝÄí·Ð² ÞttKN‡\çqÜìŒ{HÌzÝŠ –]€¸E£ß7MêÕ=šïÅa]»´N«_­ìuñ"ycRvãy"U<’ “VýÂêfY 7™&óý˜ù5úõêQ!«9Œ¢…ͪú¶] Î]º­A­—¶×[ªÌ ¹\RÚ[³:9^öÝëÍfܽí!É&rQÙ8¾çþ²kº/ýÓ~•òR@¾¡ß™©çŽV¼Þ"pŠ9'ò;sΡ˜^W‹ œSz&·›[Øà2¿A9Àcç¹>f;Å#:’÷c¹rr7ÚÄ%äŽU ^G—ÌÝÛV‚ë)ÂÁÞìù4ÙI^ÜWØ:‹ÓóGv³½U*(gÝÈ}U\â ßÍ*BZVWüè“·U3âгm¤­¹ßþ”ÙŒÕq@!ÇDEr5€WJ ÏTuZùrGú¼Ì•” ñšzؼÀ5 •,µZ!áBê»[ endstream endobj 1011 0 obj << /Length1 1399 /Length2 6072 /Length3 0 /Length 7039 /Filter /FlateDecode >> stream xÚtT”ïö.Ý(¤ƒÂ04Hw·t8  1ÃÐÝHIH—Hª4"Ý ¢Ò%Ý‚„ÿ1Î9ÿß¹w­{׬õÍ÷>ûÙûÝû}ŸçccÑÑ瑵AXC•pˆ—O ¯©o"àãàåãã'bc3€¡œ a"6C(Ò †€‹ÿ/‚< F¡10 ÍÓDÀjîN$,çãðóñ‰ý‹ˆ@ŠÀ0€&/@ ‡º±É#\¼‘0;{z›½8 œ˜˜ÈÃßéYg(Ú`”=Ô½#ìÐG@`P”÷?JpHØ£P.â@ §§'/ØÙ´“â|ð„¡ìzP7(Òjø50@ ì ý3/ÀÀæö×GØ¢<ÁH( 8Á P¸:ÃnEЛôU5Ú.Pø²ÆÂCÀß³€xAÿ.÷7ûW!üw2A8»€áÞ0¸Àæh+ið¢¼P`¸Í/"ØÉ Î{€aN`k4áwç`€’¬.Œðïxn$ÌåÆësú5"ðWô)+ÂmäÎÎP8ÊèW 0$‚>voàŸ›u„#<á¾¶0¸í¯!lÜ]€á0Ww¨ªÂ_ "úfE„øÄ„…EPWÔ büUÞÀÛú;ú£'ð÷uA¸lÑC@ýa¶Pô‘¯Ø @!Ý¡þ¾ÿ;ðϰAPk¨ NôŸêhjûg¾|$Ì `ƇÖÀ÷ë÷ï7 ´¼lp'ïÿÐß/ÐTÞXÝD™ûÏÄÿŽÉÉ!¼¾< !˜âG?DDùþÿ,£†ýmƒï?¹ªp[@ìO·ècúWÇÀñל€ÖÒB U püGäæ|B|ôôÿ-õß)ÿ7…ÿªòÿù7¤äîäô;Ìñ;þ„ÁÎ0'ï¿´hÝQhh"Ð6€ÿ7ÕúÇ´šP˜»óGUQ`´dávh1ó€yùÿà07%˜ÔF†‚Øÿ‘Ìüñ/«9ÁàP„ì×·ÅÇ÷_1´¿ Žèï‡Z—¿CP´}þ¹¯"‚°ùå3~!a‰{ñ¡åÄ/$ð¡ iõú­dŽ@¡Sèý¶$ѯkàÑYO'¨-êWè7 ñ€Ö`ˆ£›ØÍþ7ü]!îH$Ú}¿Åné_ëßV‡B½ ¢/ÓÈ£0‡š°æó*YOž¯#x‹Ë­OLz¢„PìŸ^øÚkàg*O¸Ê=±)¿3”¦óùUÄø´×þù¨—yGvðBªJ C±gUî'àâ[‡”ÙAo7&’öt•ü Q—éö3³ÉFÓ?ÃE:6*Ö ¯ZÝ6LÅv΀âïd,© ¨8ÙÜÖ¬ÖeÔ ‰9Y<Ò,ÝÝ@õñØV ,þL®9–îÂ{Õ,>cp~¾?»·'Màø¥zW¥py%•KîPRub¶Zƒ»œÐwùW) ÷芜#ذk¦@ŒŒ¬ñÝt|΀F‡!YXfRû¶ÚX]Sóø0?{¿ËOo¼l’#·š‘)Ú`,p¿¬œ²å]2˜ØºÞzôT¹îëâ§Ñ ° kN´~ß᡽Nù¼ã×C•[ZÚ—ÑK .M’°Q‹»ºB ã¦3ú³5$~ºÂóÐØÂößÖÍåéžQPÜ‘¿çtd¼þ)Sùhg3xZÎ @þŸqÇ( ·ò†â†Ù²¦Õ¥ŠæqÔP—ð+nå²õŒKu½âò¶À܃!KÄœàZÝÖèà ’Xå*ý%¾9ókKàÜ·ÇJ ô/5²@üˆGü ÷RQ"¼ë{rÖ­z±XÕ¾ __)bÖëSuóÖ‰ÑâR Îãð=ß3D)KÐ߯ßÊšMf~n*qðiñq]g~H£Š—RT?2S@ã³]éµ|MˆiÎóCKåm2Íà¸Dš\ž«(†l>ãçt) «n:åáõƒí*÷ôã¬éŽo ÊÄwµ‹“@V—Ýð·ž9äXÔ]}ù û;êÉÞ‘*9Ó!æÞx¼è%µæUâÓÛœ*µç§®à†tévìÎGŸïÆ';¼ÃªyYÎ"ú4ƒ¼³á‡RŠ@)ƒ%'2q•[WÞ,U5ˆÂ}sX1dì!9Ý”3ŒâJ‡4t3“õ­,ãÕµ^¿´¸Xž1æØËvÛúåE£çòùkH ‘,êH¨àëš«ó}mq5¼ù¤œÈnÈ©é‡ÑÀú™VA•fžCC3ºM°Hß‚-4Uc*n¶º‰ßÊËnaYªñÑoÁŠPD²Û Ê_ì~à|g*¤ç#a“Q~-d­®ÓöjÖvYV{.ñ‰¬¿ÏäIÇœð‹¹0/­¹ê¾Ü™áTˆ‡Ù†eÄQ8ïñ=¬‹kŽäëÂýŒ›¬éƒG™`rVË–Ó¿8 Á4¯¥ÓÅ’›!Œ×D%aä¯8ŠãÒŸƒe {zópaûÏ™¦t¶>>ÇÒÑêƒ ÄT_è.Y£L.êÕÀh×ãÁa²¶ç8±ë#Çû¼ß@¶GmgïÃHs’Ô¨äÈ'=¾{,}Eæ¯p Ì`$ ë7•4LKM)^y½*Ò (õõ3{‚v]úW‚´ÇuWŠßš¿ŽŠÀK.H¯UìžÜä¦ÄùVMIsiŠx™2NòÏÊ2õˆÕ!ÅU‡Ú‚y¤}[ß;ã&4~äº%Bàªì~÷ˆø'—œ#‘‡*BT@SXBÖÑir7÷âªE¼†§vG~ª„¿;Ñ#Ö˜ÃÞžG/7.>àIBdPÐm¿Gß‹ûê_QHDcÉa%Ózâ…¥ß*LÚv|‹í9K9hrí|ÑäÁ¡B!ÍÝD:é©•[õBo½"ðܸq8 èF®á{5ÛŠÀg–”CÆîޏP Ã@ YC²Ñ/ÑÎ9‹í¼ fþg«"W¤3Mq x\ "†…nyyMR€êUq±•þA ƒÙ´ß?+Ü~:°—÷}uÆp³Ü÷zg– |«»mx—eÚXLXñÄsÊv§3;ç~¼Z+Ùˆ¾' ‹ÀhÝî^ÙòÈ{Æ7K¹µ£8Ãcµái†Ûj©_]†Æ?.7í ›7ËRûØ¢«NG›Ë¥‘&Z¹^;Y@'ÃW•ÚOýãzfÖ߯¿J©ú‰ÁòWǃÊg©üé9YMŸâz#ËïGßfÎØò²îyj,Cøf ŽðÍš¤é]Ÿyü0†%T‡;²æôSTÁðq%ñÈ?_þ££¸çv;‡@êþz¦æ°±p¹â0 y¢Ê‰Á»„ûœ—Ñ tÀñ>‰¾:JOŒDÇ´TQ5v\6ЧI…ú€3Ò×ûáøZMæ¹[[õbéMIŒY“¥¯&6_„¤obLÆÌÓP–»åáˆÙ#\s’ Á÷W~€©`dŸúX®Sh±Ùˆ ®í÷¹˜¦Yø¯çß`èg|½WF饯y\¬Z±‰œ®ïaÒíb¿µV~ÚD\zº³Z,àÄ>(‡N?"ñx“#y çÏŒ2j“>4¦]NPÚc œ±¹»™U[¦Ä2&³x@ïï_íªHs{„!¥ÌÛº0l´Ä»ôqkUÿÞ+¬äÔ¡½nbì¢Éæ€ö©¿«¾JaJ5Fñø²n 4hxÎØœ4.¸Àn™¤œŸC*¯›Å̬~ 0:œ"¡Ç°‘è"«ˆT(€Ñ¢Ì­"ªŠnBÛ€¯ò¢‡‹ã÷oågòƒ9òð ùg𵄤N4Îmh‡Ü3µDÂqÄØúžù ^Kè?./p²bnª~L[á!FК&9ä°)’&Šÿ‘%£Á*^ccaßͯL O°Í›vºÜ² ý©©—ųõï•Ò‹‰:ãÉweÏñ÷ý.<+®¸ë5æZcÜ ÏrIYW©+óGr_z†ÉêH¹ÆtÜ6Ä϶ ;RZßx;&l¼0~R‚Ó›mÌÔ\SÈ雿jínsȺÁ·¦š Yî ç4•þÀ²cLºfág8èü׺ÌdÎ/y;a³ìM§Khâú72'ÓwÖå’ŠÍw] ï ͱÉWe¶u}¸uDfð U÷Ë•„_°Iƒ=É¿0CÈppÅŠêåËúªŒ‹ÉL}b¹c:•úp­®Ä;Áý¬9iûñ÷¢)y%…¢¯‘·š N˜~QZ>„¹Ó»Ì1Ì<µ]ÓžmRÚOî=艺çr!™GG¹ºÖèíÃòb2“Dª‹qáøÝÑ*;bγð˜"ž/p€úŽ;¹¼pºuJMãòݧáö;à3LÜH—÷t•¤mKiÄL,5ѧéÕÀŸ°FÇm×ÎÇi7ükEcù{ïÚº]ßõSDUÆ(—†d(· ‘áJÈ6žî|R}£å¼`T³òÒ<ôRï“l~Åõº)M™ùOø|?”œ…ý¸“"j§þ)Ûs˜BÓUз˜£¡ïY¾“HÖõ¸ãÛå³1ÙBÁQÒCÓ›ôj&ipÙBli‚gÜBÞìøu±Ë8* ÷¬xŒ>/c.>âŽ<ßïT“ÒKÙT×øõ…rÃ…[orI›ƒ×î ~™)IƒTI£:·?ñZià=½-˜ƒÉEÆ}ͤ)«»¿ÍÇÀí7›ßÄðºÞB•Æx9döÍÆÇ’…l.Âç=V8z‹O Lذ괄V"…w'­v[‹mS°Ë"‘ft.ú* ¹îÑáqBC·Ê7AÝ…ígå›4ºÀo¨KèT÷$Àt.A(ŽÏ´a)äDdÉͯ˜ÓT#45“Db•è‚Ñ[—çsLøŽÖ~ûˆ±´[‹¤<7™ryœ´ËqJ>}ž¹L톱z‹˜dSÃŽqIkDûJsÛœ¿¶9‡ŽpÅŽyˆ["É¿[zÕÁ¯˜àÑJ¶¶Ï]Æö:Ëçö=½+í1E‰#Ÿ›X…ÓE£•줭¨E¿_úžœºÛöb›L\ñ jÃg–›_<Á[–…u8¼›dÓ5빌¾©!©¶Û1ðŠu xæˆR¦šõœŠ¢<æ×~#@xLW´i{'ɘîí[ÍÓÅÅx‰ŠÚ…˜eAäñ¥µÄ‘ ±:³¸ÉoBbT0­=búxxZù~’roŠD¨SVóú~×â¬Êú˜úöËé5Ie˜&Wø£iÁ£¯µ3õA«çc¯5?â05¿0¶º"«Q¯)ÒvÉ,jÏ—’FÈí°õ~+ýQ`±mʲ@ýyæÀã*ðE.9NU°zŒ Ž3¾õÖ¶Ùâ_ÖWæ§9ðŽ•ªp-ãÀ_8£ÄÃ`âplÅ•ûvmـЛø¾·0l ¨f”äŸ'©9ÞÄÞcs$Ô¬]ò¯w ýŒq‡1¬ìcà† Ô³!–Qú‚©ù,ë‹¶ß»šGkÁ­©í}KÞJ³»Û Ãפ‡ZÀO ÇöÅÆ!;NöžÉôšõ+ –ÔL9ƒ–}ߎ¡X*/ÚÓ±61ÁáŸeœßc1ýÜïØ&ÅC#É€ÿBu€RmGO–KG¦Å½íéaýçàl×´Ž4¹àíÕ«Ï«ðô¶„ŠGF?‹eÙבµçÔCŠ$„=â’î4û „몋§|­)ÕÁ?·äïöf¯ùÌôµm¾™;ŒéâóXÕ£7{ÒXÇûól¦‡3Ž»IÜïòÙ+8cp*Š †Á-Þ{ TàNä§Ÿ›ÿÔ¤Ÿödë‹R©Ë×AYÑÒH%æµH0G¡‚æÄ—)CžšJ®ó WªÑj³íè.Ë1Ò¨OQdkÍÀ/Þ´´Ý‰¤³ ’ªaU&¥p å Ó‘zF…°W;Üýª^‘—ŸW““ž¶Ærh,²bÇËF« l˜d½¾ÇÎËÊdâûÝáÐR9.?sÉÞF¿r«$ü½bGµŒ¡YA3ûH§éiÎóŽsá¦ä“ Þ±d CNÎÁf®( íÐØ¸GT F‚íŒ Iq^2¦3vÍ8jª-ìé'xh©Ht\kÌOÞ³ÛÅÌœ4>VYáw~tH•¶ÔŠÿôNÒ ‡mCUßÒÏ+Ýx¹èž¦<¬‡ij•m\C^dR1ØÕ®Rª'I0_“µ¼¼Ù~Ü]®dÚüÊÍs~ðE” ée{l„­'-¢£KÚüUð*ã­n ¡æ…pHaËæ)Œð;¡µS–8Ò+oµèÔ`”ž?+ã'€oõ×O×lqsŽ?‘•Ví’¬'ž>È£ò[jHѺGy@Òà§£Nz{¬AÍõå"5þ+$xcÝ+Ù ,¦wIPá)Øs =½34lYôzèáFÂLÊ:’TœÈyy:ö6;ÅÛkþ“g£ZyäˆÄ±… [ȃló[.Õû/m”Z……:=¦5êŽ?-=±¿CpóËrû ,—_¨ Ùˆl¢O™ŽòbšåêÂ;AA>t¼—1ONå/ó®;5muÅèÈ­ý5Ø¥ Cpýc‚½B-1›kƒ­«ÀñŸ±Ç3øv µUÄc,cÔò;¢IÚDÇ=S# Cv¨$§/Jî’bžuª½öë ë&kø&×íwqùþGfÑs²dÒ®“âÊ4è¶ÚÜF#7mÎH\ˆS‚i¾æÄ·¢™ZYÁƒdl—ªì\ÍÑWõÚ«R»ñƒlw£ðg¹›R[cA_SÚú¸šÒaf=ßO=Œã‚µvKn5`…Î)‰îrÕäS-±Ij–38cE´›•Œä[`‰4¨„„·&ûñÞ0BŸ—S ‰ÉŠ«H,sA”¢Ô'jUþ&ÑùZRÛÏÓß"5ˆÏä“ïÛgyÊ}#¸ÝóÆ&9öÙï¼Î7£ßà«P¾.bž¿u¯u'GZ§dÃõ!,w–—gh¬ì«…SMoÛÀq¹hþ`&5յĨÖrÉx·ŒAÛQóèPÙá©e’+³‚!7=®««›ƒßóFnulÚB¿,t–YO²p–Pðç–é¶ˆÎæ0ëÑÇ|=øÖ¯`#o<‘ET§Ô³­â3òŠªp‰`¤`?2ðÔ6ªšMGM—¼l6”1ùKŸé,æÓ Rz>úŸ9Y+úc@*¡ç7ŒÛôDFä²÷óm¦6ªÍ×,¥ !â]͉ú'SezX[×G8{[±û¬ñ(ÿ# f"ÜK@Tñ(žwƒ‰”-oêaYÒÑ+½¾•ð2ª÷w^ú¿¦æ&KЩ8rPä-*®-™:7~G÷¢lÈNT]™ÊjŸ¯–%xqâSlú“KЫ“i·ûõfG-áÎç£á—gä¦C~ãHú†»Çk)' #Ï"F-ל¯Ê qîü'„×Ï÷o\Í'øt“¨ÖÚJ«Õ3ÍÓû™Ýž½nŒKË]Ï@ƒ‘SÁG®Ô=­:ñ)#Â#˜PèÇ¢]±«‰9ö­29ö¹¡ºÜ>˜ß !îUO;Ôµ?u")ùÜs“\ÌœcVÒÔA÷t3×ÒâOÍÈëVò¦ˆiÉr:[YêFú¬úzÈHmxõÔzB<ž:ëËu¼ïõ¢žðÙ/õhO¥­])Øï=û¥ \:¾ñz²ßæ(ølëK«ºÕJNû…ÏRù¬ã;ßõ ‚GA<;ÝØÅ¯lgÒ‰á£m*é c ¤à:BëÅ3éUf§H¸]ªøQ…±û=ŠG¶Súc†+%ScºØÜYŽ÷ÇÆ|=oÝØeÞÕnõ^Y /‹ß- _Qî: ‘ÝŠ‹&¥¯›Âè©à}yPqFk‰{˜j”yÕ3´wélâ(ã³hAU*6t»‡èÜýÜÌK¶-‘œê€a¨î¾y)N'—¬ÕÓ–—ïú{šŠÑÝݯ‚%VÊžLS"H™£Ö϶ciÆÊô~Lò^êòì¹êKªïT%‹bP|x1Ǭß~ŽA´û"F³Š$«eúLÓÈ!‚¹ý™ü{¬"þ«G¦õìád]{n0¦J7›HM²8Jò-C¬9üó!Am·Åik¸ß÷ÊÜy&.à$냻Íù¬*ßLjcSìdO·^Ò®ƒyLT<”0—IFåùü©×Š[%Ù}> stream xÚ¬¸eT\]—.Š;w)ÜÝÝÝÝ‚S@áÜÝ=¸kpwww‚Ü%8ÁnÞï;Ý}FßsÿœÛ?jŒ½¦s|?£;ëö¥îM^ú’Óö¢mQurÓ1–!gœkÇx_/)ì@éq±hîN©ª–¾ÁÍt²;Ã]?Ñ»`R<:¢ø™}oˆÇêBmC¯+:;§J>yz¤îý Ý@@ŸOÉo‚ã—zFšâêiì|ßhöýÇûÛ.¿j0j$ÓyJ[Œï˜+ɵî°h³7”èHDwa‹5.eƼªîk…z6ÛxIAÉŠT3íÌ@Ëïi€Ñõ|<%'í¯ÖFgLƒSh†l¸VKA®ÍÃ8!òhŽ}ûfñ¾•(®½`bò!‘ÁÃßd2f|n±¶¹þ}ëàµpßL¥2à‹ï*ØDoïœ7ØMŽÁû€<¥¬åSÒõÍ;>½¹ ´KÌÕò Ï„›ô  ðaÊ@N§î¯ˆæ ÖóÈO|ÈaL.°¹-ñŒôT›ô´Ï®ÎVÿþK#b±àLyZ.¿г\#ÕI!Žœy\1úõhë=œ|r@sºðÊr†¤ÈCZMj8W[÷å›Ñÿ®‚”ËT¨¾·Z$s=J³KééPžË%ÑÞ«äMQc1µë£I¶Uü8¢Ý!©sÃÒ1͉ﬗ‚ƒç]¯@õ¾§ø“è3û ÌâÊfç³³D+¿jé7f$}Ö_/åiP¨ËS–~e¾ˆ4VøÍGUh\ÑIJºJ9þÊÅC~¿ÌT'¥ñïûÓ¬«…TE ýêVQ[Â~ÈK[¨ÚZÅü"ƒvÖ5H>€ƒ§7ȇ|3O®Å}óûtì¶9ù`@VýÌ6‰ÊÒ·(;®=xz‹ i£+¡·…GVðÁd+‰°¬§{b¨i[Q¡Õš*}œ¢ïãE@bOù½ÅDñÓ?ôÎ †Zù¾ö&JêY+°î1QÂLÜÓ ‡Ñ›ó­_éöØ6O(ŠG9'¨c-¼þ}'pßOHC!S¶B{»3…ƒ¾ûGŽŒÚÎ4¨´KÞùëžU‡— 3&æ–M¬S»—:ÍûX~CÚ'}‘Ô}O­£†C’“ð¶±bfˆo~ûÆðoüpWÂK¨ÐÚƒ‘·„ û8µjIU„ˆR/‚4(TV?.åÀš0|€SZûØÑ4í!3iU‚‰:œ&çîÕL[Ñ~(ù{}¢á^N hNÉ,;Š#$eðÐ`*XÓ€ uH‹„¤“ íÛihâG>¾O³‹±y<ÏÞ‚nÕaýdu†Éµkô ³Š¯-'yÜbïØ¼±ßñ½SªÝ·c…Zß6`¹Eç9¿©$¡ÿú½ä`ݽ’̈F{Ig›$ˆ–!ߟW¦•êtqÓ¯ 7d(Ê ´VôZ“÷™ ²JZäén˜F\ñúCL^u-mO=J~A¼ÇÞÈzxèXô%&äæ|õUõáû‰gÁî—×UÕàÙ½³ëÂØÅÕ(ä{ùúV @&;’gå ¢j®£y;—k ƒ3s:Òˆy ²GÞJJÛ¬{ø‰^ ¡¤k‹$Å.Pv)–†¡<4ö!H¶±Ë£Ê»gëM9# _&¬ùCm¡Câ7ökQ÷:îàq5ñ°ŽÍEéàöüg0vã/'}¤ö(W-­þÉ´ôvC°X$Ôœ÷!£šÚ¹<ääT¬±& ¡1û?Íåyƒâr‹õ /Ùº‘Ó,Å"J·Ð|F¯ÖüÔô aösýH5º»¡UðIú±ßžŠËµLv£v´½¼î D‹Ø[3Ä’¶fÞCßf#»`=êï%*ë7s¦@C… ’FöÍáæbýg-C$xØý‚œµ\q¥ò0$Ó O·¶v¤ïCæ.é_?ýÔ+vÌ?\8(Îc_•ÓŒûÁRysîyî¥_Pœ¦ÿ0Ê‹ “¤Žèä2•¾b‹5Ðv>™^"[øgXu¯¿¡„GØ–ÜÕYÝÇ:¾¦^£Q» ÎRB!úúÑ?6c?ÒùڞɾÜþ#G ¾èò&ÍNÎ_E­Ýyy•«‚Ëòž9ëM¹rÎчø»:´A¨GõÆcJØQ«×|´Ž0{ô¥2÷KÍ\‘~`!¶ÌöÏc¶[aªß(k*ÇíGO-<õ"÷aK%â-m ®)<¾;Qì¼JL`I¥ÂA®Ò‚.žáÆâÄ?\~_×å-(ÈCu9mßãÎM’ñ-43~ôÕ°]+!ž™¶ya?®C»2 Òï6™¦’us$Z 9Ül»{²ˆY³I9šÌȞαcé÷& 5šçÒ¡½>xsò,ËŠy“‚ ‹ã=Óÿèó{â%‚`«ÚbqŸkòJ¯šh9äË]]’q5§uë¡]Bù$0‰ 2#Vh¯¯ãgö,ªÛ4UXbѽ Ä“©lì¹tã oú¸û1Qfô“˜xfP:FõY¯tnKôÚý›.·~ZeBí”DI¿ûÖõ3ŒRä̉OÔhŒò°AŽEÄ0K5T”1w¡q‘´DSõyèvèj¾v…³RO÷}!8çͨ€ìô˜" ÈkĄ݋ú FŸ‡ Ü8yI8˜xMD¨‘EÐÛ5B0`(#FÍZ?"I²3•_¼óÀí"¡¤³¤vÌÊ­Š?Ö÷ó·oEBmàŸ06V«8k¢mÚMú¢œ,MÛ&€!b£Ë–VœîOÜ—ýÔso—/ÓûÕ,ߤNfWç_ØÑƒ :#á¨Mêd:½ì‰"1Ã~¿ÈpðnÀó VgâÜZ55ÀWÃ7ê°}d³O|žµÎLgU¥‰YW¡OÑz˜þ¦,CI´/xQ³Q=•UÎ]9å¶ÄzÈ¢¬¨?)¯ÙÑ™‹qé¿™üHù‚›ZÇ`õ@£é°v ¥ ¿ºwüž§’¯gˆÄtµPÆe^ãŽï ~Q€ª«:½¢©Þ;Ï­ µÕMmšµ€ÿlݺ¿6KØ9–IäV£ÖEtùߘ`ácUq¢†ŒH_8‰Ôäú”¾g%­Ì¿PöéÍ]O‰dPÓF¦Wýr&Å£ØQUžŸInéñP{–éàç°ÉÊŒÐðÑ…Uε.ÖzÛ/´F ŠùË)<®°àŒ“4}¦ï‰uKž÷YA90 °y`Q¢×?©Z—è™gn€ØÔ+Ÿm¼²€æÿè½6¦sŒAœr·ýÊ'pì×#ž=÷`(¸6ûÍü€ ¶6È~íU´þ.:WãS³c÷<ûøiüÏÛ'q~éæÊÇ57¨xv²NðêÔéîØû^±~â‘Ê´;›^‹ºc_áìˆë5’iFC” ?>?MÐí¶Gœ(W+hù[ðµoý LR+gë<•Áαn…ß|Sëµ6ŸÌÉyó/ àò”ˆfõ¶ù¬Çô>¨¶í@¡{ÁjÁ² LEže¢«ÎÁÒ¹p–. QiV6ø(˜æŸ£Ìœ¨¸0SË–c3y©MØü çÏàÝ¥ßj’MÑÉÇòP ´~‰!8$±f r}¥žÄg¢Ü’Xv›)Ȭ¾±£±7=qÔCuX"ßNŽÄ¶„ÈkW6G+÷±?/üj|çȯ³¥kŸiZ­Æ^ßHxYZáNsó@oNÒ+Ï0ò¥ÆZÅ´òÜ´õ¾H"¢ÐnÂoŠ3<™ ŠÓWZgp–ߟ”Ãi Qñ¶D¿ç¶ò«ZÛ˜9ÍîPÆãëßrð§JG©Ø©pQCIZ#êåWIœ{@õZï'a'—Õ3Ì΄:.d}=W]Ð.KÕŽ)a,º v£F— BŠ¥·ØõÏ!Ф",ìyqë Gýžb"¸jÍ>´Ó]v_¶Ö^-ûK¹†Q2)€Û̸\þ.¯’t ÀöØÑi,bybCX/FóÚfe(©Ñsæ83÷Å?HÐ\G×û.!çº×ºªb«^ækEù}Ô[•ÏŠ¿a1ÈÁ%¡jÔ®^‰DˆÌ¢YÙþjƒwHH‰;[×qú¹N©ð»¥w³p©*ôž‘T~ÿ|­X@Ú·ó.…ŽêZÙŠÐfXùŽE#Ï£ÞR­ï®4w˜n“Íq{§™Å®“–˪]™Ð +㶪Úq)¶óÆ’w€˜œs\©¢uÇ–²˜¥e.7nÊÉ.{)ŒŒ/¯<¥ ,®Îi®üߨ'»ØxeÎ"îÑN(î… ¿ÿ2®®jþÂÐ=eÑ÷'…f8·`fP´=Mžªâ㬌t Öø îÏ“4½“Z-Ð`wZ÷\zýê>?ñ» ¨%%I9«$.B¶ªy£ÀiwIiÜÏœ¦ßHšìžãAµÖ ›Õ–GðrÃDEÊ‹@ ÃÇ©TÇÙü«P£xìñZ¡ÏO®Ež á%¦‚*]:Oúâ¼&å—­¢ ©F~Çöò`m³::‰¬¤¶›lbomá#ã·.µ…,9üg µ¿.U7ÈË¿‹Ûr–·3£$§Õœ³M«½gtö`“(td…Êdtwç=eQ"þ íj\jÇmôÏ"@ ÝE”# NâU*~Þe,$Æ3”N×1¼ð•¯Œic6DØ!ðPa?š¬K+ä>t\9Gïì8 û™ 9!Š$ˆ=/~¤>¢ìÙÞûp>y®‰aœ?¸ÔLšhë;°SpELýeHˆ_RY ‹«\#Æt,úÿ9¨ž¢ <2G]ËÕØU5zcè¹JÒhóD;ÕT.,¦ˆMáê¨1%d)Øviǹî×ý0lKùØQ·\¥H)z8õò3Z<»Ov~µkÈžZgÚÎ~®y;RÑ\µv§±`áµ TÇ…”‡•ð©Ð{ëÿ&7Þ Þ[øþ*-Fó‚õAX>wƾxoUÚ ôcªTÜñU´ˆŽaéLU4°kpÙè©.ÉüÅ’†hn'~Ü!ƒ“%!ÄÜ·ªa ÇVø”Bܬn‚ÑV°¶Y~åè¢=øêåx‰Ž\EË7'ÿ÷TLº#CÌ ¦×cvœË 9'⤹ØÇÙ|†Úú9%ð›UK É;RiMH˜ÜR·6AéGG²Ša'ú×ôIÍ ÚwdÃ( µ/eÝ £hûp¡4äA¯¸{¬^&k·A°–DÎvß-}-Z‚G¿‚‘·I:¨ðzÄì|$¨÷¡ë`dÙ6'a0f‡ ;¨D¬Ç·ó‘ÐEbß-v‹|m=bå6ü©{{RºiØÞ¢Ëƒ÷­‘ƒyÿ‚µ¾Û‰Ft Tß{©!ÚHCa_ôçW½¬ðítä=ð–òZc³ã´Ðr^\`ˆgP2Èÿ›dÍȦq2õ“¥ÿVòH –H9 Šôxù oF%£k¨µÀòªR"Í5²È¶ÄPl¿j¿JýâÊÅu1& ¦¼ ôø“ÙþP:ƒðÎE¥—»£ø”Km{‹Âž§¡Pl/ò3—Mçu¬–æjâ@dGÌþôÒMÞSGQj1UZaØÀ¹œÀÔ½„/›Ìò7Û,ìPóq’Êà(Ý_:y|噺—*I´oÝò°§O¤B§^¾ñg긥xÏ'r+D¦Ì€p±­êÜ™—i£’¦¦¬Û¼o:õi x½mDÒ¯îgŽR¼Fnj‰T,/+™x…îï‡É”;.7/ ¶Û©² \™FIk~„±«5ø’omtzªÝó¶^V@n5X:Ʊ#èa»pâÚ:Þ1Éð„$wA·jŽÆÈkΪÂ(-„˜ø¨‘(·†q†îekßøE0ðÌ")H͉Bã,“àž?èV y‚ácª_™‰''Ëè9`°Ø¸z…c¤ñVs Œëº™•¬6~æZÂi$cœjZòFLÜ誆`½*”…Q É¯t ¬n4R½…UöνM¸Ý¿E’Ä 08ö°[,B7•&õÅïàê*/UÚ{ bS|¼ö!PõJJiÂ$Ð73m§¾«X&—åÏy ö¶ˆˆ9·Ý…$ËÚiûu¿ŸHOôzóÄŽ–Àéxu¿˜¼a»‡bÌNæå¿,ñ½!Qºlb4ño\­Y¡F:³0>ç^5±-êé± —vHÆš;ŽDWCÏýy¹^´|CúZÇì«Ä“Wٯɹz·Û¤¶dã—‡8`aå—¡©ŠÞ~­ÐœI÷Ÿâ¶í&†ÐB?>D&¸H¡J‹i¯Sçüý»å/2Ç;Žº—Ï16Øñ{jûíŒ÷\À'·¦qÉEfÈ7)z,¸íØØ>=„ @Çbz‹«Ã Ûô]H)¯~³J¤IA‚*Ñ3u•Ïw ì'N¥Ð.Ê'ýðpN"&óRq@Ú ×1J´NõîL(Ñ!Ïë²?ñC‚x—èçÎÙêŠkKºnÁv ýøWôŽèlæoöõ:`g~æÓÆÉñðZõuYéPé7z¡Æ<#·üZ‘:ùW«EsV}/’¬‘…!×F°S– ße›r]K0/QVK9cQ½~0âàíéŸÁ'^ âí\wÈ.yZzÇRHž$†!±©|¶]»¢fÁ°+…oßÓ™ ¸1?0zµFö>÷ÙqýĹPb¡-ÜÇK] ‘%÷;‰‹ÈV ˜À”C_û¾UJÏeªnv=Áý’xÿs<õ§–*îö@k˜‘åø›¤EìéwIWB [ìÄ2kîë'˜ M"ùwí"®`9žß[ü¾8VIß;2k—‰ ö í¸}øôš x®[bŽñ-˜îrèÃdÇ¡”]ôdœaÇ‚þ¢?¤>®ÏDq‡©)¦çlCÞD™Ëûü羌)³¥-±<&T­í í>xÁÍS`ÎÆ¯?¨˜Þ‹x L—t§Ô BÍ0Ýߔݡ­®ÒÊ­;LÚeÖù¶øp.3—¾‰‡u_ÇÓ”ø/,ez-©ÈO–q ;½RÚf=êcîyN–<‡½C˜&¸=SáR@$ö„œvs `Bfd;.™*!RSq{×g•,7&y¢TÐÜ•0{t'•ä"/¯ÐŽ=üËiyôá¶ ŠAL ¦ß%`Œ·­VÍ·|½óÊ¿Zv´6&ýgôvrägû©¼¥›ñÇ*¡°Æ_Òo„µ¸ý2/U‚DQtŒlå¤üIœlIG×÷Á˧ª@—WªûÉnb F“Á Uàpcw?·Ï=ØJª':–özü4çÛ™ýÙ;bÓ?Þ} mío#¾1à²A°;r…üƒGƒV±”Yû¹oÎbrÑ©8ÿÓÜ([Cªe+«_ žuqV]$!ÁÅb*Ù½V¢ [Ó›UŠj»–ì Ró£ð‡rC -Ë <Òh=±bI´×òýÖ¶o–yzâv§‘Â$ô¢žðŽ"ÿ¬‚zb%g‡œôd© À¯‰½ Oã1ì‹ÃOÑaªÞvãV†çÆN4pXñº¹7«ò¥'‹*ª6\¾ â>\ˆq ù"‹d[#ITçSÛ›Cú¢i VpOOcæmÏÀÝ7ýV§ ª·ÃðÛçÖ]üTì£*á›(6:6ýkìú]UÓco¤ß½©)¾pNœ²GN ç¯z:Àlí@ˆZ¤:0šîeã‹…§òˆ6u®Lú¥'Ÿo ì#ãÉÑÞn=dD“z8såáÍ=ݧ)€‘7íÔK|£RÖ:YÁ”O·³@xÞe‰'àö'u×½9¢žbX¿µ!îY³·Rmðç‚ü^ú¤ó¤ÌÅ\À­—iLI¤…{Èj.½Ó·þÓ§äS“žüýVß'fÜŽÐÕ±.g<öif§CÔ=Ÿ eÉ2ÎHÑÂ>X_5z¶²/vïeËr7n?!¨7,ÖÛJ”24¸}w ¨À ²ÇRÀ/wOŠ>§·7†æÙ€ñ;ƒ`+ ˜wØž™; ÈÔbˆÜuÐG LÔ~õ†·qǤ¡Heç·Þ6|pu¨ÀA~&4OI‚wyq¿j5ü6npAh¼ÖÚ’"4¼+;ÏtmöT{m‹GȤ¹…'á°uA69¥ÓñØšÀŽÎ·™éù±D÷!ýË^¿dº¹F¨µS<78$¶¨ä¿}ÃÌ”ñ­i>2µß„¤€îkðˆ¡vÿÍv…¶MJ7ºMöÕïø©AE¾ÔœqÂÔh;0ކAãö瘂^'—?ŠcØ÷DÂH\uJ'—¸.˜aÐ3,f¹Ý‚¥¬ù”Ö2—;µmš×ø30¬)šŽdÎ’d4s“TIÚŠ6çèc(ƒ;^· Cù¡|‰;íEUiŽç]UFw?â1ð-YËl6a®(ð| ¼öÐ9CiFi`ã÷ø§%pqÿ’Ô÷¨_­ÆÉ—´ ™×åt‘38Ìkì›rìÝÒCbî˜A!DÈèp1Qíe6Ÿ!l½BT¶~.ƒÑ¦€z-D–•In±ûŽØŇü¡ ÖcÝÌÈ#—öÐ`eˆ¨6^š¨~§fF¡o2Ç]ˆBye=óòµ‡µ”¬}Ò¥%MYbÛÕ8øL~Ug-5Ü%x¼¼Öà!^3¤ÛÝ©þÑ [ ëìÕˆ š£÷µ¢Sw¨G ´Ñã-«l,&5˜äOP# Ùãx!$c5XôY´©Íï ÷ŸªŠgh~|ò†w¢»åÖéyŸ€½ÐáËPëF®‚îÍ j‡KqôÙ³äûTÛfL¬ŸÓÛÛaZl‘YðöÔ€ûýÊ9ç·ßN~É\ЧµŸï£È§6ðúŠ´hÊ[l†¶×t¿‚ÌR¿ìöýe[9´&ƒÿC†²81 ÚÓÐ~²2QÀêþ®ÀˆGážä³ö¥›V5õÐ|Ä Ø“ðkµ­M]`"’ýX*JN§šüW‚˜?j´#ÙÑ­uAŽÞô03´¢…׉6ÖLµ-ªs eÙm2r-B/×õÓç_}NÄ |Ovgv>*Ž}Ü=Á<Å=™]$Þ/è0(.=°WWK†Uf?LÌ䪡’ešVS[iÓ|!mKDXWœ&.§†s¨ÐÙ­á)D.á…/t ‰ÅÏŠÍñŸè!Á‘#½˜“Çq³.DìPå£vAG–È_lØ8d$ñh|«h°²›æRX¡üX\ŽÊ(©föÀRÏ঻cŒú×äïâ@Q(¤Ù_²ç>­¼cùÍ;—¿l¿^uLÒÀÆ™qå©íI9 øÂ‹$þ<_T;‘“¿’o£Ø¸Ñƒò•Ž_’™}‰Ûg™º×ë[i¼~¤pÕ‰Y œÒÞñ\f K\v¬'Û_›¨ŽÌ{Vd ôï½[ûN¥¨G¨rvQ¤Ž±B…iV> I,DÃñÜgù8“…ozÈ?1¡Žx‹¶ £¡oêH¼ìþ–öÖÉ#†cw¦„ŠR1éˆîƒÕ§{TžýƒB²#ÕrcCŽ ŽM†bH^g–Ê‚MªãmÙg³füqÚ·I9ïs G‚û†éáùºÚv©BÞ‹Å öûÎЈ‹Ô‹ÕØDµ…–öЮ pvo†þ«¬.Õ-[tó˜©o#TpÒµ— S>ü§zrIŸAò¢çÑ vé‡c»Èn‹âêxªÔ(/Ž4÷D1-w½uvÑdl‹¹‡4ÈLŒ‘/sïø™R×aÆw3|)öQ‡ v]nYWA6‡lÜ¿ÒCü–ÂþI?x`7K‰ž2ÇEj†¯1'Ñ SÜ{šžô«”Q&Xç¬Çk¥·e×Y0ž!{ ƒ#ïá—_!EŒ˦<çK÷s-c ä“-v!r´„†ƒåúsÄz;còðûLQÙOÇ»²Và±æñuæW¡Õ+s»7Ž'‚… –øú7¼[p êüp¸}cñ\–Gœü«EÝ(—äÚÈÏΊ ºÜÙ/7‹Q*&Íñ ;‹Z1Ö¾¬U,y¨TOAª6ß–d½Ôf£–†õ2o$#áÒ43¼½ÄÜ ç·#C‹¥›ã81™6Ðr†@˜#vóý'&b¨2“À„\9¸d9´· ®ÿ-„‡DN«y¹0ì™Ò6÷~P³l'‡ÀÓT’Ã-"ú³‚PÇAãâµS®øÛfŒQåeíÅs¾æ.ãa¶±ÌAœ#œëáI|¦ÛŠ´ìýÃ# wéѹ¾š†U!"Û(™åPÜîYÃbZQ^ãçàŒ—ü‰½œå/ % Œœ¯‘9B yÖÆ „§äÄž°ÎaqÓU%tï8º»M jº…Då ´±4'ý¿¬V*ìµÐîÕÒfSm.™ÁÒý)üD׃„¶ ' M³P bAª—p:ÙÇN-âꩾj«œ.-¢}5€•Ìò³µ°R•8SX¢JÔã åÛ•¨Ò;3K-œ,a>A1ÀÓT—&Çô²iÔf›º…=)”‹¹ö€-u\_A?X ¹t8-¯ýøçqØó’Fvd.KxÎÁUpDú1PŽ[9¶ øÊ: 4ªäÑ&d‚eYPN«ç&d¬ßkî4窣ù·›T#n9Æpµ¥VD—qáÂG° Çu*k¼ˆ¯3ß*“šÀ]þYIì0ô¾âvmÈú¶Í"@!!Yë]§ÁNøß\Я§ýoWß c«Ò²–ë,º™:k&a%€WY/b˜S*] M ]F†¦…Û/‹rº¾ Ôó‚R¯× .8aŠÙ£ç3Ç>%ÜÄ"f]cW UÆÏŠX6sÐßÚÛ¾½Òl÷YøŠãk–OúF¾Èßß%H§Wêêö²í’Å!„~¯…õÙÄöÆ4Ôö°$‰õ–{2Š+¨,˜=öXNd !K‡ry<“f_¼a¨`ÅG˜1–)—•WWó‚ÈÝmðUÞÏIIPbJA«–-U™#—’ò°8ÃSn=o#à‡\[?eilJX¡¬#ú±!]àJ£†dÞ‡ô2ÐFÇ>1ô(‘-à4Emà¦?[íèŸia¿Žž—æ,"þ#ì?N}OŒ ’ªÐù­B?ߊnO:|Y‚wb¢ôÆÊ(‘t6\䈬å3… Ró#A•&fݾÐöY9È{6씪,2˜ü%¤Ìè¬Ä+Öˆöé­tò)šÐuÊÜ5[ZnásÊs Piíè’oa{ê¹['¸‚‡»c¬ÂŸ29# îŠZÅR N<ÍeSiW^à2rw€ORÝ Cp€W¼žVóŒŸ(Û?!é•Á uxo–ñ‹]¡ÕùB:ÖÁëß×Ly{„Yø¥Ip™F½’¹âV¨(J¬æ|ƒop4À­Ñ¯Ÿ×ucEX«9 ‘?a¡ä뼋žJ ±.»á$¶^ü~„h3AÇ5Ñ$ž]Ð[7– RÔ/ÔPc&—(Kw/>=+ºÑ_ŒCc´#Ô“BÌŽëÜ•û~ÏbË4"\6“e B|p/‹i9@Áø³töë£ÍGK­‡y²_ذŽÖˆì*å¸;³tW¬)òùã(.:Ã8¤ú¡<³öåìö»òϱýõ¢Q†Éivu_Âö¾OÚ°J%üÑʾ@ÉÍ=äŸK«oÍ „z^&7/Û!²BxVްZ*oçúñx´…¼ºÆ„d ¦ñævD Emò†ÅøÕÈnKaÌŠxªÆœ\Ç|#u¸äVÄ!?×Z=$®óÚí‘ÇìÏ£Öߨ”ÜÂ1IÅènzéX£“mµ:­ak}‘¶å),Qw'è,šœèé¾\€"Wþ¢¡#àQ•ˆõYêúËA¿ÖM¿-ìŒå±~¶ˆ*"/»x&öÔ™ÕoâÎÈz£Ulö>Gœº½\î”›ù˜i‘²á)7ÒLÝ ìí=v`@½p9; öæg1M‘¨ aš³0`ÖýF;õK0uä SŒ':§ÐæñúôÈíµûRÇÑM¸Q¯«ÎÞìÛ1ßö*ìÆýjüoåÄ1Ìd:pùÒ*"a>ã&UZç¶ÖôÌë],ÇÉs¿éÍWu22€H;/\^U CpàÎu‡5ïlZˆ>M‡UM-…®HrùÌ>µµ«1hãPÀ—s\àªåÌ?Ôõõ'Öùš=¬ µÃeû}D­!Mà*a˜±»ù ¸VŒœÚIÄØãëêx¬]²ø «˜â¯rËf}êØ/±¢â.TñÈ‚Z zßHÏN^,SGõó[‘/8T_r´Üè`ú¯=>¦Àjª3e3T†¸ƒ•ž„^ÌxW.zX«–ÑLO >I7meÃ=*_ ›Œ®8°˜mPxÂSí|G(¥C‹Í[¼"|`¤°x‰fÀD4»ïMkYH`zMS{öô›™#®ª–b€Ú-)Ž ÏVˆÕoœ¿®«î¯è¡6zj?šzûƒ²'èpüœž³óÅO†X5œúÕw{M¬ÔãÅzàž#…XµÜ±ð×öuÖì°ØÎRSOŽÃ¼Æ »æHf·8Ðå¦I1è[dŽ»£Qß’Ûèןü^¥k¹ü XHÅèd¿ÿh„›õ•zdT½ƒÓ†í„A©zåi©‘UUÜ'Â#ßN5dt·ÂÉêrxo}Wº™´á]×l…/æ#u3Š¥‘r¥Š–ÔŒ<2¶ÌœaÔ~õŠâñï ”%Ó¹#aFñsÛ:Ì?¢û§h <½Ü syU"TD¿K¶üžAä;BKiã^Ÿ(ÔÙ!¦/7-y&'½³g^‰T›ÑñûÍÆ¹ÅžõÐÌÕˆjR¬Š@5ÚÑLÂÁÝ~õ»úÔHº,ؘ˜HCxÅ>‡^=è„¶Ñ´¿¬”ùÒžC4•W _xÍù=§1’‘<§‘Q1З ÁG6§]"Òÿ%n'jryŽÆuóg1ÙQïôåŒè §„ñGAÂÕXä’ x…e~ _#-W(GÕø$OîªÛŠlýE\¥dŒ»|X·nùfyŒØvß‚[éÈ}$ õ9Œ¸t#—®fóØaÂgS 쥎ú›F¦´ûMuͺïÕZïϱš©ül±L†;_[1[«T=éj#[:ýž¶CÒŠ´ÞàÇßY“‚_UQa³¡ dfâ/éh:܄ƂDfØýxtŽlSèk°“¿÷!¨Á²«v´1.9;¶ÉKA!ECsÛ¾¿^Æ’ÀC²œÍQWÚŸ@‡à¿?kÄ= pᮨÙ¿ SÕº÷¯âNã6”î¡ZøàëˆÃvÄÖÎpÞæb }³aêá·2ç±Ò4¯…‰†"î†ð·ÓBÚž&ˆX•ò}¼Ûì.ÇhÆÜtGsÝ"ÿ'@CÃl¶™Ã©®ËJÙÀ º° }Ð.%a¶µöfŒáq¡÷å3w»uä ÁrYOAk iÉëª;Ür:1$¦kœ­‘ß4дwç·±·<ŽKΙº kg©¤À 'Ög»ðØúÊÜø¿°óÍôÙ†FMl—ÓæÚ×W“bÌ“ˆ»Xjh«+&ÜÑÃpЋ§Ñž%ÍpþJ ߵʓgÌÚ–­ fì l§…³ÖÉݾí|]¿}ƒ6ƒ“pE&- '› õb±Æ÷×ûcx wÉÖŽÀ©q›Ù°ýT4E+I«•»m(³"HƒNôõ Î) /¯¸¨Aî€}íÝ‘š5ßñ¯ñüpÊ¥½e„ýVŒc„‘ÀŸ¥,3­7­„A%Ìõ™óqýaA-ûé&fTD½Aªª!F¦à¦™zÉk‹)|ùùìX­•Â},7 µ'Ô€9Ö ÉqWÍ<} "%±¾ë=;U‡§ %(~Ü~3»÷í÷kkõ×™þ›—Nj”ÊYŒ«×ÝOpê9º<¥†ÝU!¡‰uqÄV—n+Ž/vG;ö'CÐrEÄIž`õfÕ?AñºÁ3{˜ø,ÞÑQΙ?×JÒ OJÕ^"ab%y“ÖV÷ëæÏì› wù>dµlò”§ééâÝqBÇ `ÔWzÈ%;Š×‡X»óbùF¢«)7fz ¾Óäé{¯û( Ýž×çœÇ>A¯™´FÉv‰ø¸Aºjì[—á(f«[e _-p<ýùþ°tw û­‰ kž jçdŠ´;ázŘi;@å sá»ß#wFUnÜà@ï ꫜnkç,¯G#öÐJ’~ÉóºdÈâ^FéH ó{1óS¿’G©>«bØœúÇsýø »+:ªR±'±Fá^EXOp?"2ÄŽÓzèRjæñ`4å¬OÐR_L0¨àÅ‚7qû@¬__ÀNÁ}©È.ÎB`}¡bšÂ“vòïÓ® -²SÈx:ž9… ÞÝ# ~³úG’¯²&s›‹™áâï¢qýBz-17õžr\½™l=€z„‚ЂšÏ'µ/D„/º®­<¢¦"«]ÎÚ¢Ó¾0–¤¤»Î,³æ¦µUR¯µi}ø£‡†u$Š‘öÏ_#ðM¼}Ò*oDžñlP~}¨¼Ñ`Õ»õ‚ý¶°<Œá2ÞãsT¹$TWN–•Ð7<Åߤyß$k§xràL`ÕwÉøè°¿Mþ`ÛñËbDKI„`^q@Å#»€ÌüÄp{¾àP¦8ÅHÈÈΛn5Ïó9Gä)Ÿú³g½½§ú…1¬‚g{ßíÐk³õ}Ñ[}¡¦§l/˜e247û‡#µV‡ïÉ…UgúÒùíæ­p-¾³Œ‰®Ú߯t2¶²á”>¼cX)TÝÅ|Ø7Ðú%ÓhEÇÑè;s3H¡ßº°Å2ê·êâ§7ž¼tó¨ Š:µ›¾Š9goÙ"£œìÌ8‰üA©¨®)"—墑ÍaM)¥H˜Ã_|ýPî8 "k«ÙX×m¼f‘µYÊä.àzäEà€æl¦‚…Ößûnº4c¬¾Ódr†Š÷`½%“&ޝæ .·ntÂFÃñŽ*δ¯³S“I”QAo< Ðmfž-Ëåß &Ÿ€²”J * lþä»Îðe_bíB+ÅRBP‹´ŽÕYV=j"¶²›òä¢ûh‰ÈÃî]!p¦‘ÔT} „b]Óˆ€Ä¹0jÞ¤Ëì}’L…`FÓö>O¸žë«Hùúä SOÌ:pÞ3¾A¨¯º8·PzÜc£ýÞ°""ôÁ˳É%#c8ÈŠQƒ;…+éNü–(¶fz¨ »ÎR–Ç ßÍšÛLáx(IC>ë&ôõ¶GïF)`If/¹Ç óàxÍÞäP¾¦seÍ`¦ž„TÞ¿{€«8£%ÜÑ'W¶Þ¿X$5UÔ¨$ü8Ÿ#=c%ÈÎlýÍ߯¾^Œdí}] ý élÝÅ ëwˆ²ˆؑڽ…{=¤òŠ:mçöëŠKT[}Ž)ó5”·å†-YñT…òèÚaq™Hª&Dýj#pGâfL>hf>k˜“uéTXQ’µâ…ö`­¶¨.!¼iNF ¨|1• Ÿ§ç¢x´À<Ø’Ú¿7{í ÆõÉ%zå*¬RŒ1©\㬤¥jpu·„àãuK0$ló}|%÷fæE«û7Ý¦ã˜Ø¼‚)k4º±D§Þ)+k._u–gž°Ò3¬Æ¬â®L|KHEÇk- ¸Tÿª¼’Õ›únPù¬¾®ÎÄEñGÜìp84 ÁÔ˜+e@ ¤8JµåÞLfî,%uœ#Ó[¬ÂÇ¢ëlÜ[¢¿(kѹ?‘dùOF¤A.âX.m©»önú!1?ø8Ñ ƒ7»Ùê={)çN'I}­t§þ¤îì^oš³ L‚^•²«Íü” ¤E » H$¾®&ÈÛðuJ݆ ™†qéi§ýœ«%h¸#‹" ±é? lãùà|Ià®@"†9öØ“jl¥¸aJÜ)%K,—{¢ÚvÊ+áÐsb-iØ™´Y¦ÒŠÇ“;ì–Û¨ž?ŸµÐÇ%ß0¬ø±/­[8H¼}2˜¦JšPCFsvCpÛj=ÕŸh£x,g½_8A‹ð7´H°¥ \ç?ÅXe”$ÊÊPéHkµ/5úb&È÷^$[×,sÇtG_÷\×Msš‡Åêýi$¢R­á ½†ôJŠÎ½9Âz‡è•š°û{qϳɲØÁÀ/U=\VûÏ7ì;—#_]ˆT×Mbh çÈP¯œ,ºc…¦(>x¿EмãâÁý?È 7öÎwÏ…M%ˆÎmíQžH¾‘ÕQŠÄ^EW'LCKÓW˜¹¤­A(ú-õtW’·x™¡˜(r߆f˜ÔŠg½ýu`ÝV<§ýäè>b¨Ò‰ƒðÎ:²€ãÉN~êëAûYÄ-÷=8ŽÄ]‚טÀáLyhˆË‡Å⥟ãLXb½ Z‰š=ªîÓZ™áŽrZ™-]›x ˆÊ”½t ™2×…Ë®³`{©)±|b‡þWfn7¤Èåë7|ËΟ´2×§$ÊfýŒCc,´Ùä×çϰø]B¢};Ç÷ù+§¤øu Ó”úË^Ž•æÃ£žzcÊ3`xà´´­Ld©º¬»µ¸,†æ}¸Ðên_m˜Œsúõÿ>Ñ8“‚³H×%’¾!Õs#¼Öm•TQ[Íðq54Ë…|–]í’›Ìסo!;¤2w²L4;視‘‡^Z”ðíÞ„>ôí¬Q hÒu«ÅbÏÇg3™ÍAxÚú§t_¿X‚riEF7¿"½×ð:j² %ÉÛJº­³gY°J¦€lV¦= `L\Û¹ÞÕúsÔ ÿ2¥×}|'}ôñhU,”1ªÌì´ZTØÉF‚u;ôWºäD“µ!ƒé`E¹ä@Kóë?{ ÖjŠ›ó/-0¯è”0ÚCçu^ð‡PHôÜ|ù‡ð<'ŽšêOû'|ýþo ©€+‹"Ú•öfÆü.G-uÅ£\hÓlðä—ux—ÚŠ5ÜÊ.¬3˜ó·!»ëÄ$œT©‚~Þ¡l¯ôÚÇ hÜÊZ+†øMkEäI¸{q¸8‡BÀ½áM˜ô»e65BIR•8¤Géï–s(Êædõœë˜±~B ’0‡³3¡Õø2³“«^ñP-môUkÔÜ „€yÌÑr…%¸Na™ÞµíÖæ>Ъqm7êÁŒòÇ_{›ä]ÓV¿f.º(ö&ÇRã’à 8íät¯&±8ÇçúW“·•ß­¬BÎáâך¯»\MU€Ä8—’NŸbY ÉùôäA°¹î]¶ã&© ç´MµóSÒU÷tÃgù¹k¢!¨Ç·1x³9wJFOÒ»,Vy•Ôµ„÷ "ÃáŽzGì_ÜØ#߆s£íÂbn@°iªW•ÀM·f”ÁK¦qÒÚ0œ¨åŠ&ÆÁÏòhxÛwûœŸšþQo}“‹¹™E9îÖ°ŠVänËÒÛäŽ7ÜT· *¤ 6ö½dØŠ2Éu±öku5^’‡œ«MÎkƒn2e) Vã&ç’¸B £ñ^,åDYSgÂýV²NáñXÜ´Š¿_°Íäh|ùYøÀ!”UåÁÞÝ$•Ü28i,/±ùSq¬úpéAzßh]6®HLEÈŒúâÎÀÄr¾öq3ŸÌTÞãÑ<-î—wsÛ5‡/à€-fŸ„,‰ßôè;dßY«o0Lƒƒš‡H€˜NèwDUÂ!ž7y 4‰ ¿xýf*mû¡.Æuý…_—v“£ñ1貫 |;·åE„»\qOÇ="_ë-’ ’Uò|§Kɼ~­ì2KÕež %ý΄hû¦*žalÙø´8@0Èîý•uÙx•­„âlîGaªõ"!®Ðo@‚ò¡„á_Z »û25½Î;“¡=³D¹A;Mã Ȩ/,£P/³ÇxvX“ùü{€ù8sÄÕ[hŒùN]±Ïã¿÷*åDGÔÎÕ0x©¸³˜X‚=©©ÔT6ùÿLw—½®ì÷bùÐì@_ „ùqŒ½:I*r|¸$ôå`ÔvE¸§e=ÃC@¬ö šO¹.‘ŠülÄR’©º#!“làãGU+r¨ï›¿©ÿC“ý=|.øƒÛ•éÀ±©Ù_|í+“ ÂOL·þ)G~û‡‘Ò îKgI6ù‡GvðÎÂêÈ6ÅßÙâVê„pŸE Š!Ûl-N{@J’¯õÄ8M w;õŠ4·"ç¯#$Ñ•+ªl\p¼J{á? ØÈ°<‚êS;K!˜Ö>vÒ¤°„¨ìÑÖ½BCciþÙDu‚†iz`ÕÇH|RØô ½:Œ¤sLžžL4QŸ¢Ü®lÝœàú¯#líû@°¢;^I:™ Ù»l ¢ëÖD¢?8âN-;#“!aŽtÜ–”¡Ÿ!Mq[NFGöœ£~ž6¾ž¯vB9ŸF¢Ž—õA#ÁØŸ9OØÏ/âÍ6=øþC7Ó´Ÿ€Èqpîòn"зxñR"ÛÄÔjí§˜Y­º¢|=Ÿ˜yã)ÕKgc~áX’ô¿Bô Hª˜¼sûû´¹¡ œcdR ÜRT9Dl³k- ô= VPû> stream xÚ­weTÚ’5îNpkÜÝÝàîÒ 4Æ-¸$¸÷àÜ]‚»»· ÁB°{ß¼y³Þ7¿fæG¯Õ§ªÎ®]µëÔꦥT×b•:Z‚ä!n¬œlBU°ƒ¥»«–D…UÊÑx3ò¢ÐÒJ»€,ÜÀŽ 7@È€¬\\NAAAZ€´£“· ØÆÖ À £©ÇÈÌÌò/Ë_!KïzÞnº‚m º·/ {G'Äí â|Q ¸Ù‚Ö`{@ZMÝ@QUÀ ¯ªA@.öuwK{°@l‚¸‚ÖŽ.ûVŽ ø¯Ò\ÙÞ°$]W'øíÈË äô—‹àrq»º¾}€]6.··¸9À+{wà_ÞìÖŽrrq|‹pxó½©;ºº¹Z¹€ÜoYÕeäþÁÓÍÖÂí¯Ü®à77ÀÑú-èhåþWIûÞ`Þ¼n`ˆ+À äåöW.Kvu²·ð~Ëýæäþ›†»+bó/,… Ðäêúó†ýWwþU'à¿Toáädïý÷mÇ¿£þ“ØÍdo͆ÂÉõ–ÓÊí-· ‚Âþ× (B¬œÿ°Ýþéó¹üÝ †¿f†ñ„Ðbï ‚¬QØUÝÞRþg*³ý߉ü ñÿ‰Àÿ'òþïÄýwþË#þ߾燖s··Wµpx€,ÀÛ†q¨þÚ1ÿ_¬…ØÞû¿‰þ÷@=Ð?þw Šnom„ؼIÁÁÆñ#ØU쪃ݬlÖöo=úÛ®‚\ìÁЛ–·ÀÊÉËûo>m[°ÕÈ_MçüÛ‚ÿù›<óf×–y¯§¯ÅüïÛôï(õ7ÕÝ´½ÞˆýGïÿyø CJÊÑ àÃÊÉÏ `åæà{lÜAA¿ÿ&ßß@œÿ:¿·ps{ŒÞŠæàü»ôÿøüëdòo0²+Gà_s¢åf¾Öþr[¹»¸¼)ú÷k+ùŸç¿‡òY¡¬,:Z ‡Ú¥e¦»ÕäŽËõõpÂ~r*©×.̬rìH ߬0ªþÄÖ0)ôÒê½pâô¼§Ä´?܃oOß:ÿJêGÍØ›½A×ÎϼÌnZ‚ž~ªís1¯²gÈÇ¡»ÿc\CÓ´ø l²Ûéâž1Ú#?ð͆¿Uj]^VNMÁÉ)Ý—£û;úþ‘¡Áî+øÞ=æœ8dZa ÿäÊ$7os—›z«gOÖ*¡ì/Ÿ&(­ú†ØªiP{hàö%I$ÈlÏMÒD¹·"­šVý祉•¸&ÉjMÜp›B;GXF»ÆMžZRD“…<¥–ìÁü”÷Iâ 6ŸhIxäûEbî¥"€v›S°6¾!1.(¯³<´9Iþvý\éÜÔGO¨¤È6:úUò¨DOm>Æ_/~;¼¼Ï¹äu4Ñ›GeŔɶµ²xõ@[ÖÑ_©k_Kû:¶pôãä~úW_ÜšÉ&¾}ïçQï(%å“ך—A`J›0•Åj.HÔn ËfÎÅy¸Ï’ÎþÍ›µAãä+püÉ÷è) |ОR>qóÊ~7Ò<ŠrL¡: ƒZ37E?æ½"çÞgì[lC”Œ«êtÞš”!éˆ'}EôŽòŒŒ™á‚óùb²ƒè1Ï.Ì<ÉÒù¯B!ëÏì£VŸK÷|ŠL#Ö Ð†±^ê|l©#šî‡z‚¶`‘ŠHóÆjñÐ:|û7£N¶{µwpÔ¹µb«¡zEu– £Æ…s¿SjÊ„ÁepF(ë´ ¢÷PǨÁ˜ ¾ƒw¯ì…yv‘§Ñm*53|«ˆâ½ÃmØŠ+¤RìrÄR9“Í#p\Ð6+¹’â*¾cQPtÝ þÂÐ7ãE(óµ–ww²z•xú‘|bˆ湺œ$ìJø¡×ö¡ kÄ ¿ïu»™¦ü‚,T¿Œ‡ÁþIvÄœd¶ˆ³”‚Gí ËNܸØGÄùôÐBªÑ?ûmϲ"<}'1=˜|£66-lÌ?Vh»k•g|Z*R _*‰`²cÿBùôþNõçhxnVšõ'•D3—±C‰lô,Dž£¿j¢1v÷±Ú~Ö½®}”­SêÔ •TÿRZb 1wÔwÌ2¼ir°}Í 1‡oÑ™±÷ãEn {‰–ÞF¾¿úšZ¢õõ¸o2Ó"¡-”bHB;)¥Ü£º¢¶ÑsM‘h`ÕÓ9÷ÍB_ÊÁ…>˜Q&"Ù¥s)eV¡¶²Í´72­‚«ÂW÷4>]‡¥*]‡#È·v¿¸íd_bãP"ÄQ`ÿBÅùXôãœÌÄŽÒ«!;0uƒ]ÚèWï)u±Ø˜2ý~œ8ƒŸæ¹&¥®Q=Æ“ ­hm€óO®ÅíÀN‰Œ†¦âcVS‰TeôßPÈ7+qÇGß~®ñ8ƺ'‘bGT5}º¹d)-¶ïöó)Ï ªeQ`Äo¸-òj" w¤FÆ›Ž:žãÖªèN,w` t€éfLˆ‚\:Kßeaaoó?x ýINaKxÆ¢ÎîòB¾ ‘(ϰ؜ý±iÙr¶#±6³µ”ñý¸| ‚o@­D'Á7í#Wœë¯'ùéÀNŸü'Ez‹¢]îÔ7\EÖqÊnR4²y®GM~hD€+F®F³yð…ªËì¯ÓªPg=?ʨ7ú/K â<¬‚B;%l5Xæ<ÆeÀG¹ö‘VAíÆ‘òŠ}W¥ôÞºi¿>líìQŽOU.ØJK'õÔXm4÷àý Çt•‡êD ŒÈ–óšX?ôȼ Îž¤ÉÆÕFEÖVŽÁbÝ_²|sÖŒÃÀ1±uSúËð‡Jx(Û——è½õW׋ÍÂóNp}¢œœ”…S?ÇCÔÎj#TµBSÓ­oR^ŠÆ®Öød+FŠŽ_à.uqQúÁE‚¹Õ• šˆ_¥•C"¥ËY„¶ Àðôþ=Ž#¤²|Þƒ Îøn)ãèìŒ~ÓÎ5Ä0®äzáÞø¯Ëò¶Æ6jاPÕó‡GÙÆñXÒ´(HÖº(Téû£nĨ«!‘ß‘,í€ÂÑ03ΰ=QÑ?$-Ë&Òglž×n…¿ç~U©ÐDeK¸øÈ¨9Â7lʱû“í¸Ò;“¾™•]x.0G2Q_>#„“Þù¥þªÌ¥G ;¾3G±i(ý”v÷8Œ'oT)è}°êÞ¨VÈài´½l8UÄ“æµf5^Ý“Ó6ê}¨€»‚¹âSÌ€á.ôC7ÃYÜÍSÐâ2)zHmÇ»Àù¤–‰³:­|ŽÇdôÛgÒçë–š»<ü(èòâxqª>SHÙì¦SKû—ñ‰#ÉÙVê†4ßñçÞ~¨ý¹%Ò;‰|hÁä¢ôÎLàH²ãelú\ EÆÄ1½w•êÌE©‰†õZRF×[Ðãú¾nV¢Ã-=ëH©íÞ¶nÎÔÓH‹œIA¬*{bÏ;†oñŠeÇRhŠí1ßxgKŽC? eÅ´&vš¬˜­£Åý:œn»èŸŒÛíûøØG'üðök1‰?% '@”YK°/ÙÕêP]Ëíÿ:Àm£7{ò Í¡ýŒÂ«8­·*2d6aø.¥ÅM|u\Åì8vÝqõâþ„a¹b󳆈ð¨-씲¼®?émEÓ›àA/Ef¤ÎzªÞ,<Ã2êXgÂwµ[ÓÔ¦TP#0T#=Sæšë?éãÝêá®áfqÃ(ô¨/PÓj{ÚC)×#úΦôùTCXúºî—¡iq¨¾‡^Jív_û´€YgÓ¨JZAü÷#NVXÖýpÏÅ9æTña܃}•ØÒªr‚Tú9n³ÏÖÌs„t˜œŠŸó²&tU¡ˆ`ÏGÐp+ºÓ‚ÞMp£MøçnJí–)(ë¢-÷~\Å8(yÀ(ˆ®þ(ß=R :¾¦T¨}íÁJ„GV$‘zOÿDäT±ÿÍ;¯¼ß^)mJźžÍuËEš\«‚‚OÃÞ.“µÎ_àgi*oUv®Äk!KO£E>§Aš>å¶´ Þ>V(ôáO|®wó5ûתôuFL(&ÌpW^ò”ÐÊ®‰ED+<ƒ¡8Ýð$|”¹@Ñfij­r´%ÎV¥d–C¢¦;Â(ZF8°÷Ô"Ýïe­ýjZs%èÄ@œÉ^)ÞÆîì‹v±A(ß̦?Þ^ê™ÓT»7ç©aSͳkiÿveÇØLFf¿záí²“¨V^qq>ߋߞ\Murt_ 9)é"zwRzˆù˜Œ¹Ûo•C-Õ¨];Yhdl¹=.E‹¨ «\;ƒvÍ0]ˆ³E…'+?-ãÁ!õ øòÄP`ò雕–c@¹"ÚúÜÄ.·³qã(°¦tR¨ûmJœ‰ÝõxàvÉ/ý¼`Ï }ÜèúÂVÄ¢†\„}­ƒ—pä±Þfhâ½>Óp=T`ñ67塀¨²äˆå£é·Þ2R¬Ýš“ÑäÎy¥0Þ?Ø;ÔVü ‘NVe³1!vºv"êÝfJ“ØìÅ9ÅpŽ9Öä“÷3/Û;'´ÓÐJÝ×TÌM­,~í{wZÄÍrÏ çñÜoÖ$µ’”6¬– -ÅbJ§;9æMÒ‘2 Z‘4o5êá/ Mµ±WÛÏkÝð‘=vˆ'¶Ä²èÕºÄ)*Z"øn¿pzr0é h<ÏÕÈDrÐp-¬Šç½TšÓùÜñaÎú/L+,ÙYXÚLÎLiŠØ ÇÖ't£ÖÏç‘ô×U†ŸÖÓRxµ;cZ‹çîòYĘñqp”žÖ<\9ÆÇ~ÑÜd-œÖx+HgÇ~T|.D)¥HuùœQº¬C“|È®T!ÜÙ¯0>Êî8§õºØô1Sä º¿€8î—@›à†}³ª–$&É ÞÖs›†` ú9öÁ“%Kz Q¥Äf|ãÑĉVC?8HÍÓœ|Ë­Cïþ„;yBòZ±¤êì9»s$n1Ü®ì9Ø™rŸö÷‚OÃx‘éÌËLö°Ð™2˰sÁ^z¶÷ü”·D»åì1B˜"à+/ó7ιˆ¤Ê¶[Qy/syÄV!Ù¥Ðd`†¯¹ÃØù!§“›…{ZÖšè΢dñ1YZ#ýÓ×Û'C_àÍt=²¢ ¥‘ñoLù¦›á× ”‰±] l;1äã˜212éXÀÐÔ–B/ñ<û®°ŠÞMÓ÷‹Êm:ªéÝ/õbð£>tº¨ÁGÛè&ã‹k1^ ÅéÄ»DsBÒÞú©OUËg’†àdežÁ,仺¢g}X?jx=˜eúø£¯¼Ü$=|J ‰&Ðø•ØyÌ÷`¦~Ë6F¶‰´øLökÇ¡ÎBh0L$áÜ_躦~JSÈ8:/–ú|—± ¦Sc˜r¶l£R Â)Ÿ Gµaò2« +ÂqÀ¬vΗC¬©…ÀZnäÙc¹xéo°%Çç(!ôè Ìèi~»bÇ/êÊ€GE?„›ˆÝƒÆäˆ»tŽôBZÁŒ¦ù „dPéɵR-r€»¹ÅÖ6­õ G–‰U§PzÙÿ·x¥Ë>팤óŸDÔŸp”T™¬ÙŸ´“Š( NW xÁJÆç¡µÏ­ò&ZŠXUKÈâæÆ\6­™AôÐËDR¿ß Ê ©q‘[âáÁðíéo)côíG\î£Uˆ®H–1 xðb%Ih­VèÖ"¢ pQ!jÎÀý!_^Í3ˆ,5!–ØÒúüƒO /¬åErúLâàÊ…2FKxŸ>ÔH"ÜoPaê1íhû3Ãû@PŒ³§Î…ù÷ÈÇâgå—[ò%¿¶/dmÝ6à éaè­Þúð2¡ ²Ò%QÊ"F‹Ì‡@ àÙ`6QÅDŒ›8ÕQ˜3(»X’,h°`;Ã0ÌžÑûÏ/‚ê‹^,Sé—-Šœîÿþ®C6²CÖ/Õ3Ã;V†¦R‘õb4G¸ï»/4!§mãô‹µ¡áßÙ¿q§ö©1ÿRˆ¡ R}½n=<È)<ÀJ “câ<©Õn.¡Þ94Êš¬´ …íöL=×QͧàýRÓKÞ6Çßµ€î™&}oq0ÞàæÉèyϵðIÝ/ÿ"ë36(E÷R͉šÖÛÉJçˆWÜÈ¥£´ó­5¶L±tïzœjʺúp¡sL¬Q_Þ£€´—¨HŠ%"ƒ¶ ½‰sY·y­.éºC^« ÅÇ®¼xœ³í3*'^$hAi–e*~{rÆÅOꇿ¶sF•ûXïFomk@²â½(õ,¿dã[iÜ 5µs=koúÕ þS©¸‚^! [ñ®w:çç!Ö‰sòš¦Wëy<÷x´ÁK0Ÿ€I*ëË–…f•ŒíjâK“ÂϦ';Eˆ¯'š¡¡ÿs2FÐ¥qAÒ )ƒRßáùÁŒjw @¦‰yG†râjáªý7L`%KE‘ؽ<•&4öP«8o"ÑÚ¶©e£´¤’`Íy!òů)>ä>5ã;¨×H?åM’©~1fx*ÉÁeÆK½Gœsw¨÷fZÖç/–¼ƒQІ"zö|¾ZT9'tˉ%Ú”Z¶®!«\žgÚ±×0Ëœo‰ ?u ´—ècOw­—h5”û‹c~ÅrKyGÏxÞ\DïGpÌÖÅ•h³º@z¶–Dê÷@†uîlÝ#Öð`¦äíÝ›¨(›‰ŠÄ=ýåë¶Œàn 5‡ ƒX‹üŒÂ®0¥{˜j"ñ­ØLØ?Þ€½„  ]¨Ú-cýIΧ »£+‘4¦Ýä;—¡×DÉVko¾![ ‘ëÌW|u@f_#up% n¼Øˆ`·’ߢZ²",p_Nßÿý‡~wÆç:™›cýE•BVäêC;³ô¾ƒÊÚh¢:ÿiJ# 6#›'NÃN˜î]n”ùe¬Ì5÷t¾HˆA¥£ùWÒXݲqÇ•á *’•nîÌ ÛÔДµêïôá¼²Z í?Þ«Þb€WPˆø¹Î>ðËÆ£_ÖôÂÄ8Û›MnÕï"9ÉF]G{™àü–î‰?üоÇ;²¨Z|Õ&(Dxç2xa3)m¸ÂçÉk Ín(JSÜþ*g±!Špvz$`sy…¡,J·‡sz2ùîc›€¸\x>c[™QîRoêud {[mŸê/&–éçïeÚ°”Ï¤ÚøEï-|LGÓÈÕ1ÆÚ9(¤ËT͸¦ÒZ°&•ö©ü›o´áQ@Œ³uÍN¤€#ìÞU8íÖãO:êIT[m}'aïu¢0å:sÔqª ä˜îSmŽöÖè>£L—êçÄÈ ˆëè$üíÌbI‚°ÕR 7GDÉNƒˆÃ𸸦¿Ë=5É” !†ú º>Bcdæ–±äD§N¨8ç÷ɧ0&`8Œ¶ Ò&&£ãq†kh>Ìðo63IîŸç¼7bÛ°}" kyþÀ¡Üà 1Qì˱i-<ôN¨Ô›¶ZÞRÊb2UM.t¸•Á¼Þ€®½¼ž9óôÈœ ™m#¦óÎÐi¦w¡Ó¢rÎI2Ê'”\}­.*»Š+ëšÁ¯=ëÒz¦ ˜änÑ&Rk$Gnx>cÜ^S=ÁÒWŒ/Ô](·ŸIûi`ó^¦°€0£ýüOa²RRÃÎ;Zß»}…emŸ®ã\íð{œ®%/V½¼ê»1ñþÌWùø§,‹¼_‰Ë½ i¤œ‹áÄQ.h)\ææÎàØ4c}’Wèk •FâG_ Q(9Žôz09Ó_–_að$m¨0;Å6‹AߦFlhBH²¹=­9ÒOX¦O@ÃíþÈ`þSfÉ­C­Õ2¿)^3b"Ã9À…rØÐc2ûuFæÜWJt¯ÌúÀ÷ÝjË㺪=Çz´y5@+·9~èi ÿwÜ‚MÉàcôg±XózëÚ§ß`˜˜Ì"M~q:C4·ó¶öÞ­GP¹¼Ú×ιñÔ= ÁP|ñ‘Cz{öŠ·l<¬KžSžöIž6ŒA¥JîyËx1æ6¿U4À=ì™ÔùÄf¢ÞÉãÇIÕ C´H‡$õȼ†Yžœ/*Ê OÅ gÌô‰ô HÛØ'6ÇJüûI?TZm&¼Ãéy„ÖnQœRÂáp”õ°©²:®t<•[E‚p)K/@¶¸´a¨"h}´rþ¬zfbR[Dÿ=D͆„±ñæ Ùf!C ’S­kù=Öéó•z¶ÐÐ +MßWã>KÑúu‚ý6ADZDò U¬a,ÒXìx‡¤Z:‚ õSCM´åºP•1kB«E.¿9˰3:knó¬±"²ØçY:<,£_ó`ZYM—Yêâ#WkÚîÔ3Ù‡‹ÆÚ”w“wàÖÒîL/È]üŸŒþ•ÕhræF4W1<Ãj…ø,NqÐ÷I‰/;W¥cTÑF5Fƒ£ Ýz7/þ›ïÙ!—ÓÊþ[ø§áŠ,tšÁO|6Ë'Îï<øySža÷}HKwsË’û§ÔÞ& ± è „6^ÂS®ušE6¼æUßH—dîüäûQ{r')(¥ÃdåwÃÊw 8ÞG*÷Ý b1Q|æ ü™ÉϼêbVgªá‚)ò"xR ²:ÁØÈ-t¿„N~ 9—ñØ`ŽŽ‡_àôðÂfD~eq΂¼·î²t× 3…¨Z0|{ê \0Ô>®)ÆU›öEt®”ì-ÒÞêˆ-¸ñ€Ónœ´uËUù¢£*éÏð=t>ÓgË1±Þ’Ö„Hp“Ì$ÙÂ~EøË¼¶Aµ´€Šu¡BÌÉ’7NñŽWÿ É.†Ê?—Ó—øÉÑdï.šâB™éû—ƃ-Wó&úÄHºVz…×zÀzÂÍ"­w7¹/gSÔhMÐåViÜÔ2c§PÎ5—hs"¬Ìƒ—Ê"A(&ö@!ŽZë¬ïÖßÁ9¹—Ûè”룰óú]X**4Õ,Òq(3øsO¦§Ó†¦H_ƒéÜòÒlË^+öcx–@$ÐçÑoÓ;äãTl´¼§ˆ'“'£‡ 1ˆO#mgÛóÍ߯$¢õ4OEŸ‘öE Â™9—æŠø§¤bÇoêYI¿âݺ(³—}¸›ÁH#.Wkì¿öÜÒã?÷1žíê96»ø@t‰"*ôc 7_y¬h/N~êË(øl‹9KH^òc»sǸ0 w¬‘3eofuÜÇÂÊi/Š{Ô:™¢d©Ž‘-sóñôÚV=ù.ËL—ˆ—¤_Vv…ÿ`<ò³7²WƒÉÒ6°’ü¡õ‘€p—3þÃ`Øož÷Ò.I&¸nÄJü\.³`gc„äÓ{­0ä‹þ›W­OM!×ÕBF ñº÷¡Í‹Ç_-·ôyäÏ I ÊõÛWKžä„ý •_ƼUMR•héWN” Jt…D½ dOdKy½y£ aZtÙÚùž€–×ÂH(ÜÙ~¯ÞžÌœ†E«×ikÙÄI¤„&‰ðm“{畵í±´|ÙR[Ÿ•kQ".²‘-ŸËÅD±eÙ»¸ào2xjÏÜTù5FŸ!³ßá'9í4uø7h¡iÙ.ÆX³ÔÁðh”5‰AxY!‚£}”ö4ßö´ØÄ¦ŠÒ`Sªß)4çù›õo$ß…»@¹æç-¥é´:ßvH`ÝH¡n–¦« žø ³/µ)ÈLÒ\ˆ°/vxŸYµ^÷|, =l,äÜóÊÍ×z_;$©@ P¥Î °ÇÀ5Âä–×…y2CúZã9ë¥ü â9ºK"@°G¤ä«ø°ó.:þüù‘_’°YS$£$—$РM–LynD½˜¸Çýá‡Þx GÏçJîbJ¤Z©,Vw¾ÐŠNËÒk<µÎê¢[*Âè(Œ'Ü\Ï¥ ¥–ƒ–‚vÑ0§ÇHüSfZÝ&œ_#ËW[þŒw `úÕȉWÈÖQ¬ÖGDëø}öÉÀÍcóÙŸKç>¤œ6FŽš•-*rÉÖkÕ®ýÕ^š; æØ~ÒoK¶_q:ìN òô‚Ï'—rO¶‹Ú%ü-ŸáMhÌN9MÆÞ¾P3 Ž™Úïìµv;àË÷àÜïh^"u¥ j¯»òv«µ·øÑ%íZšÊêüiDtBßæ7Õï‹Èý¸~ øÒLyH·~3šóVyÄqnç¿öŸhÖì vÓE;‹´vðh¦9v­Ò½¿/ë˶—öDÒ‚tù ~ °þ$ÒÊž´ž<ÕâøQŽ2W\»!–4qÈN"$æè?‰’3ð376œýSw¨A…Õ‰G%„øj²Ëò³}Ìã°"'Ò1cÆÌö“T"¦TϦ[\è3¡t¢éÄŒT–Ë8¿E/1ùJ!›õŒuàCKæRzȽ¢ÂdAŸ~ìÙê­G™ R°ªcî ݃Fc¸SúuÖšƒ,È<ºI‰w6¯7B¿ƒPºÃ]$Z¡ÍÛû0v…à^n*î.Ô±YžÏÛS*q°i‡êÎOCcÅÌvVw€!Öûv¾o‘@2EdsF:œ`«Ÿìbp™Nçmüfƶîç“ñ$ÖQ ^Ÿ©0W 763$iãÚ_2Ž3”Rd/èò`YŒŠ3+¿âKåS[žH$ˬ VńؾÜJóîj¸t Þèç=‡X¡¥Ë‰ü„?.5,h©÷Ýk ²6löŸzŸõØ-7ŽBÅÜRKáÏ(n+¼¢ê²Y$þòƒeÓpü§¸b‹I¨Ô3¶þ&Íç£ùœm¬Óþ•o͵ó7f›E¥NìsÏ—ò~íͭͯšC·Ôó£‹ô7NÃÂç·܉,>™sìåýaq×j‚xó!ìÙ$ Ë“HŒ“7롊 io´…PcÚ…%c«†k}lÄA~Cº0-wðºä sÒ¤©b‡W±Á6>o†vü '“ïS’‘t(qE‡ÒQˆ¡ÀoC÷¾Éöþ¼Ë#aWÒú[Å3q‚Ù bYèfv° Õ¼†À»D^¼Æüñ‰0h‰~[ ¥,~¤ÏÞf>QÁUƒ^%ØÌîTõðhf‡æ Œ¢›§.ÑõfkÕ覔ݟ­Ÿ8û~µhc2/UAÃXf¹Îm7×?BÛ•~:2¤ìIËf@ö×)ûã3íHuÞÇ@þ¾è^{ä·î”}Ñ:¸WlÜ;U¨” Ö‡‡ƒÖWá¹çûhT6ýùOjJfmrMïÅ+NÎ<{žnåŒr¯ ÊÆ51MtÑ_²¤¼ÓÎYüldÚðu¤­új¶Üµì–g¼nþ¯kgž8 ˜޳˜û%RµÒÂ%ùª.o,µ*›)„itò½¯ ë@dÊ4ÂòyÛ+y;™³Ê áÇÑäšÖ'ï_ÌŠ1ã~þ>AÌ­¯©ÀTÃ\y>¢;îìБ_ÄY]Ï ¸ýe–Ñ\ÎÞ¤ËʇiÙ|Ï»CÒov»Zô]‰\g‡Æ|â«ÿÃWa·g¢ç=äcòKx‡°ÑÚ?¤øVR>|žšÓ…Ä(©z‘* ý¦*g& ªñ'ô‹~¼ ôV¤àš’/¿)â?‘=ø‹ƒ ]B0×.•‹ qIØ6©c…§Óph(ÖeäΛ1VŸd•8Þ~èÀ `+Å$œÂ0=_7Ú3«ŽÍí ŃœÃ] .èôVR¶Ð¨ª­/gŽ+&¤3É®Vh!¿fg¶ãá™%W"%Ó^Ø>ua^b$'®ÓÒKCñchŽV¨&Â9ß…1„ÚÛ TË¥¿$I^ê¼×›¸ö"Kð¤üþSa>a[ø»Šk‚sÝãDÜæ;gb˜úή†…ƃ|bĆ(-ò´€?Ù°ºôÎöc¨·•âôžï›Tb5cÁG{´Šp®ä!¾QÞ”IýcH—Çð™¶dX*ÕæF½p‡ÄÌ‚‡Xä¼ÝûñxÁÇe•ïÄ™Acº"SuHz±àÂDJ Gì™ P•É|÷Û|nÖ ßwò˜t³¾ÉJñ> ÇãßñIš«±FÐ3Þï Ð/òµ)Qî5ÌxÒ¦² ÇÞ”¹)µÒÜîÒ¹zþÉǃ×|ÉÝTñ‹€… -? gÖ‡?2)óË•0°UÍ¥¨<^‡|"RÿäL^|˱Ÿ| 邯÷Ø+Wå8¼ÙQUwôMåE»cªõÒŒ®R‡xSs憩;ÊåûÈ¥xç·˜ghâG#»ˆ°*Ò Ç¢+¹4·÷E“Æ·÷4[õ¾l¯ºb£dIè¿ê¯ŠSþ±ËÐ`?;y¶â^b#o}ÍsQ‹Žù¨Õ>ò¾»§±Åë+Ó¡”Ë2•稶G ò“ì ¾`V¢â‹’¨6”ðÚq …=õÃã'AzÂR‘õT?øü/›[¿Y¿>@Õ3CÙ-±ƒÐ¤2.i.L-¢øW¯:Œû0Y+·bÐÐ]ÙÐõW[9ø]ú´ZFyüÍV˜HL˪r;]ZSž±&:®yðöçò‚ÎÑj÷M!Øx‡ºb‹òi^L7’¾¢`}ÂÞíŒ{É`õŠÞØØ³ÍžºaÅL=ã}QÞ÷¿á0Ö˜Ð#‘}Wd]l &‚cPÙÒUj4/²cÞ¯Tnh™ß¯­ÁŒ× ~ïv/ظ>Âᯚ Ë_¬~ð²ó ËÍ­Èe„úþ Ñ‹ IÀ×Ì©l=­?n³!Õ[gex7ˆ<‡þBÊ×rÕ “‹eÒNBT%6]KuñvŽ&Ζ_mH= ÆÔ؇âBMZ7ŸŒµº‡)Ñ®J^3Lñ6½D>˜•~UM8{9–u½²9$<¬­i¾= 9ûu3@Ø„6U;‡ î±*ëJu£!ZÈÈüØ–vÊ?Æó™ Ž-þ]”˜à¼ìÞwôjÔPBÙ>û™çße‹`:~¯ü ñ/¯‹´ï;ê7€ 4 ±µò’)k'FÌfwˆ·Nµƒ–†£ÓLž›ê•ò`õôí²¦_C,Ó"‘|Pƒ.qË’Ùéä5;ì´„–­êH¨Yy>~ê*Zn>`%aö›–±½JõÆWÚ?gV‘ßõÌšŸ©Ü—ö…?`ÿâhuÅÛFWÝYÍ¢«Ô7Pâ˜ÁˆñÐ×ÉÒ x#éË2ÝahB.4f ¹[¦žcÖž.ô¹ãëÉõ_ÓÓø A¯a¥V´(œ±“žÍŠBza/â@ *ìÔ-R0ƒ  žÑ|5A÷1òª¬ô) óQZÈ©¸¤Ïâòp=7Ì‚d¨MV*p§²7–X†K“8/ã0lȌʩJ IýÍ•r:žºŽr“ƒöb1š+çàÞGe‘ÄW‹.K‹ðÒhBàÅb”v)b ?uÁå ß8þ:ø©Üã°+!"z9 qG[‰¼|É:]MRüÓ8ôBΧÇ%›p‚œ¿=Aç3¼ÅÌIr?úÁ…‡dìªïà»QçÏÝXÄ Dž0:ZWá‘<°‚„=*þV÷ zÅ ÍŒ%ÍY¢OM ZŒP¦FtM1l½}ZãžÜWú£5£¯!½“­s2ŸgÀÕh¸Üu§ŽÄ<´û³žáWx‡b—‹ŽÝ8•åAA‘¶ÉÕ}µyýh;}k¬»©zDkåhJ'½óh=0éÒ-¯i×™aÆ€–à">†¤Ñ»LÜì$µ&ô9O¨á¢ ”Û)XŸ5n;"L/âYšOÝ ÿ±róÅÉ6ßñ‡^‹ÚÍÏ!¯>ê\³ŠÊorÔÁ´n¤§ÿÖ#} endstream endobj 1017 0 obj << /Length1 1625 /Length2 11761 /Length3 0 /Length 12600 /Filter /FlateDecode >> stream xÚ­weT\m—%ÜÝ www î®EáPxpw'`ÁÝ‚»{.ÁÝÝ%dÈûMwÏú¦ÍôZë>gŸgŸ}äž»Šš\UƒYÜl’;º1³³° ”mÌÝ]5Ì™%Àö’`G À;ÀHM-é2s³;J™¹: €àà°óóó#R$ÁN^.6VÖn:-uzFF¦ÿ²üu˜{ýò~ÓÕÆÊ@óþà²;9€ÝÞ)þŸ/j€@7kÀÒÆTQÕ“W–ÐÉ*kdAŽ 3{€ª»¹½  h9º‚è–`€ý¿à{–6Sseyçw˜\@@›÷k O Èé/Äp¹8ظº¾?l\V.fŽnï5plöî¼Û-Áÿrr¿{8¼cïdª`W7W ‹“à=ªª”Ì¿tºY›¹ýíjóÀ–ïž` ûß”þÁÞiÞQ73GW€ÈÓío,sÀÂÆÕÉÞÌë=ö;™“‹Í?2Ü]m­þKÀdeæbaru}§yçþ[ÿÊðdoæädïõÏmð?^ÿ©ÁÆÍdoÉ‚ÈÎñèöÛÊÆ‘õï°È;Z‚ìlÿ²[¸;ýærù§@tg†þ]„™ØÑÞ `²DdU»½‡Ðý¿u™å®Éÿ-þiðÿH{ÿÿšûï=ú?^âÿß÷ùß©eÜíí•ÍÞà_Kð¾e\Š€¿{ðwÑülñÝ2s°±÷úoîý»£è_ZÿÒý;&ïfö^qG«÷¦°±°ýËhã*cã ²PµqZ,Íìß«õ]ë]‰‹½#轫ÿÀÌÎÆöo˜¦µ ÐÎñoù¹ÿÞå¿)oÔ?ºYµôµU%$ÿ»Ýú§êû ¸iz9½‹ûß¹(-þóð—GBì ðafçä0s²ñøÞ×.?/·ßòöÿ:+™¹¹Øx Þófcÿ'ûÿýû¯“Ñ¿ÑH;Á‡FÃÍÌÑâ}ÎþÓ𺻸¼·÷ŸWÿ=ëÿ8ÿ3ñ 'ˆ¸4 †Ú¦e¦»Õàå Iôõ°C…9•Ôkæ~w¤EnòW˜>W‡±4L¼¶zý:vzÙýȰ÷£מ¶û+è<Ø’¾7c¦—q/˜Õ¸%ýD'ÖçbNqFŸ‡M{okLMݸøùÉD;§ üÅ} ¥G~ 6Õ½ª?0µ.§½³¦àø„&ùðážv`dxh°û ¶w—ˆ1;ZÐ ÏÿË1yŠ›—©Ëm=ðöɃGáæw\pÖSÓc•õsÓ³ÀZi n ›¯Ý!‘}e  ÈÃì‹@>º!Ö=}.V•ÞWʘúÔíC1&¥ø´™þéSçìâ÷c2Q!¹q¢Ú³;³Â´Úø^ëVegkÇA™P8&¾§yJ  ‹³K¼åmõ€a~Ö/k*jOŠiÞ¤ÖË+È ßì$áYcìŠ@KKì`ã\1T¦ó>¤tùí²· }*ûÒ|週²n?0‚ÀZÜr`VAo÷=ûלl©S»þ®PEöé¼ ¦OüQ ÐçÒöô´²”ÝÝ*Ý€—»w†6Ó…'`.ëFø;Œ jXÏå™4£8k‰p´‹^‰VrF-J´3ư0tîÌ­éN½=—ù«CÐÏ4¤G¨» YU[›µæ`ýÚYðø%[×ÝÊ}°Öåk§W- IhpºbqnÇøËQ •ͽ²ƒ{ )æ\7Gßij#÷"MÃÔòÌháW62Ú¿±w•q7Xv{Íl3—Yá•oh:Ú}§’¸Ãýú€^“鬛 }jé!ß’Ï亡†œO÷ªA„Á~F_ÞǪu®Þï­µ«ìÃÒA—¶<`øéHÑ8‡òZÝ–ù¹UÆn]md9¯’õ{ÐÉ­ñ¥¦€ï§Œ*”M=Øû&{ðŽu°æJO£Ï$/M™Ëuiˆ°÷m½·»sZLiGó¥Á¸çƒpJÌ#ëÂ…°:>žÂ ÷ZZæídêŒ9“¯ß9F”´Ø7 •e7æ•_˜ßH˜Æ³[ÛNWÈr¤)†[Æ$¿pëpË5jP¹upÒýVÄò%×ué\ØFÚ}Äï—S88ÔÿŽÜ”êd-æºUÔ2w‡5°Zi ø/ß\$.Jù§Bm~dvt–¶„9DX³Y·Š5ØË2–¤ †£¯‡›ÉÊüÓé£Ý9…ƒÒx'“,©PPš‘±ÀÈ úÔ´qf1£’NZ¯p@ÎÈýü›¬ä4!dð[¾~5ÂrºG*[/øiÛQ#žQØ+eÝ yޱ c½•âðø ¶ŸÖ‰‹’û.zÃ\'m|l2ØQ™^> öŽU"Pî²¼aº1rÆŒ åÒØˆ™ +ÝPͪ5Ãd×gº¸F5ö±…Í£lú…õÃ9L!?%žÂ`o"ƒ€÷„å„ÿº ¨MbñîÖ‡aD'nÍ4³Ò¦_N!¢ÁS—9þ(ü‘ŠáÔ£•ÜŽÐh/dÇ­1w,?ÃÞz(`ÜdÄù"È-êõOúM>󱩴Ö«V‡FßþŒ:9¨ Áak¨8ðìþJàíËägßÄb—ÌÚ³ÆrVTÏŠÇ}²¤àa./ îíÏA6â‘¿åÎ vrn€"Ïœ‚ýè<÷in`×ÃÂTVÊÔ’Óv¬êö܈/W•Œ±×â‘Ü´Àk‹9õc«Q° ¥önµbóð!»§VÐŽ‚6å pàYÒ³Z8¢êzð êÑr1-Ã{ؘAeÉ͸¹“M­AÂÁ øè¼®dE7ÛÇÌgÃuô*Ñî,H >&uÒÖ9ø½ÆÅj7}»vð€>t·~.'ˆÝÖír¬•Eò•”'À´-@ô3zw4Lº:qzSSëÓ¨4½–¿ Á²»qo¡ÄóA«ð‰¿,دËÜ(w{Z$áËöµ^ñœíˆbOêIAœ°ÉL+9^ËÜ=§æ¿ÁÌ9-™w>}ÆR…N.36@Q ¯Ã‚ÊrMnÇ:Tóîžvm•Szc_áµå…èçÙÁC#ª.î1'ìºË’82©„¹&›ÐO”½”ZÓ¡´0þAð×— '#*¦ËQgÉy)a _å>K.‹å É‹³ÊbÑY âc º%>¤Šþöh–fåL!ÊNlD&„ÐßGMÚà]ÈEırùýÛ°@$% ;–Q3wo…2HâKMG^NJN.à Tp¿ Óãu*ïµ÷U¶<á§ÍåÄV^„úÁ|Ìzu"v‰8>MEPÓ&~mFûÆèì©]kBòlu+Êö±Ûí/ÒK3šiü'ÌîX¼ŸÁ!)ß´¶Ñ†¯`;dô7ð²4áJVÑ5tÇÛ8á:h˧$usbƒ†‡C¸ÄGÎ"Uù0(ZÂV¶¶tŽÔOô÷û’g‚ Žžëõ}= Ë"ç=7ù}Šq·‹`\…V¸ò&}ùô*·W̶H'¤Þ<Âùë÷æd¡„-xöÎ5M¿·ÂÌ‹[¾!B¾ }5£éA±j÷”›Ú°ç$há&¿Mx¸Ã5 •KƒU~ vˆm9 {Y¢G„o¸QÌÀÅçÔ±Cd«é'wnkÑóËÎ…`Ž«N«);%·Ú=ÜΉ•Kú D É4åTnûG' éÖÝ#n 1A cDõÂýxùv™ Ib‚:¡®! wš° ªAÁ©Ö 8O›g=’{«YÐó‚÷éH¹H°ÑĆ\Àx„|,Õn‹s-Ñ']ËrLJK9~àîú:äyÏe+Í×,²¨“ ¿ðM«}͉a±ü¢\ZÄ‹Ç>›ˆØä´‰LçgÔCûÝÉßzO {LTC¹-È¥VÊCý¶Ê…Tˆ[iv)/7»é]ê†8¼¡u–³.wæŒIôÓÅûEÉeMIpqXe´¢»ªÍ/QyÝ ûÊ#È8fð(á!¹…€ðÛ©•U$kD¤(HönÊ^!wOªþ\xd ½$ü¶}¬+ªßfÇNúÓ´4…ÑxS}Hy[egZ<›Ev:D°8X5ì})œ·;Ñ+ââ‹vx ÙaC'•TMS (Æ–D4wÎ9ûÙ|H@ü24e5ӜӼ˜ðàƒ›Ÿ<‰yñâˆþ8ºÀñpS‚ÿ¶›| ,¯”¹ä^ØÍŽ úñòjï^ÀÙ%kö3C_ÄÖUÔc¡–gÉWÖ1lî> õd5Ò ôžjrÝ^;Ujg&È^¬HrÑžn†]ü…äª3y’)ȹü÷½É ‚ÀE‡ʾÿG9u4„H–™oÅñeÄ»mD©¥ô ‰Ý—gŸJB|{>Þ4·=¶B^áÏðžo÷DªQOL%¿Áè9qûÍÎ<Å$±8©`âëdt便 ç«Ò-fl"¬¿ª…­B¯ý4ñ+Eú5Šm#)$áßÝ«huŠyZ¬j…¶šŒØ—у|#•©¾uõ¹\–»f%Ù§o@±ìÖaiõ+›9{-)ìÍõKþ5ÒëüÜeCEw“9u(ù«iÔd£=¸\Õ4y•Šo”^ä:p᱿͉ۘàBvGN?œÇSõ¼÷öN®)»SHz5‚$ºp ­ú[M¨’Æ`“¸# ðIZ>nùºBК·…—…Ô(Õž³°·õŸŠSÅÇåëԼόVÄùþ‑¶ÃÙ.rh3+3t®%¢K§-&%ìýöœ¯%Ñ5 ”8øÛœ× ®´ÚÛN­Åpšc¬ü¾/VÄë¸'d¾W!i™´2¾®ªð`Ô{]W~8®5uµƒ?6þé¢qVÁŠÓ¾Û&_ͶËl§ÂÈç8Ü(æEó˜^ä¸1/~h¨â “¿>vÞ­ÂÒ²”Z™ìD;„œ„ϵT3A—°cÈÁ¬ì.NÎàA­NN=™ò©O¼ù>ÅÊù*×m=dŠÊM¦(ì\5'_ÚC¼Hÿ•:/Öˆ©A2cõ¨ÍZì:Ò02}-jáÈÖÉ% ”jòªO/ÎÍ!E®aK·ëí}Í-*ÅŸŠ’gæÆ§ÒêÏÿÑ4H.³—¦öÉ™_pG7÷xfã!F#=ˆ~VÓƒóƒVÇß9Ö꿎z¦¥¢Ÿ¹h‡ ð¼D^½°Çâ1ˆ/Í£ÆS©h” Œ]ýD¤®@ߌGr„ Rï+³‡pò±äï™›_ºªùx¡ýÑDnWÐÌ«¨-«½4K_~mÁcmÆ® .–oO•ƒúÃáíšjÝ<$±Yi¼z Âù¬öRQnÒ#ìÊ´ßDïâJž<Uî& yœ ù;ôS–ôPzòio¿‡þ´xŸ:~£9«Oê&b3\Y%TS’Aƒßa:úÞ¾95{ïÒdqÀvcÑa ­ŒÅ‰=ªFÁ´=)C¼Éf×< ë;_LÜ$(íqøž9Eã†ÔŠ?äÉ7²}™… òcÅ·7U3C<Û;y©íT‡ÇöbÔN|EºƒR®žûÔ±ïwœ˜¾O=#8\T ¶>ˆ%ýF‘4Ʋ<ë4Œ¥Lã=3Y¡úXÆRš¿Ø[nñTé¥>ò»#²­J¸Ãm’) Ùã©ð„Ë5q Eräóž“;¿TÒ®XY¥•ó³\Qolv³×bÖ È Œ™}Ü?~#ò#˜H•òúG4;‡ ¾àË-þì€ãf-Í·ž¤Ìà:5Çð+Å KI)áå{(©ë*'ƒ ±'¬œsi,jª~¢ýõ«_1päH£­ð@ò7åxnYÁ)hð2R°+LÑ%më¾’q1¥kÆ£†½= >+5U,ivß‘¸‡Ñ€LòrõyG&—bè[µZq ¶Ø$~zºØäП»ÛÝâ+ZöÞGF©ÌR!5I¸4ŸÈ3‘­9’$|4XÅÆ‹1ØšÃêíÔ}ÚYÖ‡±ZKh×[&ôø0¹*0—æ,aíjþ¬£Üœ‰- Ð§¦/Sðü¦¬÷y§Ø·ŽD7qˆi.j^Óô,ü Mú$·Ã¯Ù";Ô€B[(B" ÝöAñµŸ³ãEA°Bª-üµ{¬{'`~§%uăöšÒÁ&™&{•Ù$XÒ¡{§ÞÏk“Î$Bo´o&Ï/¢Àˆsɼ8]íåéŠ9¼K·6k¸–@™ÁøJ¤pWú:αs M[¼ŠÝ•» ÿ\ÆzQ³IW¯ŒÐ²QÛ~1ïÙÓ¹/¿Œ`Â:¯9¬ØÏT‰eBvSZF÷ÍÁØtÙÒ— ~©¨aÎp ò3G—ªÁGQlí%9/V½ÎAua·ªø}îî3I¶žS+ˆËø¦ßu<]úaÄ4¶FÌòƸàlVê?Æ ƒÓÞÑ‘G½˜S9œµDŸ€8Ð'cᇠÉ<¾D‚~eLñÔ±võJø4¾õ;sÁ?<7BEQé/rÝ”ÀXQgEÛ”4W?(ÅÔ ¼ò¢†Ü2*2XC×½¼ëK<bÃÔòùßOaÚôOFçU_1r? {#&“|êÇÆqÉÄúÑa„‘³lEƒSÌ1G¯òjæ.;uc[yõ^ƒ‹0dtRªÑ#Ô•QŒì¹ù°æ)OðË®œJaCÞæó…≮’ö¸=ù†ÙÏÔ¬¾Ùýdê_ÈŒ‰ÅÊ% ±aÒù WVf¾üDýÐ%{ÒIÝ‘7ŽïHòvýE=¦_‹2sàIõñl\¹dñYŸôtŸ9Ÿd^â£+jìãnºÏd®Âž6 š­Úý§mBZA¯sL;reŽÙÒ÷¤?¦Âê„X”]NElV{ørS =‰J ©O>·´^5Ú›P·’‘pކßvÐÅšIf'‹#âl Tè§DPǔͮ|ÚÀh幸8°D'ÀhêW´£-Bºp2¦Êl7»OõVfåí¾/ wu¾Á(Aï ¡Ý°lýÒ×Ëàþ‚<9Í»€|Ð3üq:†…{I»ÂB9ZÔ.*t±ê°ŠÂÏ{dP euúKÁ:þÖ ¬[.‹l“®ÃˆÐE•SðsŠu¤/C˜£7Í%Bû—ä? ¥P!Õ¾ ¶Ú‘;”eL^ŸQ÷ž´%nR©X ÃènH®PIöh%>3ѺŸ_±ýá+ù»OÏ¡e,Û3N©«KŽ$@‰¢"n”nóO]Eæá¿GT¥½#?Hù¬­ª¹ÀŽzŠÝ¼¸&lNL€ mžþêýø5ËP[8ý‰eJHÖÂçÒý iÈÐuw—?MþðÈSÏU_4žä)bU1Ù„ ÏbT§ ¹.™o `#Iîè3vöÀ6Í!Þf#¡ºÅÉ9Еbú­›Â—ã®_ê}ë’;èÌ#…æObô™Ã¶rS_Ze¾µ4f©¶Â8Áìó½ë]å»gƒÕ^¤Á7D¢n Ýï ÈœO%‡•ÊÕdì/tQìþË¡~º!¼?s> §¿…_s>:túU¯Gÿ¤Ê¾©|Ìï:߇/Z†~UÝ<Œ!¬.F%;dñø¡FEF¿#Sò›|Býø{¬Â ¬5ß8%w99Ú«%ÞmnN;Ü ›_ÉóÔò:EZß5ô«U.Y%,ñªãUàóòÛ6“› ת±Ùt›îžO½{0½®kØšÂÊæÉSÜw Jíæ¸,¹`˜oß*¶?2éœÍpÀ cÆ eX7ôóñ.v3V6©Û‚ýãñ¥#*W }H½ð¤,Ñ ’ÕhX"ì`J–YµO4ÓúѼ¾g0Æò.ئ>–ÄcȈ«Î&î¹( ½žî”ê©ÁÊ€Ûï¥[B‰`д"ærm“¶zõö¨j¸B‘ëk3ñ85¸ê¾_BlÏÝÞËÓ§@ØÏýYõi¸µj1쉩DžŽGílz)IjôLòÌÓùMòi¨h‘ç19Òµxë{ê#äŽÌ^ì4J•šÁÝQ ¶¸Ô„€\Ëwóq¯×kÆœÌi~Ú'¥­ä”úÓ.I/þ¬ã‚ŽÆABªþà:Avþï¬(ñ7Æéý£6¤û[-4ØODyÃ[¥v¾"‚° «Bº%f¶é¼¾,;3©MZ½S+zSì\Æ^B>p´€ù½. ·Eÿs›ýzÁ°ÊTâ¯Á$Gùnv½Ïðç³/“ËtñÄà|ÆŠqGfÙ¶×k#’ù,-cr¹ŽÊ #Ú‚(ÐñŠ3Zr𱤬¾¹lߢˆáñ 2“÷—ňógsµz1C5Lrm_ÔquµObý7‰’°‰¸5•Z”TkA#(qÚC޾¢c笥·V 'LŸYˆF§Nüõ¶®šìG ZT£ÄøRÓCNAlTZŽ{CÓÉ«ùLyi“©¢€z k~Ïîè ÞP,™)p'W~&>´ÔÁG‰pp+EŠà6‡3µï"É ;ŠiØ ¿_¼]Ó½£€„g-·]ȹ:é¾ìñž|r¹Õ«ªj¤‡±9ÜD¾ ©•Þg¯ØÕ›êuó|¹f­æ›–ß•ÛTø—Z.>?__gÍâ÷œw™•¶ÓÉUÖ³ ÔªÅ>ä+UNÆâp$Ä^¦qL«˜AÃOórãã“ið"ØÜnÖ–‹›«Ê­¤Tò‡/sýÃÜ¥–©h$ «t“Ö|ByH—Q…Õõ°"£(IbKìËôŒîªÌ’]öVÈÆB€€JìqîÈú9…ƒÝÒÒXßÈÒR8dî…®$Ú²aÅu†‚ äŒúÑóš­»~ÏxÙøEñ¨¤šVò‚{b Ó‰uq¾ÓFm—‘þuùJÜ[q Q1eY…¯ÆÎKË;!¥"3„àWJŽ›0Í)Ãõ$yL>0ªbŠ4R)ç›:ÈJOxHùc"í}ÞàÒDü/ÄW¨: gYå^Û¾ Z2V“Õ¦ËÝa3ãÐ육;FAkëòòÍþ(Þ2ì­·hÈà6Ÿý•Nj%ÅsBL³7§O&؆'•PÙŒ‚ÎK3ôú˜™‹Q…‡$46 EBh˜Ïê8«HÕêô¬IµõìzäÓ'±ÝÙuò?û›™©óhQó°xàÓÙ-iWœMûa1V¡êaL—!+;‰h½S²\ˆ+á&jª‘k„³èÆ!'Ø/%ÌÙx}F[!¬É )E-Ó¨ë¥¨É v%_eMŸ²ç:ÝÚéyDƒ†pTº.Œ¡V8Žþ“ö…£°P?ÍY—¡­Ë½ ÷$}ôœ}BbcŸÐî÷5î÷D‹XrL¬;4¾˜Ñ ÆS1KÁ¹¾ÐFÅRWÐG‘'$/#Byi0TsBÌ÷]®ÐåÉæn³ðÌ!(-fö5ýj3æ;ÕÉÔK?'øtüØ8õ Ÿ‡ƒÊ‰’P…ÕÇôVú-Չȷþtókzæˆé—É£Ÿ7ú‘âx¥çàFÀd’­‡°È rßBàíã`ÙÖg>'…ؤ|%x>Óâ–D€—§ÁÚÀw¿†‹â‡g¾ÜK¿3üÅøÛk­èŠ ÿ:‹§BC&ð÷µVÁ¥…‡Îz…›“ ØŒœ«:bDîÖtö· *¸æ[9ì#³^«^ýé\ ŸŸ±‹ßS/tÑ.9¢Õ¡:ª¬ÂH:ã *÷úÏS}…ô|#™ÝìïëA …¨ËÆÔ»ÌY„oåc°†RŸªÇ¡²º£¦n»á,D¦ MëGÅ&^µ$ßXïVRR3XŽd,Fg©€4ªé¦þÇc/<Uö‡ ºõaÏMõâó³~0ÜL#¤”m¯Þ†pפêx}Ó½ôÊ)$þ'5ñ ´o1‰û!ÖCAæZ/ÐP2•ÖžŒ5{|öALGü±½—AñLÅ+¿øìÖ ÞÐl…Ø[KP²d ¯hu‡Ps­Ù&¿œbušøfpȉ¡ç}9g¼æô1xVR ¯›§9øïô1®×Ä[žÙ°RànŠ»nØì–uKÄ%âÌ£÷ÄÅI SãnžÏr’zŠFFR½~þªèËz?TN¢ezŸ3A5qŠý!‰$ç-Ξ¤ pj€úÀœv»˜AZÿ9Ê[ƋŇ߭ߟ\ŽF7HDܼ{ Qnô€“+ni¯xÛZZ“O§æ‡§Ðo™älÄ3à'íð1×J0)[´åûÓîN­ß׉ÂWÑ»×Âö½× sMÅ—ݘ/æyO75O é–Ùˆí;»ß¤ã¬¼uŠ"ºˆö`SÕc;äw2·û‰Í…‰x$;þt74‰Š‹C…ëOQbáI|×´ú7ƒÜÇ)‰°ä­›4¦Þêë]– /_‘ø¤ÉC¿Ðç_ÚSR§†r]ˆ²zƒp‚p:[•Ó .¹R3 LP¼¥Ö„Äœz 8î~®¿¥¤c4å¼½²¦=Qé‹}ãÉèê£ù6j­n†h2ÁŸvRÇ#™Y`Z»!þ`vt!„—½%HzkIüi?¶D‚oëËIö!ì%n°ß>ÍñÆf ñáóUž9ãÉø+%·åÔæƒP.Wê’* ͨ áYÔÚÖ’XÝÓíÜï­ŠµRÊGñz ö¶_r"i)hÉ6ðݽâêU}¨1yPoëîL’T,ÛÈAÐ9.é$X ‚bj$Ó² = øÜAº§†š¿U˜nž…4%8ž÷%6 }̽sþ@Öß ?¹7ëcaSWud‡pŽæ]_wʹ«eÿëTäÇ.Ý/‰laÈ¥‰Š¢ß²]ÇI®Ö*qå[m¯¬ädTÁ…¯¹p•í$3{™SÛ¯ó ÒqÓC÷\¯àå8¯’Ÿ;Lwú®µtqAÍú¿ëÓ2ÎqÊÓ™›ùû:_ûI¹ÄéKÙZ|÷lã0¸-3e  …•Р®‚SèJ]Ò–l;`Öo ö¿ÍuÃÈíXÚxJظrÎ È“º:Ïåvé( ,M´»ž,¯ÝoPj’/gýQ˜>ÞÒJ_¢3_~p†ÊN¯¾3“˜Â˜ÚȱêÜÊ4 ×o±?÷Š‘nxz¦Å¬¾Š‰¥w/–2PøHéÒ럧ÀX»()†÷íŠ{d=” Q ë´iÿT®5×¹¦šñˆØ‹ˆH¥îªè, +wÜŸãåGŸ…@%ð,»lJk⦢³Ì ,1õûuNz.µg>Ö0a[2‡Û I׺!›… ¿Uz¯15°\roKŠ£Ê0UˆŸÿ/ŽÆ÷h endstream endobj 1019 0 obj << /Length1 1641 /Length2 7057 /Length3 0 /Length 7900 /Filter /FlateDecode >> stream xÚ­teX\Û²-®BpMãîÁ!¸»¼ih¤¦ñà nàÜÆ!¸'H‚ $ÁÝy$û³ï·ß}î=?ÖúÖ¬Q5ªjŽZÅD§­Ç%cãb Vt¹ø¸yÅšgkw= TKÖÅÉFÎj£:@A&&9‡¸@åp°Àlƒüü>QQQ&€œ‹« bg°è±qppþmùí°öùò鱃˜><ÁN.®Î`(üâ¨àö`€-Ä ÓÒ~¡¢©`UÒ4(¡`ØCÚÖN@CÝÁl[Àé¯ôÐ)äwkîÜ\2î ÀÝ ‚<„½A`×ß'À s†¸»?| î; ¸¸ 9yØü.àÁnëò§ W˜Ëƒ‡óö@¦íâwÁ ®pÀCVmyÅ¿ê„Ûá¿s»C`€‹íƒ§ ÈãwK°š„@Ýp°7üw.k0ÀâîêôyÈý@æ ƒü)Ãõû»N l„Ù8ÝÝh¸ßÎß}þK÷@WW'Ÿ?Ñ.¼þ]îv²åÆáãÈ ‚?䶃@qx~Œ ÔÖÀÇû—ÝÆÃõ_˜'öç‚XÏ ÛC@¨“Àl‹Ã£éH `ýŸ©ÌýŸù? ñDàÿˆ¼ÿ;qÿ©Ñù‰ÿ·ÿó?©=œœ4Îð×¢ká0ˆ7À”—›——ððþ×ó÷Éü4 P‹ÍïÒƒ¡63÷oÃoäƒ=Hýg ‰û œ¨Bß.b™é1®Aƒ†H³Ñ±A¢sÉÉR²C Å뫾”Áu H*×;nÑð^“ŠÖøÝžîµ…¤Øy³Ñ;=o…šÛMµÞôÔ,üýœƒJ|GÂì;üò¬ê<¶z¡ýa&‡ëb¡ÅÆ¥EkŒµ$æŠ×fÜDæÜŠ'h±[+¿Z0 Efö;õÆH¼ßtßÅʧ)s¤eƒ ™atÖDY¥SrΫºÏ?”­Ô®Š"Ðï ;ÂË|+Mq¹Æmù¦~´ý{A`ñÛ7sϦ”¥…—\§ð"gæËêM–£íúž½Ü-}?´¤©2eòMý(f,©‚¦ÆÙìퟪ_û">ùÀj®Ð å‹p,h÷¯–á³Õѽ2OQ2&Tz×T…·g¥„¦‰>š;cäpoúõJáеT¬¯ù±çÙ¾ˆÍ¢Õ縴·"ú§º ¿ð~u,5Å :À·¼¾ %¥x‘ž¿eß¾nóðy³í?ÉŒ©á7ÿ¸-BÙ¢÷¼Vð–£-4Y‹uÞrUîH’K•g®”;?ÕìjCƒ?€Oåº-JŠ`øù1÷'¾MròÍV\9¡ÓøèÈz._^t¾ÃiÄœ7;¢Ígª Ö³}ù$»Ée½sêý˜–q7Ÿë@ߨ×놎uê×ÀîZ•|‡Ö_´Æ}ª•‹A†ÁgÕÕø2®‘¨F=&â”Ø/ß1n•~ŽY¡Ù¢ä­lÎÈÐ’µz{&¿(ÅSòüðD…Éü©Û]âð£—ný[s.W7‚ ù;ÜüŽÌ0;´ÉzñÐý —œºÏŸÜ™wÐýÈC—n°ÍÆñQÖÞ|IDZn†ÍI­²D}\\1›¾xÎ~Áþ¦,àéãÀÕ,½}ÏÂÞ˜^õ­­QCŠr¸ •&Cñ$ýúæ%ºìÖ‰ ’O°©Å°Gµ‡ËSäðÞÑžt –£Gû’¿€1@.¬°oó~`ñË„ahÑžF`…ºpS™``*.¾¢n„”7ŒüÌs–`Æ7 ø°Û}x(“wÛœµ8¦÷*Åÿ'ÝØç"ÆAM qâ+ì}HH=…iɾƒÆ³Ú°.Ф DŒÌrì•îr²ÙS*‚'ºÀ<÷'ã¦Rb4gæ³´‰ÔB9â´'Ò©JÚÏü¯3M®¤(¢R¾Mø{Þ¢kOI•C©µ µ\—JE‘ϼ™lïõƒ&¶ÌïÀ?ønô˜fˆ[Ú[oª<ü~c|¡oD†3°[ÐÙÏa!Êå»|Ëåæ®&l1¥rIöÂR?ÌÞNġهJ¾Y ÿ¼”ô³5÷êʦdàî ÅûºŠ¸ö%?Ê-Ä4qx•CT7QµÖêK*.­gM‚z %Ï€öøÝ¶|oÞ|©#v~‹”ö‹u̦kÖú,M«6µá8å×…¼ë¸²’ÊbL}9GÄ4ò„ X 6רÀ¥W¬šà Yuz-:©L䨡–­M‰¹ù‰2{Dˆ37 ™üÜí;åÈ=KX å×B!Á #fãL´Áùqsý/¾{ÜÖ£·Œ§Ö¯“–eÒ¿z—Ãø9Êͦá§Iý˵ã É—äàw/åq¬b$›1Ù“Æeûp¶ãs /TsFÊé§ÕjMIEøŒ—LÇ¥óMG‘Œ2hÃUp¸ååâQ›§®{pðÔ&'{‚ô6‹TîLj¨Ôµ¾$0ω¢·Çôôh¦(áHÃnø.²ú¡ó/ЯC“c(î”ÌG]=’Â`ß0Kj"ð-q®êUâ׿Òõ;õ€YžÈW߬”{H8u,⹂*ë3Í k¸C°ªjU•îRhwÙ­좳$VË¢ãl2áL× O™3Qʦ5€•ów’”’gØ …þùg˜Õ1ÓÙ¥_5—±XI)IbÑÝ^„um"V{ƒ”­âΧ¡XæŽ:·Ï«ã© †[ÕzJIç÷B›ÅưìÊ ¯¾>·Y‘*èzî|Ô’¾ø8–õ]ĺWs!È=’á²MÌEŽÄmÒÞ2ŠºR‹rT‡µRŠ¢Xö›æMaãY Œ½è‡-\ú¥œf¸²Qçî¼4þÕ"xľö­Èþ~nΩ_÷¼ÎÆPýf-I§ñ¦gÈZc !yüÒ„™byШ±t àÆ§æŽ7Ëå@ÖgõÖÕTRcâ&ôk‹lƒn:>8P…½®I¥ÐÖ,H™jà„ó1®¸ÊàFãGzí°º`ÑúÛà§K5­ê+k„÷… Ý%÷ÜFØ>^Êû‡ÆÁ° YÅí]ïÀæß©¬ÆsR¼,±j°²^ÇÜø? \ÀºŠ0¶ƒkDЮ‘òZ²!uIå×e¹ÕÑ£4]ËÓz6¯òñI†]Òç³iòËåÞ:¶õrÊ.{½hê?O·n\õ=úÒ;!ŠÓìÆÞ'»k¡ø>sC£3e®ðu !1Ùs`úZ²ò#=ºÌ—–·Ê\{k/[Ê*žg' wÈeËP*:œèÁî^.9OfO«8˜ü,<7üŽÐN8§ìÛK ™õÌ®{—'ÌËàõ¯"ª•Ê^‚}ÔÇG‹Ò51&Œ1e7æª'õ÷6ý…â°Žò4»Û±ð'~od÷~”ç5Ö@ÿŽ’ ½m™åú€s :Cé/q®~É#òÎÛµÀƒ‘™Ž}Õ°HóE?´‚â²»GvÖHÀ®Æëw·æÜHúlŸ…+ÕR—’ƒo| fiƒ.²¢íެÆ^^²-4Ý I³qBu]^ i+ó l\•~ñ³«×”\’”靈¯6Û˜»çÕ ¢¸3Oçhì}Ï>äoŠÚóÊø~ØxÄÁe}5vlµ2B ËN-^.¤±WÄüh­a ¦÷²¢¤N8çFïíaŠ> 0t.ù±'AÁ1Øñ-·½¼ nTiÉæ|«ÃÔülá˜HZ>=›ŽOñž½ÒbÆÒuH8˜qWÛæßKS4È3ãvò–øÍp(8gã(¦6“XY¶{ÙwhÌÔü|VLÔ{55DZ¿¼©‹¦ãRFH ÜÚ°ÏROzíÖc¿Ìck-楊ýÄ•+|ë0Ÿ]¡yL—«çÊ;–»ÄÈ.S8¯¡¨ñZîi4-Š0UP‚K·„ ¸û­o.ÛÌCM½¬Õ˜|öðë'm,Ëê;EÅ“<éÇ\qD ¨’Àá÷MX³JüÉ2ÆQŽÌšnÑÓ¸Ñ.^¸éó‡2|9„è{5·ózèµ´Eµî.#ð:¾a¥¿(z®(uð*O@ZÑL¥3ÿôFÚÞ•u×Ñö±jmÇoèøØ^±mÖü‘Á§o6çÒo>ž‡(öÆm„`mI%ê6KѪ/«ñÕâ»7üi'nÙñÍcë;![? ýÊêÀ]°ÜÌóM3û´lçÂT<ï"¾’z¯ûù|æµ1|ðX÷ÆÎ«‚ytË ì¤ÞçÑîú™Õr÷”“Á8Ö§¤5ØâY÷‡þþxoõ%µ%Þœ'³»Æà\ª)éàµ$¥u¨ÌÏOgfµÊfå¥òSé2aKåYÞ}*Müuƒsƒ©$†1x“J ¢ð¦Ð|ñ3×Éxàà±ÏÆ(³eï£,›OìŸ x܇èýˆ=9C?ºÝ6² ¾Ò?5q øÁx­R^,©Mœ"p·žÈW«?žÞ÷]KàÔC—pûDÓ{Õ«o…Y¸@Æòø79β ¾¶ª{7~!èŸ ¯ŠÐ"ÙÛo;ÈvO?° ²l¬±ûz–t%.·(…™þ@Ž;¡6— Óù^·{'E¼ëWj’ËËÃÚ ð6’(‰1ÀUØ0SWnäøS}ƒ–˽¡ýµ¦#QñdfßbWšî¹Ôù.œyñÅø!eÌDWÊl||‰ö6ï¹ësµ%ÒÕûtª­Qõqš3q(>Š…6·^Éë>ˆÌIû³Úbqú—fyÍÊ2÷5Þ£úÎG{E ò»¨© "˃̪U¾ýHðK3E‚MÛžeRÜq(?~ÊÙAW¿pº³ƒj@Gîñ…‹ó nV{» °,¶¡Ýðel–H}ó5Ø~»@™ ¯àR«¶¦î#–Vfòö|¾qÑŠ®^Ž+ø»GÂR% W"-‚¹¶~ôþùž‚jKBëT®J¬éý—È (óEGÝÂòM¤µNš°#uw¾ï+žBvˆcÏžR@u¿ ú·ð/Ú'çÇ ¸ý¹ÑʼܦÅY=!çM®¢Ü,ñí¹l;} xÄ.ôq–Çù×Y‰ˆZ˜©qa5Ò¦è*kv^‚TÕ.Ý(¾|`“`€Ìµß—䢜3úò”†þèX2H2DïPç‰\‡Òé:Û=ýakt‚“â{–°JNörqI7®©èYQö8“ ³\7‡ÂQû²ºH q¹žB_½7Š0Ù‡úg„SظN?;½‡±S­›¥‘ó8NkGã"æ±zÚsÚÄpk{GkÔ·ÏH¢ï‹Œ>,/ ºEÚm©jµ£yäÓÈÚ3éÈ9 `}Ž…‹½e¦ö*00ÐYU¼‹S ¯ºB!ÛÄOáa6}L‡ óU‰‰ºŒo6%ôófXd2fSÐÓÄ6|š§u^A)Àøs}žŒðD™„#׬Î~Ô—~]«.šöÕ)¹ ?ù‘šžb5Èw¶ÞÈ€A{­$»7÷`ÕW•ÅÆÚøtBÑȃj‘Ï»A`ë@’|¶™àdÎTBŸ"¿W>ýÚëS qÓÕ ÖÏñ3á¡Yцl „zÔs‘é‚#ÇŽîÆ?žÅꎶ|Ú œtë½Jc#iœY 0Ï‘«Ìy«ù‹¡!$:§úÄOZp…kí-Zÿ6Ήýzô gV >—x˜(¹Å2D.ó×­å<é„ü*•©~2ç1/Ÿ ˜kxŒÚJâè}&Lÿþ¢CÛ”ö;©U³5…O=oó‡ݰÎÙ‚ºêžPŠÝŒˆÙ.ì5‚õí„ãew~ü£˜%²ˆp4{‘§• ŒGºÈZ¥ƒ±W'̑޶¾Üõ/üØØ&Î#®$ìÃÛë r>Xæ»}f²m ëþmí½Ïö3Lr½3Õ9?¿¥';hº‹¨t‘µž®0 l¹öà)bP(´'®ý–ýeA¶ƒÐS}&—K]ò ';¤îd@€ÑãÞ€üŸ5ºQqUÕo!Îø,óçTÖ©¿r´]냞‡<1Må$~\‚›q\áuü!¡ƒf›‰¶Ã½åÒÜRàÏ}¢gÃÈD µÁÞ@O–†9‚7S<ù}§—î4žuÅHÿTDÿâ endstream endobj 1021 0 obj << /Length1 1144 /Length2 12441 /Length3 0 /Length 13215 /Filter /FlateDecode >> stream xÚu·eX]A¶-Š»tãîîîî è6¶qw·àîÁ=@p×àîî®Á›î¾çô;}î[ëGU1kZú¾µ(IUÔEÍÀ&@)°3#+ @ dkââ¤nl§À¨´pü9‘()5@Î6ÀÿEÿ%ÄÆÎ °„±ó_^ÃÒ hì`c°²ð±ððq²þ³°ÿ—!Ø‘ â²{T€Î@GÝ_Jlêb ´sVw±··ÍÔ€N`GS Àüofÿ;*@lïá²°tÐhªiÓÒÓ3üaååå˜xü:,ìT'®@°ý?"ýu! ´:þMÚì¶*æÆ’f ç”  ±tv¶çcf¶77þŘœÌ™ì€ÎÌ´•´3ÛþÃÒ?z&ršþ-ʃù?ûfmv³óú_°9ÈÎìŸ%™¹Ø3kÚ\€²ÿ×ø/„ôoÌè àdacáea@wSKæ„Ôð°þ“dýllgæãe¶˜Û8}@æÀ¿’—“±+àìèôñúÿÿs…ÄÊ 0™:L€áßÞÿÂ@ó­Aî=&VË?Þÿžü=P3°Ç¿Í•Œmf5Mi% Múÿ¬ý¿­ÄÄÀ]2²rsÙx8ÿ*å¯G^Nöÿô¨b ú¿±ü{³¬9Àû¯Äÿvì¿’w::ýU!€æŸ‚¥üOOJ`g)@óo‘è³p²üÕÇßõÿ)žÿÁÿ?%ôŸ1¤\llþY?Í¿ ü­Ü  øGí6ÆŽÿËÜØdãñÿØðŸ†ÚÀéüÿǬ³± ÈTÔÎÂæ¿Ûr’¹ÍT@Φ–ÿÆ¿pM;³Þ8  Ø ô; `dådýNÃdjmtrú«¾R@;³ÿ)ig 6ÙYÔÿêÏØÑì¿Ц.ŽŽÛóÏú»÷¿Öæ ¿ î@S¤å°)°U]pûc(ãþ{—æý‡ ÒwÈ]&¨^%<ë2Žw<ÉÙ*£–BÕzЊСq’߹ݬyÅ:˜à1±B0¡d"ðϘ~ (ñ¡\!ÐLýaéÃÆKÍ=÷ø-sIZq¯K)$>Ž© þìGôøõðÈAŽ€¸¢  Qùh–ç9ðBYÆÆW•nn¸S‚Å*0,Y®«qú‰Zî+rãÙVU¦ÑüB¿*§ß\¨4’sÝ• n7_çxÛ³e‡¼H'd7CQdõá óòûÖ0Ý ^b<Ñ: Þd§‚-ÿ²)AÆ|~Ç4Í0 Ï£¨Ñ©ÉO7²È ϲœ1„*¡øgb « ¸ñÄ[Vݰ§ K:¶•ÊW´Pà²Þ ä×Y—€@r’Ct8©~ùíú,ƒJÅ}¿×"þîk/X¡°}ƒæÇ‡Œô¢’ÝB}¥(b¥[Œ‘D1ŠØ£ÅÆd,Ç…õPý鲃‡: î>¤Éî^Â¥¯”êâ\ß±\@oøI­4˜ÊŒžl~œpALø£%D =ƘZÛ,â{!ôjžŒôñüNÔãK„úFxƒŸFÉüºÀ?/:%ŸZ ¢ðg"Çá{µP¯—M…velx?r?à9]DÔ pmÆgù;WÌv#¹[ÏR“4A¥1%h-êÚ„·ÍN—_¶Baö ë(ýêv"%t÷u=ðD–å\6ÂT÷x £†õè3pë“)!éØñ-¸Fþ‚h‘‹§˜CÌÕhh1ð_¿`ü Å·Ê‹¨/zóî®AA*†<BˆØ‰º=duéÓå³àþ¹ †ÅÐJvz»€ÍÚ”>Ú,̃ÿ5Á©…3ûó¯–Ú hÏz7OÞ‹+ÕK›–&ÁÃ(¦œ°†ÔÃà£w¥µÎv˜€Y+G>Ô½Ò¶sz‹ÉX쪭2G€\±Ô®ˆ@*!È^Ôäææ¾ez¶ò®š"¶Ùþrzg3¶[[‹/‚Ÿ¢C°7ÓyÕ>6¥WÒ©¬[‹ü­~ ›Ü0feRGÃó´jYYÄšÐ6ùjYBPô!äÜOf~Ì8vªßÚŠÛg·LŸž-© Çy!ª7'²KgUFTø²TPÄ#t¯!‘‘ðJß^ b=†S[Z/MV”á'oˆO ²qͯ]ôZaìßÞfòKÈÆhjÙÛÉv`tù–ûª„œºâÈ.p K ˆ¼GêB³!Vø]êk±¶ü;2VãëÙO­ â嬋kU¤ªF¡%;Ç s ŒÔ¿+O¼Gár¦®jVË9( #“*fàÚªáÙXÏ‹‹<÷ÖÈˉz‰–cw|¨°¿Û±bê÷jÉ7ÃZ o/eÕ#¾X¼ ’ ÚÌ9 ´–åèF1V{€Ú¹ ÂNch¶M_'E-øÂêý.m/r¬}ׂ𶢓UR}o§i¾øüZlU52Û —îtÐé"4JÄ¥¦BÕ>ŸLˆ_â”O{ô¢E‚|oøšÎʨLÒgØÚuî­<{a7º"íï±;>‹ú¾ÅëÄXÀƒˆ›²A…!ÿWÍKŸIªÎ`šÜm(‡ûñ±CľqÛ#'`Ä­MÖùø37Š˜7òÀ‚A^¥YŠ] é½mæRX ´"È…×™ÇýŒ{É~_EùÖùô#'¡jfËÏNofÍo¹^0€\*ñ˜ÀÄð$Pš¹æZÌ*ÔÙ•æ|Òs™µò EQäOàþ"LŸhž.ª3 ;f‘fïËý’ëV~ÂHs#ãA`á\½ª&œ‡ÎÒ¨ ],;ÇtŒÄaMÕâ±-ÞÌž«J»Ø›î¼ aƒŠ-ÚNº’¹¸.}]•p³Ä+ÝÞ’3›·©в³´7P´¯6âSéðhä^Q쎫íà] gY³Tc üH"Ù¡Eì¿ gü² Z•k~t-²M…/KöÄ9>7,Õ‰&*çÝLìm}Ãb$,&*`è³EE½¾á9µ>ÝÌ$ÃUïfKLÊ©Ëô² ­ìaìÿà ‹ÞD}{}ËV 3m¤é à ؚßc =øêŒöæHÙcï&ôûÞ^~YªÌøÉ¾Ø¬tW^Û§m3N¸d·èlŸc“ÎÕ¯so_>n¼øG´q2ˆ_ÿk3Aµ1÷¢ zD²´Öì‚oõAF ¦n{”ù;•`±]êx/ýÔíÓ]v<qh¬î,3ú$“û,ûyìõÓ5/ÃcK(†€feL·µ×³wÎøƒ¸‡{@”BL3ç”®Äõî—äÆž z ¿§K+tŽLÁþÑd"ìVz´À™§FÍá 0w´Y•7—Ó#²b›uü9bæÜ9D1Wÿ÷ê©P<»´ì‰ÒE³¼á¾u‰0LCÓú&CÒÁñΞÊÒ}Ÿüš¢J&G6†ä6’!TÜGµøºÞüz@m^‘î®3¼*^§ )1í0…5—wakÝ3ý9eû½{d¡Ã ís'-dIëZæqT¤ ÖSÚ»lcŽâVA©ñ¬ô٦ߧG~j›æ0öà‘Y|h;•dX‚5¸¡ ß?0C[a*lÛº—®´Q–vZQŸCJ+›˜ˆè†ÊźUW¥tåovû­F¡ßD¾íH«¾j‡W¥•NÓNÊÐO8µ_iϰ˜ÎPT›Û ò%sä`Ø9ya•ƒ#7ç<)>²×!M瘌ïÊÀy¤ÉËñ‹Èr¨º¨#õuqI“üœY•”Î_ïž 1*£¼ÆèË0–L¥…w®4Ì•u¨ëž>î½1н/ìj_}_$Í!# ªxêiòïÛ´”ºlUXË$jg~Ó‡ºLÁ²u^êÓˆ ©æõÜ@…·¼\9ó2Š'|!‚)²»É…}]ÜŽ€–¸Âú£ë,w­u 7µi…lë{@®“säÇ黜ö}ªkcÔÚš™Ü Hµ²eS±1–ˆ—bYšg’º½aNKè%k ¬_Æ&¤#j]Ü¿€ ¯úúì/=ãT '“÷;Op“Z™#»çj¼C'»9À¡ø&íFo`%²;‘3)s¿þa¨Þ-zöOÆà¸B‚)cTÚBUþ{¦¬Ü6J{6†»kÏ#ú§ç‚º¹Úq—¨—ìç[ãÍI |š “+ÃMõX=ã ‚Ünú__‘KÉܵ©…'¶“x\›×¾Ü·­º…ÚV—«O/!Mdñ‡ T  V9å §Â\%[Xœš$Ï,Ð)+oa©§´ÁÖ¶ÍŠ—Sƒ×Ï$u˜ª¿VV+°U­~û\x´tG(+iJ~Äç{`Þ£n1!ÞŸ/:3$uÁà&ÈJÅ7jŽf…§[Qï‰ë-åNá3’ šMÉLph!wAöï¶qOJCYÕöA\Çw•Ã3ËŸä£Ý‡¾~R’Œ³ “¾?õÙ"Dyú~Evk ™¢šà*Zn±¯”csTåÇü…‹迴ɲ4BãIƒâð h›GÙ’í6Y®’ÛáHN]R‚ÀìKc{åB’a-kr¦:\ǘéxÄײ2b𬀠S[ÞOê]}j>o>ÚÑŽï™­]ýg{mâ´üÈûn£ýߦ}d‘þð1›¤ô]ɤ¸¼Ë[‚KÆ)+¨såWèp­ðp:0þ¬ˆ¦„!=í¾Þz¿•ŠEñ@aYþuaZø5Á.òüêãÔg ™îª Jh46Ê<ôÀ …»‘QàQÝûuåG`¬’?jåÞaÓ*é±)kÔÙÝàóÏôM›[Ì–=/[òÁùˆ²m&(¸Dó¡Œç$ Á C{Y†ñ IYoá¥ÊÚËËäžy…7•c-¢ƒlNüï¹T¹cE'ùáóå³´U>Xj[ýƒ R/Î1„N†.»£Ôb³Âþ_LšT8!ŠÄ.ž”s*aµ9"±n11oƒª(l>JCÂåù\99v/é"¤Jƒà{µHôb¹¸Æ¶òŸ`Så¹Ñ=oÔlÌ×.dÕŠ+6+4ÜcÝí¦›ŒËÆ~RxãÛ ¾°m!ôF‚„ø“³úñÝÞ¦xŸï×'ùö=UŒ=´œ^ìž[žgͨÎBæ-hm>èÔ Œ÷¨¥é«„lØ}LÅ/A“JLÝ&ë¹oÚr®Ó”¡Õ‘ íÑ8_–I­;ü*ò¢·h¹ZnÒôÓ!^`£ÍËWyƒqȆ,§Š]uaM~V[ïP¥ak—WT°4P‡È£ ¦í©º÷¥4±€[ß‚.…8‚ y—œäR †ÉøyðpBˆ´ 2iAß ü]u"AèâåRè²°°¤) W{ßcÕ´ÉF¾…Ô…,e××ìÒå7Ò$Ũém$µkÇs‚ Ï]¦}­™Á9ë†&(¾’_Ä ·_ Çø©Iõ6ÅÔúÀ±ärR $‘&æY²Ý‹2›½×Sß”GcC[ñ‹âÉ»yð’;Hìc²RŒu¼cЧÑO[[ùó2øR¥_,¿]Fž·IÝ÷(ÙJ $& ¸Xãë;ƒÅà€7¡e°Žu²Kí ]KIŒ*ú™û;”ܲ3ª˜èBã9AͶ@§€(ÑOÄ(ª±ClÚ‘‹æ¿ø~÷,–“â@ß¡¯övü¦ñÜÎQ%àÛ$ˬ1Y³×õ*.ë|!ËÊüñ[Øyô'µLžgSmð-¦(Ï[‰S _…æÌhç8캉j«ÕNZUµÝ,è,$.2^ލAº§‰ñGÆFŸ@ECŸÝéµ|“ 57šND -¼Fþ´O ŽŠoí ªhøqYUœ—ªÑ‹ü²‚+{tZ)!À´PÅóÛµRn¥^oödh˜`„ì”Ù“'ɯÜo–÷¸už\“ŸŸ}ñ³Oß×€\X5 >9ó•Õíø,ƒáa؆è/,sù™tÆÇ­iÈO•hpeÝH1– »—ÓžIFï|îsÜæS°¶xMÎǧyP¾Ý8A¬8.õ¿S|¶œÝ3^¼¶pŒ­@ƒÒö{•¦!ç»»UhÞóÞÉóþ¿öº²Â ®°@J©öüÓ\.ÔÍ'7®¬®EÜuÃìzeÅud_( 7+Ol ߨdÃâÝœ³V½·4P¶¹‹‡d‰ì×TÕ á42¸´Ù'™¡—h ª‹¹׌xð â33ãñUþxlô\0IcÐàGÎ)Ò`TeÈÝ# ]´­ÞÐÙ.rÙŽjµp”ÇWÅN‘©3a=–ÈÙÄv.ÃccmXŒzÇ "!X¬°c [éD`q>L~6Êga“1}š ‰,œˆnñ}§^[ß\=Õ n’41EGLdnªoUVl%gOX8Êä©E5äÙ`øà0½q&¾Pµ Dz+{ƒjùÇò¬µ±ëO@&±œ«z¼ŒI{íÿ ïTP'¹7WÆc›=Û;~älS”cb4k—?Rèf4®w`² :SÒò䉬Dï_kK´nüÝ¡\ÅÛmâ ¢®JúG¯µ–0Å_0¯Z¢•„ò( +YsZ8h” âðÉáøè7+¿ÆÛç)|‚Èäd|îÄî”Åã4ïvy·(Ý1òÄf¾÷a­MAiÜ„|“Œ+âN8‘ÂÔ!ø¾Èœ’'ÝrÜ“{^q®ûÝÎ|vž!Ýð uÑõ*/‰œ°9;±-ö„=•¶z¯íò|ž|•ɲ!*tޏOàa;ooê¹ðÜ[g¬0“µ ðL©·ÿqx–'½¼GR¿ -—õ.Ü[ò¨!%þt*õm¤è:RgÓ¯D€º6õíü¶ó‹ú¨öÓ­&ªŽëQùDâ¯bÄ¡··Uå¤ù¡+˜A‡§ó¤a¨b½»Î‰³{Ö`¨LÁ޼*î.^ŒguéI%¬eÅmBŒ{À4æV¸r…„ÓàsGO$[x€>%²”û´öÖ2ÎL€FVú"sêãvQcBFJŠä9þ—{¾è' çZ×6yaœDu’Ö£ <¬¯ú]ãœòtÂ(dŸê¸Ê‰yb ^fÝI@–k¨ë¾ö„Y8CUŸ&åt½ZCó85¯,›«ÙB²Þ6 VÝ*«fß?[ p ÷­2ûµåX-®ä[}É¿=IÔ©ïlY+” |ȈPó3Y0? Ê:q _üã”–$(]Þ¨{·•o¥®.ú²°ÔÇô‘¿;Ƙm¡•üŠsòÛ©)n®m{—ÿØPD°çi#ýú~¾XKo§hÁþDÿ`R˜Âo0¸*Â#‹…[þç¸qíú¡vž«ò¿œˆ÷žKäå¢e‹ ý—QÓ~ ñg¨ 2+…ÿ¾ ÜÙ$]"S(˜Çznhs%:‘gŽÆÑŒ!ÝîfÙ °1›ŒŠ¹›=JKv}WΓLzjç­= Fž¤æ: ¾ÇÈ"ÁwY=Cu fªÀþM¨Pœk²¦ÅyIuf×YÖqñ“¶$Žÿžçу`ïúÖB#‹o#ä5 ê­\jÑ¡&ÌXÕÝ”YñQ¸I~•ÇðA;C¡Ñk4V98Ý*«ñ¯þš½â’‚cÎ<ÕÖ´X…ö;R·"#Ž‹Y‚ƒò"†bz:çÏ¥£ P‰DZµžƒ¸WÌóN,ûîõÚÞAmTÙ¾Ìte³°tÈDuHÚfºÌdà›cº§äÉ×$žTÇX•É7lø‰_b»o¦Î²¤ºÚª"OðB^²z'PB9Œ/Wƒ÷ˆûŽ.,¯´ë €Òå ¡ñZÛpÊΛŽ~ðSHëܹ2bèÃVŸ Z@Xg|@­–2j˜:á×dÜY°ä0+Žþëaíµ,êå˜#5ÚujEËßÈÉmÚrBR‹G„ñŒÆ*Ĩ"F$ MŒ}.@ÃrÈœ ‡D¸¥,ææèJí|~ošèß"²¥sØÍÅ 0ljôz¹](ÝïÀ“—ËP«š›¶ok£'¿µ&†ân¿óç•[õ‰º]Þ©'¡ãr ѪýdmLÝz‚“–Ï¥ òIŠ*ã™—©®ÛG‰ÇÈ ùC6¢ €kE#2ò˜&%}¼kø¦’@ݯÚÖ¼öŒÞTrD\êw!ÖËRTy:wÕ $Žʘ-n-ùø¦EC`:=Ôt)fFÒ¿K‡i!/ W@z²ƒË¡(|I¯ÈÝmyèU–?£éÅx†þtbÌáje]óG‘ gyèa.Uw+ Žy£¢›Öbü‰ÐÔ/ ZXñÍÏM¾1÷ä¬HÛz³+ðsñ¶ÙêŽ=ÂÌrÀ…'‚&ÞúÓg?fr˜×ùðôüÉÞ¢™Èæö>Ýæ•2'ÅgáR0¦Õ¥ x¯M>v]µÜMmËt`ÿ)X¡É^ ‹Sv§”îžØ­NbR&.íwóÐaû™[êBòFR1c\ΞípW*Øœ·Í¬ÿ)§ûáîÁÔþ) ¥µV%ýÖó}ÉÌqóÓ>sA qp†ü¥+ò¡ìv”‹Oö[_Ö.†î¥”\|»žég uRäÆÔ—``½U3´GÔ6 #ª|Ñ/߆†‚c+ðºêž…Ó'n}†)Ù]çxK<©1î5_¨@h£E‰|Óu3D†©˜…'ÎOÃZ«Í–Cø©ËCî’wI 2“ô§s‚¯ÞçmûÕuæ%¬Nò¥øš&®S•%tè÷ý83'O«_Žtˆ4x4–öÝ Dú™„Èb˜…`—ÆíšI.uìY±¼ü­Ýj\ÓšÞ­ÜþÉCûª£r­AÂîùÅQJûK ‘å˜õáfÒjH°Ë匬Tr½kµÂjBÅOÑpßè†×ÒQ<?²9â(à§^n1¶ƒ¼2Ž÷•`¹‡/ã¹fCGq;¡dcmŠ_ÀR PýN´"J·p´eõ¥2$ö}ñpt¢ñ”šöttùèG1(õ¡²ŠÓ2—ÔÈ) ¼c®„\î|ÃÂý$WìÉvM›°ûºðÖ/?˜§;¯G²‚zsñQú¢¿ÑÔ¨W©Œ•FÀ{~´m…çÏY5žXÉïx¡LôÒqr§§Ê÷_‡Ìß– «‹œ”¦3YºÎ”°„ÅÊp}2L^7ñP•ôŸ!lõÖO©9`Ö„%ÝÓN˜|Mñ&íTuÏØ“ ènñ³xrgÁ?V \t¾ë¤K,{PÇÉ9’Áx·òè^š‘¢tƒ¼¼Zþe#„ÍŸç¶ÃÆÀ<œ ³Ù}Þ;ûUžAȱrþj²u×6â¸È1©Å­¼>§œ=¶)ì[æbO ¾S&û&:Ø3Gx²Š]{éÔuìî¬õ…ÂÈuŠê^ pË52<7í°ÕVð`á{ÌÇÉ[GTÄgi–ÁÒ~qw\«Éï¶²¾ä³ÅL(¡º\º U^\Ø5¨Oð]±#çDïé(­ dõdN‡{êG_‰ÃWçú)×\[1LÏVÝ¿Sû÷¡h¹‹1®=‚õjD–^=9ºo7÷UL×mr®™%—d­È8ÕÈÂ>nìA7#YÿƯQ)ðÓªç6q 4jwöF(n/*—öц^ß½ðôê?wϬ[°Ç=#&Rä÷>1 $ºÓÓïÝh‘q°ý3|p"2‡§œlí\>LeÔÔ¦Ù0ðµÂ~”-9fEÿ•¢nå Û¯HáÆ L\ŠÔ‰‹ÛJ_ðÏBÕwŸÏóuÄn­†\b/yµÅ'û¸'\j4ˆ—dÅ;p š+Ï¡ó]­»vœÚ UL;iXJ¸ŸÓ*L! 1X))ɹD-"úA}q­"pjßÌu[ ;«ŽÐ«æ©e¤@£LEg9ÝÙµÍÙRôäkÀÕ •9à–öÆ7ý÷{÷ÉÆóóèßm›Þ(ÆJkQ½£Þ-”¹lô„­yÈ’zuTDˆëý¸÷eÚî7~atü “ûp©ºûŸ%&Ž_àBòû=ŸöKA໢Ÿ@Z¬/\Î¥¨¡fÔáKrÆ'fãßcçßYok©2# ÎiŠXO›¾²èÚÏšTÁgÍÝDÃ::Û 1_àšŸJ§þ‰ÛÂqiÿ†‹Ù‚äµxI·¦3Ðmw©]µ÷X?)ܶ˺Ûr™lɘàŠÌKºñÇügä9Ì£Å/Ø^Ê1´\½FäÊ<˲;Ës­wP³ãøN¯8ãëEÖÅoŒÙ„•dfOÜåÖ¾yÕäs¼FA®q³7åëÑ8fõÛbfP"ÄþÃïðc˜ò ëbš‰ÔÈ64ã·,(îiÉÏ„šÕªæ4¸Êqv dbÓtŒ*Ùå`á$=Üð‘¡G´íÔùylÒAm*ú¦Ú^™#»Õ›ÛˆÒ†rÛZ½w³N°ºòˆærãYm"ß|2ªt~ôÜ5Wã÷¾X½E'Ü‚ƒ%# |~}[ö˜:·½XVi;ñªì€Ò¹cÉXƒMÚÃi'˜è6:Æ<®:ÏÖ›HÊŒ‹03Á{cÕžoU›w˜+gv/§Á¡Þ&ÖœN ÷BÃyÛdkxÚý¹XÅw¥\è:d1…yš51Ò·ï B j¬p$A²hmÚX{L¨éñ‡±Ö–¢›r¸š{nèí÷_ µD)ðâ!Q¼ó Å²~%=ø“C)ÇéæJû½›|v›r§à¤4/ÖW››ÌŽ[̅ĤHé’ϱíK€õ>ì†Æ<)‘ yBt'„WW!stD«™Š@Ž/?²„…Îu.o¬ôå_ M T:ôŒ”˜0Y_·ímøS"Õx¾üÿ&8L¡Â HãœS$Gæå\—’µPM*¸á¶R!'pRùÙ廼Âþm‰GŽ7Ü@Ñ!ûžz¾SÁj…NM¢+fÛ°ñY yà aIŒx€"eíÖȲûÇg7d²Y´{Þl©#FrPWŒ\~J€¼fZ-ˆµ|x@½ê]3;žoE ÿÜê¹^õÇvF(œ^ já=ÉX컉£4N•Úøº6±ŸhþÔwl}çNF^dTYD!C°–¶‚®Áôñý÷j{Žù¾ïÜà™ÈÛQ³%îö”“û ’ K•¹€Oˆ®ÇÎ}ä å–ǰÙh—=e¸=¼ìBZˆN¡·ƒ¢iMïkÛ)ƒÚŒ‹Ýl+¶o;ÙL™I,K”ˆ%\0L],M? B£õ¼J ¬*©tRp”AšLN„uô:‹ûrl¿Ÿp‘ÏûÏ*öW9àí—þÁé¥  1¼——1d"¤u¼ƒ/ Ê›ñSØ/’!ƒƒy¤ õén¹(絬ñ?ãÂŒÆgSVæÂ;47Z[yå)újB¼© ±g$i£6™!ÿÒ€æF17=‡öì~uÖƒÒ-ØùÔJ²Cj®Çò„— mqîŽ-¯¿5T4½D¿eª‘Ò¦r†³É“q1FþÊ¥Ëdb•SòB6åU+JEXNß—µ´/Ìg‹’\(R×І¹ÔxakÔV«Ãlãä[PŸÓü*ÂíýtLœÌî¹®Ã+ žƒï×ù*¶tÔ„/ên“s®;  WØó!‹2à.ùý[í´A®•$B’/0‹­ ^»5S+Šñ5d–ž»ÜŒÅš¥îÄN­ÁYúYÙ3Kd,þ(‰8{O-PJ4“Pm)¥7ù'–¨ÜµàÍ»ýÛ¶‚ÜQ§Ï…e°ktÅŒÍæ‚õïÌSD1©_Ry‘½½ñÜÇ«xËþZÔuߥ¯:'œ³üp‘10K»×Qµ ƒ!{¿@¥õ¡CÙþŽ‘9ÓÄZáŽH­ñÈ·hNµÞÎæÕS¾àVc±ûó¸|$m¿2» ¤â†>/ÇÍ}F]tag­éàbƒ`uŒÇ™ÃpÈl±wÀº­[”@Ú.k–Ð&üó° áŽ$Ø·àO8U½¹±=A_Ýùtûä üôsbõ‘½y—·Ûͧï™N0Ÿeë°Æi¿rVœiU‘ïóÚŽw‹Xvâ2'{c—,]ä¡îeWߪC׉`ûɰ¿¬áÁã1Üß’°¿"jXšûTì_ea58,Í,2zãYCV5X'îQpzðˆ}¬ƒ Ö=¾Ê\[ަqö€»™Èø¦°:FQvÞ+ª˜ù.MÁĵ%4ä2«qM­‹}Â×G†áD½W*ÏdÙ“yIÑ-ŠHY“´ã4“žlÈàçÕ°"˜Tål[qøÙ[^þàS©r”€Wò-wæÊüùÒ‚QLoR¿'ö[¥·[LôÇâÏ ›ãþ¥ó>BË.rè z?Œ!; ¯{IC¨ æŠ,'¹©GšK¼˜XùŒV¹ã¯XøðVÐ8˘V kø½Ñ2‹%ïý)·:»täV£…PŰ'¡¶\Q^«ÞÝúœ¶ºKºå›£Ómbî>Àø´f}ωW}t¤ªÑ¶›i’]fÛõÛ„%ÍT#± i;MLß4}ò ̳àReÉoÊý¼á‹å–#·Ë?µèR?¬¢„~(gL«|±Í÷'m(‡ðØžÏÅA=UR{x5T•IpCäJ Ò ‰ µ9‚r%5ŠX§þÏwc”MÐH Ç0¦ÖÆáÞ_øQ©›ÍÏ×Ìç"ôºS;¼~àuM.™ôÃóëFærÜu%¼pðÉ»ŒXW¼A•©0Á'ÈÊvÙ¢†‰ž†ÓðghŠÙþù¢âÊ0Æ02~ÌKÔ•²‰o ^C)ú›ºzˆe¹ìmÓ¢+ěӖDNÑ—‚ ‹+’¿,jE°“ò ]×:3hk¨4rÎ÷Èh½-Ððk5òñ`“~NY‹P‹èv3dÏÕ–M5ÀÎ9ÉS!iõH€jŽ,4$ù‹|6BEÅ!–!” ÄÖ½ ç’dññ]a1ô„Mݽ›¹Ó÷ÝmòþCBÖ~–gÜÈ’q}잢þÂŽ8àœäªéüFòåêgÆ•<¡êNbÎVì€) ÿ¢ø'ˆ'œ4À€+F²ÁLo;¨÷ð>Æ“çgPã‘B5ébÑüf ʈ¹é•’›á²ì2+ žåu˜jÎËj¹HÐH-–ÔùÒ óÈA¹‹ þ a÷Ï—1‹¥àü(¥Vv«p¹µI©³|¬1‡‚ÿ`9êoÁ„É"ÜMäªß¸·l™]ë#^_»Ù°l– aô'ˆ1töŸ0k¶5£Ÿa‰WéÌí´S cD{Ø(ŒÑ@sŸ}ð¢çšñ\ÂÝ¿UC…UBIfÔ;WÖ]…Ê´a[5hÃ÷gÞÚ}ãz.­þ®iŒ"à9ý(N×ꜭ-¦Á¡z%ýÍBT’Œâ="Ûg¥fÕÃ0|}öóûÖÅÉ‚˜AËW!jÄΣ/æyf•ØU|äóÂZŠÝIdØ|áß¡•Ê*¡UëKÕ†ð±Ž÷ŠDd|8 ^ÖÖz–ïÍsçªÛwÿ„ӓ˹Að¯º÷íέÊ$—sIüÀ&ß3ÏT*¢JW$]Nè–!jc®^mͶµ#b}‚‘«°p¦5ty­áûE§»ÛàEħRUÐg£‹Æ{Ù=éóÓk ÁB0?g}Ÿ&D¦ckÚO_¼]ZåŒ1» )ù)\@ƒÌ;w~©w&¨;ª2‘°»5i eÑÆ o…È3¾ÿfsaëøú+ŒZª­޾éŸkR80.‚ûÖÃÂjB"åy6J°Z+sµøÉ/ Ä•þÐv‚¤‰@곞Σªt§†‡! û"áûr¬Û7o<‰×ôö˜j¯ÔÀb¡V½Î0йíÉRR“R¿\7ù(âê: ïŠ`¸Ñs $JÔÅç¦"³Eé*ÎÔ‡²?Þ}ÔÖŒIºhªÇz¢"©µ 2É8…£,>P0£©ÉŒ¡\ÕïÏS%bdT¾{+ ¿ ÌmXd섨mè®OiJ=‚E­žé(,þ ïšÊ=×õ.lèÚªtÁLŸlôTá q(×YìÐ5“ãd¿£’„xŽ-SñçÄr¡6ç!•ržóÎh;íb.ˆZŸV'Óצ3‹—2ÊÓÞ5Äðckª¥uMé‚$:ß[Š»—Y‰ÔËî>›“NÃÁéòÛS鬸!ýsôlÁñy÷*ý¦FFŸ~ç÷ƒ×sPî_ékÍ‹(´ ®ºTßrÊ/9Z‹lNaxˆ¶›Ç×Ì4·3œR¸o ïë0öý> stream xÚmvuTœIÞ5î,@ÐÆ]www‚k5Ò8ww n Á%Ü= î‚‚ó23»;ßî7çù£ªîýyÝ:ç¡¥T×b•°‚X€d!NPV ‡ @ìháî¦eî¤Ìª ²qW€š;^s4ZZm0Ôô&/¤”+È †8I›C_l´mÝ*æ®NCƒ_›ãeÏÁõoCˆ« @Ýìñ¨ƒ  W°Ó % ±tw9AµÜÀ +MÄÝÕä&°~©ðŸ3¤ ÎÞ®`[(€AGS‘™™åo( °ðþ7¹mœt/Äùl/!ä@N ח­þ°U·6—±CÿhÀ` …: ²³;[›ƒ^067k6'”ñ¥X'+)ˆãÜÐþ˜Ÿ4ØdùÒ˜7û?ÍÐÞ âéäû”5ØÉêÏö¬ÜÙuœÀ.î é9¼@hc6 (€‡ƒ“C€ƒr€¼,mÙÿH­íí ú“þ›;Yùû:CœÖæn °5èeAóu3÷ ®î ßÿ—øï°[B ›—+ù;ú ²þë¬bu{ 9Ø88€Ž?¾ÿìŒ_.× âäàý·¹ª¹#À®©#%¥«ÊüOýÿÇRRò–ÈÇ`åäç/} ðpýoTusð¿ªâøÛYÁÉø«ø—©ý»«Û‹* Š˜ðß‘T!P°%Àð·`Œ8x8^´ò²ÿQHÿÅÿ£œþ7‡¬»ƒÃŸ3`ø«yÀK÷neÀý;¼<‘?f¶üÿ¼ÌÁÞÿà÷¿†z ¿¤ÿ¯pÿKÿ]ÂÉÆ`rþ‚ÝdÁ^ +u0ÔÒö/•ü…ë8YýùAê7ðùÅ…ø?œ¶-ØÒÞ äæö"Å?)“Õÿ$•q²„XlZÐ1š»Zýøƒ¶twu}™ÓŸ7õâûï³5ø¥DÈ d‰¶4± µ«ý|S'Aâɺ;ÉÕÇ«sýìNÁç»Í׫Jdÿ„»ðÚ{iõ1[ÑCxxØðD™8>O{ÉN6d\¼0\8ù(âŸl ª‚g( Óç}ÄI±Dù?¤¼åO)«®õiE¥&pµÂ!¯Èn ö\ÔHÈ«Š«QÕæî‚OÔäÞi"ÍtIsØGd +~iž¹¥W4@oþù¯º×ìÛ|¿$&OÀ\¸´þÌ‚DÿŸ`×ÄÎ;ÛN%ñ.Øn–ÒèúýKöqô§¦9 $¢”$²U ,"¢© eG¡%K’ìoEý3 #ü‹¬NfGµžTÑk>ò ¨‰Ü•‘å6¶–oZÇ9Ç:!Ö—6Ʊ¡CøŸ ­æ– R$ð ?¨d %ïgkÕ(šØxU,/045×ìM\ˆ—Ë è¿à©€ìl³M^žÁ,`£*±ä$áTD{û(*Lm2bôIrl™C”8e½èJ¾ËB‘~!ì>((•Ë( QE"”7¦è›‰X_+ð;š]^Dhdv ™ÝùzDŸ¯©¥ 0ÑÔæ®Ì Na¿i¦º¡6Jï: Y/t %(ÿ‘åJ¿Ëâ„:LjN”@ÒŒ‰z‰y^q¹.?Uõ‘óYµ6æÂÿÈìó–¹/ËÂ!&mš¯ õt ÊS­t¨7f)”õÃúb…¨Ös^:zç‹Ùê)³#2±øi1¨†Pm¼ùì3˜+¯™óú Ž'ÁÔ܂МVøN4ªg:Þ—Uµ«ÑØê6ñ$xyp®èÙ\3Z꽊 Qu[DLàŽóÌùÓ0ý<·tâ†u3èXOàÁ¯AsFf˜ÌQÅ8ö³ê¨•yÙØIG9Üoö<µ* I»âVa~?4+‹òðïMN)¿Kª­é“Œú¾Gíõ â¾×ó]ܘ/G=ò╳ì(ÜÓQ) ñYæÇr.²Ç‘TÅê6ðD¾¥ø5Ú…ŸS‘¶™à¯¼/Ò£ü9$±¯S£Y2`ðª¯ûp·k(C„]˜ë'¥çùŒu]WêÍ‚‰‚øt©î–ÔIZÂóÍÞÅΛ5Ì—D#Vx`€[“r=±ÑÀíšý­ê€zijI}iÈäÒƒò‚5#i· )Ðÿk­ôŽ-ÌÓ’_ œf`‚Ýɺ| •Q<á‰TIp¿Ú.›^­ü7…Lì/©wï0áE¹âñÓˆšDÞñÀ?åf4›u0ø‡|ëäÁ_‘'ƒY”6þÉ\qô,Áùš&é­Q\~Ü‘iHU¸JBØÂQåÛäûRa²ãW«Âéb>j€æØçl… šŽ›*¨>f¬»K¬uÃ^ƒi ˆºzÐþ¸l§3MŠƒ£mÝúl 9þ>’æ—*p<]¢äbÖ¿‹ÅÊ¿x9 G; ÜÖÉô:2kœŠùS«°o—§W÷YDãž³mmì½öñ’†®‹Csa>ÜýN«‚î|@°oÆÑ…œ!£øgœH‰£/SŽ?F?ÐôØ7iâ@y!µek•(5Ø¢Yeƒ1¡G‰êø¦ÓîŸ/³;`á'ܰbš •ÌÚ¬éGe>Tï#"À¹‡U™{¥Ùß´ÙŽrã8`}‚鵩¯†Ê_ õÀ*¢’¨#“Vü@0éRdL»i,æzrÝ™¤dPñ³‡(ª2«×ÒÚ ,TÐj¡UâE§ÌÖëÅÌ e"*ËŽ¼JÏ_ö%I!ƒxZÐûP=5׎#¶>ìwiÞ È|.ý½’ô’ŽÆ˜•!×í5ú[?F–Ú¾°pÌÔHe$Î÷ÜXGb6˜ÞÔyK½Â›cê¨ØÉ~S-Ü.šŸòÛyÔ~^·ìCJOUgÔÕXp§Ðè¯T+âvLœçÑN’Ew Œ]5˜”Š¢*øŽG3™®ïzý¥‘'#DF*t°ÞÕûôÌé'„,ã>=õFg”*‰Ïßä0a”ƒØ?I%ĉr#Q$¯aü˜AÇíOŽãïtå\PënÄžWÍŠ{ô…h•5:$·òMÝ`ÚJÆ)6=ì¼Y7è<¸f["ÏÓw¤5îMl»æÌ!1 Çû×X!ûs­âNcÛ™oÓ8ÍçKÌ~~æB³6$®ùÎ1…¸™…ÍdóÎþâÆ´þ­„£÷øœlõò;ì ÑQ¬ùõ/-Ã'À§‚I‘µè2IŒ—ÛÑSz9ZÇC&U"Ÿ;äƒÂDZUaPË^8¢ÊŽëÞÛI¤WÂäœ$‘h\ÌmûÝ,Þx[ÃÆ™¤ Š*ØR§ï}“ed&6¡iÀM¢‘w8î|ïšÈš{Á{€‘ØIUiþ¹èšpÑKª¯?$“vrþ@áé±'§’NþWÌh83>7 Ф:I n/ëQ´ ¤ÅVÀ[@åj?Ì×ÎñTÙõé"~%TØ JÚŸ•œ}DôUýò[‰/uóÌz!¢ö;Ûkë=+mfÙö–³'^_#4¾Xž4QŒ›üyÁ¦Y¬©ŒfDÏ%Ølª>²ÍZäštÁ°­¦?ä Ê.d‡6ú]•àí~îÝ,Ò 0üÎ …aOú`±"'¦óí}ظ´3P}ÕˆŽƒì;’xÞ^|Þ…‹r­H#’\YL-Sb:é³ü„¼¬­"Šf§¹\.iµò“j5ÆrÄ0:¹rürJ§¿SJóªê‚ILOí\}•õ© ¹[íÎ@(÷J÷En¤úÛÞÙ„Þ˸}8 `ø+¶rðôÇŠX»¤4õ„Êþ!‰wAÎÕÖ˜ÕÝ60^ià›‚4ʯ!ìëT¦\øq¾z9ÜßÕÅ5b*Š ¸ÄB„jÁ±á(>¢–¿B&)%» 8¿'$b°çÖá5û õ¸jJXtK÷øåshÁÿ°N%çÔ•º£ì´îtÈ3 2ŸòâÐ~ ×=ý1Îÿæá cm?»èÂ飏ɮ x__€€áËÁÊZ&`Ø"ª:W9U74•x³õ~2QvZ9ŒàjM‘ÞµÚ]$Âóž±hš›  xE ÎLKSšÉ’9ÞÚÆR2çÏRž¼ûÚbÔX3)a— U±iþêÃXÌkŽÕ…öÙ}Mf nþKcù¸A!g4ŸJäˆ{½ ¬EÎkÍ/xㄈl˜m8Ïq˜àðŲÉS3Ôî¸÷CÄ݆¥ÑRUO³3]C-Ùo]=›ÁmþN’ªì‚\jÁ·.‘-"¼“D‹º`*G%ÔV5 Ñ˯¯öa¹Â` ¤ÒÐË( xf _°]ÏìVñîD5³~ }fv„¿ä_\žŽÛqò¹hü‰àe bʺrí×ðõ“‡ÍÝ IˆAæÞ«¿°¬þ'Ž.Œ†£˜?ŸÛ5+4|êùa<ß]‹bÑtÐã¬ÉÁ¶EXv¦ÑêæI–‹¸÷6Znp îš¼Ò¯*î=¬W*ˆøqû€Û›‰’“kœÐÕsg¿‰¸Ù|‹`ËYVÛCîX˜Øg9‘öñ3GW¸TjcÜHµY]QAÕàM ѾŠÿôsiÊ’²`²·‰Š±ß섎nG,LA½DˆñXúõçâtÆÕÓ-c„â½r{Í!¬à1»ÌOø¿[¢Çç ­ä_;ü/?×H\L°ih¯uÓv  ”'TItSüÉJ`¡W˜:7•¥Y›dàŠÁ ø¤M°dë£i¢¢Ûð@æchU‘›'íJµò_þZ¶ûhdÃ'ü4œ×í…M5Õ|iüæÌ† m‘GœÁS:.k6owŽ$ŽègÔá}Äè–´>>Ú5"ÎÔ}×iqd? Ì÷MW‘ª  ´Õì¦øÆJœá„üÌØGb_ÇíSâ±…1½ß¿ˆCýb7ôÅÞô)U«oï„Üm° öÚZ„â­Å/¢;¼j?©½S5B–\Döü âÖ¿ý™ø«*@cÒQ÷ñR¹6ç kt~ŠD˜'?‰)±J1°c°þµÁ+QñW{ï)鳇uØbxíLDöè¤OÚgðAÞoî‚›Gí›%B†ˆiutý;ßdëp3Ô†&‡Tò«‘™ŒÚq¨tÌ‘E"ñà_oŸï'–ŽƒüŠîPuÁt&—óÈqÒÔ¹nôL¯,w¼èQ™Ë%'.+È{¬¡Ä¥Cº7ܹ"nJ²xÒDKXìKúXlÄh¿Õ¾m£XÜß&drÿ~|½ÕªÇ1¤”w*Âò)”oZàsB’7´‚g×M÷S•‡eAXçëòÁè4ph Å”·CÓ ÛÒgGãó„ jõ6ØûÂe=a_/öóM4þÌ“c W¾Ô$íÆ&)'²VÌ`úvIãÉFEè8ÿuN¿«\gWGÖãC¦Àpö©˜ Nxœ€Î>Çì'=žœ§}«È­âßh„‘˜÷êó(Y?š/{’€4~é¾2V ¼Ê _I'mô9A¥6³¸P’¡’W 3=;¾>ìì5{ÝV&aÄä#Å… W|t.¹òCÛ¯š{ïô³+P²g´û¬ÌùgGk»±¥ðÀ‡Ï]™µëÆT…=ö­tL½‡âg9–•KäYóù|ƒ_6tÕÊ&ê† »G•¿À5³;Zl¡4YJ"Çp*J„ÃEX–¨T¼î|¬bú1óÈöÁÆ™+‰¾mîÇvì,ÏYBz¤¡ª·ÚÞ↬Émf%Wß.óz®ÛSxï“Õøš4Ëû€æ £øO«T~X '0µÖ²~ åXœ$¿µnçiã~bzLç5yœ-«gèÐXXݼ>d<Ãx'³0“pßf!ã¶½ªBgã3®t©á™ÿéÁPµ-œeI&#åã‚rI¸NpK8,5tL¯²µkï^“¼Ó©Ê®JVÙ­ëú,ö¨ÄÖn²ÓßþÉÄ^ñMÂkÁÛÍ!ìíBz¹*²âÒ5±þ‰J‹„gÉ(Ñ対À½ɘ•]“½BõËšÀZÒùÈgBŸ¥iÀ;u(æ*ƒ—L72¸f?1Ñ ^‘–™st/£^j03<¬ysm²¬ûŸãÕéñh༤n‰ü·5ý±a­Ò¼Œ„ŒÅðÊmØlºdÁQ-iÓq½l-§Ðµ êÁ|ôÕ ©0˜Àa_®Î^îC~”[•)™8Š×Øu‰ õ~¼3ú‚[ÈòíÎ,ÑBiîÝ+hÖæï„M_&4Áé Ê|S¾ö2ˆ½Ï·â*@½Ð”‡,UÛ&Þ¥a3è’pýzV 1œ²b¾2ÖŽO°3fÂóbŽ•äÊßuw{9[±„ˆ­²Tµ¸ÓùyƒÄ>ç¾}„Öv€Öqà“bßNºmŽpÐø©²ÄpÃMìeÚ%a¨Ñ«·oXÏL¤bg›Ò›zýL Dö„ rTήŽÖ玿,2KÒ„b¢Jäbt0F«ÞV ]çò±“Œ7X³²S¬V~­F§þ¶ Œç|%-DS¶-S/Ì+R*âóFjõ¤¯[ÿjé#›¨,j꜓™8¡ÝýèžW E uMÁºp’¸jšÓP‘YIïƒÄÕäh2_]XPfÇÌ âw]:·ç°CÑÁpÖ-ض«9eêý¹àë&Ÿþ;ù¬[:úFC¥}ä*I¼@ËY©ßmⱯ“ÏMˆ"#eRÚùäW«rnÞ­~$§†˜PÈÕ¯ì+pS‰>›L\²µ^t¤ø€˜$À›Uµ³.jÑä©r«¤z#”dfŸƒöê1HÅ áÖÑ›AuÀæÞdŒŠQ^ÆÄÁf²êŒyùjàÒ÷œM:ïÇŽL3@¶k6íœâü…¦êã¦F§ûó—•û»iéíT•C&eïôey²Mà°ŠBà¹f¨‘k¼_Ò.S„Œœ…DõÑ2‹ö»²`åk Ç µTG# Þ-++¶Ë„'“Fà ’0뜷|jDDú̱ƒ™Ò§)…ôÂ%»ÅG¢ÐÍHI±Œ)„؆0)ò¾”Ô0^#Øž¦{^¡øý„Ÿ,²rtÍsDšÀÆÄî¬ó}ô{:;&§r/ùŠ›%í™ê}ÛU Œ!îT¶vµ§¥­Çø¥g¿YàJn°×'O§-ûò°ªÐ¹`Ñxµoy‰¡¸sÆ™ Õe.®¥ø;}xNÊ»ò#B¬_Å"Ôk¦ò‡ûE.Ƥ¼—Õœ‚ïdTø¬ËÜÈîúîöqÇ€îŽ]mK¿—=ô1c>kKÛ}4.ÇsÝ<ðZ" ñ6äéÌ‹¾GºÁä!meW€~ò%væ2úºLu(»ÛFj\ökô¨j4‹W^u©bñ-# X¼@£¶fá.aËVæg…ÙçŒó3³Æ ‡§EÊ!{‹|¡çB–€Å ÓϾ”qyݺº¯^É ®_é‹8ON®y7!º}ú ؤÛzµJ‰Qõý›Ñó#˜ 5_L‰åé¥Ji‰Ÿ‘–¯Úõ½íM¦«Ž`$N’½“ŒÔxðvÚç£ÞÚT!¾£/ˆÊݬí«I^]~ÒŸ¾6­C‡¸¥ý¶]„ú§˜Œ=u.U>rrÈ1¿ŠvÉ£å3ªã’V:ûiîj¸ ’ž»K£KC o3¨'ð£N©¶T8ìO¸LÑÚÃWö¢tôÒÁ€ÄÔ“Ö±…a˜ïð8‰”Ès]ÿ†9— endstream endobj 993 0 obj << /Type /ObjStm /N 100 /First 948 /Length 4290 /Filter /FlateDecode >> stream xÚí\Ùr7}×Wà1S)5ö­*5U–'™ÄŽc9^¢ò%µ%Æ©Tbçëç\Ýl’"-Êœ~˜JÙ½¸Û¹ ÐME#˜`ÑH&µÆQ1厚éq4Ìj…£eÎYó1àèYÔÇÀ¤pÔ 2)£:ˆV`$eX´ÒX´³ŠIAÄj&½k˜ d¬e2ÐÁ…’ ã ƒR¸m`J²‘)«äAt¼a°è$S>  «(AÂ]ÊѦe 6–i-©cÚ€Íè<Ó6€g˜öºÈt0þ ziº{ÉŒ”èî3 BG¯™ÑݽaÆJjc™q†Ú8f2ÊeÜJX)n³†ÜgE%G±:"V#‡a‘Fˆ)u臉¦ž1A§lÞÔ3†˜ }iu EšwJò Ì;5²Tè—‹`ょ0ê{Öƒñ´±àÁzè¥/@ ’r’bgH•¾¥ÕW¯uª'hzA+½J#W¸G!¡cšû`ÚÑÏJ™Ñ¨ÞL¤µi”¬´]Ñ*5wqë4Xí·¼u:½€‚m*om„bPqÆØ—"?AkÂ!T2Aù”V|1¦§Ì0*k%Ó€‚¥i°•-±BßsnK«ãšRåSh~+·MƒÍ>—gŒ1D(ÒÒ4U6½·ÐŽæ_®'M˜€ÄIo0õ!Ït(ì44ƒO©¾4!iñ”^.PŠOaL‚ôÖhÜ?*Rò &0é­ÊÎ vÊQÞíŠB‘³µ úØBô ¬QƒBÑmÃ}õð˜ÆHT^0þæío ‘& D ˜7Ñë½ñíhô®iûd2ž§1Ÿ`ºGï¡R¯'ˆ–ôÚ‰.Ð?ŸNÎOj0ÈøóÇOYœ³4Æ©B,SÍéHqͺ{m©½¢GÍféÅž˜ñ©åÍøô õ\ºnè¤gtŸ^HÒëEz޶M»¦_sN¯<Ó½r¿å»áƒøjÆÆóî‘Ú¤±¨_GV:’Û4ÏšÞÈuûÑ9ñUäwpJ^’èTÒk z…½.ûå'å¢Z»G‹wºì·tÒ˜˜¶Á¢ì¥€óÇæ@ÐqUSÙç6™¥ %†(û4hÞgÚ•¿cÕ/¦é AŒÌÐ,sÒU0-æ*¸Ho§1§Mã[惢–¨[a¢H{ør‹¨ž‹¨äpшîÄôJÚ êäPäA™÷1 l -’ÑŸ(€ä’¼wì;´hîÚwLc'š}2äÒÓ2ÃÀÞ{ÀNg¸Óž/îÞkŸ^‚۲ݿÛ=M»»ï6ôw:מ,û;›æ—ÇÔ’Ö1Ê>„Ï´'ÜYK&ÏûÜ"‰JKA;Ãd¦æ#!ÊY—,•å ŸVeXÒã‰Åt¸?í]ÇÑ«öH˜£—¸hØÒ{#¬‹ÄF‰Q Ä{À¥9bAaC&…Jl'(Ñ*Á’¨wì;*£tcîØ7Ú×IEy¯ Œ)óŸ­Ï­8oòú,‰Ò¦, Ò9m"ß †%§ÈÖ£„êC‚ø]ÿ蹌éã ´ikÓ¸´Zv~‰}sARÛ26mMŸÏmmûôOÙ¬K £Í«äsù‚xÒuê˜üØgµÎmq?õ+íÚ~åœÞ}5cÓý† Ú0jÙ2JŠî0ÜžÔÏ銺[2=oúå(Ò¸S2cNÔuN“¤ÛbÆ“›²@ä.E[0l2#=§¯ šqÈLMÁ“Š„R¼44R‘ ÿQ*¢È&e ¢­C6ØúR‡¤¬šqŒ7KÙøÁ¾²§ëÄ+}³×øáVLSéþCý±á»å£ãwIoc£ç®7íSÀ*Ïš-é§Ó/ñ»ÐÏ?aõÿ"¬£@.³¹Rh,$“ˆ í W Ÿ.V­˜6+Š6‹éÛòT§€3)F´Z²Ž-E¯iÁ©pAo’š{äë4j¹×ú%µK™¢ãóÎC™vKxoŒ±²åZ¸±`gëZL+7–_݈1ßmÓESAÀ&xä»Ö_…í½à^ÓÊýwÕZSx\ÏΧÛùdš×ž ®ñääí“çG¯¾>~úô)ð`4¸œ1“[M>²ÓC­Ø¡¢/±…–ÖFÍÎëñÕ8Zn¾¯‡—WsÊWœÈгCI˜FÃóGãËQ;¸q2¯¯_A=üMée´Ä Wƒ)-g|Å/§õ`^Où¨žÍþ•ùx2Do˜ÊÒêÇò²ÎfÁ^ýrüòäuÌß-—,bI/÷$VÅL§“¿®&“Szº"˜ßE°gGG¯I°“·›,†¼}H_¸K))¦Û…hóa¢±Y´ì5œ}¸̯øÙ`º"\ÜE¸ßŽßüøö»$Ü&«YÈF?PôÙ\Pû-n7Û¨~?‡`çf£ÁìjY<)wïõ÷?=~óõ³áõÙíìédüÓá‹úòvƒ ävˆo yÕ·ÀSÙ®œÖú®œÆ/Ë)Z)»àT®+å#~Äùcþ-¿KË ?òŸøSþŒÿÌŸóü„¿ä¿òWü5ÃßòAkq>€^š!ãó³éà¼Î£³÷tú¡ž··qžœóóÉh2ÆþúzÀ/øÅd4 5O|òúÛÁˆ×ÏGƒkþž¿þYó÷“Û)¿lãÄ¿útsUùÿÎ?ðQ üšùx8®ùøöú¬žÎ†—c>áܸá7ƒi=N¬¤³ÌÈM=%Òq8¹à7£Ûÿƒÿq;™×g£|’ú¤³ÜgÊg|V_³³úOp1~äYs>¿šÖ5Ÿÿ5á·üv|6Î'ÓšÿÉÿâù'þ7ÿ»žNVà¤wÓËÇO_¿9)p:NG“ÑÅ8¡`?Ô—fäõóâ8Ju•.[@)¹ P²‹(«Õ— ê¬EÂEk|²÷’É;¦&C·6n ›m—ÍÒc£ŠÖM°Sšùõ·WÏŽWMp<o2ƒŽÙ ~ ´šhŠc_d…×_n¼l mu”Ýræ/ß>úùÍ]V"n°”Ã(ú}š¤ßL=Ø_ck*%6šê‡dŒÁöH™c$¬‘L1,˜@Û¤Ñùº?­(m§\üâ×ïž=þµ«´-É “ñClþ)XÌ~mÉemÉemé ¸¶£+¥·Ãú?KÀþå®”u1¬§õl8[$¯³ÍÊ>»êÕìt>¹ù”/<¤_P¬_ËSÅkFw8ÎïÛ\§åòóN´š¢vÊF-{º›’»!çøøÕ³Uälq5Ìp€z&— çü„-ø9fVÃ`7.\­[‡$ÃfÏûÐúÞ=£ÝC2‘º£øv|Œ/¡…áû÷0âø¼ž±S•07Â$¸Aa‹‹ÀJuUj¦c·š¹S„ÖYÚ²Z ’‹t^Ä|R —ÅLÈOnP˜ð˜µ™pßÀ´l*Û²žKiÇœ¡sgoGÀ^öìE}ÚñqÀ¬kƒE—qÐ ³¿wÌ}—ËÁö¶ã0¢·)3ibLr¨ _w." -³.BSÆ-BýPyá¨ïÖ}¯ó5ÝD1v4˜Õéóµiý’«æßá´ø“át6'Ï`Í~4p£×ËùÕ,ýî÷N×ßF~eò½F=¬R7¶C.Zênwê«3äUòR¬’×êR¸ù¸;ù•9ìuµF]uÉË-y¿;ùsÌ5FÌ#KzP 3”@4nâOúuõμmœ°¬ñ¶†Ï%)ÙeM­…ü{a;{ªËžÚ{Ÿ­`WYTk 7fƒ éWÿ{`qc½¸ÆšÚ¦=„½®öÌ~XÛR¬±gvÀž¼{Ï—õ Èä––op=¥ü›~ØŸºÿ8¼ $žCÒ@þTL¥7/˜ÎÎÇtyN?ôÇñ݃ˆh#ó ¶ j]>º2¸/Ͻý"é%‰É7™ÉzÂ1ä£,÷ó4îaDŒ*ƒª,ÑåZgµÑÏÓÑ~$Æ–Áœ-Çrí‹>“g‚ü"¡ ^¾´ÅàÖd5Ú<8ýAˆ¸.WÔåL&æ\ÜùlŸ—¡1 'â t½ËÄ|È×!/Þ³P˜ 3Ÿ!¢6 9+³òIå¶Aô«~ÉÛt–›þ\G:†‚ÍìÿéudË~V´³ ýi¤“µs¶Ú6-cçÎ NZ ¬tûùv>B-=+±Š•ÀE±*ý%tUXÔm×!Êb¦š"èZŽ"”ôö|Zÿ‰€·Ñr÷¦€¤îj¹{èöV¥pXé-›Þ2†-½e)ÿø3ú¼U­¼JcÉR#¥±ÌÖ±ÔÒXâ®±ôb,q÷X©·\”¥ÿN³,½ endstream endobj 1029 0 obj << /Type /ObjStm /N 100 /First 938 /Length 4882 /Filter /FlateDecode >> stream xÚ­\mܸ‘þî_Ñ3dC²øR‚àg/Xdí5ì]Ü‚E‘›ÁízŒñøŸOI­nIM©Ûëûà‰/ŧž*V%5óA4ÛƒV¿qíé ƒ?Šøm$ížV{ü¶¿ÕÁ9Ìqþà sœ9øh^hËVá ­=°Ç|«Ѻƒ&ÌUÒAæ µÁ):`ª°†Á 1ÊBÖJ?Æ9­^h%Kjô+ öaGö½€÷‡ˆ¶ˆ^¨££7(d”4#ˈBÆÒs 4z… á ‹v(dœ¶(d»27€pÐãP¡áPÈDÈ%!ÈÒ ¨C ‹céˆßÒ%ZùäC²aÖ…F9/œƒ<òFË•>Pˆ¢£ÈŒÄP› òІ¥I;¹r3Ž<ï„ ‚D¦A œ2Co<8P$œÁXdd®Õ7ØOYUI¨8xõ# *˜Ì+É Ö[ñeƒ˜xLJ`ý %BÐ;¨f­ÌpúÀѹ2‡ÏÀŽ‘HæÂi¢Óà ã z€æÈa¸’iŠªùÞ±¼ÜRÁLðq"åÅeçT~ð§ ÚÈ(²vh…&•`÷hõ šç"7´Š£ºÁõE08´ÆÁéäR09xS:Ÿ‹Zì#ôz=Ä3¯UÁ‰“ê¡UöLA¶“•Õä>¸q Ùd~ vºü<^Ù•†_üñ/þðãÃó/÷{öÝ‹?¼Ä¥/ߦ§òáyØMãýSùßaûwÿöðô ñxû}¶Çx÷êñ3fþÞ¾øÓŸ‹¸ó"f¹È$v\¸ån5[ŸfÞ›Ž ¼)ÿ|âÐ¥,0w’eÛ²Ž³[H`£ÓlµG–[Êâu̺ æD­–ôgûø•}ÜByßRן‰÷fw¶šöÜ’u6ƒã=Yna†&.w6ƒ³mYÇÙ-3¸³Ü®hdåÁna†£Ê[lÏf°+3L‹ŒKÚ–ºölkvg/Ì`[f°g3·eg·Ð™x²{ÔžËrKê&˜#u–w=˜ÎÖ¢µµZ š3Õf#" &u h‘NwGPz½ÈÙ"fe5©>Áó%Š‹%§‘ǼäÁ­—<N¯ §ûGû+úl8mÛ³GVLkÇè³ ôÒ¼°ºR ýôb‹%Oú™Õêl7µ²Û$ö¸HË1ÕÙ Ê´gú©–Ϩ·‘·Õã…Oë¥OQuU¼§k<#.mÁs×9¦ÈåÌ“!¢jΰņœõ*O/JÝÐ霣yC,¬1íÈq9^ìmöâÂ9«¯“úr=;'¦•ÓÏ)}•Ñí\LhãœÎWÙ|1ÓÏ„†eÎ)z•¡—bæfj¡9çêUª^Š™ÓßÊÓç4½ÊÒ 1‹ÝJÑç ívX]$ëV®>§jצx˜é¬ž3î:á®ücÎ+/¼ßͽ?,½?¬V;‘ow½‘ [ùùœži×­¹º•ªÏ™z¨—‚‰Ú6Lpο«ôÛʾçäkvY_dâe"^äáý4|ÎÂûIØÌYoÂ>çÖ]Öç\™æùà\¨-ƒì¢6jVçôÕšx¬f á´éwÝnQ„,kE»áÏvc©q Í1¾I¿–O‡ÿþÝ«_Ý¿ÿñÝwoþz“h³Æû>–¯ß¢ÃØ÷—Çüû÷Ïééùî`F÷8üîÛÿxùúí÷ߊ„ã¨ïÞ¼ÿñå÷ßK‹9¶<—_¿Ñh½öïPìáׇç5†iÜß×@Çvu‡ ­çµ´Ì×0²†›54„Yƒ•ž584Œ;uë´â4¨ÉËd?“¤a¾ßÉØYCÌjløþ»7;²ýæÛ/·Ü„åÆh¤õ^ÄÌoa2K3÷¯øËOß¿|÷ÝýøÝo¤ÓÎ:ßþðú­‘F¿n¼‡/¥_~)¿Ü×ǧÿ‘!a>ä©||zÌåÓ§‡?ß?ÖûOŸŸr¹¯¿”O¢õ|‘_¾5•Gi+ÕÖØ—3Úª~|üõãýóÇ^@ ßÿôþÛwÂßQ—ŸÞ¿üëàš4Þ§péþáŸß¼¼;„¸jûóÝ×ã^ÝÉ3¤&â3„ùð ¸ùéãsy÷?²7µ€t—M$kÙ‡5«‰â²nÙ$Ž×0gKÏn" bá¥XñÞãâåù1ÿ+þ=ô"Ïðq#Ö‡Ÿ??•o2Æ?<~6ùØñð¡/ÿÄö³ûû÷?½~ýòÝJû&\àX¾€=Ãc“`?|tÇééÁÜß?•ŸÑyÿð¡>Þó?înŠ ÓÏeP@ÛyƒjݼEÂŽºpЦӨ ðc‡l9­æbIZ Yi‰ó˜ÞN2¶xiáyË`Ç x§UO£6€ KÏJȲó%†0;gÍ ±9Ì[„$?cDcÚ¸øî<ªË=a!Pè sÂŒÐæ„¡‡ç„¡‡PEãñLuLV=Úzœš³!IÇÎ×$Ðã¦<1¶€·ÀE ÇÅ9Ë9Þ´ )‹žFµqèñv®(ï0@ç¹è jN!ž@‹1X<Ø6a²êiT˜¤àÅž³ 'ø9V¢%/Æ€yq4k=¼Ø ÖJ÷M\'X´ ìD5w0 vbœ£"ïÜFwý<\Hæ XÚ^/+NƒÚ˜¢_“Áo¿~y膰EF5Úï“.…"ÙÄ¡/®vT´íºRÙ„šUµYb—mδ.sxã:¢¾S”¹Ï¤pÕS%ç9í¿ÕÌ\zÃJu6G›;ct¤]ìCR„ Ï͙·`˜jðÁEKM>˜®W¸IUк&yÃøBa—$/xë¬êŠUEg¨‘¼b‹ÅwN‡œ$Þ(ßÔƒSñ%x]ØÚœz­ )ß1Å.(ïú(Ü-íu‘‡(ê½÷ U!,Ò“ÊTz¬—bVÁ×UIä3\1hÞa5êüäuï#Wsµ}T.™¾#“t£öE8ø‰aö:p`V>÷poêŠéRÏ%[¡/,ö¥<ÿöå·l|! q/«M‰}ÊIÁR‘²wĵ ±h÷¹ˆÔqj¯kA;V¥êb²/¥–œ$†S~ÚÜIé 7-1i¥ú¢¢.)ñ§Dí‹Èì;[³ÍÊvòƵ1)AÐ}æšÅ/¾ˆ^±ó9.ž@,'’{E&võ.ú„¥Jd…HÑõ 2rbŽ]†eG‰ãÃц_üÛüv[òùSyš‡×ånœ÷Þ':ïj%«CÒÕGc;›tp6¹Î/ùleøå|y!9ûšûRät­Ü¥Ê\5Á“äCÞ™í“û.ølœ· Ï%ÇÚ#&Ô”Éú~gþõ ‚Ù™Çj²II¹Îu¥wY»‹­`&(ñ—ÀÆ^òüåßbÄ[¢rð{4E[tìkêt—¢v^¤9+Š\ê‡R)„½ùɨS¾×¶ö}ïLéƒ-Å)gb6<ÐlwæÕË6îÙÅár±ërŸ,!/'Í~X_íÍ×Ád¸ŠU){ÓÕPt§uêj­NâSX—åü /`7uÖî]£F®éX™¯o0ó-–øöá"Éz×Ú–À^KÓ¨_p2è*68«X¸ó‚{ñ¬í-‚úê¹OÉw¹ël,¤qTÉ©Œ˜a<€ˆèA É¢uÞ"²YÝ!\W¯¼RRë«›!Ï›D¶‡ NhVžSÑ"¶¦\;)¡oTPsòµ N".5´e›*[¥:»Îqa¯]ñÂ>•,þe8ŇÉdçÖ!±¹u«‘¸p1V‚ª¿+G­×­NZ/H 4‹Ñ;À½ˆ¢õâæ"ÎFñªUΕj=”¤ºYÖ#©mÔþn1xôpÎ +érÔôkpAãªQœÚ¬%X­xøFËã­7»»åØ-Ä蔇qKã~cLJAËF–FwÑ($»u£×ɈG‹Á›y`9¬Å§€u£$Šº?‹ÖFN¼ëF’·X,Fob~5ØË¬V}5OnÝ*Ë®™~%üépÑ ú¤ÍóÓçüüÃÛ—ï¾C,y7‹"²6¹ÀíM¾Tks,*D…:´SZi£rH"ÉÇ„ªš­á^œÈ\Ã{/3Jì ’]F…ïP‘eBÑš\«D7=¬ÙP¢b Lȧ9a"ºlmèu°¶1ẘDTû®jgcõÖD£t)Êà°2U9:宋©%æ"Pn¢ôÄéÉõPÍTò¶×ª7ê&1=ªÖŽ9)|©J³aˆÉ™AÄ\zíWÙìëðl8Ðø®eå¨Ä ³6ÆàŠÈ«Ò•j*Š I û®#TKI:uUŠÁÉ•iv¾¨’$¹’AÅ:žürß8…í)5T¬U&œ¤ûìq˜!è«RÈ&ʉpˆC© ­*~ÔŒ¨¾: 'üu¬bdê¯( M§{_úLŒ’qÐr"Ŷ£i‹¯Zëv£CX¶ð®Ã6Å ªF²îªcn®«_¬ó®ø(fR…Ô¡h »q‹ëΣC†”5êNãáØÕ[RrÎâè) Ï]—RM’c|ìKÍ(ÞjîŽ/ÐGÎQÂàtÛ‘â•<Ðì;Ò¹.‡p ]$²Ñq/Îå躕v>…òê-ပTÅ)+•ZK¼Ù-n±ÖW¡ùÇñÔ{‡¥qR¤¤qÒê³A0Å~r¨š‡— áúf…8…M‹£e%üª ¬S)ã åúæUµ‘se_p@Qœp†v½ÒÖF†'Z×Çl­\NŠØÀ…,МÁõA⫘üºã0N™‘R4y┚X²yDt–¬ó×8ÚÞqUŒÄ…qv¯¥ïBî2R0Ô\øǹn­¯Bó%Žán&HSÅCbXQI÷¶tyxj¯Ôõ:ö‘ƒPO”>x…üºÌE—å4äÂuc!Ê„ ëöÚÉ3]À².æÀ•5—ŽeºëN\8¸EܳV[ðäB½‚oƒêÄR„p]JBF³!Û@º³E#«RW‘Ú“QH˜RÙ‡ë¼Ô(SõHÍNý8bs4¯°^Ÿ‡Dô%ŽsÝZ_…æKÙŽJ©8]E¡&ȬL¾Jaê[!Y>ÐXçWoâM#QñÄX’•¿×Ò± H@ŒqÄA'ã‹%yè‰o”ej4}ÍCR=|UÙâP£ØKÙ”RE–½Q–5½—·0²vˆwyxn¨þ‹ú±ÈÓ}£¬€ø«õ¦Bd yA¡[B¡Mñ€KÓ\·Ôÿ¦}×i‰L8÷+ÇÔSõ) ,AìòòŒ4 ŒÙbDÍ[Ý¢O¨ºp6ª„Äá’Psôµ¨Z‚6eîFYØ#ˆÉÖlŽ,Û΃= ½ËUXP¸QVíý9 G_¼r‡-ƒJÝ ‚y"kŠ‹Ÿ»ÙÑ\Ž¢ÓëÀUœÐÝ®ùÛ—ë\Út> gyE f8П”ó.ŸØ¸f—Ìš^3ͺ^Ÿónt0.¿}ºÄz9oOÁWG-,5•g64ºFkv ™b³KzjvÉFš¸Àz9o_Ááù–-¨v€b³K r ªFÝì¾vsÍ.㮂öÒ‚®ù¤i9B>ž;=ûD×ÊŇgyÊo÷ÏNy»_ꀹ¬û% ÚùRØ}Í%6&7Õ_NjªÁ9`»Ó/§îw@‚W{+H0Wzg€|é¤L‹‡†6["®²1Œ“ç¯ó¨u1@«ª=>äA¶r;$GlyÕ0€e@Ø ß‹(¾ÆÇ¤Ï–Œ›çmäÓ>ovø/ý¼Ù“ æ7;|˜áC·>äK?onâÃÜmЏ‰ÙѼƒUv4ï@•ͼÝ/»‘w6“&ãÎ^’ƒoÔ·0Aw[n"B>^™¾}[÷Ó6üVh£ÑÞÆí~±ùVX¢‘hïôv¿lSgn!"ÞmI¸Jó޶ÈnwÍýñjНžõV?ýf»_ˆloб_ˆdjÆÎIÂ"Æab‘¶ëýòõ˜Víþ£ÇÒ[ý4ö›í~y-K´Ý//hÉîqÒdCÂU"h,E¹- Cí,m÷ Pk·ûå»»#_ˆ¶¾ÝoD· Ɔ&®aóq  ¥«ÂÓv¿0Åv»_˜ÚÚöè’×öÆI• 71!¯]·ö†ôËØvZûå•7ï…Èùn49¿ÕOc¸…ˆV%\%ÂÅfè°7˜Âv¿|ÔM| ¨ÛðÝQ èßzÌþYpø/tŽfº éÂNn÷oÔHsZÆO"ÂtÁÓE<^Ø ŠÕ{ÿrñiÿ´†€Û ¸€CÆð_ò/ÂÎ7ú_ýýä Ò¤¤”t“’nâÛM°ÝöYàÅgÿÏßNì endstream endobj 1094 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20210225125140Z) /ModDate (D:20210225125140Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 1084 0 obj << /Type /ObjStm /N 10 /First 88 /Length 456 /Filter /FlateDecode >> stream xÚ•“[›0…ßù~Ü}ß=–"¤–•ªª»I”MŸVrÀDH¹¬òÐ_c:½AÓV¼| öÌ9g£ %Œ‚"LÉ4L `ˆ±DéxÆ-YK‰Q©àÄòá°ÄJ,Iö©­;òÂhhKÉ&|S A#@°ì’ì±=µ}¸×ùªo/甥üžÜuýÛµê׫§5/Ë?„/eÙž›Ké4·”)L|Ek¹¯Œ§µ£ ­ç›æ~—äù/Ê‚«qªfA  z­&ÊnhµVÖ‹”pL{SW\hé„T®á‚ N®{´V¤"•3ò0&1iŒIÛo`Ђay?)ÎüQ}ŸòðÀt°Á ¦`0ƒ;4(Θ¹Á¿O±“éEª‚m63n7.ÎÙëb¦!†à¾:…Éš‹mQ>o7—þik€Án à¿WóG/€^,ý«Îí|îÄ8tÁêöË«'Yázw¼’lí~8Ä£‘$[]ûc{K0––îß-߇+O—ÚgŸ;ÇcñÑíý±[,²åõÔ½ÐÏ™Ësá-Ïe„‡<ß-ÙêÕŸßE鄳ï¿dš7 endstream endobj 1095 0 obj << /Type /XRef /Index [0 1096] /Size 1096 /W [1 3 1] /Root 1093 0 R /Info 1094 0 R /ID [<48D6AD6831F13E5F082462DF037343F4> <48D6AD6831F13E5F082462DF037343F4>] /Length 2572 /Filter /FlateDecode >> stream xÚ%˜Kl]GÆï̽Žc'¶cÇŽ'q'q^¶cçáøq¿Û‰ãœÜøÄ±#±`UQ©¨*,*Ô‹@<UYP„† @E•bSfƒ (¯Àbº@H‰n€Bp~_7?Ÿùîñ¹çÌ÷ýçüï …Âÿl¡` ¦PhÊÿÂ>[(Õô¡`ÑÖÐzA m­‡a Ø…öíÃZ°;¿l¥„vža¨GkF;ÇpØ‹ví,ÃЈví Ã&°m­›a3hAG;Íp?hE»‰vŠa8€ví$Ãvp­‚ÖÅðè@[F;Áð08‚¶ŠvœáQЉöíCá8Ú#´N†º@šæEÿ¦/ÏïÊxƒv„¡n¼m/š¾R}­­ƒ¡&ìšÊ ò¡Mª#*Å.ƒ4ݳJh¬¡éž©2»6ÐtÏ*¿Mðm µÁ#´ü†Šñ Ã-ð-CÛa¸ vÐî£iÈÉ¡`̯¿TàƒU>xŒÆ·…ü6ŠÕ2× ÜiP±7šÂ®N-ÐZ}õ©þã"èíÆ¾ð´ƒà8 Ž‚cà8 Nƒ3à¸úÁPÃw¨ÍcyÈÔÜ]jé†RF•õûâ3}¹š»Q0ÆÁ$˜´e}Xv“<«»½O¦#º›L.hÕ(±Âe¼I²[€f,céËæ}ùSúÞE Ь‚u° r)Ý8aȶ½Oö£¸Š3Ày¹eì§¿¯°Ì§”`Š#®ÃØo¾®SÈ‹#/Ž)vL±cÆ]£±Ÿ_Õ)˜ç€C<þG¸ê0Êa”Ã(§ a#/™tå”+ opari2_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ opari2__region__info_8h OPARI2_Region_info pomp2_lib.h /CI/build/_work/src/include/opari2/ pomp2__lib_8h void * OPARI2_Region_handle pomp2__lib_8h.html a8ae6e761e844cad11e306b839b7065d9 void POMP2_Assign_handle pomp2__lib_8h.html a4ced2800b4c94cb22193e4a8b9d7a0b2 (POMP2_Region_handle *pomp2_handle, const char ctc_string[]) POMP2_Task_handle POMP2_Get_new_task_handle pomp2__lib_8h.html a45c8a37325b33db03c8dc30db0d3f385 (void) size_t POMP2_Get_num_regions pomp2__lib_8h.html a5677283f76b1775959efa672bd0595af (void) void POMP2_Init_regions pomp2__lib_8h.html a1ee3934a87de5fb3e14bbef827fc0f4c (void) const char * POMP2_Get_opari2_version pomp2__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) size_t POMP2_Get_num_regions pomp2__lib_8h.html a5677283f76b1775959efa672bd0595af (void) void POMP2_Init_regions pomp2__lib_8h.html a1ee3934a87de5fb3e14bbef827fc0f4c (void) const char * POMP2_Get_opari2_version pomp2__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) pomp2_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ pomp2__region__info_8h opari2_region_info.h POMP2_Region_info #define CTC_OMP_TOKENS pomp2__region__info_8h.html ac86b4fc4c04b1049b788a9fec71dc8fc POMP2_DefaultSharing_type pomp2__region__info_8h.html a93b8b7fd1fc771580ef1e2c6eefecc59 POMP2_Region_type pomp2__region__info_8h.html a680a7412e9daca09b793c6538fb7b381 POMP2_Schedule_type pomp2__region__info_8h.html a9bada01c672e9a100dc7903ba06e76a7 void ctcString2RegionInfo pomp2__region__info_8h.html ada8fce980385bdc6598a889bc2ba7892 (const char ctcString[], POMP2_Region_info *regionInfo) void freePOMP2RegionInfoMembers pomp2__region__info_8h.html a328c8dd30c3edae6a9c076f990ea36c6 (POMP2_Region_info *regionInfo) const char * pomp2defaultSharingType2String pomp2__region__info_8h.html ad0856c731e68eef9a148ab79cd0329b1 (POMP2_DefaultSharing_type defaultSharingType) const char * pomp2RegionType2String pomp2__region__info_8h.html a41324a61d69375fcf4d905a2db32a1b5 (POMP2_Region_type regionType) const char * pomp2ScheduleType2String pomp2__region__info_8h.html a5a45288617878806cd3773be2bad8ec4 (POMP2_Schedule_type scheduleType) pomp2_user_lib.h /CI/build/_work/src/include/opari2/ pomp2__user__lib_8h void * OPARI2_Region_handle pomp2__user__lib_8h.html a8ae6e761e844cad11e306b839b7065d9 size_t POMP2_USER_Get_num_regions pomp2__user__lib_8h.html ae0dfec7d859997b69bbcda438dca1867 (void) void POMP2_USER_Init_regions pomp2__user__lib_8h.html af54040ee98b4278d5b991a36b813357c (void) const char * POMP2_Get_opari2_version pomp2__user__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) void POMP2_Finalize pomp2__user__lib_8h.html ae172c40c40ac62b7587e1b11abfff559 (void) void POMP2_Init pomp2__user__lib_8h.html a973f7b06d14fddd52ed74ee50529c284 (void) void POMP2_Off pomp2__user__lib_8h.html a07b65ff3417a1f6924b4a1754a5b6260 (void) void POMP2_On pomp2__user__lib_8h.html a540cdb76c25649773dcec9fd6a9fac03 (void) void POMP2_Begin pomp2__user__lib_8h.html a103798c6fcdee1063ff8baf88f13d8ea (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) void POMP2_End pomp2__user__lib_8h.html a94e19dfab1ba91569bc18c057ca5ad37 (POMP2_USER_Region_handle *pomp2_handle) void POMP2_USER_Assign_handle pomp2__user__lib_8h.html a7589f2c2aa05b5bed5c15c9e4f07b701 (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) size_t POMP2_USER_Get_num_regions pomp2__user__lib_8h.html ae0dfec7d859997b69bbcda438dca1867 (void) void POMP2_USER_Init_regions pomp2__user__lib_8h.html af54040ee98b4278d5b991a36b813357c (void) const char * POMP2_Get_opari2_version pomp2__user__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) void POMP2_Finalize pomp2__user__lib_8h.html ae172c40c40ac62b7587e1b11abfff559 (void) void POMP2_Init pomp2__user__lib_8h.html a973f7b06d14fddd52ed74ee50529c284 (void) void POMP2_Off pomp2__user__lib_8h.html a07b65ff3417a1f6924b4a1754a5b6260 (void) void POMP2_On pomp2__user__lib_8h.html a540cdb76c25649773dcec9fd6a9fac03 (void) void POMP2_Begin pomp2__user__lib_8h.html a103798c6fcdee1063ff8baf88f13d8ea (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) void POMP2_End pomp2__user__lib_8h.html a94e19dfab1ba91569bc18c057ca5ad37 (POMP2_USER_Region_handle *pomp2_handle) void POMP2_USER_Assign_handle pomp2__user__lib_8h.html a7589f2c2aa05b5bed5c15c9e4f07b701 (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) pomp2_user_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ pomp2__user__region__info_8h opari2_region_info.h POMP2_USER_Region_info #define CTC_USER_REGION_TOKENS pomp2__user__region__info_8h.html a93fefda49d7492bf924809e8b6b6ee77 POMP2_USER_Region_type pomp2__user__region__info_8h.html ae76f4de310f343b64c6541b68ef60600 void ctcString2UserRegionInfo pomp2__user__region__info_8h.html adf68daa6bcbb49e313189a50c692217a (const char ctcString[], POMP2_USER_Region_info *regionInfo) void freePOMP2UserRegionInfoMembers pomp2__user__region__info_8h.html af2baca6fe4127338e932a68d84af374f (POMP2_USER_Region_info *regionInfo) const char * pomp2UserRegionType2String pomp2__user__region__info_8h.html aea1b2a34dad1e46141aa650948fbacfb (POMP2_USER_Region_type regionType) OPARI2_Region_info structOPARI2__Region__info.html char * mEndFileName structOPARI2__Region__info.html aa33fdbf1549f6429201ee0293e7c3fc6 unsigned mEndLine1 structOPARI2__Region__info.html a79fa5ad783540110f20895c447d1744b unsigned mEndLine2 structOPARI2__Region__info.html a69ae9b2133cfc45a05348c9e942cff14 char * mStartFileName structOPARI2__Region__info.html afe9ce03c86b5a601fc5d5a02f364d10e unsigned mStartLine1 structOPARI2__Region__info.html afe9d460b353581336ef01828f36c532a unsigned mStartLine2 structOPARI2__Region__info.html a00a8fe35010120cc7bf9a69aab78428d POMP2_Region_info structPOMP2__Region__info.html char * mStartFileName structPOMP2__Region__info.html a6034a8b8c7b55bc7979977b9334958db unsigned mStartLine1 structPOMP2__Region__info.html a9f0d2a2d58e6ee5e23b2b1e0a1d4ebc1 unsigned mStartLine2 structPOMP2__Region__info.html a5685e6673c14de2660bf224eaa554b76 char * mEndFileName structPOMP2__Region__info.html a8c0105ca03822a142662e80953d75358 unsigned mEndLine1 structPOMP2__Region__info.html a94d58f08bbf8e8529fedb7cbccffd017 unsigned mEndLine2 structPOMP2__Region__info.html ade27fd75d1537732a2459c78f818eb8f POMP2_Region_type mRegionType structPOMP2__Region__info.html a34a3ca3ada9bbf45ae4f1e8248b13e70 bool mHasCopyIn structPOMP2__Region__info.html a2f7f3d1dc98587dbff386c6d8e38b96b bool mHasCopyPrivate structPOMP2__Region__info.html a4bf7f82ec65b0115b0a929e307c1bf58 bool mHasIf structPOMP2__Region__info.html afaf850aae51e3e80f1566ee8fbf836f4 bool mHasFirstPrivate structPOMP2__Region__info.html a4087657089faf52b1d6edc383388ff85 bool mHasLastPrivate structPOMP2__Region__info.html a8e6ec810e13638ac587810f23678487c bool mHasNoWait structPOMP2__Region__info.html a5f2a12e99defcacafcba38d7c161e89d bool mHasNumThreads structPOMP2__Region__info.html af9ecc5af683aba508fb892b2738bbdc5 bool mHasOrdered structPOMP2__Region__info.html a24a152ec56e0eafe41326d1d0329bc9b bool mHasReduction structPOMP2__Region__info.html a629015eae4cec0d4bc7e0da0f0dfaeff bool mHasShared structPOMP2__Region__info.html a127860ebef450e083a0100ddbb3b42a0 bool mHasCollapse structPOMP2__Region__info.html a80c536c6186f3c61f0358b073a302571 bool mHasUntied structPOMP2__Region__info.html a8790f498cf86eb6808a9df5d01449677 POMP2_Schedule_type mScheduleType structPOMP2__Region__info.html aeaa2f47c4731b4e10dd3bfb35a2024a3 POMP2_DefaultSharing_type mDefaultSharingType structPOMP2__Region__info.html abd19d390e07d1ed760ce07bc8e1ec915 char * mUserGroupName structPOMP2__Region__info.html ae8cebc481d4414f0857d96080ca16a8a unsigned mNumSections structPOMP2__Region__info.html a63d659e3d853a16e7dc2364a345af231 char * mCriticalName structPOMP2__Region__info.html a4e4565e6d2c2881d007ab343769f6766 char * mStartFileName structPOMP2__Region__info.html a6034a8b8c7b55bc7979977b9334958db unsigned mStartLine1 structPOMP2__Region__info.html a9f0d2a2d58e6ee5e23b2b1e0a1d4ebc1 unsigned mStartLine2 structPOMP2__Region__info.html a5685e6673c14de2660bf224eaa554b76 char * mEndFileName structPOMP2__Region__info.html a8c0105ca03822a142662e80953d75358 unsigned mEndLine1 structPOMP2__Region__info.html a94d58f08bbf8e8529fedb7cbccffd017 unsigned mEndLine2 structPOMP2__Region__info.html ade27fd75d1537732a2459c78f818eb8f POMP2_Region_type mRegionType structPOMP2__Region__info.html a34a3ca3ada9bbf45ae4f1e8248b13e70 bool mHasCopyIn structPOMP2__Region__info.html a2f7f3d1dc98587dbff386c6d8e38b96b bool mHasCopyPrivate structPOMP2__Region__info.html a4bf7f82ec65b0115b0a929e307c1bf58 bool mHasIf structPOMP2__Region__info.html afaf850aae51e3e80f1566ee8fbf836f4 bool mHasFirstPrivate structPOMP2__Region__info.html a4087657089faf52b1d6edc383388ff85 bool mHasLastPrivate structPOMP2__Region__info.html a8e6ec810e13638ac587810f23678487c bool mHasNoWait structPOMP2__Region__info.html a5f2a12e99defcacafcba38d7c161e89d bool mHasNumThreads structPOMP2__Region__info.html af9ecc5af683aba508fb892b2738bbdc5 bool mHasOrdered structPOMP2__Region__info.html a24a152ec56e0eafe41326d1d0329bc9b bool mHasReduction structPOMP2__Region__info.html a629015eae4cec0d4bc7e0da0f0dfaeff bool mHasShared structPOMP2__Region__info.html a127860ebef450e083a0100ddbb3b42a0 bool mHasCollapse structPOMP2__Region__info.html a80c536c6186f3c61f0358b073a302571 bool mHasUntied structPOMP2__Region__info.html a8790f498cf86eb6808a9df5d01449677 POMP2_Schedule_type mScheduleType structPOMP2__Region__info.html aeaa2f47c4731b4e10dd3bfb35a2024a3 POMP2_DefaultSharing_type mDefaultSharingType structPOMP2__Region__info.html abd19d390e07d1ed760ce07bc8e1ec915 char * mUserGroupName structPOMP2__Region__info.html ae8cebc481d4414f0857d96080ca16a8a unsigned mNumSections structPOMP2__Region__info.html a63d659e3d853a16e7dc2364a345af231 char * mCriticalName structPOMP2__Region__info.html a4e4565e6d2c2881d007ab343769f6766 POMP2_USER_Region_info structPOMP2__USER__Region__info.html char * mStartFileName structPOMP2__USER__Region__info.html a2f92dfc397a0dbc804e55c4ab7ac2eef unsigned mStartLine1 structPOMP2__USER__Region__info.html adad6ea05f301f28eabb3896fe0fe712f unsigned mStartLine2 structPOMP2__USER__Region__info.html afd6302572b35de605e7442e0824b7ae0 char * mEndFileName structPOMP2__USER__Region__info.html aecc81da4f774c976d884b6ae537d5cf7 unsigned mEndLine1 structPOMP2__USER__Region__info.html a199ea4217019eda9cf853871a26e4340 unsigned mEndLine2 structPOMP2__USER__Region__info.html aa6690583d3f6a7766d016dd527ffd4e2 char * mUserRegionName structPOMP2__USER__Region__info.html a42d60ea34302fba9dc19dfa189c79aae char * mStartFileName structPOMP2__USER__Region__info.html a2f92dfc397a0dbc804e55c4ab7ac2eef unsigned mStartLine1 structPOMP2__USER__Region__info.html adad6ea05f301f28eabb3896fe0fe712f unsigned mStartLine2 structPOMP2__USER__Region__info.html afd6302572b35de605e7442e0824b7ae0 char * mEndFileName structPOMP2__USER__Region__info.html aecc81da4f774c976d884b6ae537d5cf7 unsigned mEndLine1 structPOMP2__USER__Region__info.html a199ea4217019eda9cf853871a26e4340 unsigned mEndLine2 structPOMP2__USER__Region__info.html aa6690583d3f6a7766d016dd527ffd4e2 char * mUserRegionName structPOMP2__USER__Region__info.html a42d60ea34302fba9dc19dfa189c79aae INSTALL Installation INSTALL USAGE Basic Usage USAGE CTC_STRING CTC-String Decoding CTC_STRING OpenMP LINKING Linking to a Measurement System LINKING POMP_USER POMP User Instrumentation POMP_USER EXAMPLE Example Code EXAMPLE NEWS Latest Release News NEWS MODULARIZTION LINK_STEP POMP2 POMP2_Parallel_fork pomp_tpd TASKING Preprocessing_of_source_files installationfile OPARI2 INSTALL installationfile index OPARI2 - Introduction and Contents index content SUMMARY opari2-2.0.6/doc/PaxHeaders.6153/Makefile.inc.am0000644000000000000000000000013214015716474015750 xustar0030 mtime=1614257468.227909944 30 atime=1614257468.287910135 30 ctime=1614257497.784004028 opari2-2.0.6/doc/Makefile.inc.am0000644000175100001440000002036614015716474017152 0ustar00builderusers00000000000000## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen University, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, 2019-2020, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2015, 2019, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## file doc/doxygen-user/Makefile.inc.am ############################################################################### ## doxygen related targets ## ## In the following conditional we must distinguish if we are in "developer ## mode", i.e. if we are working on a svn working copy, or if we are in "user ## mode", i.e. we are working on a tarball. ## ## In developer mode we can create doxygen and pdf user documentation (make ## doxygen-user) that will be (automatically) included in the distribution at ## make dist. When creating a distribution, the developer should make sure ## that she has doxygen and related tools e.g. pdflatex in PATH in order to ## generate a complete documentation, see also ## build-config/common/m4/ac_scorep_doxygen.m4. ## ## make install is ignorant of documentation issues in developer mode. ## ## The user gets ready to install documentation in the tarball, i.e. there is no ## need to run doxygen and pdflatex in user mode. In user mode the provided ## documentation is just copied to a subdirectory of $prefix. DOC_SRC_DIR = $(srcdir)/doc doxygen-uninstall: rm -rf $(DESTDIR)$(docdir) if GIT_CONTROLLED USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc doxygen-user-install: doxygen-user-generate: doxygen-user-pdf doxygen-user-html-compress copy-revision-file-to-dist update-revision: @$(am__tty_colors); \ if $(AM_V_P); then echo "cd $(srcdir) && git describe --always --dirty > 'build-config/REVISION'"; \ else echo " GEN $${mgn}$(srcdir)/build-config/REVISION$$std"; fi; \ cd $(srcdir) && git describe --always --dirty > "build-config/REVISION" copy-revision-file-to-dist: @$(MKDIR_P) "$(distdir)/build-config/" @cp -p "$(srcdir)/build-config/REVISION" "$(distdir)/build-config/" @case `cat "$(distdir)/build-config/REVISION"` in *-dirty) \ echo >&2 "WARNING: distribution does not match a single, unmodified revision.";; \ esac doxygen-user-html-compress: $(AM_V_at)if test -d "$(USER_DOC_DIR)/html"; then \ cd "$(USER_DOC_DIR)"; tar czf html.tar.gz html; rm -rf html/; \ fi doxygen-project-number: update-revision $(AM_V_at)echo "PROJECT_NUMBER = \"@PACKAGE_VERSION@ (revision `cat $(srcdir)/build-config/REVISION`)\"" > doc/doxygen-project-number.cfg CLEANFILES += doc/doxygen-project-number.cfg doxygen-user-clean: rm -rf $(USER_DOC_DIR)/* if HAVE_DOXYGEN OPARI2_V_DOXYGEN = $(opari2__v_DOXYGEN_@AM_V@) opari2__v_DOXYGEN_ = $(opari2__v_DOXYGEN_@AM_DEFAULT_V@) opari2__v_DOXYGEN_0 = @$(am__tty_colors); echo " DOXYGEN $${blu}$@$$std"; opari2__v_DOXYGEN_1 = OPARI2_V_DEVNULL = $(opari2__v_DEVNULL_@AM_V@) opari2__v_DEVNULL_ = $(opari2__v_DEVNULL_@AM_DEFAULT_V@) opari2__v_DEVNULL_0 = >/dev/null 2>&1 opari2__v_DEVNULL_1 = doxygen-user: doxygen-project-number doc/doxygen-user/main.dox doc/doxygen-user.cfg $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/tags" $(AM_V_at)echo "OUTPUT_DIRECTORY = $(USER_DOC_DIR)" > doc/doxygen-user-at-make-time.cfg $(AM_V_at)echo "GENERATE_TAGFILE = $(USER_DOC_DIR)/tags/@PACKAGE@.tag" >> doc/doxygen-user-at-make-time.cfg $(AM_V_at)cat doc/doxygen-project-number.cfg doc/doxygen-user-at-make-time.cfg doc/doxygen-user.cfg > doc/doxygen-user-html.cfg $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/html" $(AM_V_at)cp $(abs_srcdir)/doc/images/* $(USER_DOC_DIR)/html $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ else echo "QUIET = YES"; fi >>doc/doxygen-user-html.cfg $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-html.cfg CLEANFILES += doc/doxygen-user-html.cfg doc/doxygen-user-at-make-time.cfg doxygen.err else !HAVE_DOXYGEN doxygen-user: echo "WARNING: doxygen not available. Cannot generate documentation." >&2 endif !HAVE_DOXYGEN if HAVE_DOXYGEN_LATEX OPARI2_V_pdflatex = $(opari2__v_pdflatex_@AM_V@) opari2__v_pdflatex_ = $(opari2__v_pdflatex_@AM_DEFAULT_V@) opari2__v_pdflatex_0 = -interaction batchmode opari2__v_pdflatex_1 = -interaction nonstopmode doxygen-user-pdf: doxygen-user $(AM_V_at)cat doc/doxygen-user-html.cfg > doc/doxygen-user-pdf.cfg $(AM_V_at)echo "ENABLED_SECTIONS = LATEX" >> doc/doxygen-user-pdf.cfg $(AM_V_at)echo "GENERATE_HTML = NO" >> doc/doxygen-user-pdf.cfg $(AM_V_at)cp $(DOC_SRC_DIR)/license.tex $(USER_DOC_DIR)/pdf/ -$(AM_V_at)cp $(DOC_SRC_DIR)/images/project_logo.pdf $(USER_DOC_DIR)/pdf/ $(AM_V_at)echo "LATEX_CMD_NAME = \"pdflatex -file-line-error $(OPARI2_V_pdflatex)\"" >>doc/doxygen-user-pdf.cfg $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ else echo "QUIET = YES"; \ echo "MAKEINDEX_CMD_NAME = \"makeindex -q\""; \ fi >>doc/doxygen-user-pdf.cfg $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-pdf.cfg $(AM_V_at)cd "$(USER_DOC_DIR)/pdf" && \ make $(OPARI2_V_DEVNULL) && \ mv refman.pdf ../ && \ rm -f * && \ mv ../refman.pdf @PACKAGE@.pdf else !HAVE_DOXYGEN_LATEX doxygen-user-pdf: doxygen-user echo "WARNING: pdflatex not available. Cannot generate doxygen pdf documentation." >&2 if test -d "$(USER_DOC_DIR)/pdf"; then rm -rf "$(USER_DOC_DIR)/pdf"; fi endif !HAVE_DOXYGEN_LATEX else !GIT_CONTROLLED doxygen-user-clean: doxygen-user-generate: doxygen-user-pdf: doxygen-user-install: $(AM_V_at)if test -f "$(DOC_SRC_DIR)/html.tar.gz"; then \ $(MKDIR_P) $(DESTDIR)$(docdir); \ $(INSTALL_DATA) $(DOC_SRC_DIR)/html.tar.gz $(DESTDIR)$(docdir)/html.tar.gz; \ cd $(DESTDIR)$(docdir); \ tar xzf html.tar.gz; \ rm -f html.tar.gz; \ fi $(AM_V_at)if test -d "$(DOC_SRC_DIR)"; then \ cd $(DOC_SRC_DIR); \ dirs="pdf tags"; \ cd -; \ for i in $$dirs; do \ if test -d "$(DOC_SRC_DIR)/$$i"; then \ $(MKDIR_P) $(DESTDIR)$(docdir)/$$i; \ cd $(DOC_SRC_DIR)/$$i; \ files=`find . -type f`; \ cd -; \ for j in $$files; do \ $(INSTALL_DATA) $(DOC_SRC_DIR)/$$i/$$j $(DESTDIR)$(docdir)/$$i/$$j; \ done; \ fi; \ done; \ fi copy-revision-file-to-dist: endif !GIT_CONTROLLED ## ## ############################################################################### opari2-2.0.6/doc/PaxHeaders.6153/example0000644000000000000000000000013214015716531014514 xustar0030 mtime=1614257497.776004003 30 atime=1614257501.252015069 30 ctime=1614257497.776004003 opari2-2.0.6/doc/example/0000755000175100001440000000000014015716531015764 5ustar00builderusers00000000000000opari2-2.0.6/doc/example/PaxHeaders.6153/pomp0000644000000000000000000000013214015716532015470 xustar0030 mtime=1614257498.280005607 30 atime=1614257501.252015069 30 ctime=1614257498.280005607 opari2-2.0.6/doc/example/pomp/0000755000175100001440000000000014015716532016740 5ustar00builderusers00000000000000opari2-2.0.6/doc/example/pomp/PaxHeaders.6153/Makefile.in0000644000000000000000000000013214015716474017617 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.280005607 opari2-2.0.6/doc/example/pomp/Makefile.in0000644000175100001440000000666214015716474021024 0ustar00builderusers00000000000000# This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, 2016, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ###################################################### # Compiler # ###################################################### CC=@CC@ FORTRAN=@FC@ OPENMP_C_FLAG=@OPENMP_CFLAGS@ @CFLAGS@ OPENMP_F_FLAG=@OPENMP_FFLAGS@ @FFLAGS@ ###################################################### # OPARI & DUMMY LIBRARY # ###################################################### POMP_INC=-I@prefix@/include POMPLIBDIR=@prefix@/share/doc/opari2/example/lib POMPLIB=-L${POMPLIBDIR} -lpomp BINDIR=@BINDIR@ OPARI=$(BINDIR)/opari2 OPARI2_CONFIG=$(BINDIR)/opari2-config # We need to make sure that we use the right versions # of nm, awk and grep. opari2-config returns the right # commands with the necessary options. NM=`$(OPARI2_CONFIG) --nm` AWK_SCRIPT=`$(OPARI2_CONFIG) --region-initialization` all: c fortran ###################################################### # C EXAMPLE # ###################################################### c: example_c example_c_inst # Build without instrumentation example_c: example.c $(CC) $(OPENMP_C_FLAG) $? -o $@ # Linking step example_c_inst: example_c.mod.o pompregions_c.o $(CC) $(OPENMP_C_FLAG) $? $(POMPLIB) -o $@ pompregions_c.o : pompregions_c.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_c.c : example_c.mod.o $(NM) example_c.mod.o | $(AWK_SCRIPT) > pompregions_c.c example_c.mod.o: example.mod.c $(CC) $(OPENMP_C_FLAG) $(POMP_INC) -c $? -o $@ example.mod.c: example.c $(OPARI) example.c ###################################################### # FORTRAN EXAMPLE # ###################################################### fortran: example_f example_f_inst # Build without instrumentation example_f: example.f90 $(FORTRAN) $(OPENMP_F_FLAG) $? -o $@ # Linking step example_f_inst: example_f.mod.o pompregions_f.o $(FORTRAN) $(OPENMP_F_FLAG) $? $(POMPLIB) -o $@ pompregions_f.o : pompregions_f.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_f.c : example_f.mod.o $(NM) example_f.mod.o | $(AWK_SCRIPT) > pompregions_f.c example_f.mod.o : example.mod.F90 $(FORTRAN) $(OPENMP_F_FLAG) -c -o $@ $? example.mod.F90: example.f90 $(OPARI) example.f90 ###################################################### clean: rm -rf example_? rm -rf example_?_inst rm -rf example.mod.* rm -rf example.*.opari.inc rm -rf pompregions_?.c rm -rf *.o opari2-2.0.6/doc/example/pomp/PaxHeaders.6153/Makefile.inc.am0000644000000000000000000000013114015716474020355 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 29 ctime=1614257498.24000548 opari2-2.0.6/doc/example/pomp/Makefile.inc.am0000644000175100001440000000101114015716474021542 0ustar00builderusers00000000000000## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2020, ## Technische Universitaet Dresden, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## examplepompdir = $(docdir)/example/pomp examplepomp_DATA = \ $(SRC_ROOT)doc/example/pomp/example.c \ $(SRC_ROOT)doc/example/pomp/example.f90 \ ../doc/example/pomp/Makefile opari2-2.0.6/doc/example/pomp/PaxHeaders.6153/example.f900000644000000000000000000000013214015716474017525 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.104005047 opari2-2.0.6/doc/example/pomp/example.f900000644000175100001440000000227114015716474020722 0ustar00builderusers00000000000000!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. SUBROUTINE FOO INTEGER i !$POMP INST BEGIN(FOO) WRITE (*,*) 'Hello from FOO.' ! work is done here if (i.eq.0) THEN !$POMP INST ALTEND(FOO) RETURN END IF ! other work is done here !$POMP INST END(FOO) END PROGRAM EXAMPLE_USER_INSTRUMENTATION !$POMP INST INIT WRITE (*,*) 'Hello from PROGRAM.' CALL FOO() END opari2-2.0.6/doc/example/pomp/PaxHeaders.6153/example.c0000644000000000000000000000013214015716474017351 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.100005034 opari2-2.0.6/doc/example/pomp/example.c0000644000175100001440000000267614015716474020557 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ #include /*Disable unknown pragma warning for the intel compiler. * This avoids warnings for pomp pragmas if the file is * not preprocessed with opari.*/ #ifdef __INTEL_COMPILER #pragma warning disable 161 #endif int foo() { int i = 0; #pragma pomp inst begin(foo) //usefull work could be done here which changes i printf( "Hello from foo.\n" ); if ( i == 0 ) { #pragma pomp inst altend(foo) return 42; } //other work might be done here #pragma pomp inst end(foo) return i; } int main( int argc, char** argv ) { #pragma pomp inst init printf( "Hello from main.\n" ); foo(); return 0; } opari2-2.0.6/doc/example/PaxHeaders.6153/openmp0000644000000000000000000000013214015716532016013 xustar0030 mtime=1614257498.276005595 30 atime=1614257501.252015069 30 ctime=1614257498.276005595 opari2-2.0.6/doc/example/openmp/0000755000175100001440000000000014015716532017263 5ustar00builderusers00000000000000opari2-2.0.6/doc/example/openmp/PaxHeaders.6153/Makefile.in0000644000000000000000000000013214015716474020142 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.276005595 opari2-2.0.6/doc/example/openmp/Makefile.in0000644000175100001440000000666214015716474021347 0ustar00builderusers00000000000000# This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, 2016, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ###################################################### # Compiler # ###################################################### CC=@CC@ FORTRAN=@FC@ OPENMP_C_FLAG=@OPENMP_CFLAGS@ @CFLAGS@ OPENMP_F_FLAG=@OPENMP_FFLAGS@ @FFLAGS@ ###################################################### # OPARI & DUMMY LIBRARY # ###################################################### POMP_INC=-I@prefix@/include POMPLIBDIR=@prefix@/share/doc/opari2/example/lib POMPLIB=-L${POMPLIBDIR} -lpomp BINDIR=@BINDIR@ OPARI=$(BINDIR)/opari2 OPARI2_CONFIG=$(BINDIR)/opari2-config # We need to make sure that we use the right versions # of nm, awk and grep. opari2-config returns the right # commands with the necessary options. NM=`$(OPARI2_CONFIG) --nm` AWK_SCRIPT=`$(OPARI2_CONFIG) --region-initialization` all: c fortran ###################################################### # C EXAMPLE # ###################################################### c: example_c example_c_inst # Build without instrumentation example_c: example.c $(CC) $(OPENMP_C_FLAG) $? -o $@ # Linking step example_c_inst: example_c.mod.o pompregions_c.o $(CC) $(OPENMP_C_FLAG) $? $(POMPLIB) -o $@ pompregions_c.o : pompregions_c.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_c.c : example_c.mod.o $(NM) example_c.mod.o | $(AWK_SCRIPT) > pompregions_c.c example_c.mod.o: example.mod.c $(CC) $(OPENMP_C_FLAG) $(POMP_INC) -c $? -o $@ example.mod.c: example.c $(OPARI) example.c ###################################################### # FORTRAN EXAMPLE # ###################################################### fortran: example_f example_f_inst # Build without instrumentation example_f: example.f90 $(FORTRAN) $(OPENMP_F_FLAG) $? -o $@ # Linking step example_f_inst: example_f.mod.o pompregions_f.o $(FORTRAN) $(OPENMP_F_FLAG) $? $(POMPLIB) -o $@ pompregions_f.o : pompregions_f.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_f.c : example_f.mod.o $(NM) example_f.mod.o | $(AWK_SCRIPT) > pompregions_f.c example_f.mod.o : example.mod.F90 $(FORTRAN) $(OPENMP_F_FLAG) -c -o $@ $? example.mod.F90: example.f90 $(OPARI) example.f90 ###################################################### clean: rm -rf example_? rm -rf example_?_inst rm -rf example.mod.* rm -rf example.*.opari.inc rm -rf pompregions_?.c rm -rf *.o opari2-2.0.6/doc/example/openmp/PaxHeaders.6153/Makefile.inc.am0000644000000000000000000000013214015716474020701 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.236005467 opari2-2.0.6/doc/example/openmp/Makefile.inc.am0000644000175100001440000000111014015716474022065 0ustar00builderusers00000000000000## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2020, ## Technische Universitaet Dresden, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## if HAVE_OPENMP_SUPPORT exampleopenmpdir = $(docdir)/example/openmp exampleopenmp_DATA = \ $(SRC_ROOT)doc/example/openmp/example.c \ $(SRC_ROOT)doc/example/openmp/example.f90 \ ../doc/example/openmp/Makefile endif HAVE_OPENMP_SUPPORT opari2-2.0.6/doc/example/openmp/PaxHeaders.6153/example.f900000644000000000000000000000013214015716474020050 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.100005034 opari2-2.0.6/doc/example/openmp/example.f900000644000175100001440000000217114015716474021244 0ustar00builderusers00000000000000!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. PROGRAM EXAMPLE INTEGER i, lsum, sum sum = 0 !$omp parallel private(i, lsum) reduction(+:sum) lsum = 0 !$omp do do i=1,20 lsum = lsum + i enddo !$omp end do write(*,*) "LOCAL SUM: ", lsum sum = sum + lsum !$omp end parallel write(*,*) "TOTAL SUM: ", sum END opari2-2.0.6/doc/example/openmp/PaxHeaders.6153/example.c0000644000000000000000000000013214015716474017674 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.100005034 opari2-2.0.6/doc/example/openmp/example.c0000644000175100001440000000230014015716474021062 0ustar00builderusers00000000000000/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ #include int main( int argc, char** argv ) { int i, lsum, sum; sum = 0; #pragma omp parallel private(i, lsum) reduction(+:sum) { lsum = 0; #pragma omp for for ( i = 0; i < 21; i++ ) { lsum += i; } printf( "local sum: %d\n", lsum ); sum += lsum; } printf( "total sum: %d\n", sum ); return 0; } opari2-2.0.6/doc/PaxHeaders.6153/doxygen-user0000644000000000000000000000013014015716532015511 xustar0029 mtime=1614257498.10800506 30 atime=1614257501.252015069 29 ctime=1614257498.10800506 opari2-2.0.6/doc/doxygen-user/0000755000175100001440000000000014015716532016763 5ustar00builderusers00000000000000opari2-2.0.6/doc/doxygen-user/PaxHeaders.6153/opari2-config_usage.dox.in0000644000000000000000000000013114015716474022540 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 29 ctime=1614257498.10800506 opari2-2.0.6/doc/doxygen-user/opari2-config_usage.dox.in0000644000175100001440000000407514015716474023742 0ustar00builderusers00000000000000Usage: opari2-config [OPTION] ... with the following commands: --nm Prints the nm command. --region-initialization Prints the script used to create the pomp2_init_regions.c file. --create-pomp2-regions Prints the whole command necessary for creating the initialization file. --awk-cmd [Deprecated, use --region-initialization instead.] Prints the awk command. --awk-script [Deprecated, use --region-initialization instead.] Prints the awk script. --egrep [Deprecated, use --region-initialization instead.] Prints the egrep command. --cflags[=(gnu|intel|sun| Prints compiler options to include pgi|ibm|cray|fujitsu)] installed headers and adds compiler specific flags to prevent warnings for unused variables which can occur during the instrumentation. --fortran Indicates that the target language is fortran. Sometimes for fortran different compile flags are provided, in most of the cases there is no difference. --version Prints the OPARI2 version number. --interface-version Prints the pomp2 API version that instrumented files conform too. --revision Prints the revision number of the OPARI2 package. --help Prints this help text. and the following options: [--build-check] Tells opari2-config to use build paths instead of install paths. Used for build testing. [--config=] Reads in a configuration from the given file. Report bugs to . opari2-2.0.6/doc/doxygen-user/PaxHeaders.6153/opari2_usage.dox.in0000644000000000000000000000013214015716474021276 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.291910148 30 ctime=1614257498.104005047 opari2-2.0.6/doc/doxygen-user/opari2_usage.dox.in0000644000175100001440000001002614015716474022470 0ustar00builderusers00000000000000Usage: opari2 [OPTION] ... infile [outfile] ****************** general options and parameters ******************* [--f77|--f90|--c|--c++] [OPTIONAL] Specifies the programming language of the input source file. This option is only necessary if the automatic language detection based on the input file suffix fails. [--free-form] [OPTIONAL] Specifies that free formatting is used for Fortran source files. This is the default for Fortran 90/95. [--fix-form] [OPTIONAL] Specifies that fixed formatting is used for Fortran source files. This is the default for Fortran 77. [--nosrc] [OPTIONAL] If specified, OPARI2 does not generate #line constructs, which allow to preserve the original source file and line number information, in the transformation process. This option might be necessary if the OpenMP compiler does not understand #line constructs. The default is to generate #line constructs. [--disable=paradigm[:directive|group[:inner],...][+paradigm...] [OPTIONAL] Disable the instrumentation of whole paradigms, or specific directives or groups of directives of a paradigm. Furthermore it gives the possibility to suppress the insertion of instrumentation functions inside code regions, i.e. only the surrounding instrumentation is inserted. See the paradigm sections below. [--preprocessed] [OPTIONAL] Indicates that the source file is already preprocessed. It requires that necessary instrumentation interface headers are already included. Furthermore, it requires a marker, e.g. ___POMP2_INCLUDE___ immediately after the respective include file. [--version] [OPTIONAL] Prints version information. [--help] [OPTIONAL] Prints this help text. infile Input file name. [outfile] [OPTIONAL] Output file name. If not specified, OPARI2 uses the name infile.mod.suffix if the input file is called infile.suffix. ********************** OpenMP specific options ********************** [--disable=omp[:directive|group,...] [OPTIONAL] Accepted directives are 'atomic', 'critical', 'master', 'flush', 'single', 'ordered' or 'locks'. These directives form the group 'sync', that disables all of them. The group 'task' prevents the instrumentation of task directives. E.g., --disable=omp:master,atomic diables the instrumentation of master and atomic directives. [--omp-nodecl] [OPTIONAL] Disables the generation of POMP2_DLISTXXXXX macros. These are used in the parallel directives of the instrumentation to make the region handles shared. By using this option the shared clause is used directly on the parallel directive with the respective region handles. [--omp-tpd] [OPTIONAL] Adds the clause 'copyin()' to any parallel construct. This allows to pass data from the creating thread to its children. The variable is declared externally in all files, so it needs to be defined by the pomp library. This option is not supported when using the Fujitsu compiler. [--omp-tpd-mangling=gnu|intel|sun|pgi|ibm|cray] [OPTIONAL] If programming languages are mixed(C and Fortran), the needs to use the Fortran mangled name also in C files. This option specifies to use the mangling scheme of the gnu, intel, sun, pgi or ibm compiler. The default is to use the mangling scheme of the compiler used to build OPARI2. [--omp-task=abort|warn|remove] Special treatment for the task directive abort: Stop instrumentation with an error message when encountering a task directive. warn: Resume but print a warning. remove: Remove all task directives. [--omp-task-untied=abort|keep|no-warn] Special treatment for the untied task attribute. The default behavior is to remove the untied attribute, thus making all tasks tied, and print out a warning. abort: Stop instrumentation with an error message when encountering a task directive with the untied attribute. keep: Do not remove the untied attribute. no-warn: Do not print out a warning. ********************************************************************** Please report bugs to . opari2-2.0.6/doc/doxygen-user/PaxHeaders.6153/doxygen-user.cfg.in0000644000000000000000000000013214015716474021314 xustar0030 mtime=1614257468.231909957 30 atime=1614257468.287910135 30 ctime=1614257497.828004168 opari2-2.0.6/doc/doxygen-user/doxygen-user.cfg.in0000644000175100001440000031665614015716474022530 0ustar00builderusers00000000000000## Several variables will be added at 'make doxygen-user' time # Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "OPARI2" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "OpenMP Pragma And Region Instrumentor" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = @abs_top_srcdir@/doc/images/project_logo.svg # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @abs_top_srcdir@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = scorep=Score-P \ cube=CUBE \ cube4=CUBE4 \ opari2=OPARI2 \ otf2=OTF2 \ mpi=MPI \ pmpi=PMPI \ openmp=OpenMP \ pomp2=POMP2 \ ibm=IBM \ "bluegene=Blue Gene" \ "crayxt=Cray XT" \ "crayxe=Cray XE" \ "crayxk=Cray XK" \ "crayxc=Cray XC" \ "necsx=NEC SX" \ papi=PAPI \ "seclabel{1}=\latexonly\label{sec:\1} \endlatexonly" \ "secref{1}=\if LATEX \latexonly~\ref{sec:\1}\xspace \endlatexonly \else   '@ref \1'   \endif" \ "verb{1}=\latexonly\verb+\1+\endlatexonly\htmlonly\1\endhtmlonly" \ "htmlimg{3}=@anchor \2 @image html \1 \"Figure \2: \3\"" \ "teximg{4}=\latexonly\begin{figure}[hbt]\begin{center}\includegraphics[\4]{@abs_top_srcdir@/doc/images/\1}\caption{\3}\label{fig:\2}\end{center}\end{figure}\endlatexonly" \ "img{4}=\if LATEX @teximg{\1.pdf,\2,\3,\4} \else @htmlimg{\1.png,\2,\3} \endif" \ "figref{1}=\if LATEX \latexonly~\ref{fig:\1}\xspace \endlatexonly \else   @ref \1   \endif" \ "href{2}=\2" \ "emph{1}=\1" # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: # Fortran. In the later case the parser tries to guess whether the code is fixed # or free formatted code, this is the default for Fortran type files), VHDL. For # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = YES # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= NO # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = doxygen.err #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = doc/doxygen-user \ @abs_top_srcdir@/doc/doxygen-user \ @abs_top_srcdir@/include/opari2 \ @abs_top_srcdir@/src/opari-lib-dummy/opari2_region_info.h \ @abs_top_srcdir@/src/opari-lib-dummy/pomp2_region_info.h \ @abs_top_srcdir@/src/opari-lib-dummy/pomp2_user_region_info.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, # *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = *.h \ *.dox # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = */.git/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = @abs_top_srcdir@/doc/doxygen-user \ @abs_top_srcdir@/INSTALL # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = @abs_top_srcdir@/doc/doxygen-user # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = @abs_top_srcdir@/doc/doxygen-user/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = @abs_top_srcdir@/doc/doxygen-user/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 199 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 1 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /