From df55333afac2880985a4aabbe93a2632d209cd1b Mon Sep 17 00:00:00 2001 From: Jithin Jose Date: Tue, 23 Oct 2018 16:32:41 -0700 Subject: [PATCH] MSMPI 10.0 Signed-off-by: Jithin Jose --- .build/CBT/CBT.Core.dll | Bin 0 -> 2377728 bytes .build/CBT/build.props | 158 + .build/Local/CBTModules/CBTModules.proj | 60 + COPYRIGHT-mpich.txt | 40 + Directory.Build.props | 190 + LICENSE => LICENSE.txt | 0 NuGet.Config | 18 + README.md | 56 + dirs.proj | 9 + src/dirs.proj | 12 + src/include/binplace.proj | 21 + src/include/mpi.f90 | 1717 + src/include/mpi.h | 7005 ++++ src/include/mpif.h | 536 + src/include/mpio.h | 5 + src/include/mpiwarning.h | 9 + src/include/mspms.h | 209 + src/include/oacr.h | 22 + src/include/pmidbg.h | 500 + src/include/x64/mpifptr.h | 9 + src/include/x86/mpifptr.h | 9 + src/launchSvc/LaunchSvc.h | 39 + src/launchSvc/LaunchSvcMain.cpp | 244 + src/launchSvc/MsmpiLaunchSvc.cpp | 1466 + src/launchSvc/MsmpiLaunchSvc.h | 186 + src/launchSvc/launchSvcMsg.mc | 84 + src/launchSvc/launchsvc.rc | 11 + src/launchSvc/msmpiLaunchSvc.vcxproj | 68 + src/launchSvc/msmpiLaunchSvcMc.vcxproj | 26 + src/mpi.props | 168 + src/mpi/common/MpiLock.cpp | 270 + src/mpi/common/MpiLock.h | 66 + src/mpi/common/SvcUtils.cpp | 546 + src/mpi/common/SvcUtils.h | 133 + src/mpi/common/Util.cpp | 95 + src/mpi/common/argstr.cpp | 697 + src/mpi/common/assertutil.h | 44 + src/mpi/common/baseerrnames.txt | 78 + src/mpi/common/dbg_printf.cpp | 134 + src/mpi/common/dbg_printf.h | 19 + src/mpi/common/dump.cpp | 260 + src/mpi/common/errnames.txt | 773 + src/mpi/common/errutil.cpp | 732 + src/mpi/common/ex.cpp | 307 + src/mpi/common/ex.h | 461 + src/mpi/common/extracterrmsgs | 799 + src/mpi/common/hwinfowin6.cpp | 189 + src/mpi/common/hwinfowin7.cpp | 175 + src/mpi/common/hwlayout.cpp | 401 + src/mpi/common/hwsummary.cpp | 135 + src/mpi/common/hwtree.cpp | 575 + src/mpi/common/hwtree.h | 470 + src/mpi/common/hwtree_common.h | 45 + src/mpi/common/hwview.cpp | 292 + src/mpi/common/ipcShm.h | 237 + src/mpi/common/kernel32util.cpp | 18 + src/mpi/common/kernel32util.h | 170 + src/mpi/common/mpicommon.vcxproj | 97 + src/mpi/common/mpidef.h | 191 + src/mpi/common/mpidump.h | 48 + src/mpi/common/mpierror.h | 293 + src/mpi/common/mpihandlemem.h | 635 + src/mpi/common/mpiiov.h | 32 + src/mpi/common/mpimem.h | 104 + src/mpi/common/mpimem.inl | 52 + src/mpi/common/mpisock.h | 749 + src/mpi/common/mpistr.cpp | 445 + src/mpi/common/mpistr.h | 366 + src/mpi/common/mpitrace.h | 185 + src/mpi/common/mpitrace.man | 30663 ++++++++++++++++ src/mpi/common/mpiutil.cpp | 227 + src/mpi/common/mpiutil.h | 360 + src/mpi/common/msgprint.cpp | 50 + src/mpi/common/parse.sub | 228 + src/mpi/common/parsing.cpp | 159 + src/mpi/common/precomp.h | 16 + src/mpi/common/rpcutil.cpp | 426 + src/mpi/common/rpcutil.h | 54 + src/mpi/common/sock.cpp | 1918 + src/mpi/common/traceManifest.vcxproj | 30 + src/mpi/common/util.h | 171 + src/mpi/dirs.proj | 16 + src/mpi/mpiexec/MpiexecPmiDbg.cpp | 160 + src/mpi/mpiexec/configfile.cpp | 209 + src/mpi/mpiexec/machinefile.cpp | 200 + src/mpi/mpiexec/mp_parse_command_line.cpp | 3404 ++ src/mpi/mpiexec/mpiexec.cpp | 868 + src/mpi/mpiexec/mpiexec.h | 361 + src/mpi/mpiexec/mpiexec.rc | 10 + src/mpi/mpiexec/mpiexec.vcxproj | 86 + src/mpi/mpiexec/mpiexec_abort.cpp | 27 + src/mpi/mpiexec/mpiexec_connect.cpp | 192 + src/mpi/mpiexec/mpiexec_handle_command.cpp | 2148 ++ src/mpi/mpiexec/mpiexec_print_tables.cpp | 587 + src/mpi/mpiexec/mpiexec_redirect.cpp | 423 + src/mpi/mpiexec/mpiexec_start_mgr.cpp | 132 + src/mpi/mpiexec/smpd_host_util.cpp | 169 + src/mpi/msmpi/api/mpi_alltoall.cpp | 1282 + src/mpi/msmpi/api/mpi_api.h | 777 + src/mpi/msmpi/api/mpi_attr.cpp | 1405 + src/mpi/msmpi/api/mpi_barrier.cpp | 209 + src/mpi/msmpi/api/mpi_bcast.cpp | 317 + src/mpi/msmpi/api/mpi_comm.cpp | 1896 + src/mpi/msmpi/api/mpi_completion.cpp | 1939 + src/mpi/msmpi/api/mpi_datatype.cpp | 3468 ++ src/mpi/msmpi/api/mpi_dynamic.cpp | 1133 + src/mpi/msmpi/api/mpi_env.cpp | 1290 + src/mpi/msmpi/api/mpi_error.cpp | 1450 + src/mpi/msmpi/api/mpi_file.cpp | 1458 + src/mpi/msmpi/api/mpi_gather.cpp | 2026 + src/mpi/msmpi/api/mpi_group.cpp | 1615 + src/mpi/msmpi/api/mpi_info.cpp | 925 + src/mpi/msmpi/api/mpi_ioread.cpp | 1416 + src/mpi/msmpi/api/mpi_iowrite.cpp | 1404 + src/mpi/msmpi/api/mpi_op.cpp | 260 + src/mpi/msmpi/api/mpi_pack.cpp | 819 + src/mpi/msmpi/api/mpi_probe.cpp | 458 + src/mpi/msmpi/api/mpi_pt2pt.cpp | 2938 ++ src/mpi/msmpi/api/mpi_reduce.cpp | 2417 ++ src/mpi/msmpi/api/mpi_request.cpp | 985 + src/mpi/msmpi/api/mpi_rma.cpp | 1742 + src/mpi/msmpi/api/mpi_scatter.cpp | 1171 + src/mpi/msmpi/api/mpi_status.cpp | 673 + src/mpi/msmpi/api/mpi_topo.cpp | 2691 ++ src/mpi/msmpi/api/mpi_win.cpp | 2158 ++ src/mpi/msmpi/api/mpiapi.vcxproj | 71 + src/mpi/msmpi/api/precomp.h | 16 + src/mpi/msmpi/channels/ch3_finalize.cpp | 25 + src/mpi/msmpi/channels/ch3_init.cpp | 165 + src/mpi/msmpi/channels/ch3_progress.cpp | 696 + .../msmpi/channels/ch3_progress_connect.cpp | 463 + src/mpi/msmpi/channels/ch3_progress_shm.cpp | 172 + src/mpi/msmpi/channels/ch3_progress_sock.cpp | 1196 + src/mpi/msmpi/channels/ch3_shm.cpp | 367 + src/mpi/msmpi/channels/ch3_shm_memory.cpp | 164 + src/mpi/msmpi/channels/ch3i_bootstrapq.cpp | 144 + src/mpi/msmpi/channels/ch3i_overlapped.cpp | 150 + src/mpi/msmpi/channels/ch3i_overlapped.h | 256 + src/mpi/msmpi/channels/ch3i_progress.h | 45 + src/mpi/msmpi/channels/ch3u_connect_nd.cpp | 51 + src/mpi/msmpi/channels/ch3u_connect_sock.cpp | 211 + src/mpi/msmpi/channels/ch3u_finalize_sshm.cpp | 43 + .../channels/ch3u_get_business_card_sshm.cpp | 54 + src/mpi/msmpi/channels/ch3u_init_sock.cpp | 63 + src/mpi/msmpi/channels/ch3u_init_sshm.cpp | 89 + src/mpi/msmpi/channels/ch3u_nd.h | 207 + src/mpi/msmpi/channels/ch3u_nd1.h | 15 + src/mpi/msmpi/channels/ch3u_nd1_adapter.cpp | 685 + src/mpi/msmpi/channels/ch3u_nd1_adapter.h | 143 + src/mpi/msmpi/channels/ch3u_nd1_core.cpp | 221 + src/mpi/msmpi/channels/ch3u_nd1_core.h | 66 + src/mpi/msmpi/channels/ch3u_nd1_cq.cpp | 320 + src/mpi/msmpi/channels/ch3u_nd1_cq.h | 81 + src/mpi/msmpi/channels/ch3u_nd1_endpoint.cpp | 2062 ++ src/mpi/msmpi/channels/ch3u_nd1_endpoint.h | 510 + src/mpi/msmpi/channels/ch3u_nd1_env.cpp | 736 + src/mpi/msmpi/channels/ch3u_nd1_env.h | 125 + src/mpi/msmpi/channels/ch3u_nd1_err.h | 18 + src/mpi/msmpi/channels/ch3u_nd1_mr.cpp | 172 + src/mpi/msmpi/channels/ch3u_nd1_mr.h | 75 + src/mpi/msmpi/channels/ch3u_nd1_mw.cpp | 125 + src/mpi/msmpi/channels/ch3u_nd1_mw.h | 106 + src/mpi/msmpi/channels/ch3u_nd1_result.h | 41 + src/mpi/msmpi/channels/ch3u_nd2.h | 14 + src/mpi/msmpi/channels/ch3u_nd2_adapter.cpp | 905 + src/mpi/msmpi/channels/ch3u_nd2_adapter.h | 168 + src/mpi/msmpi/channels/ch3u_nd2_core.cpp | 274 + src/mpi/msmpi/channels/ch3u_nd2_core.h | 86 + src/mpi/msmpi/channels/ch3u_nd2_cq.cpp | 366 + src/mpi/msmpi/channels/ch3u_nd2_cq.h | 78 + src/mpi/msmpi/channels/ch3u_nd2_endpoint.cpp | 2272 ++ src/mpi/msmpi/channels/ch3u_nd2_endpoint.h | 409 + src/mpi/msmpi/channels/ch3u_nd2_env.cpp | 919 + src/mpi/msmpi/channels/ch3u_nd2_env.h | 168 + src/mpi/msmpi/channels/ch3u_nd2_err.h | 18 + src/mpi/msmpi/channels/ch3u_nd2_mr.cpp | 191 + src/mpi/msmpi/channels/ch3u_nd2_mr.h | 73 + src/mpi/msmpi/channels/ch3u_nd2_result.h | 45 + src/mpi/msmpi/channels/ch3u_sock.h | 61 + src/mpi/msmpi/channels/ch3u_sshm.h | 61 + src/mpi/msmpi/channels/mpichannels.vcxproj | 77 + src/mpi/msmpi/channels/precomp.h | 31 + src/mpi/msmpi/dbg/README_DBG.txt | 19 + src/mpi/msmpi/dbg/dbginit.cpp | 228 + src/mpi/msmpi/dbg/dbgstub.cpp | 368 + src/mpi/msmpi/dbg/dbgtypes.h | 28 + src/mpi/msmpi/dbg/dll_mpich2.cpp | 1161 + src/mpi/msmpi/dbg/mpi2_interface.h | 95 + src/mpi/msmpi/dbg/mpi2_interface.txt | 410 + src/mpi/msmpi/dbg/mpi_debugger.vcxproj | 33 + src/mpi/msmpi/dbg/mpi_interface.h | 581 + src/mpi/msmpi/dbg/mpich2_dll_defs.h | 96 + src/mpi/msmpi/dbg/qdemo.cpp | 52 + src/mpi/msmpi/dbg/tvtest.cpp | 350 + src/mpi/msmpi/dirs.proj | 18 + src/mpi/msmpi/dll/main.cpp | 71 + src/mpi/msmpi/dll/makefile.inc | 9 + src/mpi/msmpi/dll/mpitrace.cmd | 290 + src/mpi/msmpi/dll/mpitrace.mof | 91 + src/mpi/msmpi/dll/msmpi.def | 3689 ++ src/mpi/msmpi/dll/msmpi.rc | 10 + src/mpi/msmpi/dll/msmpi.vcxproj | 127 + src/mpi/msmpi/dll/syminfo.cpp | 20 + src/mpi/msmpi/fortran/amd64.cdecl.alias | 2494 ++ src/mpi/msmpi/fortran/amd64.stdcall.alias | 2598 ++ src/mpi/msmpi/fortran/dirs.proj | 15 + src/mpi/msmpi/fortran/fortran.props | 40 + src/mpi/msmpi/fortran/i386.cdecl.alias | 2494 ++ src/mpi/msmpi/fortran/i386.stdcall.alias | 2598 ++ src/mpi/msmpi/fortran/lib/makefile.inc | 1 + src/mpi/msmpi/fortran/lib/mpifort.vcxproj | 46 + src/mpi/msmpi/fortran/mpi_constants.f90 | 7 + src/mpi/msmpi/fortran/mpif.cpp | 3998 ++ src/mpi/msmpi/fortran/mpif90model.h.in | 51 + src/mpi/msmpi/fortran/mpifbind.cpp | 7572 ++++ src/mpi/msmpi/fortran/mpifbind.h | 39 + src/mpi/msmpi/fortran/msmpifec/makefile.inc | 1 + .../msmpi/fortran/msmpifec/msmpifec.vcxproj | 54 + src/mpi/msmpi/fortran/msmpifes/makefile.inc | 1 + .../msmpi/fortran/msmpifes/msmpifes.vcxproj | 58 + src/mpi/msmpi/fortran/msmpifmc/makefile.inc | 1 + .../msmpi/fortran/msmpifmc/msmpifmc.vcxproj | 56 + src/mpi/msmpi/fortran/msmpifms/makefile.inc | 1 + .../msmpi/fortran/msmpifms/msmpifms.vcxproj | 59 + src/mpi/msmpi/fortran/setbotf.f | 44 + src/mpi/msmpi/include/MpiCallState.h | 64 + src/mpi/msmpi/include/ThreadHandle.h | 77 + src/mpi/msmpi/include/Tls.h | 95 + src/mpi/msmpi/include/assertutil.h | 42 + src/mpi/msmpi/include/attr.h | 369 + src/mpi/msmpi/include/autoptr.h | 307 + src/mpi/msmpi/include/coll.h | 1161 + src/mpi/msmpi/include/colltuner.h | 400 + src/mpi/msmpi/include/colltunersettings.h | 104 + src/mpi/msmpi/include/collutil.h | 97 + src/mpi/msmpi/include/comm.h | 605 + src/mpi/msmpi/include/comm.inl | 170 + src/mpi/msmpi/include/cs.h | 87 + src/mpi/msmpi/include/dataloop.h | 419 + src/mpi/msmpi/include/datatype.h | 1312 + src/mpi/msmpi/include/dbgsupport.h | 38 + src/mpi/msmpi/include/errhan.h | 117 + src/mpi/msmpi/include/group.h | 139 + src/mpi/msmpi/include/info.h | 135 + src/mpi/msmpi/include/init.h | 291 + src/mpi/msmpi/include/list.h | 328 + src/mpi/msmpi/include/mpe_thread.h | 324 + src/mpi/msmpi/include/mpi_fortlogical.h | 72 + src/mpi/msmpi/include/mpi_lang.h | 187 + src/mpi/msmpi/include/mpichtimer.h | 130 + src/mpi/msmpi/include/mpid_thread.h | 452 + src/mpi/msmpi/include/mpidpkt.h | 292 + src/mpi/msmpi/include/mpierrs.h | 71 + src/mpi/msmpi/include/mpifdef.h | 468 + src/mpi/msmpi/include/mpiimpl.h | 73 + src/mpi/msmpi/include/mpiimplthread.h | 66 + src/mpi/msmpi/include/mpistatus.h | 123 + src/mpi/msmpi/include/nmpi.h | 141 + src/mpi/msmpi/include/objpool.h | 306 + src/mpi/msmpi/include/op.h | 177 + src/mpi/msmpi/include/progress.h | 76 + src/mpi/msmpi/include/pt2pt.h | 512 + src/mpi/msmpi/include/request.h | 668 + src/mpi/msmpi/include/request.inl | 770 + src/mpi/msmpi/include/romio.h | 29 + src/mpi/msmpi/include/slist.h | 138 + src/mpi/msmpi/include/spawn.h | 91 + src/mpi/msmpi/include/tasks.h | 548 + src/mpi/msmpi/include/topo.h | 139 + src/mpi/msmpi/include/vc.h | 83 + src/mpi/msmpi/include/win.h | 564 + src/mpi/msmpi/io/ad_aggregate.cpp | 516 + src/mpi/msmpi/io/ad_file.cpp | 1252 + src/mpi/msmpi/io/ad_hints.cpp | 514 + src/mpi/msmpi/io/ad_init.cpp | 57 + src/mpi/msmpi/io/ad_ntfs.h | 24 + src/mpi/msmpi/io/ad_read.cpp | 2186 ++ src/mpi/msmpi/io/ad_shfp.cpp | 245 + src/mpi/msmpi/io/ad_type.cpp | 469 + src/mpi/msmpi/io/ad_write.cpp | 2337 ++ src/mpi/msmpi/io/adio.h | 191 + src/mpi/msmpi/io/adio_cb_config_list.h | 40 + src/mpi/msmpi/io/adio_extern.h | 16 + src/mpi/msmpi/io/adioi.h | 429 + src/mpi/msmpi/io/adioi_error.h | 46 + src/mpi/msmpi/io/adioi_fs_proto.h | 231 + src/mpi/msmpi/io/cb_config_list.cpp | 804 + src/mpi/msmpi/io/flatten.cpp | 1265 + src/mpi/msmpi/io/malloc.cpp | 95 + src/mpi/msmpi/io/mpiio.vcxproj | 49 + src/mpi/msmpi/io/precomp.h | 12 + src/mpi/msmpi/mpid/DynProc.acf | 5 + src/mpi/msmpi/mpid/DynProc.idl | 47 + src/mpi/msmpi/mpid/DynProcAlloc.cpp | 25 + src/mpi/msmpi/mpid/DynProcAlloc.h | 14 + src/mpi/msmpi/mpid/DynProcServer.cpp | 902 + src/mpi/msmpi/mpid/DynProcServer.h | 262 + src/mpi/msmpi/mpid/DynProcTypes.h | 12 + src/mpi/msmpi/mpid/alltoall.cpp | 2843 ++ src/mpi/msmpi/mpid/attr.cpp | 414 + src/mpi/msmpi/mpid/barrier.cpp | 652 + src/mpi/msmpi/mpid/bcast.cpp | 2150 ++ src/mpi/msmpi/mpid/ch3_compression.h | 45 + src/mpi/msmpi/mpid/comm.cpp | 2640 ++ src/mpi/msmpi/mpid/compression.cpp | 462 + src/mpi/msmpi/mpid/conntbl.cpp | 336 + src/mpi/msmpi/mpid/dataloop.cpp | 2716 ++ src/mpi/msmpi/mpid/dataloopp.h | 206 + src/mpi/msmpi/mpid/datatype.cpp | 3631 ++ src/mpi/msmpi/mpid/dynamic.cpp | 2367 ++ src/mpi/msmpi/mpid/env.cpp | 1824 + src/mpi/msmpi/mpid/error.cpp | 564 + src/mpi/msmpi/mpid/file.cpp | 138 + src/mpi/msmpi/mpid/gather.cpp | 4764 +++ src/mpi/msmpi/mpid/group.cpp | 476 + src/mpi/msmpi/mpid/info.cpp | 80 + src/mpi/msmpi/mpid/ioread.cpp | 365 + src/mpi/msmpi/mpid/iowrite.cpp | 362 + src/mpi/msmpi/mpid/mpi_conntbl.h | 30 + src/mpi/msmpi/mpid/mpid.vcxproj | 107 + src/mpi/msmpi/mpid/mpidi_ch3_impl.h | 291 + src/mpi/msmpi/mpid/mpidi_ch3_pre.h | 111 + src/mpi/msmpi/mpid/mpidimpl.h | 1031 + src/mpi/msmpi/mpid/mpidrma.h | 117 + src/mpi/msmpi/mpid/namepub.h | 25 + src/mpi/msmpi/mpid/op.cpp | 1924 + src/mpi/msmpi/mpid/packethandling.cpp | 5157 +++ src/mpi/msmpi/mpid/pg.cpp | 405 + src/mpi/msmpi/mpid/precomp.h | 16 + src/mpi/msmpi/mpid/probe.cpp | 165 + src/mpi/msmpi/mpid/pt2pt.cpp | 1605 + src/mpi/msmpi/mpid/reduce.cpp | 7098 ++++ src/mpi/msmpi/mpid/request.cpp | 931 + src/mpi/msmpi/mpid/scatter.cpp | 1482 + src/mpi/msmpi/mpid/segment.cpp | 2548 ++ src/mpi/msmpi/mpid/status.cpp | 23 + src/mpi/msmpi/mpid/tasks.cpp | 1128 + src/mpi/msmpi/mpid/topo.cpp | 1537 + src/mpi/msmpi/mpid/vc.cpp | 449 + src/mpi/msmpi/mpid/veccpy.h | 625 + src/mpi/msmpi/mpid/win.cpp | 4830 +++ src/mpi/msmpi/msmpi.props | 39 + src/mpi/msmpi/util/allgathertuner.cpp | 126 + src/mpi/msmpi/util/allreducetuner.cpp | 182 + src/mpi/msmpi/util/alltoalltuner.cpp | 133 + src/mpi/msmpi/util/bcasttuner.cpp | 221 + src/mpi/msmpi/util/colltuner.cpp | 878 + src/mpi/msmpi/util/errutil_fmt.cpp | 433 + src/mpi/msmpi/util/gathertuner.cpp | 110 + src/mpi/msmpi/util/handlemem.cpp | 441 + src/mpi/msmpi/util/local_proc.cpp | 202 + src/mpi/msmpi/util/mpe_thread_win.cpp | 505 + src/mpi/msmpi/util/mpiutil.vcxproj | 48 + src/mpi/msmpi/util/numa_sockets.cpp | 380 + src/mpi/msmpi/util/precomp.h | 15 + src/mpi/msmpi/util/reducescattertuner.cpp | 123 + src/mpi/msmpi/util/reducetuner.cpp | 183 + src/mpi/pmilib/PmiDbgImpl.cpp | 497 + src/mpi/pmilib/PmiDbgImpl.h | 29 + src/mpi/pmilib/SmpdMgrRpcSrv.cpp | 879 + src/mpi/pmilib/SmpdRpc.acf | 15 + src/mpi/pmilib/SmpdRpc.idl | 797 + src/mpi/pmilib/SmpdSvcRpcSrv.cpp | 211 + src/mpi/pmilib/cli/pmicli.vcxproj | 43 + src/mpi/pmilib/cmdline.cpp | 218 + src/mpi/pmilib/dirs.proj | 12 + src/mpi/pmilib/lib/mspms.def | 4 + src/mpi/pmilib/lib/mspms.rc | 10 + src/mpi/pmilib/lib/pmilib.vcxproj | 87 + src/mpi/pmilib/pmi.h | 384 + src/mpi/pmilib/pmi_abort.cpp | 27 + src/mpi/pmilib/precomp.h | 15 + src/mpi/pmilib/root_client.cpp | 428 + src/mpi/pmilib/root_server.cpp | 259 + src/mpi/pmilib/service_lib.cpp | 281 + src/mpi/pmilib/smpd.h | 1276 + src/mpi/pmilib/smpd_client.cpp | 236 + src/mpi/pmilib/smpd_command.cpp | 1161 + src/mpi/pmilib/smpd_commands.txt | 94 + src/mpi/pmilib/smpd_database.cpp | 320 + src/mpi/pmilib/smpd_database.h | 65 + src/mpi/pmilib/smpd_init.cpp | 303 + src/mpi/pmilib/smpd_ipmi.cpp | 1601 + src/mpi/pmilib/smpd_overlapped.h | 120 + src/mpi/pmilib/smpd_printf.cpp | 227 + src/mpi/pmilib/smpd_process.cpp | 291 + src/mpi/pmilib/smpd_queue.h | 48 + src/mpi/pmilib/smpd_read_write.cpp | 134 + src/mpi/pmilib/smpd_server.cpp | 56 + src/mpi/pmilib/smpd_service.h | 37 + src/mpi/pmilib/smpd_start_mgr.cpp | 413 + src/mpi/pmilib/smpd_state_machine.cpp | 38 + src/mpi/pmilib/smpd_tree_command.cpp | 306 + src/mpi/pmilib/win_svc_tracing.h | 22 + src/mpi/smpd/SmpdPmiDbg.cpp | 157 + src/mpi/smpd/affinity_calculation.cpp | 693 + src/mpi/smpd/affinity_calculation.h | 77 + src/mpi/smpd/mgr_abort.cpp | 94 + src/mpi/smpd/mgr_start_mgr.cpp | 114 + src/mpi/smpd/precomp.h | 15 + src/mpi/smpd/smpd.cpp | 436 + src/mpi/smpd/smpd.rc | 10 + src/mpi/smpd/smpd.vcxproj | 94 + src/mpi/smpd/smpd_barrier.cpp | 316 + src/mpi/smpd/smpd_cmd_args.cpp | 403 + src/mpi/smpd/smpd_handle_command.cpp | 723 + src/mpi/smpd/smpd_launch_process.cpp | 1460 + src/mpi/smpd/smpd_redirect.cpp | 724 + src/mpi/stub/mpistub.vcxproj | 37 + src/mpi/stub/stubs.cpp | 75 + src/msmpi.sln | 235 + 411 files changed, 258348 insertions(+) create mode 100644 .build/CBT/CBT.Core.dll create mode 100644 .build/CBT/build.props create mode 100644 .build/Local/CBTModules/CBTModules.proj create mode 100644 COPYRIGHT-mpich.txt create mode 100644 Directory.Build.props rename LICENSE => LICENSE.txt (100%) create mode 100644 NuGet.Config create mode 100644 dirs.proj create mode 100644 src/dirs.proj create mode 100644 src/include/binplace.proj create mode 100644 src/include/mpi.f90 create mode 100644 src/include/mpi.h create mode 100644 src/include/mpif.h create mode 100644 src/include/mpio.h create mode 100644 src/include/mpiwarning.h create mode 100644 src/include/mspms.h create mode 100644 src/include/oacr.h create mode 100644 src/include/pmidbg.h create mode 100644 src/include/x64/mpifptr.h create mode 100644 src/include/x86/mpifptr.h create mode 100644 src/launchSvc/LaunchSvc.h create mode 100644 src/launchSvc/LaunchSvcMain.cpp create mode 100644 src/launchSvc/MsmpiLaunchSvc.cpp create mode 100644 src/launchSvc/MsmpiLaunchSvc.h create mode 100644 src/launchSvc/launchSvcMsg.mc create mode 100644 src/launchSvc/launchsvc.rc create mode 100644 src/launchSvc/msmpiLaunchSvc.vcxproj create mode 100644 src/launchSvc/msmpiLaunchSvcMc.vcxproj create mode 100644 src/mpi.props create mode 100644 src/mpi/common/MpiLock.cpp create mode 100644 src/mpi/common/MpiLock.h create mode 100644 src/mpi/common/SvcUtils.cpp create mode 100644 src/mpi/common/SvcUtils.h create mode 100644 src/mpi/common/Util.cpp create mode 100644 src/mpi/common/argstr.cpp create mode 100644 src/mpi/common/assertutil.h create mode 100644 src/mpi/common/baseerrnames.txt create mode 100644 src/mpi/common/dbg_printf.cpp create mode 100644 src/mpi/common/dbg_printf.h create mode 100644 src/mpi/common/dump.cpp create mode 100644 src/mpi/common/errnames.txt create mode 100644 src/mpi/common/errutil.cpp create mode 100644 src/mpi/common/ex.cpp create mode 100644 src/mpi/common/ex.h create mode 100644 src/mpi/common/extracterrmsgs create mode 100644 src/mpi/common/hwinfowin6.cpp create mode 100644 src/mpi/common/hwinfowin7.cpp create mode 100644 src/mpi/common/hwlayout.cpp create mode 100644 src/mpi/common/hwsummary.cpp create mode 100644 src/mpi/common/hwtree.cpp create mode 100644 src/mpi/common/hwtree.h create mode 100644 src/mpi/common/hwtree_common.h create mode 100644 src/mpi/common/hwview.cpp create mode 100644 src/mpi/common/ipcShm.h create mode 100644 src/mpi/common/kernel32util.cpp create mode 100644 src/mpi/common/kernel32util.h create mode 100644 src/mpi/common/mpicommon.vcxproj create mode 100644 src/mpi/common/mpidef.h create mode 100644 src/mpi/common/mpidump.h create mode 100644 src/mpi/common/mpierror.h create mode 100644 src/mpi/common/mpihandlemem.h create mode 100644 src/mpi/common/mpiiov.h create mode 100644 src/mpi/common/mpimem.h create mode 100644 src/mpi/common/mpimem.inl create mode 100644 src/mpi/common/mpisock.h create mode 100644 src/mpi/common/mpistr.cpp create mode 100644 src/mpi/common/mpistr.h create mode 100644 src/mpi/common/mpitrace.h create mode 100644 src/mpi/common/mpitrace.man create mode 100644 src/mpi/common/mpiutil.cpp create mode 100644 src/mpi/common/mpiutil.h create mode 100644 src/mpi/common/msgprint.cpp create mode 100644 src/mpi/common/parse.sub create mode 100644 src/mpi/common/parsing.cpp create mode 100644 src/mpi/common/precomp.h create mode 100644 src/mpi/common/rpcutil.cpp create mode 100644 src/mpi/common/rpcutil.h create mode 100644 src/mpi/common/sock.cpp create mode 100644 src/mpi/common/traceManifest.vcxproj create mode 100644 src/mpi/common/util.h create mode 100644 src/mpi/dirs.proj create mode 100644 src/mpi/mpiexec/MpiexecPmiDbg.cpp create mode 100644 src/mpi/mpiexec/configfile.cpp create mode 100644 src/mpi/mpiexec/machinefile.cpp create mode 100644 src/mpi/mpiexec/mp_parse_command_line.cpp create mode 100644 src/mpi/mpiexec/mpiexec.cpp create mode 100644 src/mpi/mpiexec/mpiexec.h create mode 100644 src/mpi/mpiexec/mpiexec.rc create mode 100644 src/mpi/mpiexec/mpiexec.vcxproj create mode 100644 src/mpi/mpiexec/mpiexec_abort.cpp create mode 100644 src/mpi/mpiexec/mpiexec_connect.cpp create mode 100644 src/mpi/mpiexec/mpiexec_handle_command.cpp create mode 100644 src/mpi/mpiexec/mpiexec_print_tables.cpp create mode 100644 src/mpi/mpiexec/mpiexec_redirect.cpp create mode 100644 src/mpi/mpiexec/mpiexec_start_mgr.cpp create mode 100644 src/mpi/mpiexec/smpd_host_util.cpp create mode 100644 src/mpi/msmpi/api/mpi_alltoall.cpp create mode 100644 src/mpi/msmpi/api/mpi_api.h create mode 100644 src/mpi/msmpi/api/mpi_attr.cpp create mode 100644 src/mpi/msmpi/api/mpi_barrier.cpp create mode 100644 src/mpi/msmpi/api/mpi_bcast.cpp create mode 100644 src/mpi/msmpi/api/mpi_comm.cpp create mode 100644 src/mpi/msmpi/api/mpi_completion.cpp create mode 100644 src/mpi/msmpi/api/mpi_datatype.cpp create mode 100644 src/mpi/msmpi/api/mpi_dynamic.cpp create mode 100644 src/mpi/msmpi/api/mpi_env.cpp create mode 100644 src/mpi/msmpi/api/mpi_error.cpp create mode 100644 src/mpi/msmpi/api/mpi_file.cpp create mode 100644 src/mpi/msmpi/api/mpi_gather.cpp create mode 100644 src/mpi/msmpi/api/mpi_group.cpp create mode 100644 src/mpi/msmpi/api/mpi_info.cpp create mode 100644 src/mpi/msmpi/api/mpi_ioread.cpp create mode 100644 src/mpi/msmpi/api/mpi_iowrite.cpp create mode 100644 src/mpi/msmpi/api/mpi_op.cpp create mode 100644 src/mpi/msmpi/api/mpi_pack.cpp create mode 100644 src/mpi/msmpi/api/mpi_probe.cpp create mode 100644 src/mpi/msmpi/api/mpi_pt2pt.cpp create mode 100644 src/mpi/msmpi/api/mpi_reduce.cpp create mode 100644 src/mpi/msmpi/api/mpi_request.cpp create mode 100644 src/mpi/msmpi/api/mpi_rma.cpp create mode 100644 src/mpi/msmpi/api/mpi_scatter.cpp create mode 100644 src/mpi/msmpi/api/mpi_status.cpp create mode 100644 src/mpi/msmpi/api/mpi_topo.cpp create mode 100644 src/mpi/msmpi/api/mpi_win.cpp create mode 100644 src/mpi/msmpi/api/mpiapi.vcxproj create mode 100644 src/mpi/msmpi/api/precomp.h create mode 100644 src/mpi/msmpi/channels/ch3_finalize.cpp create mode 100644 src/mpi/msmpi/channels/ch3_init.cpp create mode 100644 src/mpi/msmpi/channels/ch3_progress.cpp create mode 100644 src/mpi/msmpi/channels/ch3_progress_connect.cpp create mode 100644 src/mpi/msmpi/channels/ch3_progress_shm.cpp create mode 100644 src/mpi/msmpi/channels/ch3_progress_sock.cpp create mode 100644 src/mpi/msmpi/channels/ch3_shm.cpp create mode 100644 src/mpi/msmpi/channels/ch3_shm_memory.cpp create mode 100644 src/mpi/msmpi/channels/ch3i_bootstrapq.cpp create mode 100644 src/mpi/msmpi/channels/ch3i_overlapped.cpp create mode 100644 src/mpi/msmpi/channels/ch3i_overlapped.h create mode 100644 src/mpi/msmpi/channels/ch3i_progress.h create mode 100644 src/mpi/msmpi/channels/ch3u_connect_nd.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_connect_sock.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_finalize_sshm.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_get_business_card_sshm.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_init_sock.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_init_sshm.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_adapter.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_adapter.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_core.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_core.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_cq.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_cq.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_endpoint.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_endpoint.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_env.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_env.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_err.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_mr.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_mr.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_mw.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_mw.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd1_result.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_adapter.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_adapter.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_core.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_core.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_cq.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_cq.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_endpoint.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_endpoint.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_env.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_env.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_err.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_mr.cpp create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_mr.h create mode 100644 src/mpi/msmpi/channels/ch3u_nd2_result.h create mode 100644 src/mpi/msmpi/channels/ch3u_sock.h create mode 100644 src/mpi/msmpi/channels/ch3u_sshm.h create mode 100644 src/mpi/msmpi/channels/mpichannels.vcxproj create mode 100644 src/mpi/msmpi/channels/precomp.h create mode 100644 src/mpi/msmpi/dbg/README_DBG.txt create mode 100644 src/mpi/msmpi/dbg/dbginit.cpp create mode 100644 src/mpi/msmpi/dbg/dbgstub.cpp create mode 100644 src/mpi/msmpi/dbg/dbgtypes.h create mode 100644 src/mpi/msmpi/dbg/dll_mpich2.cpp create mode 100644 src/mpi/msmpi/dbg/mpi2_interface.h create mode 100644 src/mpi/msmpi/dbg/mpi2_interface.txt create mode 100644 src/mpi/msmpi/dbg/mpi_debugger.vcxproj create mode 100644 src/mpi/msmpi/dbg/mpi_interface.h create mode 100644 src/mpi/msmpi/dbg/mpich2_dll_defs.h create mode 100644 src/mpi/msmpi/dbg/qdemo.cpp create mode 100644 src/mpi/msmpi/dbg/tvtest.cpp create mode 100644 src/mpi/msmpi/dirs.proj create mode 100644 src/mpi/msmpi/dll/main.cpp create mode 100644 src/mpi/msmpi/dll/makefile.inc create mode 100644 src/mpi/msmpi/dll/mpitrace.cmd create mode 100644 src/mpi/msmpi/dll/mpitrace.mof create mode 100644 src/mpi/msmpi/dll/msmpi.def create mode 100644 src/mpi/msmpi/dll/msmpi.rc create mode 100644 src/mpi/msmpi/dll/msmpi.vcxproj create mode 100644 src/mpi/msmpi/dll/syminfo.cpp create mode 100644 src/mpi/msmpi/fortran/amd64.cdecl.alias create mode 100644 src/mpi/msmpi/fortran/amd64.stdcall.alias create mode 100644 src/mpi/msmpi/fortran/dirs.proj create mode 100644 src/mpi/msmpi/fortran/fortran.props create mode 100644 src/mpi/msmpi/fortran/i386.cdecl.alias create mode 100644 src/mpi/msmpi/fortran/i386.stdcall.alias create mode 100644 src/mpi/msmpi/fortran/lib/makefile.inc create mode 100644 src/mpi/msmpi/fortran/lib/mpifort.vcxproj create mode 100644 src/mpi/msmpi/fortran/mpi_constants.f90 create mode 100644 src/mpi/msmpi/fortran/mpif.cpp create mode 100644 src/mpi/msmpi/fortran/mpif90model.h.in create mode 100644 src/mpi/msmpi/fortran/mpifbind.cpp create mode 100644 src/mpi/msmpi/fortran/mpifbind.h create mode 100644 src/mpi/msmpi/fortran/msmpifec/makefile.inc create mode 100644 src/mpi/msmpi/fortran/msmpifec/msmpifec.vcxproj create mode 100644 src/mpi/msmpi/fortran/msmpifes/makefile.inc create mode 100644 src/mpi/msmpi/fortran/msmpifes/msmpifes.vcxproj create mode 100644 src/mpi/msmpi/fortran/msmpifmc/makefile.inc create mode 100644 src/mpi/msmpi/fortran/msmpifmc/msmpifmc.vcxproj create mode 100644 src/mpi/msmpi/fortran/msmpifms/makefile.inc create mode 100644 src/mpi/msmpi/fortran/msmpifms/msmpifms.vcxproj create mode 100644 src/mpi/msmpi/fortran/setbotf.f create mode 100644 src/mpi/msmpi/include/MpiCallState.h create mode 100644 src/mpi/msmpi/include/ThreadHandle.h create mode 100644 src/mpi/msmpi/include/Tls.h create mode 100644 src/mpi/msmpi/include/assertutil.h create mode 100644 src/mpi/msmpi/include/attr.h create mode 100644 src/mpi/msmpi/include/autoptr.h create mode 100644 src/mpi/msmpi/include/coll.h create mode 100644 src/mpi/msmpi/include/colltuner.h create mode 100644 src/mpi/msmpi/include/colltunersettings.h create mode 100644 src/mpi/msmpi/include/collutil.h create mode 100644 src/mpi/msmpi/include/comm.h create mode 100644 src/mpi/msmpi/include/comm.inl create mode 100644 src/mpi/msmpi/include/cs.h create mode 100644 src/mpi/msmpi/include/dataloop.h create mode 100644 src/mpi/msmpi/include/datatype.h create mode 100644 src/mpi/msmpi/include/dbgsupport.h create mode 100644 src/mpi/msmpi/include/errhan.h create mode 100644 src/mpi/msmpi/include/group.h create mode 100644 src/mpi/msmpi/include/info.h create mode 100644 src/mpi/msmpi/include/init.h create mode 100644 src/mpi/msmpi/include/list.h create mode 100644 src/mpi/msmpi/include/mpe_thread.h create mode 100644 src/mpi/msmpi/include/mpi_fortlogical.h create mode 100644 src/mpi/msmpi/include/mpi_lang.h create mode 100644 src/mpi/msmpi/include/mpichtimer.h create mode 100644 src/mpi/msmpi/include/mpid_thread.h create mode 100644 src/mpi/msmpi/include/mpidpkt.h create mode 100644 src/mpi/msmpi/include/mpierrs.h create mode 100644 src/mpi/msmpi/include/mpifdef.h create mode 100644 src/mpi/msmpi/include/mpiimpl.h create mode 100644 src/mpi/msmpi/include/mpiimplthread.h create mode 100644 src/mpi/msmpi/include/mpistatus.h create mode 100644 src/mpi/msmpi/include/nmpi.h create mode 100644 src/mpi/msmpi/include/objpool.h create mode 100644 src/mpi/msmpi/include/op.h create mode 100644 src/mpi/msmpi/include/progress.h create mode 100644 src/mpi/msmpi/include/pt2pt.h create mode 100644 src/mpi/msmpi/include/request.h create mode 100644 src/mpi/msmpi/include/request.inl create mode 100644 src/mpi/msmpi/include/romio.h create mode 100644 src/mpi/msmpi/include/slist.h create mode 100644 src/mpi/msmpi/include/spawn.h create mode 100644 src/mpi/msmpi/include/tasks.h create mode 100644 src/mpi/msmpi/include/topo.h create mode 100644 src/mpi/msmpi/include/vc.h create mode 100644 src/mpi/msmpi/include/win.h create mode 100644 src/mpi/msmpi/io/ad_aggregate.cpp create mode 100644 src/mpi/msmpi/io/ad_file.cpp create mode 100644 src/mpi/msmpi/io/ad_hints.cpp create mode 100644 src/mpi/msmpi/io/ad_init.cpp create mode 100644 src/mpi/msmpi/io/ad_ntfs.h create mode 100644 src/mpi/msmpi/io/ad_read.cpp create mode 100644 src/mpi/msmpi/io/ad_shfp.cpp create mode 100644 src/mpi/msmpi/io/ad_type.cpp create mode 100644 src/mpi/msmpi/io/ad_write.cpp create mode 100644 src/mpi/msmpi/io/adio.h create mode 100644 src/mpi/msmpi/io/adio_cb_config_list.h create mode 100644 src/mpi/msmpi/io/adio_extern.h create mode 100644 src/mpi/msmpi/io/adioi.h create mode 100644 src/mpi/msmpi/io/adioi_error.h create mode 100644 src/mpi/msmpi/io/adioi_fs_proto.h create mode 100644 src/mpi/msmpi/io/cb_config_list.cpp create mode 100644 src/mpi/msmpi/io/flatten.cpp create mode 100644 src/mpi/msmpi/io/malloc.cpp create mode 100644 src/mpi/msmpi/io/mpiio.vcxproj create mode 100644 src/mpi/msmpi/io/precomp.h create mode 100644 src/mpi/msmpi/mpid/DynProc.acf create mode 100644 src/mpi/msmpi/mpid/DynProc.idl create mode 100644 src/mpi/msmpi/mpid/DynProcAlloc.cpp create mode 100644 src/mpi/msmpi/mpid/DynProcAlloc.h create mode 100644 src/mpi/msmpi/mpid/DynProcServer.cpp create mode 100644 src/mpi/msmpi/mpid/DynProcServer.h create mode 100644 src/mpi/msmpi/mpid/DynProcTypes.h create mode 100644 src/mpi/msmpi/mpid/alltoall.cpp create mode 100644 src/mpi/msmpi/mpid/attr.cpp create mode 100644 src/mpi/msmpi/mpid/barrier.cpp create mode 100644 src/mpi/msmpi/mpid/bcast.cpp create mode 100644 src/mpi/msmpi/mpid/ch3_compression.h create mode 100644 src/mpi/msmpi/mpid/comm.cpp create mode 100644 src/mpi/msmpi/mpid/compression.cpp create mode 100644 src/mpi/msmpi/mpid/conntbl.cpp create mode 100644 src/mpi/msmpi/mpid/dataloop.cpp create mode 100644 src/mpi/msmpi/mpid/dataloopp.h create mode 100644 src/mpi/msmpi/mpid/datatype.cpp create mode 100644 src/mpi/msmpi/mpid/dynamic.cpp create mode 100644 src/mpi/msmpi/mpid/env.cpp create mode 100644 src/mpi/msmpi/mpid/error.cpp create mode 100644 src/mpi/msmpi/mpid/file.cpp create mode 100644 src/mpi/msmpi/mpid/gather.cpp create mode 100644 src/mpi/msmpi/mpid/group.cpp create mode 100644 src/mpi/msmpi/mpid/info.cpp create mode 100644 src/mpi/msmpi/mpid/ioread.cpp create mode 100644 src/mpi/msmpi/mpid/iowrite.cpp create mode 100644 src/mpi/msmpi/mpid/mpi_conntbl.h create mode 100644 src/mpi/msmpi/mpid/mpid.vcxproj create mode 100644 src/mpi/msmpi/mpid/mpidi_ch3_impl.h create mode 100644 src/mpi/msmpi/mpid/mpidi_ch3_pre.h create mode 100644 src/mpi/msmpi/mpid/mpidimpl.h create mode 100644 src/mpi/msmpi/mpid/mpidrma.h create mode 100644 src/mpi/msmpi/mpid/namepub.h create mode 100644 src/mpi/msmpi/mpid/op.cpp create mode 100644 src/mpi/msmpi/mpid/packethandling.cpp create mode 100644 src/mpi/msmpi/mpid/pg.cpp create mode 100644 src/mpi/msmpi/mpid/precomp.h create mode 100644 src/mpi/msmpi/mpid/probe.cpp create mode 100644 src/mpi/msmpi/mpid/pt2pt.cpp create mode 100644 src/mpi/msmpi/mpid/reduce.cpp create mode 100644 src/mpi/msmpi/mpid/request.cpp create mode 100644 src/mpi/msmpi/mpid/scatter.cpp create mode 100644 src/mpi/msmpi/mpid/segment.cpp create mode 100644 src/mpi/msmpi/mpid/status.cpp create mode 100644 src/mpi/msmpi/mpid/tasks.cpp create mode 100644 src/mpi/msmpi/mpid/topo.cpp create mode 100644 src/mpi/msmpi/mpid/vc.cpp create mode 100644 src/mpi/msmpi/mpid/veccpy.h create mode 100644 src/mpi/msmpi/mpid/win.cpp create mode 100644 src/mpi/msmpi/msmpi.props create mode 100644 src/mpi/msmpi/util/allgathertuner.cpp create mode 100644 src/mpi/msmpi/util/allreducetuner.cpp create mode 100644 src/mpi/msmpi/util/alltoalltuner.cpp create mode 100644 src/mpi/msmpi/util/bcasttuner.cpp create mode 100644 src/mpi/msmpi/util/colltuner.cpp create mode 100644 src/mpi/msmpi/util/errutil_fmt.cpp create mode 100644 src/mpi/msmpi/util/gathertuner.cpp create mode 100644 src/mpi/msmpi/util/handlemem.cpp create mode 100644 src/mpi/msmpi/util/local_proc.cpp create mode 100644 src/mpi/msmpi/util/mpe_thread_win.cpp create mode 100644 src/mpi/msmpi/util/mpiutil.vcxproj create mode 100644 src/mpi/msmpi/util/numa_sockets.cpp create mode 100644 src/mpi/msmpi/util/precomp.h create mode 100644 src/mpi/msmpi/util/reducescattertuner.cpp create mode 100644 src/mpi/msmpi/util/reducetuner.cpp create mode 100644 src/mpi/pmilib/PmiDbgImpl.cpp create mode 100644 src/mpi/pmilib/PmiDbgImpl.h create mode 100644 src/mpi/pmilib/SmpdMgrRpcSrv.cpp create mode 100644 src/mpi/pmilib/SmpdRpc.acf create mode 100644 src/mpi/pmilib/SmpdRpc.idl create mode 100644 src/mpi/pmilib/SmpdSvcRpcSrv.cpp create mode 100644 src/mpi/pmilib/cli/pmicli.vcxproj create mode 100644 src/mpi/pmilib/cmdline.cpp create mode 100644 src/mpi/pmilib/dirs.proj create mode 100644 src/mpi/pmilib/lib/mspms.def create mode 100644 src/mpi/pmilib/lib/mspms.rc create mode 100644 src/mpi/pmilib/lib/pmilib.vcxproj create mode 100644 src/mpi/pmilib/pmi.h create mode 100644 src/mpi/pmilib/pmi_abort.cpp create mode 100644 src/mpi/pmilib/precomp.h create mode 100644 src/mpi/pmilib/root_client.cpp create mode 100644 src/mpi/pmilib/root_server.cpp create mode 100644 src/mpi/pmilib/service_lib.cpp create mode 100644 src/mpi/pmilib/smpd.h create mode 100644 src/mpi/pmilib/smpd_client.cpp create mode 100644 src/mpi/pmilib/smpd_command.cpp create mode 100644 src/mpi/pmilib/smpd_commands.txt create mode 100644 src/mpi/pmilib/smpd_database.cpp create mode 100644 src/mpi/pmilib/smpd_database.h create mode 100644 src/mpi/pmilib/smpd_init.cpp create mode 100644 src/mpi/pmilib/smpd_ipmi.cpp create mode 100644 src/mpi/pmilib/smpd_overlapped.h create mode 100644 src/mpi/pmilib/smpd_printf.cpp create mode 100644 src/mpi/pmilib/smpd_process.cpp create mode 100644 src/mpi/pmilib/smpd_queue.h create mode 100644 src/mpi/pmilib/smpd_read_write.cpp create mode 100644 src/mpi/pmilib/smpd_server.cpp create mode 100644 src/mpi/pmilib/smpd_service.h create mode 100644 src/mpi/pmilib/smpd_start_mgr.cpp create mode 100644 src/mpi/pmilib/smpd_state_machine.cpp create mode 100644 src/mpi/pmilib/smpd_tree_command.cpp create mode 100644 src/mpi/pmilib/win_svc_tracing.h create mode 100644 src/mpi/smpd/SmpdPmiDbg.cpp create mode 100644 src/mpi/smpd/affinity_calculation.cpp create mode 100644 src/mpi/smpd/affinity_calculation.h create mode 100644 src/mpi/smpd/mgr_abort.cpp create mode 100644 src/mpi/smpd/mgr_start_mgr.cpp create mode 100644 src/mpi/smpd/precomp.h create mode 100644 src/mpi/smpd/smpd.cpp create mode 100644 src/mpi/smpd/smpd.rc create mode 100644 src/mpi/smpd/smpd.vcxproj create mode 100644 src/mpi/smpd/smpd_barrier.cpp create mode 100644 src/mpi/smpd/smpd_cmd_args.cpp create mode 100644 src/mpi/smpd/smpd_handle_command.cpp create mode 100644 src/mpi/smpd/smpd_launch_process.cpp create mode 100644 src/mpi/smpd/smpd_redirect.cpp create mode 100644 src/mpi/stub/mpistub.vcxproj create mode 100644 src/mpi/stub/stubs.cpp create mode 100644 src/msmpi.sln diff --git a/.build/CBT/CBT.Core.dll b/.build/CBT/CBT.Core.dll new file mode 100644 index 0000000000000000000000000000000000000000..8098a29106a94236a678b83f8e29d2950f9e6ecf GIT binary patch literal 2377728 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

ajhIKlwqW9z$=%j?~#W!Utur0m!Me6 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

QR>n+VwY|pPcnK^U=TY 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ȣX%0I@xL1Gqwqw)(P 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

?M{DZ;NwK50vm=cBy~ zHn(z15=N*VNRleqDk-@d&|1lRed1`oYPX>J{gC97wj_Bzs-FneElC)mx`| z@R7u_;c)eQ|qt#54hlGVwkw0C%2O>|dg93PKn+<93_0g>?IH{8|HZ@e&fJbe8n*1sJ+D4TwUewCuJjkFT z)p%>x)Dd1wd8(TOg4Ne$go+Qyr&o1yMY?)T-H~2;^|(w^T}}Op`kD}z=A1%qE^2b# z3i2ZJkU6|JSEpCjHG{#LiC#9*JUQwl{Bq;%c#we>J|J>9*eFD~$PiHqcC+_+Zsbopm03swtR zUnZU4#yJSaDy&$yva$YXXohT7D{(#K3pkW)gjGq

%7Tn!L1#TjM&ANu-~C;EMXX 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

j3d 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

rqUk3p zs-K3+;%|T zCWs=)_wLY$;dsAO^hwj|RlPhMU>fjYO4EEkPoTc)IX!$Z0ffDZN>dlMDUGOe(&y`g zf?tNqe&sQ%AytkX4BQ$Z-&Wvr{(bnQ(x4V{JDUo}#I~`{-U=}vgoijsR+xZLbjJDE z{Z^6Ife=-?;OJMop7qr^Z>{~2fH)W z9%A$=%2FW49rNp3e0_0(+FPNbn?-8#NQ5}*>-sqnm;OKY-tI;3BTEyEL>ME4Fvb{D z7-QM48n@f6lvAH}mF=puB)igONwzX&xyDtfQ<*6_%TlH)-;`x_O;5``EW@xgOVc!S zF${CDEKRcv%d!m1uvg2nmwUAr%lrxZH|)jk^PDG6oQU5q-ZwL4Rd+44jimP%pC?Y7 z@A$eskD#{E3ba_A&&vjA2-UFgkZ0Z?7uU{>FI%gj$iRyAqOE<7K|4FL$upVHizblp zTwx$KOd~|I5#cg6I8ZNORocS3#?a&G>?4{#PbSTlWCT_=5SkSSt!Hy zd8{vdZzN#NhT^G3DC_`4x|+vaGO|9wCgJAwEv*0RY;n7CtgHh; z9E4~TlP4&MJRsj^v$KkE9VjzER#91!>#R@J>*IF&37$)H7RydLxB#p`U4yp{jQiaC zfHtvE?EBH1o2HDMg`nsYn+Uj9~vIfOO9v)9(t(o z828z2F1B>VOrEyQ$8O@wUk6~}6_GBob24!UFWg?a<}+@1u5dL2u%6{AWARUNt!z35 zgztg@aIxh3aOyU(X09W^a3Zul!}2ES{0A$Uh~dcN>^CS3YchdBsv&@5p&`$~;;Wrb%B=`A zP=k3@W=PxJv>DjkP8yHE`t5XMvA#O91RKx^?ZFI9T_kS>t#bxo=8jw!ad(B$!NAQ) zOXmCW?U+AZNX=s|w%y5c-YJ-@F+v!*HQ8}xaG*2LtXv`)^khx>Q>mm z{UUDJTk*KSxh-G9h*qi)3Xc@E1r@Gn(?qjv8daOckitcY1O}RVN_2gqgo=vC(1?Rq3jveg*^sGMSHX z+6SBK7MlVquHK0$`O}l!%$6S%U};1K@(sz6UKPm;b|5dZ0Z#5A5(GIm&D_7M+Wch;I2cWI6&1Lnp?(!YkNofnbej}?X54;KUiH_wx}@Cya^8>p30${&@A9Rc+$aH?0thU`>Yv7x8_i!cqq3SMS^*{q5LmA{Y+V zcI+nMEo?B#T}ErFsc=Ak*GC^HlAo3vd{<*qj+(&SafiU_E!;m1BMcCbaI3=3bT}Yu z3?WmfNB~d+Bq6{ZGMn?ds2}?tzs9*goc>w83r`IY07JKN786_b?OyX~=`N=jext&$ z7z@})2aNoOXK>S1UWV}`FQP?@DVbhr07WicaO!P&@n(#oe(>XJKAtvNLF^EZ0>Ko( zmK;5@WVDJg={$<9ps^~_!zx+qsc9}GR-5e4P-%`09&8vR98uT4#T_U;w*rI?l8NjpH=CoalJ}wMJ9U1MkQ+v`*Q4_ zG$VIQB3owu*P~@PPgT!v8R#V2HQ>p-?q0};DfXa6sLnSLl zG64G^@2+Y@!=JvH-iB+Ln2yOVZurq2b)6CjWgg{_l9;o6q(opch#zQQSCSjFk2L%+1nfX|&6(8G}Wrrqyi2Kr@a8`Q+ z#-7Ru>&Xc*laLi zzw%UH&#cAhF=J9ZCK{o8Bh zw2!Sl{*@DK-;g$P03r4jQWka?9vFdD0)1!aY-y)`054)=b!%AEzH_6z)Gz;p(6i`y^elAjIu^vLc6pKo(+q-;ZB;7LdO~n~yNHnt-_m5;P0%PC=FT{;_OPP{wt{bb z8=ta3$PtnDdAThicde`G?E;o;+9o9BBU4pM^%hB;y1iyqNwrlnS>8XFsveSkY^>eE z2{SVd>rA73Cgjeou*s4ydYyaNsOj1hz4I^R=IF)1FSyD9GoWOGbH`7qlw2T9f}*5o z+RA5c6HVHqcLsF-R*#!1MpU+}=Pgd|;Zgz%Y@rXc z$YAe-vCVJOFVCRMmX%Y;@p0pqx3}-mNt z1THM-R$$wTYWXT9PIsU*1Zn;^T8DpXhvh5-wg)sIJylH(#^0PP+>DoBhLdW)iT z84?~}+rnOv+`)c9op%!};eh_`SNXvl`{1z451ZI;afIRODxVcEy=b7Go0EA?Fpn&! zxQ(z+1Qw{U))a>e2~h3{g8Ols$}R91m^Gchg}rVftRo(|>*nQyHiJANshikuOclJb zynYV=%Y;16XuUGe0s?n>T*+q`fe$ch-NjX$-@r{e-{3yyJL_w!J1{hEQ(7kft_v4d z^Og5~&&Oi5f}i&;L2$4cm!i(Bre*!3&J?$mp0T6Fo+|_Y+~k(dJ}8CI-3TMs@S-9M zmd^88Vg&4M1pzlqm#ZYGGPs-#XOyQsu#U=A@_U+sju00iV}v zTO0XKqgbxVyD52h?T(@wzLgs~3FBjMCJ)m;g-g41kJMooy}LNeHL}f*r#QAD96^6t zk`(G~1UV&_U-G>mWxE(-Hq8?Yd3#`ALHf|88Uo2q2vfrE)NNS64 zp?z3nDT7KFNst?KIrs=^#?5c*r+_M)wdr*u)yp(!#ZC|iemYuH+Re#E!TC3V4L=o$ zj7?QnVKXR|Q{zH(PjDRNwld>1&2j2;y5noY27Bqg5wgaKmqithG1t`Br`UE;QY1lg zzF*Yaeh$E`NpQFcH)h?T)}d$H5Re0!S+DTkBJrWqvA$a3boQyHO-Z(5i%AG)+>7!+ zY#x9o$)dr5J02t!{C*(Xi)3U=7J6caB~y6W5;DkE>zF0ILpq_ARljr2#nFK%5_Bbj=4Xe~H54Iawtw!Dq zT1F)%ud@ahy*62$i++_~L4a#ZZ?CTT0?X;dzKQg8&w%V#?_TK!JVcp(WLY%(Yn2L`t-?@Z=Ig+tKg={NU8Ul@rB-e zzotc2@MJQtc*K3(>rL0GoJ0%PVsY|tYYn#KFbh2IS-w3G0i|J5Rm!rsw9dxZD1Ybk z(%Iv7YK2mSodx4-?V*y$SLb$g!2T%=c^ITW*}SFWgeQldw_8!F5*A0TW|}(`Vl~d-~*5#v7NM%75dc6`m1c%U9lJ zp{p>5?WzIl?7&M7{6tY{)1^p2to|EBBZbqZS|KqyrgoaPmHMShjv_RLq64$Ezs*-> z((1wOBG@?PK}2z(E!K9d zm?Ab`KoRVYTVs4AaEOl*EGgIPW~YYKD>uoBVyR3MIS;bSdo&|~WQxd}7ycp#viw^V z6}AR30rP8To;##YzjJQk?3pRFHM`CfDw|!Y3&cN&~_4&LsI1>_K{C~8JB zZ-4dQw0QkDqjvsVacwA+N#ddmd?VyU7}YMFEv@F=d{=oVtPv8;Qc)o!lB07e1_;X1 zDkX$4pSSGfn53MRuE5l=E?=&JOi*%NBu|{+&G{_sB$@Mf9MX5+zjforqFwWf^>K3Z zTUfjnnu{GXIkRx)%*kmKFe)}>(nsa$c^;dQrT7S%)*a0oxnW!&xCWe*dJwnynpnOx zU*~A{yn+q3)Z)E}rL8uLw$GHT+=Jy7N89f&X;SIe7n*2tv~8m-tyeC4DW5Y7uzBp| z=B<)JP=~cf*QJ))OQl`|Py_0eGNqHq?=;(h6D55kID*7}d#PLryFP4bI>7E~lxi{S zAv8;7D3vOS%QT>gc7`j8EJX>sR5Jp`4rVi;l4^7ng|2S!LGp?sv(7hfu~c#-WV8(+ z8hkq2?s1@D#4_`HMEJ$<^;YFGxEE}yLD4BVh3PvbDl_*?{()Yzf(byY+-?U96# zlH(K$9gWI~pvI+@PJH@RYPgfg11x6MjGKaVq>tTc3^`B)usac96r|NCbBgc3^b(cV zUO=eQ8qg{;E4OA#^ZT3DqMqja(tez}039$+J=sk?)lEI!O+C|1J=;w^*G+vJsUp@g zsxxO#om_Zpig_|DHHA!v#j4qBL?Vdv7A&s}Lgr`fnppD1L&oB5F@Kbh%WFH1djLUo z3@_v&zWo4Ji6;rf%6`CpU3#K9-4uMeN_v1IZfu@dFc7gm_+8yPo?7pR&IR3SK=`1& zDmp}KE}3^DYXx&!u2vl**Ts2mgC?{wb0@t(Vn$Q0u($)W{2ROgrX$iA;Sf%jn{9=> z&Z=7|U9`)`qkSEcyo6TDwm?UgmGh4h==W$+xdtxJ4ohS0G+)nZb^T*hHv{MS+Q{SM z@YHOkmWArl_8=&c$L(?L{8{$8k@7zM>fr=e#ofty23%}*sTiVYu1S@sh+UQ79!8Z^ zDpGs;NOE^e>y-m7&kr@ZT~7Nh%qh=hv!k59NG&-9K;Rm?sz)5+%CylYa&V@Fa~ruU zI`8V61;&Z?%2S?~s`o;ZIZY)jQqiPTFy!=xTfFa_n3v{N623(kHY?lrw(o4;=48?C zbWG+cj~Im!9by@yj3K~zq`-7J0Y4BRekL$VIAWw)U=Dc+_B4ILRru-T>LFm3dB^)?w-sBJf=UWQKXPKq^VxuAJolZ zU>uIMtG63U;7TH-`&U$bjK2E4!&yOOf2F@bGXHMk2$^glC;1oIf>M}G8B5f{%dapQIrV+t0Ys)Y9S;K;}j5EGFY-HSsc3hcMj zxQ|LVKP8bwUP!k9yU%Dy+&nhl6*?}E_g4k(K0j6NpK{rud$M>5EKxydXqMW2wfL~R z&GKfVXeKRU0~*Yw_G0a2yT{F)Po6;BzRydo;EDhf+%9Xa+F;N$H;?f0Rr_`_U_!pq z%|QXo-Bb)$3kuB5t8f`obQh~fc__9uVmy*@W#5#h92l}0p4?6(_~sQB6#2LKsOu@; zhKeml28*?q)61G%eOvdqoTH?w>PZbY)M|y}I)T%KtG^9uo1E-$(%fGf4SI>EG40B5 zE-jZ2bcbg$n|sxLxVRx~^&Vcl+Q3PRyQKmddSfSF5eVg7O7Bkk&DetPGWC+ZP)6(0 zc3NZt&G#0gt{I-=tb&l1_Z(lj{;bSsA;(jOb-T%>){?rw{?iHMkXG`^X6IM$t!fA2 zpgorW`${g|^z=!z&{a2)U0TV~UgXg=kGra_4@dXmjk=&s3Zv;YBFAgS!=UNfnaJ*?l}i3rnk_RE8tIU_uAH< zZQ|xTJj6E*CNHsfTc4kt-pc1E_fa3}Vj2{mpDOhYb3IO!h0x1s>-M=&wflL4`U6hP zH3z9}ogt~K&M>vDljpJ_(VA?Awbf>>HO%Zb-7-&8zs+iEgPt)@xg%b2Ug+1ro0>gn z<<#s}re(LSWGDo#58CapHnn-tqgzjm>gM1Q?=V)(2z{F63RR!?hV;m+BGNt`)dhy+ zVpn~avAJF2n5}9Kji*w_N8hP4g(#|48+=S};o7}*?3gS0!PU9`AV0Vkhc;W1s`{=c zrZinujTb;Vx!HEN$?9Z(ev0_2d8pt^+c+}dR1V8qPp0M%+nL5=-p;iA(oUZZu!+}Qf9lGZmhy0hC*|vv$K;;I z)a+b6J!eQ^sY7)bTHNyOV8H69@0j12sZ#sYRff^H9mUyk_oA9idkLa>O#@aMuAis| z4iCjEHfI*_M93X1A9|jN*fuE;k|Snj`KJt=SL9UPMUbEGq2cj}39Jr|7;v=S@Vw?^ z!Z>|?RKcJ6iWGTYqx<~fj`EcVY`(~ME6gf^0prM9>?XEvNy$R zqw_hyrLCLW_qW``K}B1xTFNw)|K)k&Z8!q}DyO*1l|Q>zR_8pRiYHllAY*LwZ-F`Nkth&q zTnEnAXeqDahH-c4dO50yIllK$FPWfbUA{`pMM15xn-jz%w{n;oh5N9e{4gV`l$fNh zE3f(({@ z7?6Il@y!NKtq2^Hj3gg{NY}R3WHJs$;OQ7LI9_PUT-;7PpTh3(d_Nf*O4SNPLpIy; zcV6uT|1d73#7a=K2@jiM!J{fw1<0hqvBZRvm$^|hAS_a)(i!nC_90N3^t{NF)3Wfv zJe%=3xNxT=`}qKqPiJLqLE{2ATYBN-2w$$9@1}%E|sdU!V!_y3R`TX5l;Q@eX zC2GN*#UnJz);f;IE^XnJ%rX*B)uF$V+^9B6P@Ixk-+nNeu5N0_scQ`ml%SO_@nrMb zHL($w{Cs(+IdMxE4pc7h-e2F`E;a(F$AX-hiU$2~*-)2f8iRbp;@_l1RO3`q{2_v#l4<`sAzuICb|_v#$#7|8vhw%JaV6v*R?1!)rl!|sYa z=z9>d>xH4gl#E*H+1yhs?h#E{ge8xq@!aXcWbXD3XGRgRowACYg#{{FcPvgzZw+-X z-8zpMV+9)3fk36nT7Q@-QNooSSjrz@Gl+3q9_Ij`Q^}Aon=Ibu!a@0k^#rWFJI!6W zg;NPz_DUX}Hgw9UQr*-Rk7rW?4ZL&i%(;bW8~I1YrmUWg%2m{E&s=C9^sw*Dj=8qB zc;}BovP(IkvqL}UNYdqx_SFtX;IWrw%}eHgOXJNquiJGCB9wjknUfUcwOe{`!p@=a4umdXh!oUqft6 zWMGW%YH(D1L8S-X^%57lMHg~+Z37E87RHdBLaUb^jt?_U#zni0o;lkC>+IV%-h$aQ z8rV5@H%fhnh}0Iz<+W{GF-BGdUwnhrP@d4qKf%H@v&Pj?JMPnq*Jz!=( zhd8R-1s~9lyIHX59?tAScSH-PyDgmQrglMCIM*xtj-gdU@&l!#ApxWg>XFKA;h^D@ zn3)e?jpFegZkr{okJ>=*z4<#00LF#SfHHt=Yvc?!9&|1Y<&>Hh9d&iGi>s4eT%l+W zER^jf1F^m2DYSXIOW&tCzvbpmT2UKg1ds^OQ|yHZa?G>j=&9w$sVkbB)|&`b^sy^7|XJ= z50D$&#E*yz?_y;7snh9WZ4|3-5>D@;WJnwqJo9$kIY{FM7S5JY{^HiwHpqu7)~vM% z0LcIR#Hx*NNGaDICqxg8l|2~AKO@4Nc9ACzD3ab zNbio)7Ea>w6@bVqPx2jPJaizs=iHW?Q8%zR`Nj=qY_8?I4ma(QsAWVX-a9)ZZ{e+3 znI~su&T97LtY%N1p3&^dw`XLYp4IH>Sb@?SGv5x3oy-MlnT#7@3|Px6yfUbHv6c`)u45WhcAZ z;#61OBef&;&UCfw8McrO!>$8Y2pff9RjzBu+!D=8wQRGd;jlA7r#U`r+fRaOD(vDV z+v3K?&di>h1?0ohE5$oPx{HLjhy%!m9MCHDl`4;eN|euiFX74%93aZjpi*SFxo5|O za*q8lX6wjU+4hI+$oO@`D?5x^aYqY#f>h#p9ua5ohnWV=fe6LPBuhaHc~247 zB{^U_gC65sfB^Oq=O3;iLSCBYe3vY2 z5f)AXWsaE1#_oin!BYNI!J5Tg+B~!c_Ag~Yl=Wu^yC+E|bs69YpL~J>o8$yUrV7ws zj>#D|fhtG;7ChW$8i5VZa|~5O$|S9E*ybs|{ZW7xKE~8T`r#A~UoY^X!LAc1npoT3i7`XyhT?Sgf zpa*$vix@oeGY`4n3E#%i2n`68F}ZKIq*>^KvvU$mi)xE^?qokVC=*(71S1UZ9x0sZ z*`Fwj#)qRsYQNnMZc!FE?6lCq9?A+s{#+OAk##&cfvCKV6Ak5cKCtfg{d*G<>Yxlz zIPC0H*N8qv%~Pi7p|<9y{n7AxT0U2Jd_WFfKG z3J~i8jGySU{sd^ZH+FAWlGcm`T3f1;plkyWT*8X!Wf+QuLObY(tadBCc5UQQxuoDs zQkW6J8=?5<$r3p}dUgxK8Kj793X4-z)XEuCr`sdh2|HjbNJP~B4&N@QQZb~QT1Et- z<2Gw*l9C4ZVj^ zk_M4-)wzK67Op?TRwUjJTV2jGW{8EZ*@o1PTtI54f24{buySWlE^+Q?WE$C=1b$~8XV2l-#GS9F_}OO-8NrpHYr~~PyXk8(YM#JKGTZj6f(VSGszJUiSr|-J&F*F? zd6@kw?*qTbt>m}L;KQBmyE4gQ20B8`unKIz(cb)K^$v7VIhQiw`Wu8fhqC~DW|%i{ z#i_ZGi(Bi!ldX2;>nDsHPC4o6EF1Sx;KUAYEV_lTXq{F%suQWKx3@~xgv$C}HlYE7 zKK!;;_9sCT;D5TY!`EVpSU%OEn$uke|E#$dx_2YmV;_)CL#d7USf^p6cF6H$KS*lC zG~I<=cne;Vu7enz3WOL~rCoCm7@vd&L&hTLb&Tu#!5nQmZ!@fxu{{C+EIqgoIz^utLDXG}`e z&ApR`?`taHM_z~JRX@DRjDi7;vJ|n=luQjYyAMTlwPh&L(Mc&ZrKtr>4T@#F6r_P* zu!K+@=`4Mt*(o_T$=x~~^0RPk1}>yR=>>B(ByRJCr`G_*kea3p6JlsauGC{0yl`JW zJNo&Q%`@=ELP3FNB*bfEmJw+>rhvDQvIQ|7HWxD(D2++dAxYBiTeuPoHl6VtH(}8h zvkCZMV{IFX1x&(XKqh50WqJi`Bu?5(@>%6=C}&-zoiF0{PaWpSdG)btd(CKbmDe@k z6eQ%pI_@Lzo6xJLye2ckO6N4r!uFX(d*oy82XIo#K4e@`s#M5Q%%&*VaE4}|vk+d# zR@zV`W!N;W^}a{4F&hEYyolIV)g);QE_yGYpUTrB?KO5wK}X!WQ4x%s=gAf=L?`flC+HU@zb(cbvhBwlGf^?cIBLTw$kM;H0mMf_9^UK_}>R zRwtP9(g}XlS2TvbL#yTbY8Apkt!5;cm?au9JGS-Iw^=AL5w+SxuS$Lz?44KJ1&?@#ZZ#iz0t4iyXzYNeZ%62*WrcyuNZ$2_cc(ne zTRP(O>iyk`wjY$7tmSzXU7WxIFr`4&d^Mnv2jpUue1@+)25h6pq#)gc0U1l!{+DG6 z@ERXyQ%{5#7fZP}Qy^{P=qZqB>PE@N`K!47r!Gj*R=zv-vdj*^UrjPYVwCzh$u>!s zHW(6%;*(Dyu}fa|t%dbA2gp;h;Rkf<)Itq@ZRd_91Cw>Kn~9c(K@a81XBvY>9{*_Yl47hug2Ji+m3h;-$L%a4rK+N2Oxa(0(8(B=sOgDV>eT0 zc$1^iH&pLLTEz-G1cwa{AQ0&&XQe`S9Kci_qh+0OfGhU+T$k1f4Uf@;2&*?vD#z&q zU6?u295&4mcZRwkG3o?eyB>^~4*3MZlMbIC72tO=HW{t zKxbRP3-M$E$#t^;ZWEm?2YMX6hCV~<0Kvr+fkGPtp#!9aMqrVWzz?;Mhv_8CiS7hsLuVY=Y$2L=xZDl{Xf?GRW(j0EuEdUr{4zx%H{R7aX;{OcPd-ufa?#)TKI2XHu^S1kt_HF_o=d1Mm4I2b716lzB=@ zYQq+j&rjx=#HgG`A*XQTg4|J0V=0l9r%Wp)YBpS&ilpRITWli>onH3&ukLRlift2) zK>?s%Da&q%Z6bZcC8}x=IWe;Wtfx)9>+G;wBLH+L>J==8mGSKC_SGHJk=lz?&6)c_i*G+}+%vQ`GM%uUw zC(mL7=^fm%^Y9MLBGQ8naYYUD{yh2oD)!if=|uVLSs$*}q{SsN&jAnyN_&zgSLnjQgfGeHMJYPn zQPM#GN~c)xH_8Sp0HA~m+gE@T1Zh?MlT94t!90{^fTJQp81bpeqTwiRFD|v9XjoWe zVPMb!8d4p$rDEnmy94sUrX!|W6e^k&?GF+;N)YQHRj6|FyEH*@igt(BiAH`iAZ{%S z&x%W3qTSUH+3QRfzvGaAbUp3mC8#~0{I(+^AEXE2&V zMUfgas@PoQ2(2OuUtEY>jnU?OoC&;ZA2pPXMT<(ktWH3V`PGZaX(nE}DvA-Ww48th z2!lGZ5e;A{Q+k~a4<>O+9So2;cHnP6eZXwvqT~5(?v23Zcj?;F`LDM5D96=}Z}@%$ zckuD0I6kFjzbzA@7=pwuW#zqQX65lpY?QLM)FG zk}fQ+EE-zs14^c1@R-i_R*BBbdU8vrJ(?zD+y2wW>7=DOk{7lWmeXKoVYurlD>k(f zs1oz3SbNkjSd1DuPDl=)rMRc4iLF*xlT|V@4>YF_SW?trW<;N^*zC zH!o1@`Jo7?v)p8^4~NEXQDQqMhgsxl?Q67bs$qM`vFe*M(HL0 zj`r^s+ZDJf+jb-@eKl`;#}H&=ZPS3#{_Z;37Bno344a)x$T5?Hh%0nm6hobxvEUZB z#}7&oQh09Krp2JoI4XsvEM%2@Kp|X}6p%dql-f)vc_^(3ozQwhM9s$7gv5}(V5ulu z$7CG;Fqun{K9A1MHu^6`T41|w6UqwAT(<8al@>WI;UpJBwX`xasY}iWxRhe6vTfT8 zjK9*5o`>FCoD`Bhdm4*dJJ3gW?4XD?zT?F&vs!6@Q1MhRxtjekU#yq3Wche`nrE=> zu$ZdCMS?og!kW=a68Fzz$pkCvu&UFNwRLd|1KChJKi{6<5oW)j4f{hjccn+Y^3s*W z{=j9!*5;W$;Q=Bn4B*Kh`UB0;tDK`};aC`23pXPe4EB^zZZR+B<3i)R_aL*dPv2}Y zym7R18)7>ajrg?4^o&5YrUR11^mRxWI=-rmA!HrMPPc^t67lwj`%uVK{$Td(0F|=R(i7}13me8uuJQ=se08f=CmHEZS&j2X*#&O zD3PD`TmJdt$unoYCDRBvxiYWU`|!Nfy{~Yh^Wg+=&2y~DfWT3x`*=}VOS$#q#3E_! zR0Yj)dhFm!J)f|V^KIctbYq#BgjR8aLig(8Ld&di=kH@D^W8zC`rO&s-Z5gZDYLY^jc$;duRn~`TnruJ z-WRfzP-q1}BJ_BHj=MKEb_^Z7NS(Lc_q&ieib-@v3gEM)D$!8A0$I4sUSLL5rx$G6 zZokUyz1!Qn`OUPE&>~UWP3w7*dHO*^^BS0WCi-VJ6(C`7fyM9mAOSveStl0rbG+gp z&y&G~7EQux(soOyB=`Ga&u^!ve_+S{?6HqmSQ&udbb_A8B2Vy0DlUMUt|RqEJNr|c!6d*XbGB(0Og`RQc#FbmNGa^tN7M#Bi<8M?g!N*K>#~3m5~$W*x52+lOpwzlVG6MCGgo~Q@eh>k<03%$%ibftK+lDzSbK_ z9s)G^Y8D-NY!q?xHSw}va6N=B#FeRN#$14$D3lNhwiA+7(x`(BzY#6YoK{84DeWpv zCdPTl{3;Q3bsS=~PW^zKT$MscEp+*eKvm@P?M+ya54RxC*3^>|aTq-F7jZNzfxP%G z_0lJC!P+OQH#hF2E7+-r0}R;!DnmGri`FVevRwsc7l4mG+{Df3M$FkJfG`Lk@;pF? z>Kd2;7r`jrWrcSi?(M*7q<;ba%od2ajr6TaU);qs-MkNr$^u{Uc?Ck})}8GK!5^Qj z-o3fL8m)2~t1q=zCB#pNseH3h%H*La+sb_$T!M_#RdEn0#k^bO5gtzGO-RiAj7Zkw zW>!gLnKc1oGcjqFU4g&gg}D319+1tdq~w_7G{pk=D2+fbwu7=XV&@*|-S{z@^~hp{ zAquaQi|7DU6pdsY)hPJBvV{}XS*H$)M@C%%PxEFCOo>d#%fxF4-eNvS(vscW0t;B1 zpk;>OMA$kE&|R7&m*euhrZ2cF9x%C@7@L6g1EV5kIrt`92wP_T9hSh zuM{Scw5M)!s3Qov@1ccm>KDW>Z4%LCp2@p(bXROrY!))Rhg}J9ZRVc?UWg$*H0R*6it&ST~m@U zZ-Hy#6%?|zvx!I8`D(8FTsX$)0POK-3^Q2h13CO2sh?z@7keH$J+U?`0y|vnVjtA-$p9#n`03h zoIx=|2hdZew9=GmYZ@gDJF&!BZCL?Gi+ixX@S0XZ_&6!(00xxFp}`!nZ$54&2Lgz5 zTzFfKiHxEq87L^ub`ML#!VMytOvr)aNjDkjB67;4R>QK~3I~Jls-$FMRTP{8EPu!w zMMIY$v8rRjr21a6)f3TD&=p8eABsc4JT%R1q8kFiNti;*((Dnlx>cI-cn66EBH3<1 zVv-fNidVO>Q0+A8DfTat@88`TWGa#B7E4y!**t<-zwxc#?+RlSkTWVqFU(>sOk%I# zGs*&{U;heX3hVcXAK+_w^Y#|*d|iX>(`H=QScAVH7ZK&$r!#4bZ_F!M8#7ANk}sy^ z=H0zUnKHxdh<>71=5J%wx==M-7GJ%)vCeWhVwJvVfN4P~Bi49rwCRf};IY-@k1VDy zDgYrowRbLkVIJ)lwyWQV8Rz7_D;?~+W1xn7Lx}dJvTEB7& z!rR_jtmBokaLv+SU_d5EMS*6cj6$T*Zq{PUkR(w7Ot-zz90nFWVD58pS!k7|#G@Tiw0m9Ec?*s2z!6hNuRm z?CLy}nOAs=r8(He2M9MC2f7E&uIZGc&s9HC9TO;dSiUQ$ynY6!6iG{0V(7%Yvk~H% zh*DTkGoLicUy5jE-3$toMU0Yo^|>mEuYO6T0uR{zR5V|}z{8k$%<7YENXZgwBVYw& z1ZQLze7d~}hd00Bm=SszvMDbf3~_9ch3$K}GGDO3^50jhcr8Us#u|Bwhd;f6r7ISB z&-Q&)AR7)w&Y8foSGsju@Wj!_3tS8bOJE&fcjGoMSA}}n$!SJVcr3{R7faQGUs}4p zaT7@X_Mx9ZDxz`;;kK{u--9uPG2{8@ucI1oQ^~syY@=I3Bl&^^k10?b27bZF@qzAk zLDd`UEQ70B;DO&Gy-g^D4pjzSySfc zCc{8}irsmcc~55r|1BA3-0qJ!*$bL(SFvpF)04742Hy7+7RvMH@Ts2NpUt0j2f3s} zplo{r2$PqITh;B}Z3QcKY=qpKaUbup;Ofvza938TqPW}aGb|FpE>)9eIHaY?=i6LJ zgI5Hq3aVktMrOjNNG^Vtg6b+=Uq1QPTjy9Q8?BDj%$|y4U0+_=fr&>$Y-{6=M_@Dl z>yqgpAH$|rxJ))or2 zmztLiI_1qarnaCg478hBUabd%`twV4gP!t=$_J~rNesK&_a5->f7r0u0HTa!iiyok z9&SFALPc#EaUfm*$j{?93(!xwNA87AFvNy1?4W#4x!s?{3`VDb)M7zlzK&H@OJ{u$I5QOJm#jm{*je8a5kX7PfUy zVU|0Q3+nN}cqBRqKi^!3p%&?x?8(?!NahraPv<0=TDBI4MK+doI>V9M>|ZDZ9?MSP zL_KN}hE+tH7$7cMYLFbCHt9L?wv74Nb+fPv_LxMP66eV)>X2V_BozU`2VE3QSEjpl#8$FZuf;@o z*pZ~g2YMTd&RLZi*2;WV{9Jc{OoWe1ndV4>c=~jACle;*FI&UvW2V!>ltOYL2wA*% z=(eRymAX4w+upgedDD#=?hG65Fz~#_+(`WI&=)B^`uB@zD{ZIU^i|qOJLy=uhrhSe zZ}7E-)MIHgP4M?>x`Xr${JWkW;+wxG$lu1VO|)Xn4luI=n!Jxuatx#XKH5(U z6F|9v7H(oRcnPI9`h7rh9<@nBc%cFR5}sz{HZyE{Eq#r@ZzKP_;rkZGPp+!4bb?Te z9-Kcv#2D}3|1NZf)s~*v_Feq%Tv4_DQ?@><^d30<-7-e7iTS-}Ge_8KNzlp+Qj+NE z81PG3vx<=r-^cLh8~oV;&Pi=9F(ilXqxIuR-^SnTs3SQscZ8)xS!p}yujYBxcRud5 zGloPmfILsG3n>ut0=)khPp&^gcMN~XA;BjP3>(DE1gXT;Cis|=z+}&(zkPB5NDZ_g z9J9{E&_w7$7NUEg<RJeCFzgBzkiOLT~PJClzwnLwere2a1Ii2THdkrYL?2crnv`;n7{Qx z-!-jDANpkMU>vS%Nd-gAw%U<(u3tk+a@3rHxMz8^55bQCjPadxT676t7E9?Be$#-il($6m0g!;TUg4tanese zk`i|0A4`7(Ww`}-h>?@VNpGaN^Sv42lyho1UKwR;fPso6$jIA$HKp(VO$`bsX}V2D zmaa+Q0g%K=5E3bYX%9J~Y2{EP+``|(i6kmWpVP@=74lsYEv8q)p#>2FSQ01He~>3MZAA^ zamA>h780$sLe$IJpje^q4Rz=~#cXv*+v*~^oPfqPb);bly@vpXsp2kIui_E6^T;D) zeA-CP+wGu8a<}k@t#3g`5atbov$laskuhrtG1n9wyNV>&uq<+*Th z_ln#S?iImskwFvf!B0Y6DC6=-M@snSp%U^gi?;}LPmvy z$KNu$$QU$bm#SQHsN7{rKDux}w|3aZC-`+6|7+%#k-r17WM6>cMde067fqD2g>;x2 zbpkgfJws}uE|trb4$}lA<)r7fK(4Ze+)_x7{_mA6A;uPXD>WzuhQ6qHYv_%JCJo-> zfWl~zK=+;l%~Sy7QtBY83)XLqoon#pK0z7>BpJiF16!9TEFvFsH@Ntn3xg3jdqrtV zKsWVb6mt*0LhJNf7@s(S|H;{eavuE#N+~&RBbPSE7A)m&)7$AR{%skNW*aB|M3FIU z=|t0#%(%H1S<{6%Wg?X!Ndm^(Yn;}w>`7F0Nt^Iz$<{6)EVl9-nY}gK(#wj8Xhaj3 zaWV2YP1L@>ow_V*uAL+yq`I3rYNve#Bn-(GSsn>s^ov*tZ*&Z)C58 z9!XuZt+j}@85`hixh6sTtK;_jCErLtN#n9ZScWkO!1kJiuUf6~%lRSJ0mUK2_YU2_ zXzP60p2Nr!;$1J)b3%`fdJ;Xo=rit^k9nEHs79tmPhFWyB>XNiF`{IsSv9j&J=JwNu0FttbC0v7Zq z{pEG41BzUqDe|x489rQh`y{0T`IID7+>A&QJr6T-oe~|vLKhVQ9Y03x#xWg7_bud8 z_#ZQ2&k51gyEDmYBkhj|7R0n@^b$)Y9$TDwl_ zoV?BSThwBoS|0E?fs1-h>fCp0*HAP(Ug>@U=wJ{`HsUi{qk==CNRkgM-eWfcP_(*Y zv*F&!edIas2@Qt zEeXTvo9-7!o z_T6{CZ!Q>1Y)#ZqJotBw@P`F;wB((;d}w=9Aj67d>zh+dS$r3*58W_X+b2LSw8803 zoWL*Vx)bheySa3{@a=0TPkBr}zKs?s>Zq+{NLiHq&;{6gS5taA8w5|$ zG)UJkpd_t*LMe&V_ivoM6nPO}Q@7kNu{;VxhKFtC_&M@%+irUFpGgF>?5qenkozQ} zLNK~TwTz~@>`g(pnf}baXh-@&pL3flT&GP69+%Cp1CC?qV~DCN;49}DQZG?Q9TD6K z`hE1bzFOcoW#{aO0)ql!%o5Q!g+r{ezrX2yd z`!K18az8yM#&iWpfs~$I%CteHMJp#gcidE=_s_Jsr@2CU88*FWNfB5m<&CU?}b)RXu-%4O!vCq9)+CMI9>33jU ze)hOCU-#O;I+IShjza5-973!8ABs-fe)kVAxsU7Y)PHyW0pV@?ZQ#8&i~3_P!~rpT z?Q!Yg0x&~GB6C`Ylu`R&& z=zqHorQwSuLITylD!NtSLWv4M!deqUwIVOT?U7iBq0*o-3VVe9>lV`P*;ag8>y1u*gcmkTI#XD~j};7=U#qiB*#Z zjxX7(+NIyY_z1s9}i>%+z4!(Z7xjt8#PesS5cZ z(|eXY>Vdjni39{(UjmwH;p|H&1eq#k@#jiNroX=wgdc|VZ%K@Yc3ql-xv_m zCPRg^nZ~pz(W2-nh3st;wlz?5oBi3|FExc%O`4tsU%ERS{l|cvXkG>#Qh?D5>b3D$ z$bOoN>H&P1#~&a0gaHA0vA((h0-1ud-fY(U8HTgjZ@-?Mbg2)$YP!UoE#q9y0Pd&W zg0xD@oCob6ZRJ_*84qohU_Wh`tGO6n=(Q)&=B6=Jc&l@;r91%A<_#?>dQseM#Sn{D zGHAZY;E|2aXoznCk?0`AyV&V@lD5p(Su znx|&fbOUfu=e=2V?qfWhX~m{w6@(o@SkHqB!_;(}hWma=b9GFs?RRcwzkAj`H?7~< zy{4bc8too+k5B7UvATAAX<=4R-5SP0u4-$OJTN|v2j2#zFp}VwAzdNyJY&l^)Wkv6 z`n|7+YE$o+nPdtd_synb>2q{K!;gwE)MBqRgL=Lm_`3a8DCt#zH}^cjX3(~=>JdPt zIzu4y^)dAF0>a@WBc-QKfSJ-$e~bWq`t^AjU1T7!sutC>DoA^VsMqqTha77^iFIU_ z$}7|t*_kZ>q0dFn#c)5<7b_G%3N+H|luH{5FD)Fy#-vU3N8?ms$XUTy^nJZ0K&fB~ z9GTMmrpr$CRjcBdeG!#A+fp}Z_k@qc;c$hhZA+YKI_f+`z%Xq3h<>aVOX`(Z&NAH; z*^Hc7?SLmHIZl%Hw`HuD{qv$C*|;7E){?x>$x!&P9hu@ZtO3i~RkTV9)V7GRVWwkZ zL4$O1>a7>Cfvb)I#5|#or#LTZW3f9v(gwvON9kkWI6ZVt`sbW*8#zPh#7SMp!{9m4 zvAzFZgee9RIUdrOv%Va;ef4*J8TDd8BvvDd<=LZP&!nX`oUd`rtxj)u|8PHU4>Ti) zl~^U^4D15$TzH^lAkUB%sb0BNZv&~MERLTec%9P81Tyoqq_F?_6~~FL2lM;ruPD;` zjgpMXY(0{h)+7mA0#(z+lLPemxgs+rJfYrKszBPmo(9eSCutgFXnp^KC0_@JY|inGhf7#tA>&Cc)BK@X`!SqM;?MUK|==->UrgLBdFc;2j0 zc`)~l0vHZyfSaqB)`dxEX zgj{NS7%*-wqNaynS&zz%?Y7o;klb*UuH|cL&}c1q4?SJKf*fgI`7tCpj*-?H?P_9= z5~^MlAvD~&6Jyr87tNvUw;c7krL~uiQZjH!)xPZ5yi|BP683re>;g*hA`We(79_4- ziNp3X5b`=PZRxvmjOj00Z;!BXB=uG#VuCb7 zUyLi7T)SH{m@qomEJj*Y$(Mjx0dYG zAictRYume6@8gm3vGv{VGh==C2Dzw>8DD$SJzNE3+__IPcoAbjA2*(K9~^~d#M*!2 zSR$Q>B01|A!K1%hF@;e_np(9jrX)#_&Ejs)Y&RkJ^QI`RtZkthJwe*P$D!D zkaI=;3limSHjrHQYA@ocwI~*h&Xisz_ME%ZF!yi;n2(bPF-y@}?LEYr zgxty~FA>9h@0Gnt9cs;3%7#LK{s4n+(esK6pT)h#8~AewHC7){`bpmasOQ1Ojc;0z zKmxXZKw=M}_&Fe?Ckrt+WmgVIBO2FYWJ@u7!iwXWJ~w}!(oYF_E2Lb|T{fY~wH9~& z9P<$(N+(E-wGyRS$MC{fO_@<}*tbojBmV0+6hr*xMvA#-+i#S3ewaevZ|;R&>I(LQ za_dEUnt$We*b)89HH>sLek14E`inG@4xz87k7GOUpFs`qCL79%^j?2{-Pm10IVzQ3 z*J^cnwT%g70sUBm;HhBfRbbqj7|9%8WaH}%@_H}*FSsv%StU4EvLsdz6)zo}m z`R5yXmvSxPO9o$4>ou<>r-7}qEct=5+>8f=sR?!6M*5M`DE+ALnSaGpI+Z);fIO6P z>zwPUWnNHA!Ug-thEq-#CaUz8RKCVTm3y?lF)UpqHir9fsdvcjk|mODVd}?frz8_7 zTX} zCK7~Sii_Q5Q}mXs1<_}a1nmX@OJ zfX{VCYoQ2Rnp;^bx6m)oB3k6?Sy~%}vS_IV|K*z69TB&A$N}_RRS%T#-CQUW5(*bq zIc#sbHzoH`og}>jVB$bZ48~)+yzqiVIX0mbmXi{Zn(PUcx^JQ)gk8iF+>CQI>uYZ^ z1AM0s`)D@>NImghopdyihGPP+aTRVj4fS+l3XhU>NTA$2l@7~XfMWQ;(1#-%libp? zB>7eZaq*XeZ{5U@mAZ5ZX~P3JA7bN!yt#W|GFt8=g4(m7@QyM*n)J*PdL)}<(eg)tO^ zY58%-IL26+*Ta_q6{#UTtudt+DaLie$JdR@j6A0q_^{0U{xHw+4BZF{fKSj4M_C{4 zO-JZ6QV{<(rO);r@wB#Uin@d`-b;Uq?J?;nNB#}qp@>f}e}I|QwFD{?s)}ZJ`m)_B zJ*_V~LiE0=pk+q#hL3TokM~cpvXFlHecB%O*R*`?_tA3t_4jFYjEm2JuMPWS*!W(U z9%5tAHr7Dv4etk=#p!K7X^boz{qQX7lgG%Q?I((nX#4xo^q59uju|%Ap5z=Zga7^J ziK>qqzu!L66K((JkTr~lR`5Sj9%|eFev)v=LyN$^c9PiKK2d6nw$ttJGoNE>yZ}ux zbQ?{l{Pz3wGsI0zn^Swd`w!V;+IW(^O&!zf@4J`u)UP06`8V8P{0;q%zi-*!H|=j6 zNI3c{=%lys|J&(I{yK@TllWGizTUC&Je2z@T%eE+y#o7h(WpaPJX%}dt@z@;9zvZ( z>YMkTBdpi!io&W^4SH z;m(fz4Z$95vc#}et|W}xg?Dnih37nMM+G;#aC~+!IAqysN7a=6f8zG;bSG4yilI#l zcl4#6AL#9+eYMt`UUk?sd43N_Qk~URPX+4juF2 zQaP_dmz7ajLf}rM=cQ-w4cbb-=tEjh8{I=j!#6=BoD|=>MI}M!MC3S0bCbQ>YF*#G z$M2(=hJ!g=?$^U~4gc`${1fQ)@RE%h(cISn z!7Y0+f(5URIbEPb8&{<8*#7lVVw+4&L|RCuO+E z*vdPu{ilB8A({I`MfOn8l3_4EPu8-Alkqq}sUrq;X$2=qR%AIX z;*rFOR;_Fkjhi=MPKXH1dvXzBw1r`Tsb3y zOg-hBHMQ5U27=KaN?}LSbQIG!SbD)k+ge&}U*M48_ zP#V;j=mi(a#XA6K9foiGA~2TIhU2NydnA35zw?W2B$etKMi^|@>l`ng9^b6z(^6A2d0SJVSGn9{aJZL>jZwIGGOb;e^%jOL z$3A{Z3GPOsBTLSgmEH1LOgBdOusxi{Wynx{PQmnVNOpCe=(mRj@v)N+B_!n?p^5sS z@89)g7M)#^FXtgjyIst72nh-O;tV(i+YnD&fhGB(@7L?v^hk#DEcujPtIJI(gS+x@ z80+|DlU}h|HE<`E$zpfBn>DY+?vzV>m|0mX!3NPSWoj(*y1eUgCVR{N33H2ZJa zwtRgw4Ud0>w&o#1i2dIoR_KEJRczXNwNlux!qLGc->0ITz&$U$j8?vc`2G{POMe3A z=+~?>i8}W%YxL-(m*hs(Vzh3Dg2Y#N8R*fL3W`7Nu5XW`dkL~UuRV`G>vn31vcw749dAM-LsQP`X4;Ya5egWTv{AISsKi45-qzpGfZC z++Y4rD@dljM(oPEl@&wb=AnoU49k#8T( zDMY0HrfPJVp{M8WAY~p`8}J5j*6@HvJzcI$S+gfFqZWCF3eTs`4?s)A>udpAA!;dT z>aALJ@6nE&qFP}IH}3!G=m?30c-3f0669%l^waUx%F&pQnsBLH-E+B8nLItO#rvfY z)eHy%Y5+o^Ir5niEjYeK1M&hGfA%?3dVdV0Lf@1~tWFz2I{ZT;V=PGiF3OOwhg!?` zT5^`_RhxSCCqiWGvsKZW8#lUYl}$hS|57+z76ipE5mmbkLjzo7R1d5N^l-Ws8&vF7 zgF}eG6BV%sgxY~lLk$LY zbw2=bkUG| zZLHgRd7O^cckmPvg3A9vd2`d~{10Vl|3^Dtw6wxe9eZEa38zW!#Ro}C7 z3TwPMtX2^ht`6H!9<5BTRf{uU`%B9;W+}kpY^|FfbqL5!B#F)tkBySuSORB^*YY9) zKDIq;eMK1DP@w6?btS?s4X1ZBplZz|BTw$f6dOkP1D0Zt{G!H$&x_;WAjTeG!+R0+ zoYe9lf}01NDMoU}w#&F_83Ytf1VQ>{xDf2qf2oul{I5#3IbHYGD-Mqq)5PYPo0 zx7qJS9yX%S`aLtSPU4G2qFH1Z78Azu-CsBXv|9-Jmh;jm3LRYP_cQh6Ne>($otznj zBa)fb3(IoCY72du(=?2Q>gE$pBw?gnllqc0b*1d9^&(nduNSl;1zP*VXnf#7pSV19j)%T5Hk_xy}l$5(=`wA4m5kE?>Pahnen0|zF z8rsyZqpd&1lp&f_mq_eK5xD(F@>+@FExEnlhuWir!-68w%AQ znU5;2U0a}CHQX;do9|~^J{}CGjX@<%`)zqJQ6ZB!=?p%Hl}77ChA!89sfe7=e3Qv| z_b>Zsqp1=C;a*cf0R3Mdlx)J1m8BUZ-Gf3d5aW6v9-Lh}sGU`Bi{eZT%@lVF(yt%K z9@}^89}(kJ*rX^IdonMW(r)CcDOFm=p`5$@{o1L`9E!m4&R0cH!Bl&j(L(2t$6d0x zwDa9i!HD8y2A&r2r#@=a5?s6T)`sw@F+y%mV^Zo1B9Llx8ni)vv~6xrGj5tLv4r;X5?iKEr4i`dWJueQ{LWG16bBn|qIH;*PO7=eb_Ea?Q^D&V8>Y zy&khL3%7Hx)nYLCyqT{r$?wZhUp#knFRLM$wmo};)YFGs#&l2fALq;lt0#sEk)!S5Glvfr#!7CF8jt?^JVaE) zcpPww4jHo4YIpDzQ?fs@;iP>EVB5uMl4-E@n5DotkN(>~1d#UNylV%iqQirpiP|M%_Zl$bi2l4l8 zY*NcCUtm_0VF>I$MHno?@O5oMEDwas6E+{#mS70C7kU@ z`su;=4gz|6GBjy8>ZT$pus966SY&8;YCJu131g#AbGID7Wx^Z7^DEA zXB1^%41~@Uzw4K8(knEY>Gmm@M1^t*6rQdsgMD zQ6hzPVi^h}Gn0CiEW1-(db`{d%V&Z z!TasA<&7R4cX?#BrCmnS#Xs?w3MrgiPkLrPBU2oq7G~roOMi2wTZsU7;n(94#WWPsy?b<~fJE!a9k)fKs zPL$M|&Brk!CsS^iC$Uh>QE6}iiS8KLA}+{bo;z$YPQhD8^gU)peAXjehglX%mGyp( zeptp=HpkHysMeWxfya6Y$zA&yE0VcJ7&b<#*-I)OM;Pn*3db|bQQ4Pmq0gyTMVu%y zc-0eoNr;rtw9vB)wV15;ODhDfxmzis7b4|E>ydI6Nb(`NI7gMYG;w+J zr(CkmZb;a-_lMervIS8!aJY&Zdp74LCZ)>!Y9@(EepN_}q2^jqD$Vx_e zZPR*D#)l}oq^UR+?KCkK5(de~%{6O2@`D<>f15blT1W>Rf0&?cB_CS9B*44jE#1XB#8DVqe_ zv5@gddYTQYXZrS>A#SYZ!Q#HbO^fxoipbKL8l_C|dot<_wPC1Kh9c*m_D@hQEX zS{$jFq4h=G-WaBM2b)yX?mOUoaiqG}?}C<} zCzWWU03$KttMuqUO6HHryA6KSAq_V?wZWygAm%bWn2;eU0#_SG!;lE=KS^@Qc(P;d zc4H8a{;p>#wbpV_!}l|g+E&Nt2n(-gxc>VvT-%2JAix_vhjBU2PkRg3*fDFzvZok( z^!Kx*;ZQ&9)!g?th=wFp8A6-w(8#6x@wwVs4z0-#4AoqdHlFTrTyw8EN{{}B*;9V-Ccpo*k0U+R#N)89 z?8yEBWK96Ww8N*_LtfQpkks2RFl`UR~7q(G(qx9gN zK^j8twR7^N_NlUBdMP_e?uA$eXR)M)_Fem@Lp>qm!&lb5A6K~_pm%x&jQVVG1eXq0 zU-#*5z%bwf%LWWdF7XLwwDyyOwYCHpcGKB(nvg6WtnLsJv~WONTmbxx>oVSHw~FPN z2%S3{mluFZK9NdnqW5BB zc^UWombwRoc^UIdUd?lKz}i0IjO)j&o$334wU>b{U*-VLu!~bZvYY+0Y4c{rSZ$)B zl>^S%N1$&mN}}cgxzptXw_s#RbM9axxMrh2_{e*2v7(iiegi2*$xHjMH6Y-4L2`^; zn<0k7U2$pZJC^45h{1;&RhtVvCl8Q5n60M|(iU&q?5}+IQg5Yi-}@9ZMOR;ITYl@Z zqR(T4h2DnTOm00%h_QGuHQe@euHXO1<!G0iKnE=RB)CpB#c$!MYfCFF zM#2&>pe`PO@x`$^x4U9v$EAl3v8+s5A+%f-#%aS<)9_mNS1@v;kC7gZ_k*2dc?%2Q zm9=?1w|`u5TM^;1g`B7US^8&KoBbE*U!(*rG?w)4VAVa=Hal=_ob)wjfKJUE62DUWK33=2fd%<0iz_n9x$G@We@FN9xpzY!vL)c{kE=Ehou| z!|<1e1J3x-W%M=F!*M*4S_P#Z+4iQf8VE(cKkPXJtzek$08gWzebLGk_4NJWs@Uu> z9S|Zg9pwQ7u9?|>$fBUGRVyPcxro*yy$Il525!p+yEpoAtgXO zQH7Ywy4~mIakRU3O6pxN(~$;SKEfD@y7huV^otg+37e18VvDJ!)kptn zC2OGG@@G`6Wh7a4939l|HtOrpYP~jFG-%uNcvC3-2JXg->5hQ|8Ef2(OfKXO4*DEi zkFMXVm^bM_d7)ois?q|hOOHz+i8$r9h!$ia_{&`BX~i_tkaVbGoRX z-hL$<9{qiv<7yQjJk{@L9TT7sS5FoW1D38&hv{`lwX0Wu+lRD9$xzeJhOE}|-5xu7 z(OVp0c5UVtpq_erT*QmQGZCfg?tr3{XZSe`SPm4-Ul%{QtoI zpU2;)Fa;dlZKU!sU;cjr1nqs|XxgD4<3L(l|2OE3D{PFeYC{dB)s~%l*XkqL`7TBMWO zp;w9cW|B?@u-x(NpOE!qBiP)L*N{h+MN2Qd)-98!IEP;VhC9Y;WK54^);fU<8QXNU zR;L(+Z~P$Pr6Y^RW7D}|F2YI^Qx_~r)eZD2)qLVDq6$k)bfVu}n&yr&~S z!@qf3@iRXIwzcL*EF^qS&;#qy5=t-s%vy6%$X1rEJTVSzJoc#jeqW4UZY&gTi@@_X z2n}99k<;DT z+HFwYRs=_Y#%Eu_KpR>0=&$z+m}{5mK!snY&N+kH{XX89K~nRrViZI!1_9*Pt(74L z9SX}@GqgG}cCOUsSa{%#bMm~4wjWo~r}X@{CN?O*e;mT^Xq`HJNlD9stpZ7p{-#e% zW8W#z;u7UPP$g#bSbl8(oXub&Y|3VxG9$%EK^swicOwXj_KP0QXya)lGZNN#!L9{e z4y{zDLc7yijHR>Kzr^k36sEqk-lG@hN z=nsKoelcb|4R_H>jkBSB?xX7+t2EqA@gc}^3itE&v6d5jyiQ;FYQpRED7d#zwmjkE zVou!->5d)(Q<*CXS}!k0n#>%~&XlF@4}c@;nlNR;)wPk?j&hHpdRX7_BX#l6S|G%} z4Aa8vsgkjpRX~)tjJO_fisEuk$Ptb$3_tQCrH9W4TFD#4_HJeDlXhCmn_zmaG4{z_ z;{n?UmPh}pc1C$eM>DGQz7}5=Osh&WE zZPIwMpmSf7*0lZsK>vw^UCZK98KI!GdNLAs*hxyK^mayTFDg7lB^i)b8YzWS;WVbT zY$_T~vB)@lBG=Z2>~}n3O%kAa?1H=3KgEc81BFd7WS0SpLvr5OR_-|KQN)nsMteE% zx+z-B?{=Ta=a=M9xO|8!DMc&-}1PuMCxPp zv0e8;weEHrVbxfe>>5rsm1*xnM3+Fzqh*>)Hc_HoNnY8C#l(r^G z5pHS~XUlYy5ctUFo;!wqiNRMhE?!M@Z!+!pAY8zJiNE5_1JQzK?l~^OkZ`G)m6ncN z0Mty!oku_TRZjgCQph0uHu#T{`BVd&M4nb|Iy{e-7zuQC9e-0yz}Cv_JnsRT=hPO1 zP3-3`+DXSfjh8ahj?sqg8awmhE0q@Sq3%tDZM?Q1nzuIVbU{+mpXTKa$bV)KXnBSf zX=OkD;B&wqftWgH5pa^qN%769{42yMElmo)h%8riU*R?mZoH=rLYn8cx;u5huY8J> z?P}k_sKj$z%f8+A{2F_vbxZ4zf9nnR2D%^3DsvfqS`g_lXZ%+bxknZtu6WQDcTqk1 zn@`bckUdS+8a-}iQc9ALIk^hdi1D24+8vwjRJAR!zUwUs6KQQ46yf+&SIh$Ify~RjnOA}rO_9BUuIK7B^>qy-$m`z6|zGQ%coB1Rhn@0L7PmeJ(I=wXm`g&K z7TS5L%MfD^5wZ4vZ-5SNKy*@k6ZTJy3i+A<84x?QpY@z2)FctQ9`avU!ncQLtMq5s zvvxU>CWz~GDxH^@&J-CAq)g(4vyW0oS;q07o)uP^Pxph7a#}5PbbYOW=b?r+rJpSI z6^BYOzoz-}90nHrA~FxNB#1&OmvjjGF(3W4KIkD)6p`7&&%N3VhHe-oH20tpJ-T3r z-@Y?T2KlfR5=dO6q8^BdWgwPDT-#bY;v|M?Jwj_mIzGMp33{clb_BM%EWP4P;Uvd@ zd6_l;J;h~cI5FHVA4u}~x2klVaj8|hYz0RInt^KgqvMD;U2j`pZP{{HBOr8*O z`aiuw2g~V=G#OX2$N^z2%tZ=>#M8NjqqHe>RvgUtql*|P8SN4%?gO+Zy1H&<+=WUn zet`C+-njr4^+}CUD?Kx)cX$Q$jLBaV7Ks6dI3CvGGxZc(v{A%dI-(@QPKEd$Cp z(wJUob60>B&U89*8Rb4ge;DOJ1S}d=F=tZvCcP5nTgtg=EuxjzrQ>VayoCuinuxv?pihSv>=+}gI>>?7 zQ%w)AgO0e7o9X;LceEDj>BWnfH>vgss3^Gp4ZQhFHK+S6N!974dc3viNX0cBYXewc zj8m{%He{QCl6B(H|son9h#C^v|SZ}9hJ{CQw0n8W95>g7Ds z>`W&vw68-L$+Z(7?7=oe8o()eW9i4tbG;cyM(>)f zOMJF{?5{KrOpx13>Fa8noEF^FO0$-JY7U)b7`#uCO=$GjZFi)d#W0?k@MGIcw9Re)90ZItXD_2H( z7d;&P1QDAL%-H-T%u4a?uFWGkSe8)wK`ZYnDf&X2Q~3Frf%WvVG>mlWhneHNH0b(e z@?mW|3?w=rsO8$kYzvbd&)3q(TTCyV2d=oicG74|$_VK6_u4uB1UR~F?b9M?`{~HH zHx=opnJnqkIt#UKOKPycOJyWu7chatVu7onDMpfLjME4yo{Q(`O_;c1q>xOX62cIRZ!f|(0K_lQnwD@ zbB*@qWyIG$f;L=%tIiE{SD~Z$Rsz2-Acv`o`1&~<%Fv3(ftlN|eI&)QyZYt|W*?AB<^KQUCO;%bP+U2=nk% zm#kQi>w2`D|Jrj)$HR{Dg9skZqE$gXpgAf%F=Mg~8=YdS^N;^{jQ~tEt&WD{32ol;YBe`Vd^!)THcesi~DylnU-IwU|3dO=7>2 zveoT?H!Q$PiuYX^`-Y~vwTUvYwlCUwB&5!%^owat)33QXsFkX{>IZL;2YIMrXcNkg zilv6sP_)C^@W`2(62!lLxe-wz}uX!O=&vD&=lxpGMUmKKE^sRXb zJN@ajFdSDLK97+sqDG11yjj=y0+hs1_{SOBi=YAeee}*@p}g_`QTP6_UR78A_qiYi zq=27`e33^Gs9IqVkOEbvQoRExOtGNg6u;F`D=JRWGJ-8m?elQqUbsK7z5d1)e>9Dv>PU1IT|8SB%iIen6oWx0<_iL@a&e`XDKKBQ-on!*{ zbN1Ok)?Rzjioen^&B z*UzADJwNDM)caUre>kLF8Vh)RGDu_6ET=Bqj}=DGp~YyY%~G!%t5sX9gqC$~87o(v z1FM|Qvy1{?`6zAuZ&Z2OxvNTRmJghLWbd?=6l3;E1@$tkBe30eo(W4 znC;{~V6St#c#nDa0sMK!AGb#vdFE@Ob$j1!S!l+{pdTNt&1&oE6_!n? z+fCzhB6^cx!TrTmfdTVqeCOVlx(7=9c5Rg}UpEc!4U*qIbl$J<>rJvqi*gj#TQpv| zdi|9wt3#<%{D7oDCjUx|>$yTM`RuW>ze>KlFIqZwIi#BFyWr!x-8bfJq2#@>>VRLf z)xr&(@p8%Ut=ezBicCk&RW_CSVdo!GI_7WfqJ8RA!FPoXTpv5c zKB`uBYI(7`GiG=j@o?flsM9K^Pd-BHbFADBW<`(j=xbE%a!_L?>#-c>x%b$)mma^z z&Ie{&k7abu;f+D(QrCKK;{A(}*TIG{>kp1VA0k6T(&n{QGQX}hA2r^{^=47lp67I! z@KK&u{a4CH&wbG3ZpCq7t5%Y}o-fzw6-UajP2w(~7Z_g|sYvHx?p ztnPF!JJC`*HQJ$R)afm%YnRejS8_+JJ;le+J6YTn&6~Na`A=|mWiK`J)-l1B*@x|3 zj;mb8j5$(DIz=xuYwFmBtRC;XSXYZN5p&n}mP9@E67*JX#}qbGX9VNNseCRuPu1rj zE*BmUXTuK_B`E)>Vh$LOF&o&UQPW{p9yfxTvPD?LxCfs(6MxD z+WlPQH-Ck8i_sJC5VH^DdXy}#Z1$Dc-S8#$OeEKsy_Qz#k;Oi14xaIKGq%!xueJu| z(C7`#aW;mP^H(N~Vzu7)Wo&F7&$gXnDej0Iz>MsnrXYcF5iFjnb0cX#5HV*SL+ z*ZIC!H&#h{s~ubMcF$O)ZkL_9L)3OILZ-FD7@Ow*-8kxd4b52ZQ(3OTBb^-=|gE^>v>BtLV%$a;|NTv2^L%>SoCpyY+cMw$`$tSpxoiq~Wjs z!%DlI#Hhi41r6D2!Q8#Q?vC>KmS(;>ZR@faIZLm)pRE0yP;vA5K|`B@J+o!(zM|*+ z;OtWQ^kw#)=K`VL=Bky?l?d>r0xkfwBJuWSXtPj3Lf3qs|sK$-^jbzKOYC^?3 z?Ai}{+}Gfj;)Zj}-$vWE5ioXr8BNzUYwl!s#i%H?UfZ~F+2CWnS~a2^Ha_b|A&(9= z=FxTUUeV&X)P0g<`%UZqjY{IDhiZ%g?rE!AWE)SI>3he@t=;Q? zqdqKa(SC53e)OiK>k{Ab(y6|*`*f;H`eNNmtr4=Dr(Mop-G=M;W0&*YJ5^ukYb4c! zn%5l^#?976iK~;OeZb1yuN|6ojCZI!Sf5cZ z=)?yjjj`i9y<8)ae~)6_56T$rAh*^{q-@(rS~ZbU+4#A(nV*pWZm}a_6zo=ySFQ~+ zT~}YHMYE<1t0mO>fT-*Gp>D4r>x*%F3%-1;PVSUuCnNcuZF;P8-Jh2*|l%lC|P%IbYVbOL)8vjK;5;JytwDTG=*i z^)ZFbzZ`0r1!t^%NP@5Hx6-pd?$JtSSx8k;%MOQT762DP- zzo}f5IB&SO*6{@@S2q3u5YtT(t7YlqWqeROtc&l}O` z31%!yKif-Rx|WafzW>=TpQ-kC>Jo>m>XOSZu0N2Cw=}0+vQrRQTLg9|elM0V^4Lq@ ztL1mf8i&W&*|Ju4weByOkM;i@h1ybT*D$oFjt*H+buPIHmAVcJ8@QT_9V&=Q+1$x) z2XpLn-zCYpV|EQ~6a>HD4XJxjvE;K89!sF_<9fSKT=j^}w6UI@B4F`Q(ms~f`0nkP9n~^U$auQU3G^_F@^IT z#ghC?1Z~)^x!K(sS-VvKMqTz_d=KdqREWFHsF_PdkdglVZ}%!dO~38W?GN}I8Sb=Z zy)e#{Fgv9zXV|}|8KKWi#lPi!GzX14i$yDZt$63 zajR=VXoEB;bfOT6cAIPu_V3;#zCxl^ zm|4qPJ~w|W@maV^G~$AlRpLIlnR)FhjcVhmDRwo>OfG5RIu-tk7H{7!{#vVgZ! z%!o9d!I`;KvCEaVjFjn-Qs_D|y-zU+bG$TVms(C;I;|A_&I#Ces;&fGwR_FP6|)^a zVXI*tuy}K59xq6f|5_vC&jbVfxa!QkB3yEkLQ`3z*J#p51d+tN#c97{MQ~Amc_8EX z`=VuBvje4UMyk`h^x|H;7iCy-pv6vD#!5gd=KGw@#{;m+lqvU!riFg*67D)*s?ZgJ zfL=Ic{*pabLs8!Nhm@sV-b@K8ndMo6H204<+$JiZh1?!zY})>{Wz{&T zyfKW+wlhh~dP<82pKV1`Am{6k#W&c8liz9P>w-uR--Um-*1$quA)R(5Exldg%?67; z$GXNVSce6^$a2q%X0?5)8#XH+lzLQk#HjZK?QJt}(6^)a@`^!`e5qF;#Q_crWT>%|%J z9%KDgXQsIP47$e*uUJ&|g7+KtI-gc!-BK1{?ewJd=mzy=)ctia)}JY6S@AU~@B<2?lye-SMBrAHkl8Rj;1ts%y_n~w zcoUx@DfvUpZ$rDy?lh`3UFb%!$xnPBvoU#&^9Uh=b&0njR)0!a*t-lG?jJEW6i_9T-(5+ zKxJU&CIUQ!A}%&JvBWfSWf~@7=YHu?UzAXKcA8TEfqJLvk(`QK)v9V~paUi3hQutG zD1_bO0$n<#@6?T5>NdfIo9gw`>aoj>W~|^why$>0s8rhnp;N^-aBACB+gzFLrVVCP z#k){7AK(7n;r3E>j&Cca>+)TCwfC^M&Ntj+#!;5-U%pK^I6wHHm`_S|Ac{p!r)tr1 z*qEJZ0yL)?Bk8g5c5!}8s7S94tSWVpm-wdQ83~wr6+ETSgF4~DtWt_g^Y}W{Vm)Ry z{T_E(yG-$WpSiQ!WeP4duEE2AO)_PAl&qXQF%F7__bGpqI%VqRyHX2$yf+U(+Gv}+ zM$^^<%2!dKm`l%oM-%>9tgbi4sNnKJclpVz&m0DIX?ZG=;*npn24m0UeKo}D#!(TcG}jcysVjlav83^Ao+^2nsXEri<0z6$!F zA;JOB*?Oz4&%RrH3WuVji$!6#*Npau#w? z%wI^>-7FdVO@-@DdEDQd^|iEJa&Xqm;I`++(^2!=EvC&&7NN3@Bwd1+U*X~|${t~{ zSsYX>8|&)Ie2SZ6h34xKKHJnDhlhr1K(1YUvqkONr94P}^0A=dW&GlsI$vo-OkXUg z%-7ZGuH?K~ENjmlp1Lw}Hdh3an%q+5`wg=HWNlr!M|{*=jM`!RP+g}Pu6X7MSVQhi zKsFSMurEeG{1caqMM<3Dj4Alj587hcxUIXg<3d4Ld9fv^%|VlWNU(We3Og)!HhfDO zn%dE#w3%^&ZYVbYQ1s#YR~!WJIr0=q&vkE3Ib6!5GpWzhaFH$6pRQrO5_y1K8P}J# zZ+udJ=~9-^3|t2|ehC(BSgJt>RQ67xan6WyEn4+K6Jjyf@eeL>&ghcd@4Pjukn?TS zG`TlDt(fi4jUhMZ`TGughbLT`7xSY;TZ;4m)8EoLGP_6g-J$nX!@PPr($ysNyn4P8 zgVnoLD-KO&6*%&I@%wQ>1)s3rcZmmpBi>y$u@Y+}XX-h}h1|$L8ZPbzlT@7`CTpcF zCxS@{cS5=U%EscoZLJ&)>oWhm=&R_19`&aVhR=0(SM(VAUa^ZJxAzBbE&7U!jx2ql zm%?6iSEZ+>(j^}?OBeGxm&-ZNXDkmG2WeSss+TCP42*DtVk>vr)?Uo;+z)H47V|o9 zPAsMz(5NpolZQuh?*EqYB1D(PS#Q)H8a*)5T056AAyh`CCxC z(9#eV<@ZEaXiTeEdMM^`88Y!s-7vQqOsFBzO+4+zQ$irbV&2%T2XaT z6Jxgg`f{0J-l+8lWvaDcezWv0%`vRpygEJyCAF$4yDwp zrEG4(=EF{F)*i67tB)ny8n_26dQhoTH%ZFw)^m^E`P8z%$2cx#dwj`Lvz_D0_ZiN& zYzQf4IB&xD_;eVr#f)9Tl+8He*%?UQ6xQNr<;>^$*_-4xr&ctg+pX<7vzUI9`Vzfb zO!=0^P%)if+swOgwDDu9bKQ;!M}D$^Y$5wc$wKmL>e4mplhp@Twa}f{CF$N>ny<)bHAP08Lp$XRF{^k|IdVNaaH@)Q`iJjO!ZCHh2GRR_NM1#>A@*$EPajiyz))q`^UxPuPDz~6hmI5pTorJ$mfFJP|&#+-VL!EKAvqHJ57@Mw!$(;-gnXv?S8w8d$ghZfrz zsZhmh>N8>6JCJ8DU#jZsp4F=|PrUEY~` zZV5qQ2+YSE?Z++qSXSt-JPG*$~UB7M9c& zNuT}F5vBtho0FRwqZ6d!hMaONpMJ-v$NU>hjCu4v@j{Oz8?(ST2vT}8Y8%(QUt+68 zUcOo?cMpBNrsCEdi-|+orM?QUKm%g7y2T6wJG2vCv?KRi`Fy?j_QdeX>u;wnd=RsN zYGzn`V`8xDTd(RZD5-zf#9-A+yRRdBk+-N|5%^ck0&lZr*| zH^olE)4ETiH0Qx$4zr5JHR3I1TKOmotJgk>CvBVT>PwN8*f+GW0b_2YxWcY{{=Tg;HBvg_&;h~< zzhD%|thT@bzU=`IdA&!l$9yvu`w?iXX5;pmo$Atb<|KShqL@qTn=~kzkf@3v|Abi_h)mycPQj+%pI-W*3?3GH|>Lc765i(2Fif z`NR;E#>dESSkxLP`uwHy-s3hi!rxd-{knM@iz#?(iz(OhJN0^xYvWn?qmrA&+{XkD zY8_CldrCFq|CW0-eWi=u0gI+j6K-Wa=rPkMJ<7qB6WZ_F-6DVH=ls7M?)CC3@0D+w zZS_8*!Jp^cNKKt|@HK7qGaApa{=>)59|3mH*PXgFln%oYRV|@Sh!BSd&mWPmv>^hw zboxNfgi!ed`eaQTCeG7-u^T%FCcqQ-PK4K*QZ#0J6RKhBL~6j(wOO5sJyhrSjDLT4 z{=L?TfAiYv7G$tmR`+VJ8<`QQ%&u8oK-WiHR-*N&7?kn!P?E5PzF3)WWR&cfeYvHE z|FJkcm zacz9R457JHCkJRoAj;+_7FcL5n~@0f-2f?g?Pbof%630q9@~%VCgM#d`oQ2(3D~;Q zM-&x{>Tx#-6S@v4w56Gzi!XDzEko7fQl%8?x_;&X)5=eH_&r~~*S(Hok8s1m>Wj0R zgz*mqksZvKd4{=7w$l$Eo3o%uRBi#nQr9j1Kse5h?07ME3g zJ;~3}KmnX7d_#dR;}%-fsdnRvG4-|Oq#S2@TWO=>(@u3-N9k{h0;ow?8RpLJp)fO` zQgu-et{jwWde<&{7oMmtzcHX#jY6yxJJXN~Uu1psA1xzX%&sfLVs>3Q6?6YiF!oCz z=Dp|}7^n;Ffl=e%0D`Bs3UZwTimCA_Qd*vylpzd@1F^*J8{;@##YkiN%XIl+YX|Bd zW&eQc^sNVci7V$2+VY^{aE;-3S*5>g_4|nE8~nvLJPt56F3oFc@X-=#9Fxx~u znCLCvZYU1@lTdfHQTMvhsQV|Y)BCk!kN!#OWCuBWt4HCYKS`bJf`^0u^XptUTAdH& z#)`$H$ft4jmUU zTN-1kg`Pu#Afu2B%~l{Oym!IV7ft;PBa0n=Zm_uYw$an(kCs+^Z)|-3P??5oQf8x%p&q7y-JpSe714WnC=_1S;V7{ZRn1hMqb612f%C^u> zMi@hadEQ2giMegSDgM@d#TX?RKv=Dm&O1M^+P+_+N>h5WorV3uTL)^;+YA%n!6KUDfQufjV}}gR)I4 z`;}R;LM_4!MBuq8)phtMb)dO@;WB7+HmEACvqOAE6#a9q^0mu0+R~NoI;l(FVhV(1 z+1tCzNmES4I?@q^xgBRVE#JZ#$2K%579uktgF9iX8z25c!>m|crwA-iZ6J+7>h422 zM;)^y&Q~tg(Gl#%6*_zACoVaidPUKt&01&(ceruNh&f7}6VE>>kK-*LT7o{aO4rHP zM!I4e^Nr?wXl3JgO>tGd2ACTg7@bhLr8GCwdD&8oEc7txusT*a+>yROs&i8=CRWN# zhW;roMRPJ&*ra!$R5o{~r7Q1iY)z=Gy65=<_DW;bSfEhPE%I%6%u#%^IJraYDSbJ0 zRdWg2RIxl;6Dko^TpIJ!t>vH~hix5Vt)UMH+xpU9F&m8W1tfQ=HuF|nL7_`5|Ik9de9S@sZRSn5Wk+s0 z-D_Euw|QlDu!nxB77u$w3Fa-M^nCUWxq7)<43jbD-`RK0>Lv5G-QOHV+c&F?aQUM) zd#vyrs}#PEM>}qx&A*!leQE1<<*hcM*5NYB^RF1@z9W`3F%sZq6i9ebiiJ0+x4akg zuQ$5Gs#qPVlxMjSk4C-L`mLtLn!H3Dq;gM9@C1EY@^f+k6vBeIszOtllF~ zCg#MOt$i_vEv_6ZXE_=-)^pWc*S;{5`>IOizkWQ9f>V)0(C=~cK(R4criGTB2qCW+ z8+mIA-C9MjV~DZzg0H1&YxJN-)9O0Tm82Q9)@7rW_@?@}{vE!0PH$)3%iv|WH3m$% zYm9l3c(GB7f8`HpK3**@EuhxJk{oQ-f)3o`%UvIA0On9@+NQiFmo52`L2`EaweYu1lM`<7@ElH7zdB4=}iy#-i6o*$%hZ z0@!A0z|QL(zF5_1`JvEBc-L=k>=%CvJz~p#-m}hqEZ^q%`*D{_KXy8}$wu6OiEgdi z1I6mRM=E%DVbLE)SO+J0zd66Azc70mY{# zC(yBA$fb{+u|5_dl*gJ{nA|c(3sxY4$J-4vE1hp z6tkUnG-Ueyoo&|=?<+QRFCX6`Gh?OW=5f&P9<|qJf8e3w2h{{ z?i>QVQ}-bjUpx0QAr*_8+sn4sa3Jy382zBH2Q=~S1ZS&ypyKG_hR&rbE410;U{Gm+ zq659DH7|dQ-g7Ti1HyyjVKBZ=y39);g&n&BtID4v{2A4)j{A~iZo=FRw-QL zxK!}F0~vFbbZXziuvoa@wcMjMH}?8wx#QOgS>~s4W_o}E~HK=al_K$Y~{0xS=U`E zscS^AS@vqK1q}J9=F@Zci5GmsPUtG-onK$A%u-5Tq))4|#r(<^+%Bqxvlfi8miZbk zzav(nprKC( zF|f(w$|0DcnoKh+a;F=oHkvLP!Mn81Zne5DtutIb4a!x!`f6#5?las_Pkh3pz70cl zE_y(HHriBP>8o9VR<5s{#_f}BmAIU)=`~SFzDzr)+$pvQDx6 zf{Np&A!Meb5KwdO3aq%bSb`Dt9i=d#<`?0Z^J}3?|2dP;TxZ&(eDD=L9pbFem6bRr zS#fEDGaq%~ZhP*DVB9ig(OTDBU}0+D*4!ir2lZFn(kYfxXvm8^ZI|L0oz-+TxFHmr zcxeTrbdPfNs1EujKKXzYVAAEQXY`2-gZbpDPIOjds#sJ{X=~-ezc7j6TbJ5WZJ#Pw zY!eQc1?46mNyh!^wMrF~63)(^x(cm6$5+guKdN2XHleM>B@^}9x?Bwz0R5Wdfh!Y{ zQ>^ke@9xOmXiBvUbImop5chSZ+q zEz&KWCe&h4u31+KceJHzv23&7RJ4dBns!V_dW@f93Hk>O7d!du{j3&DS)paJuG0K* zDG&x?(?lOB^ttNL{HXeH|O3u~t+KW}_)pPGXW=h?Nsl)Rkqi`-&UCAL7Tdi zi#-r2S9;@2vQA3QUDa5+GbiVj^bArNF1%GZBb~T|glBAeES51+v0u>;$n6*#2joIR z(v=%(wJ=e^a|aTm$=w~yBcMqG`U;@ONa`^?7!V)QeB^!`XYSIMe!DbxKHRL@v4S1z zVqsnOaGw_A4!kv^(q}w#$rPCTGRUKXfy6HEuWx%`P8i!+ee;6rua#;Ox{S?qRgTLW zj{Te(v=SSc#jWZR+4fDd=UxkTOFr6)`~H}1K%V3?EW`mh)I9N@B| zOXp1BOXLPzBgrs*rD_E;PTgUh{-EfZ!g;UaQk+QiII^E*DC|_18ij0cANg)=HB!H} zMI~@7)#H6ESN@2>x&jW>C)>Pde@xIZk($yXh66!sFCB)q(yP_ zE|Zvxi@%hl=OZ$HDCa)43vB6wxFZZ71aI^R-m&kLZb)s>*?jJBnwmyXHU<=5U>+Zr z4lv{ag4^I{u=m@GE8C5khx--D^{}-G%@0?iMfvsF#zD~l>mOMD;RNo#xYqLexMZ0F zPovM~g#TQuG2G*ih?<0{!#@Dyv5h{ue7D9*#cwNAYM1_2=r`bW>He-a&VzMTA2}1-22C< z2bw*umIZvgHrPM(QE_F|FeZO*4!Z_<#T?JY@8^R zn2+phhan$mK&K7PZ^hP5dV{$O3uotqW6!xlYHQ_&=Ap53s(;-?O1IT{sq3&++Hi`z zVO+(X1jSr9oDmEMlylQNqTk!CfblpO*xwVMR)-PzPyl6W(e&a$aOzSZfw)KBiqg;zSyW|eO>spvUhHLKUqquQvC1JvXM81Fm{V`v)+(#7CWat54Jen%!q%&H+K}eLoMf7Y+ai% zH#Rdye2-e(_;lM6{7YjVx}0}K^2CDGqq@`}c~%eq?^QBSs=>Nc#{CT`(N9{#KH;L+ zWrZJBaTaDddwo^$Wg}NOmfKx%o_9^k3!2rMG6NZOe3!5fHBeit++UUgiRDS+)}=Ux z(tc~eS1kto9!}1cZ3?@)ov+4(E2eAmmo?>IWs8SyVCCe-iSoGi`R&o(5!#MXO9rd0FWVWdu)0%pbZ=$B&pmsJkzSTq=~^+oFn z^-$2vO3kTL*5c-0p*&o$N`HJu6e(F`(N<9a)`oQu$91PC4r?5fbtm{3`47Yyf4+`% zjrigIB0|37d|7(;iK3@rgi=H0D#w^zYJBJvyxLmHq?o<=kJ?TkTDA<@-i?Eoz8_6d zw0}3f*`EyjxO%@$0qs0@_$>MQITg&44kqf&=MEF)*@oMB!Rauez7*OrW!=}Nkc*8K zT_Dzk03O3DYh~ikqui&c!rttLbYwocfL^6huCW7_01frdM0pCGNbea~3sX z#=^73)(W$Fu5+$y^JtKET7B+v9=El(R8ZV7^HEgCE#&99L0dD5Jf1ML#@ztrbfV^N zYRIaE&8asV10K@1MVXd%>6+a7#Js*;p=-lLdAp-Ss^?sIwj+dbr*k_rHu($(z0}5i z6PV6*81*`jX>^uvF+w`$GjV$ zcQv`)YWkK%_fEOnXs3xE62WB3(nOsZqF&diOMvBsb+Ei7FiKE zoMSfvw4txlfj(yvrm$;1@1|M@$|g53421dP|s) z|4{YrNs!%P9lO@44Q^>4gT?eH#V+w?DZiL9w`9cKQ*X3-iWxTwA9ukPD=KF-d%k^v z!WWIXN?@mQW}8#i^{5Z%6Kvtlq7r+j=`H3CcMDTCF3@jm45N?ev7#q0MQgw-KGDKA z?pZ?e?Tf%+wAJs|EABWS2%YpTC-n9TFBXcZtB@m@ZG-jE;-5})=aaXkp1xHWS6fkv z8#=?Nmtoot_hakj=P}hU>pPdYXl3D+X!@~;T9ERvrup?B$#?aH@V zGR)7v6<0wUHqQEjI8u&{X!J@*akEF4lP?_X?r`VC0As{!!bw89+#k!v${TYhyTsGZ z+jWMT!)W#j=j}$rrb_A5U&V?ly?HYDZY|d|PSf1lbbROBS6_;3e)O!!8zI|4k zSyxZ2q)Q9?5ZDb9E5S(5U0?A9=3-G*9{Er$MKS;2YsvNWeBn9em|x{+(4ld9yFMex zH-#20><%Pp*dfIlhYkh9CFtDFxQdHw>odq=S(K^zs@YS{qtzxg77^n_{4TY)nZGVc zid9iVvmAK)rRTXDee`;6w*0gOiXzKh-Xo>tu3kS{J@gTBEM$c{YLSZYm_AT(?N}vU zqqwK8(XtyxE9bq&9VvWJY}8vlMy)q5|5w5t9aY^vP+VTs>-~UF3wg(Aqo*~VmPekt z^oKKi5g&VlwrL^1?4f$zifiz0uq2SibxCO`>oA;0I$K|r&$3t&ST#$=cqq!PpUoVj z_THsPpnPV`D8cD1DZi68INtydy98UsEr7=*m2wS~JIH%9j=71?53``-qkMjCd>yCe zEaC13$GPN2PqOu#-g4W4v+XfH;V@k7O-b$BLVOI5mIn)`SifB@zuz<{+jeOIy@quV zAJ4_Ah>gP4JwC<#b?(k(KKiJA5rhLbY|HiqOSg=u?>^Pb!Ge&NIizAyy_Pm@wz-}j z6h^-{E#%OJ9Vj|~G#VA_MoS53F_&`8&;dG`rnz!u@yE6t=v>*Cb&Cnf#5zRk;Wguz z_c6TBIMghZCG|4&ZY=nuZFN2M9JzeuI0`g_n>@E`&N_9A+ee3hWWQB>2^8)isM_BS z8|kx8b)nH^A=YMioC9`!@t7dppTTsQQOBsR?*vOdS=H>Y(zZxl;$Ba2S=h!=E9&{e zBJzV0Z1D*EjOyPSFE?_a()a-lJ^QGn(5P1P<8`=OC7mc!*Z%nk<<_Do4#6(%UDQz{uvFW4yh5MAE4k?FuS+UlrFj zTM>tmfW>&v`K_`Nn&StYs~HKFetsZorywCefaN?>G{#T8e7z0f`7749<6703r^Sd5 z$-pNHa?Wy&@)eaB^TsQU8tR#EBxy)( zwhF{*HJ^Z`=c+P6%{*7qINHEYUMwBjv`-cV9uBNvtRvraRxEGNwMVJ@l^-kFrH|VW zg(PDW;!O$H=xIhgBgF6ba_hRzMS(G%0JM{=Ptmgp7ixIv`cV}4tL`O&o5+b??*ye9 z@p0s5yJSsJ5E(IcsjxrV<_z`;kve_rQfariMw>WfIW%kFMv&^}S|mwx{h&TZ+siX@ zV)HvR>Et1&w+}!W`RT`oKpWvQ<^}ck7OTc9TkqXYb=9Tf7%kPNtR|j0W_M?+;W-bx zJjrZ+>8K_g#^?d#>)h^c;4T@`X+5Kkf8;UwFRj$MgvT-#9&GsPiXVoI^i4g?>Rija zrt6GpyFT!nlO9mNxiwVRfpI*o4!bzq`=41kVumkN=gljY(7-r}iun>##!$k=`eqI~ z!1t@>?hh6s8Xb7m_vPr$#Y5+5OQC#gCX#PseLOfg)XkE-38fX?5e zHs(9BzNywcthD$_UVJUC=E_+9XL4qvcu=wj1*f_kZk`JrR4<|KOsjfypFL6_NkLo3a313(E&65d@ zRQn26Wx`{MH%rvbjw0O{fbf8__cu;>6tn+EhEb+gEPqu)9h%xZ4|fh!cV!9fn5y%= zC{!YoKvZ?1FEGUbkE>VQDS`NJ$BL1Xm2O;en+r|kK+_r0Jb~Vz`a(DxGt942qpoU! ztFX@`V8GCimHCp7SW4j9@DF6bGeJ#8jw$hZa2;D57&{>m)Y7X+?F8L1Dk1BvXsYo+?`3w-Paign{Wn_b!^up)LBErT>h z?sCqix-K*BZQR=YW)!#N{3mh(A4z=YsLW}HZ3Va_MHq0uB|CHpEK zELK0Dk}mN>(nJ3T^an)Wx64!?ZRz(w5XP|FrF53S@-b8_s~no7Q&*hM-z;c>hh&Fc z!wh`JBqOc3GS`ijBiQv8Qk`j9u`1U#O&-`JSm2$V6q^ArqMuc^=4zpxd5vzC1(n6o zOLE=?GA>5?!D*u$I?YybCllzb-YfG9L3d~*-Y$u{RntqRNj;+87U}C^`{=oD6OY`g zQk#`;mrCtY>09)+U2(iSteuM4sJL&6?*wnTYt#DDI!oeg8Rp7THUs6E*MURmuyMup3rbuTT;W>}s41 zbPK~>%EgjZ%7f(PYX*D@Wxr9IYhFLtVhvB9CRi*o;55PqbdcHDF$NWwO*&*kacKd=wO7WCX^GwS@S z$97F$ou)J>lJs{Z6_;=uE{-;ugFt(KdDZgO7(MfKsT;1d-%^aUIlyhx2;9~c9+_}R2#+J z?)5nJ&E%!ptiD(q=fA9!V)6!kVC5gG?rI7^s^}5h!FYHrxz;Gm4?miU`WU;s`+?%S-(q1wHBbC~TlLIc`b zrvjJfFl14()kS!^?CbE86*1r$`e9OF@GdUClm^^N zDVZG9mz2gt4{=m|pOC#QKFR8I9TCQA-D?iI?2^Izx42QmQbDdn2?TAv=c{(t*HXVO zwYFHJpfW8wrTfY%hHulO8Apqk3BRtxzhr5HJ{rFtu)lnZ5muU8YJPVLh}I#C``De9w( zM;pp3m0r%!wO!UVliLAqNre-0r(mVq9@o_KZ8y%`Z@=k1JR~2 z|H*GJlFXefUO)W*;Y_&CMm!42zty)mvyxf=e(c^@|h46?}!*>K{joPwK zf7j}d>Bb(tU8C}A^j94I-&o63Lf=O}B61-@+t1RbYAWrd)39xv*)2*c?w zHL(jB|8;B9ztr_G#ytACnz5kQQC%3^WA_8-M29zNAC}G75SYOruX9g(SRs#?u0fW& z&y095z0cl5|HPDmR;b4wW-Q)vKb$=pv zCKNrRLB~3sP)oE$1Werz%^=Eq%B{`%gaSHMwlA{dFKg=<;-#LkVU9&#%W0VCJv2k|+Iu+HN)G&{CFW+|V)x+kkvYJP>!isI|) zrSP3_`zt*jb;b0vn1a`{XkqU?B13kC`uRHf(z|LgUzGvfCGXE6r6`m>aEod}9)44B z85j6ifP&od5BRQ@8QlBVIx(e`5i2O6bxPh-j>H;_1Cv1*41>5swDMIh1fKSh&p?!6CJUZjbL=ALVQCR?{H`4Gbd?K8uCB%b z4;wdUJVmQc9l4g$6+Z|)+N>BYe;{Dfew^7o3R5?@sQzzPlj6?bxCj<>cqnYJh4lj_ z!UZ)F9;NcT=<`=LC_~B~)n4e!mF;vZQ>T}UPYs7Mf;4DVtcHr!0^w%Cc3M~ZdZVyJ z$+~(h(&8UiEwP{bfK5^49$t-U0yV0AtW3X%+mU*z0ZD@TzVhM}dK={zqM=e_&>8Vv z=MVbcYibJiG(m2B!>p5su+Y`csJ3GEO5u%pmA+d#AEki^qTgsc+y_Mp`_cwt3T_lv z-F3U3v78f1#g!$h(g%Jn>MLc+P>mLZ%H|qbS9w3eF{)b@d^CjHto{Ci$^>y|Mf?64 zDJ{9b9bZ3Z=-;^Uu*cs(Z5!+2+s_cikr_5gE}NpV_8*C9oM#;`sS{43si1PUE(~(;!_b(Yj~cgV54o+GDxJ-7OA zQ9W;4`i3f(3$b64Daup*4b#CU8fBe(|BA~%wUxGy+_3iwmrBWE0$a%d+sZ; z4%bRwepQC+b!Pj0M;g+#Tl2F9D@=zRD7wDu(@%PkvByT3xDo2hio;ZABLPsD&|o{{ zR%bZBCvtlhTW)g8W`#+`%07XXUE3#CCzFB+)w!s-RM4<^Y!eNf%N}00KC~riIumQ# z)S<0St_zA~qiq|Y*I2zFw(XOIWD8^Weo73r79%~+joz)H5#mCZcZwSGrd z_U*fQ^b1xyRI6$#E=31d8@KMZbn@z)o36Ddx4&i6J#EbLDec|K-YJ&D<>bU#tSr*% zR3cIkcerfLuZ?GQ&w%+Gb3N8?^fv#?D$!|l7t5RU*rXD{DL9`ts0OsGD5#HJA(Or<38?G9 z?e-ITow)**H?ohfL;BbPL+p1?V@o4FhKr6TcDv6pLbevmoHnjuShNIRAT&pKap?|| zS$;oKW6r7Txv_nii-L(bcP5s8%!~LST+XRZLz~QBTD2}>85iJL+)%mK?$^BA=Uu)7 zA(sFvjNXr1ujky*Wgk?lTy4Igh`!N$#`m5x31#BL!1g6)s%CQPUP6X*Cr_0RgAhbs zHr9eMX8&BJxE*_qo=a`V9M=Le!2seTavEr|vb^&yn;y&65UAg%7BWe}`AkPqmw#B2 z3y)~YN*PfucHKN?qKj9s+TUD!yGJqX2KLT|iT-Gl(T#x}24}D#)T*2yl|UV3LVMRX zwFJRfc^PSI9pe>BtqV|wLVnz_Ig$1u(KTbED6~<#@ixmO+bqlw^LQtN;?<#{VosjE z(^`bfBxhwgMHU9rhf2!VrzHXBcCYK2G-YmUt9~!+>VE2i3-r5o`rPirznIj0_(h96 z{Ngmd|9zLbKHB&Dnqrd;MtNR)NTtk6hslY!F_zi(C%CSTY!%h8?H-Mcv<+PnD+ z7fwp=6zbg!$Xh1Onl)3UelclotM^vD2pbPvcwrd@p6k120Z0_sGKuDFiMLr()YvUF zqW4~v=eb15!c%1uEJf17D078Dh$dYF_{WS4;02v%>F^$iKfEVi_ofaQ-aCn^MVsNh zmSgWlj@R&BFF15I6&X59%l=-(0-oN4Xq9QMm5MZnXhi{SnIlbaKooACE*e||4u<8O zf!3YI7sGcd!5}P1d@-~@ov505k|q{7elP-u2#6OvhQOgOh-QObg3qIM`12I#otCm5 ze#aPe7JdDju374f%L;|p=^-*dwauSOy39FwfoEJGrdS{lz5goC>kFU-K!2%fUW@uH z@E>{1r*MQ&xhJyx-cg(e;9qu4@wb@)@}-ph)`)m6MeI$_UFmsedhSloJ?Xh43SJ=O zj?C}sK61f@7pfCINE6hXhx_Pz8q$44>{hnu@F%JCkwED1XDR0J?@|TZqJn>;^&%@JYCn3h`v1sgiGh4TPntw4 zG_oflIii|L(?wB_u4SH8j`~T)V886*A%gQz6HToAvTI@Msl8vg&>xlzlc{mWYk$uJ zj+yR{3;i*}A7AjtRDUE&Cmy;W5&VwmpckEbbBZ}#DbzIwEuRJghuZcN2_<6 zKc5;%&%^0?B0Wda^V#$~nVx;=c`7|$P0!Qm`C59uo}O={=bP#ImY(Vsk-GcH|J!}! z-@R=FB*!hr#=pfg{*fcbH2-Gtyc+BL8@$lxV)s>X4Dwe%6;Lam`nB`Y(akABfdvbk z&84RIIr9<%XzyI-4e^P9Uz`*z&xG93JIHqQ4iy9Mqj$`by62&W2pRnx>e3Lj2T_tl z5r$JN3|41_6_P>*fyGUlhU}%VIC=(JJpuC}b0}s1rDw9Tup}jHWa!1D!Y{jMo1xYd z3jAn~;oJkgBsGurIDgmMcu1W=8%5}+K2!igTY#9O(^FZGk;E zz?6r`J6W_Ns8&uER!?6btawgK&o8FuMd^8QdS0Sus`$tqt_36;jTXIg38=w`f17gj z&YhKpefQDlu=M8A3=hEzo^BnVVriV{UV^d!^sQq0jrsaxG~A`WiF)6+(LfA&EFMyM zS@q4~-vS?99T*<|trLp`s<9l_6_|}rUtP8qK_KKM3zKL8O|RjdNef(%zL)qy^3fRN z=r6ijy&nlt33>&(kK9<&#f+){05!w(b^Cpb-=n`wI3Br&SN}cyDovyX?7NGG*?!a1pBC5H@stFtS$Xa_{o9a7aa|BgdY+qD3Yhfnc)^q=kbU+njP2@-;10i$0^=ILF6 z?)~cFgko=hW+7hyN;o0SL>lx!B%(43^dDe9)y zt)f(`_a(i~)ZZ8MccK0+(BBvJH&uTjZ$x(?CR_T*JX6rB}Ti-IQy?bC^v-{{4 z*(=CtjL0MRCbm3sk4b1fltKqS9W$J#_u4RddT%m=p4J@52>bM2?=OM(det5UT2Jpu zIC%KN$)3UDTYam`JoKdJM~)|3bOE$fpQr&wpoP}gf~^PD;fU zEUQ#FA*>K&(YSwlAYuOW0GRu4-(AWFIi4P{DeyrEob;*8WR&KGL?z`+Sa^B7z!{eS z7p#pmCVXC1Hc_kl$gee-Q0h?$4kMwn;;$(Hr~bO6Dk102U)PA^^o>bEssh=f0x*(@ zONi-24o;Q&zz44J=-A(-`6c({Z0G z3!Qk>UXNbvb?8^HF|sbcELqQ&p|zfVBW#GL-z-CKSqLfkiDA+@@|j`6Qvm3q$5NY= zV-6;m6q+V{pXo(1*q;|lA1ZhB-qDNId!kP25qpJSyn}pt*!OcV@B0O;B*r^>0kwg& z1)MXy{%z{#&k{MMxdK*#~#AKejw-HF?XF}6EuG4fFK{j&&s^q?rl zATp8G{md6rxo0j)%=yekCSISpD3L^>=^0J+Z9rrauXn!+GLl0}BEyI@Jo~4>vHep5 zsWSv5Li!(~l!m7TEau*bQNZy%L$^u1rIzW{=$XAT!s699?+mP?BDm)mh$s!J>4QEN zDBHPMF;r|xkdA;=>@g%oW&)mMF(h3d0Ix?N$$B^bAr=d(?@p3MmA*q%19Sq2Xphkx zu`O1OG1e$oTy}?@aX$`s$0mQtWpDn+~T@SnWf;mpV?Q6t6LO> zqKk~A?vKKfC@O5Y{I-Nzh)f36>!gxr4qAzet=%a)JtoZnmGlD7C;8>*A;}V=&m6Ll zi)!_VCtOBtYEl^?CvO?HM0I8vA%cjbZC)xrtUT8uTpt2wihH-k|HrNqAtC(Wv+%>< zv!$mjOz^>H@w4}Jb1E&*87NE$$8O4xi;0$H$Rc+`V`j~hz|Io+8+bgQy1CJ?iHq~N9NE#eb|DYKL zM@%dZjs)n_2AaCn)>IN$r&EEU(^g=J93XBb2@IT0`gG{DW2ss-IEPLPNR&Nm2Ex$U zil|`*AKM{#bbtkbXI(;TkL^gskL@70x?NGsg7gluRf!$yA~zK z!<^O)gC|%F(TT(i*<^p{tvYJRzRe;QQ-++$HKAe^=xEbD`~l;L|f9YzEGN-N2c^ zZs3e41XvHKG3waiH&VIbH==#RZy2ZR0fnBu#K-2bw|s0G&0Ei2p?V?Xh>7%(kXR#U zCS7FuOOipAmtPkqUX5@l(k@ z2<72B#Veq!p`?ZJ?xBxNpTJ5ccz+kXe>S+Q|E%%8y$hZYQ(gnLHv-AFlc0Bo`joPW zUl-^|?Gurg07J^{2{GotXKDP1TL+>e6mb3>_^d?8^kM&5mjThvFm20x1E0D0{w%3* zSv0#0=BMep{l}OWr86-=|3xGVBASe4sH{7%Pv+|+o)A3jZ39F z-zq&Z&d^5+3kXdxrT>9ImjOfg1JRgn>K@*2!>LRqFuXqj8s6VMd`Tjo0u0;~!`K)O zduaF)V@1nq2FOVtm)*lBo%F+}0>~)?a;LfS0?8y;%Li1{`0V&0I9nVS)j1-ww6}x28Xw0G zCES#iF|P-iWiix?2(eH#$9L!@kW)xLUL_jl4ic*wsd0RVOHGsFWKer!20}Y6_sB^J z%RC2NZgjybV+tF3_rIRP>-)mlZ_wY0}ATaIi z|GBth8a3K)>ses7o@Ex)diG8GeG4%SryhSBRumQB?Z*;5@5$a6D{?dnBw?n(upaL z0`NC64KS{FRC>Tln?kaRd2K!Wf&G4HzaQly=RFV>+56v1z2z^K@nidqZs>Oyzt2m* z8>Qv8vA(v_?^?Of^C&C(9G(rv!F!3N-y`F5+NNT$@1|HQ{u~_LdhR0CW}IuqEb8Js z%JW`g2{x5{Zn02;BafYC&RR(p(_?6yV_`6B)FLhPP!ZT_;CF&kDZGBr6S4plKlZV9iBs>pI1M4*Ln8i*OW)0J(O71Avv^fSQMYtE_dW^AcMw^=8h5(5snd*VlWM?wu z+RT^z9IylIf4#f^HO=3AGUu)C#biy5pj zpeNIA>!8+i*I9Spn9>q64LCDxv9xWTHYlA=xj|N=ThG}HO1wUFIt?wkPzK7dhK@~* zh6q^x-6A5onbA3NCX;41r)WJF21!362FcRDH?c^+FF9uK)0E}t`(%OVR3eJ(i-Ek) zE0P^VhJ7-KgoJ(rK$zr4p34*CXBf2QxlA$a2Wk|x2=&o_V~jV_6y4;LeZeRDX5mk+FzZg>tC(4{ z0hzteOBEnV@&pxaM*SZNS~Ff4%>!zO_{2lQyCdJ6gIwDcxUtkPgxp*4ID z0S&VuTOuFA8EEmlBi<%N%4yDDOL|rfn_v2^ z{55auFgqJGaAM%~_m$M3lK#E~&;q8A$k3-HL`Sf{&zl=>ngb+^hxgkA+o32r`e(mS z2gnAzGNHfEr>uR#yfrL6+Uozu*a5FxCRFr@Vqw}06F~J2pQ6b&buclbS%pmp!j&_t zdvHraZE%YXN`F@?2a(_Ubrh9xZDd^Q8SR~nYc1niwON$6ZnUmAmE=@^pIEb(fuziu zlntL!&U!==Pt91QZ(CvIH62)oAdu?ptn%RKFfoQt;ca5e2z=%UCV5#!sD(x*kq<&E zYYZEq{RX2P{ND)T-k4H{Z|rt&nFZjT-`HZ4xNBDT(DjLKL)RPK>>brS^pO&!dwy3L z+Fge3w2*K+wqMJPm}iJDdr_p;6>Saj*xvMH)t$`y{3+C}kXT5OBmx1eEWnvu3vhkE zwPLO3_vmRWZWe<0zfzfXidCocAd2%ZgsG41p(0%WztqxfO;Tz0e15N<6)2C}r#K`3 z|FYkIMJQ?O$>DxLlcn|iemx~iw(8+15kV(Bf7pHp>~|z++xuI4e^xc6X|8QeN#P3Y z$r2tRwc&X-r392C8`OLB_mK_ORYy1$Bx<@KmdES)G*%Tru<=M`6{LtBh6rNc_+hoD zcOP4AEOTtNx+2lAyMIvNB?9{g?ZA^csGomZ1)hJmo>Jb@u2WNQ6d5PqINGUvEgNb2H2y&C6Kt|t7?Vv z$L?3lqFR=Cx*vxMnmF_>bkc~0yN|O)4>%Ty9+W49Hl((_%3X7HjTZFhGkr@I}e~Z{~`0b&c>gIrYMBJw=AFV{Ib~ICu`5%$J#E0{cM% zYwTHvpw>C0d-N0@$cGI6ohjD`dioFv(CTq@*Cd(y8aFAj^};s&x6OWff>&~3Ushn} zl=;}yB7cQ;o*I{>(zfT{tRrh4n_QwHmvspkT<49UM-jY2{T&H2`d&6Ex z$}yhDKXBHNI2UaAMAUr&jY*#vA&E?cOnl^Z^CI>zDQgp4_x%jW3nuYxn7Yp%88h%% z>xKO=(>rig@&ow91I_Tl69MTn1x&7ftd+m;br?AFv;=H>QC1TxWTg_^B6(JGr}@Ok zDlzT&!U>8Yus?P^bNn;6a?EGgdSL_vkSXT6d*M__mQPG6x%=dW*Ca^>zGz1Q6nf$H zatN0jEng@%TE5^LEd>@*4J=TAt%ttUL*RAA$au+Oz`-(KmqfIzSId7?`o!Ja7Nfe4 z-9HKA7AdNwB20#44yM&5vm^&jCl9<$HI-5Sakpo$0tK}Pu8S37g~YSs8s$~mV^o|O z>mD(~#GnHd&X9G0SprCyOCu1sl-HRqz*FfhJ$+_H(bx4KEjsY}g;sppLV>0Ol3KC% z)JDKh>mHD;6CpCDdM#rhR8o_jY9|Yg4nGI09l0WdwNY8ULG@ST1zJ9$VeSLSf0dc7 zR@IA_)31S{M?Ih#$%HMTXPr>@1cLj0_JB)M2PL z{S|qNmUP(D$uQ^%= zUJs8~nNOJ1X+Kh@y(r_e%#nqLxe>%m>lYqGILs1ZYLcsw`p#AZ=>-nXRq zZF&Z**F~(8<<$FRIrTp2Q*To5F>l_i0qY+4IHEqb*@C^BI6`%o85JmX z+DGPi8~BJ>lGL4aWCe|o#{t(G^E(BMv;-^$^F)Ex08S5bduZ^2umuLEm7&r;7`&*A z^Hbp}J9tSMx1bCyE<;yD=;RY&Tbw*xhWg6TK=cOKnWqoqY2c(0fVEi@tS4a(ECdUv z$0Vwc{66C_4pYco6C9Ra+cK=JXINVvH!9tY0D(l}NApXjcY4JIe!Wg}MprA_Kb6R`xX*77yRrsb+NWN?#m3rA#?iiHGL*yF9rO=Xok z>Q(Njs@zepaz|F>4qN(=I7ry-=pNh=Rqn{DOz~DFo{H!#^B*Spqv5KKQ=-I!hodXW zrJ`9%qUC@u%j!X;zoeZCFtHunRHFsGp5bG!Rj1k^9Am6a@Y5jv6YDC7V8dQ<)>jtM zH(dkDB6y_M3|bTE&(v0fx5eN=WP?XPCU~0+-lo`O;+;ZqdPlj;YcohLdbYyVT4=Cs z>(ISOV&?A*eFRiuKMTQ6j_j5)v^MbFqMQ(TkO2BJ89aiZa;ZPpDj}2=33VP>8`oVV z6zZv4Dh}F`vCNiP^=xZrWr;pE7~(jHnB%~`L$Bs9r?D_JkT#GZRzS=}4F?Qe56SUi zn?J*y+wuYp;>f}s)cDdtKqA|POig@Ak2M+LQ4O$2U`Ug`?x$%GS?TC3bGMns&v%}LrsLi#u?&|^TIN#82 z1O2oL+AsqY0XrmMlp)Cm2^OyftU7?(`qkju!5eR@?HY6Re2hj*Oe0fh!Z_s0b|Wxm z6*u^HY&<9lnpF`ejqNNiBzQbBP9v0_-LCJL! z#Xu6q8Rr}dnCg5ri3|-^mpT^E7;=d$oG-~na)ir~Tt>u5j)-z3M?@OQ@#-~X;C05z zS2BUru2o`aHuB&Lny)Cf0YJdS=9pQM+=w=lU6p@5RK};*B4(ngABm_ zID<@}`xr5IB`-w(y-LLkVN89mVX7GQ89oY2Ro7f0W+I~yDZ?c*MdBQG36d+zRPs|~ zO8gYBC9g+>iaW1o5y9(%9Ty$--PR|`|j zIc!yHAMT#&MIH-I$5atk=$hQ@lmFlHVC4+iTJVe4$p=&essuqVq3E@{0XT}@n0oHm zYGVmKzpwhGOJ+q^!7wI=UX_uCF=v5{+yke}%(1(Cun*kqxAh|K>(+~mRCs%6L86Lo zS~N@i==($(;1px{;XR@M`tKmg*v06=9X@2}zaywCPP#YpFkS%Y$3Cd8+Ikr4t3w|$ zvb8xeDDa^XcIZRV#t9(@i|tt%{7lU>sRrd1P=D{jD0LcnVT0~rNi)@$5(eLfUp*mN z_5x8Jo|Yri(=G!`m3h$@>68DRNIX(JQv(M_6sCa|h{#tX(gLYd5q`$>+Z-9~*x9DW z@<<|MXj|kkif>a2WuVkH+Gnr$ONI_5LR-Lq9#XqRdeKH6+;rv8tObxr2B}A?TJuT_ z-4jrE`I&X0u#YZP+ZQZA?&%t!1-iqAY%tv3$iLUH;FT5hp}jcME#2pAP;wkZ+<#Ju=H@Y*VhqkVNK@vp&lfLpkl3Wmhku zYcv(2r_x4ZO^DbSU=09}1vG9v@R0&I34MTrGn{F8K7~A`JN2ifJN2ifJN2ifJCy>% z7o?KIwqP`0oObM2cAY5?n^Wn^QI8bpWB;JOuq}tj{-=dhnqC~mqLo?{j}Ws_&TDko5LV_BjEMr+gtRDm^% zr6P}_H-;}x-81Z%k)qBUzF2|OEUVeef`dY#*3(yq+~nxdeuRx3 zJXAZaMhPX`{>tbaewN{TB#vk5P93Vz1JoX?-0O;BJla_0jt8i&vHGzK#gCC)iqLPW zL!jB0h&a>jz8aW6?bA|#%VxnUR|SS|qB*>=l;jB}?P{tja4!bS^U}chXhE9GCLGH81+` zo%ze2{N)7QI(#CJ+Fe08dO?Km6!S&+L>Atyuv3znBFA3E<{;5Atz)lcQA0XahHi5F z%oRJlC6BrX3c`T|=!BuO3A%KD)Y(0}yX+$l*YY0yTCM>MZ?Tju;m#f2qVfW2osBxN z0c7{hS!de?g2VTe+3zWg+#LKq%MFm}e)Eua4+y$j<;w9M}TvnyVq~-^^ zb2%4y+0ZnWV)()(7PBWX-Rlgyw`@7O+xUloPA)h_Xkr_DS z3+L)@PGO%3WG}I*Y+}jqKBagjeB~u2!3hmI;U7E<=7pDXH(4ac3+f5wBi8k@h>C_)Pe; ze#YAHFuTA67%uheWPbKV0r=TPVa5II;xcqe8CnpQ9m@xUeJWrsjp0wk#Dt7y-NT=N zI^*CI)kOS)Dm@CC82H3F*z&Uu!PyK(c@$41Fn~6mF!K!Zr!YNx;J{?$Vxlb&D2)#a0^J^KG$UI`R`W+B zVq^NO7o+{!)FaopPvFEg7P|?wv3y2;2c?1&^%`cJC6o-Q1l0jW96MEZVyR$2)Du_7 zRQrUnr6Flqb0m+%jyw=O^0{HLLoks!Q@AN{3iEKmn><-BlP6n-Jt7zvr`eWabwKhs z=p4dDs$80r5W^zENVwQIYxBz!Y{(K(kNuOk|JXknU`#;PfsXyFN+@7?M)r8#kv+~8 z-6ymPmA1wI?6B+>n=@G`W#}KQG7OX%2&D|i{;A3^Qf46JRUP@<(Mkk4>9Ic(((1?V zpK&Ou^|Mp<%e01u{CjH1zgz5S(ZQ^-6L;GC>nZgXdwauv-=ynQ^!RjIEjBtnU3Aqj zfhkX%syOw8*YvKHI+N;qC_#M4V&Ajh5A64B>b_a#s`=SRdOf~D(ANtmp!Y5eZLN?` zTZ!}BpBRYW+pmtg8r!B0wKx%m=8in;)sJAHwob7VwPbr_nX&z|Ioo^23oQFZ4&*1F zI*^}yYOxpF?%{Ke8WCM>tN{c-Sl&srJ$W4sdC45sFPT7iX`02D0C>rm z=B33ndBjAC0FOLd`d(e)ymSTWE;wE?YQ1z#v;&?RIa3ulW5BNyCNEvDlm(XJgQ-@; z6RfliW}$5(HI3Job{L#HYh}VF7+IQl_{sh1N_f};DRN|~yicnC==%a`sTN~R40S!S z6dS1Z68;RAd)^-zTsvS7TyN1K9~&c(u-ktJ?{NjEUoY(oCgp2Hr;alpeCwr=vP#B$ zf}V_Y*W0HVPc$*M6Nm?^*Z*`#o#F_{dFuzx0v4 zW0gv&{P;Q-EwEPW!#bY4-9qM=<5vn+dNJ zb;z?^zc2S$@__xGuwOQaV_9rTP2Xa%C++u?{l03yr|s7m<>fal{HFcBWxvJ& zFTdxodKWsZMAQ!~$65O|4tV)v3x8t2zq8-p+wW)k?S9hgdqtb^P2PVmBkjmg2CtxK@G4cU!y}JU}O5V z`u=uL^j>@Nwd7^Z%FvrnzLsrt_X3Jjbq*i)eDbvr>#xOD{3l;a{AmH9C6$oIeTf!g z%@&hJxS_4OlJdzIxhh+VK9xc+5@Y8(r&)uqlR$OI>it))_nvzt{Ed=7-iN-*_R1zJ zW8C@54o`W-So@XTdV7VVTs9rBkmcQLzx(a?p#45UQ*{xhRv(cF>n)Ues{c9Enb5R= zh6Z}@@cRq36tBGCsqUqe4wfE%-&_-#_t}>*Uf~-$LjRSw^i1RE@IQMg@><<*+wVJ$ zxz4%53h#pXdnM+C92*?~PD`q>L?%Sdy zP7Rsyo1&-aDpEzNNDZl?tK2hwQ+`$Sj9-;sm8XiXqO0fo*8V%^+;cCIz{XDC=iL3f z_S$Q&z1G@m@3RkkN{jaZUAqz*=PC>|!?0s}OfpO;kTKqB4DE54zwx&|vHfF6(BdqM zzjc+*2}zl#M4gE$aW1HLoz*v=bP@_C4txL{$J+n`IAT7;$G0o&5dexXOb`%Fsxoi} zeVj6DC<#A@sydHtCB|0+tBJWt6@HPB?)G@E>Hl6!$?;wrJRtPKoE(P(*V=63d!--q zA@G#05NnL;r2sB+5p0QA>iN^L7$HIZNs37h6a=uyh>2PWi;PfimS2-4NC62*?qYea zkSEteL3Aco`Oulr(``bg&_sjOk;ygDEMZQn4KUw6kk~dAQx?JmT$$2)N+sEUk59Bp zF`01_X$fP0!;)zDq$FW~)h5X`A@K=CyI#p2_Ghaa`z7O$JdeopSTq?YRuz#^ckQG? zUB})QAn&*#)n-Nfz&UGls4%4(UQ&>BWPx_#KgMlk1%=6J0rj3d&&X5e+{AeaU%=3S z{#A(-q?{Rd#3(iS5?e}2UBb)+gI1~OSGc6fd`U9jmnR1xF}|4L$tnO9qE7&*SRfSg zP%wI1BY;039Tn4xogJ70jIp0G+h4#Q_wY+&8ch|?7%St@E8z9H6kGPnGDI~ z0$r6@jOUmq0pB=|=LB)H#!)CplIjt^x(R?)k%rbJuPN~xT9Ydv9<{wQxkA7Q|4#B9 z0rtV>1#Kf;cC*yjs-#7AVseGXc#IYDOAL-02Jn*6y~2Ckd$G03fE7{?4LX&DZ+7+$0YoYJWt8< zU3tDI&$DQo%poMlQ}NU!bqpr*DT500q3ZPeT-<79OlP22FhRX6=BvaB5-I~M05jBrkkNoewjQv8?2GRE zJ!^1jj=0T{BLwgdb7Ua8#Z!!zun~}ceu9FNSB!sq@~R1)@NB43LT2!(8Tq0W{AMIL z+msa^8RL@OaDpX>_Bc7u7)$UB><8)88Dx>I3g=B0Y(u+BR3@ZO5eRSrD?9WfVN2`z zEqr9^e`G9A31}|;7@}tAWoik<3Dg$xp~Fld{dFF`D-5G2K6DfTl;fF{M|pe1qZ&3m zGWzrp11Nz{yUsJ-)c$v+ld|N;mqi075b(WFw?ESVZYa<9q5~=_+Tw$fK0{(&#k|{; zA;FOE>x_sIjrWvV$Cm;{y}$ec6*|&Cl5G!t{(!QU-)=+4`pm|N4pHIKQ>3Hw^?p#e zG``HoB(#XnbUzP}V19sH%wCLSAo$7>gUAW>5}5A% zE6osvIJZ)xM!N>{2dvB=R^~S(6$$65uT)@5lj-`KlK8NY!r^W83-*#v*Wn{Tf<5NM zzD4K-f9I>5cMTe^oR$!ovVl7R1WRJ-gnf%(kl{|#Dlh~zAULJA`xJv7RL#d=c$i>?2&9O0L(zLN#3%P zDC`v`RzZ9|LzwuN2n3Q(o8;5LOU?q-ARwoM7!ZMwreB8}NyhoA;HRmnF&hfVXNt*3 z*B@r8Oy#s|Ege62mM?kw%OVM_;Bq25bves`;8~Cp;P}B26~Jd4Kp|OR40E?fK5!*B zmP&b?BWCCE+TuqVW4YlTx5^ucS0K%Wm4VmbX~iYDd_nLWJk7ICHUd~^8yCWyrY6Fo zHQ(&7E9at+B7kTes}S1d&CR%vU*pU$E|Av<99rOeB^p~8pfm;Fd4Y^y=yqxe_QIE2 z9i3ctx27P6BveH%36Y_Q$c!IaXkFV52Q+V1!2Y&zpEcox;MXXc3|(e_!MG)izN`~Cn$z<6K`_W1DIqsKA7 z(7130arND5ojSIfN5o{dFVZ7}?kT1e3JV(|WV*#h^OsDFJC*r`2EDgkZ&k7Qp|^dQ z__9?!WK&WKfP`RWAid+OcFH84LaXWmZS~~_O_X49JOiM=P$+&eHco*5SetDyu09SZbX!h0nRd=i-O1`U`VGk;tD5p>r{Q*dtYcBTcGtI_&wO9IkY+ z3-QC1rm3?o`E2}fl_n3bvR33F8(x4B!gZd6<93i#^f1?0njruf7hb!H=X@2<1uLG5 zA70=pG6syO`SZiYeS_7Y^7cFKJzQH{u9oHSEx_Tcpi=zAV%^E%k9-sy{s_CaG^yML z&JdEk;`t+s&+tdMw^^Iw^d)n3KrwN6wQG~}5aRvtYH4bTY3hQ%sSCO(cZ;-c%5lRm zXx5-B7u2Ev?KE0c3YCaS6Dtf7%{CKSf%inqY%I|2h9N0zCx;Y7k?4&0;jO0bw&D(K zgU?Fz6DD0^Ol}jFlPvIlj+sT!SVM(2UB((@A*KsrOmXVYpF)+QfT#-oJZv@@UYDd_9{!27m1Ob>!@e-D?qR22Jp==k zOpWg=kPB4fNAMeHj|uGcJNlRF7R^5S5zAHik+``9(vVJ_Y9nDUSR!6DA>6g6%i*p) z6RNkN1__}%Jd(s))o?8tkidm-!Dm!)La1I5(cdAg2@&|hJ4F#mLfm3eh2 z%^$8PD5_L5Myjiu$>LTrnS3`HbcxsY!dO$H&Xf_Sr2@xS4vla#*|<>62Sqw3cdW_O z!|nA(HV)xhHlJiO?G4)k5CpI7w=ots2Tq4B6o2jQ0C?_9;hr@!kZLWZp)kFA)St=Tu8;iL6 zYo0#ej*r$3^HzQ^Gb+eMO0(t6tpt&QO2~yYRhQ+gMomJf*S`(=w-LX<0(a(U%y4Ip z390$a-0e1PuMPFu(0~mMOGwY2Bd5%is!*3Oh(O}vRRTUeI)e8I^@KUP5LdEsIYZp5 zEd`G*j2~TMCY{Pd0#HN$@#>%Wl1A;UGzC_oEt&wMU}6On4ib=ypdHt_wD{508jaBp zY}2D3#E)(bH@!8Gy)B%*O-UPvKY?rym)dUVQ;kgFyH#pLwRrL^tJTYhCsvyp6?ic* z3~q09mj=S+20#HiO!a{)c{A=GTr^z#9W&j@On9Bpvbl=mWkDb|_SL5dnHEMw_)AFxr+F9Wcj~FcQeYYi%muMkDeYVFL(@a|JbuWxl^~Q5yMx z*weFu*VGu$oIzJLqFhXJzFR2Z1DZ{`25~}zfT31!fd)x1R}sjB6Qt8vFO4>XAb8tM z&o8`fWXt5318Hv}fOgTFv@!A#BFr)F#i;)R*hf&sZP7MBz5?4OwL(Z?pIcYsx zUa|+?Us?cDOM5Q3Fs;VHHT2~7*hgQ0!a4<%Qc33Uy^aY*Us|A6$F{US`zD}CS{}j^ zp^c-EM%unq6MtilnufL>J>9^}z1su`_DCI}$xEja(ETXX$SpN8B!V&>3kGR}GuzbY z3o2sEOYd+tTvHWi!%b*`4b@1<&-(pWgRI|wHU0)SUATFoc2Qt&^k4N?DKrGD6dK}h z)axqyVcUuzl)7^4dXe@kW8eS?|DbEI@Z>-uqUp#tyhzY{*p{IvaoOzCSyELD1F34f zUjzbRtm?d9sxIkdnnfY*i(!94&oQ+nVq1eH^M>&XAfU!~@ON75zoB2=(?SfKNIn?+ zovl9jyZ9UOH3H!a0_$Rl{qK?`z`E*SG}Tr71l5)7Y)c62{>C1pXv(Q0$C%d=82TLp zEV36xP#I^bgNB+U=tk7xYSjpJp=v~F#rPY;0wM7R=a#OZCR7NZDYqZxG#%u4^&15w z_$-Ata>hEqv1?$)Y$IoBvPyz>b}G!mqkF_q_gH|A#|-uV#pF-8{C|nRF`@Gdtv0#P z8h?XUh0yEwqD`dvs;A$B!tC%zdkp}+6G?TONzVZkn zPs4j@fvp1ZdJGbsNI=KJX#xSL=e&u>k5%gF;OepYV{u2bGQ&dQ_MSm7>`t(4&Ocl5N7*WVZVf5Ih4ZWDD@j zaVUk#N}vV{%55jMUQsRc{%#0Z#XNenLx~ovU<)XB*4IlDw!Jh73X_s`H$xp*` z3OX+V!D~-K!=#076ATSaf>FM zY=fMK`OEhy_^)Vs@--t09vU>1yF?uUv3GO|mMAarj1Zo-AtK*qVuESf#3(I}`C>pK zUEJ;-wgt!qJFWs{Zvcuf1}J--m_F8v>Uga#Tzw!=-4{c37lVa&>`*aEhpY+emfkGt zbQWVi8X)FY(ad|tHcxqV%Em}7r*fF*Vr0fMBH*`b6{~c4Lf*r`(?Vg%b2bLcc z$?(_v6t~@EKT}fZ`hgy1y!G_bN`KCqcA?91Z&n8KstiTc7nNS>!po>i+GFVC#ZU@nsjuymEn5%dAQh+k^8PN1B)aXPB z1fbweCUzHx@8z7qZzY7$p@mzhkv*|OjWcu$HSssy)Fm2SdVasT$H0{#Dqt~!b2oEM z?x8>~=CFvn11n8n3CVN74myJIH{VvIJD~Dh?++|No`J`S?2ECUV{qoV80)>G8!TXM z3JN?A#Q`ex5`#jog?KVNL}oIl2r?^!6sz{Q9`Fm@(T@{A$J3Y$!D zXI%^c&T6u(5R&;yuJD&+!)Fb+#irLe2MKU>*AED99&o&Q0OM-Nk`uDHdW9VFEEKkK z-o}XQ1sh|Yi!twFAkW2^cPWtPV$3sJV{cxzg_wNVXpJ{NNWA%hmP=~o1O5Tt@e{4K z0DUemGxN7#g9W?i1G)?p!_AD z{7DLmBfwW2LwtOdr5uLQ7sK2>zS`!oq>Ev0`(l{e$5(4~jyGbow6Zzg2+xTcXNqTJ zSyHHY{5a3!FoQ?`MARH_v`rpwj33`>V;oi&W8OC3aBj2Zn6tgOp*A5wqs9`;2=(#~ z>=yL~&WSXrL+{AY9m)jNgW~gz9^YddA*J?eSa7}+of~P09~T#(cq0O~+40Ts;}>j$3Fe|@2?Scc!ttD(>jNYEPA`R+0!Y5a4O(LN(lG=7n1O#x+eE15H!Qu6enR^a^`u7$+X2?XdmV|lxWP$R zVGh5_i^mXB@bXm9%O(km1LbOPZ0l-l@{>vf8=qx<(zcVIjK9?eYH~mLt+t?#PQAH% z!pR?SEUB$YMas>I@;^UNu7aBo9YONlg^ONL(^)VL>C)x!`72;Zpo9P95p=hXRNu zX8gne>G}y;GrR8+F(r+4@zzzHGGY2T!Q00+;501yh4-HL%QktQmaj_D{|-YP&Dp5< z=dg>USqH~yO+nMNdf7=KIWb>z>G)os+m)|?N!JeW`$t%W(GwHY~M{#p?d;;HrFq}PM+#ur^GZAv^d*Z;=#JFc$8u#K8vbU@c zDNU@>2=bL5*P7IyaJ)XTDn4P<$3)mmS)9;pdVNu0a)9Tw5(h3M4*1O0i}4AkRiNr7 zwplD0+a8Funtr0sZ8irSJJIG_gYs^oiL{|pSD;*%8Ax;!vSxH5KH;Vf8{BJ)Gu9i3 z4Hs8-ikZcoGG@%@c`$7q3cx#J2=u-t(ECE5ONj&T+j0lqk53#6ckZMXz}T6`N1;Jf z3Aj2S>e~kP#~Sv>0{f%Hfsb9ekK+^XU_K=dd}z}K+v5|bCGE1I;ORi-doH#yKH=oX zAYx}(aeR&~0lPq6-Aas85pWjkDDB(C_#%^dfwKl*?2PQ7>idJwTATR5*2NNhvI-^RCx(Fs-$t5r z9t<$a_+G!6I-au?(Y?u#@*3Y;oRmWnJ)~xZ01u9Ojglq^dx;)1AVm@fjs+&XdR+{9 zPu>ONi3Nv_0_4ys#3v0&Cl{%^wWHovb6l(du$GojS2VLwf+h}pk~nb1LBA58G;84T zT0Ih!Qi<`J#CWYOH(nc`ToPKp;jJ$<{FAGS7Auo0;*+bu&w3#@xgxSey#Y|~8d?>f zbTLf0$@<9U+2o3d<=Nzl$mJPY4=n9UV6)k9WR<2vmC&IwF<#}+tBOx=Oey=yQe#9Wi=hb%W5W6DIwjX6N@ZLI7oV8v5Q@ZpIBlFt#HXGw9+K|EK7HY zraFFNbx6Xy1a8a9rgLEDR#J=s63oWNqN-p(3WNp_!$OcEOtDBpg`Q{(#2o9w8+~G{ zRyZ)_aU{v{CT)95VqxkU_)#fEe-8$yF~btRQ%n$j4i8k9j8>IT??h}^b zijhuq1^PqV+E#$Mdt#52I~qT+*Hq{=0enB$PA1+c5kzZx@muLE=(x2eOmi!w4_&=C1V~_nJ|At=H*gyi{?*?0Tf`@VWt@ zsBoo+Kb5!Pac>tuws_CuxeMj9fY<_v9o|l_9Vx0{jHRVY$xubGh(rnBSFL1P6y#80 zDKh0^Ti!y)bNKiQAJu&P86R``i1UH} zUZwOsYHVC?R4A%O)M&c8q46r&u0W9vM%4}Vyb)z8zstuI3R~Jvk4y=IpU201KJMh> zEl1`etulhy$Y}L*Wkg* z-58ZB?@ar*e`^r9YrWUxwPEgOye@=NUe4PNL9@W0+z3IC)fs{E8&R(d<(GMX-Gq6> zGAZDrL{i#IBi4enb`dAUZ-ZdljkF{L6Z4r?oa%3J+l>YNBgn&){AWLJFz_bn8HFi< zZ@saYyU}_2dH_?3`A1+4hCYMw=()Z@EDe^VXugpc8}7I+`iAi}K#A=QrLSYS>zX8C zd>z;ujB4VZyh2x2wKZzyqspo#g; z>mg3Dw62GQcXFPpq(_v(_UmaT%jt}X3r&_KSj&!f^n;NAJ;%R$5f5eh70Fd|&re3ofBL*u8|xZ$wiaSmEU`3`io5{-i4A z5@G2Od(TB-8Us6rk}X+xCb$Wn7zCX0%+D?7axy=oGU1KxoWS+9~s@9IXZU4}O0 z8}HeU2WO`NVh3uai+Ehvn@cmbgsNp|H6Qn<7?9yDw z<(6%?E+}Q{K@wWzbr^qg!A}u-TtZ5gS2u&;&P=RYi?UgeaL#%ZA|*-xM@qq52Z)Mc zdaxo%VO%%jxmyMy4}A4z={7ltbG~|$kAERdzAn5) z4x9UR@OLLL-i@N{OAQlRrFIf-1Cqk2zq`H;-X!A^a27D>T){f$>xj^wLjI&YYe5Eq zJs4TM>ib~s-5|u4Hk8Q$%=f&9@b@REMKrjW>cH=d$m6tp9uPT~mG5RZN-7EY6Ov($`+XeU#2d3XDr zPu(Iaj8u_1=tm(IQ`3@dtC00NXfR4XPS<$7~~66l(e-2TzML9r#VgVJFI~haw+Tw9a)Cx zBjGU+_hKahiUSOyHzoQl?Nt#4%5^A14hrQu37=3TW(R0QZa|p@{$Y7S`ql-$%6bc4 zlv12e`B=xtdOn`u;}?9~0h7(=5Cj&U8lHc{z|WzA&!OYw z|M~t%9g_Coe^rCG3Br4wch^%`r>yg~fWljlv>pT1h&XU80Ut0VdQW*zpg+ytbLin3 zIM{!PCsUfdI)CPRBsb#kzmg;!DO zRaAKubG?dMuj2c3VV24&3vU4jgv$t;czkj(KzT8H7m(u8q0771FCW$;St-aD1@Gs{ z$YBsY-h8!A;b1GMgqbK#tTH_M&7DPn*PseDKMfg5ErPi3TE%+21r+tJUJt~KLU=9> zQwp+f{8AQ{6w|W}R$1>Z?(R_7wSu9X4T8BvXlg;zp&)gEn`p;vLJiszd{$F*sR_{}3a;Y@A^0RJI_4PCB8=Nd~>9- zRkYLHG}bAsp2y6tLm6(kDEmpxCu_DUbqrmtcM3(1*<46w=($!_Kt%q`%s+{wQQ!DbWAy+>GiC9|tI|1m#kqbHHMdOm{!K~H9M^H@{i!LO-#Dm%d<3$ zKFBSydX<@RvsPnBTD{q;K``YJj+%o$hoZ1NT`g(_Si-+pO=lv9fW|4->huS4;lc=v z8uqM18!VAljP@U!u~McD2AGyt)~liQ%}5%vM1dwu|+s~2Sv zIQwxK3DR}ZR(MXH#27q*=ILT>z6?>eB=ibYi?$WP?%D^+j{DsudHmoCD&`n+^+ z>&(qvcLMwyTWdEG4jYu)E*?EY2|)2xzI&aQ=FhG#2f;+-@7kd z$ltyybk{;ON(+hXnvqc;RTeBns~OaVGBal ztNNx1G=tTsAeCd6LV1x|*-&HT(4^W=<-&;mL+WIsIKTaE%nOREYZtAw(%z>ZB9>-h z6%tj%?om&9zYSv5ua_k19zm6(l@n`}D&o^hQTWcLIZmr3=T%YSFtEsJF3xBsZ3Hzr zpwwT+7KaRS1#6+;RMA?j0F^(A3T~l)k+>N`jh@X7(2dUT*yKG~y3iIh`6E=K>yz%# zW>lsJcoWhXSD@$&UW>FRVJ|g#_dWz1X}doJgPqQWpaEMG*12n>u-XT_o6||{)^e^Z zIMlK|-eZ2l>p@uyaQ1Nu_*do+ic;=DvxZ(VYcMkOY#Zmv28Uqo6&Dfn<&gcwv-gp>MC@|G-IGDDz*azjy?Nwd~q0`_=w*I-t5 zU>?%Opc=)-E;oDVsx}*cT!}7t2DvnUY13t~s-feBQnosnaaSGG3-?XA_@^wUYR49x zNp3Ve=^uUh>Ws#ULn3fv4er;xuZ7&WEtYQmtTwH-u@ zZx@Co=LMXl5Lz54p5Ef{QPI+@N|CDoR$R z;cp3+Rs+_98YCHci)bvTV`eG^q2i}j@M%D13-^YLKO@buV?=vFIJ+5E1v853ZN>O@ zVoQ-P+$|}cy$QWZd9$7ZT{nBPn}G#StakVp4sJE#=3hyJ$rXVIRWGk7IeaFcMCIMC zT4t=~qn8it2;m`~SCpy5`#pG|U?nUKJXZ6;a?&^-RWX*qpL@BR)Le1bGnr)9lbs#w z_OztBa_yZR&25>^7qd78=6#9fy+4n6iM5Y6*RAc$r0SmPXwNmLvbn71&5e0qURKAy z%aO>4w`aT3$(|=sGQm2vHm4S4{}PbacJAKY*-`s=cYC_Ewz;!2olWIx z7Xd%KR5d&1-Cm#C(Y;IIvbM9UC)2*GEm!-$|A*RTOO`(3dDnt)t^BWmc!n09cRMNQ zBdsIy3`3x~`V*=@jr3_0l}4sfKBDNSoKyu>g}STkW_Z~}Z~O*-BA;>PZDuDvUr z@(rhL1%+!dE@cY`QJpUMV|a_R6nKlqRGaut%v)xdw5~aseLh>a1ydH&cVlO3cRH1Q zU{!tRiyi6CWb2dNPo#2>wLbUUcQ8=}ez1{X487_FhejY;HfPS13GFZ-K)mf5(UdDA zq0%jf3Q9Cc%TF(M3(0hQYm(Bnwk?^h-H}Rl)b8$lA=O%& z>#S|hWot1WwOz@U=aaiqb+t{YRBc->*Y&-J9(wV`7wbAwFXlQsvYk6~buFE{ANola z5e0T;W*7*mqRPUnbGOe^bFn2cOQoD;9n--L*7M^}b!6czs-^K$JSyExlIO!*^|G2TZwKT?nB? zFtEE*_rnL!`@aC+cSG5qQ+yZK!hqkM6su8iKMUOdw=W*>L)UI^PL-ua)=pI_Cd z?3iCS_p~}#*T+9aNUdsq%*RB355)i1qB7UPMxO!V!BOaa7hU*IUyLsJ2ro0>i-h&! z+FVapDn$GL1GN9$=FYC}bTW7SBC|^as!eua-Aege`(k^pO-%q1eA(KW%F!T_Y9P?1 zWM)??7wnX8TK`9M?__;yXA(ZMjj7!`;LdGIB{MB;>(j|y*`Qu%?u3V;wS8xgESq<$ z(vTNgpS0GttF>tD&P?a-S`8FZK9_+Gu}k-4M{6zIC7BEs8p!*eT!!9nc0wI@3J{4tX=6IEaTyj*`4ZWr6Z>;nXB#T?5=I?tnKK` zIdqAtxND%r+B;YzBkrCSrOHy7x>^O6wYswawWFt&x=tM6?D>oB=`?&sXioWz&``E> zcdE9lv%LcdbqGavcIUd`ps&>$GL`vOR^epn=0`+8!Y9~OOOHIf7PT+7!6(%&{nPCf zlh5(Mv_j9tyuWU41L2}PFyQJ|=M>AN;Qwz?G@zelQ-@C&w60C2(>vfL%htAZrqh@R zaHtt9x5vD{xdDxU6y;iZHs)=eaVv&nQ)N5yw=wU>*WJW5y0JCpHO;tRZ}sgmkjYHX4^us^Si~G&AM@6LzcK&1X<%+na!V-(@e`Ce zbm^_lq>`Z`L4c3Pyhk@_k>Z0{49ON!5Ha73a3MMxhYW1v))|7C)?6xIcumY(-qZv9 zcGKk#Nz;*O{Q$4r7~4ZAFf-%zkchjd`nTeSa-nF5z1LTGnBrx zq8vt_3eXVZQBm$N{tR6D^P+A>m7Z4G&FYdv^3%g0w5D`Tez8Meg&m|_>LoW3OZL#` zAd)iSc&Or{nD_OcZB{!(8(LExx%OPo&uf3yES8$xB?n(_iFq4oJv^DpEr0m&_6~?u z?3s6A^JzzW8kLHy3D^(GT4g=dLLPEwzP59xwLpx1b@=!&y@4#_gX)@^Vd&H2w;R~u z8TM`Z)xM0EhJQvC9FSUH#GXvQ@1YuDCJV=}QCzaabyVD!T9goi`X?0qbnFrA;`5-C zoMlph&z7V=!p-4gJ#*>r)-J87E-VPK;^(4P)?|R+FyG7Ax ziV9sKNEMNEi-cuJc#AlnFXHr`!n*c9mT<){+JQ6IaAZdvq3bgKIGi!1i`F{o#K+r` zgcn?Flq62&q5e*>kx)#0{q{_pY;G7wd9tf3txYFxmezLSi2Ckix)yFl**gWK;sxr> zVyK9TACYvku)Edn=WCk%X^cmy2~aBiPlGDAdUP`8w&RiDOU(1Y_kX zGo7;KA>GRTG)MT0NZknDib(n*_U!YCbC9^f*yj`DTUdSmWkv)aMI_xC$P4B}@tP4O`@|zoi+$|i`YUuMohw|KVEBBVX`J6A_KX)uzPJjQg z=Y8%5;}$|UUV#0D+@@4L$A9GgOUZ7$_L#|jJLY{uZd$2BZmtvWF4S$rg&nvMB)Psl zmFBr|zSNk?6rr_?C!LyuQ0L;D5nnm!Xz6(()7jmXZQdN`bsQE7Pk7gb+S4aT>w{Ho zmGT^cTaj=POAw1Mw-MDgleXD*pG*Un@^H6n@Ej-A1$GU-s!sHnQh zDu~}~Y#XLJvME4V81w!zM2@E9PUN)P{udGc?ub6j!X+&@A3O8W#06PJbgXD^4RtB9 zH+XY~FMiFiH}^y|d`DOJj&ysrEfsFxp_7i_z6F`oPrKVQsYXTKH7&d~j2pVmPc6io zzUHDDd4EZ7AwSJ`a~trQPa1Ef%#TXsAwG3#@*B8nDPpW1$EI`SU`29HwtM$(9D8;h zkJmxJVN#rrpH!yZuG1@x7S$a3mpr0P5lXF(}6eR^cU6ys-(@+nVgi z$&f8yG0g${BGTp-&eI&^M`GU6Xl7EEL*(H{%J4l-PRxgK$LJp)or8MD#!AY? zA2fG9pXw0utl>F25J#rj3dqH!F>i4+QFWy?JF&`WN~L#_o-3An-m;kYVA&dvr*O_L zWvkqcXR;}BUYU$3UR8+)D zG?5)jeA#IVt(Y5mud_ARZd9lt=B=FqE=}|%lf$HCoM z^qkby!&56)F>dJC*~t$*;Jq2BY`v_aM$^@quU6|b!EdVlxK-}6p|102^K%*Syn_=` zyzYEUcZYas@Jmx|=J)+9!gVCdPj6e;+?{Q^VeqeqQ^Zfj4;$c0LyBaY=DpFP!)Q8)XymaMue=6$EA>Ec>oUk$>xi*@fhT;e~q%1v_lmx%TC zotX`-77B<_AM?IHT_`~y_>|5~V9+09vnz!6CVb!rcO0eHCbKEBMKZ1D<@(MvzTE&0 z#Yce5RBi6`7xz;nLS%s1xZ{eO(%@lBX)*D@s^$!@sACd29v-xaAt_PynPmET%UkWK ztRI23G4HWZ*GfP^>z(Ots`sXDY`&&&_argFh(ru)2^bsjW-hK$G<30uz&|o|M1nvp zj2q#k5W zK$Bm0%+>zxO_8EEm07Q+aq;&?4i+dIB@vcGo;?=xz8lRV;Y#>?PnK4O9iQc8M>kk~ zEiX3+)-E31B{A=T61X_K+%^w0V|o>g0GwVeW4o@zJ)PG??it)W-PtXsbh~^v3<^+& zba~9vN6xg+vELjs_BITfEjT&^Ngxs=;M*)chfHlF!8&kQE+F+WiOcYXCabBjTHHXF8Bzz!`#+ z^A-C1r{9KL3jTaL=KW{}ScX6bF$MEJ6Z5vr46HUV&9To^#!_GzIJ+_CJuw5g>pHTy z=o~C8D;!SeWspJ51mBaV;WEZ|M*|Dn| zt3(`vX>Av`o8Sblk1r+JEri~!~7Jk$d9zOL!hGa+kPH0(m zW{z2MeopLg(hPEwAJi5|yiR!yjx#whAq#P8Ajia@E5R4j^Xi`F3mmCg@M{_3Gk==<84n@NN zlQ%0Q)!AY@#tx@Om| z3>K-ml-b+pRJvyS(g#*;#1}B0Ozm-=0!Y;0qyzv6%a-m8KN#AhBnFhLJ={R4OsY}N zksq`fxy&9#33dF77?qPaR*r%q_JiO)dO#-_iAPxiGiD~$K>wi4Ub;1FIMNgjk+leh zn(R;zyI^UwCcET(ir;fvLd-k3avaW21dh7ZAZibV%s@sU0RS+#kU&oYRbXyX4*Kh0 zq6JrICF)obErc!n>~aV0dxlu8<%elnWS6A2 zvm@Q3ZhBUx20lh2SN7xLLVZVb5i@_v1oE%2J9f73>W0b5>!_RbH;cu-G7)kxrL!of zN3dd>c5Q2FJ^~T(DR=D)3w}0k*s5Rm_)|~ZcoNC!FqyeN!%6K-W$L!zGg3L9Ma6vy z*(wn?fH-NNgoUl;+h;*ur;Q`gRp0NnlFPS9Ux&LxeJgeUl4~lEps+tN)zRo?~qwQ7;4Vpj>PnI6p(xh6C@2ja5v6I--n4E5X zZ9g`W<^Fn?{jiAhqCmB*!%Ko#2Eg^>imy#~a^+6GS_;LbQ-SGIg>1#OsbZ;w_`F z+$>d`i^SDdp_C?oLEo%=VbHfc4}Tp?l5#c(pQTwRa-Jo|W=pBrL z_k~S!E9GKBnCl=y#8`3@$L$MCXNS1k`EnH3lf%wch`k`uOSsz|)Egag2Z)NWY)GZ$ zz%C?H6MS1~c*4!>=E*KA-yosfiMA<05kX_?qtDKbUar1A^OI`TWDJ6#kH*=}Q-Wi= z6@mmM6eX~Avs_;KXyZplB=(e4aT$ui$%XZ_nQK*L-w2&h%(cP@toPvMmqYOHCl8wL!DGIL#d+KrmTToPU*qhQ|5s9rf4 z5oIc9?olYv)h5OU(Qu~1!;tl5CZVc}fwh++pd%V?aPAm4T$z~|39Q8UOv4FOfW+f*UWDg^D25 zz%-c(7_Q(6+BdYG_rsXC-fXRirKdVo0uuuwyMf0^@PTo)Ce$qJ`uC?1a+^I)#PE;; z4jj>ZXV5pftqHGfU*pXF)1cL@UQS8(-y+i=Et#Cmhm(yb_?4v9+M)>pV-sv@b)!IN z&CgeT)SiduJr(mdD}h}Kj9o%liQ_v+M&+!Uw;L%DJD9iF@Q;=ar!cfM&^FcM63C`h z<^|j@P~X{t>ux%7+~}|l@2CRi?Az1JwApii%v)&OKl2ZB)S2tha}#Fwxbeo@D@RN$rAgQDTQncMcpZ6ZfK~1)@iv zXL+~aWMS~|S7>Z}ix-2#dRe#jxP`*g%cTdjlAd0!4cZWx=|_EQSJQAqF4wh|r{L{A zo!YUHG_FwW!gEGWEw`y-Da97C1E1-UyCu0QXu`E)wwdDP!1VhmHQZ^9K+|e7O^9pT zTq;L`+-bDP3P|L+iKbj8m2`WKOPBM^hR^BYC#-2pR|TVW;q`7u(xod{*&SDmY!^D| z2kLSyhcCwB8rY&%a~p8MrIt8auG%FV@mRE5szo-aPU;F{$W(I8V!?imx{7(C>SEFE za~Kp;X$>yj#k|#Djg00EEa2Vw>j>OSz*y5Fcb@_`eVoH>rBb^$$GlC}W>6x59Z-W; z0wfyW-Ic?xOeD}Rz~aT7pR{yDU{6np{syKfhSKehPpNvj5dg6wMxY!r$Wz3ZLXjh2 z_FokpxP=7#Jv$bln@C!m) zDGrYIIgl-4k?=~Rl#F@XLPArW<0PZ4O?D-B$O`}l2Se_r?yjy*FyMwPEW>2@$h7=Kb(GT4+iovD0h;LUp*4E0&5=K^YVkW61Ri)})0?1rni?rVLmU zDgY94BVvS%eH$hz@C(pTxDWC#Lg17Ep$9-JV+KT+sHG~e+hf+>n8q`z2a{yV{VmOr zPBOYQ=fZ)X)#4Jr=i$>Tm#nno;>KMj_+(~lO zQ`%60+?>p0gF6_aKY@iig*hI1Y=Sx%(Yk;E4 zY9xYHG5B>c@BWZ<4OUh4L?J?BM9k}8aies&V~NilNWEwwRJz^Ysa-?ttH^1>k*T`B($fOm4JiZ zPYcfS(s2GJ<~<#vot!(1GDBq)GyylXX34bvGivT_V_`+l+aB}&W+t%BK$mX-Qr&l& z#ISlvn#zTD99c!-?aZ0-zs#UQ*RjIi?XW`NrA8K8#ARuZ*R@Jgc=;;~!NB9(YOB#BrR zL`n0f%V>rAVt;?MG%N=s0uN*FnAxy7-HjW~N;67?tr`YV4ugp5VS!bydW3q>+HX2g zBK)@+N>JvN!=yBf;OqV6EQTq=D8m;K{;Dm>7pLBj2$t|~78$lEM~VmyN5dnNTeG7( zYj4UZ2f@v)2z2!JBfcOT=_|dO1B${sp508uk+U-cc~tmU_ERv-5P`QGh;)a4c~HfxBnwmS1^Ix1_ED z6{9XQfmbBLq@5<AQjkZ1rP%p(KXb zZP-ke-fDkKw-EH?T_;g|LmXV`^FpWAnD^Xu5JgXn_30$;@zURIlIdXwmESXX+TJBJ z1Jab9Fi}n?QFy){`)$M0kVIsaoPTAE%@VVO`k87D^?E#NwH&e*; zCREoXhk63aL|DDW%eN99HB3==<&Et|RCTwX2jWe;4wy2+Z6DPRIKj9_Ir5-Y#9CeR zN{RX=*_uGW`1*mM3lS4rV-j8=7Wwx;=m-KttSwDVZq1MYsJMb(Rh3&J>q$V%w2 zSX2>9V*k`KJf&GJL{$QUiE`aApiU#GKRrCSx{H`^{`Fv}GwQ}X_JKA`#4#T;-a^1PRiJ3z~m9f8m05kZfGKgy$$D z46ms|jzE=5wuog9`ejC3Az{zW7UkGc$IOm!(ifGtkkkh+Zl!gCdJStm{W<8RUC}G%V3ELtb@Yd>Qy<#&t0| z5q49FcI$C2qrIcWa*OmILlSYUL&*ns%w1jn;lJ}k3*rblUR-xgHheM~-0eho#712d zjHXoT`Q#4x>VhY`jcSdcq1GgJnu%S`GnG1n1Q3xF(Tl0njTSx1>dn@1k$}r!+FLLM zaeZbMCj#g-rUF{Ese|w{kL>_EFL`dsW37IAILed^MTiE|EGBXX-pj%rPV&wz!%nDx z*CLLHL{$x(BwhwSD~Zczn^9l9QDo59cV~jlaqkXZl>nhl*ik_4Zj9Jto&u1yN!&i; zRvh%2MC{~G0nqxSf9=EjwS|Te`<+t&X1L3B(aeazOLoftIt6%~AF{TV-Lb$cy@@3rOErL$MRtglal&%R+zuYFCiA{WC21mXv zJk0zEOCyMo1)%DxObY=zB*G_L76MmhYvtZ(zV92j4i|QdBWc7=QxL9vsJTU6lTy}z z9Pz8~+yse^YXMc^M%?V4gIcy2Ln=jhxq^_jF=ti*91FV)CTNXT_eHyZg2>hPuz{FFRfD*G~G!b6n4$GCkK^t{XoDV)9nvQ9YO_+Uq&mJ z>W?|o>c$>Uim491k1iYAJJgG<+GpnAfzA;=?Q4yerhIcxmyg_BZcLX_U?S!7a2SE! z5i93wVWgmt=nfKSK7+pbeJ~alFXb#_U6dL>{lZGB)!pFfKw_d?Q}RTxcm`LAzSx<0 zp4ZJdUSAGLI9;-B$ZE$J*Dnq)$gt@`!Z5mze>g~363>8WMs}qlzId|&$jyLg_S%LZ z(H_RAMr=J@i`VMu;_vL@Yx{1i!uI;%83;ftn;jHPrWuR^CxE(x$U&NlhAZYXC6LXX zw+mxme1 zwUnbu`|FtZRLD0vH8cTI50QGY*!4(!PhhzSkMq<)^W9ws(xD6{EKk{>XI;KQb}iDD z*M!(Xo8k~b;QdYUp?%Zmjh*9_D$@3e;4*X3GMYz-DYB4cq>J$fo{_>_Tcqj5@VF=ZTjgBdR z;Y^kdV|d%mN3ztMc1(jQ5+Nz31KeJBv^Je=_n8UwQb(xdDS+l@qT2C|r@u=n^ewhD z`y$w}2&8W}#edjKxF+fZBj#Yl0%}@dopuhKI01RD3*iz+0He33rjD?WK<+Sq(@Mxo|6W0P0 zHdTb?zBWuXgg(kqK+Xue03#@nnYoP)~#uwV{fXRP@X6XZ)uHyJkV#Fy4PQtZFo*mUOyFj?(qH!&M#h{5$#OUJxj*yPFK z1(D93Ir%sSzJrw!i$;AFOMgm}{&n61&SBuia1ZD^_TVC^$EW16fr;+~KZB3j<3h>p z%S83LTlhq9+?4)Jfi~is3y}by+WTqU4`Ae?H~8SH4RN^;(YKj%&lK>xRpj%^IX7!$ z+zJai+w zBv$P77#pt61gvQqmXbwA*qc2^?W6sKIi!jn6wkgU& z1KSHUn8M+kwgXK6sjy;1*CXG?)Hmrq)}p!%y(G8T0>OvF=J=5W^>MZ8`m+p1dV`ZrOHUkJ-kVcv*uFJMFH^F;3uE^fJp8Kcf& z2Y2(c>Z)VkH8|k``L0=XMOT#f2yWcq2>#ia*P+Zji}iFa2MPCJDGtr*)v@ssxJx!~ zEN=<=;)V>pqbXlzFLT*M80Tfno`c^}R`f+U(a+B)q#SZ(unu zL9u#L%pKGwk#8mjw98LpUix}l=DRn3Rp!*5(ic`)h9qCI_*QLtVchHL&^0AjK+0+? zDsS7mwfOnerFq0FsNwg$!m>b#uc9}|0xTJttk1=~zYcMzK9Ewkp(El=gHki&aeUpT z!}rdRX|pBf{q6O^C;vmhNdw?`-^o1FMyN}-qMtf%PM^fivuicAZ@*A$E_ES-Ig}x1 zh_U6iHr?4_KQ|mK5;$w3gcA+`JaTh36{k;>Kb9I5v#M{K760mOvl92z$N&AKz*HxeTP z{EhcsHKD#Lf%#h?b+&R=y!S(!;W2s=AZ{~By&nTFslVMOeWF2EvGm1?Sv3{2ZbR_p zt&G3TuDvV`{0faC8t-Gl{;x3i3LjVb_=t~B`1qKQ%S3)Z5ueM4bb(arzZ1EA|DB-) z29q`uXf}auCa~26T1{ZHLA$S#NcDd;mguh}Oh%<+{a-Pm-YYirkqPzvcLS->B=ufK zNXDvnfT3PcvVQ@4agKO?gV5jQwBK~q3{rE*i4G16aTLI8j6|-hl%$f~Qz5gFU_dg}A z5Nclopt5>D$E9yGoBIPF|CNa^pJf?=#lXIG01Adl^bf>pG>+AYzO-%_xB%e%ifYUp zLA-CTG%+ElBzpf5aQAf^QoIaaN%S3&$@P1|YMt#nS|k~y=-G;zd7kcVyzhfV|7xi+ zz}g?8hx>lc&?hXx&cD(OG?3hXKa=mo1bq~NevfElaD^Fv%#_u5^a4t}e=*zX{S^j& zi9ya6TA@i$UCmmpcd2%&?@SDQC5A`*w#2}lH8p=8O8#o4BujH?Rusx^XJ{oKt9;|9 zSgn@HbBN}?Kg4P*O525mASyxio?)S!^yOEoFI{ofvJfA1yQii`lL9G1ibP)*D-1jp zV-I>S;L-OIL+_&zHEYhH07INTG8y_O?C|zan8bbaQA-~EXA$bZYRbg>F75Dus20)qxTURIgB~eD@JvR0ZLB7w&2Q1ADL1o~l z$Q|hBqX(pl_g?`+%aHw2&7OU8m^aDCFHn8o5n zG3}o$nDb0q!^b*i{MU+Ex3itAi1hwvCWGzc{SPygH9tTCV zaL}q{Kz=FAJ$Mli2H!^hP!5m&pG)4aB`-f8DFc`B7$K;G1?COhu9~OT9z+Kd2ay-= z6^c@U4^ib%r^oXP{)~8`K^^y)GZ2d71Lzotn8=F~ zK!b@qiI@jXQ5BC-%g_=X0PPiF^GfvmDt1qGLbVMb3Wxac$0BhyR>TM21@Y0iL53~o zVWbQacD_|6UlJ2)*y1G3jGbmS2dD4ntilPEf7XNq?feGhZ z(6ji+6*HNKPbNkhg~yW>=n^8VLQ0R#Ck`^dSTQk1&8*tnZ$rZt&!IgebRSSwg$hSd zXZRyL3LmjJhb8|G)2`r=-;RfLb?js2lD?;ckCkr~XsdlG{i znIeRyF+N0l`Ny;g`l;z9cc_bfB1;c#Ciq@H288&;jzc&!VEZt1#^0l%OM%#V)svz3 zILR?;iU>nzP2im5Cx*{k+DRd{rG&+6ZK}l3heU$t44>lz^iiBTWXE{;JkcgY4t;1t zm+xen9$Ai!;t)MaFx8|6O|BThw(_x!k3)QH<%8WHUaY4;Vt8c*Sp(QXCZKXRMc5s) z?tumHBgimPa`@O+bR1duCuuV0w$ITSRVa0mh99UbH6?*qk-rJ5DluGO!<_TO1uZ?R zOoO3#VV*(>lU|VxXjSVnNE0OAA&FhC=n2Tjtol)Op-hm=b%x_icBMKBW+Z=OO!{!18QoF6l_TJHgiWNOxoy&#DMZSF?f`T zegAAKi|RXM(i9kSvr;{hD_|rfpcxwdkYm&T8?A}40Lza6v-}_U_z!rfdA$^&kpZTS zparp8N9@cQwKm9T^Ope)W_fjDG+jen5U!~a3J!d=vZkh{iiy(WHcQJLQdF!%{Tyb2BvYu~lee zY!%xe;$xy|CA7_^wc5~D8(K|E1LlM<9uP+pZT_U{MB#j5%)w|gHAgR*&{%^FZ6{)t zCaPtm*eakuS0iJ>p@P>bMkn|vSi)(&44pp8`8B3w7yuw>ppG4}A;o&^?lF`e6vYOm zDjFzJAn)wIEQK-g3K)dMOErvAiwI|p`D}yB6h7Jt0soI(7D)lFukmG=ibD;eTc{8T ztT11|f-ee3%!nvGO(#ua{}O}o{zW#l7~{3Sk!b%DAO8i9q17C8EV|)eQhIGaS#R)P z1Ulx);6J0%;J?b`|E*}Vra+X>jNc31R-_N4_-cFNeO8 zc;hrn4I51hO}rmujPEBu_Hi=qXMrJ(>3&gEoMhE%bqDp-cMk{jrCKeyAhaAI>kW zBoN^a`f^6+voW7Zset;%kfU^-b+}3)BY}J*a-5!Ra^ZaEhPfjm2q&2DY`8HJ0$f&K#f?J%FJ|99Y2zI3-cY z5y`%Lq#tTRp&u{3ZAtmIlVBKzw^mt%N5t+SEqi|tx8@(1K^X_6r3`Ga-rsX15A@_d#9~kB%4R$#|b$?*Mws&B^4UUsH54^)d=lD2}$I$H> z<@h)lD?Se1K!|f~D5*>=VUn-1rqUg3yw{*{U@t?|f#drn1iFszW#Jqi24a)m)+Jcp1_v@mQ#`+;Wx0~jyt*A|xWMq$3pM6OndRDsQ1N>Cz#5p@39L_TSn%qPVRko07= z5$F=&gls@dOVE;N+?SWoNM_NoHed!sMnwcLW%LsM(GiG<$wLGnl(MEOUQLu&B2dpj zJqLjDXeh^KIpIjEeG8c>Yjncxe>d2*icl2OGX8RxjQw|&jXkeo-fisN%X`IPN=*$w z@%~>6ZRkUlUN)*FNdJFBbN#>LT*;UHkuAqW@oz^)hGw%NGrW_x)J(0XwsAO@-95%PFDNp4gY!aq%|qyF*a_NKjv( zP`7xC0m2Rt{uKki_a9limnyQCDrw&uJYEq?O9=R5JHUN+S{~?sR{WsxR~E@A(6=m0 z3k;ZTj$l@pR{HLg6%rxRrOkouyVGR$Z|CHG1(G@b3N0v^O|MY2z0&2%xW>09`mtz| zaX|=mSaOdpStFPwUJ;W=dN4uR`-+$ih{KC2RD9(aXfLZRVy{rzH=p!Do{a1C3O5q0j)<}sym_hsI6O&iol`&wYvj*3Fl`2yv8G=GPP(t}gshIYy z5{>z@VS70Cakr4aZ1T5tD!MTX`^^zl%QX(}D&gF0) z+-z_f*pnF8OX%Wu-p%`r2O!E417zR4 zY;lnq`Ikwc{*5uU1#_@V$fCyz%;+(AFej;8mZKq|>^vpK=f#Bm4(^cxn);T-#3Pb_ zlO3Y|is%0cLKV6yKJ-gG4nhDY4nhrENi%4Pr$#UEa3cH=CbeN>QqRjiC!N(LQ;cirUnbc(}TJk zNn~(*Mo!`})`rJHD+tE6l5e3A68VKhqLwwCZ;Ki`FD4d6Ar{@Ne1RPlTV(hn87~Mq zT?aYwfu&qZk;4vtz=te}$R(rOuuw7G5SR49j~GQ>wHT!bKQ;_Bcp8fVL&w3>N(=zR z;AtVUowX<@9;<_&n8Nv!HZy+`#*%@UZ${&$(C~RHe}>Q7kr_LsR1_vpzF81s@0(4f z{7Diq-;Bqh`A8&LVeg-2y!Kwz4`Ct-tk94}`1p;cO`Vb!U; zAxIYtFl=;(Q;KUYF*8m_!7P@>Zpw^(YzK1qJew-rrG}Z1gG{P@Of{*oAIlrzfBZAaC4y@vpN=nC38L}4QWPDO`} z+#5ThlE;pj5gI#2y^%k}S_OuVF=Vrc_SpUpZMI`94rP{`;Nzqr;@Bx45%UX0ZD6Re zm5>-)Z5v!&5n=(`LjIB+*8CzvY|>g7T9Jsn1G#8ziLqAQqc%e*(LSeu*wC*@1*)n% z*S~HK# zpsjO(>gR0rb8N*<;5>`TkSL67F@lwKVg91wh6^S@U}~huAcyA|ij1vJh~!p4F_f~R z%?n;OCY7nY^Ry`P`w2^;v@H%VG`wAKf@AQcVRMi{Sk$rk1z)ggJ_$y7xbHCB?ut38 zKx3q@K}8OhhUmz@!@i0OU-r2WG9uMvmGAv0)CEP)zKD!*aTUTm?^zQ`Mu~%3zCXf6Ub7$g8>>`Ed%RLZwM7&}7E=DIt7# zvrXS_##L!5g0(v9@ODGxe47&!ZB>?;c|eC#?^#NiyXr7ov5CMGg~B*q#*UBM+y?}v=8%c_n@v!W8(Qg`t-F^y{CRX#=zvC&tX?K11ttuDAt zf@nW6nAS_%SGOa;i6<)0?mfe?GLHwmFi+=snm2HWgVIq}!ud(|0uoYUeMGDlpyQ*OW20Y=@3y^Lsx(~ zm6JO{pbidDpvx(k*N)gBx-8^AWXIz&;lsirh7-bz3Ml|%YZ?K>WNc2k0a3mpNjIThgmd{d$&rpN|jp z@=r^(cg!!LDN_Sedbq$*J>p?hwVQdK2bd^xgffkoR8<54*~1XF8}9&&Eh7eucE${! z^lM#hpbT3~{Hu1AskH2!iQzf)SQ|>Hn2pk`s&+b8qToQBgkab9Q~d~4;`x6deOM1d zOLzYyM~&vXt#PE*3_gyi*=~?Gc6J^;&j4GT?&4ww3*Mh_RUFy7x%Iz#VC@B5GtswVw)5)b(-_k6bLIMgsnY%4`mo z*^Hwd96)KuPRJ3rMjg>5j#x#Hh75+%1TmbjDGe|lLXEDd2qiRxQC}hCdYh2m!DD1E z9`4MCI{HUlD0bG7(}o=RXIXEQtLM?vd{EVoP(>V}a62N}l1|MdA6Wd(fCsc1PK=xp zo~rh*9gvN5{Nt>ravC`k&W5e7kYo0!aMWd81{mI%7^&2IJBIySO2tCW(=G|+s~~t> zrF?RQEfmf{xj8HxPRB-4y{%NL1nSLYHEKqkP2Bqj>cAscZK*@9)Fs(05M~tP3$4NvPu?FngU8VY zRFPu+B|&akjM*44UWjfo!%@eiAkk6>C4LNG`3+icA6;HXd?k%)>W}&lT*?% zfNhD<0n0ELk;G^-vhj>cB$&}{e6&(&i{ghSMrmOjRhQY#ws!-D*m68hyg;J^#75jO zKtXA-8f%b2z$p}x)|mn2lRHLgg{*B!H7lK4s{ zuEJxK%H#EVL(u%QMt@Oi2pXjS>y2g&OPSB{6_UO#{Q9~xC0=)?#Ov0Sc)cyC60sx? zCsbRjh_;s2=~$$j&1i9S*<>v04LV~yk^ywalsRv$TExe?OsD>T#@+_R%InWrUd(e6u)Lm^JiL+DfCnsCP_Uq2z<>n<33$Lj4kR#p&+M5!pYHU; z=Om3uoMOR34&*=rDOj*z!GeJZ2^dJgf`tSu7)T)n54^ws|61$bdrbSBCmHv>zSp&` zb$zXCt$W=w!?q-JIG@x!E4}=s)5gimW%-HH@|c;(j03^kPDGewgE0Mz*`8g?2CLV# zOUuGo$$Lx7Wot{vd%=^v;69^RR>{&nRlSq}Svrvm0r-iON^rf=!Orfms=ce9_w@6A z*}y3`Eqmb?lAgb~s?ozE9A#DXdM3;z*XtSd@>_S(?v@u%zqnntxxExQOWP@=CM2$1 zY{}<xl!EXm#-ExWW>gmZE0#5HPL#a%=JsB& zk=gFeU8?lBes=fkg09XZmTH4HwN&Cs{p?GcXL0rvT*sQr`CQJFmt|QTvV4`FH$PYCntnc3 zv}fLQujdg2bl%o}^NyMkwk5!`>c{Clt`_nZ1gA=KzhxRHI}-%m*Hl)!d>+M$%$%(G zi|%VBk;p%45Q$W z&g}_%6=AyjyfT-+yONfH!AUW_9;P+}eO(nk-)|x> zUBBN%E>n8OcA10$lVR`8$?LfbVb^ZsmF+1h(EKsIM*lZ+Z6i(c)uD(%r>*U1I{mSh41nYFIg~o-~y!oy1P4 zRAW&&D_v#3o*P-1WgDnhOul$SzFI=Q`eYu159@ZPsc$i`x;X`017zafaVS@tTU1>x<=GFg?}1$XPZ* zWc;|7vrmxu-^I}%v$4EGgXIiHn8cNgN3 zlk7QD3~^n>$N8D}dl72UI{KYm_qj5avvMhf=gOtr#L6Yes4vpJNmDDv%)Z#r(3{b9 zPW);GAbDp3dS_oA@;mYfD&2wNo#Uaa-zjm@UdsfYG_bYFJ9hZNzG<2G&bt|i_BlA3 zHj8&IhyGXN?FFZ3XHI)EX_sc+3K!VQ1FUQhv20BcoBBjntEc!mD~tzKXpF1N`td;D zQ|O9*#Fc0FsXALuK4W{9*ZdSvMITzduqBZ<$F+TiQzg84l~?ROsD4&L?yL_nvVkOs zIij90wc3S}wVj)iGhBWn;Oz4zj6cK)>*B1)@WO62_IfUNRwQy^e}5wvN_1b4Jil-# zmtD=r5EgHx-n)9Gk@1CyT)eH~XL6FXN5?MbJQ}+QFU%S!X+G^KxVDP+9F2=Vm#K4BQ*idGYJcLQxbou+{c4<<8}m3@}y@2wYzVfFgpA4`sf)tUz@TKACqPz`5lI0P4eA` zy;n0sYUM`DtGrg(!^v4UBGylt8r92gGiE%u=@OvShxaX4`oKYb(QR%wVtMeZ-{#QS zDFOWC{bGM@kCON4$DxCNTiUPfxlh_h=_6TwukDfZEbyHdNVU{tsnfB8=*QOo+DmyI z-HlfpNX8;k1K?u4?YDM8(D`*1Stnt@tEIJz`~(g^PSb83yJmqYeIGA7NW7mtpbEEA zuYvFG1ZS`BPw7tNG4b|8FPKDHzbWm*0Nn{BZh(#ZCRyIyORBhbuUxPFveF9<=cU^( zO9kD%62keHSzxdiUpm0LcT#4&j3HtZKh4iFpkHoJ0yEjlygqP$g5GVAq1^Ct^5?tV zyR-!OaYi~}|4Y%wYp3}+Cqg*4pPzphg5Nl)A7#98hPH|~Uq*-#Tb5N@yeT(CNI|bi zetBq}VS70Y+hTHZc6H0tu<94nf8mc-xFzbp z{AdouV?#VfBJV3hRj1d1qHbUX!9Z=YF)}qYP;ZVAny74`bqI)eb>dgoWmJYxLyy&W zRBKa1_%rs52bmt&z*y(c`1hsFQ^OGMOGTsDQ+t3gwNZADI6fjkfpoGqrp}vBr~1G} zq&6aa$d6XrI;9i$2*U%ZI-PA0jHwJQ?jB{Jk-NL9*3{=X14tE%rQACafx;Cyrwwep0RlVV7%?7|isIK-CRRazpsiZ-qO$oZgxs!mU_}@KB`b>O4j( zdT|4_Hhpz-MG!`KLuH^=KMV%>tski$->7)=T$M@WQ9lBpIL-JOQclrqDqPjiM*VEk z&xn3Tqvjh5Z`RM2YGt^#h5N(?M=Bd?V>N}8KBn|B#Y8D%HKqAygF?g6%v*-**hYbI zY{-!vj&Ma9r7#9Jk;Q{N=4GhL0BS>A#iceHD%q%?(jXep9$d$?FQ6-H9c=^93L3iS*caW z2L^fUtZW`17;=Czqmd|(Mj}Y!=E{&7(3_Eh+2JVb{;4}gS#?X0j06`R^Z+JT04Kl* zPWV;*$`ID3gMqv+gqfoGMg5eAwF{3&YuDc2wnHC~AtucR70 z2S=f2u6Ls6D`Qi`JlCpL&l_@#?) zBK;c)$f{CaJ&ODqQk0)c{kY2>SMaEVM-@Ee;GrtgLCc-$2*o4hMn9nmGiUSF08pGr7;+&R9?VIDwb7JRZ@#rT)hB4-;}^jWBYa}yhx^K&>yW&P{j26%wi4lOrc`$=E|_bV7A!n z5|_&o4y6*8qXYmz!Es}r0BCJDN?O|;*%py)jzAC0X)DAU%0Q7iIb8dv2oFW3zjb8# zTSx9hfDHmBd5&&99x$oq$A6x!x%Sk2rWl!IKX1OX=Y# zJ-nepYmy24!d;9$g@jEm?Q8fs{hmf5>W8u$Bt!Yt-4X~n$$asTQ=6#$-gwb`bv$P7 zczPa9&qML7j@KTIvJ_1v<8d?|hy18oixkt%Mvo0|M6d}kHv+cLnQ^+EC1G6CI~xki z34x$tk(yQH^lZ$Y)Fom`$x6XNiauKLiKcSyG^$UIpAxoxdSjKvzS5({F3#U}YYJ-UH!3Z{( z2Z_b!s*o#u2(~2KnOb$hqgv4~ePUciV0@6YqPeSR{dfbJJ8D~Ge=*8NgWE;HcfI+B z=%T^X^|)aNp-2z|j=?xM-l$cEd0)MZ%Ak@2P(Ow>5rV5SP(`2(4JIij`Nbj$tie~~AtK;(^&j@NgL0~nZ5*(%W*!Wrd32S-$TqOwurtsf2{ zw1dL+BbbJfh#@aYUS(}D?35k#BS7T_w02MnU=eV~L5i@0xSRgV79Nmd+%+4KbS13G z$;4KMv{Kv(eYu=`3F1*AadG_zZohD-S;1JcW=U@F#wA;zv2~yDcgA3tg*_ zBfsyDe5Ocl9b6z8Yvb6QGmoYPlK2=!fX>t|Q)GJGkQU)VM%1wIq{gR_@#*~;Gfz8X=IJtn zE0NR(85NrPZU#*$V_HpZw&Vi#V&=yt|K1!5v61vA+!jR2KTqh_#Y|nQ1&xQGsU<<9 zH4%)A(3Wcj-ZP_EG=`{l(22e-IT9T-8ilM8^PfVS%_}+})O^0=N=4|T!3{Csu)%5? z>O-d?g1F0<5MB~Ag@a&tGNiLFUM6!3%F=p9N~ktIAVSt&c$2F)P@a+JsAt3Yp@0N) z4r_vuF^!tkDgni7gXmXze00AvfMMC8b1LYZck7~@uQk`2)e-(o;9olt5`p`vcYy&R zqZ{~3s5SEBGi9knlibK;m2 z(=WCt#wZjs(AbV>l(3#`u<$QtRun2`7FZA=!->O5{N@y6HoN?*P1;j)yWMQ zZ=k3)&j0IpluK32%83D++r%I6nFNof=2PO}r~wW{Gb|O0);6hbA~q>(pTV4AoH@zZ zCMls9%1$B80Ct=j^kndKKR39H#r-zbG}gs7fseVuHQert>sv^GSGElfvbchh@E10D z+<8~uFb7cUiZAQ${)U{+@&=yRCk}u;!=(EU?^kLSKMd+wWEzpMW z6%1FgB*+meWPgAP?2ef=m6`kAzD%NHhaw&yNqof zGIs4S92^q$)PP8wOS;YXL<`bJ^_ic75zX4ni;PM3l!mD3OjJ>$1wipy2C>sM zQVQ^g++zs0Brn2Wz@*U?NVKtg+hTej1;=bkq!=P^6L9Z!_UkeQ(fE)K&Ul8Cbz^UL?#D*3at;alD zt;ZNdeda6TBNX7l64B_?JPczM5{H6|y`pseGTrts>e_yYft3OlqCgOXwFj{`bC_=B zzQE^6gGDnLn9sV2efpiAbx+|o@#1&-9&H6z855@ zG)yP8D&rVaGb<^gB3mK>S1*wVOqOXslbc7WsM5-+ug@a6=bc~!12)rOTkLHxhR?{`z5I5O=9k z#`LpMKco5?*3TCGa0Bbqz$X2S=w~xnOCFe}s36T;)9c;Vu^0uuA86*uh&<`YQxSQ} zk*SDGIkF`pTgrB)@AlfAzAOBhQ1BP!-t0OG>iMRx>^Ghe@k>mILT-Hea~`}Zdm_5h zg9!fQSmmBTiYU%C`BD6eC(Rr-Dr2f*o*0|jD96CQ1}@xUFT{f!dM_xR(Vh_}bHs|I z);@^|haa5UluD6GA4Q8r{0Ss}=$97ToQ7a z09NAoAke7=ylE0X@6|+ugY^^j6MAawV{l#TS+a`OBjbaLX*-nI{_(U^LUe;Gwkcy@#l)}eOt_l4V3da_TIL>5y{$1iDWlejFey|0S;2w5^xzbx zptQ%&PerLnXUc_ipc^a_>fDAJ9Y+jq5U-J~b|rkH@Cjpp4A74&AZiFPFf8Px!m7ob zrP@_exR-8lA}~k{ApcpoBQ>Fw6HKDveGO&?G=EM*$JLN2rKd5 z)kqV~X^xcO`F5-8@=#@X9id$yy)mBji~4?v(F%<95P4{B7d8MHDyd%h8>ggQ1g-_j z!^-%ab_ub@`<6e4n%Ga(G$KfiCK9aMV&p~Z1qjKls_ilrzg;ht=?d^tYIRagCXjl? za^;!d2i*j?W$KTM)`7C40^9+a!C^%GeM7aa{bfPyL*q>&whJCaRD(Le*9j|u)+q~~ z*7NZ=E$uP$YmnioUl`siN@h&5HV2LBn(}tmfEm8YqV-pn#zC0$Kfdzlg=1E1jl(#t3*(Yd5wh;9*;sP|s|icD)`g;VvnPIA*Lr&L zf|EmM60XpM7S*i_eT!;7E|c}@%tWvJjJE9Q*_hx?MGfcz3}Sb(0!8bp?BUi0fusis znR>`VNswSWO{G(y#rCQjN)5N})uizgRCFg(&>E$6O`T&ax30)+AdPv@XLN7d!;l%?)1mtjE`dV%BpQDnZQAz~z85MO@yd{N*Sg zVS|4;ru(uR7le2owByZMuyw%*Z>b0o)Q2UMTqZ$^f>MkLN<*lAUJG7)mno8w`$@7k z3CTnZXHDx%(Z0KYqr_!Sk-ku;_tImSF2E+-2l6HGdv2Ydola$zr^Fkc>HTr`zB&upcb>uh_!hD={M?4U#6m$ z(cSXM8KXgH#fr? z0lq9|R}>0}NC0883-#G^prT61voXsaYK4eJZR;E9xEXNd^@F~nMG$$w2)0(Dowa!U z%8!}Yt2X?@q!hgQ=*NUN^_aMr-g_CH3gp?m7t?#MoZfpez4tV|feRVRC=WJQW}g^W zW0K?SQq-6_Z5x5rltR$Ftj!2@OCR!eZ@>vl9-I$C+CIsQ6hPx zJha7Ug>;w*QaU0o-HW}|S9h#0jAB-t*dwrt42rXdRE57W>V$9L6GXig z3|mIzGn!rAJVLu?eaCkMD}$^s-ax^ytvfS?%Zdc~WZ5pBIox26()ihhPZYCs7nT^M zq611Z*L_jO0}$~1u8kHNdN8^*fUsAWC_J`HBB&*GMPUhUI8qPTNe>8K4;WAncuxc!(0h8$gi|7I0=m8h4A@a;^^k}wR%M&oO=1%1Y!HE6bky{bDwY7)Xj9^rqv?8BZ z90{dE2nEO4qB19$n3Q217=??OLp=*^<`7GJ%^1t*nL|Fw#B+$A`5dGApE+X3VazV` zHu#{7im{_lQLHChfe@FZJQ==d^2qDb@U6YIu!3>conSPHaTh%%kVfREa z`&A-NQR#c4(tq1RHdKKf!(A2?EDWE}g^5unYw0oa~Yexa9RlO zrCr<31aK-`QRSlfM;^t@bu=Y|y3WoW$B!Z))$EWc&bQ4crQ&2rZ{%xc73mpYue&Yz;~r=yMZ_-Cax!&qv*;sQU30zYviwrbly zcI2m#^HWED7LlLj&i>?h^H0uvHZtx1Z9fwcJpdvW{J_(G5#+%n3XvroV0U}9?zE&U zuj8xGj1)7MDX8*&31E`MK&RnC32gDSv zt(xr@1E$8=?&<}d+i(peDgJ(V`JQ{3xhFY3xq-Ob zX&8*z#xU~PTM#-M2=NK_V)iK;rL#}Q|$7Wv&d8W@KT%mclc}ln? zE(TXegZ15PvT0qWJ8NcN=HS{kQs|;Tji|_hS0qq4vmGNd4gIAWXCJCQ`>;_vhP)gF z)Wz&+cXyfyV^6?NJ8e2f^08+bxN1PGRWqVoCVj?CF)N>kK=s2S3DREEjFUHqXeyt1Okg&33{oihx0feyGnx#zYx^bQ{AvF*wW~=h<~}jP<~||9r*RcY zkMv?rD?~x-l~BPSWM2+1EV_aAL?C{`dlZ&X->Z!9I)l38!)N>_WdDjU+T_k=Z%eN6 zNsD5ZjYk9w1aX^Ipyu16r+@2+7!ks=x68Sod$ME}K16DHH~S@D=`9v6hq68@NV#m%Ubr0Vd8$xG%0uFyWRW6I@0F)gre6d9R(oafzNJlf2 zhEQG5%Rng|bAWq(9@klj*yb0f>B|A!VRzX8T{dfRJ7Dq`u`=amTe3)c4aKg9U>59A zhYNHMVJ(XcUG@QX;mIjxztol0Y-W;2ga+VX_1q_X9U0`+ zAbiTR#TIC>1?fP}%k$XiotWZ`0Asj15!mhKiy`-LUEje4`E zXg}iH=+yyVCecx1e>Q{nh$&Bu-{osuqb zS*}|Z%G)<%#B|=?C9ec2#tuJ5EYp1UE6I4(*s{p;ZE>;JLux^GGplgsl@_sDQKjN z$E72e4g{C(L$elqt6HM_W5U6%Pf22nemi&68?<-FQNAcas==z+Pbqeq`!L{~`*17R zZhjguKCQxiT63RlPrO_fYaa=w9%Y*6J}lZ7Cu`r&wtQ~Nl@srKhTIJedQRFG{V+_- z*L7OrHA#BwTz?Ss^+C{)2!-6YS2mb9)E}RG;oAf$0}g~~?*zzvnuNhxpur~)P-4UPwgCsh)3P{qjTh9& z5!oo4;$-Q%FJ+am&zXhVC(ZMG3!N&$;M}D_YmB*1LSs0|W#%p>**FKsfTFqcIey-} zLO!6(T_ht=!Kg~1<*=vXLswq+oysT_;iRE;bP$&G8$8xLV~6Yl-j{EbK8{P*9^-H zf}t_D)yMGA2_l+q$&k>Lk-^4n`yZlRePc#FCTYot1QC5uM982sWd*5e;z;1btzg=L zN3|*2zLH5!WGkU|kWQZkWBO)2)S)@+c0G-P1Ki$_KGK*1KyxCXHwjMpQLSf-WV^XpcQ&rS~S(mcaT7BtaeMg!G z%fOQR`Q8TTjuDO|{RfxYf&5aN$q!W5T-VXh+sN8K_K#V2y#)etE}l#$W*Pyd=|5-7!#elI{mXNlhPqBce8`~xG0*&UDWa#`r$4x|m(!H=$ zACH?S<O;VJcjzNl$)9L|H8+9yN`OVy&i7Usm#cA;YK{7(5LdMyVi z^H{MW^!YDUXz6Y#MEipCUw*FwnSYq(C!pj5Le_rY69*_u#2anpEIUF_C+!cTsC$UT z%hH59(zGol<21rOihey^Nib5qDR8d}?!V))Imr zNl(7EBDL7#Esk_Z#4R1+V@6DiM5~ZV5)t=rY1GyZKNE$hxT*u-o;r&Q?9cO5s*43n ziK4`Y%%NUN0zk5c;yc#0ajiddT|+94nqq3tdpRX)rg2$AW&GNGaq_Q`zbzVy?+K;v z3h-^AoT@%^>a|4cF_|G#%GsK`$b^fD%;=_9nA*>|55I>zPs@r#E1@6J&ksoM$u{xa zd^{LJO3Nps^-4*15Rd4zeI+^&R=ck!`D5cJ!eRX!oEptcb4kkEx`Q6FWyKI|R{5E2 zsz{V(jYcBgzW9Bqc38EqzF3M?R_EdmDqIq+Z?paF>^Rs3=oIdD2TdyThq6|-_>pGI z=3<%gu|-oaV_V39V&R0eUoLKKB)qZ6?GDpWEO{byH{QB*88! ztmdDmamr%pU{7iDv-wJm{>~rS#+@(*q5#CZv#Lr70aSb>|7z zJPVBs_Vb3(MwC`ffWsLkrvVCotSG>QDDwjv#F9G7l3$|K(Nd}|9SsT2$BL}>r8Wgp z=i)=^O7_s==j$lyAJk1L;qMdq9^cKnSUeT6gg?zVKoRtoD`Lq>LBtnG@-rZe#Qf$2(z_Ar2QZ7taWU&c**x*$g6jO~hIg1R;xAydEvI zzDyPL5~DPeR-=)H&qhgfo$8V7O_eCKFk4ilaK4P(Xq2UJnk{HKmkTVbOT)4QWuq@p zrEjlbd(s2_EM2q^6@_YwgtlVowGcF%AxbX6G(VpO? zqukl8SDZE5daXH;i93!xD(KW7IR(EC*1lKadLo6FVBMqO2%rV`;z@j4qA_Qc#brQp z6)Be{iwc%bQ53fYh9f2DrajBMA>wyD1P<|~#TxIJQ38D*B>-3z5Tt4zMi_&`A|xi$ za)$4ziuL;{SzD=a6pY_wkGE&74!AdqWWZ&fm(Cj$*3+W@>&$M1aI6I6%%Wfw<;uKK zOW0=ZSp~$`v&OTR5EqG&X75ay0A|fm7|XNeGyzB&qYZ7A>+M;MBd3N4(clTWCtLt@ z$?B8=vyiiA1;K-qnngNAMJ+{TB}u>U4+N1PE|K;X#sCZ~MfMx7PS+5$0Ok>hGVH>> zi1+jlDph{%NC8)gYfLeiw}2wyro}H90X6^=Y6Ogkvz=9;CQ9N(<8ZT*j^g9}-fwRI z!P5CvL)CnhQ=7Px(mI>A110p1V@O@~QgROT$^hQW(fpJPNX}xtc_cd?CnDP>GEunZ zR2d$t-F_NtunPod5b4G)px{t9nb}p_EnzS5#oY7O1~Q(aTNdx8O0GA5K(?|7G5uGs zumbLj>qW6N;b}~!1rL!~^o3XULsoRzGNa*lQty}h<}P56vqw`kf2hXhlMG~Go&d9q zb18QgmNn((_~grF+9AM;8kO+$vxu`bd;GB3&dT@M6;YqON(MOG)E?h!qqXTaV+V1~ z$24e`6>N*tCO2%-c42Jg=>o}2z1zxBDxw$JD6&z^ffBJYoQfbc*qd`Fi+ z*8B3hfHQ<06Y#EBHHR*7?1LK>=PoHx=RtURK1EV}Wo$tm+9#|#%Uo68l@`hHpnO$q zyw`#Qc2EG9J{+)@8@CwQUIxbae&omWA2rOqx~@kP1C5f?3s3)Xv`pU%B_&bHDTP>k zvWKRT7IQkJ%xJEPf#(Z-1Fmqolhg; z(|NTYm?A(xx$ot^f_eJp3-;w-5ti0=%`i#;ppD>vMaxLGI=g^38JG~_SE$CCtHdk_=*9(h|vT+@TSPT`4~ej zhXAi6H2qF7=*6}J=^S6 zNCvRe*hm*zoNHxF$YNQ#gyhmX6Pvu$6WH@FCG$(o3tTNeZ3(^tAoaPX=6J4+Z=S`d zkU%NniNBbR=L}q14{-kz$|>7cM+8inT3qo3Olfcts-rj8M|BDIC|IQ6hXic{_`8-V zQTcl3i~OquZBubp4O?4HIxRxi$Q9>wI9$Y}@F{p^AQg`koVxBuB@GY@849QeUV0D?QYLE;>GVa4 zfZ&3h_AP9P+Y6Ym>J_aD;!Yv~X8)~lRAMHHF5ugJWLl-@7Ph3riD z_DL-?Gz7}@w`3y24SwJAcG*mV|d5`{4fldDA3mvbE%#Ii_gDu zy^(Kl@-U^d;@m;!jOVP=U_Ky-cljfs%0n8u=$w>1C#pqY6zLWn9nc}I8wtva1eH+3 zkw9}#M#9OWbG%#lOa` z2<)OXa;`&*fI!=7?*WhW;&{&F0#e&6ZaaJkIVyv;z^liht~`vCKr-9oInC>O=0%t|;op<>{_*gh*e7*@rF0IMy`uu5#`dVSz8w?Yjy+M z-7@z+?01oLxh{|;>gl0Rl*Oc-v6f`+5W?lUfst8lNO>PGTMOCD=~usvk6n zcRtf&yk_!SKh>tsd(Zkq3PNlY)6C>>}-7}~TWhje1mFuVaxem+s0@A3qJsuU?1{++UC*N-k%cTq34 zTg`FQ%O$_BO4#;&NjWR->xc%`F$nD|71AUfMe4jB@`4>08E?T*_DMj%$t2|Tk}{cA zA1&1MQV9+@Db-_cM*`48B$=c+qEP`e9CwgqsfA=etpKPNlT={|x}iTO*u0mIUt{>Y z`60_B{;Z0-<|-`%f#O|TP@0lPm`DzCB$_*KWKn%iG0^cj5geL|@W|SZ6?)JBN|120 zcq<;)y>HdI(}(fvmM9;`CXWtMby7IZ#C5m<6GB$MzOLLyUbjFGK)76u3C`i7gEIBZ zrCvW5Lv?Q9OF;=ohPK*3by-jrrPctVkTMasV9~k#on*ImTNW@~N<+p?+}JVp*5Jat zUhmu!qPk&vcCQ;z_X1IRQ1MRGXV=}bmR}A~EsfXdqog*J9LA4eZ zONzupFi{Bz!imzkr;dp77meM^GgWk6PpdwUTV#y)ZqKO6Sh($@O&*CObNU!RY7qsJV|aDI#7o8m!U&tXb+AKdJf(x^l8W}nDSwW8IG4w z@yde#RgYZWz z>~WU|H3?uk$#SpcQ#HJ_0pdZ}7*Xd%Y6zk*b@SK{mB)L8k;MzxY3ozC+dIzMI=^?A zVDW+ne?-5FdXq;68mBmX5=vovosy2gg4^qSfMQYjJG{REsH|T%oS&c5z@yr!U6)$s zrt}7-zJFgEX>JzP!Vm9jq0H;6Z@`~QY{io0DZ@7R4gL;V$mxVJ5MM*ZE zWLoERq~81APJJ4$kP1@mz;Yd(qa@jo3b@; zw}Wl_Vt5pbml+~RL|=gj!XT#LOUp9YVp=MGmYyR`RaoKePs^b!bbG-#zo23Z7s}K{ zuLKvZM2dw=SjuEyg2Er>dC|mmDUGWt)v0mW>AAqR+X5RPLxn@YA{VFJcKCT;u_!uU zEW9q+BwvOn2rrDXIg*Gh!9nCW{hW91!s~u`)k>noA-IlfmSV)|xVDFYsaLY>mGVq* z`fz-)056o;7kc5v+hx(kWQOpGA)xW6;}g^g{7Zo7BOwb4dFo@wNxrg$3#5fNM=_2x zJtLx#PbGX@mY~Y&_7|j^R88Af?5_4VqCCUGR`N6WhO5F_G53ZZRc1v=4G>!8ebP^z z)_MV5WlF7*BoY&kc_KuFCML(y6zXmzO<^uIVkBwD$pq2-N{9$-McB!vh1bdw3kmfq zk?2e7?R=s&!o7+K`)(xY&cQT65iUzF-j3dtym*`4R%}uic`cqm2aD&l2#XvRFKY9Z z4>+19h*C9i_5xK+F<1K42}gFp#M~1cSWIjUk3A8SoIKp@OD74)C*2|KO}Yw^|JcJ; z)0$h-@w%!VCY@LLBgheT2cosyCg4#_Fn}t9#0mu-Zv7^0#v+Y6R!zs4zK z#gn!#w9UalV?gq-{>)B7`&ywHyscFp@wcsvq-~aG3qC=Q$`9Y{kIRtUwWKM#iVkgm z%BpSzz9ztahzJr<*;-TWG@z*! z_y}sIKzrVjq{!5mJO_pExgUkHnETQ83=rUIYJs#^ko)BO*^T22M%S0OzLG~CmHb9T z9Lz)qQ-l5e#V2VE@o9zZ!&FMRulaNb8*ZpR_+F-jFSxoz@OT!abLy4EQ#<^4@?oesg~7JU+TgU!DZ6|%GUb?2myy^ zOUP0p`)3cZ-B3nYK)`Cy#4|7*MD7so6e)s84r2vVLC5`Rkq~;^3EPU(tmi5vRc8n9~UVvbhktX}{nJ@tRp{Y{|R4 zajR$K3LNbozpzt~dq*THmm={66zq7kpPEEp-JftFLC}5yo!$#C-o39NnkhF`EZ#=K zATDbSu0E2jCz#p9W~I+Wm$87lk)=?vc(7LbEf)_G?Zu982&)(4Q)A4agxndO4THIL zk}D#mCuLD}j0##ZJxKE|>b?S50pJEce!h{E9??c)@Ilc>FV7*8IokcVlF8mN%nhW~ zv^vjCx>FoYVQs*ugPaLn-+;Js@c+`r+IM>^n~iqh4rVmBJtDUvaO>K=NCrMH=MpSz zrgHH`qe1WJPOT;vPb4gy%FiBmoa(Iv7f-;_y*hTWsD4ATZSnb#{EN?XupTO1Oy@Mc zo^8ksTRhe0T3bAw+@Fou9S>lQ|Cd6EN7zlD@$a;MU-IwE!GSLqi!VvsEKYl+qbKdj zE{jjZbpHS z2;FPILvcPkuJkI80Ps?=_^x|?FA97PqelTf2I^foc(A&Bd}NVRGuF!pw>3leQpxjNyID*(K?N;`#|yW) zrU+$-$6GUg+O#VQpdeTf_!<%ylQoG}PN+gxkj;LXA;C@i16rpT?)@SltYS(fK2OQ5M{{!G zcnBB9+fR0Ie1ydD`_1v(r&@A+KmtzUzAx@=TRN^n3Y;{QCzYp=$Yq~wa1B8eqBMk^ z47{9is=uLAE_))^=PiQN($aE&v1JuwY1{*WPiiaaW`7dzR@3oOC2=Z2pSmPO=Qs|y zBr8FDR0kP6gAl1IY&s=b zon;L47pL`{+$)?o2fS_XhY@ zlE^c+rwN{b5rX=U!m`3>#Ewg0_cI_yNy&hxqD+qu7jO1*lg2i7lZ!gSJ@!1&E4_3g z+6v+@dG}?$XDFoA0ByKzARnVpyBy`WG(fu;AGPosOWQ=;O?0A(PT9m#G<_k`?T}vT zMx<-Ca@t3opt1KPd9|%ZSg!>V2CKkxS|&#h-9p||;Iwbfh&*>s>HP9{R{Oq`K=sR4 z`9sL~1bD7A2s;s$WY#fpPJGIAOasQKkRcIed2?|Nfe%S?TE^gUA!~nKK)^oiHMTuU z^+dlqppcK~NL?owxGYLt0D|7g-7ba3yHDbH4}RfEhtSeXr^`@Rf)UM~K@C^rlVy|Z zv%~+DOE0|#*{ZT=Gy-;8Da9ZmVj`K=nO@%i=#NH`ARZ~?Sm!T29+UdGZR)T=9uJ#3 zMaXC3L?Ar+l+yg69u!ZvF1+H{s2ufTj&8$n@O^MCeLTm)_XkYHteNLas}5Zrq7c6-RKi6x!XlI}Ya)|{ zS==D9d&2fDmhL7c%juv49)y%cSL5f`CK<2z%^%Xz-2py7Po6Rb!2E%9xwaKgx_(}c z>)7o;hDxTf5{QdUmv_7F^6qk?mUs1#zlwJFQ10b;A)%g@l9qS(3SmaMToSUadk=^omUjom(oBwr1=hWTMMnPP=>z};@T@pN zA0~9w@mNm)AcKVQ*8vD1>jCteL^__v!8DmQ;03oB4Y8crOA9Q!Zs~k0XkL512A*Nv z6!F-U%uM7BhoFP*M6o9O32)c(L1rXPPt?Xk{1Jm5fgt6ttM6cysShc_yTipY<^l(e zi!Pc7w+HUC9W~Uae2L2^sR&*kmQ|9SP;*}tbAQyF&wb(FKWZg6FKZIg**8{U=5%Ek zGcxxRJch798MTigxnmj9IHRIfO~kTBq`=%){5jW} z*%9~miO`nvmd~uqTRy`+uN{P-VtF=5z)QWkzk)$r<8yp)o$$2$h5~$M5R*QYRS;^BM~%7 zCEj+}v`bwJG7--wksDJJXt$$cxg&yGe%}PQ{66j1moIsamMUu)fabn1v|w%ddOawD zP}qm*fY97mlthw$1UwMzM?PA=EVdWdY0x|@92s+SQUfTK&vT^vP{KKLioOr`=XCp_ zKKC@zqfAfNnM7gQiAgYYD^pBx9!mE$NtrAH*S|FVnh*AQYAxkoD^|8s)FWM)%JX~{ zkH)Q{yT|TVJlKi&R#=itYemN%*UA)bNz+l%WSOeYH=@*d;>h#Vb+`Y}H@dU{PL3B| z5Q!r9BOs^q1(}$>#apQ)ZepjDRX18X9v+5Z4zF*9ZwsbMnZ3}ojM6~yV!zrkYEi`f z!;IPDi0c;i*;6UrcT*`G@=^W&o!TbJE+>^|GR-IP@LF*Vvz27uv!){o^uwV9nAe8V z#k3KF0$=I#Xsm2Erk6V?Xc10_Y6+>#T^>O>ST#lU3|dJvDgD0j=G5M_?nsjzGys*A zWB~OCg6NiA`C|2`*1hy4ul4Ft`xqTBbU;RxMCr{Ml;)F!|;)E%%t9v*__|&Pg%)*{nIjyfcIYoH&(0IL_$`ElE zgg&nJb56EqNTYB;w`(*3x za7tLjpsE*Uck+G+AnW!BY%_Ofx)#9sN(ndOA&`>pvt-O*S7bfvm2N35c5UQahzxcU zCWM}W=g0tY8z)aF>MBl)vlCvS8kpZ$(nifNpkW!!Z5-u zBx1K6_8U&!6QU;%N@h` zS?ODF;bBP`cJdUxeXtLex~j`UIwsh8sT*0iit~z>G@=X=>-z5Nxuq_ysB%*7Ysq=3 zrBbGO`9dYrop+r-g*j~pVDf;O)!k)eH$9eY2;DF5&P74^>Uos0!6K3dsTOu;NedD) zclWipx<{R^@Rgu@Q5n8EQ+gFe|K}loO$B2Oj5H^+Hf6m;X4a7iHw`qrFGz1t z3JF0l*F9!~mNWt;V}`TT2*MIAW{vROp6=uzGJw`SK1rT+)ygFZIq})0 zNqjw-=`JyWlRD6wGl_>ZSm7v`py%VkxvC;%RWPioKKz-yMpA^A=s0hJ%Dcy^hR?-T zc||}wKnkS|Af7AiKS+bP0JDqK8Xc|A{}`#o8i^Usgod=#-g0JuEQFlcCxm{Ggp<-4 z1mc5CmQ1`TxhY4vn0sMsnj&R*(;SFcLf ztXkf#K5q@xW!F;;BIVvMRxcK-&&wcSFtpFvo85yZ%AEuC)oXD@0#d9|tX`EV(4cW2 zRK=&=y{VO`7EG(p``266t9WlieeHG6@2YWHK6`}r_@wht83BnX8uweQ>I_gXdUl_p zD(q~7Vc1uvtu$Asg)Vn=_VFS|zh&H)PJpXS{X>(JF}QGWH3=gWOxLOu_YLu52U;{*X*iCVH2 zd?zru(z4O-ifF|(c@g{7ssK{SEUe0(@YXk&b%(yz^gUCK}#GGeWrocbL(DKIrXz?w}PsK zRbJ&ZCY}`Z=uD3}t$R~0FkGNJ)W_K)hT)pewgy&I3parWHx_pkBy;ENK0 zohkkQXP3c0qbSZUYy3QPTGVny6%!o?gRZ_D&$H8p^z8G-L05?krfcq{5@P)9dF^rn zykdDZUtD-fyycr8er68a3mRhfjUS z2s>`u@$Ia6v#Ngf8xIYsyEtK5kpNE18B&ZBisTje1)XsM3noxDKhu*wpriT@9e~Bp zh5oO)bJji53{$?KCdzhqNwIWs$23x4@fHT5mPp-3F2Z$)WkTHZk#o4lY+a7DjaC*+ zHVR1W!!s5koF0qgY=3|teRvPJYVmzpW_AA17<>S%6a0y0=B}E;=C0D$2h8?s#p>&m z{kHm9-jP^k$4GrzRF;-J3oOV{A`^}=RX~C-aaB_l{)t&*#^j0WC-WqZPzKz*|r4)kbqBGNPFKN-GUPt5q|~Nefkj&Qa88E5*~rP-Ft3 zEAbU#0WVvz>`*l5{))3_KyRNLdhHrC21=3@vf9mr<~O;LL#f*lv)Z@RAC$8vUS+6v zmsxJrcSM=yx%v*E0EFaXEEaEyOdjG>#P_EOWZib(V}BR*NW^#f&YA9n-to#&#$sBt z;7CPs8nlzd7a>Mdwb4jm#9w5T`L~56;mG>g7d^^*!)I=xFQX~9#j@zTX@=va_2ry) zU|m|Q6!e0!wg_OXqI(fp0tz&BI5ClHc5`t9kv-VV*TxDGZ_sClOLTxyM~!KpWNr{@LIss>cDt zE(5^X)e+`|VpW7h3Z(+p6s>%3r;c0+lHBWcM3Y|GO@+tkvlnBV1P+^7s4PkMOr3R!%|AsdhM32X@$&%a+5?q0Vdx#F@#_X?YkptM$FBUZ1lLC-fedq}Z3fhkYQWuO5qcL@3D zc=tN6>EC6)9@@Q(Z9zh6Qm@J>pFhhj1!z*co!SM}tNL-|oOe42jS1s-a$N&g#yHox zE}IQjwUY`1&sDz|p5RIS2ATqbt3fq)BkOLF&Y5=amW4>WD$jtV0d<&*O0QJWy&F?| z7ilD%+#w2z(&Mgs=N$zA;C$o;i_a$4k9i|hmXE}%PMAhQnVg&r9A8?YLBxO_aO@kK zK;&+om`LOm(_g8i&k0MP9vBU8wB9MlrWz~`@LMYm$Pm}dGtan{w!S8YgN(0<(X@&T z7LWLMw{1WjJ7If$=@e#1U{Y@rMygu!AzT4+fFt+0{DO~D7RA99D zBI%zK9teYnl$vnX`oi(QQi{Pfxap@d(3tcYsadoOAM=J;Yt`aa(Ex0EOdu39Pmc(` zqWRLm=8YU!ZcH{N1U&BxZKdxL2p4`;v(L1A#_ZF)qj4(9sc~3hjxNw0({Iq@+r(& z`ixyZ#|%|R*B7E%hX+#-v3O9*+C$`{m#WLYIRmKGPQ|mab%3MvJ_OkM)L)yA@Sn;z zJ7ls6CVe<^Sf1#7=F}?}=97{%Fte*@{cao}d5c8h-||&RQBX6M4}S1TnQ_6X?}^dk z?8|)q3vJEEx*XP^_}&t!S6KE&>efmud*n->J+lju4&odR0-R+#TlAZrIij9tKek=& zPqTf@G!AYZ*g8P>ObZ|MN%w;=@3L374uBo5G|JP4W)kxT3*w9Nhk0bqz?poaCzB-U zCP}sh;@Hpv>!N7UymZmC;&bh2%0v1*S(QbyYE|8c;9Pv4Qt+Nmup{ne=ZDNvh%BY? zppT0xzH~}feB!w!lM6eweBXx4CS?!nP!Tshy63qMd+a&)q4JvNa$ftQ<^Wk80orJb z1liub?gyv1$e-ilSQjL~^|l%u*jD6QyGBIoDW!d6E7grc8#nPGneSzMc-gV;12GiW zZrr-G9nr)6$z1*;IpKHv1T)tlr*?e{mF|P$vqr$%K|{n%Mjk|4YdsFl-qlz-+_Dg3 z9s}K+vXo%L+gNSL3x%$!1_ZFQ&oKJx z`9zKFkDcTPFD-nmgNT+E7%4O7xZ?jY8{2egY_WC4+`+;aLW~je4N@7>^r>MR5^QBbf zD?gS*L45fVn214^OnS*tv6;iI>Yb2b>4-mH&0IQ);Hv7fz5%vw3}kyYKt9c*SU4b- z;9?9@>e73(kO7GMWr{_=ouFeWC5Cj=R-D2teqvg=Lx4Dw`-uiImyU$ezk*_Z-!x26 zL|%=>3Yt*VQsZ(~9=f8H2dm&8xg{xQ`ga#r%y3GbN&~5V`jQff+#;C*m6h^D{<7nzU!S zQxNwCp0xVEA9Nu!;J+UvPjjSVydWfV;6=5o%l^{Y>oN|6T(6gfzBc$`YT>Y~6JXGM zY2KHa8|S}8Br!2TTm*y=_|<=T8Wl^#Ty)+w*YFg&I`8(%yeqSm1JD&AtJ5W~SBduH zwyVsYYR7m?8SiE-w5{lDiQ^tvrq0B5DXw&K1SP4&tC1a`6AyDKfd>te?@H`ddWcqJ z`E9ojM{%-p>s+h?YKXw3??_6BNwumyS<`F6R)B6!l$V{Wf%M>=AbHt-nz$w)-P z9Y=oL4w?RXR$2=OTxekrAcffC4xIh!e<9zXvw(}Fmv_i{`8u5i%oe61otB1Uk`i37 zPFmpN??ci4e$C9ne*PTLO*pig76dSGe;3LrVcDY&7E87!=my)*IQ>FN199EV;)lJ2 z4_%_tOE7gH(HDH5zt;vN?X7TAUpu6Jf6vg?D4$mgoxI%~6S1u!`EhL~ai*b~G z!7oO~G7HqehGoi>$Y4Ppv@(fueX-pxutf##FBJvvPu=GVODy}l|)L-QRAzU@=S3}~fciZFwUm+40 z#k0POXW@|)i!=?z6Q7gSQ2Q8ZrBZU;gn?eEA-QV(&MH1!=|2_J4u#2uQX-S>(vWDGhV+2n^B$S_&L=0y?EkFh{2M{nV!4KUzG}V^M;c^&13v z6;loaHbUSsHJ#q7u8vpj5SCw21{qB)16N@iA^?&#VF1tA7qxhjJL;+t-H33sBKDm2$tON!QNmR$okn6qP*Md^mn578{N9&Xwnr6SeC;bjS%71eH_U@q zNKOlSO10NafQz^FU}CQ`KU`rvGvU%p%kelKkCXA(rzy);JjbbA1 z3gxAr`$!GwEZ=rlSlNzN179~dD6u{8M!;pR>!f6c!5EWyM`jK4ca-1x)LjFii%zcDirA!PWyWBY&p!BMvZ_yn{+9f2Vl5*#)=#WY}A9k7rBq&ZtICH>FXxGdI z(?LuZOkpO)(5vOuODe8IAD0|`(zCJpq-NtSPImq_;;>neG7vSVArv zW8K$`e_^cqS}GF0JPsVLSeuAh&ns&Uf4t{}1BaZK1HC?|3hr~;d0M*HODlV&T(%3D zD@G%0od~e;v2w{Ur;JbGi;PGPye+dB099f=!a1Y81|Q}K2hh@0ROiZ(NGoz$wtX(% z1N@)tY9%_=SuFL(E}*S<&kO*!DzgIdeM5t=Un&| zIpCn-A8Xa(XH`oaPpzqc7tE%q*ZfC<2fsFfF+xfJWBSxq_!_#x!X~GbfUTbAHk*`H zZg+o&wAl0h4r!6Lp0w8X1PFR)mz)RcJuQ>T$g)ufLC&Mra5)=niYVso zMAxAekRWx1XEKv#H%w^lC{dPupF2!qw*6c06UmCSg`YDVt&K*=ugf97WMtW{Te&9zVz|QRKqydfsUs_ICDHIe z@!T*n$Upz$_=~>kjcZht{)&E{sIsp&Sv(;acq4BNDOI0-bt0eN=zDj3ki9=J1pWDB zV1Lf{#*@o?XAo%lzWL4pZG27tmd+NBsfnW-Ru z+T)wPQSUs5yPmC*8Yd`kMDAxqUE|N%xo`_jLERMWMYHZw%{n3FHR}))ELj(d4%er) zu(4dL@*j`-;YoH)^o@)fwH4dUUbDVRGmg^LG}Lz>31dvf-V_wzv{^L&+1t9!r){e= ze+uG@<}rUG$mbnU%u&OioDxRs&7YO{YwF@Vj-E2(OqRX{RburAe-E2cc|ad{=$i;% zBsC1j48_Rx7MHn=9mJV6}i!Bb^mtloTs#IgI!kC6yQ z-Wb(WnKWN-zNJvDuUV2fl}PY*WP zz%-x78md;eRInpj&#^c5TosT9p#%<4fda=y{n;n_9HLzw@y93#j1DuHQA7C#rZ<>n zX~90!;J{EIsr7VF1_tw*%8oH9gJW*!4F(!`7}Wq7vUkSez4~D#@F6kQr5_`YcU zMEGV>blL*Khkc6HF&M-OsudR-wvLe|37}mkk8`rh!7JUslE`cn zVh@cAumE6(1_Qf!tZy*ZEkMd+b38_QaOF*d>u_$k;E+PPG?H0^0RaFv=G>2oJDr`Z zM$vh(Xuhg!HoJ0ccw^DxRa;T~xP%qAZTt$l<8antwJ}<6{S$3~kcji#k&jm}HxxWP z>ffM4|POJ9aj zXh6r zAuEHTVqZh99bod2-qf?y0Z*G%XG1tsIT_r{HF({_-vog3jL=VStkUQFn zXQy*==m9nQGm6m7WHB=$v`zmRCMjmbP7Y{7MFON~;H|G68DlyXaSLfi754JTYUU=qdeNcxL?!TZQ$P_frRY$}(R*-MJ{;#=`*~z#*vnEvnko2%V z{h84){aIWlbDtiUI)}}fM27R6=2!Ah)&^q2NS%3_V-C^84MgUE4mmuWRh5_Ed^0FZ z9tI`7v~xgTCc;1M-eBL!2IsjDX3cgn^CAdKA;3gdInvxV$mysQBwe5Oi&Br388eUd zXSDe6R;tl@Mj5;^lk5qIiUeUnbj3L8xAus)&j3D(vo@h zPeG?IN;V)Yoc6V^*qr$@Kz~)`Z8waO*)fDvF*^x4bJT@{AjqVxLkesKSxD-7ize5+ z1i>w%jT)wf*OpX-E<+_C@Zy-q?8A?a4{@-Q!+lI(7I)m*BYLQvx zfQ&{y`#*)8S#4|~72-@@XCY!Mwj*Yb0gjRM5!GNcfDpgcJFh~>`npP(Oa>d`0<6D@ zMs^P0-~(0C7huXds8P(mBI(4lnVx#b3P8?Pb!MmDd85IY`G6&XMiO9eNPRb|9N7pX zPhXz0xyJovnUqmzs#CO{zloh)WG$|?_Z#O#0S=Qqp_1BB3x{n_7_ zcq?ZA5HkT^2XQgqRkSQ>$TyIqvm}j3-9)PBPBMxpB&q1eWI}98$s0%}cQ|sFtFM37nSzZLPfWJbztsY=yWtvM-n&XHrbOlCi21{pl2l{Z$a z+~t84C4l>_LFz*ff27%B_AA+ydOGdT{*CZo$Y8$y>ZGq-_^(>PSUE+dzsBQhj6mTf zseMi_CM;nC&@X0T%E5vs0yJdMY`vY{-e_-7^X(Daxb3lc)Z?)&9y?f@b3;X(lN>JE z53?>1G)4PS-=$ErAB*T?Df&c2pYR(b+2i37R>)OY93D3Ib3#y41@C7%}(Y)bT#eBmK$K?6-$kYZ7t;&`ZHE|hZ z&#q)_&5va63~?#7#ByeJm_l_}hHR2Z;m!}Tkq>Mrv>NmM&0 zxsEFhY_i4V!=|$bV-0QDe zZ+|V7*#3*?rEdf>T{L9mR0YxD@6OJlk!iNsgna9B+iEbHRw>(f%J9X1A{F%?P;7Nb zE7$n?CnX-WT5KY?C(U~hEt_U(q2Asg0OrKg^|`%n`f1TS6kQ#XUn49XzB7saIQLU# zjvDaN+%rH^%pI#~>7K2jG=0?{n$+ih_P?X@@Zf1lvQ^8FnZFv2p8zZP`OkXigYRJi ztRpmC5onV@)WADYmQA?9`XtITPJ5O#COu~T*n}yCGdw2oAoM|Gs=h5fxuM?q4XS{z zPs;+G(|e_Sx>MmMu6}>a6LD1U;O=3XkYGA7&d6D8zY>h~cSdOtSAJv~|39MAMCeQl zJs`L?TeuYMR0@ElU}ce~m&!36e@6nOesx^E zk1)MnYQIqK*J;P(7_1&NTIisYg`2UDiOuV{o!@zR6Tv|L3ospe4Lt!e-zetZGUfaV zDns5sJ0{DIR_q;PZJ9`I-MSuw6k61$R64&GO4~1lH8uC2;G&cP_nUYDT*8F}8^`Gb zh=q;jn!~ID@R4!u8biE&PU5IHRFRL&E1W%5jwK@M=6-9Ls25R6t24c9l^sfv8&trhQQtAl z?zJ3QkmDcpDAJW-e>Q*5{Tcpt1z8lhu7BgPZ#q@7L6U*6=I~;(7m0dE(-#+ zKg-xhH-r80Qo{h2-mr^LzNS~Um0ez8#r*$I z+xrJtc~$q`&z$*j1_CF{lOcg*NHCH(i5Q8JNFx(TgG!XNq!J}cbW%w#Y10;!)L4m~ zUuS+ZbASN`7+{Fli?`U)7W>kMwrH`%_hQ9cQqf{xY|)aI^x|7mvBma&zH9AgpEHou z_n#NeJkQ!||5|(Pwbx$z=kp9^&J0Oz(~MjV((|NMnpvMc>J`$SqFZ4-5JRi${(5&)V@16LJR=i#mOvijTpA{`67 zqau1XQy7#0v-~|904LAOVVi6E(j>Y4ZaCP`v(tLBo^1*z11ifkkP~Udf%Mnt^ONk>WBu#WVxFpgzWjlw8iNE(lzjv&PO*F zYso$B`3n03`iw)cmrv7Q%A zk4ccVfc?rp6wT^py$|d9?j`kNZNC+vxtC}H8d@=K4Sm+oiNP0?aI1kA_1v(6 zOsa)ksmBUEmerGwl!-ELXgf&=%Z2$78S!&=po@v{l zo*mPKY5##dSL?A{k5z`OnVc1_t;;|apks!Cx(K18Ca(ZbS5+&e_GvMA$3aVaT+g-x zme!P-W(NKS&M}_xF(#&d6<<(QU9%fogz^GB2^}E-&7L_i1?6H%<`OJY7l%~@*p0F6 zPuJE%!G1mImFtBcS0q6eoz!N*Q`Qa?#!KD#oapJe13zS)M~5mT?O3E|TUW;NoXREM zQ=1W_N-cM4zGGe)oNrOTWhBBary2qnvMS|O<@lb}V}@Q}&xQ7!ZOD}_C^*ss_T<7sU62M@~4)m8!vOLV?3g{p%vQf+0bzUnA1j01HoVMo~iw6bu8Q=+srp{#+b$KMRa|H+vH`!CL zrZ0p!X7JtRfX5AO&*B4u+a)z=@nL&DWY0(K`J_Fcu;=4ESrL)c)e7vID|FWs!JU^4 zZlVoOmYZ=@J$_3)Pj0m6T4^Bc=PcB~?K80F5D~07>%wLZM#TW#POLRm+lv(F zIi&21UNw>__B4YimGm4?Rq$;hdtRCvctlB{*IfEyJQp$WX;t~L!^x$*{TZ*0fk2;< z9dt?r_A2e(^Lm!f8(K0^+;8YhdJbGLw6;uDfIa8TuQ5g$aHVb4H0mVqsXhfNs#pyJ z<>H50($J?k$C9bHaFV68cr+#%*mNZ3&t4ir^emGw7r&}!`vz1}!Mi>auljn4pi5^% zx5-)eL51u-Zcmff9@Bsf7nGXyMvuv}XO$3~y%4;{autnb;pAjR8T+gSYb%J`R2Bkp zgzl!od1|6l2PaH??FfZKMO;T@ZJ^nTl~~_$J^PQ?bD^Gmx-=^`pO%cE zi>m~OLkbZ)9>IRAz9P?EENnN0EkTdiWm z$|j}V|8zOkXAQB|o^AGY%({Ftib|i6@^_O&fbT^So$p2IIi;M}Df2vFPp@9nL(+w8 zJdBwQ43R&||Gb~ya@m6vr{4QGnQE0)F^0zU93Hd)N|j5Vgz0b0VyFG%*jX9}rQJuB6&DEUxh9sJyJIpYlq{jr z356~lR=CnJ!Q7cZ5HovnxVhRuY%oRWwkb#B6|T!-_M0pWtQLkNmWt^o?1bQqB+u?; z-jO`xIzRL-`{mU;s%QURdyd=lkUf){dPb)PF14pAjDE2t?Kc$?8VI$+W=^5m7|(O? zlAi0==sC1N&(esV#m!cy#m#0mRcv-uVO6-MrW^9t)^qXa9l94LoligYY&w^7x4G)N z^p2W5$jSL!x`E>g4^`!+<*!jNw)GW=)9^^{=KOS&_~ZO-s8657hiNE<;2%jSjmMc= z-%wwjuOb~%^L+C88p}-S7aH?y`(PF0MNLb7SDP(}ORTo9>G9o3`C7uZ^T63&J2jtA zH#92!_F0D7&{)XVngx)y)GOC|Zs3&h){@UxryFK?pc!}Pr=o4xTfKz;?GG^RB1ii> z`BlP()*8wKB7TXod_a$PLS>B4-Ar(dh}T0*`vYnFqh&8eRfI=x$=9SCW}AnLQP@$7 zRV~$1Akc={*DBDQbdF|$AX)ism_x>M7Q$Hm@wG&qmDG2nbRks#LeFSkx}n+IpIrz- zLD)sUfodCAsXwLCtjAm)IP;`)t@t+I34bo_pCj-2Jo@L<=Bv^Ti{xHZpZDoZ>dFBP zhcmF98ATR?)Asd+Iz)n(5-t$Eq1_T;-h-stj?|lP+IGTHUNVVlXgiX&9dDXMQt5`J zT3b?{%M?&P2h6!#&(2Hb{1mF8Z7-SeEKJYWv7p+vkA)%l`D1*zq-b9Z%@{f(w6%=9 zn3br0QeNAenOu=9)~CTm3WnueLD}*Di%zbGfOOrf1D=%#0e_9XTyulV#5OGYj-k<{{aFS13~^ zuX4=I8e@uIC#jYC`Wr=@PvBhnj(l1jq2&=;8KD&sS{9*Ik+bbJ0>gCI95sUtPUA{{ zt?-vlrNVP24@U0D=l_ck9u6T%+s{c3+KxX$gSBpJ^@P`QcZFBTExcB_UwE~nvoxdA z&OK%upkS1WWRkGU2zS=R;vH2Zel{grd-}!YXVs zlFB-Z_65}DdGM@a#%~fzPZNK$YEeuA3fJcA^fofp*d=MWugOm$QgwZGHQS@|%)F6E zwVu`0YH|ijx8`dIRCr_l#%gqKA#IsT@`viBo-Of zaja78JB}^LPfa@xN!CNeiZ?1P%k6657Ku{F1Jpt*KQ{g~R?^qL{#qK0_vF?<3$!~g zYCUaBY8a8U7+Qv?)se-V0)-;7aXI8_8)!Cl~ zV6o(+)%WUH?zVkIX?TR5i)xh)<0inpZSDE%E#pxA2D`-88SJga>8>@*BzsP_=QZ}6 zV$aY{9x(@MAiQ__`!RoIH{@+g+ndqX7;a7V(y01}+-Vs|dPZf`E(=v%+c$2aVQa&t z_F_K9lJjHuV-(w#Kr~wnox@R%I~Bo`PvE`*<##G&eyQDnMe(fOv%?~V8bIyNxGJ% zq{7Ye3S{pyvXr$b5=Q!Sr~s@UqsR))ri|akvXm-GH}t}ChXx~5iqHtqbzc$}Te^;F;El9bLCT=9n!qyl$5rl%?t_~m-567Ks#3UuvP{dM{LEWPa^ zfWO<&4()t$V}H8gn9R+z9Ri+i=zP@n;F8^jZd4%zkD@5&0~eb$DmH>y3~Oc>Z_-ybF1clLG_O`v01VtXH{EY zvC-SZ#u|!Ya=x)1h%Rp`Jr|8`r&0GJ+*Vp#y+{e$zm^MKTIX}qaQoKeQ2*%ffKdF- zM@9oySX#yE>QHj-ygDgK?$C^k*>J)0AiGOte_IdkwN|1 zr{95I*tj5V8}-b~&y5Quk{t`ujbu*Xh3bH<>N*~yNUY4M*;!NTXyu;1w=?eSXbq-y zyU&pXSK9^eG+X`Eb~(H+`n#R(E0?Z=_B*qoXU9A*#%sRk-)Z(NB^1xRwS^~N)&WCR zssV~dS@p&zW3O6m$6~VExR`RupI{QajyYww1fXN3J(pv|q#eufgZ(U_s_HtHDE<=j ze^$hk@;Y<1-$>kXbAud_5@q!(jdEXo?B*G-ZU_k67QJra&6TUQqm|f z79*pWs}-)!@C$*#?Mh#yx0hUHflTe`usJX+kf#i zzO-rx%?*?MS!E;)hTSkj(h-6uFo_nYZLeUasO7bFL1&9f-#G`$6uEN_yo7}s*7}gW zW3I8Mi_p!~EPHLzP72e|!7M_@iYA1KG~w$jXs=f!KOM^ow?Hu0D(GrS{gfm-KMw>% z+kt$(7W=r+bVokOMEh&Lsar&_WtwDr4mm!7{YR!82B4%XAz#xzAQmx0RWTlJ3oS4< z&<3i=*d8&)p(lui`LL*oR@H@0)Cj)G24`stiNBdSFXxm+M#FbV1R&yxoa}Rg#JKX+}G|eJ<=R@`8Be@V30kxV+TYfeF zddaU=TTzW0SG#5<*v6-4X>5X=Zd}c;$*&jn;%;1p%fVL8jS`@vRqTSBO^`|>X-X;8 zVyit>pzKahXGYekY+UUWS!9TMTYd^rxR1J{mBc5I+cI6pRNRAHxdYO|_*3>%Ci>ys z5cFw7s|lipJR4U@??7RT3=?XlW3CCW1Q(6vDYRYYF5b&n&Wu{;=cmf9q!}%uKHyGR z@oI8I%*X)tSxhVXqFiB?_#P%7G8)S7#{6W}BgTg@NW`SmH7=8NZtQE(Ku?8WJWhA2 z3grw=LsttK+?1a(fgsd|Ze#9P1hLK7J6`tJ6nVA?5q7#rkX%}g=*+69aIt54C+Mus z&zsTsV%mwirN4MldZ2Bbjv;O9g%zLU)SW4wjcXZg$<&}kMM;sFKsP6{CF*ZZq&11( zK0ROz3VFEF?fjmq1p|OVj!rXB(T`Cq<+ss#h>dNQ_bHTUgR9g7Yzr~m3DYr+INy@j zS1UWlQ3bNqbs8LY{8%$4Hc2pkHDE17$^_*#ev@oj8C@Qp0euD(Ce1KEjZenCX}JFB z5H~6i*UL<|MV-oUHH=++9)kvM5#Pu>9`_+zWpx~@NFYP8H6{ZoB`!?ibfX$RMZsyT z>2(XB>v4Otr{-a-$Bl!iHFD3=u6)xwQqi>hj&Vu;S~Yp)WTn<%V>0A{P<6F^1B=Qj ztLR1AE;K|XCtlCanq9{+B~+OiZhq8`fc7~yemfWv94D%bL4^;xlUyb09f#{H!pscZ z^>TZ$ye`E6!m2eN=J!VFaAtu}5K1EpKLJo*tFVf+afHNZr;%dof8!jE=!-RrM8Qw1 zSr(WByS#KXR6cma-Nj*qd0uJL8FidD`hM9u`HoAfbwgaRIbTP3F%i8u-D9Gma9z*X z^JDh>l#TRc{Tq4qX3!GM%Ff1Y_5yDVY@g=<_8%i@^07D(XBI_F&qPugbvDy=yH3LD zZJdRUSd(^KL~T+Wb-5iE2t$9%@#Pwov+Fs6VLvo<&NF+cG1Z{u8PVxKX|s!f8b&ox zXwB|ar(JveXYl9JF8!20*UXTprGBeyh|9*HP?HsnQ9(K`8pTG2*nL?u23%(qYSB`; zg0VGC%6t85Bua-ZOJW{IgH752mjRcm2_!TIN>zyV^(-@_oztuk7jIP(bfWa#&IKAe z^xzCixow}CYiFZ|mm#t=9l^3Wc6^(!4P5|h9i7aTZI(1z>uTQ&qU_p<2m zcudy_bI2sZ7_$*(m>ywR*=%*8jI+d14KV4_dUSP^i7H=lGvmq56=~;6pDrS)riRYtX=f`aei*dsUkgknOZL82Z4>y+ zh{)oQ)E4+`fpo5h{wDA!%}!e*lMc9mt|B?e5PC(9(Mq|=HRHpYT@5FiXVWHFCE(r= z33k`FsLolM6){ysE?TV;_q!Oq%p=@&iDpgO&!wH~q)ED7N~fE4_>K@=FUf$wQ$8G` z=lLV-N-?qPCG1F$1yCf9+X{i&c}l~OO;aQeTp&N4xwuV@N`pX~rht*hY&6`a892~y zGJM(Ly=j_6O6``(4wedQ%qhY}9(EGO4V>0Hn^M+XdlQBdj9^7ot^$&!!>TkM*kOIF zEue9ll|_)v{8V;LE1n}=zks8CjagkC6mFhM)_zV4I67xW<=jBW=&hwF&PCYjuw7G7 zmJ2ONQ9BQ5unn6ymntqb6z>iQ&afKW+P`Dnhb;Zh;}%6N%WJauRLTi2C3F5pn?9p| z@LMR=npN$``B~H98u(|_|J#tk&{>G=O-Q$@vv|41dFDXFwoc0)W*-luj!r%@rT#lh zkW}dFqbp>?mEbdJZ^gSSGvUJxok!Bnqpqwhx11!X_)OY)*r;G8P}%xFrnK0B>$zns z;u`2ft>*LqkXSY8N6aSaJf=1m%5ZFEesV}lTMbSYGzo||4U<_crB8Hz)SqPr$i$BV zRwhz-PyTu~>!w}Pob6rBX;-tSl6Ey}o*2G&O|jpMw99`SsTQE+0(yb2+0sO5*PJ)! zr+HGrajR~%0kA_W6%ve&!O*D_$OmMN}2Z@3=&9=d3zA)8YY$Kjk z+cXOu%{gS2At=;Tlnf^$SPCFxj1SA6~%Nz68rkh5t@}nwAiJcuGJ^G+N z+di>rR2pE@n1)BB%omP0Oh#^cy)WOWD@pmJu!x|#XrtxqLQ0l!=9>=8^gJBn7ERaj0{=QA-laymm5f(%ea={O2PIWi!+<{tC*$pQdOG{X#Y$}0|&}yZSxQ{ zZ@|$EI0hiAv2Tp3=%ZhBF0x;qADL+fylU?FZR`|kD1NTIeLf4wZuo>go-2*HpqcF? zp~#{XB#o(I(U{T6o}nyo-v?%msD{o=p@ zP33Mn?KjVQnc4lrR}j+vDXjG>A3p9)5g6sW6u(#5z!L8Lt?U})QXTcL9M9 z5EVUyg?lD{lZPBw;u4egADWP8a7kd%=a#T#qKk{u;=+JFM6|T4HF8i{AA&)}`33fj zY7f*QLh1`p151#8Svm#GPS3h)A>X1_@*H%fUn(x-_vWmd?1lg}o0N4OHgob(jIx{4 zZil$_{}4Z`^-EOt>tx0-5>n|y*tEDj9btY~_DXRt7MC-X)Rr+dI)Wim5!f46jnzf@v@?~DN@Uhl&~8)<#7odXj4bjR(x*wNhAjCA5YSYzYLPG| zsQL`erF39W98p20ypC2@3@xOh`YblY=rh)JQ*_O4MPj*NEhD5GcKXluXyr} zv;*C`jf$pbdY<(drBM!{kf_XwY}Uy(!8wcZE{(cTukMMIjN(BkzCqSK6bCH?391xU z`&9{>D>AV9CvNc&*;rbNl@|ZldXkY5P9jUBM+?nT780v{Um%?U?2#Igy_%+Bl<$XftB3~U3M zR4$T#W2Y-I#Pf(wF!7%7y%04(>;k8}`w&YY4I|99Nix(k7UviSUR$fDbj4FPhpN1& zq>-bZtyNjJk16dP^`e^?8^{Mvu|axKcWOO7=lnN^$#Mjf8`47)7+6J<1x4Fj9gO#mU|S6>*73_v-Xqm561EiX}ax z*(&5@)(TE%z!?DJ(^=<}v`6uTVa{EJxp)=kas}p?Vr@<;FefD?n=ysdnV&F6y*rMX zV_Kz8W2Iw82xdt($>EBvh)qwDvnw&$A!&6}JV7qbi0-}KqCqu|zgurm5 zQN#8OcGRs@_~yCDo1L8V0A=Abq|v{?sO&v&jzyJ@CGPMtFRgSeH%Fh=KCu;5E1RY7 ztXM1MXCxxnnf6SJtN9U-b!^JR8s%3pQ$|fV~rvrlLN& zga?Bb?49SN&sy4s^4F)E*RWFIys~dTNr^t~aggNAtJBRyJ2lJrViK*b_VhXy7^y?0 zC}~o_fkJTT%HUQOQ`FWlmcaNxm6gT33(WSUn@bq;Z!gH3PH zQTEebRAHe@EWf3{`cGY>E->_)SS}IvqS8+dpo?U9S(nw;k!N|Z>rrwW=jWlzNxo`6 zj+~&0GK#K1dZ$f~txnua9y-eCL#DF4H}8WU0==GrEE& z>*>7G&HE?d(%z=GXr@Fg7znETC%@w?o9tZar+(YaYv2G1zM2CiMzw|`7@Tm(cBpSY zsD%_+-bM`n%|MX4&#T3s)5x_p6cXLuGWc%2x*=9q)rJ5b_@?;enTvqXBr8h|hSdo34R(6#qd@P_d z$wLOt*giQ$9%yw@nrOpIc1!2q#k#wU0*Rt0UZftwNY{)jYY1IwvCGsE$yopyXnd1n zO_}kC1;3ljpipS+L>cvbL!JV2|5c&jt7I|J5IG$fLPlmRpS}Vtr*H=1 zXj*miDPtDHYUz(yO$H*pwtvqjfh7Fhhs;nkqi3#3p7hW{#9K27XFLH7KV|%*ag`q5 ze&YkPsu8}nLem;J$et3~ul%g`ye_jEMcKBP(6Kv%C?%N6A_BvO@CIaa<}71ntP%JI zK2~7w@%g49BxfhRD)hF}oir4njnB~Rc-W>t*|9Yf0!I&vYA(%#6qST(YP0u+7p#*j z+5Fh%OV-IW;U_6WgnqZF zaw3@qT!OGgt=8U5CTTwd$A2bsCqunWENI@5iAOd&v7=SBzvVC++qu<>|{ z7s{gW#l$n*p{hZl229JTs!-@tbVeWu$A0MvJrPAWs=FU$oEEGtggf1GR_R)Aq_mcO z0)uSJxiZm~aW7@+ep2>5RAUCS#LFo z*gB1Np7wMFLV2qtYdUA^j0~4;EVp39_Noqd$-}`d&MZ7KUL8uyr{~ zgeXh|a5bHcgr=ukSC|qroG7qw?rLLAy0sM_#DD8b3(@{MNVZ^aQgJZ*(GTsk7Q^ZC zwMy5`Iviy_c8&_s2~Ly%;MP^7X+CQ99x(Ws{y62LnDD?SfYawUTp0i|W0mecA zbL zzS`7#6_mEd8`VGY$uymbHAFn3Z`Hh7EMc`T(h6VFv%`knqa6LLMiw#3>g(U9gfcS} zvlh|GTuM2*GW)u0ss?3UX+?X?+-+tggz|^ftb((!=A|8%wr#h}9SDvYmNT+|f#;F9 zXfbCIh|A$XV~WbnKqHI-jDXSuvT!3UPFp#PSeGI|y{m=Io(fkeyaTO1I<1_Dx~AT} zS8(B~giX^}x#P4*Z)@7yT6Xc7-!-$;$&X=e6hg^bt&(>|ex;AWg& zn!N_HtQY#Q!ki}H6;P;13An2Hb(Nd|p>YPXE5JjR)ILWWGtQZjE;ccP5w5m&i^x|W zvUc6O_v88NLLAAZ*l9K6pw)#&f>|R8*=Bi`S;E(op`^_GjBX2=jfLIeQ?}%?wjx71 z?sQa3hM9u7^35SGrI`sowr+cs;uKTM=E^ z-KNIpv9k;-63I}p^HporTueonIci{Yvyk;pLm?fVPq6qy)u+AVQuUhWvH2!cLqR6M z=mLdehgOyZZ@jd{2P|i$s;_14Tf;TBxjrZJUb~n?0`qrr8a9i}FsgSi$4w^{@{{q? z5iC3MHeKZ$U1a_8=we=J?+7zG62Z|WnG-Vz{#4eXby0_debCT*SXTI?OkrWGw(x!F zbh`26bl}O^wD+v(?lWbsoe^SGyD7{w$KE|gZ`mvzWu2Jhg;Xcn@Sder6ozcQ8tihT zlXZT4Ls|W&!}S%gcd(A1R)KGj+&a{(7Py_MZx_ygp$*fFo=27@Y5I0 z-9un~+mNC7%ZlH<%`A0>Ay3%6udeKO>-@27<}*a=ty=t)U2*2#~f=vvUOQcOP zr>teG@O?+>`HN1LKnQLv)3@Ge^G4skN{(1@#W9;kn3Qe!pw5n%%z8XhnUxI#Gpd|X zqs&h|F^lUY7=LJZlyc{pn*Sx5Nt5xIQz%c^vPt)wn0bkLQzsdnHdWO91*22t?LTEZ zp<*F@%-UzOm3^b-rX&tIZ~I)>RL^EG^^GuBdWNY&$sl|u}_Budz<{!S-ZA9{G9r162o~cp7O1p;+|U>AZ{Ba z2oe(3V|e=y?B`g0W39oGF#oH9sXvN|a_iIhf$k4=X3}6+f$zrU1?OzJBy3C5F{Rcf@e-miUvTB*q z`ZsAI)n$K^HD3uRKNIQ4O*?5#^Kn;L%HRz&15KPrkMp5~_%9?wxfY;EC-EB`cI>pPTvSuwjF2L+WLdjV1n-{o5AM-!~3M4x1F>r0xShP zTdvKMRw~V`dcu4tRuFfeXH1K2-%Gj86!^B&8qH_ZKmBJ@e#OTh$v2kwzZrK|2Btlm z_VZgAW_fJYs$v*akcwj{z-GDrRu#iw94z*EFUMMh(*e)=SI1#Q|C+Rajd!=cA5`6| zsf7M#RRR62?r8OUdJ4J+q;MPByMKA$*0#$qaJf+#@(nLDiLAHo*GXR4-gJxfbwxE_uR9QoS99Utdh)Z z$1XCN30-vmS!b@q?FmHW35;6PaNZSqPuqXmM3bFD5O+DV%=#}|%J-z&55sK%EIBh- zuaLz(Y}4c0xXj*jR{*+-+n1&{bbql*`t?=7shV1e9!gF4(cy?k~}oQr53H6>k1n(rS6zE9ml4uw=Q0fo{5; z_3l81wH&P*ipI8sZ_qK5aLNk+iI-Bp`e`M4)|AQTNmPIl_;wB>LqL`UqZTiX3kmoL zgra69D_%;3@(+xEFhA3Pl2&E26jJAhPKa|%j9{Zz`kW8kPC51Af0xx_pV8%-+52HO zBrAzf#H?V}Y6j-Ak6FI2Ni+6JqeoH5fw{W1;57p)lit(5&TL~K)Qgr@drwkZF&&*y zEouMZO~Fbh2*d{w5Sbu!!tFKl;l8SLdz%_`hsrA@=1tx~4k^$k0yfK*MyHc%8l{5r zX+?Sn#*20$i)}Bc9B8-)VL#xs3=F2*doeY>A#uzxc6ANtLOwXVo~MqA0HcR(wc}X-%HSMNHlbp4v7Oc>CIK6zZ$`w_-Sl zp3xghHWwU`A{j>}3iwv?-eX7~ zn^S|PWwUkIJP_aB@{W^*jZp$wNGcVi%?9qzUSpbB8-}Cy_lGztm05c1`QW$xoHT{9 zD;=MkjmaqOcFIRgJUj)Sp%fOGtg<>MFdU;*po1E->1aixQ^P(Tn4tzUFm5`$WW=er zv$fPf$VjSPM{#^6B|M-R4C@s|r8buhpeEF7+z@6-;i!I$tW6o7yk)`!tcQhPSWpg| z3Xs`gvjLG%+mtFw!JDZwaJW31GjOB=K3V}EtALLitWngCL>6~CcuB*N9aH4s{!A+5 zjO+~vNO#PJm@hKY>q5GlydPxC`R!Tt44m^~7t$Tg+KLXXJLaeW7Khylfve@HVs2lT zjL?B|fn#hs=f^3Lcx*O@SZJhRoS?<>)(Ay=XE?@Xo31&{c@vH~Nglo80OBBi zuvxlqM`*x^QG^QBc1k#0`75^ukU_?kHmxZ`27l?PWE&c=-FDNvjphwW*1#K?^%oM8I7)^;c7rX z^G8o-6PlKHX|SO*SmEq#DD|36I%Zq!$4)D?ASBIJNoO1r#6hib%obM0&Iw+>hHWig zBh2Wm$Ig(pT)&2&%?qol(0UU*K)jB@_t=G5Om=x~;cwHL>Da||jM35hHH;*g>g}aR z5*0g>2~-%W=4w>^1e6-^PHSDxSyk%JCJz$2Z((Lnh$MAX8c_*aY{^x!RFX}R6-yc` zaENBD1m;XgKRPCCMg*x1MU_vP4#zA`?vKWUacyl@`9bDd&<7*h^Yb|+Vu16tc9wZqH<&|*i`?n zDIU<9o6^}e&C)5cjRuFcPV3Qk%`kjlYoqX?Nilt;%Gy<9$a$XDMC5`ikeY!)(-KF7 z?po;Hp`g0#!)*Qq z%|P09sKR?hyF_)KKjTGdNovO5E)#!jBC8BLRk-U!F!FYtwB*`nS@}#j2~ z?WkEz%FYUJ7St}2ax>+3osXdr7-R3n3XItUyDkZ%uimJu8&{y+^_79>Vbk4H^r;w8 zv%ArPci6VQ-80Go-PYdSROvmt(%VuFLNB4{xXfg$w0F>>`+|1eCqj15U8c1bmnrp6 z>-SZRiELQZJ`0m58=aMy!a@0Aft<1=ZStVRk$>qpIDDjo`j6 z^Ij^4adG!D1Fgs_EXeMK$ino7-P(C61fO13imS`v)>ydV3utnuhSLp}z}n!U&EYyB zp^-p;BXw`S)(CKLZZ+LauR=LwHPCZFJJSfo&B(7byWv3J#I6)RYV2;V#ctcfy_I{U zMb_IaFkMb@^Gx)>?vk=2m9H{>)i~A$#y3Mn+a4I;sfLBR*mcM{0Eb0mgB3E>f|YU! zfG{jbr@IfJXs%3L{hcjvK~4V|^`8XqZcvA27dO9HKRw-j21_63u71|(uW_)@8~sj)V<1Yi++aa2AuU&`H(P4 z53!?$X3KTG$8S#NX_^N1ga$W+3erSL3Q&O_UKP;8t1N{!jr4}vZmyz^k(!H?AFx> z%1k#txdfNYZXl?(hM282)94wW#{OOMitHK2xG~Pfck~)s7dRK+tn<*>i*VBh$N=qm zcwL+(8g|aGooKl9w$K=yJ0^othI~KjRWOp!;H#!F?%HIiWDe6N#50E}5*%VyMJzDl z`|wAGGFhh+4B$4_m4}9W#EU(s4966pN2mD(*3h zdz`ois52G5TQkQj2+)0&+biF)veNOkz|tv}<7rE`bjq+&4(!p;?fEA-;e}Yyl2GbF z#9H`Z1y|LLpH259_GC{V#otq}G@=!oeV}Nv`OTQ%CuZ(xc9gXt+eg1=u49lNeK(CV z46Ws0lt|_DmM+B;b$jN80uGN^GE`Sq`EEGvSu6}ToGi;d)}OJT-ObHC^9>n9IwI%L zY3x~95enJ+9I9^5eD5pv%m>WO&pq=++MZS;MstB$gBUntA^8Z3GF?|mlVom>%ddf5 z@-$O!kBKrJm?foKAq>b)hV9YGFvE;yz*q+8A_i8Bm{fZy?RhTk{+5M1ka-`>fWrV> z2*>%{Y4l6BMx~F|TVF?SyTMK<(C4+!;?5TvQ}Qq}P13Bj?m1};-D85bM(^=d7a8*IG}u=UnW`+>@m34`l~(usN*7p3ExUBspKR61z4)<5TaW5oitnmwm&c+5nyBaAEO z%YJ^Q4vcP(D;|n}Z;S(W_&{N+im=>mcOlfI* zuI=XPcwCn+X@62f=cAqkrNI)^-TS&yluE%=@f&wB#rfHy(8dF{$OA#zGwi5ChGL?C zz2|mst$4KYuxgxzml|`Ow5RP9+IX7VH0zuAj!iglwDF7`II6Da`}2x<7D?mw%|{sS ziUv*lI0fc=UI($Lig33nc6JQq$6YpFWFNG0ZuCwr3wbFJ)Tm@OVc~nA;Jt|veTFcS zH=#CYrYv1Dyx{0p*HPN1&eo=zRx1N${Jw)ItZV4`LfXQDR7BAJ40jhFOG%5G^Mwq|-o8#h!o8oNI4t<1w*PLg0;+{mW*gAF;C7@-j^2lq49gZK+&w>Y5>}E$re4IZ>F=r&$vwRDOTGG*%5W-33f zu~M1H(qB+=NfMSM1FYq$;Jy`z-$*+BIb*Lhu4X$G?>3z4?4^C)Oi()DUm_9>fPk;QJ}GFBi>u|q$ylJX@PubghK z5F<2aqBCV+C2$f?Oi1yHFj+A|7!@aN;YRf=ovaKK-)Rdcv^+>A$X5nnYkYmqR;e~O z`yC(8K>mJ?{8Gi-iP3vGdjoPcp^VGtZJa=mo2?0+PB+h|!*~|qBa(`*^TOwK!-iVu zX%*i&?KX`}8F^b$^USpEJ;AD#!ls)Shonw$Xg8#GBJDMC*8gnqr{7MZMMLXYIMp zo^AH*vL^#3e0%LV*kqFgzKK$o0+z31VkJ^NK67bLThI}i9c-VWr!@CrzWj;1pWAxa zK)0gFkVmkB>f@FvLmjhJ==jWa+BjZu!Gi8YP=%D%>F3&tyEN216=4hK4MaruGIOyD zQ&tA|ftZuK@^BW?Ewjxz2YVeMpU;jIbI-NsJU3kWM$EN9J8|u{i7gAgM13Rv1-31V zbTxXe;GT;uv~0$7%Tg>uxZACh-9{}YsM-znXDvqsz%=Aa4z5PcY%UW@D!9c-HLh>5 zI@z+$baJbOwuKQNi72!=2Q#NS6@xu}0@z8WE&8~j(Z&^cvBmc>je@!}yjj{? ztyZ?qmR;Ze%UlSkMKc;DvvyhUM>kh?I1=fn-I`%!Ub<8TpZL;oyVCKt&U{**_FS}Z zoS)K9JIp8s!R`Ed`K`{>_E|M-#cb#~TG{i4C|U)`h^l}?dK3EUETB3xpP`9~-%TU2 z1l70daD1TT)yPT*7sF33@}L+O)JPS`8mmWgrCE`hr>SQP2RAD72|lhc7MQ~5xzv(J z9c&$U2H9PHU!{!bQ|NMf9IilB*<3YXWUh_C<&$F`e)800nqcsIn zGW4Z4tM>pMu-Z&-=V&dAZMau(8|NuWk9ApbM`u_s);s7q(zg=V`dCW?(9^K6Q<&=} zAKR~=d3b4+pAkAb$3pV0F`AZc==X8Q=m_II&V((cEibWQ%jn)4q~H29AfRzkF~%dn zw~CE@U7;}C?crJ3SqaEv89v*PRz_K-2Q^4nOor5i;p6fu;NcrXdT6%C-RkcPAA_;I zTBGPNO4Zk^T^rqZTbyGIsX%#&PP=2D`JBC8ThgCl=$>-74ac&+m39}??rqXJY2Oh` zaa;YHG3s27Sl;O4dJ`sFd^U&^Y|b%?!H<4t8v_q+z6#-SZDZq}i;L>a3eS^;!2qW% zw@VnUV)|V_Wr1RZv>)a4R@f0zD#wlqs$Pj+PT1mTb^%5h>$WYvHKF4+CRlsdsrwcZkF6^<5)fNFLW6 ze`AlE?z<8s-%ihKzP64I;4AZ3g`Oc#Wqta6sv9=jveDE$g(u+7K6F$4fP|uoYJ$LwfT8A9bbcoA^0(C2gWrDK+V^ zpe!Y#z>YaF|*5CXsf3 zjh{s&h<<~uum>!kqC_;FUu-7QLp-&~DC}=ddnWOlp_VwH8?1);T&Aq(6b<8nFrt#IWYjAD_0RhREvL$c^|H% zGcekFL#OO8>H9dzr_@zMq;l}^#JuF`ru3lCjyZFD8X?f{Bf`OB6*(I5RArOZ6vLaZ znx{!!)E;b#Zg`%?{7}^_j(Mp{UoD`-jB$*r#O*3Br#G7;ZQ+6y7gMdX8y{$0gKiSB zIhdcR1t#&PX*{b6$r{}ZHgaljT}#^X7UP$D`0#fvBP zbw9?2QS?PXJB~@~vDt?Hunf4t3(UA=YFUP3C=6Nybwl4{ns|bTk}iibMWRW0LwRtk z7<9WO@4+?Tj+~;}G_)!E;|2MmRF!$bD9y6K!$zfpmt#Xx1%^iG)tYT6)XoS}Sf5!a z6LQTs5qwq6s%g-#QfVe46@qhR4lZ34LLq%hQe2Wk{?n`k*a0QRT$(>9^{T@SdybK- z$yZ9}75Sy>XH$_CqGBDx`q`lgde2bFSrvuW21_dfW#nnhIMGLai%rT9+~p#Oo(-Kd zoO5W{>%%1T4OTqJ(0GEopp8R_l&*!AB&?qS0VHjc8Y^s!(*B&u9|alT zKfqp^stdWYlG`o|Nqqn z{YV&d$gG(KUS-omt!A6DbvNC)1TVr+OfF#YU=>AAcdp3%k#J{do0WzYH_Q{O0jk_4 zIuQA=dG~2n<={#$ZuKX!QPHyNOOO&~eBYdzG3@{3=L{N}mktH(b)}k)tuzMq5GI2j zuguu{;&7nUmX@5}%6#Z|ORGG~J;%~L$13V%Ue-D*!&_FN^hDIOTe| zk}N);mX%q7XbVxMIgLw2pN-nuYq#ugx&hv^IbvwR{g|W#&d62q^+68p$zB;1kH{ z`mAG$`-6k@)242>LSGetO~OuIUzcWTnHCdoUNe~TGkfP%gQQH}w%qF}q`NRAm~7^e z?O?WyD&1u-bpTjYtHtz+5L_!QYQ%Bzq{62H%vjC+dXaP+bHt3X^((@ArBM+S-G(ge zlji3=^H36UlGfO@w9G&2cY-e-`jyJ8!ybZf6TIDGf?w9VOz<*3X^|p};n{eqJ~DsW zwBK#AfQAwctz6#3g`g-29c0WJRcV^nnhsutCvup2~UTnVW{iMUJp|q z`{|kiGPB-L<5TLLpG__isiLwqDmBabxJw16%PaZBxMfHqMuyRWjCmSwx>4OMJKVf0 z{6g%J?5$>MGnqqtz&0Dk`Xv3XBTX8?49#d5I+iu&>%9l1RIJk?Gkskc{_Dhcw~YkS`Z9FR+!3W$%hDp$&|o^ zB;q*!INoo3)f~isC$bzkYj<;Ag&NtbE*9>aMFy?;iCvdnxSL-i>Kv(VI-~Ykn!Iyn zc=l}v)1L2;8miN5qpZ8i*dTqOCL(rtJDoQn5A*QMCwi2l@ufvFztYz^-~xsiMrOzc zmjRw-s^aaQH_OCoQM!A6!%W)+M7v@S5S7>ST}g#h&JxB|eO*Q!e7A|dp(W|=C5{1g zyXg>jr@I&O)AW_}2>H=%87dgWYpm1T%{3>OMoMP6h0MbE9EII1kDk6R;iK;s?A1HO zuuP(73Gwl5ja~o59?@&l)tsX6=)~1?Pan76qSidZQ}d zc6@D~u=6XR#98FPr+jQ87jw$C{c4QCZZX)4Kb3DB8Cqpyys0VsQ^jjnC#yYoI|LDO zA6jkx+WGf<8=E-{=*o6=3>{%7d6tIlCIAzXw6(k;pJutyr1nU|%pBX%Gi|0@mNh*F zf$6ZWiME_fHiw^exgTDqz@~$T*HQn2+8)lfaRkSU4Nq*=P$q{v3;7>A2l|F~L?Bg17v9Q#{8Y+F!Ji4UeSb%|@cd z8Xh%fX%-Y2HdvOB3G?u1IuvShI7x>k>rUWUI=JkE`job5K-Y8XqFR&M)4RQ>Mq zXBZ9=Cg#JdFW(1bh2THp4=)m#6%%zVd5&BdVEu7<#0X%??0;<9n?wi z$h4)8dyyhcmEh%+Qb^lNF+4_IsOuGT*fkAWRJ73vC+JWXA}J8R#S9KzI~3>iwc^DmJWD}~xhtnZ$M(4|@PdOz_j1HYM>2|3(9MPIGHJw46?x#YZshM3D^~3a~ zWuyY%YN{GNFhzqJKD}mw0645moGcG*2S|sHro(e2sKef@t~bJurNi^mCk;K{!rJ8a z@NrLNct$$xO}t)%ra%KpfY&g}LLnaPD`&rfon9(6N;mJBqTS`s_ev>xjg*?-B|=M! zB7I@B=HA2W;ybpybeMswWK!=qcD$}a6A%e6v@yxG zYX8AkTJ|oJCwh+r?72|GK)_<2{urZC6(PB87NPB$+j z4z*}~;?}*Dk+g+mF1y^dGVRtD78WND$)m5A8(>#^rLeBdE`^s#z|eAc@hSE|0U653emu^1>{=>Q-3+1K%Q60~)@?s`x_c$; zvWU(#BWL&16Kr#9WxG!{*!cuVHrd(j9ZsVPx?A&CI-iI&#Zf$;dD$~9&@Y{O;A6#?8U0?f?um3^9zg$wA zeBe+2;2o20!SQcZZ%wXGk}AOaa!K-heUdcHNs^DvPm)dZlB8IZBtO%XBxkFWWY$a% zHyl4I==i6TP>0JR9gMBsUQ54gA$5_wf{^h2#fcuQFUAd2jSx38c7%WHr#I_$wr%(f4XJu!e$=4PM5qYlmGFO)+MXKt>v#S=?T7*liffr zR|g|>EJA-9p^Fi!dvBJ<3?R`rIeC4+6_PJUNqhjDbK^Y`S{b2_0;%@vl3$Ft=YX82 z#RzQz63y2qyMca>zw48)N9b&T>XLr}^0-w?9lAc52IMj32BypPK)C%-T{_2w5JY9-^7s&JY3Xt>pB#_J186dB%e+Cluh2%#- zu6=5LHj8mhgr)_kkjw&7+(Po;JCfu!TyM{nDP0_V>yk%8jJo8*5%;kO6(h6*$XoJn zMd%NKyc~ZTq0ZR$|7XN~6UfVU;R6}}&P3eb_ql8ol2^c0FB6CUJk;;)$xPg@=kNAp zL4+QN(0d~EXoNlzpt|IjfIQz%2k6$M7f7{VmwYbzz5wLq_(p`j3nc!f$q#|1J|d`z zr$cu}=p7MyBtokq^oa;{MyM2_&qnC?BJ|}5eKSH2B4;n*N|UOe%P5!*^H} zi@1+Q=#vo|jL`ED`n?GKS%B)27lE9A-v&CzUtRK_JY5dz-k0Ih2+fGlY#a2>m>eVx-B_K;D}^8*p{Wh8S)~gnlbP zcP58`yc~ZCByDkL@>0b8I6{q&X5sFP(1Q{BP=K(9fYfFR$+`fg$uN*pwHL@sbRa-? zCVv4W3JS@0fxNx_F!&ads`tBoDJ0V(G&@2I0#uj03&>Mm1|*GHNS*|8ef4yN)&<`* z*#P9)aSTXt)8w-ew?E>3KjOX&;jb?FEYCv*9SgWZ@;5*#(FbZW-C0Qf9-PO$1mx+}tjKEN+6XlPxz%@1 z#629Lk4E2~h}#~a--*5_BJS@alsuN@c724JBlM04eIP=gh)^j)pO4U=Md+Im`iBTr zeK0F;3M6j4JNE`4{d;%ro&eP)?*tMz>XKy<`Y@1U+@3rI^m^p<_T&>lpXTrOq$ff< zBJ>9lIufD(6`^lO=zj+&P5uo?8l*1y8FH6hQb_7QRAYVKt;uvC@9k$ts5wFlBJ{2Z zeI!D^5~0sTXlsO?kI?T#=!FRVMTGt~KsP4;3?wV##^m24G-+jqOCvNRLbpWd-Uuy> z&^sfvEJ7cO&=Uc=HTfI^Jmfrl(5%(7n`s)b& zKS190{|U(3dG2vf`7dJYsY~XTJiS6P6yk}C&eP9E=(mB~ZvT@26_URUzJ=tkfkXisE<&Gt zrpnq;AsJ_kEi1B+yo|3y*ELidlqNq0ryi$}93P|na)?`iay*23wP+c+zhDe70rWop?oB?* z^OFV*M`#C-`+hz`FGT1sBXlN0{}Q49h|uJp&r<$#+NGyA3!Fo52~Z(16FhXMy+83bvk{5u!#@~I(cX|HMpvI3nbbsj zOFjeSF}46HmHU(b4)jI-?oYlEpt|HGAW1|axd`MEn`d%K?Yu6T8ljtj-1puHEeG;( z-Y>;)pNPfV{{4&48;*4g#r_-JAR=kn`^pkk{Kk1*k4bp3L%X022SU=H~$E zA2UD!x4QzjJmBh*r-8hke+Eb;DkMWd-p)ruxI(fQNLsIu90c;w-JbxR*=MwQ@AeEOHG$7|`7mzqvNVWqx z1^a+h-n!(42>nfjeiXw^{cl;gJAk}xy(>Z=iO^>vv@Jq^5TUO}==(sbnaRn&0r||% zO{=pRn>PVDeM^9x`ql`o1#+5)W4Qg%_fLSFz83?oko*%+?kSb>MxLJX+X7TbmI1ls zJO$+1y9dbg_*@8Am;6zL{uhu_bv8mj1aiBi<`=W{ZUXWV)$NZ~2dZub=k(17a;x;= z2(60HS|H_7NP2)oUm@8FBy025xg>rwK!xP*fL!1I5XjT3{UwLq zl3WWUy>@HzdLX5DS8_LydYnSCC_;|_DV6(@UjTA#@d=<$^H-OQ^7IzEA4qxpd;a%< zy!Ct;$T|M4;9E%k5lAJ{zkm26%{=R0m1dT!rX?2wrq(c3V15i{$_v%Wq@Z)W~ zauY6LYLlCwxs5Py!S$eFUYESx(s?vuZcUipB+ROac|)?qVm%WvcP7h|ai|y!m?U{) z@&UvAW(8)2rSn3J^~U6b#F>`-Rm9w#{JdfQE@IxAJejl+=3>OWE%_Bor{S>Eyde3h zWQ}3wS71J2n4bxlTDZ@^mQwtDz?_-9F!>aiBwFuNk=Jpof4F+UqHuf%kg2h2AkW(64Wupe5Kdy;%8V769Z+N>0x3z&6; z=`_rtfGJk3OnQxD->AU!S$&-gnA&7@@>%C<#H>kvVCm%k*mEydtw}CH!?a{(z}!{! z@#M!A=I(%5mwY_=k0hBrEqN$lTEK{>(~=LwbUvQcBAnBbk4MbfWU^tpV>)Y-YfON* z2TXg_uO(?!J+bx&%qvx&2BUQTFs9R%%&d}Zd_7=llTz~bD$(=pfEh`4C+jTMKgU?l zC;b+t=1;t&Bgym0fYE$Qz|?}-2qsDHikL4Y-!lqlK35fF<6o24v$``ad1nZ7fRa0A zdBB`brdB_-2wB180$R&b61qihXdx(80(RMnGwUhKVViy%m)Kz()%-d zJ`ynRjA1?+FgG)!>88c}^dv^?Ty6Q`Y*&Z=xs{W3= zrX`;bn3r>BsxDZVF9*#2s=u$ATqAD$eT;Rs>PA#QdOl!Y%$=>e$uN1c6c4|b`(D*7 z!`vJ&4_AM`>K04qZ2?o8{6p2Pgh`TjRbXzjSSuptpQ`2>=BbGJ=c>0_I=>z<7pht; zOjpGGpz7U*DFw{_s(-0^k6{kRFc+CbQ@Q>uV*a&ig<-xPG5Opl4D-DT%%=?VpAmC& zZXK8;xd!IC{M?-T4a@7MfZ0!*?6O$*$1rnpLp7@9B>_{co|79f%%c^UQH%AFidbVc zZE(Kp!&zQ)a(gZJk5`2G?HXyVj(~Zk>bBgs4Ko}uZ^(V$Qr;b7-I+UYm_Mw*{BJA8 zS0d)kx&N>*-;9{I}L!|zvMQp5Z!n8KIUzTT3%u2#}A7nd-Nxwqz~8)k6@W`U#Jnx{I>Q_fn8w^s=N>c6-^DOLo%@hs z{yku(=N`;GVVLXxETj3IxnD5Mnom-|3QVz9b^3EL<>k3<3o{hMygxT&m^~GkjfVN{3e1S*{>K5+ zoO^$6i($SVFpF{@&3#@*S@OMrX|H-J_eI0}Yrqt%KM^ofj(SOj`9lly&d1A`KQ_!` z6__tsDc%rb)h3_FeZ_L0A27|i-rPSL=DiWKIrpE2`ACelEmvPBY5BDnW-ND;VM+nB zD7Q0rvtjncFgtU%80KIM^FMNLGtB=TFty44+}jQF&49VT?rXVE*NOB09K(D)*KT1Z zeZ@<O!&IHi{glP}{TS<9?mokOJz`$UwHW3f0_H&SkGVyL`C-7E zPF~Kv-{{dyOv+zvav}E_3v)*Wro%AvBW8N_UshdU5P* zz_eFAS^b!W`Ii{xSA`+W+*U7Xd)3FPTP=)6=qmetFgbcUVT#qiR=vtF=T=oG zGYE(6SH0RWmm=m%fdBN%AIK!X#jR-SS!(Fc)*{sy}U*2P5XW>K*lx zx@7^=Sp6H-zx{tWyAS9nsyA-@ciG)+vMrnJrq@mAJ@g_-5kz_fBE5>JAR<*1WJ8f6 zMUWy@EQk~Z5d@?+0YL;odJ!xj0@4D~rt=_iALtay27vrsYkWpOojlEv>D7igbl-R`->rB*q%d)^)hQ4Ft6K9mH6br27opKB>E6KNfWPK7f1xikf zHA)KY(Z(lWU2lC6HBn0JVuN)N`l-s}yve#0(wJqt6k2;SwJJqFEv>thJj3#>^$XN= zXW4CC1sTBdopl3b1j|0_7RY-_>|(!lhf|KmY?dFaKVf@5QIc=@!Fn7utGMPQiQK~N zO4?daSx-ZbvYfX547sYLrS+`!BIF*+IqRPg+g`d)($8q|v-K}XIhJ3ncd+&b2Dy)# zE(Q@Uxjp?1Vspv;8f6eCYGxb64Ozo-(dvgBV7X#Vg8Zf=WW8byLhiF%x0Zy&e;3}1 z>((-m(k!>E6(KcQ3an2+TCm);Hh^?hvd((f`V3?M%iq@LAY)kWSvx@HvfQ_JgRD|w z7Z0qxT=LA_rbLK;tOFni3=)EzHOLsqUj`Wud0>!|w(nQ0|5#^25?LNwKY)}` za>*)eiy*bRM%ccFG%?5qNC$&#g$y;wF33Ad=q7F32bse)R@*ViawV6nR@+&~MkS+# z&Gv^&p55P*oTi_Ai`N!K-x=|V8%pdVUP+<-T8&*K+u~6Ztz@N0u_d|XtV`yalD3+t zDXhe8D{ZR_DaTUA)(}#irL3(9q`s0wTX|b^NOP77wpNgK+^V8257I*kJu%uky5)ZL zQ<86~YU_rYp-N7Rrc$V8G>QDrE?U|qx))OVnB;5d3${s+pA0e?a?T(#-12^LRf%1^ zV0$0yy35kbHXGvqUhA3O6|v2SWV5_v`xsKoAd9iC<|G~HM~IhgE8Ox9@+SS?MEWVP zylh*AR;!iRMIYNbY|loPezr}hIbe{jsQH!T0sYXcW7`g_tM~z{s7gQdT~*so$cqNq z1sPW%*iNHnGs*Y#V;67P&SOS7exQ2_{n$mm z?GmJ&lCPsi*{-8iUnSFRqiuH~6AW?>tv*%qP1I=HL)2_gvd}ihW~VRT`ouAVI3Tx3 zA`Z&6kFhx+PtpH{#RGYcWvtB)d5LA5EdespAjuwirpzSyjD8NBo*nW!1AuGvPaI$T>8Im^kWxOZMC^Z zN`Ymn?J3mAryZ?kx~&D))t8nJMXTwyT*$$f!ZOF!7Olo{&6l>Z9(nG}P$I;awsB~+ z)KD`XvYBO#?LG8!kY$@~Bew9Ak^;*%+a~nqubIw)(>A`Z<=J(3k@;b{6TPkEK%Pm_beR)TSPn6_a z?%B$F<+0enHIGPSKl_zzwf$qO1i7qakIiPU1+g9u?^mR~F2v8`v^Pf2#aO)d7Le)& zX#>eKNN2A+UN0%3?~&VIfV^&y-dNW}L#v^X>b=9;6JyVZ%u_X|BVz4uLvFtuu1T=Z zfPBUMq}UficCn<{KZcxP$+oY6JYp$kUjy+U3HMyWz7+m!6I*RcNzIm|UR>=z*gEH&*{AeNuBZLTF++EeIj z`#uq`#4d8}8IaN}t?fl2wOI1(B_OkN!~5RWUIx;Pd+uzn59!IRy4V{)hO_jrH-XGy z>1A&YS;8{HJ`}Q+WrBTTw4A+rSti=2pyrrC=0kpGdC$HC@{nbg{R>F+(ePd@vTsAr z6E|dAl+HMu{(V@D_J(%b9{1}CmEy`-m#MNL^l zO*2RxmIL+{kUWF5hV*4QXm1M{&vL}x0Wy!}CwnKz5|$J89@x`uB-*{{q`g;+yvO~j zq`-30{t9X$PlRjE*k6YfC3%8=?Bb054fOmB%Q^d7kmp%0*hAR&5lV!(WFG~YW{}Zn zwTN3?vcHXWeaZ5NeF9{IK_){EvRt-LK|jB-T(!Rs`J3gseIdkgGQ1bp?H@xD46+DY zSV4&p*X@fT^$hYQq`5&hL3$WubBw%O{oG4iSH9)CeJ9p6$!k$#cvs0_)ygg&*^i>t zJ4*8DFCQL5tM|F4s1)k?uTkNiD@8oSXe{NL>Lha3ZBimcb^7;c@+>%RsELC7X%J7W zZ1sR!)r^RRxKC;85~5~=KQ=`D1eDlG(jmnSQZiPagB4kxh^UEmHBfRo;)#gbsAHg$+t9!=!%-S$>HPPOvzeq z)hwbnYId+Rj~Ih(K4g#ykjpH&5!2A>u0dv?Mqd52Go@9;JjexlPezkA5lgX!zSElI zTb_$pftqwBcF~?hj$v_@juERN6-l%+w^PK1Sb64lQc_^)6tN988Lt zN54F#p0nXr>mrUo3bXtW@e`y9%fW~f*uq9igg6*+9yRR^HNQY!W;qsd3o^(ce?!KQ zX!GY-gb2v_vtCJozGYUC2z9TM^GdzF;YcXpVk% zu-uJk6OeQ4h!Xm)WJDh1l0n*{pF%%}_w;T=XGpS=za94@dO?bC&BKU3kSACkMf8U> zViAsEkd7>c9QoM7zAR41JE)P@4Q-sAj`wJsec~;uk^k9++wneHO()Tgpx3bgM{t9Z z0*lx232J`fni$6l^lU$G6TGS478 zAZrcsEo8qz_F%s*up~KtK+URmwJo%ZG{<4cL#_!r&Z1TH1+At|WD&=&kkU%*qNw9{ zNCPDkBP%-oMnB!Trjp}6j{7JjbZ4aB-MNs)cdYT7BOCF(dTK>Bb^9Y;m9dW)s5qbg*U zL8_zGa)Z=@Y-efX=nFZ-($4WF(XdEGHe)A=g<>JLW(lE{3<~tYaZ0mE~v0rx>3KB-(Mm;8>3R zYOAEca>20*H6ys@H^(N7&q9(l^kWylIkv*o}1^<(i9*@6pdimOmXQ z(9b=C`~mUO2M$`#R~_Sk8AYC=+2?mM1LkaMFd%LB(# z339HsVX;QGK&w4;#g_YZ&}oZo1$jl)1f0o{{m{=yB|D>1B1fQRF87lX8Nz;jt%QDa zL*y994ugzGt0UYhE%HOi8J1wA{4D}Lag(KJg_Qd|F%Tm;oVi_H|22!16Y~&Ui z4I$RhJCm}Xe9PF#U8rfoHIqqX%`UE)9QiG3I&#f45;;Dv8RP(JhOc@-oZu$diyaSx!ctfy`hzA9(|^kmc9NJCIc@7b71*wy<1^q<^$T$Knvn zpOH4mFD&$zU?KNeu0}c`{%hKv4s-q$>4oHw)TbZ2xDgo#xi*l#*-7$AUjD;`JY`_qe>*pnXryTyUW<4N+!#@=PybMEcU4KsEPh7ToV~p6FpZZ z(T;m$R4qtT7FX0$$qQ*6JxGSpj}V@yCa9UJ#LlveB|54lYWA|kMCC!wv&2Sq!d~1` zGRB$^)dTDDUJtJ;A*vUos6qNcsu^T3dTyfRpfe$AM6x`aIx4Y?gs73&_t#i5qTWNR z5iG@`WLbW6bLd+=w3T*ICTb}pV?tQUN3B86i@BdFQJYb-SxGJNMAR0@ zA+C8MY8ynJaazx{qxPepU#Uhrf_0*f;Rt$eXi{LQ6LkhPRh8I9{isXmr`Bxx6qr=X zWyrl(!tzwqbx2=YuGKV(dO#yjugH`vu{Vi|N|Ez9nOilB@odY2ASt>h+LbkJ1b&g1rNAMy`b>|qY-BJ)FivGnm&E3;ve+W*|{Dyo;zXb?%WDVX6ftPhE^q%j25ps_d)6yqm7_~wQ8 zbiUJ;E|1_{u36~xK&IU*q{e5VGX~cl1JMO1hk@6_nI*FLb7% zRV!}wp);5+=ls)Z?fI4uokh^9m#S&$SgK?=w_4^bhJGfqEO(YbtK|kM3E8dWM8pbb z4&+y^S>ddJer~gT<*bGp``_ArJ?~rXtPM#~($cri*#J^qiCwI7HbOt`ST;DDLI$&J zbmpSfy9Q|k`OqNGLE6m^kLoUGPsn;z^IOFC&Owk9-0COiaL5fMuSA@6PJ}q_h5I?@ zoCZl^`OWzOq_mQjzTcf6LZ0TDOU^|&I&GEYTmEz|$9}!aHP=ZN(iLR168fyoxdJlN zAS==HLPM)nkk6I;7ID+L7P5zH?m4$Y&T`Ft=T68SgY1Sx-w*Gp#dQ#ptfaNi<~jkX ztfZwc!gU7HR!LiubC5w?6Xp5^GDk^AUzF=N$d_E>bX~-r9#kTP)Aa{x&MJA)=XCuE zu{_YWu%9o+bpw*9q@~aAx&x`I#4h}C6X$vW8LniYkG_YRAqXR()OaI zZ=kCWq=u5xoe?{V6_=?&L($O2W< z$2Yc?@eV{zH;TDrjC-9zBR52kS+$Plqu(G$RJfv^MOHXK)x}^6Oh9!YhAS=*9=kz z;FuD+eF?vQ3mTKe|7dSg^W+-k4u74$RJP}3K!)^b04UHu`)xaO#9IOH+c9CeL= zWLU%FbJ{f?^0boHzSFLEu&&NZ+WOA9CPRiO>FB%QdJnB8v;5|o1^G}(Ki?(SJjiM# z1AUiWA3_c&dEIx_wFvUN61(`z^%>+o%MI5uNQ^B!hPPa+A;nm3yVgSFbGUX^-goVU z)K)d)?GIgLf^x35=2nH=wSsa!KW~uQs2R=Ta5sR=XK}h4LDsXl+>O!Ceipa8FKXm_ zdfN8*+yf!Ma7~PRXi%O7H%Z)f8$B(@xZi|4vy^@p0VL5Kf@IVGX%ci#B@v>sl6*@M z_w1m&hBx4vG9lF9bs5!|smE0R47Ywosa@!!^LaY(mehE>@y&IBYkUfyH1~~|+W{{(hMg}r}?l5eT)c0x9@ zw1oJ?k4o&KwUR3=?c6?UMgNk^5kATt+ox-2n0?%LsQP$Rw7L?xv81ETi1bA%RBD&kUK0B-5nvGsPLXnad(BB=i~LRyE~)^*GzTy zgw$l2>Fy1AmSvXv6-ZB(_ua3O(04_YN&?RF?qd*owXJ&o(;by9M^!%CXzRM>4rI&mS*B|4S#P=HAlsGH5(Vz0 zY&oh&xSs-d3Tn#n7~XT2f}G)+`|k3P8!Qjql^|YMc8AuIt;9%O<++Cru(Ss9(==?q!SlIrP>(b&wb(mlOU^MjIs-gM84+46pRog~I> z6D@t|p5ACxf&Q-{{n$mi=M}W-PX9MlNk0<$ee+84E!mzo(a%aH52K5d$Wh&`q?Rb| z8IGE>hMEzOdrIt7lMhMogx6KdGbUT!^~x%dX#%9FK_)^v{73p5WGZSV8e|66^|2B= z_53OJeJe|O&ob2fY>+Q78dq2L!RN9 z+MYd-_DWj%YJ0xJx?WS#)%T3&IBKSFt7e{Gu+8o1GX?GF&(uqWS z=XRoJeqs5}?Pw(hmWiH^QL~(Drg*+U&j(0O&=38aYtPEU3kCgqY9&HU^K67XG{`21 zhkj9_Y$aX@}b93L>`Nm zxt~uxF-7FQ5969;B=T5HHi#dxaFVvJ>%Qfllp=Dje!w+fd1|0$CCge*3&<{(b)LK; zR$BWh68Ya4>qbvE5})`}iCt{;^n_SqwHmwF;^_s6XZhaqauI8ge)kB=0Z$+FTwci- z>k-cYv}(XLM?6Cy?O9HG-Z1rZ)-wz>uX4>r&)bkOESEgvOg;bUnE;u~HCH^7Og&%q zyo;KZTyw)S!&Gz2GpmS|Ms*k06nN&K)hU)co_VHLe|r|7<~rBh_k0M6@Q26nk>_KG zKF*Iliy-M-Q^>oxh=Y#KJ$hD`|K(fk-X*B1#5H~?w1tgX0^Vh&?Md~1Q-ppmm!Y35 z@3tZyI?8#fRe_}piLB|VB;QibyBq5oz&%$YaZ#&r+^Vv7uW4OXya%Zj{mb78+BT1| zR`VW4KOd-8KNYIxJqB6HJy-Ldfao)!hW8X?7uVGCo`LAw^Q8A2_FjTS1j0wBnfEdzm8FIE3Zw$dv)*fvMl5;W>!#6Y=e>!V&Ro;M zTTo;Sjo~1cj^4XCf`87`MvVUbviBic>09`c_Yq_iw|d$87&4osx7Ski-{)W-uNAU_ zYx;R3i^|!uj-|iXRaBnuyIBT#-H@{^gT2v^+bpkpW6-lZE<9pGz5b$h>N%d}O>aC} zRbY9`n`YX=5#9{cG~$|(-fW0|R*v!(fpq4YG2Y^kK`djvr63bo#(T>`^!=LPEf4va zYu@ozfaphOqPLQ13nzK2pynHHHO>13QMOcLL;Ht~uhJ1ewip)cY<(KP!)W--CR_H7C6@ zA^QFFw0AbvzKmNP*a@o5Ca+Kw|cNO;iiju*_?|CK z_;@|=?m(+JmdD=jAlWP;`UF~4VJQ@S64IC@D*6JX1B*BMGUOE&fAmerD3+w?`&id3 zB_oRmqYD+2^Jgj71f%UHDIFaR*~~RnqmxWE4WqM){rj5vY;|3_Z?k4*lLEc=h_`H%eeA1Ne%eIfm)ZI3)& z`csqK=6{d;gy`om8X2k;J*!7|!oF8!c{jQXqyfv+=pMzK)N?Cd*No_wO)@*W4|?vz ztrkZ2g$!f)G!Bsm8KDdX8!B-$&0wO>?d}9{m~Qd6pB=%OLumo{at+qVMUs z=#{4N`73%Aj^G>I&tK7Bqtz@W1(xg48zIYC{)yfU*~+bKzOCrzD2v^<-Lw}D-!8Pe z#QnH^`yl$$V6yLfQ>#?pA(N#0j-b^&URS2?n5m|S?`M+~^ZjCyGQP{`Cn+_2UR3oJ zKpODf>Pg>Si2ll@uJ0a1eqW~!Ots{&cX`!&;74Wd6kzwfJI>SvCxmPzLM>X>AKuRi+uhPUt| zUn5h^m%hfR`I&3h`&vP6uzc@p1M$dT)k^=-?>X^32hsQRS6@4bz89B#9U;ZI)n#92 zNIjO@zOE4c70@GJcZmK9$P)8BM1QqaDCPyzURYyZL`_HTIU=Tysm2-87d3rV4gDL# znAaeqSv)ZVOs#w|gG>^LdBY^}F~iZ%9A10jn2C_jS*pcMhU{ml6Z0;C z&-0UGmO}<{&D5BckZCNlV^%@FVEG_sHDnXZqL{BC`Wd$*W*ua|sPOTjmC+X-Kc5AHK$^}gS2P) zC1yXQKg*?<1CV!EuErdMEM>VB^P_294`Pm>W~-{P3w!K2$YB?KpH*x1Xc(O=OA zVy{B};B}?MUN^NW9D5Trmdx<@6pOtBNmF7M1-VvEOCs5Nm~e%F-p)UgF=^=iadn)aX5rjtxTeSJ`7?vmx75KXx%TwkYHn z%Y@hxkgF^+VsjwYptkRJF)OwbB#Gty*s73nEVE;4KpL>jiLC|cz%ne%NXdsx=Qwksi@pU<*<9oxY)V(Vf%qm_PMd=uNvBpYIT zK=eE8#@L<^{po#E?2D$JH^;t=nyb9_y|IHK&aChl9*!LW(cf!28#^A7#Wm+*C!**2 zEPupKH?8YR?E9vE?!_*K=ud+WVwXUgaX$}Zmznyp`oA(sgnz9`qW#;@kADA3@P7yC zsd_H3B>MN8TBZ39phmxH1^tI1qq$X<|0h$c;{Ic((Vt|>_|KSX%KFctW-jkndH)4d zO;!J8)NJ6I>i(;c?^vGn7ijC^=dlLCA&&<*{fq&zG2R!{p2mHhWP*v#)T)wJ+? zAt!iUZT#^NeZSiK(@m{9_%k7wxK($53CLrXp8gz&H#-}#-c5%%&{&5if zj=$MI0dkUSw)!VRuCwg&Pli|vhwlaZ{O^(o{tIRKmc#yOrnzyFM80Az&aKY)XQ7|! zO6=mCe-5N2%X$AiQ$H8{3s9p!WB=~|7}ASdUG#qn8N+hTzXCE>NrB}r|Cgqo3;bW9 zMxPsZ{9mI+pBs1m>md5vxaZ#h(dWhk|K^hN+WQ5s{gHp0XIaHJ^qJ5g zP!giggr@^#s2?F(slCXzJQFByT6;4owD0=ep=F>FM1SZ1*+3PD{yu-JKs87w9-lUW zC$v`lX+^uhlcnT5)IVWqAE=8O{oLsoXhtk-!LuehwZDVd zTr)cEFhn1*F>ybc)-^Wn6l!w0)n{>!Ao{y%tK#gX<+-eXHu_bZ1M(ubS{)Y!d5dLD zoC`9Y3?6@*2eizqd!Y*jEjdXG5+M51#g@1v^rL^mvNbNHw0swRn`%{H z*&dgUR{ETW1bsrE^E=`)(T_gocg1Bx^f|vfu4rj_wK>Pzvp24UX)pH1l{U$NxC$mY z7*`qFqhF1GjH_m<`6;f3X`7G7)kclJ%_rjOK=f@s6;~gkZ}XYBhNhm+#XVz^^KnhF zuDiTnm*etGH8y3T_#lv&8Q2YQ>jVFGXNuuLNpj8Rgs=yKxKN8Y_ z`$>%-ZE96CeiCZBa!rN!IgmG4s>go}(XTeO$q1CBpM(QG7XwzF(ikSA=A%ngYv`_{xxm zEMLS|HLZPJe09|H;F=BbwIKStsXODJgpA{wUGa4xE0oy9f%y6m{jPT`zBxpH1~?v{ zYg+q>_*N!46`zMzyLeq^;@d&av0RDo0J+Ct26?Dz z3M~B+mTEP;Uqcd>LlR19qgr4Yn(&2bUHJ(sO)@Ist1|LgqLOMw|7I;=y=m?5C2TOY znvt-{wDwsETTL~y6Skw~3GR7u!Xb$My{4rJM#}a&yM=Zw^0%hem$CM7w`SS_sW&eG(`6D5ttb7L0KR3UUP#BV- zS`}EN$g7|JQ~(JYp9-!f6h+Va9rmw;5)l0kdn2K=Y3;WX%9-Tvgvus)kWk$uBJoLV z&l9{~g%azTY8;78P@}(B=}K&As&OYiYZ71LbEZA@Cw4%M{wxtl>;%#GG(NE_MBmfI z#2)BJe;Q0qe8IG?)WjE2qrVa_nK%TZzu#Lb@ePRn?q!+8VG#WlP`SjnOg)!R453DU zTCS1!4r=u8+t%mpO-NYLZ{oXw_@fPGo9_RNG3n2QPdVbLM;%ihF_ z5dA9pV`61fKSvU4pk@cR`X#Y3M89tQk=PWi^t0)5VsnUoHeE@~h3IF~wZzuwM}Gpj zp7^@Ql3Di%t5!PJi} z=|$9B<9;HNdPDRlkeH-bOs!&*UPVo0neg2+kksE)lb$pXHA$+*E*d9&XsT(Jw8XTo z7D>w?CAjC7Nnb$pqueoRB}6|9IwgGxd5T+gN&2dsyc4zNwf9Y0gPIpu`X#M{yu~s& zX#->?_cJtU6GZTkmdR15(R+S2*$r98{d7q7 znrfa;_LY}&{*0=zi&v6kA(vVDB`1|1MO*j}OaJ6_^pjFPJo5dMgOG+SuP0|i^ih2) zxd@~y*W@P`gN$Sun_R-QUsIAxp=JTsOiL~Y`I==xat>q<%i`pUke^t-NUjXg$7gMF zRa)v37gUX1Y)!6?8vQP_J-IeSelxi#YHD*ocan2W{a8|3L0WQ+Go_8GCNAYUNLN)u|9UZ{ooQVeDIHLw zKmP<%Izt9?&siy5A^H6GrKe#)jikD77Zs&Yyn$Rd^}Q~E--u{@K~4|0m7RZ4%z zA1s|x20}!I@UiHXG8mGog#OZ5%IgsQdmsZ--hfo#R)bQ8K^k+b(J601x^m6flzhlQ zmMJNtOndrX${5t>cbVBK6HPTAq)bN5IPT}el&KJXCM->P52D{aSEkH>=yUALlvxn{ zsbE#gY{(qmi?34VYW=XRPMK%gp086Dm}Gs*M`-meZ{dcNMG$=px2G&N$)1!Y5Pb^| zq%1S_d?e)y)EwoWPo%7d=ueF2Q@)1SDu$2grIhs$eeE|=HkjmY$|jRMO4(vsyESzi zYN~S25vjW%`Z&j??l$$4nEG9L`Mqxacgm%w?uY2VQ!YF809xsHv=XU@Ao^2Nxzr=3 zb(K#&YFbyN)Z?apYNVbt^;19fETjeR#Z#$2L-a9ho_YbI-yNP!{na!Yty3?erkm== zE}l#M6QYlEm(<&)Ry|YipeDp?@0EJbw66ZC4LBe`;Zq97`=~lAlwHo8~9ZA@)k) zbGcYr9f*EROQ+Q{9lw?L-Y}woA!!HK2CcTqR+z>X|F-_dAKTVplJ+O zrwuWU;o7vf(5f7-{hPFrkj5x6-CV^zjktGfn$tPk$dZ(N)5u>PVjpDZvt* zJ|FTlOH%p=ke)1s(?5jhue(d9e++q>Ys#cAf_%tQHGMH;JIj;lOCb6-H%wm!(eIwk z(m#h>;8xAkS3n9_^3uPA=&uwyr+)>}Un%rTUt=1Le(7sbg+J~m^ zfRs};1(spyyCC{q=I!*|kk(u?HvKzDZwHdz50cA0SI&s7Ag{gMxK-_p z0BZE7i#izzkUre1ent{Rf4{C-MhfIzu4$2x2Kk(&T}B2(zo$H(5rpjHnw}ZiklRY= zYMfC7;;tSZp8*-gA^O#LL`F$S1+EEYl!oZXeOyLaNK3Anl2IP=3d`J#3K0ED`*B7k z$XKpflu-pTUx{6Oo>2{=pF3+a>O#Kcn)Mm=A;(y@XEcH6pZBe#;qaS22%bkp&kat)tnfVp|{bUuHIRQ2Lcdeb7lOUgRD_7^6)YVyS3~x)^vwJk@;l2bnd>0lC&K$aF!LMJ@ygHKh?3xm0a^><`1SV zT$gzWHHW$8o6IASzgTu=9)&n-g=hG8na3geQ`7#;Q;<}yIgoh2e$TuJ8OL%x^AE^EmV(SbAzNAQXI_PzW_g_X7vv_3 zJ$M7+t{pz6&fqQ6i1~sAs431hslh@OXb*`nlgmR(BLv+Pr{o8=^l%Mv3FDWSjKtK?Uf^TE2eBAE_o1vyKOJvq-keW&gEY7SU5dE$f$QlZ1%B>Qz-ZG7I zO4bO}bmxB3vqnM2vy{&o1NnlbYS!3_|9)LrD{DMz^y6M9>s`n`ZdE^P8bp6;YL+z} z@*CH*%$f<&?-yON-iPS#cy!B}11VH5Jb!v+%{T4Wt63kQCY5XYXMGIOpKXR_ErRH; zN`_}GhE(TPZ)Ght^*lOjIgU=Qs-b`Xm9-Mm!ysRxAN@)@HfxospK)2MQ8R$oH6d%Q z){13n)_REkJpX>y2FNt7`5Sz91$Sk`21gY010oV5dTlx0uWF32A&hqHD= z^zW3O$=VAM^}{psLe@Uhe*K#DJ!;}rO@ZZ7){l@JmIql!AT3#}*+(Jzzq9jXABXhh z8ejHFi2fXvoP8QHnrqUs&sHo%SM|9{=&w~~|BM>_PF+0v7sxWMDVhBnWGnYmI{SCX zPb`(QFPZwOnSI%`?@wf3LCr&MRX_VSB>JiFTy2zn2U3EiY4+a`{rcQ0`#z*T*R;-l z2+=8R`qkdIi#Wmkf1WSN*< z1#*(*-Rx?RM=Ue4Ye2FZghzgM_7f)gD7!YK9@nhMt^;Y!vN5|Jq#w)n?59lo^=)=T z)acL8N3z>M-sV<6Wj|+Xbt=0ZYV?2YbtbzbWFEIVpWPX96n+^piN#*H59CvpsKR|A+gZGY`&DWcI!JFYUb$`& ztwQt%aaEFkUPiMR+AuApbCO?q&`e%%WXcgODgA}iQ>CC7Na+??P)wq9my$(Hqx1l2 zC8r-KJ%(MOB>S__?`RdmdPAn-lr(EVNo(7QZ8)dJoQ`n%hf`WaxR=_TI&&IJ$$_;k zP!<%cDS60(;t(adZx*3%X?Xi$#4TFtL)~La$w+YyAu^C^QPO(p%r=^m+@qjaMkxz* zUn;YR4U}Yy9C4abQA!oX6}7aYc+ANcsr6D(6j4bZ=b)%YRth~g=|N5>R5I3GBI}L1Yn*O!`bQ;W3%65< zSJ5KCDTPyEm5eQ_kPSeKTAZFz$yg`1c?jxqX{k&W(Vmh#<`xk?S{Cs#nKtk9IW3^{ zChE3P3L#ylG@6oC#JcD&_aS9)Do<%DtO=#LXwi+5*2^GDvX>Y!h0-EQRm4h4a=lf= z8crKHZRPYGr&FA+s1&5%8XR87V@leV7IugC@<~qZD6PQu^`*3$l6kB)ljVhm(NZmq z;xt~R95I8^4)n5EnN=*OBF2=jg`wI#7S5- zB{^!w(XCAOE9?nMa+|H<|2*RV>$o+fw%Sp6nUXd_(|ZuQj)XXB0OGgOD!USlD6liDamujDxRby&pf*JQ_|MklTrkF z=|f4IljAt8q$J1GBKC8-Oi3GEIaWSuOE-^bA>xn{DJ3Jx(ak`rL{=C{j&lhlc|6J@ z$>Sl&(@1M6HAUJ&DVLH(?4gv0bc#|3 zq>GfEN0OuV3X&Y5!AK8i=?Ek_R^yO-KAI&+`iSe}T$Gk-qgIiUJR6Op+k}@sEJX8) zdTABvN+!ppRcJURIWDb2b12EtXchX3k{pdzp&uy8v1%2%N=c4st59@|HbSjJB`L|V zZxyOXNsd*kP)=SHj0bxLw> zveTh?lPWhbPR!KV^ z#V}U#s$3fTJCT-FL7GmfCemC=b&v|trMCg49I=F~G17WUttnL$J5{m>{VK2DKjb~7 z1A38Xt@d1Ulv-#bF3(?iwJ_dYG(olM3$xtCpO?DIl(X{nZ) zaC%lHa|=24d7&<}R7-tTGSZR5J1DD@=^ieD)W zMY=^v-d%zsn*M&hmP%6^jinVRjYlsHD9Pt0;~upjn?_5u=SeNKVQbGxp2^zMUTi}+ z4d?U@r>UGi;Pfe{HJmnZ+RNzxr&F9RaJs?iE+;$vm3M9X+?-N4WpR?Pt+cuvHu*|P zvpQ_@HIrt!Z1UBZW-qe6&S^NO37p>J^a-aGoVIh4S4^#Ed9BmZw`!?Hd{0SxF8)QC z@d(QKJPSwg5iQk{o&JWpmb@zEh#y~61=PJ=lO=QNtrBu+CqeMm{J%_2Ufq}|JwtED;OOG>-2_3PQT za@xb`M^5tZ(912&5tljr%}M^fd2Okc{&u&PT$}=&GB{nqjH2JMTkpe@xn{#8kQzdy2a^lN)<(6GI?dl5#=e#?X!sb zoElSlM0Ip8V{1oAo0EemS#QgwlPI~77Ey{r+Ds{pQjR!AsW_#exJF64O37Dp)v@$8 zSuHG;Np4F}{6nc8mOAJ!UQ3G+Zc1|BVnh<9CbTq0WKxpb5+h1bY6)vbNw$p>=o3nE>+?cibK0v?Zb<$mW$ox&=HTR5HObc<6A{oP8{GpB}}x^a?!BUG!Cf3H)f9I=s78`_WD&?R0P z$PCw&=hTYRAeC~&0!p%NMezeA`LtP4T;^mCYL**HqNL67Qk1my%A?wa+Ex*@$)2ZV z5zkQ4&hA{*A}GSo*+J2Pt(Qu9p;sx%{_;ZdzNMwN$>bAqUT6lV1u6x_N0j8uv53zo zy-e$+J1nI^lyby6N+H-jN^%Yb#R-)n#6?OIXlVpLqvr_BQ+g`M5e2k#7J6}Hh0mTe zO7qbl{e?M|s#DUQ7#mXhh?ZIe{q-_spKvgq;35ZoVuwL6#0~npl&WDt?ieb zwyQde_>UtDWX8m z;?0z_{?2oXD4`vX|G#;VO?6t&;iGRn=K7J=kG_7)8&cb7Y(aNQa$AC89Hju#Y)Yk& zNO3zXz5G>dSQ)ZXQ!cc;m;brd0c7A+c6dXAD+yh=$M zjWLw8@moqso3T4M{jdEvPD{0(|D>diU-gi4N93YcdJ&PzoX$)Dms7PrtQf*4|T`QYtOzAze z=tM~y(_WP1eK08cQ+l742E|B9+FYAXX(8-WO0vHgv5JzMB{5>JN_nAUl(akD@0{*% za+C`%P2!Zp>1ma6L|aOWXdOACC#AJm+ek_~u?0&g?WJT9`aNYGnVdsG5x%mE4x#O@l#U`@qI3%Bzf1r3=Qst_LOUy>%ZF15PIWoypZCbuLO)|mJJM2ZP7b1^ z&C}_ezM^y)bq6{9!KqMAcx{C_HKe5V@;s-Jly0Jz*_5>Typxjle$#Jkt_tC$@_O(P zEsB$Ab~dwC&qXDTS8ih4guKm`s~>mpMJ;lvpXev<#;voceIe z=QM-U5>DT8`i0X&PH~mP>nOpgKBrEc`f?h@X$GgyIc?>1gwthCg{p+t7RRY1C;c3( z&6dZhuS!+K+mteK-2P9W3t7ZGsw;)M@Mks_!!eTYMV7}>{TRtJMVo)}45)#n|8MhN z>qX9cE&Z=~znix2NvuPj0rFi_?N0YJOwMO5$vLjQ<0{VzE$L^9KHLA-ney*>ukF!! zTJN)1$0bV7A>F3*Jd*xN@O`qEG^6uv0FvA)Ey-)qt>8e7u9%%`s?PyWgO7}~oTuS?q*3i;JNP8(A zr4$tBDV;(JZxy{eL-sT3vE9{ac4DiFP}1xPPPv?V zQPPgqa7uC1A}FS_Eu@r&Ue;5RPj1F7kVmi>EzJwv z$`R)&)udi>#1%^NnJ_nGsTuAijZ^rkAU70#+Ke&uTt?N=JBE}RVXIoPg+Hmz4fWvu zdaINp22pB8EpkJXcAhSsZJb}_^d_e`{nJ`*dk4 zr3ElK!=&Yg){@CHAV=&`bvfckPNzBju2K-6m4A$N$mf^O(BE~nlwLPd(%$QftS!VU zEKQ}f7O4!SjYzd9X`|7K(`%Hp?HfyJ8|prwq`kJV zh+ipb>##nljjlz=R}&}Ea|W4~SWK_GlQ1owOvc{+O8#e z1hpiu%36Ao+sdoAX7Wm{C3zj!Qhly_hEpp}@>_LUU0XJJuh6Uq+bf*W&3wn+q%cf-fydwM#X;4(8rP`h38A`>ej=r;~Qc(1!Q~_-V zQmTrjAxclcaWpm>pzTw4|K zI;GdpVgxS@Z*z{APbSaC9Pz12L9v{Ywx#m?9ZYR)Vn3Pud?twVV+8t>XUb@#@Y;ex zo*!~F=o&#SWU3;5rZnDE_lH^<6!r$;`)>v%*@E8tr!*NY8d1{rEsxTBWERntlJ*H( zKb7b^(W&9OLCS(+6eZaxQHP?G)ShI(^)o6}5{EMhUGAFx$l zQaXaPjnWD9a!l3bh~Fs5d72~srX;_Qo+F~338yqpl_;I1x}a!8Nw%POrzvUs`#PoH zVN)n+`@5La7EY%*-B&3n{Ef9zq{@_vBRxw=8;!w~w6?Q3 zeZ%P}r@NHoT+0!UmF0-&W?I`Ek;172CG8m1Q^_L2GlIVTM5Z0-5tOto(C7FEWZJo~ zotMh1Sq`>2JfDN&BrUB;MxRAfYJepForB!Ipt!5r(mlC3y{CYsMJTmElJ9D?L#jpA z8L2HL?I?stGAQ08>w%@yDZNO^_>8`uO!kr&I>G6xO7v{oLhCO#lt@W_W*8LZDD_8w z@=7xVN#6a2A=RR#ax{XX!T)I6Ls?LSpTdJ;IGJ{BU%*R0p(J~$BEDpkSNVKeM{a1n zvfR+Ol(elnMoD|R2_Ij2@+F%4_ zl(bpbo>ClI44{;ZG+ovqt)o;J=@g|LBu6VDYE#M$#Z%Ib`4g1t|7&SbJVn+BmPbjR zwL#I9lC~}3UM%7bWi%dieb%n`Gubv$(%$#JN=Z9f-qzt%f|7Q1tj|gQOCN1?!=qsl z;nAS;m+G{oZ&7MR+efdSD78h}O{qIlcr+~HCYkm++21C-Ej1`<+tQ6vAGGL4X$YmD zkY~KS(*=cm3Lgu5iw5?5PDN<)j+STW6N-JQWs+1#kQ(6x@L}@e91xovnZcsW(sfzfA zk~W`{p3{!LMd(N7zhfU1`dkaoNsFjWZMBi?L+L#AY!QQdSYQRsnOM|Dct+B$NQM_Sve@R6p^LusjI z;q42G56K+VOHgd36od39r4*#_I_TSm?ZW3<2~JHY$$uF}&!Uuypv5Rk+WGMjrIN7i zl*%E6w}7q@WZKcc%PnHtho9WaacWFS8=)5|RYEUvUTIeq{RvN=6}7SS|KsgEprk6c zuU{?DDgugOjHoRJ%#P@YIe-G@5gZgFW(9rvjEJETFejc_F()u5%sHZBMhuu0vxot6 z`1U^g)~W91&H%pm|7NXO>$gr-ojP?Y-nwkqrJ${h9sq4;^crY@ z(bu4XMzik}!qG;ZL9#iu`wbzJ?{^0cN4!E90y@)DTnxI>cwjlbdJ`4c84q4YQ5JdaBhG9;l zoNjR%mr-N+9j9+HY6yRTxYlb3?RJsAhA>}7^xvVSbZCKDTbO(K8v<-+~ zOEiStvUqu+UBjVSXxA{@={%>aoo;b@%;`0!DH+v=4!h#n)I78Rh~8){FXgm~(*{mk zIql_itkaoJ*MQVI<6BGYOhCrxfKr&4#Vh&OY#qZ?$mFY*o^0yFuUXpqFxPIfxfGTJ zeTQRp4W!V`L5o0!Jr7V9qr;re2B|$?45~+H$8aS`9=Z*r z*7PWd{k&s%(L>*K`Z}Xh2)iq7!0CIZ;sE7~^YR&0mY4fJ zw6Ce$1)-ur&B>n zaV>~Xq=oPVi0!_z-adkiEevldoY*=g;};5~QurZDi&14y%pZ{98*LCv)X`21a?RRU z?gbfpPea(&X-Cj@NYPk62&7(ixYO}Y!!xQ6XM?y`P-*E!ko7Z5?{|9L=_{wdoaWdo zrdTwi`miL3<8wn;A4FRkLLaAr8FdWDXYo3QlR)%Z-k4qRU7%Kzgn?(xes@UUm8gv=97O2yq50gtq&}6w8B{Zy{_B(q7sgAl6YS9OHB`NHa;w zH?GYZ%a0&b)=vTrL~eMa13Jp`-J?|qCxEb*v0n%$TIkZC(~S6Sz4BcPvI{L9&*feU z!Y=F_SS=a#K&X26wxAnLHUPvM1PXzrydARqwtGC{F%O;iz1z~B4Vk=lJLmzEjRUF0 z^7%u#O>)^^8Px~c{FJ3QDl1zj}JUF=1~g2W@!sy?gOHwakmz?7`QC8gYJ;2W>Wp`0-1KGSdN#FZ$mgXOWP1e zIE`|;(di+l@lLNfO>&y%)NWw(%OXx)oHlgY)oCB6gPe|bI>G5Ir^}q~aeCJ2t&Hl! zR1n{Y;mI(QHI~~Al6{TkrJZ^@4RRWuQA0T2Wi5?irEoXmy$A1>!mCVS^dsmuP~`~M z?m(>Y{^ZQGpwp60%R6nD5xx@vwMPo<6=Z~+a!?&)rEnQ&38T9}T`V5k3!mr<;W^0o z7C>!?Pwxd!fu|FMO7rial`ZXp2g$z1@){uSX*HHNb=n~#y=__7QXB%Aw49bvDWoT~ z(U57^;Azn2mf~&3v!2ZHWgC-y4_RNMdH$t%SbJkNyraohg=|-&-XN7N?Wpeo*`5|U z7_=V<-`@DnQ`#@S0HOc3&__YX7=7k6_rVyiOx6Gz1uBFcK(sV(q$!1?5UO`9r-5!l zipFxwtz;D9Y3Gh3zjkr1gG{@oJg0h_Suhqd=35F+dgyqkIBS%`8;~i*WYAbk`v>TL zP{+{b5bPqFENSil*^`jrEg9%p3tblUVoki2A(Or}L2p@T(#$cNp&i3|2>r@vTc>?M z(@ZuP^t;hnF1y;}jRnp57qyIMJbNaY>eTVyQMMY%wDfeM1#??k5`9nzyC8IalN}7= zmu7` zjUev9V+SLn`Y;j1-OEz=5u`Rb+hLLB0jW(c=9EgF+DmFzT@dds%eR|r=?>C*Bc2{B zg(jB`1l@-emHjBaA58HMLp;_|DV&(4Z7g4yQ6a>>)nMn+9*4e$a1}yH_;Ls|-ek{! zSjvX*j?bKqDqP$U{Yhg)*PN=bY`nQ`6p*P~Oa0zJk@y5J#LMdadgDV8pP8GoJLXZ{eN7OmhX1HHrZ-O@tx6D zP6vX1GTDesU&%F>LL8|}A?BOr1`K}$Qr`JPD?wj>eSt- zkJDaGhd7PMsH0i6lxe0_D;v=k5$zL=LJHCKPPb;1EG>mQAzR(7ej6^Q16+2h%WiX7%H#PQ*;g)0`Tp&)g^rGSECZUEbwuEg+r#JOq^apqsuFDEX~i>X&<4+O)TREK=xA{}rHvP2V%1A)tmZ5v2aXv&7nO z=R2=cE#6lMJm27shQv38DU?rqY@Mah8KGC0meoNw81(|l`n0#+7c$Ks zdxQ8sxe$&3-D@dEfF3uB`{>#OWgd;?bF#FJi*i)4DYnOfR^p{idm>6$9rzM?M&Zs_g1M%b!-Xwvz;;9c!Af1KX9W>rb z9^beZ!XU_Av67Dj$!j-(CPAjRf;+oy9r8>E9kY#OWlbbOI-~rpmD{-8Xj*QmAYX zIifQaBZ%`$2}cMo6ob^mULOZ1Ki|WEIz#N1N<1$c{I9KZRz5dn!**9o2`G zLBlOxe6Gc~44G=Czf*kgTnO=PbA31op=>Yp;am`VZDV;9h_+PjQE)}ZlNU|pn-MCy z%Za0zWcR!5$&6~X@YDv@76=u+mQg9Z13Crez4AP0C7ePAhkm}=G$f%_h78)LD?Ti}2?jYvY5Dsw~ z>NL{nI;SU`-gf%aX^|08UqeQv&@pvKO4Ry-+D@{SfX zw?#oLM`O8LChHhj(-)$=jpe*qH_g*&{!KG>%QJDB?c@BLSGIJcS0U_}S(Rj1En&3K zQ_;T=dX?2ol;N9TJTu({8P4e=RI_tho1FleX6LIwYHKfp?lvu-gB~}U>m8uyMCY#O~&)P>H()h_O;2b0ZlXFKFx1N@#f9S({0>2*7rRRAjO;o&PS;nB;_#y zq4OaWXQx368MQeX&q79vgO)Pt0+I#Hmlo(9+DZtm533`z-e_Z|t(_l{r%OQ% zmUfKOJs{>$2v38!?!;^g+R$vF&6^vgay-+3okhsH7Cu3|zDDg&!G0pBa(7|+Cv`pf zYs_vy3XYg~as{adIc6(#7sz(CeD?+I2f}DECvM&}*|CuQ+vqHiWLJZZG+A6}VP4%V z)@od7VRY=Rw?U=Ald^m-gxeO7mi@dC?gJeIErsw5h;v!r@*5zwjlSg%oIZB?%IS}c z@Pu}%Qs8Zd(~3^(I&JOL-)V2B!!p9zK@i8-%2jDxDd5gCtP}NI!Sd>D%h^aV)Vy(7 zrUkdYfV5h_F_Ts9$lVXwNl4KU9&_TlowCZ-&Q%cihZ@35uH{3gsZQav=!4Eqt7fDp zX8N=cdSz|Wb z!Q)o)`w_}Ltx|Xbbdkwk0P)-KLiiZ80BQy|8G|%}v^zc4$66rC;$7MJdMcBpk+2Yk zK}PEf;i8Nh%eQBgtip~pWY@p~+?9jpLCsq)dOXf=W6Zv{AiKqgw`cN30({?-wGusl zsFi$%c%n9Eh#Ep?5N&P*>Mi2Jkir{cb)0LNpg^Cy5(~UdFKyi?(9Ox zuotYl1Lds?Twgt8#Jv{Lkq8wX?{v1)bxt=r-R1O{(|D&JoZ6llH81G2Tt<2OB@Lkg zq1qRXr>*sDrP@zBhCLAPag+l!4H|EBI%uNNwV)4-o&tSo^bv?Hu_62oQVnwC7tME8 zq%KbDW>gB>f_{XSQWyZ5eKw8)9N}nHLm1>K24_?sP6la}ThXJkP~7(Bbf43^PE(!! zc4~jN?8A98rwyF8cG}hHK&K&27dYMI^n}v{rw^T`IJFrWEm+WL8K>?}{hbbS8scUugX&*6O?&75u3P zZ`ih0sM^pXsMX5dOTI@`zf2a`p0th1+*e-OQY;P4vY#UQnVdqBIHjL*M&8O2k! zSbZV%Ad^i49SXwU|G78?Vzi1=+_}STJ&+Bv6#IkDFgg?TA4@SB#Ik8uQhP!1ymIB~ zu{cLz?USXz{N@zSiyq<$VtwD!*=6xGGroO*Og`AdiKV>MtQzLBn?Y*rFF0|B;ChRf zPG$e(q4A3h?0lXdOSE=Icq;=-IkMt}mCKF;-ER7l^=THm5~18%FN8;(-gk z7r5pdTy_uWQRIR7_XtrTyyc;Pfwc49_QJRupLWj|ciGAy#oO3rDed+-vi)6l6zDm# zAhuKNi$W$JoDR}@?LSVuSwUZrT?pArmi8JD%UcTfIJKl1Uz#D_KhswOwt=jD zE7s)>pgNjvdpI4EQB!$1NGpoVK-<8U`fxvpw|wDg0>nK_tUR24a4KFBLl<;f(TUF~ zO1o|*!wuOWma?h5nbY;{qHJ52#V5I@a(|cY?zErNVNS<54Rea`5}L}Vx$JzWOPt0y z-R|_D)6-7xJ56n~ z6)ugT9h^!|>ts|4TTVxP%KJdZwpIv-gH(>QGg&D-2-5dB6F};r{4z&=`35rX6E>FH zTo%WYc|iZR5-kBb64WuQ3OdGUJJ3*&_9)J@cxmVEc!bgd+++-59u46Rkov;oAldR3 z=p0Ks4Rj%>5Ei%`J7Y#`fmEVK5K~}X=X6F!rEm-Adeib0NVWAch?;R{AxPz&3gY=N ztWS5wuCAr{8!~<&gEMVc;G`2|4Iz3G`{R%?6wkVzHucjb<*%7J}we3L3yGGJQ?uUz}#Y zD%M9Gi0!2mmH^d3Un#5zTGVK5&@v$HMKUyb?HZAXh)ZbXY zTbX^)SGZ-szsk_tGPP;kn=X8YAaHsQ~u5lXc z^t96}PMa@_c(Y}?O)^XaxX(y+BoDOvw;dDhtm3=0*4XknzdIDCwR2j?sorTbr|q2vIUVQpAE#@bZgINT=_#kzoZfT#-03H$xvr0vE}Bt& z=mOFcb3BP(3f%EO!dec$av5Q?9^zeK#J)Pls3&B1*HG&5d7({6p*8wmpa(21PwwrB zr^U*Bnj;X(F#=-==qaOAGkKctLcHfJ9xYH$p`~xv$au@4zU1fg0^h3QWC+rJiFk!@ zd0A<3{}p69?U42|eunH@i}y0(X+Gy3h3H;STQ@ptX)`p2)s(8+`Ekhpmo|R{eX{v?r~gek794{oDwLxXHUw!TM}b(Y_?jc5Qn-j|5sD{ukZxD3o>LYieE3^mFX*lmd|8O ze-f({o<&-H`5aGTHI`q4Omj+_nbUZGVLpjoGu`5c>@0 zef5B3!Qu$rvMS$FSOYSxJNtmNo@Bh;EnZ3+EyYCQHF0G5qd_AEpyz6eK?aX z3c8>sbY;j!)yOu0Ol`6sNIu=miKF9HmLjcb4nXJ~kkyByK&$09EE2($h3Queoy!%$bLh-LP+Nw zM>gV{Z_^i7edw!**Sc68?<2_Ogsc?426eE|A3=HsJG&L$<(uq6P$!G`J3^N;;%#{= zSt!2?WG&#i;^yexjX;vcQ1}B+RP=r2GsJ#~R}U>s<)fYW3tN(%;IffUqnt)(R0?;1 zp0L}>UI3}x&#bQ|BL!;|6}KW>jf2e`jhZvzg!Ji}(~s!o3Dap`JVvq#I-6j9m)1d+6Ivzj?d`Z;M*i1W8NF zX;X>=;a#OjdGv>t-OZ{aTwhAD2U_gRS!`Cx(DBgGzyQ4hJPR^v@}=`D9D z`>nEnnGaThKDKA}jqOoODfC1<&2)W19QjLOH;_(orIG6($dt!1pwrCy(HMdG z6*g{oc6t(YwuN$DxY+3VOjZgbke0I$W|9H1KH{!vI$6^Yu0%Xq)evrRx*x=r-4LF0 z*`$mr`&R1bX_WsG@wlc*vmd_Fxf3Tyth}8;Y#TUV4!Xr;X+~TRvU^Ro8R#LS>GMdM zan=g)3rL}MA6sH6d)PHej;Ue*-0lrD%`=k7LDKx(A!|!Dw58Yofy#=K(9-&LX zzEVi*h&Lcx-eglj^iXAPvyGMi3Skk@Di&`Imu(8_YO;MnKOk)>#5*Yq;Uvi9wKxh? zYCaF4?E9s_-)P~l4VU~^j!WV4Odr120CBfA>BHR)sA-K1sg&uY@exC?_ECwj!js4Q zqP1@XS!G{%5t=D$D!=K(ULo1HnJm3e!KulixM$2X|BBFUjM96J&UeR=t2;>f@@~Ez z5w8&Tglt!%^pv0W8ID3I<298p&(b!Pug$2je1prL&!}T~AEa^e7m#ixOcpG5PqbiD zkak`6#M7dl0=I$eK;+g~-Z6{USRR~FAzTGI*es3SEreSjJKAIqfsQwt0J_*Hjcb!3 zV;kxirh#s-(An?R-55CYiKpW`Agg?v5&K6er02o3QxxBb$@kjxSRMN0-K|0Vg`>)w zk#~knBh8)};da?9MPoVcE;N>hxa^dSa5n)w#HU%*R`z6F2v;MNe$MN^mE{ccvq ztp9@4^J0s@uZQ6+iuQO0c<6|XN+J1~cNpk-{|1EWnfMuyJkEP1zem1$tDx5O2}1cs z5wq?^NMZit+wd?4JsIDIcMQe*rKKS(mr-MR1E)is&d;b6MrVY1-|0aQebOnNO`-L& zG`$P_9P!js7JML5Pp1Pjn$f9)5s1h0Quu}gG&jmt3Ri%X+pQT@))Akm7!UUfWht7< z&pEy3^p?~6PLngr+ezpgencquayti(FSMYuoiyed;jW?8gYnHp9cX@7pm(G^sjV}H zqQwwOstYS-RB1g=elu-TnQ!YwOd(XAMYU>oIKwE+u!fl{!L3QCS(Dp_TJB@RC)#)A3?xy8a5c_X2 zd=H|Bis5$@1_*oc04A7KqjmDGp<~@a*u+z8W+~=D=oX-2SQy0BO))G1I?`wb5KrJJRG!R}bwxb3t76Ct?dF<2w75U) zW7};i^S9l9Hrf#JMEoTmQ7@PA_aP+f>oWdQgk*fm67A-p`#bSBf)vVK7tzsKsLIxa zdo-~N)*fGq;vQz~Um=vg-Bk*wgSLl<3gHS6eNYHbfwaRn8Kilu^`q!fcG`bg(5~+1 zJv^APN=`#MJw(8>rld;97&{uP0Z{*0{G1+9~@nKHrXDx<)-D2o>7WySL=h^pD zPHw-OY)Uh>gtqiX3S}S6)7+*eUi6E++ZLg9;V0xVpT!H0sV6s;JAl|?8_Ol9)tt6) z8kkYXFapF;0AKApJp|G(evfyW1Y*1I96kgwkIvyU5PLMs^3H(c%czypTqu*d~i%X@s&I#jqlX zze_94159%_$OeH5VH1%0`Cd*VGAf4aGE&+Rmi9)-PBj{vQHoa#k3hy>tu2PfK<6P| zzAV{1&QrVzy4X@o23=l5F;uo(V-|3>8e{Y=Qru_OsiO4%%+gp zI9@Y8k4M_3ay>#tYdNi-Q88=^dIj-{p$~}qGzv_DO!j?c7VLu1sYd%c(Z1hJc8JS{ zfK-kVp!Rc7^I4!)=E)mC{MGJaxE;jbsztj3sjYnpQcbsg65mi-+C@OD^I}-tWt)J8 zqs10OqDIJ+c5e`K>x@%Vv5g-MnS3=2w1w$&s_+_DhnZ=s3B0C_Izk{k!%A{`})3+=_2O6yg;%`V7 z!#W`PPw|eh&>oNt0ZDeE$+m**ESFtjGL8{RHpXNe50dN-lQmVPeZXY9LG~!95aO!2 z5cY$NcfH{BCrI=8sUZF?V=;`(2)`~0QY~DWQ6by_(k~X?4SLlyKL(lvQaL7DzT+XI zeg7oiq`BH=<(q7th&=KtWWV$O>Yb>?X5m~J5k?)kYRmD87wGn+uOZJV6g+!nLklIFa8t8*(^iW%3;@)mFUQWnAplw%bOO};+^GWFU^oo)uv z2l?K36rr`=Xvr#kr$l|ow-~BD-qmc$D>+-Dddj$*+}QKFA+5%UUZA?bv5BMOKdq0g z%$AgIo>ecy7LL1xFsT`o?csEg z({WB`I9=*=XGY5ger>{E9V~{YA(QntK_+?uvNT@~hgEffE4)*TCLvTb8FaqMz6D)J z>%*_0yFjJz7w9pgHk;zyjnNVy$x`S-<0LDFH9#6mdVpk0V zE`}3a){>UmcKH6uiB<7`PUY?0$sG8_$BcXH@icgm&My{fAm!hd%B<7sDrR z!IX?JpJHs^-ZcLS8E?YZ?puGz3W2+Cdoi@4o$}km{UK{Aw|+KK2PfWFuTbuClH|36 zKy`s@6|K@bBZW%73g}Sg5!M0m{-$E!t`+Y&E`}bE={t4q`W zHP?kbKo^^A5a?Q?Bb>@0?Z}-9y3In*b-FC0N(W1ZsIH1jo>rzO?k zV9j)IqFv3_|$}c^Wr*LWU<6$hI_k6Vzn!CWCf2+4rD+3K?yd>|&GgdFFD{7t5h%lDzSczo}OUwBRPB zke0hm3s(;hxa=vD(SOew(SL6k?FS1!GCCx)1v3fgd&s2kZwuv+MyDg~8j>O2hM@cr^E|}c+(Jizcr!&Yq+W3iWPK5ew`m~N zLi9aG0mw8WamL=&w6ON~H%g&=M?kBJA?18Cim!Y+O ze$`|jA(Xcf7eh;y%DzdKBKk#^eqge1GW)Rl0%<&LNnfokf0&k;ORI5h!FlK_w)<6# zI5ugF{Sy`_lr3UYgx2P^v&rTdkG5fTney!j8P6Z&)vwC?Z%ey4;_=;``o~bnv|2yW zh;95Lqoon=Hlvk6s+k6m;%x|e+(LUfHG-6)Kj;MuZHHc~KC>re(lQ9d-cuJ22PyP8 z59Q8@LQjJ1P1AC=(?uZl#;aU*BWSY4y9=Z|_#SMk$@tDotDA=q`a5Kmedc+{LPyG8 z1@SioHOBIHGUcIp5Ly@BM(6?{$(A(PCy+5W$(Au0N2wKz*oxOPq7Qn4YU@(#EB2$= z@wKAz-45{zVG1<&vlOw17Q$bUv2_;0!Y}A737*+O11v>vm$6;#V=}g@gN@jljy7To z8*aoN${9@7p8}cIlV=+7t=lC=J3#YwMgu^%8yx`Bymct(L6aSm#j7plO9(B75eWU% zi1YMRqe~!D{~ZmQX0p`tQpv|6^fwEA9MpPV>U#sk8w85s3lM+jv521=h_mw|pbm&v z2y1|Jv)g7MYEfTU*h1qdrM1A)ChL!Qn%S$z#MLa{xH>F`0f?v3;!u#RPbE4UGUlsV zWqEOODoara{{gLS`eJ!C9#E$FSHybjWwK~#t#|c?yt)m^yHRr*FNSt6Y5v9AIgr}W^z~K@e7DUzD)5d4@mS~TGY7+F zy>UO>h;Q6a0@c=0^2>iLbR%ft>Q!1Uu(TXEG)ncz^3Z!{J+<|LjQ7r{yrYmpX|J@j z0}y(h(Lm7cMu&qQ^mxyjEasuKFPe;F(`!Z?F+VV3IleOD$$?*tj)y*ulXc+~P^cWl4Z9S9Sj(9ymwZ7WXWNbrwfN+Ks@%A-(0mR=A zErfSLTFIn3p9UF!Pq+};zpP&&Eri8E99autMbIGAvH^&{TZ+4KKpIa6IkA;!4a`<@ zgr#7cRG;B^Dy#V9z%c^ffun_uK)l*=q&jDcVuoZ*`+M<`hF(C*Fh5wJemYpiMv;8MXmwP1x6nD?yS%cQe_;NUOd-4z!oa zUIiUt^bTkksJ6YNUcuk`Erw)O^3bP9TRTUkct0TYJkvbetJrmEHjkE5%!#zhgS%0e zLre1HjBJi+ll9G~y~gaDAGvYNuI&44VRu-*?5mIEl%qPW@=(0a(8pg*E(XrTFI(E^ zzgp|1C50wiR)m(<%>w#>S_)xZ$lf>F8l+ya3+Nk@9R~W@Xb9*JBbKAM0LzxFs_rTC zSZH3pr$Wo(2t{87DYu(IE1B#uP=nDpP|9sx(^s9xrY4Jd;0`OK(3AC7pgyMMH;{f4 zefHPl$Uh%w7Yj}G!QP|y2F;D4`&w?xA+2g5dRKKs`_vodmugE7ZZYj(gsPVf18Hq> zvZbijA`2Q|!Fd*%Ea(9l`xef}fV4-pQ)X%N?Ns^>Mm*I%y>T%#&!`+sp&De0(Vk*v z>gZUcRn5@jcU#(63$?Adx_*n{G^EwsJreY&rKOgqTuYh<*~{e9mk?SPu0RT{mTmw| zFd0`U?;CN2@}&`1D5AR%?>Cb@3~EzHE#pA*7`+Nw22{J_FZGNE41a^xHsbz9Z=*RUz*k1|f%Y&;>-#Q{4T4OiJOWe~R)cJa#ajoYr>veJ?rc}i z0cj5X9W|)EpniyVj-}=NcBxTy`@5ix4z|)ABT9~K_7k# z7W9*8j^(ZN3ww`7V2*mfTf7UAg5Rv@sUxo)v{{fXHhCkZXxS>xI317{H%YjC?E6}K zSKGpUi`wxZts`ia$}ykWQr%uU)!5haZdvRBxF61~x(&3VS(>a$meN;jO=`t!BA(tj ztz+~w(r#+RXQ6G4UWRNBqqji^Dim~-5zng(Ga8F=NIO|m5UMAyUqE{Dn(cLblWy_a zfvz)J&}k{Bm7ThQp0Ie`K`$C@4bm>%j-V+f+Y_XnodaEVBxtsUShk@cS`- z6Mjw$fb_)N$z{v9Y-N|N30mE9TOZWls3%Ak^aJf?vYDlwkb-5K(Re=)@l>M2GQw^4 zAl|5sQ-2w0wSI_MkV2<_Z(0mjBE{gGe9tmjnrB8Mp1gKnMz~!EB;UWC5$<3IF>NvY zkdbWB?L=`;8om3CSdO^&RSI)K#&=5krC7d&QV%#6`s%_0XuB7g<`ofdj8Q#EZ?M(} zsYPrBqKB0BPD{%-V%p#3IRLh>y3il-)E9;$RK&O3ipR47ipM?Ldo9IYNTD}uKj8$i zh;vHbo2e&|BE6X}goBWF9Aw3CSVo0#Jm^)EotjZ0TntkEUYn8p_pa%S-ag)knWKbh?HjFiV87Rov*E=)^fd#P=cwfV+)#qcro(fa)Ievi<3 zpt*nzczD-nb`aZ@YHLx*>H^2LrHweQ@uaLmS20-=?CWa8U8W6;xVzumDDKPGg~gz` zugR7L?PkQf)V>r~1$sxo{U#B|$pb9jYDl4Y>wvUY?g2Uyq1wGX#fYcYRNm^E>HY_O zkb2K{NUK`yn^9h`$XdHuzO3@y4}=BtT5fUWCXX)$ zSz4hew`DCiYSt*gw}9d zN%Ojmhb5q z;W-rarln;$J~U!2d^wZ)_|1iLh@g!l z-l}HlMWD5f`0U)>^xXtmFO%I3+TQ4K5cfv3{u6NpAmU82pT*-I)@b->d=#Xui$ z*QN5*c+4Z6U{6+6zMqb}oV8=|smP-;UMg>1DPMr~I&B#BRenMC8A5qJ2R8tNbV`{e zy3k9+vgKRAoo$`%N%^+Cn@r7ld*)YJ9xasv?eyIcZnSu@9K|p{WMfU1m+#V9D87UP zsg#>KH95ud;wuA`NN-?TE>T>8s^>id3+e(-O+IPFvy!A*uQgxFJnLf~#ju~3gKO`X zpt%tKont-Mz!NOrbn29SdUCV2q!cNS5zzdlrHI}rgppOb{bCldwX>DfK7SM!pMH+- zXtL_DZZVVjSQmIthu(Ry*Di-pd3Pm?$NiFeBc6@YP7K#W+KJ(MXafu7IpnQD#R`2_ z!uq6nfQ8-&*(*3(tEXPc9`She+CCQVu}oGw_fTKuZd7V7uX>6PK?6+-OT;`1VJc*Y z8~yI_IKLfl@sbv%I0Z8K;7m|m;65BnF4;LIN?ce>E&Agr#X?;4klcDl{!Zl_0_ z^70+$p>I09l+E?gNE<4U?gcI9_;+^g?wn@p(ciH7m zqn&Pdy5H#ur}0i~_tN*e%RYAc&gpNb_8-O+i#jduw3gGRPJNvAayr22NT=Z$)s7al zujSE9@5&jas`IVPBX7LAxf#vciQ#@2^U&z{ zFi2moJOe7)EeafI6#ANl@_9zLZSmd2n9S18}(h~nH>7jAbg+!v5l+zrr5fx7`B zt~|z@KJEs5Y{YL+CF6;JKTUQ&^mSO0et8nKj1iyxq~%4=?ahp8Yr49P7eaG2&04^Y z7qn=7@B>I`S<|Y0*0gpAT79fge02`eN`~tfJpru@nWzDDo7ZnQvwlO!v@g)xsSil+ zXLiX5_c(ymdkzNC7M){UA6kkb%G7c;GtEt~PbsROf48yF>gV77o+9l@?`^WUCY0ub zO~&^cvN^q-I~i6TZlNPVWsp*wZ8Fy7c`m!cWYl~us2DCr3VG-%(CW4lyg4Ijxy@2= z_f7e71**4I)nyxN@v6)AsLAM!RJP|$R$aD9Rvv&4NQLk$D7C+IU(2?h z@AgLQjk18{*xh6-C1onnfiC;EQT)=oF0hxWM0~S+tfx5D@ zu7Phh;)wn*sJ6VU>B{oHg|eykKXl?qsPB)aK&JDje}l9`+Wr%zz_+;|_Cf6iaPCnl zUos2qM1`->Czy=hxWQUj^$tdQv+@?=6~jtd9+i8l8$qUB?CqR59_X%@I3A?8uR1rU zGnFwn?FheTeu+;6nrrzhPxy7^EMLR}X}9ONj0)i*ryD>Yn-*H|4M-*b8B`azm-dIz zBZ#N5a_o6?J1v}1ZT-%^RAqb4FIy@{w7ynLyJoe- z6gWE#3)Gsbz1y)WEp9zUJngryl~Ez|&e9e`els}O+S2G&&;XQ>D(~O!I7(omj*aFVCS<_iROWf zevvKAw=!NFrL>cOYfWgC(LmA=Q2w&DKFY ze!Yx4M?sw|?QWiSkW=(kF&yQx>K37uV4l91R&}YfGqY~r2;|GJtBWDo7d00{vUFzc zOZuXgO8ctIrgoM5m+CT&8+o;wdcXy+o@=R@8B3H~(mbEo;)2I@Ak9zm2 zh^HGE*t;cL!(^>6cdxBbjHe>59z>k&dsrUPLwTc=R%zQ`@oy!#zk!7Bt|6SR?Ki zpKQcaj%t&9|FHm8!*yXLeq2F7OUSeJ7XhKxE4qVJSGupKZjk{ZdfnNzZ#=i_WfcJ#@W=#`{2POV0jQ zx&E7gwEN-BEq-gpDQZ#KZh}5pf45n{8A5l8apru$WZd~2XT;re^qixQ*ovPp;`;H1h zej~2=moVaUz)D6Xr0rp}B1rMp1S#Hzpq(tVw}7N2FWG3%jqRnjY&V;hJD^2%`4C9I#}{v=E#}@s#qvI2XE%)H_^sUn>+P!+Qn&Kr$d~EIE`>R%jqJgtDSCky2t4; zr{|qscY5FH3#T8P{&brC`&gomPK!D%kP?ax!ISZkqOvc$+eU)?kg*G3JMyTi>kZx_F4{ov))jrU-j7dw& zxy8P(5@k>NZ(xLApnY-mPrKocAT8Upktl)xKY}%6g?;+GM~o&bKw2tMlkD*|eyIeM@Cq2(lB+ zlgWbUwc7f~tMk-T_Cy}ZmYMPHel^}*9JZ)s$5yN{=Rm~MIq5}P=hs_ppZT|G=IEn& zFqW+lR!1J1nR*_7>6?TWst%gI;oJ{fwX<<<}Slw#j3k2GIaJ}EIby`vhO zrBEr4u~PC0a;OoX3{N-B)pe=6+hSU^5?K(RyK$DdMGLro9tF*+E!k3?M{U_ofXQ#9n~Zmo z>s(N5#rWD7d8B89FLU($*sQ+f)8_QewhHYVpXH&t>X$mR z+S*S~<=xEER5P(f$b$8A$}wwcr`Ig6Dc@=j^|ahL9?ZH`wP~M3$!lk|RJNB9 zx~=yRjTJ0f?T(KPTr1DL@EajVQi593<)!(W$t5)+gr@m0FC2tgH zUQ4nsS(PlU)|^-Jne9E#xc{0P3GqeC&vEQr0o2=Orp-X(k+!y`Yx8AIzhd#CuW%nS z(yH(8lY(_m9r`5vMFvsUfcMgCXc)sB6)*tH?M8fdNQTB6F&IEEZ|(ma@3B0 z&3l7)(L9Ge_{x<+T&t*m6jqJBy9m-LTkU~zhgo}|Tr=eDUMBBSOEI*Z+jx{iW6m2O zK2c$xDK(NbJ>TmRO8h*PQN(CvK7J{zrk0F(BEpV-KbzTP>So3GVnVapCkp|rdF ze@nY2@=eeC%vZI#FG#nY>p7HfJo9QW?>TgkS)Y8L))CX!(ab-G&TK8Poyr2%?;-!C zCrja|3pF~H!p~c3zZk!U3>o`}&cgB?RVi$V+@8WXH0vn};YsM5V9yY?DgRZ#7}|4n(n zYNovM_*C;a_mHPqDU(mr^DlicTRlBQA5h=_vXsqx=nmw2ob66O1sZJh254T`qIz4< z=n_~}GHPxozxh1UzRDNSoc6+#=CrTEJZ4n#*wzZ+celRoHym0s`&I<4X0$12O(U-5 z*D+!_lrPJ{x4HU-%N__VhQ3HK3_d7^oiZ(z?;BHSTGv&#rsjQ+{QNIy)_Z6AInBEN z)EjX`FN9;DSv5#MZ|x;ly|LtZZ(y3YIq5qSn$PgI(Z@9>n^W7^!9w|~p|h6TXyox9 z%Y)YMk(0;1CS$!F0-8}PNq)H(n)RH=b}(yJrL^OqWk`-yv!?G8Xj$J&sq)gQSyia|q`8n-V&-Qz? zfcw-&x)2 z(mucDty@qc{n}T{xA5F)C2#o_9VPE@2f4cx&kgx&kZ@AALw5PR+F_ljiIy=GM_ z%%%?+@r#z{%z|o9>iI3LWM;f-c^z8h=eKk8eQmO&FU{h!s#&!^Ehmrv&1$5&9LgC}?$9fUhrH#?e--E?JuL zNLFzSTg$9(*}gn2aa56|Jit4eXwk~T|8Obj* zUc>cvOaCv{a5FRJYz+(Q0>54AWAqq&usf)>l(RnO4D_-coTKl*8FP~6<1G)a|NigB zoV?urH)Bq<=E^6?>K<^4`7e#i>@!STIntzlnR98u39wzJ`XLrC*ftYxw;&)-UHrstMsi$ zwZ8wR2PDlOSswqlJs>Z)JU`F+tXr+Q`5y4K)kk#?VA@&h0n=Kn4}ELIHYv@q_f+N) zTcX-pTH)o@Z#s2at*7-}1KE07hp)40N@fr2XBrKOXgA{}l6TdS2BRTGjUH)FiE%6Zux|^u`mC`EPys z+vy$L()lcHwPu~4Oq!FWEox_1I`O zpHs9&r?S^Jn_~-0U)*TlY|WfiWO}2m(7d$iY*~Dxtr57pmngO3UNsiP66uy3wda%v ztyjLWr>JFbXIiS$?rgGT3)AjxviMY4d0uK6ct}tF&8^{7@}w`8Ev;GQHRX}oUpzS= zOAmkrdWPV;eAVhA?{06_M?{H3$2AxsxNE=((hDn2hy2E zjtsnIPL}5N6g^SVlgc-FBhRPJd9qeZ>J_Q~wpMvTAMtQtbf(3fM zJQnntS$aBX(VybZQ{K$f-oNvzwIJn|=a{p$yM*h5bDc@vOo&~W)mHFo7(Xy75Tj|euXJ*t~SxU|U zn_4L^0jZQJMRmU0m`_t^%A;jlTFSR_4?cb2o1U0?PC;M&R@<+s_+Y5nTbym& zOV$x@B>gA(runiu58X)0+xIkgM-S=w=zm?J>fCT|a^?fvlkeWBwt(j?D$lFr`LwyR zooH>1Wz!w2>E6}qJQSMdGUmbCTlHI}q(a60C9~qcnX!IWT7+(rt+sw<>ZmynRo6!$ z&_ir>|D=V@N;zutZMj5uV$9YVr6Fh~q(V3a)UP8c_7tsdMxxGj=JfAJ!rBUx`#M4~|FM{-I>l};6T5b~| z(>OF4M1A-TZqUOBm3N;uVn5OwRL*7V;~pSAl|OGwJq{m3Qe}ed}~(^A2zFn z^Y0gC3oXd=vvP|oLG3O~u@rOug|d0tUz*K>zqbCjt>*Hyqa1 zH{$o=3ay8%oyk(XJP$FnV@+D#dho9zHE#?pYuoS9_Xhn|WnX2B$kUu`NqNk=mcGch zuExHW_4P-J^z7GsZ6*5#F@^g|-k5bulU1pXW<|@AH5Q~=cnt6Sn`WXu4o5kMR9`Q7Ctpn1Y!iHu+UR|w@1cb~9?yBO zN?-0i1ZuRhy#QLt=yi~8zG1%mm}ah@2O3r9JJ@6?-mKOAIlyzvYn>`lOMWSYg>tkk1KH(fJ$)sr_LWAd6z@`utg4UddK*(^ zpIXT+km>h7W^g9PEXX?(vkL6fc+Z(L?@SDD+EeSydwszh7BmS><(7QAkn ztF`FON=h5`RrX8zg?Y#ay451xKA)#Ag+_gq-r!vOzFXD&Eg4)W)vq6%?sUG>6;3xe-38J;qz{AiI|%$9R$s^2_ps2yk}X!my5w&P)UGT`&1z|`_O&0;oUhbg(wd*orn(!Fqh8)Ek69L3nCocP~+1|Jd7dOJmrInSF&YD6y0nT+EAHyHdlvNJtUdnIGX!tAQVYvl0qCx)bb}fF zLM_Fx1a=6vvD-pp9))lSH1Uoy%_Pm=ot4rieZ#V}Y3wWnp8QVlSMzSnl6^@_(wwY1 z3z}=S{O^2vuKAShG@We7^W?18)pYkWppY=OKH?(thOh zi&MwhV(5xay`A=QI^F3Kr(2w!bNa-o&?;(PAfrmF7KiLZvucfuT7}I)^nI()2lT1Y z0H=MOQoJKvcB<1wAl6%}a1Ds{(JI^vqVHRUr#;?y5PjMzyzR2jL7X94gr;0IV$2se683Tf4)zmE9Ma_CUF!_yV~V!sX?-x_*3g2$S(vun>l} zjk2Gw*L&wecp33D(xfx=U%2dE*V1Naj8_kRyV&=LTY{AKoMYn?^Cuv!>bE^E(gB`t zNBCe@>w_DPQHoM%fQ%_h;r3gVVn!aS?%lswdDE9tJYTGDx~fOGKP?`=18TPxXM^-z z7N2JpHQALDLs-%%<xvY0fxlkT&4}-2H!&^Mqsn$BK{Us4w-XLihn5(m2E#T+y`Tech03=Cjb6 z7BAINb-rrFDKw>xEm0-nDLs{FBP$WV0NB*%BM^Tv2_A=i+d`&z+gm7q1E4>s`Bu#P z;VRExr8h)r)?j(_&W!14hc-(~dPCWqmb`tWS}o~3&8%qA9!0VxX_@{^OtIoEUUex4 z<@ic< zw=HpGsI9G93sP>$L)$`&p0-oTr;Lm9Wy_kA&HTDh*58?>tt?0KK^k|f{nz}Ozh%wI zf|m2(+>_2(&P;B}Lp#7jDqG4UT8|xYFK;ZHdY3%~@wgTk z>izOW>zDimtJ91|BA#e0-YSr0RQoMk5dEwfhxt~XK3N#Q`=B$Bv6Pi>-FP$O#g^g{ zSfz6SH-NNja4#tR(!JubU8TLb=AV1UBW%#F^Nxy8wHT6eETxb7i zbUo;AqfcNdskW4D*QSiN)P9dh>*ur3>e@=b3c(a=**XE%QoPE3Ne^{`=0Zs4bC_Fa z%Pqe3sI^qH#uSvJtHn#Lu63~x-YQYwVj!()R&iPvq_ao8K`NVHd*{dBCSw%G#T%1+Z80)K$G#8+jP$pf1~eUlkE&!M7&p0v=3xMEc9Rx zJvx)=cNvc?u(pOnrci%v{G@=4sQe-^agoGkCVperrj zXP`SkwNKGcK&DnQ-a=V}Z-A7?XCU2X#ot@3O{>$hY+;k^$*{VWq_x1;ruiI{Xiw}w zHa}usRTpjf&Qh@D+-S0D&F^`!-H7-bf?X|iBxJpehM^n-jZOy*H#!fb6qkYiz}TeU)spNbJhfeK@!kYIXmq`& zxGhUj4EKSw!mDoCx(hRwSN-x8Xirq=YiYxyQ8Ub@9Y zcXB)r`&6s+A9u=YHS6pC7*Ce!3w?eu_lM_}cQ1sjs!pqKbD3M-ot`>(U7cdib)#SM zR@bQw>C|&f+x)Cnd$yLNh0gxcs=O1w$-5n33vP^t*LeCwdGyTr-MKU-&ex*#Dc(XB zkE60yxwIv(yt+Y@Hg|H(OM!YV8SpoBp^j}ayIM$Jlbl!~IZBc_7DSx2EKWI-bb(|& zlboJO*3RP07S7EiTV!!&3s;!r(>Zs6WD}%n6-H;010m^YlDo20$3n6dB(1}PndEFp z8ci}TOLa9QO^~z+FK3cFAlb-+X@5DKN&h*R?+GUcqbIG1L!a|v(6C|{G&ah-AStpA#XILqd^vmM34QphQBeOVd z!$z6pf-KHlp;sokD~mH%=$lDi$>OvNJ7nUIFroTPBym>$7GUD zkkIB1VR$B4EsN73oSjL!XL05Z7iN;(vN&^xYfSQKVZ!YgAE9TSa91W7f;f^qnMsC0 zGQi@rTiU!DDA`-7mZfB9I1Q4)kaWUN*h_K|BtuP7?jp%(Nd6yL_aD&L^#1|;-21-w zcJ5mvHiXy^LMDVZL#7ehmVH93S+kHW6GALjN(-SZi4BcL$P7amVl9oK5n`FfOc-Ke z7{1TfIj{46-_PgUU-s}k=l(wT+#m0AYapXV*%2i5@vlJcf{YO@N-D&gkVQ)RSw4i& z{&RpBX8DfgK;ewlHCrRlej<}7vRL+IIan-FQZ2_p9ziBaw6L5Cc|yqwmdOxWtA~nq zmUAIA^+QFck}5e9LTlqNd?kRUUL~)9JgcNvN%TlLO!TvuBjqqL$YPFy!^IGbISLNP z2t`!$7R#*pWU=x{l4?=KQ%}a&Pf8-kd$MRz(kN<>c@guIEE12VOmsbu73oT%t;AUT zhLJK`{5q6+6{W_CCYC38T4O~s%j=O$D@z}Q*4S9FLW}haVG6hd411d$n#&;(md5KCC9ICGL{4G3jU7V%>AQ5|2SAZLi7KG7*xaBcf|W4!zoJI19AZ*S7eQ&g4N=4l$ry{6R8tOD#R8@ z2_#?0leGK{xfybih&@@$ZoA;^c*tzAndM-}A|++%l!@+{mxxtL^!z-A%q3#07MY4t zw2u{vVU`mjvV-OHh&ZPR{8h_~A+${kMI1{d=u;&hjf~=87yWk)yImo;+wst zT#R8cdrP@UQKCz2Le1qOGa!SIN|6_kpCQ$vFd%t*Fe1NF7gWUZhkLO9g~lfLhTKm_s`2-67fnLYX_n zs({cMyHj)rgi75ddbC9L)w@I=O9Q4wrS1}&Sr$WR+3UnsmSvo&6Wdvy=1e^-k>M&hj&7 zn#3TByPM85iR~IXgtUu+ zK&d{+OTx+0Q{RA6n;@@>f`EJjd0kW~(etwv(jgiG@-yTO(Grl~Aa9EHfcyH>H=~s@gC*G=Y34`UA2E^1T=g$b*m{M6&9r zG>XGfstqzE(gN}f^;ujmiRKM>o>oTk^|xtNxJGOl5*oPdmicvf9N4uD8&Nk9&V_|^c+<)~*o zB-Yv*kaWn-R_=fFw91e<1G1~NgryFW0~uwt24p&9cdI8L1&}=v)%7ezsdeXTr}l_*sW8DkX&r~E9gZ%?Z`xBBV;w?$VlcJ$a=^zR<5e2%lZY<2T8T^wD>z9blyp| z@>%34BLzyL=YmwLNJ+Ka9T_?^rdlN|hd}5&m}-?NsgNf_=zN-L)#!}s>CxHqSZhT< zHe!B`vpNDo=bbdG`~OK#KgK3Sob_C={$OKECOKWwJ zI1lr@9deSDprl$}2%+_Jij~Mx1flctDOL*04V;;1rLipJ%tR|gOQhd>s+ITuq<~8` zpp>1CYa*+Nr41sLl(KX}c7bGAtt=lwc30A_B{Ho^R!2ano=H|uKxqA(X7vXo0h!bB zad%o9m0}BOraok*mCN!QanN zXPagXvzR{HGR$LS`x{XQ_Ztf9xD< z1Oa$3e!5@>R>q(Li^YS))32a5ZcEsuyCoX*3YRB>Z?z;Bufs2 z_NeLBC>GNf&9gFCOkXt5%3(2m(HT}1i|LEbuo_rQzxP6`lg0FVFSL5KME3caR)0Wf zer8%*l~l=#F^AV-De|phuIE|^9o_lX4whRWbadxia)w^g2F}c~;#i*M%q%NGNtgdN zwm_;Ov#m6ie<8Ok$zzGfNvR%EU=^^8g)}OuVab3jfn03W zu}p_7RkD)hDhO?zORQBa3n8>NF0r~1$ zF0+c2M9)NXtR+e+#7JbQ)tY0K+H~8*{Bu7g45C?2l3#mDDNevYL>gr6{t>XRCUwTF4+WMb=P(E_D=2X(_u{XFfsZ z2bC$rH|?qBOk{pjGN`1>+Kh}i#TJ)a>n_!q^O5nDq!*HOS<8?a37Ln_zv#?dWcE{1 zrliYy4w=IsS6Eqdbmm56QkBHb)%CoI%*l{qt4~R#s6*yVB{fC5)Z-93pI&J#VR;pD zE;3hIZ7iQfGMSfCscP}w&HA4Cl~$9IDlv>qo+{N6klB!{tQATsRc0=v#HyL6r~Wre z(J^?PwNgoi*kvz0Kc!Y5OEQFNF16CGpi)&LjWgFRsZ{mch;>+L)hN-uriG9it05ru zklU=bfII-X!`h)l-!Y?otlo02QcD_{!+I+=AT)>dR(wEc4)3-S1447yV5KP0^Yb{S z)o4u!$a9b;D<>eYLl#?wO1k`CvButkJY==7{L9j84Y0)Sjo*JDv(y@7IRNsx5_vT( zMVFrj*$jEuieoty@|}_tmMM^*A&*#TEEht4SCYXp5AqMB#mZu-gg6sPa#>8TV40QA zVtNJ3tSXi!l-dcU9<^#&o`dYFWChE6ka);rRy)fNko}bOvzVSttF@WM^kiBsS)!Lc zb{|U|gi?=NaV!Tz4p)-OVtQ6jSQA)G&*}*)pT+d7p0o;COwZ~`tCq#|n%b-e7Sn5L zv)WnGG4-P{^{1>3mR!j3N;b0;Lr#P&x3;p}0XbDk+%0c?puOB#q@g z$hk_gS-yhIfUK}`S$=}dR#L$77i13P8LNRMoPghWC~0BY3vvzQS*w>N1#*Lu%`B#O z@tig4T0PIEck!H+$YOdIE3F(B)4Nz{6|k7z#q(AJi|JiFZ?&+Tj;WVp>MvNmEHfdu zDA~+%9prY%i`J;?^!(I8>Xjt2m|jY|mBwOvDeYD!i|Hr4WaY7#e!@#uA&cqBylfS- zn4ZkbR;Lk6o!aMDtYMZ;2(|OCSWYR;VWs$jGpnpoN}_GlDyvCJqq;(D!cwfVngjBn zl5Up2P!DBZwYCR@GOt==uBU0$3x8kqz96qzC1oVlVxKTZD1~%bRRMVk@}^a%WOZnN zlp^W0Qg76yj)uGe>9W!T(hYgb$_~f}khNA}KsG?$wn~(&4xNO0NY+`SZlani#5Bm) zkoT;*axE7^c0JV=A6cmtB-P^hJ@BmwNWYa4kdq-Bt?YoD3E5=j2jm>cW~)fa>d+k2 zOr^G1TdSz%N>K)(miAjK_7*MmkQvB)Yb7XIBuFlSd}rlz=26IXkgZmYl4@yMtsks* z7Sn3|V0E*YR_jM=JBw+xezasYO}$#0*5)TGjm5M!KUtY9rezzlN?AS0-q<+@c#KZ|Lxw^^|Z^&FZOdz+QOV$Kf3Ru+pnI}BTS zET;AQ)v9GNt>3TK5*Bj?`OR9#V$LAHS^X@grTyKCtO1Qyd~ZnqLyOq;pg zN?|c)y+5op7IW77!^&VWXW>7sd=_&S{?lqyKZoX!8X23Y<;&26apA8U{$w4d%v{9_HXm~+9uR?@9{{g`vX zzg8NHX%B^+#bVk+Vdt@!w$8E(SWH`I+3hUmoMPL9EaseI+uK>pIVEH#-KOWqoKr$} z8jCrnICde6Ij1;wDT_I$xOOXxIj6XGJBvAAc=jNRIbV48b{2EqiLsMz*Yjh}J27?| zi#exAyO714Q>0zWV$K)7UCUz57rx!Z@;JBiVY{2foD0HspOWYus-5g1or&~Lce0&Y zHHS)G#CG4wPSzqvV7tEtiM3N%_JMRM$yQP!4uw#^cZ6NaauS64{3Gl-mQ2X|D7CYl zdnZk+UgSVNfyCKGN-D%`u4i|8go?ikaUJAKWOlb>1M&@I54*KaXUdWJ0TOR_v(&Qe zZI7v^OqVcM#|d`w-CE4mae_U8#awA7*jX&*>Nvs9V=-693HIg&J@rORYa6DXV6SY_ z@+jm_$i8;3k}hGch4-_!F4mc~$j}fp$u(&Mb_`gvYfkib%^7T9!g2 zrhcH^!SXzW<~h-Beo|-N;ZhJ>-_ri`aU`>fWebG*NQrj*(>k*QG6FRpWDl@}$LN|5 zwwFAkGy6bxL*`(+tX&9+z4s8vUXVlVS_n<+cnH;es9p53mJG=L$Q)+ZvP^{}L5{HF zU(uNhSjO7LEH^-CNsqKMSLsYOgqAeLE@7#Q$P$+OBhtz8ctnO+RzhfBO|i>g)iw99 z9A(G7re!P3(RQlnLONp+-cImRw!F>T8+c7w_6ukXC2+DlmWg;3j)YPYkPdzHu99W3Tv<+1iwmLpJ# z_SNI;VU`IH+QW~t<2q=$s^wV_+B1*0<5|v!&^A5ZPSm2?Oe{s3U80EDZi>jLHw6B=#GMejGceB1Rnmz!H}xH%@pdO?p5n|2_FzE9V}2&s zMQ>6)tL@jh=9BCaB^BcHh}0?R6x$*ax0*_Iihm6rGBT&x`2m>*Io&P}$a#=VyF4IykTdL+0ht9k(-v!@)0zu8%T5hQF(k__4+!lW zlkKK}+K3)BTbu-Z%^Qic@{9s&SEil{%6^FO7z|MH!+8^>=G8b z8^0EEk=?FE{)~BkUr9HMbD)u)_w=&w3;9fC=ohH8Hj*G;LJI6+CHmU@Tgb(BlNLE1 z8G5>XiQUXH2{MGtC3ZJUHsp86rFM^!3Nan>x02KzJ*_Jt&Lljou)CFX3Df^6wEJ01 z-=@$WVln-VLfctS^>hi--zc=>Sxn!i&`xGCy{1AtoyGL53hf*g)3+(K3t3DLtfFQal9NMJ+{5pOzmXIkE6nQN!Be8y5_=d*mr za=E>3gD&+4%RD=NqZU6=&(9UM^M#f@Ahe#Zu;Vt7)Qd#OKA6K|dko77ko_T7*{Mn@ z#6&K2wcX8f9^_zTO64q*<{s0==^nq?R-V` zZ1P`*&~vLB>=c%7B9f;hdR=gXU8rP{*yAAFyFkr1*jbyYo?s^7Ym#btFfw{ti7dxK zs6E8Al-wdugV5CH+r^xj0y!Nu&$kDaRLU6;dIB}yPT8VsHplXOyN$(M{mr*mvY4yC z`F0B@F0hMO%=O>`yN<?&SH8pmA3P(DrH@P zEl9^{r5(p&`Zkqzf{{ojiN*AGD(zI3TFzA2=`5zVQ)Oobgn9+H*tsm!N1~}OvqhsGf6B>JEF=R?1X}X3Qbg zTyGctpoOMR&uZ_sJ6N9QrC4P5v8;j2L_Le_Q9tTZpFyZpgI(|wNvCCcdiU6cET)In zXcw`V9$KSa%wl?IjdqEWO0g9+(^5c&sOB!q^vCYC%UMi+>|VQ;#q`JSwHsLeKt0qS zYqHx|sHaDApWPl1>W|%TcLs#|V~g#cfKVS`iQOL%>H|Dr4+ez#V-MQH0ioX4L-bmp zS_+yvwJptdY(S{5wbYIe2=%odwi5$FeXU3Alz>oQtHquWkXs?k?96~rU+YmjCm__< zdd$ub2=%O5?V^BC&+2izG$7Qodcv*>2)&K)q}>{jLhKuD_PT&v1$oLI3P>4bxjpKa z=-QzE>eF^wK&W@R!p;jwHA+2Wmj|Q{@~qtwkozIe+1&wYfvmK*24p$pc{^@fbn5Mp z7wpu4ya{>H&JD*4diFLpT#)@zY&J~VrTwK z^)!kRkjEgyb{ornkmZnH?SX*24Ef!z5tb@737NH!KkcS~d;-~FuVgtJnXQn2?Nm#b znhCK^$6LywI+kL{J`guVqgvAZltPY##DvmqEftV-NH|okq+Z+&nF5Io^|LfXrbBiP zm4&EOz375m3fVQ(t)x+W1}TP&3?YEOt`WaL=pCv(LZciirMJ$F$m|iy3`iAZ&rpGq zE^DVG{3a9Lo|K_^~^`&RcM;S14DzHnE;`CDF=p}7@f(3tVXHC zP!h{c5US^(P`(zc8PW|oBvj0qE(q0pXsCo`JA}5*p`j&8aGi1(#?C~kLqk0*sgRE# zhlS!KO?``Rw&~%aWF^(|bY$qgxWhxKEZGox|M~DxI?MTx&rnZtD3j$9$bga@Es-Pl zh)|xAMsYPV-ym~Ds5Br$kg*}hr}=3V3y}E>k`jt%xf?=9+)<%qmS%{PiQk`wCMc;F z%OPRNF`*tMi^Q9dJt3)~&0$^h`;h%0$A$**du*E4Mo1Fm_)sa{ouZ>)3*;Ec_)rJS z&yaM;NugoR#GqSge-*~+Dm;s#-tvcx?e zPa#F24wh3`E)T^XK&9%%*^mKb=7mxMvITNQs7=WtaS<{kSB6#vgi2i<>JG?{kdn|K z*Hej7ze27JZRbo2dsTT)A z)<8NUXSAar)Mj>uijSgF`i!<7na)scK>8qSLahP$8qyW&RI){#)5SsdXp*AgQenueE6Oza3n$0j?>dJ z=iJ^T9ywv(-#`hV*Le~hRkQ7^l_?`m4xk2XX?*FOggRIjKyp!PLuk}^ zJ%_aB=`6e=}=WYxoE7{_kJ!)epS4o$( z9yMQxsc#JBvwQ=&4Dv;&kcG}W*Fe4s6|?+_OgUsrsFWoZd+{BR??PoP`#_o?KZMFz z4u>p-{1mETIUcecvMp4{k^y-M@>{5hWeTJV@@J@- z5Z76uB-&S(PP-C)?J$gtbo!N4sQdixS?G&8TeXN=QBM-KMXVD$f!1o5XoQ538R3+$ zv_M8ec6NqYo`sBt#5uVq>Qbwz9>}gv2h01AqaeFEWhd#(0OTadC})^u8{{m=9!}B8 zI`a=C7ZUFbvFwJUya2MdlbfzH2SF}}?Bn#X91XbvvageOiq4!2xeYSL=~YrMrb6z8 z9N;(;DN`@bV>!@C49LUCBszI4vyoW=IoPRFQXz^UFF_7**0EGTK7u4WL#I;B6=E^u z2gp&*V1||zEXO*{leDac*jacM>1miv=T9(cLo!C7y!Z4LQpZlPR-Eya-te$#RO7 z=**LlDb4_AdXRY;GSx|)LZza6_}R_`CDHYBwv(x(QLV#HlsenV3zX`COmj+=bcwB~ z`4h;0oc2KGE66!cFK7Ni<~zu_PW)7wdZ&oPIpGh;`A)u)==@yZ6e@|%&jn72l0{;F zl(HwI@8>kI(AkD$y0emH97~=v{6F=~a76ZhFZ&E9QHwYerF_&g!|7q6YrS0|`A);x zRH{NuL1qugEN45*c@VlQGTW({Mwxn%2T4F?w$r1eT3!mFYmiHwK9*}CbPaN;vzg@< z$U!Jo=xk-FgB+=3JIi9oc*tcAeh^1nP(BLDP!g*pa-A~A8O51rkeQ0i94A3Zg?tr~ zt0ajtYatgw<~k{y`3N#k$poE=)Li6bYZ04}nU747Q_AukqyjR}X<^w0sexSSv@6l? z?%oBt%IOTq{g4tTR5S?DP+ogJ#2Of701?u~k?oO~sVvuxg2sHq|xcn z^~g1l8A`f2(+??t-0SpkW)Lz@Ngrp1In(3}aK=L)kTOlqAZOwsRL_0R5ND3%%ze&w z&P?OX{SJQmM_XAIaprzUDruC}oLTI|ab_837CZ5r>4aR5X)STaaApgnQb`hLB>J0_ zdB92G%>EF{Jm92pW;|yebkaF9jWZ8AnVgveq2+qW$>z*05L)(!oLrp|%@A6v&Cb?~ z)pChvA$LNSI?0!4Sr1tZX>n?mG~z2RmUtZUsMEnR1bH6vnB!bZr5eSbkWR?sPMMPE zp76L+!v}qnnTX69N6ypoA>=H`TTTwk5M&x;trK^p&Wym-z-5s2 zPN|Y;oA8lSt|ZzfeB^9pF>S)fPVQAyPqYR2#OY))EkK_$6cB0wK6MhV)}>4f@R^et z5NZK7I3-G=$9un1rX;%T{Z5S%+#|wLT#cpZce+dTavcRJg?#P|u#AV?2-)bwU!yZ8 zu?#rb0l6EQFP$2eiO4(#+3a93F}kCkpQj*OSh_4~Tb_dqMr0~Vt%7_Pk?D}PAwT}V zdVY#zs2*yue~t*%^8rdlh3e^tY;*c}4ljmmh73F1*XrfE67n77H)jV6jle^rqx|8d zUZ*pQklBXJpH2-+3xq~u+2ORXENA)K>0o&U@)t_|y`wh1ewup`i;7tS2%Nkn->tu zB)aWN>cvOMkR0O1-K0zX4xy8zOC{uGNSa%6v(DTDSq(YCT~|p` zFWMlzkQ3d!DxFya*$6q=Eey!lkaV|+sL&vvJqj6$^D{j}vg;4|0}U%R=`;;vtjWl}hTxagakHQ{AK*T`CK50%V#y$Z`QB z3zFk*S5l7=NzvIdO_y2#nFBfB&0)D4at$QUZMvN@)$(BoJtvysHnThpp(iyn z+%}d~5V}Wnq1&!S^)t&*&xLNc5d3JrAE`De(xL?KP#qrR`LikbKE#B@-vir98%=Qv(SCNR01tqqd<-2x^0oSOt$;x5smu9xY~?E~&QB^BaXlp=Z1 zty-j~{tDz+lzPamWqA{F5~SH}V0jlpZRS#U3ClMu54$Za+gKiP+gPjJ&mV5}E3!Zfo?$Md6AqB{+bdy=A^_v5E!JVKa zdaiuY%~7JaPBAhsxon4Gb&0pe33X@tb$5)CEfz^RN_DtdN}~PDH{5(B zx+lC4nK#@*oso~AW@_u+aEn=9h1{Vsr7RmDiM#4-s& zHLrG?SuW8QR;py#anKok}iwx@-{0ORMKfVxTpI#q}z?VpGsATeIPGF*1CmCI<4a& zuR-2+yBF(B7UV6+J8sGnl6o-*(gRuN#y_YtRgljh@3{jkOIY4_M?FNDPOBaA6*4_; z2TLzx81jL;VyVvj1)<*y_qy#$D#WOC{Gb2ed5YW3axf$o^0C|fu%7xj$VkX1ZssFe zvLX9IK6MM0kzk%7)NXv?u4AcS8E|(fsSx)<&PJ(CZuX;8s?%BlnF;yQ?R`wkT1X+} zE4QOn%jb|QA)DO+mR}(^K)!Y{sDi3To`S1&$QHMlB@t2!`Nnmg(3$a&dmw{uBFj_= zZNYEdf+s1nNL&b^rTEURWx0ywdv_~K1< zc-}fC6`~mR$Q+Dh=q0{L)7oN{LFhhYjF-uB2V^8NzSqQZKZNc~?&P(yJOFH#Gw~A#Ggq}|B=cTuSkpB3)7_aOnIln(o=P9&E#b^W2tBVn$ZO@yIh;AzTfv!p&K&Hm z;*5Dq@DQ()Gv+P9L%bf&%ta}h=OnL>bCS22rIM$0sJE5txre89sJERnk3p`* zQXJ-ChzYEp3fT@RQxdC0Z{9JlW%io+i&dX+r&(N9UygVgc)-jMr zF|FghQkGL8bmWfXsdu{O=pOIYsZ8|x{e;LInqx33<`_INk}*fz$q_L}!wsF?lv^hn06)ib;%UeX*a1wC^)(`!~zA?HHqnai188)t5Y&^kQJTgjORA+!$9 z@;a1M%9lBl<#ltWi!)hXFK0gB%w(^hGv9G$vNy;Xdy<~k6mN(#yF+MNQ@kCVNrKRm znyFsWYkDi65|I>^b0GBWW~!IYav6k{BHPPkxdlQsXL~tHD&1|HtcK+2u5y$?>|CRLg@P zucK6s*TZr=WQ~%378+fU#$G$e+ss0v3)0)*=XgUbG?L*ulsebjZt8)2qQqH4b672D zB*U*D=XtR#G?L+uO5&C1wvLuPSM5K+JBsJC=sSvkqSW+=(49d099(xtgzf~!L1z8G zdM=7&=#Ju^$P`3`>Nx;%X+%stMgOm!%Oe@8ht6MDM1<-&2K8JO5mV1~|F53XNQUZ3 zN2wbkLiJ=r=0}9;nGU(htL1fg2DTR+O$)pRB^5FcLhEpW*UXtKI8*MmvMk_CxwnI5 zJ#Xa-&*{?Ji^j&Jtz6;7vD}4Hw71;s#j`vBp}pm1FHuRQe3CPjUNXxYoT>EElvK-4 zAeUn)s=Qp5Z4oJDi96k7nph5tNIT0UNU5r)kL3bLr4kJ9qxQPXA-5_?VJYX#EnY55 z17~jWYFJu1Q|+x_d5JUC-T=$noLT6}ZauAj&MfrOSbpS8jhD~zCueHBIu*ty-yT1)d&iShOEz8|(ut=Gm<%5tX{ z`?k*9&Qj+Uu`Fe|+v{O@0YXPggO~aam0Bb^A&)@r^|Dz8AZ?H)uSiL?w9ddYDad_Z z3CrG)*OipB9K)IWy&9IuoVnj?V7U}Rd-!5+iINI=BZT(w#a=6C7I9{Yw}LZIa%PFQ zN=c<$4WSnD0k4zgLkP8y4|qK+=6vy>*T?mk^TmVSX3m&%!9!l$I=$V^x!@r$p2eIC z9`X`d%()XUeI$hlyt*YlpCsDJwoZ!|r=(u&gHoGOYMGbHk^=c1@~D@q zOGW1JF|S=orJy&#b~+coX7Zf%dJgHGuH7L|dYMXe4{blla<5EDg_wkz4~IPCtx&SX zqPM1xhCJ&zA5cA7#zR(mX)OOiDS9jK1uuhT24o^KFM8Q51(4Gr?Oq zTF5lW%U%gfIploED_%Lvt&j^LtGrs4dI-JG|Ekx-avx+iGOu|pEK4DUkk`ExERRDj zhje(WSm+7VRggElZkA_}xeoHC*URz>qztm!8(^V#mntBg-c}{m@?8k^Qr39GEL$Md zCt2f(57kzVY_Bda?tkPhZ;Tdc#@X)nl32_*+udF&3yrf~jj6BoCa};r+x1E^S zLoDVveb?L0Vvf^yJ=v@FRcVgy_q;eI)$(4{^8}{#o)^#ZG-QR6M3%Q8FGAk;l3Bih zys9LP<#!0RV?ACv%Whe^9qaK*lvK(iAk@yU_sT!|@9nkTYf(}u&OwH*+CK35v`F(S zi4VL17V|5K54^4aQ_qLqgpaA_=#_7;m-dNX_9E0wEo85k&QbxP7P8mNQc^9=xYi$e zIV@&e>yNxrmPVAKCH>edXK95{i~X@z%R=L9(|E$4cnvJ0A@qC3PrPQ9mr;tIU-Wsc zEbl_-mt}q4N|pggC)V?)-YS+~Aa5(_W^pE?g@k`9w)SOA3VMd4so^2oiUkv{iQSZ;vOR^I5Pu~b9oY`)RU zV7Z$!UwBz84{_!TFPEi_GXq{e%S)UY@QPTvIJ3zsVfmaho4j(CVF>L}UwTa}?i76= z;7hMnNu}5WLYc2T@u^-LW)$?Vyc8BQ3i?-GI*aL5ZuT-+Os{gYm%~D%0&c{%_}a^3 zp-}<9RZ_@8qXPa4+2R$m(5Qg_Dk)>3kqqe?Lyt;tU5x33jP|}IFlW;E%rG~w3oe}+ziI88t;SFj(6oZg6AisHI z`bjFp%(1v`g8c5KE2$P@D$eGRKfG2Y`aa2Q$X{NMl1dqi%pAxL&-q-}b10-lNrsXt zF%ClWEMf{+&VnpJM#L0vRP&>ji)!{_%CxAFOKDWnn3xFzy5Mk>KS&ZJEhc|R%UH-MkdtG2SSCWUAroV^{-QIJAs0b1W74;2xe#(0n4 zKXs`NNH3%?X3Sq&dLdsz=EgLzY-X7kBX{V`HpmaiTp5$~uNLoYwCa#+V|py?A=on$ zA-kN9EBcruTT41;7R1CmS|&sGL8dBZ*d?hHvml2;YGQIdow*(|4pJK@UhfIgu6H~aWmNk&eAos=ekJR!tq#W`<%*s(D)#7K!?U3e}&fRr}zBKe8?VPn^_KnEQb6X zlXI}HIgMpFrjzBz-EiL+ncrhNl5}PgGA~2^jwwG(%M1uDsUzbL*D?>X9uk(dEDIt1 zkP&iJvd);JX&0FgkS)mUDiZ@T1Q{ulS?)tUe?oSb=||{#mP2-)j@Cx@jMcIVk_g#f zW*!-p@sLAgX^Iva2WB$l2w8NLmJKL13v!I?Ia#MrJXxk4t7SjP z9mu51j^nh9g)~DZNoSlEy7&G9a%AQSRH{pw zG4s!pxh!VP{9IYcVn*vdUzW0%(R$C9^wndkXUg7sB;E^T6N?#%_X63+W}Nms*~enWTh5b%EY!22Z}jBJ?JO_tgBE)t?ypLTcVlRN%(%oeWIT%* zBl<#_#A3#XzEGyInDL)yO8Sy4)nmqgo+)!#%sA5dvXF&(X!Nb0d|Aq3#;l$tYgo*f z)w5(1%X?TGG-CfnvX#Y*|9p{bXEEbH&z9XR)YCg1J&@V5kHw7tTp$No?!ekO6*U*g z?JQ>e=ZhtMb(EINjQ@PGjAt?9KVKq~Sj_m(m&i00GnVqDGLyxOrF^N(WijI<7s^5w zGfr}$EM+kxTwNw>Sj-4lm&qm;Gs4vz*~(%@xSAu|S|-(G8yCqz zma%*4FY*-0?JQ?hx*Sq%3dXn;zG1Y^nT_|vY+Kj$ak350yzrD6#Y`*Hpn(exol-w3fTdv zkV7o5LA*TtzFVfDg`raKLqSTkG=oZV?<(xoDA2-M>V4Na?BEXTCySC9>|KuPpEu0bO3UvJbK(a*o=*E)@y>9XiK(Nrwg zy%AB*i6HmO0X?nA{4AD(0ikF8i=~5mm~?;DJnvp2M+JnQcRwH#mFRtyo}@n{(>Y_F z`8LZY7W2&aVM$|dm_3}vI(tOsVq4R)zm8?62H7IF zvzT!vTVxV`y^gj;m~kdsWG;&tXR<}suxuWQDE7$~+0J4{m28oNEM`>678#HCF{srt zBZXpGEauIJ7MaFkMhb0_nM$G~g<^goLgO;osU8y3qjFG*9vxSWS|($$ zf6`i|ak1zQ)nhUxAT;_}tIP=qjqdfhEDZ>anf8QS5)c}L>q*%W5E>7yO>PbdjfeJ> zl(@@brcPtHEtknGX56`_WfqGWo9<~@6evYw!96YO0@4auAy)>3-r0Ue_63ASnR`~! zZx7AX=}37_=Hj?BLgT!xlw|>-5#*ki%>ki%l`ly89hNCYW4OI22LnQ5+_mHGLo`Dp z+Px%G0zzYyy)1JALSxgtBI#E=RI?e8Y?WNXVn!`{Rd%qLaTH&Z14a(gcQam-7(iIn zW5!W@O(wFKaTH&d87yWT#n)wFKxiDr4q3}$#&vvCwy~IT9p9AeSj?z^Z^|JSGjiZ+ zISOxF({h=yuRCQbiy2k2Q_?&9)Xs0i-g^<+x=vXYkRnKzT*vYkGB-ljN_r=pN|7vt zydyJl9|p%oD=Pttp26^nDO&a9WUEW1J|vtBl_?8li8B;6@eHFM?z*~XH}nGfYkmWiDCPiJj>vE)H$5C2&1U@3&C zyZX|>Qv;gk8zAbgzKmn344CfgrCYZmLAT0CevB^ zIrEv!Vj1Mj2ARV$%$W@`p9P-`Rokmy(z~WK&$~ltTlC8kmcuynxh!KjnKPfu8kQUg zE&E1U$8s@*mVKjK!g4KVzK|^}3pw+JT*1-=X~vo#knJoFL!MO9$^?W5U7`Q4mku#emz1vCk zOykUEIf{jz^u35V{8}ck&=cp?O6Z+TDs>S`(fn+Y^iC$pdiqWtjr`LCH#%3m~*je~_zKE`iWC{XurKTm_+d z{!#X@+z6rL>qptIq*B&!<|nzCXU4j4xZ^?-%zqQGJnWqCDFd|U$Q`FRG&5xnZIPMk_z>;Q`)0;$X*sT zQZe?rzokU|^uFj$7wG-)ZyBegQZ2>dsON8)sWW0rJTj_<;6O)gvIrW;Y^H=q1x5_d;rNqM*5=)NfwEXkU0?F&ko3ykg#8?BzkqTlOKB-m5P3Ib0>e4 zl8VSTH+S;KaK?O(Bi2vijQQqfte?sm(>EUBPvDGsD|m#TsWXwQlAZnRfY3g_v!53b z8as3szc3&)cId8ti4y(p6Mb`Yq~D@5atoHd6iXWKx3M_WamQ6jJBzumwU^(^V(x40 zy zAkRR?_(Mu6!~vM+*B}S_NptnI4rfX9OIXH3)*y3`-_Mc(c^7hspKzrvbq?e+$YFjm zi@BGZ?5DEKLS_pxWBtObbg640Ly#1|RLLSirT&B*?PpxAGY!c27h?QFzqEuT+DaVf z*J@EcB5GTX^BY*GM?`JQaegxk^+0w0ONXhgeMS;sk#?i|JjQ;5*l-C6%UkF~N^zF};fkemo2H zE@;_L^vAGJ?}C>7L_e8@dKZ*A$xmgW-UVe&^3z#N@8V=Xlg0EdPWE$HOz$Gy&toyY zi*&z`n2^aYBEeiaM#K{ zMM(<_oy{qe;kU8S*_<*Neme{G3Z_6N`5i3OE1>TnO!C*UP)~+3r}@1s)RUpiY5o9< z=@Fgo53-mZ(dqs$i|ILJ`a4)m&mq&7*XnI*dPHaVaV(}sbcUb6VtPbp`iU&2M|7s2 z!eV+CXZdL?rgw3cpTR=C3)<(i{45sgUC=(C<>zXNw2+hiS|xgvo*ZN*`2iwQKB6_V>G zm+4Z2kmn%N{R|e7r)7qprvztV$g9ZA^iyt9r6Nm_?`La?Ty5q1xk@S`S6lgh0cQ?C zJzW>#>8)SHnX!=dN=i9H`{C!1i~MrV(0=%>l3LEten^?wegkJ{KcviTznL?%&;JG~ z@LM@U`@A)iWF=>4UmXFt*k8p$`|3y~-7K`PQsxrBhlTc4%3R|2Yf)>1dMTIs6Bf|= z(Z2zwwOZ)+Dydf6bZ?ZJ;}0ll6yve%2SVohIptJJza4QTq{z=x5^Z}g_Y1Vhbd;i= z=jDEpk}5e3LOsvR{nGy_HP5eA(q;WJ5+f_3=6U|+K!*BbSNO6*&9f*#J+u^8`ejP0 z#e9~l{QPR2SqM21^<3=_usq6{YyF;uI`a%<3NqLEoi$osft(My!S7e1&+qhgn;ZS@ zN~+}t$XtZXO}@C5N=3&izsZkd89;`5)X3m3_-g_q`fh3=>M7@pzMEPMxj7={?fq(h zjHpCA+ylWWBHAx#&2SYnV~bc`n@b8S#I;=Zlig|U5Kf;ca3^(_p?|IMy3T) z>*oce9df5%7?5`$cljj&`2te!m$PhoLx^7>cl$K~5&0PR$zQ2tk)UaffHe5)ICBKg zVWZz4kTJ;I>&M?t^Ne04&dVfCeo{b=hTP|8*6QUt4)xGH-|uG!WIQs9)mp{9oe?z7 zKo(?)U#c>lG6SXPitGWuTuGN2BRUtE2mC4}(LMYDzbPOWs!Urz_CFE7cK6!@LU-^U z@_Uu6w$H<~E=H+le+SD&5W0?A>N|JnrI>j}c?N4B#OebW8pQ&WEU5cr%gFNf!vQ$Anggoaj(WNXJhk-KB`>iZ@B184O;ICx4 z2SRsB+x-p}8h>>IGB5c9EHo}3UGKc)Z)Gv#!M^Mdv(R|3wB}#-MV(p-i^hZ90(r%c z)#97cUtjg(I71_;QmI${1SPBO2QfeNOZM0NL?zMv=QTf>GiKRe^Cz&FWq;i-QxY8= z?hU_+WjSi5YmhhmIwjHl@J+u#XCh~`H~rRt{De7t)9(&QXae5Z_Im^J8!~JB%>kil zz2#4+r?nB?GrRpV7PDur^{bRb_m;K(ke0~a@{XT!H`UW6&EB%kFIEy=WAFJ@N*V?2 z;X5!t@A-8BacAL8WY+@ZpRZ(f zC=Eg_NuOV+q|-VZas*2C`E@KaAgPc~{XUktkP{%E`D5i6SVsO`;BGDb*RTV~&CWzh7lmhc+Tpj?5;%<6fG>)uC@8baZd_ zS2k(+4MIoU*Zu&DH4{f1WQ#w<;zOvF_{LATUzgeyLfhh7e-%ptYU;;A=(_`3{Z1u|#3_(PDD|U{&;6*(G_GgJ&r+hl_&}}tFMhF-N|BEYwLjbZ z1|`+vS_ox^{btTAfINVjfAtd|pqdwn+aWEG?S7V$YViQ%Nys054$Bi<&mVpP%kvOg z(mx~X*|aTx`bC`iDNU%U@9@h4LT&HgevOh!@jB{x2Gjc2cOInqsTA+BSmDBEEuTZE ztqX-am29$pguH@Mq3}AEee!Xq6yk&jS*Ad!Rd>U~EDaFaUS1fVI>NLzS)W2^yUTE_ z7Jtkvy_NlNJj>0+#q0~AwU+9Pr$7=D-w>I_) z$FtmYDAp?W@V&!HT*`cFBO#osWJ~1BBm0FjxRe`DMp9!`6`-cpT?x5X4$}!9ByOz1(JZw5#d3Wm`k;c4JSSpT~b=lM~2e^LU*K(3}*#|`o<~Y z+<;IEc~rPWNwf!YbhwqpoI#EWx3ictNNTu`#k9}Ihih7CepcJ2JscNqew?IIjK(}4 zh^06oyo2Rk5Cv+*(+c_~jN=dZ$bz(SPNwvCeIt=xk7*1ljeh(pzRg%k+jhgA4 zds4WT>oGm*lfr#0rjK-TIPpoEy6#a=Ks~2~b6F^JDr91Ki4xswIt!8!ZVgBdWKuY_ zjp}Js-!#dGoE}aO$fc0Xa4QR47hDNBGu$4KQpj21*r%wTXisl)I9Exv8rzxXaB8?9 zAU8v@!}zQlN>!_0K-5B}g-0pTUyh)qI47K_WRo=$>n91@{k(9h7XMX96EeBs3@$~z zZp!3_i&$o2Z7fCR{O}Sk6<>(oAV8*vTeMi$K%Q69!7>b?Ju@%dZ8Dc(jA&%?!uaqU z=6RF#2jqRojBu|OfBqbOyw42xamJmiOU(>#R}$^h=7;gQI@F_&?v1D?KOCo|(^`m9 z)W^;br?A||GAo>|WRukf`3a>i3g-pnS0$Y+Taft|GCRDEWlWL2!!SGC!*YH^dRZDF z?rbX6&+MS2wh0mWJg@wRP08(>3Gu;ZXshYsUHEA|=r_;l^;Q zlIT&eAiPcth<7StkDhU=7ci82UXUsQz~ zSj^jfw}e|+ZbOF7Al2bE7V}Qv!thp>d$^uk!$Vr+6A*gC?Y8g^7IW2qTNs~%#8&Q- z=2w}wg=3X;%2g;uJ>lEJqm)GN2;CM={6D_#Kd!I&{~!Np7SEpN=kuH=G9e5hgb+d) zLdaVPAq-&%VY4=6Nf^qeH9{lALMDVvENNQ^A%sTK%WDYn3d84ie?0DwbI$g?T)zF+ z^>TmQA3x6H{QmJ2QmMUz7~0m|5zQ7-r42wXMc)@j8)P0$Ey25^9Wsyjg*)2T-5nj_ zJZdJ~6HR`J+Eb~0jXbm+tBq!{&>L!3BXeyuS4g);Gm4Iu>!QU%sx`G0T@-ES7@Dhe z)V(-5#(924W?B~aMW=R9UEP|R;q}pSA=Tm>pSJuB(N-y9J5O8VrO`f)Ib(0R4Sygy z%yI>Uw$BelC%9DQZt}d~foSAqF%z`EQTq+(MPqdODSRGe(|{Dj$iazDhkso3R(BGtEb$ zIYO!<)48tZXs!^vmkpt9RCBa|V-Dn)$D&0Xb2P_17A@fzbqDp{vbw9iSyTz(QA>r3?#Mpk0AdbY-9=I>|A!Ar$juH1e8U z%D4EEETl&q<I$TMnFEg}8D>z17@pwAg$fB-zJRR-eQtFDw z)6p&=)#4h+QY_`Cqk|lyu7Nxqo!}T+Q)vBqI-0UlwmAjIbu{u%t0kC7&x+8M(r2PG zL`?8xNL#dkOVJk^hz_&R?_azGc|Mx*_h*=C-8=VYE zBcw0d+!w^OK;DVwzY|D1!A>T&FL$VMu8r43L{h}5w zg?txvLh=M;ESegU7a;$MW`yJo$oJ9gkn}?S8_f;Ldyw_ff{=U+`5`(pBws^*jLr(l z_mH2WZgHwk))j7c&|<=wyp zy-Y~8Rsi|mj49d_yf7QjbEm(2Y-N zG^#ZcI=9+FpD`53lZc7vMIl)MNzz+{)NAulsuQB??IC#!V(61!h;bHY{j_u}ed?Ei zybrPUSuAwVg-XTr*&(6Ko?aznfmV&WK8M8hzL1PSw$g`$1aE&N>tj;at9ORvA4rPcC!{+;omXzJ4+&Y9 zupFi6Omhc)jO80hR}P+M)5kf_Ul2NqOVuY?60ecRKdE}_uv``%gqGKidiuIRXnF0Z zx3g@I7`l71linQ?{Zf)4mOT)&HDqVK>}#2agx-(aS)cw5NpO@qU5}5D$Zub#pwx6d zm4&Y9(N*+a^$a1w8OLsVmXt^~GE={H({n;GblkF=UL-^w`_VZ_nm$WN@W#^~`iPK9 z?Ih%(J0pAO#otnUDz!5pbiBH!UdB=k*%d9^Qy*iQ1)+OV>H73hS?YS0z4TI+iDY>M zySH96CS%GGLtmZRN1r7mm{A#elN5hOW#|JeYDQ(~k^fMh9{)GuGxS;^)&6K?=nX8l zqb?es482{7IM1ac{0x0CBy{YzuRbiK$N$~-ef1F*^*+eH`g#`irpdm#_Py-aBGg5h z_ti659)wWl{q$NPJ(_wKWx6Aczj!|#EWa?A@E9;`~ z>StnE9H7UAED&GX&xRbN*9wtuPSFwm!FoH3dQ<5Ty_ZG3&2)%9#G>AXIYggeQE&7d zsvGOY$cuNf=$tWIPYns3S01Kkg@oQPI$X~W3BBKRgkBO7dgmxduLudfId!Do5E6O= z>nOb~B=n5p(Ry!4=pCpT`fy0-O{HV>$&k<+VaMueKLov?_sEXZb3$@EBv&sC3B8YY zyj~g-dTZN%~MoS|BIu6Ct7ZtxnM+KT-=y&@zu8t3Y@A)(PYPj3ndEwA(Swvf>LDb_nfLZfkk-WL)YjSKbl zA)zt6NZ$|=n&C6`>Em+5)S39jdVvr;jlk#Km*|B;>a?e@R-TR#yF{N5vPfKoI2Tf) z=T1OW-ykHorgwur^)HI47QZ}8d%YWUgN3ee z()iq<&lVC~!Mjm!{73de9TCmZhlJE=yQ8jUsB4ZM|CeIqzG*pRuAU|&xC2$L7qh54 zQ1kS17CINEr{L!4jY6u$ufWjT4fFI?A)^TtvjUmt>m4C^8FDj@+307igDc6Ex+7#= z!hvWZegE(ly->(#!fB8Ch@tn<>h&g; zY6!iLRCtK-XCluMy>F8|OZ5RR^$=pNK+IBoh~+6rnUJwf^4zaSrqGB5$4HI3 zBPH@8N>O_n^<y1K!%#Z1vo8);y@8(kL(VkmT*Asdl z%kPl8g$!g!n!W@*zKbQ!Z@2bt$NeURluj(JY+He}2h zkZ$Bzp%>ax)}j<`{Z{B>j+9FfL))JfdWI|IMo1dAhb#0(mU)mh$n(5j=*gHnA=JX> z^@6yRMhNw^T`v=|KzkC>kC+$qDj|!6dVsQR3+1!TG!s_o!z}bJ70rZI`g#_+v$g{=ck2@@wBMm) zl5Snwn(_ph-_nbc<)}`%0l#jHQayV4Hli-SJ-vFBl*qP-p{3lbFJ##RvJXo2>J37I z^(^Sni$$$pYxTZO^7QE=o8);{U(YcE9_~pUf$M&H$~4)FgVCM? z(VqA9MwVkCbguV-zFtU=_9aTKLa7gRBSn@v7cum1+9!IG5d4}aV%|s0pgt}n*p7Xw zPjZZ^{Zl<_JIWJe9@1yCs64~^LLot(b^2nCQF+$sO`GHy@#ol?aeV0!EgaJ)Hp%=S zJ+i&1JrY3-ogsd&8$yEl{JkERF`BCDd%c@Qjm8i9>>Xq;RGWX+7YYg5{ENPrV^p4B z^xo8s`~I8Wydz1Sb_GT?4{iQKFW6bi^^mh58+2#-#&!LzPZtu@^^cyuNz6ZbgOH$K z|LRRb>a^RCnZ6bCuRg-^Aml>Sr5PJ`k#(syCm30~Nl|^DY83CjaeE@hq>!LJNrtuu z#RS(1l8g)?J^rXB8O3{w80|^aeg$ebj5Z;`+^~$IbQwc4^E$-1#zG;%tn-XUAwlhN zqnTq=FXBcEi|WPJM!S$o?R8{+<0xFWF>>~zx+=BREGb4K%Lgpm8EJb{Oi=swMz$1x zM(tqa2npJ=gOMvG@&)qTgkJ1m}7zs_(lPGxsG4TDZG0TS!o9cVh#KDwS@`*ni_v8AhHE9Cf3G zx1kpqMzfG0&%Q=c=Ek*W8YKrvQR_~Y(Iq5k&%s8okYN5CYz%WLwM-8-k`JUjmE!%% zTGXCxq_WIFd+vuEZuGKHDSFE_$0#^x9d5`9z~cO5`e(qHW8GMkz}Lgw7&QG|E}-<(NF9isea;$unxD`1_QTjHZxK zo|B9=A;CDGY)n67<9?lLgFJLJILAm~c@;w2ggHh!OE1UVWMs2^!Z9})c|v5H9n>|~DB>7(bWv{1 zVj1N;8%8#JYSfm{f*+ z1-_^mUge9L;kWvtW_XP+YKAZLMa}TLHxioR_xPe_c-=-qGklQ}Q_b*tU(`GdM9srM z)I1DC&BG;r9yJdGQM0bWk5RKO5H;%pQM1mMM772RqSm;jerC1C-S3NYAG)>##z)-US?=V$u&+bOS2875FyGqEgEG4eN(zfmuW1L0J-d7B52DP~-qUQXo#&jVv z^YzH{s*x!~W}Yh~hfAsTqSMG{QJFi9ViuM8HKR&MWn>lFd<*itW-JyWGuH@d;!fLWi`pWs zGCEk)7_KrpS=4B(GP+pQXsj}NrTBZjZlj-L)E4P2V?ao79R8LuETl5>UyLDrmE|pC zT!`%H3LzV09)Cvl7{+mO3{~wtMhc7S>DxvIi>m!?V+M=r*V{&kkjls(sQqQs^|mov zh^+l}Ayq;~6V%?J*J$TFYQ$C>(~sYHd95}wrTA@LW6WStZC+y(u&6e#HA+}io7WoU zLPitRo@lL6DeMURW(GWVDc*p2uIR`>#0q+>S zEZ1?&yGB1tHOIVb3<(L&6y7tkPoTb6YD*E*gAx0{C}&v)c?a^LQG23{c@gpn#D&#`QRC5-~rI1;W&CRUyWz0NCIV55h7E8GYatFjPOD~W@ z?O6h`&2E-Q5c3$sGZ$YZV^%<3fNX7!v%C%IgluCL&7_#%3d1zBR*0P8bd7pjvq4Ja z6O`&jscp?BmT}0tLRv$mK7yo}-BSD~1hz8=Skw~&+nFOQboZ9NjI^CODWpXi+0*Q0QRAF$_OqyQPB(|7h}yS6FZMFWLSjMoHYY-|C1f8n{YvVoT&Agz z{mfz^l^V@(+6y0GmI(=-csan#x=PLswY&~6X9}s*-sfH%VCG#dm(H*+#idey^kwK8 zDStp{Mjc>gUn^zmJluUldk!!QSRBZHkOR#UmTe#h3h678rFMcG206%du9vbGgnE%> z=H4JB%a?MN;~~eQRF>Ixql`HXLbK&yGcsGsrH~U5bBI~NawCM=e5g6Vaw{YsF^8IC zEVU4N-{DYm1Izu80ukfPk(sF%g+ivYG(+e)kVDOEmggYnAtu`_5E9JH!%Qqb{PENB zh&jyc6*1VVXUPWeV;o;^8%e!3r;pVuI;L7b0=A?|#=t~io zBl8hv=1tTKzLO3)(##Sf-{iVhNS=`3*}@~u0wKYc7h_{=cJ zS^kF5+I@^U$zso!Yxgnc)VVZ1vZuAE{a7iel ze+G_rASar+EJctNLJC-pKpu+8GmBVGgiuVLSt3P@&lB0Wf@dxi67>BPvzANIc@yP1 z#cW`qJ3f@>6tkIyj_YWS<(sW6v^}IHm~VDS@t4J^W*5h(?bxYiKa1LqooWt;O3`-g z|IDf7!5GpW(4i+aNC95aoDo=l^; zdXAYTWPx@jmLQcn*BllSJehW$nKoangPM9W?R+zvMLn5zzM02DUjnD&y7SGlkkHnq z*jyMAdg|-~voj?0G}MLWKuG9Gr;E(U&9ZjNOwTpVG*d%D&pusjW`%_IdY72_A)%+v zE;UO+LQkEQm=z(R=d3O>+e1Q6on3DBg@m3uyTTj^2|ceh%iItWdd})fb9zP4W_r%* zDl|tr*LT@?2-GXSoVOYh0NbucX=+ zX>%YiV=3R@Z^Q3|(3a%J{~y^LbA$FEK};Ere z=9-Iz1Y7mFX0s6dX2Q)lRu?g?LgcsCXfHh1Y?pbGEX2?l&NVw&w)3S^O2R>q4I)pk zkf6=;%mE?6zGEOqg#@my)2C>3p@kOf^1%sPXY7QH{@hGh5^d zzRy-+&R{tiV@R{E!pxK6?^7zwBCegjx)8Y%&zPBwLV{=B7MQIp>Y2AHb3BxXmT8r_ zAtW~PRGAqI#G0FMCTiaba;urgav@8#S;DfwNYJ)J%xz|k5WI1Km|Y}6R2p_qHj0nXD2DTLJeBmXYs0!W=N zpOc`cz9g!rYXbQZF|$zWUR5g5tk_i2A=hpclL@&QvdAw*QVm(`%fXO)Aouxl9E3)` zUWuvN97q9Ts271;1gYOhO8uA_x6-J}F??LaOsy88(bDOH+;64}snn?NJwgg>Q#7t%p4aIY+G7P zZ6VbaY+G7PCnPk(Tg+4`k(H=jN1i9mG%4b{pfMq(_fVcX?R~@~L!L4lSU!jB2zkbA zmXiD`#`zxf;yJTVNKb;AEzhZ?oT%o;ij9Qk&-1>h@o6{vMV`?FHHI&kBSNaQZ&3R^ z$Kjf=snt>otF)gXG=?vljuiiB@I`aF5IGuYX!DC^rjQ;@wdW>g z-Up>#HVdU_|8QL|n>8#(rF>THWpjun6>zzwv^>Ndk38MxY!=n`x6E20K?{4#Mj=7p-!?OsY}|`pGe<~| zSSx93v)UYBq2)y*w#H0vpi-krYRk6P%#f0xwrp$7Od+y%TD$wq>`hAbnK_}DeDtEv zERo`07k$?(m8Ja5@0wLYg1yXpW*>{%%k-NgvXtM#esgS-JpJaRkf4R{o7z(9SFkR> zZyG{^p1yB7QvCM3Z^nfLc|I^xLQ;r+ePGVmB+tiYu8fJChb2gR*pJP87TVI%v#B4O zg)FqCl`+LKk6-)8X7>FXxA_x)UA_{TFGcNvR70-aNESinKnBf1ktetg@TplWME0u! zF`t^Vh4g4D^XFy_i^}}D8GnG<)1#@(LuRIwh&qz_!Yp8UfcyT1Ig_OYQiHm_FlP%1 z+Vh23Aw;(4ZV^+d{jgJ|WLW8NzW>88=P^w$x3EK0e*+-I4 z9qB}y>FUat=8zD1yh>+MUz%ewMqKf@4{iR+ENY}u^3C5y$go)=q*}z#Iodk2DkOAN z`L)>=5_(VJ8*?Zmk0Q^A={zVhYq#Ki{O2H}W-1Bxp6{TAF9|7R`5dwi@?W!-<#)(m zkRQ#8hh(WOZo${9uEw=)vz28h$YGFQ&0!&R+JTT`A-|c)4^ycH{%A~^X;QRY#8AH` z&0LmKS^h8!Lqg|_f10Hsp?>{k)`o=o{v(Q0SuxA3M3&JYu=PL?%@c>tLct!|c2eCd-S_NU84OyMKcX3RRo z&@a>JRx!)>kQWi7TeDauA++5vtTL9w1#-j;tAfRaP%liYh9w0;%fhr4v+N3?x-6@a zWj_ejWmzpOhjSj=YGXN@^Vn7=%MFk&lyazZaQWciZonr1by{K$1}Yc;X_!F6qGwX#gTRrV{z zYG-jE)UOn)izS6)wzGO!cHx-qtN|AF9LV<85X;_(p?+;|jj}gGin9&3!=~nAwa=Y;qVh%yfUe>I~rF24OK=!fvSw7^L{jAm} zWXve!B*bJ|8(0#nr5s@8x5$`nSPryWgw$z!LkdvpAS?2uj5!)|4kXJO77`qR9Ab@0 ziJXZTnwf`K<1D2RT7rjI8(40KT!cJ_T2r5*%+--akgJ3^QpAYe1j)9hhvYWM5mu2D z?Lm~Ht>}?fjgU$qb%;6A8VJQSK#sCHmdjo|g;I||W>_t)Qr>}3sbj2~r=@(&nUA${ zpOx|lgZ41rP^vzSX~yq*7Y~p*CM=RlP3d3CK=}xyZ`u zlG4L5Gp(^VrF;&dzF%xLuafcyWOtOh#Af)FkAhdqXvP$2UdG?3oA?8YJuvg|e3UUVIYO8iN$s(-)axSFQ>SDQytaoLe&moUODy*#cNP;8tTdc+XGKSXN6^OaT%6y-sIx>z@v`x6n%4Ycs zLZfk)mCLgE?K0+WE1x9>p_sd^B9;`6xyPExlFl*rSfwo498+t}W;uytYON}k^Ejr? zTF7!a$JF^-n;RgsWxLmxJ0Y~52J#?eHF~e^BF{S1zSQbx`Pt7r$fDgL$9btW%recFF_uhU z##ss=--*nVESE!m5Tbn`ma^C)O$sqSB$3-^8jZ)TVj-1UIZADJEw0j7?LvYr3*&8uWTHP#>qZN*tmg`6QImE}SR{Q}f8RvOEVkn4nGvMhw$j^m$at!$P? z$jyj(*2-mRh0ttiv+`M1L1@;sSw$?LL8#5oSu!~P;2)qRxZc1BM+_buUPp)DkEzkOVFNItRjvX=GtGiX0rU3Yk$=$Wua@- zkDyeiHJgR5Q9muDibbutuUQQ&>ZtoQtC>X|Ew8j%S=7<;N~=Riz4kk5e;Juyw~{}W zYn<95y85oER1$g(wJsMH#3=4Ucy zHwYa|thL%dC&8H}WC-(lt<@(aSeN^(0U6_81?{u?hNzT`8A4rs)`XA++6?6R3DR%n ze<3rU0!h3MS81#omh&NT$VXQ9moladvJ2!BYXi&eko_TpR{mEMgQFeDA&^h4W+98T zryxf{KC{w?Wz0%QF648oeH}@4dSVy;v zsn=dUS<_k|-&$oX*(miQEB!l)S)|QHsWHf;l{+S-0g_OL zD-2fJ4^mno(;)v?1w!z33&?kPNA(|Tu@E_Mm#09$`^;IivO%i)v5Qj*L?;Mw8TC&ZzB3@$Yg*?PMWxS{!9S(+K;DL=+9iKU`3dq7WJh~|#jC|u6ta^&bpyrJX=#veAUoT6EXP5< zhfKFegw$))!rvgf+PQzr%oiYreo=7`yPf44$S#n5?BsuB%$*RbYhSyIP1^}sFGc$gVh)5HZFfg#S=4Eh z5ZdTdX@7)YT#$U?te^)%!hJ2fU^{G-$J>@*>x zNvn{#12N~>Su!T_E@YLE9F`v;tA*sTSc~LLINvT{*&ae$$n))DDWa}^lq$BXLh?D} zBD*#u-#{+58$&`@K`*siq~I5V@l9RCl-QZB>?y5-6Oha7ULidq=5NU5_8<$zOuZ4$ zN7-XSsg#G6|x=VDtjTzrI0is4J`8@nUJgPCYFaF zhX`q9c^z^jq||O_8G#%pq)UpHv{<(18oNJE?WxpKAtxi|T03t`DMvw0hg@fu3#roz zAVrWeyHSXot8{#Lz1=0n|Hj?*b}!5IC`IpWU2pe?N?n9J*V~gE^T?s{-p!4+wv`y? z$g>c-TXCapuv8)s-H)4X$60D2wBMO+r?Sv*Q(l40bL=!0`fbV^gk-Wjj8e2ExyjCE zX@$`IxyjCDd6{G8+8sjV_quOEp1JmfjPd95&Gz)I#WMAedvCV0g~;(~K&hMU5h>c+ z$ow#*!p=z+J=MO0v_WpMhlEsWiTB|?5oCd#x{b)J#UXD%Zng7-RBF3H)ay#TPyNl%&NGqh(F56DVtbx1+dB*M&Qm1_m>47|Jr)^I$vKQ|` z+U#a2k#WTQ26@qLWl5-)_b*qDJF`jbdoTKD4Vudq$H~?H}0-Sybka>?R>{ z48K9CkL*DigF`{t!cXjxkWdQ;?etx!r@D|V&2MiW#|zq7l9RBE(zwnd&XyLdM_@|Pm>E|Bl- z^+Kv6)jab5wI^8agV0v%zqXb}rK%(9>cM(D!lJGotheJV&79{4JB8&n&hvwv#_};l z!}mOYv@=-#gjD0Zjz8MjEZaB8qn)4Z87%uj=$gz=c0S9o95ZegvJ`O4xIL5QLdZVo z>Cg5oma8FILT0m+bIdPx1xp>r{9-R;Sr?UihhOc*EbAe(clgzAVo_U?3A=^mapXA) zbxqjqENa{Go88Is5@P76;5WOM<#h<{iGH{HS=K_RuHWq;mQNtZBlG|45tg4JrwAEm z(U)Q^fK1wxEUAzSgiPICF4F@bS3>@<4VKd&vxOwHsIAtYb}Gv?h^a!%pLROStq}UA z++TJk%Tfq^Q|>Q2hvjJqE%yy}F3Z~xTJ9U{0+w|UI?DaqE@Jr$Ld*ScyF`k%<^2iT zov8gEdzfWM$i0w%?bJO)zqF$u_d^n#G$9MLiy@CgrZ`*LX!6tBNovfknKr!Qdukr{nmN1 zlO{!!+D}N1kYEcr&8Z5-(6X53OztN#YtxV?8>O~&BKrq&tdJrhIBr4AX^<4hIDld* zwSyt&3z=j&5kf~q+d1h6%9x8Gmmp?)rpC>OoYhPHSOF zbIMpcS@v*xSw4i^g;MFx)I(&cA0Q7w_I4_SRBD?y;y4O&fU}-u8e|f3u#=T7OYH;M zyd3v)opF{EA=4n)PTOI!7Z*XOUxz#GEOS_na59gOdG3MGzB|Xs6;i1^1=$sOj&urH zx*-{mqn#Qda&JZFDKnf-A)^UjBjzB)9OHC{Vh$6MlS6e?M}9&K{Sy80PA$g>i1rqjVv0_hgg&7$@)g-#!f+RGF=gDh&xf0i@MqPF~JIqO-}mj7&L zf<d5$xkM{VrY+lu9L^2j%m+x3RwO|49&6goMIMrBz(S8!s0$8&#lgP%2@V- ze2v z?JVjT`$DIaU`UBvXVltKQ6T;%k#EQD+}k7S6Y84`uebVgWSfH*?NS$ZIJ1beYF z$ub0?QN7ridaPW^zi`YYj=>UpSjJr9B(u=Il9uwNPAUuSD`_cT>ZG%%ePxN0$)fg^ zB~FfzU@f@J$rCb~q^_!6<`l4~nQ)m?#Cg?CA1=TX<$ zE_W(8Mvd6zP7TMX>vfkqwJhp--Q`XLmnuf)73k^ZPLq(zNGW75QCEwQs>pl@jq~MB zn=B=_03s&kI2z}k1a+FPBPHYReE)j663wZ7eTA zu7i|2#_=+y4?@dyzLO%PI`Tba9%62GrnCGFSs)}`ifG~OLS_i5*CI{WjzKD&hLE&C z7C0k9>O{;dkSZtV1ggDWi=osfklUQaEIUDdhTQH93&C?lkj>`fd&^GpiBzgiI~)>) z-093>q5bJJ$X!mCka~?qV-LtZPCQSRDnO}2Aazc0Nb(`~I;||1aP5nnNftW)x&$$c zoxGD|o982j?y%H5%|fapY920eT3PN#49)o^PCLs}5L(JhoKBVw2t8@J#OY?~^`(#H zV+d_qmN)|}bR}>O+OxzNk|LG`txZduoRg`AavxWPmPNJvF9Ye@ylDdxF>coXq zMiQ3c?D%F}?Qv2$MqSx{+DVf!V#FN8Jni%ekw*^aLSAx)Lox^QsxxwWu#}fV-f+s! zAQ?^aP#4X^9;b$do+D~OOpntbC1HESJR`(7lS)-;`>?EaW(yfjm;rekG5yYZjya3v zBd54f)Rk~8WEe4@IekJZwS|!1AzwPFXHiU@kS!|k47rmhq*7}{Ofuwar$NYQ!g9#= zLZ+TAO8Hj{N1f?H>b2Jqa}Z)ioqm=zkYgcZPVzajuJ0kVp8nTaETmpbcm!vWh*|HX z7g0>TwhN?4NGr=RkTS?G&f;@rOd*$=bkfd~at-7*#7sIfS#E*c1NqbGVyT1FL;iAF zi)E>&Adf))bs`r^SqXU_k`PN{c^g7+jcpd2#qufSRm3F5+E_*)J&;H&{UVv?XGlLJ z8f#*i`Y3+u2V%xXuArDYZ5m{1CGO(IHVCQLG9WZQTgP%|$(U?N95KnUSyxIq8Il3n zCbp2}3doU=lvo$bAnsh}L$;3%vdl$H5oCv0{3@B}c1S5?$Jj!a#~?RDc8(QXEn@to zJU!MaWRcd5m?emr9$O!hS0KB^dP`;I&k@rH**#Wtos>TyLy$dVoh*7YetQVAS1h?q z#%vGy2eNmpLP))q28rH+yMeLVkfcENkIlSZmYRW>gCPgU##qjSoB}yCR&%3_p(jIb zf*c#`Whp_-U62!FGiS?~n;^>|r^bd^>R1Y5Gv~;d$05%k=FHf7mX{!JK+cJ^-Xvq* zhI|Y;KUO=Jq+a_3@-5_oSo?e#^DE?E$R)7>mZZnjk6pLIR{c2i&V&%JjjKRYhrmU7eTIoTpMewlrh&pZiHMH>t~^-8WupxViUK> znA;F@Kjg+()&ePyL0*8&i)mFP_1dctnyWX*GKAD={gBm&sfabPd=L2mQW-0_Rpjw! z)Ph*Ckb3QZh#5l6f>_IKGIP@7xOWVxij9S20#Xx8u8}d@BIX~+!dUyAQucrtRXE;= z^)Hl?1Mwht$JVo)&T>yI{Vo}EF=RW$)W)h-M z_X%11vRLC{DKtI{5%XwlfMqwt)I%PNZD2WwOFa=AyHA!n8PbH9Cu1q~QqF@s33)13 z#&Q|U^4K`b^^g^aX^rJBk)=phL7s_~uq=SQ4|z7$!qNcw0@4;6WO*F&Gh{_9xqrGOF|2t87RVjIhHS^UUMLsh=@)quAodrCiMNNv!q>DHSZA z#?o7)EMfUPR>SfP%NMculQQOYmak&%EQ2iTVoguUm~obGV(H7J*iT{qh4y?Kn=PbX z+X-?PWHgr9N-_1?9+0OYKgMQ+qyzGEte7PWF>gR7Vhf*^rA}b^E!O>vluIE4i1|G> z#Bwv_bIAW0r6VmwuKOU&dHI_C;GE+x)99$t>nGs`d<)U46-A$?>I_0cDa$dw)UaIROB2i8 zzI3oW=}SLLmoH;1pZcP8$Tm;-lFVYfsM?dkvXd{lEJyfK%yO15vste5rIw}Mmll?G zU%FU6_GOUeH($nC;xDNdMqZY^*vFStmg9ZNV!7Cte3n~$DPdXWO9jhHUm93G^QDdD zA76S|w(U?Y9A-Jhmr0hBeQ{oqy|~1eG?trv$zfUIOCihizLc_j;Y$t6249+3qA#l! zcCcjm($8|4FJmls_@cck+uZ0&GRyP6WUvhSlFRa!FU2f7zM|SQn`MSCwJasRw6NUn zOBYLvFM}-a_%hD&t1ppG*^8}TRkf$G?C(n!%L%^Zvs~;;3CluXDp;QOrGaIQFKsM8 z_|nVbbgK3Yv!wYl$#R-6&TFz4bA3r;Y4Rn9n8*&B2am!iGfXso!+a-Ea=C|R_zMK4(jQJhnLiTpkLy`>H$8BZVfEYR#-q-D8 z@m^2RQW3MCo6{rn>;<7`r1y6VSTb2M-B~O&^1Gqb0d6PDQHY^sagdw(Hsz_)&Vd|= zn1kH{A&a!jA%{W^al3`!x6~oWK@N3?gal_mhq)s%#yq`gAiN5r+6#Fv9GS3%nwd}AAKoinf8Wi;cS+peW_)+%$F9HYG1lontT~#dC8Y?md|{NtdYI= z)0b41t>0Ab$znOomwc9DUrJaie5qi0$d?9|mwjntdEb{_mOp$MX4!s~YR@D~jxWwy z*^3K(Nn@$>C5PofUkX`X_obBOOJ8bO{`94ZW!rAmo(`57zVx$P?#mdLc{6h7y!I((U{I z#N@t1wFh+_=@ts9)80m1*P+x=ZiA4ZuA|+iO-dc@mc2`P>a@>Linca0+%}e`z9Or89QK=wvt{V{&v?te17E-58c?(a_N;O1>o>I8SD5In(! zQum_NiEcaRIh^z4xx<^}Imtz1@Yj>5M*bvsY?I6pucHy*=NTt`TqR>F1V zyV)$YET_69QX;QFmZF9K=avZxM&tk7av{NJ{GYp!^Q`4Or@0+0<17X4$R>GCch_%{ z=X7@im)fRBj_Mh1+WQ+Xi!%&vFDZ(>Hkv-9nb* zA$0$}&@Ea;VEndWM-yFOHku5e!9 zPRJO4y|}>5{D68IeBtT>cNUBK!qp{iGmHAd)n)GD4`nI!g{xU^7mNDB)m83RyS2wuLA)zl^&33z3)EBPi zxI--J3s*O}Ss#h^_+Pl1>kbGBzHn9U#y_T*;0sst+)N?C7p~^HMJ(zISM%LADUl1Y zEND+%;r4UPRS^2lWQD7JLYeC|?_7<=5E2{>R=7DrL1}XDs64jn~BHlD{XGux812PA-SNm(X%HxX}ltL2x^&|$RIz%4Xo&nTe?e>M_ z8^~?$kQA)}b^QXVamR(oFSczEGATuS6fvTKjfi1H4ScDNVRq{{@H@bOWQeE}hLI};wMz>H%oz?`QYwwM2iIAYp54xpXYB^$}hvP{eH~tmn31S{{ zQ-q8rbRmYmAN7!%ze&u)Y95-OAcnSwfs8c`CEm_XE4z1fecLkxXsEszHwPhsRA^J7{eZ5zpJke48j z`!PL`*EW*jA~`-!_%ZJxhQ=ol^?qfGAEVx{4CHf^qA#33>Bo#f=p&|14&vf-xXT!mzoCYMlS-{6GG4bwE8iJL1?Sq>K4k`lB7oUX}6d~jq20x zEEYAY&$wkQYE++bD_GR1KI_)7s8M~^UCg3Jwasm0QKQ=Cwy>yCea>xTQKR~t+sUFv zb%oo_qDFOv+b=|}7w=*;o_9w=@+ss+*BGXCCwNxB!;K56*G|FstV2wPo62$y%PVd= z3%!N(U&M5}Swez!aHX3gWYizkm2NJJ8r79<0gD>3*WDr(HDa&3B`j*hy4+G0HDX-*g*T)TqAcHnXUuyvl85QA>H1+rgr?8{KXfi`s54cH?a~vW}MEXp-7)^tuj<+HUl^ zDJ*JjTJ26}`HR=4)ouohTAS9mSuAR8TI0@OQESs$H;+ZFO>5mkA#x`ChPlz_c787*LTqPNHvqD0pzIKa* z)M=L?CId3+mUGNp$ia~B+?tRa1^JIV^&45&-ivUrAF|#p3dw1ZAKj9WoCW#GtqDmn zWZZ3GsX<+rLVk9~gw$#GK(2!P;!cL-CdjXD>Il^?W2zw&ZU)N(C`Hev{^sVeG(+kT z^Sj!zC91vNr0aYud+{7%8WHn{J0PS^dkaF>k^XYiMrB=JaLfj`>^qWRUH-={56KhA z^N(9AB{GRpv|atzZ4gqYZN3K2Ya!-ew_iwoe2@#SEa&3tLFWS*(MRIw!bGJ{KP?h8E?O!IIHU+4|}SJ8_k zUnqv&;@5pqZ}A)6dePI-1eM41^2TUXM-x;Y+bd#Gd178^D2BcU;QE=>Xn4M;(TMw^ zMq^7~)M#wwiyDoseNm&4?28(WZM<&Lp5V*L)4V<*)seF?Vsu_P%^P635<*8H)4X9R z;w+NR{$gQO!tadR8M#DN?6p0?dp}WsBzxSt6))MnC2}M(w#tCiMKE}cJ~@tDli%(dw4BE z>a}|yeULr9ah8W@#31Qj8Y|idp)7DQEcxLfef4ybVI?v_Du5^cw$5 zy{OZ+Tq|P^63etgt4qZ@qS}8@dzRNHV(^qHV(6OrA>P#WvhP`tpAd7Xm(Ow>3=#t*X8nTW9aFZ@rK@?KVh07;%Udk^r<{e*(S%x4Nq14G>L?>;6raItN1c z9nSJ1zX$RxV$Si({ztM%yN2_e?+volKwd}81zzE#EOkGGu3lc`m9Q*lndx;3sncF% zx!CLDm_A4k@?7GLuzUyU6EeZ_FN9{@rC#zMvaW63ky7HNvFycinU^V~PRoVtiZjj2 zy;hDXhJ239vpnrjnddqPwfQQql%)v>pjbW+R8j^L$bFDXfgUmxul~c_1 zUOUT6C`E0)(Tn^oV|rO;dvTVpSmt;cEPq3`Mw@T)%2*QLm3iiRlPoS|47Hbg#=kOi zDuntq-z#R>hf7s>Wh`f~RC+Zm^B_N>)Gc0@lt?v%t{zl*eM0KA$9>7x62%N(4Vgr# zDz9CNKQpVnJ|XqmUx=Ymt@b8alHQYYn^&4ZdFr)kEHz#m%kC_<0Wq<^E}T|>&<2vfKZ$3ym2AHmiAt6Qb=%} z?Orc=s?0NjQvYH!?)A!8euiv!C$8;y>4_8*cu(cQk2TTvbf(%;g~YWfkM(`j5tO*4Dx`N6B5ev zpjRkGn~S~6F^GA{YZp?dRU*%J|3|Vx2;MM)P|U;LNQ7EgsXgvXaS}tfzOBUT; zl_mS7e#zo3uUklPoxjH$5fWVI@9_+qO4Z|C8Tm^VZ>!^tL_G~h4p^qEeQAA0)6R#i z^<_IOof1f&FZ)7nhPIfbA4%J zxdK9?`jywgaubB+*jHXR%k3O9?Dercz%j$#Aj{Jnv(6i4d6i?i*z2UWDa!NA~?2FV6BGu4}|g5mFiXi|ZQk(m2K(kk`7u^)gs?gwUJ* z-+I|B>W#}$uZiUV#L#GrdQ)B5o+BZ-*jJ8v21_1fHQGGtB})-oNLo7IdDBBeztlPA zWrU<3rM~xaLh=dZ2X8=#{9X#ps9(Hfk7^ITm-4HZ%kr!%=h%c-!lJ&QGU1g9sn*U! z3+cVl32#73L9h zVf13c8xc~kH6hO!WYR0&Qszsqvv?8S^<}_C?Ipc;_}!CLo7F65}b;NN|nl zBb+Hfwul$7OoN;ZiNyPaRBHP}&WGsn;caD}qgaf1af*~;2-RiAi?$;fO;FnwD<0Wd z#$1gUx(b2MSqZ^;9OM#|vg1`kMw8T*#EExENl;rPCqBudwn(vf)^t%J&eb5gj8w|pgm=1&z5m?0e?MWt6mP-+LtF0vjCE;#H3$l zSqRxiN#Y8`)CtKInd`JwkOv^!#*2i=YjILaxIHS*w((Ngo(TQIOAGdK+s4a<$bG>w zgY4iMO)s4p|G?HE!%qd4lcyZt+YZ!TxKvcu7d;SAf&v zjZz|qAP;TBcaJve?gT!9v^BK_T6orwFC!9DmPvAIlXG zx&yUmd`y-SBlZ8cPZ(~u%;TiD`mS$w8UHm~9{j`Y{JWc7>ax7vFLd;>lcaef;z7 z&quH8*E!d@&N3_lvENY(?gu7VOK3xzVWKsKcVOZN=Z235~PtOh~ z3kkMQQ8-UX(8G(ug+eMrzhleOI>1HYVwukr)%K!r3CB$RL|!8mh09p>^reF3KnPuR z7lmtu1ZRhH!p$*4NA9`dwiuzS%HnX%0kZ$7J$PZbhehqdMPcng8Kd^aMd4BwwFfT> zmkX&59fkVP(S1?4K}e%^3glAk_lv@)p3;&2DcxrnKPEDjIE#MDAA3ol9+{YSeR zF?T`A!rDP3^;#3;e#n*KR3VMp{g8IZRblgB8PfxK1yT{t&XDW3@C*+)xJ{jeq6C!|t49QjNj zpL@gFOqp{IWb0e;E=|~EnaA=#IG^PL$W+9%g*OYS)UJlukVnD=$H;tks*$rIkA{1M zRBAUNW>>^K9-d&i3z7zTGCU)TQdMe?L5_qx9qwm&9&#e2E1WY+#`Hn*AFral&W645mE=~4fhMdFRwu;=QqMh zb3}|k1N=sKjgU(1LB!mNRBwa_SYBp%GrWoABhKfoaN_Zlk370pBGp^rq!@Vs@@_aS zMxKE5hpVK7zD7QDRDKe!6;c`c9zth_Pr^+c(__e(Ps1%N=UgmfJ`K0C{KEMRhC5j% ze=7g+>y3qwMqWAd7{3=q~&7@FOVu_LYCPq8^Rqdr?Gq)9upGe^Hn(hB+6&Gc0OWW#J>0{oXfHpLbK>!hYMM*fzY#w zk#GsiEs!^nYBZdmEAvrLSjNINEb95r58);j^?YYzxK&8-d}ouox|r08oN2AspL}`B zmvND*QF{yW2}=JdoPM(08lOQnKzlG~fL#V7tdiYeC&vB3)5wne+m`75toy{^?uM^U!ErZbYd`REKayP_7 zs*s*~n#`viLOD;-*R#9=*#|M(>WOn@&i#->AlvD6EZ;%siR$+H8Y%vfo2X9+S+4z! zm`tQf)U)Qve5QRNWtv{VvJ0dIGm2ronPp$d9Hi3q9+rb4b0LO4BxJdE9OMj$si)>s z&das4A?HFIy_V$?ND0K#lTVkWUkkYc64l#T(q`b7EFe4U-7G5*a|0wv&;E~0^(4z~ zdMisWUj%fyVT6~F?xfLU}if@?-UZuY-j0%ENW)^SUv4b%BMQ?1-5e| zw)1Q~gXIUv{X#NXwjRRWx{z!sVqS~RDYNxbDcYL(SUE?;baATfk?I{tw!VgC7s!B+ zK9+QjIZp3qIhJFN(}$$^WzEq?W8^F3Ge-{<%2v!pstL#mdLql^)8n+Q>PSqMBE%#J zNs=ORo+c!XW9ZyOD?*>BXRy$@iDFLFvsf-dKJ?c8NqP>;<&fKEljI8t&IP%8u@E^g zY9XJK^(u~0bDpQ@4Kg25pJc?GqW4G<=So`t`Bc4+h3Z2wr|JVNs-=1Q5X*IF`#y-t z)5nychO{qE)5lqEfzZAz3iYZYnGf~w_aSHLiRT3JBjg-CCq}lf$NLF-1q-d$v8~^z~9gS0NScSHXe9CM{UA;r)6DqSlUbry0dO20}srG(V_ndN#CODFQ7zFMxQ2nmjYay^4Z_4#Y` zd?E63L8M)pU zn)#<^3cgHIYf%QGR-Rm@QcY6pOxF6MR*bCEOU@6r&nlGOpw|frR>HhPZxT`&+Kd{~ z+2Ibom19(W8ufOLq32)pWUW!}k}>{jnRn_*7f@Nj+L+CHEsLt*y?O(Ss^R^5vykf0 z;-uW^03~;ayW$A^|0O}#qS%B=zTHr9AX~P2c>8yAk`X3 zyB@xf>WtsffP4aZLa$>v53yqsNaZxS#K5+^xidkyAat| z=b)@t^j?lp{rOdWK<49bpI7xEDWOkL`pHQ3sy@mx44EfnoaG0|0?2FnW|n^-=L-p4 zBHHff+@mMP$P&c#=nYc*U*uV*H?yeUHeIK;vLt?mr_xBZPH$&Ph1?{hlVz4K-7E_s zcZirCma8G{Li$+hAoLtM9;fS#^gcPK*sbA zA;GNvM!ic&Fsr{&A7fFo`Wy9e7B#ECQQyo`f}H6tV3Qs$rLw9+jS#v{*rdBG_d$kH z`X)VDirA+Y&mx&2B2)lskNvFovZxXAXT5X@l@(kY|E#yOsB7a1eV9dE8~>^I zUoKOrYvaFl?FuRC+E|OE3kj}`w~8zh5?mWkij+(7uZ<@~npxDf@ivk67@?jpInom& zbZs1p495sv8*dxY%BVg|HFa&gUBqQk*TxBvG8T1hJT(%&QnrG&Sji>0Z;Ipz39gNI zh?EKmu8ntyG_$B{V^RB5k7Qm=`N*;5Z=}*A6)`fY0lyd$8DybUJ3!1xYI#sPU58td z^caaC#){+!8HxJ~Gbd4q6Df^}p;TU^oMY(MU{es|Ma*kteWx2(@@kr_f{yC~Iekwq+&Go{)+((r#$?Gb7Im$Y&!)rvhLHP?x<#IM-X zzDSAGv25VIlM-o?B95;)C@UqBP(i7JIhnm9VIi`Hd5GCNQphpX(k@)j?-MCuQAb>A zq*I98@AHu=H8RZkY((kjK&D5EE2*qXZSvRnQX8^gBy>GVV`%2-_|+arS|m+~%%@gJ zzL1eP`juqbV*5wpm&$w$m-b6m5kXey-mXA2+*^$jGUqUt_COeY0OxEyc$Ul%d5wnIwmPNhygh+}I`7|f# z4w5V(BU3gb)gD5MZlqMW9ve|oTq`9Na*&7#-6CZsBvVLyos{{0OfAc$ema;rz&; zOy$pp&BwP0^tW!3ItBw#M^k}{nX3B60$)_$2t@UbKvdrdMD>k8RNn|h^^HK(J`F_e z(?HZd4MgqJK-50mE#v^mk}c$DNSQCMAfJ;USNZZaghq+- zE#wTuTE+!8TYi=$HfBK$pQ#VwJ1A;CC*Yh=9;nKM19xivBvBQzS{78#2XI-}hd*(^o- z2rZ>ENL?g+AC*<9ea=!JNfpwleGh3x>9Eb6FyEz;T{V@T+zTpQW^1WBc~5;Z&o zHGDlX{-l&gAjd#@BgIciSp%US^+u$OWj*91#JmxiU>Re1Gg8(mQ%(L3-((@?t%&=y zlqAR{kiJMKOFHB_$lH-M&&ZfL5X$+TNL!bbvpChek(B48T+XsS($8`$=ks2q^m!R` zALM4_^WR9y3sPQUc|S79G6-3TnEps+qg0jJ?}+&o z`AkGg-j)*oJ0C>7GE(f7h1qaSW> zw6Q#ZR*)nbgF@t9rnmB@8DlYW74p%I_zx)O>X7P(hLOPX9P+6~jA4X@1hY?uks>A3 zT`Av2FpLZ-{_Kij928GCW)uD!- z5&BTHLTq_D<3|lMM(#w+&PH;Ktb*)f)JhS1nU29^qk)Cqf8KyOnPj7xWi7S_9m~l^ zJ4-)Ars`xF@})4nN3LyBjS+*2R%f%MRK5e1x%{ zHx3I%4EU$gxJr_dyI@i_S5s zVr0j=@NTM+^@EIg5M|Nc$u)*p)F*Ea&?&gXMN#@}%H*1>>~m7E#VkEN^4yC1)I9b%M!t|>9{W6_PDn71eSy&;#UE)eFxIfB zk@iAkeT>jZyT}-g5t_%o$O!#RrOUTIXzabjNM=!EZ;6q~qUNy|8_g_g9{W-wV_dd^ zj%Aw1zRV~S63kdEC{;CYGjoc&8nGzTB8#Sq(W+Nc^wV(&`Ys3voK+8Y9d???U`qh?xN+ zRY-88R2X$KMx5j5nzq7d7ZPl-3ZskjQCqCSSi_>WScTEYGJ9{#`=Rtoqn{-gQY2)E zWfX0{5OTdS$}$02EM%M|^rMVfYHVh4AQZFI2>m8oIvr95sWK8-4uvcg;UB37EiCG7gd2@E zDI({4Q2LEV_zx_Z!VDw3in`+Kgc# zjoN>aPch^n!`+&4#&36?iFbe@j~KZuUm%9$QKME!aIg2c(GVl$h=Jx+2zkM15F+oSUVwBP z+1to%xDi|IRmh7*d`Jo%JMTbVGJ07khJM}eWussU#ROaR6{AQ<&=X!UO8*s86(b)Y z=U0rn82JqHn$aW0-xuqQJ{Gkv))@mV6R6K0S7C-!{5fXb+OSYxD@I_Se>U&*)>h4W-lB;XR{Yh&-AO z!7qbBu?G3rTs>-5LxGK5z}wX;22fs4~%>vvW7b%=0jr<3)PTh zz^G!OKIT9^G3q!U)zVLmP9gQ$3e=hE^Qkc?#lONIG>W&U8ZP&*GY5@!A=RPPNJZ~v zd}egAJO-h6Gd?rArHJvF-p%;T=obFs>&KM`h--6_D9aN4M&WAmXo=x5o1t_U)G2*&iSaGFluD) zwBf*AwCg*gjYYL<%ot)(WsMoN zx-3iejWMHvrG?8HGn%FNWsMn~LV~h>FhY?n+qKciWKm^pG{%Gk{cxi(&hk8$wb9rt z#V>245jJGbY8(D&6tk#y{baPTsIq=Ca!lDS)enC%@>qJgte=bmDSlZ$8Kpvkc8wdo zEUK(u49$}DQDyyNv@Bz9gi*+% z%9=0|9Eu6veVQ<`Skyh^Uq(5Lx@XkPMXpSx?isf>n^@F6<0P|BNN~?M*^KunRdCO^ ztr?c$-!pD&rn9Jf#_i0k7@=$I1hXJU=$>(^Sso*F&$xrx#G>vQ6U|N*b9j$^;-2hnHj65K53@8zsPq)GB}S<9z0E!rReGv9A*5Q{8}*^hvXtHt(XKinMJ$g&nuU}|5v`y;KhLa+k%tg7&uoa1ry==fYmB@CIo(W1qx#6}-VY%2 z%?u%O?qbane2rpO2$3!Q4l!q#xd+It@dE1e8{|y0nB@%!t-4TXHnV&LiMt1H;Fzfg zQYyJsw}%v&y+VR5c8)o~qPEz%W;mTv1@}bfnyEr6wT;MGM?UA8*+PQ;e4d%hqV8_a zGxMd0EtZ5-=b0r^L_bV{oNrbM3HssrW;2UAQ=f0Pv#1(gVD<@-?V65!F7QX%ZGOcY zcaRHx@mLo5lE!k8FEd##_GKQ+CB781l=yNTWH!oL?8^$s>5xl(c^p!-g}nMNNxM&u z2|=pQ{}r?8U-I|AWV_$~Z&}X2WY2%ep^z==JT(_`No<{`o&{MFE0Y#OuHHhbA6+W(1JX3mHaS_iMj%#IPd-nhxkixG;s*({V2dKGn^j?!;2i&@mDev4VcqUKv} zG0S4|Nf)VxV&o`Do#`GNw1URWdNc75A=>*WYZhXbn@KT}1G&S@WceRr@*sDbn}v)_ zQG4(%Gckkm!SDDWhW6lHX0i}@1+oCC?lL#an7FGGJ+3aCadwHdq zbC`@#d%49dW>I_jUb9q4rS>aIKObeSHal1*PoR$p>0>bbC+E{c)Kcuv%2mdD6K ztXT4pSsNowNcFJU5+nCP9yL3pXlev_-0Y5#M-lV5+0UZJgbs6p`A^${b$#<=L&Au3+vw5!>e=L>0PCF1S z-4ChWFtdd8XmnK4o!y&eKF1t^n1d1XmRUSY)LEMiISI1fEE6KX<;;h?Z`N?ksfalf z(r>m&@yE;$&G^|t+ZQ9|BQr}%X#6JGqdqosgj9wm-7N2tJ~s0?M!jYFiCM@o7oseB zSN{_=Voz01-#+zaDPpLv214(zUW?LwnM7No2m8yHscNJRM2)n8s9(VgWhx|+4srtXAXZ|bZ zL`YTaR-Jk-a~wh`rnZ6%*{gNx?z)A z@RgsLFh|CGip-dNG{0X5N{%Q8JsFrRv2U%20H=CnU#CE1J z;V*MSieI02;%sfTzi|cq_{B35l+|B#qZ?jg& z$P{&a{bM!=sSNFaWBGr06XPGVg=5rMr&(>BPeY);Pzg5qmppGsols+GnuYUJPE%HWvOIA(h*i(}NeUDMn1#>Jfsc?T}K4ZdIHnx2ihtM64Pi z)uEGdCR&D=h}FO`>P%!<%^Wj~e3m1|u-b&wYrjBNK}@T3F6CUWZTA{A^3G0#JqqQ+bW(XQym29fjCx9zLc4ew;`@oQXnM{@)=}jtMd#g=Rm%LBw33V zkThyT<#F2YkX@|JLh7|E5VOs_m?gGa&y=ZdgM=Z;R$-x(R>-c9-L2$>Ql5sSLH4k6 z&XV#PRHL-k)m>k6HZS}JJ1EICN z_OS+q1lQQ9Rz?x!EJsLM*(}w{mJ*^diq7RA&uJ9zww15%9?JK z2&vbSSoX8h&XMgp4Duhuq*<*jCqd4H>~E!?D`PHzoCi73YGNscTntIK`h>_DUIjVG z8j6u+kPIv3yr30#KxSC!F>(*&NGm%===^oGl_x~b>Cy3Zw6#gd$P_h(&$K3Fs*oDP zXIk;aRMyB8HHIH!B?ze&+lSuGIL0zLMjfYFRuadk<21`kWm$%n(lyetRyxZ{2-W9U zE0gn4=Ym;QHpi%Q!7M9}h0X=vmt*B6t3XI)h|UG=X!~rdm}BT%Krz`?3CGa6fMT+( zav{OUf1Fjtsh&oCXiethtU8WSBmW$$iDO>jm^oG}$EcD2c&nXb)^p79Ru{*pb3u-^ zhGW#ZAjj(C7&RWAVD)p18V^sfhB!u@FHW>ZIYyl?PPE23Mx8HCvNm&!I$xY*h0d4z zRGlw!twbT!A$7jUwOo!-=ZllAWR6kii<7N1j#1}=Q>+Y*QRjkFtSpu#uGJ@`QQHer4Jo$bFQHVG;w(&K?*&%AkZR4@R@3Od z@*-=vgkq|-W0C4^q`KJ3UMy3c3V9GxVzslpd@t@#A(vTgm&#NN5%Vf!iB)?U$#U%i z$eWNWtpS$nARj}nv1&>w2HOWh=fO&AjAa|#gKR*|^;XFe8PkH8jgT9xULni1MN63Utlx!bB? zDTGj}yR8P9PiQf>bcNN-QURgSZ-v#yG95EZv^AQo4wfSz6w_>t3mKWBW~lD5HnXT1 zs(Y;XYs6L!-NrfJVXp&qr`YGY9=YTjp!v%H9yLge#+m3p1b z=RL?JkT$EKf}~y>V0qXYVxhHAu0~9|RZ}Trh7nT(dE83AUdoSUx5w#NS<&sbGL8Z{Hr4e7Gdt0<;XI|Q;8^1Ri~k_(~Z>qV=NWg&!qgYP9P=?0Or ze@*+cl`f=FqZLQrMLsWE`7ts8S!0#URGM0Y^i``t2;S$%9LO3R1+Q7nLMlU*kaa@Z zIOZ~xPFGevRtL*X5W2GJvAS9A<(Rcr56deYv({SAGQSZ|X7MC_oi)I+_%4j$E#zIRR!F0E0OSwId)6q+agazW=9aCz8d;z7 zAnA~gtu7(K`16?+zL8>o*3>{yatO<_UdJ>+qA?8ObbgRrK0dgLJFj4C5WM(so7OR8ntrBTEuAfXpDRg ziMR9WWPK>+56Bd|i=_^-)BSi`%nsMf7?M;-qFo}SUV9Ki>o)IX$KNhvo`xKO7~L)r zQm>Jm4zcY)A@U5e1hTUoT286zwYL#-J!BU2_Kp(ZCo;}R+K4MOUoNkY^dnh(PT^GQ-IaxQ28()kWucwbEOS=xt}L|kSk${K3+*Bn^_z=G9!q>RPc4>n?F|Tx z>Wgh{wUj{!T}xbMm$OjsrEi=|?M*_~#ce{&>&Rz`t=%VEI%x`yi+k|4j~x=ysD&Z@ zh$*v+Sm?^(TgcV+8X@vn{u^?w-4`RF2XWNdgE6ubWT`zCBT0}NJGqrg$0&-j=s3OA zPGva)LSNb3YNxZD452N5tDVWB?p$uQvssG$m|T`BU-DU+d?^$XT;bnpw+d<0o!azE9%QR|1yhTLJd3kj}~n(X8UM7zYffZjrBveRQE7pd;D7sUuY z30+~A#Rxt3Y_@A+1 zv#9U!d+bz}Pacuq4Rcu1d?{i%&X;nQLSGtK?s`&fjdqr5KcuwLtjd<$7;r#??o9Wrl?6C-V}oz5}^cdT?p-D}TasklcziRiVn zSkzs1ubso9?uC2pJQj85+iMrFs5{?YyI6`C4}U{_-mtY7M16!zX~UJJohT*r73xg& z>9@^BijddmK2Syjp z$X|8?ODd!T@{gUrR>qtJ>4wBPn^_h^dLdgo#p`6u9gvS9lN{}JDP54SA(I`KQo5{M$u_bt&ql0=fiQ@4>#a>x3h*tt!gsO>19!)=rm_N%eN?t#>}0Z zQI^SxO0-_8VPj}dUrd&4U(#64^d+06)R#h*mA;g*^!ZZ9^1Ux@EYo&W^;yG`=F0%f zDZXrCxyqN&8?qI5`I5x)qAwXNU;2{EVoy`07qiUvrGll@mnN3med%E7^rcrwbx6(S z?&PdzQEPqdlQ4?}Qlub8=Yrf}8@` z*)iXdIUf!=6S9kwCPZG()ArfT$@rJ#O9`o#?&cJ-(7G#2kk4*TaZD;|#cobnj8q^d z*{O+<+aP;5O)=68Npad@NEIWqrOh!lxOYU5GRd9mS#O5zb{&< z(RLnzoaU5C2^|xWbZFJ||A2h*o%Jz7N5On&m{Vn< zrN1C%zB9&>1JNEKnfO1c3Y>&~xi8d_Qs9JH=!rb7M^xY>#l+CQIKxSiBI-l?;tVHC z$hs-{C@TSFEpT#J&Vfu5QqK8Y1TlqFv0MR(3aJ$$&y2}J+Bk+*Lz)gLbW%T%btX9& za+XsnWL-#=RpeB$sQMH+4KkIe^N~nZ6Iz*+<7pVqVXgkw3EOv%i9+;0SSP?TS zMbz*-Au~Rv(kr#4$cK)&^PO5Dm;r`djF=0ZQI;22E^;zIk*VH*T#lGaoHil#+AxGx z##`)+vuv%)d@gkoKBZLn<#fpKNtl6g>R2)%*CLZtqt@KJ(kYVSKO?)!>G_Oe zf^{mcazdX=QR|^y?PRj3Z`&)JG8Xl1`%#YvRnf7^bGlg6UHZNJsYj1hX)cAJwQBlK;1ol_Pg^lkg?P6LbjwtczN!J@ux zZ*USei2C^7w%_5j2?@S!Z*)e51mCvb>4d(dRKd6HcRFb->f81vr%H$%f9SdS-A?LP zluAA+rnP6Aopd49Av){PyCTib43_h-PwDK?>}1JQV#Vwmu$P;iVj;nooA)?%Eb7_u zN~dU;%95qmBGpQ#RY*{Ji_j5DHLV~jHb+oT3=is+3Ry%zx z>bu(2PU1*VIvs-%u%0a`mt+}^6im|1O zWnJ8Z7+2}(+w;Dhl!3RQkm^NW=0gsFyefpAxv1wCulb^$U-bB*o?oo>MLoY*=ZkuN z(YuAv^NTlpQO_^l@dQO|b*QBQ>e zS%LmTzXlS>zhnM?a;CRO=($ypk9uzPzF%h&dTtendfwFU$Iy(um;>=eJ=^MclE$bX z${tSh#vePWF+#J=pEwyp*2UH0jVT%>K6SEVV(1F(Q>QdWD4#*6B1UKi_%o+1Mkwbm zoL(X8;?%wva>CzJeb&XPeKF(|v8XLJoXQH?wb5~f$kKnr)1{40N{kev^dFs^7`X!Svr{TX ztdc?f@K>i?h^*l<#Qf^i3JGfXo72gnYB=Hau&5eNI3>RXTZ8H|;WSC{*Xa1eX<<=s zX#e4~v5a9a)0z4Yr%Q;e&#kD>A5O23b>e(_2jov@fMaMSa2omlazv;T2=r1&e*#kqYf)CyW3JI?Lrd{pUi z?ywNKX4)#$a4R?dH>yu#h}KLaiFXr)$d*0?*~Tpr64ZIJ+bSg3?~`3^V#}T|+07Rs z>r6d!vRf1*^sRl!Er}7jme|%UixFDiW?Q#TN{H4iq_Hl+ZDOHy3n}LWx0U5j>@SL$ z>bA3N9g(v=Q{65hLI2s_?G+-oMh9BDgFDJXTZ3drcU*|v8qY&^a`q zV%V({5e+Kvn?i7;T&}J#>PGMJf zhLGS+A=xbz65J{5=~hYc?-cfQTUpedLWVlI~F5!r;zG~{-XK> zzW}(eo6Mr_6sEfsENbQC{ap8N*$Nt4XyxQIw?Ig6r?9_UE+n{9*xzksQFjUlxD!I~ z>)3c>oO))utNlYcV?`hc_1<(hK}c|X9puhnQAh4UZjKPy4_`q)JlHLf`G}F9j-5l? zGAW@Y*vnMbA#MeW`Znhfw}yqjAEa+{4sjb;MsJZ%b28j!mMY{!+d0E+W2uACczCG0 zUW$L-In*5!B5T--8Xo3mYm?E^;D|fi&1X>~_6)Z{NHCJjaGQlRYFF>1Y40MR8SbEr z5i$rl%B_l{oEx=f)aM(>Ot(KqeuQMX;jJj9Uc~$fndKI-tVXIyk7BOP?PlqKY!5lk z4R0+|?RyQ@4?i1k7P&5qTaGX0&c%B~ZW_yrNHx6(b7*b`%Ua00=V0r*SuF2B-b6kp zx;ZQ#L5@MpNp7AHIYQDN%ykQdEDdcyjDh;(x=k$Kvz+YqOA%Xs1$y`??u3waqNN$L zFhAy&#mgD6ay^u<68$&*op68AUk@cB%2HqobvnEkKK@Icq zCeUD#aeW4P~9@&e&d-PS0u^A;s=y zA@W)6Ly+^`?j0zm8f)OhVEKY$7P)CViWt#C;3$q3ulB6PCC$SoVU*R9P$=cs;ZwZVpSPACt#2 z- zO>(8{O7WjAUF{|dsSK&7Iaj-B9CIP+Oy4|~yBQo)3ZZee+|A;cYdGc_H-}?tIOZBR zUkcX!!F>a2c&%H+(gOJwa-CZjBR@kb+-@Oqb%H-3m2Og)+9hT3V>ssBY$3}vTA6$r zWSKiEL>|iy8KYJyyxGlTQL7Z*?AF8xJzKxU?T!(; zio4C-#G+OytamF6u`m3iV7c2Rq*ANdTGMt#4VSwUENTV9J6u#4f9obaitV#6Vgh*q zaww$Hk5R{0Aa5duM#x4t!4##76%}Y4yUPu;(25E@H6%$a>i+9)H-&}P8K9WE-E@}s zkTd18!kxkLC4^#DxY;Z}b4;_F%Mx$Nm}a*?3ciTOxeKkh$4#@ShQU?AO1Fwd9R(}h z1|hP~ACFY4+(cWn%fBjUaZMqOn)3iwdPGc%n;j$nfvk2LV&rVd{ccN)EP_1XY7XTr z^C^Qo?AAm{>b3n)=PJl!?s}G)kUB_*yCzx2oCaxzJn3%UQ%Vt}4bthl`$)MG@;u}@ zx0a<2(hGUP?G&}L z{5x)18kNUbJW{>m7RE>_(>TV4(2??y zJA-3>M9ws>4!BtyGYR?7xH{nGa*PF`n2+6jj@gf6K6Z;Z=2(vT#9hQO^El=cw~S-X z=a^633XZvkV?K3jg~)OBXzYtYH|YS{8geghbtC$jTN)$VLpHcoLgZ072dReLmIEnO za3%b;+rgsFUnA~>kYF|S5m!qWWrfsg>LYGQNU)mvh-(UwzwdA|${KaEgal{LZ`^z# zvOf8U`Nl2b7&Vf7>(Z^gMo*9VhKY^&;5{T*>fvBDki0aRQsNTEDoe(Xp z_SZc?%)xShse7wUZUT#XQ{_iD%%ZL(esq&q3Na>}k8Svqo5E57DHW2=(gLY~{OrzP zc?@#1kZhK2$eoaJH$S-aY%l{zH2`ORu1F{zKt6Rpht%J44gjBJp ztHIygS{55IbdCL++ayKX8#0Jg6K-3KdP8f3E9EhHG{r+DU(BE}!*r+BGCWDJddQ@ji*p(f-* zBjmPTHp_z$irLo7XL*KWw)2WvUgwzYyfPMgDs&X;li)S6&z_fn3Psivb{XI_naZ?8m1y><}fH^iiS zZL=t*9`hRL-A`Z*6VJ?+k_(vvIoKO#DS+$*$?%4blQHK*T*#rGIY-J8$nKECyegIo z$bOI+UU`m;se>E}InqlxQOYXFF_28JhNS~?3S_2Nn=4~pg%m)tyrDcPA3)B59P1^V zCgp#SOCYno43^&@S3-{S@>wDt?yzw^cD%QUWe>E&EVCfBkQ2N zmT|~p$c0||e`KovUXE|KAs2b=EOAkM(+|1C>y44eAeVV5^JOZUk6H&=;^nf?EY`b_ zGOvt9&3#?%Rj^D&&I5=k_u5%#7VAsMwO%)injfq5*0bz_RNo=ydT*5FK*%^`sTV4c z_4%hy{(5GW7iQ_j_m%XO=nY(_EKbwKhjov`7tpxidK82QvCb(WnMW8z5jFL z4BQKQRYHPmq-9>M5P44d3pHHkX=hLkgEL5tm&l^dAUAqBLgbri@lWBN+RGDCrD-Q& z?U56(!h=`FG7D{|d*PeC8X>`(gtvHgEb3Q;ZtRPPP3R6=O0)_Y?tw4%$d3-AVxH_k#U zy6huFTR>YZcn@~D7h+LYJIlQ=OD&hx;JGZTxU2>*MTp!N+hMET;U%BB<-Tb2(pl8L zxYJ866s3z*$EP9HonD6&|6ce`uO~*RU3YrxV}yQ(x5*oo5_*zrxWb!Yd5LSd!V4{w zEq#+?nmvV_@S9--P z>aE39UIzL|G1 zYhs~aSU4E%dcbR8pOW6GURI zgr1B%?S(Fu+eh8&J?$m3s9A`oJ(uMaXuZ=~mKi2Jau&DLNy1i}|wf@+PUJr{}f9yqXJqxV`cL-|uk~hFYYr)MB zGR#72!BNc1-WUt51xGP2dlM|Qh8u19HJ)~f++VbY8;!JUyaX0nDU@Pf@xm;$UL3`| z;w7=rdT|u%~#bt6n;bS_|$qZw8B63+^>9n?|Q>Bin^LeE_1m9e}HSt+E7h1Oo9?en@<%R+0f(e`=WYhs~ekj9^0uZ4w< zK^lL0y>=EF$L>eYZ+M+7G>&x$S;O)GcY!41EiEOGrP*{0gC~owvL}j@f1x z+(}(ZGRiR#$frov=WSxy1F}KLW)@m|Z4~mh7hgjAv@%3%uhDV(wwEZRI#f`Px8;}M zirF(+4n{uo9`!q3GRthp&q(#Im&!69^1F}>mP;U7CuSMEOqQjPZG_|q3FgD!^Eww( zeS#~r_q-k<)#7~{noszzms~3Pp|~ob=T`4~#VmIs=c&l~eQ%MF;7r}`)d*?SS`iaL zOurXeLisdm&q8*EeCU<4ybqZU8SvsSmoX$6kWaj1mTw?4A%k9eOw1g}=U!8c6hJn3 zT`c2BbunbvtG$A9uGc2*isxF85wD%agxn7K#!D=dF=>!{A>Vm3gvjgXCm=s~xmQw5 zaJRn6%V$w{>pyynu9o>6iG0=|)z99ha*|5zRLDD!-@J@#rCbI10`j|8aGgxG3i2~# zvlpt6F;79_pT-F2C9%8)q2KfU$ID`Q8=@mdi>?>as0~4OgTzHsD=8oRYCMG2E7&^P z$wK$t`yeJhI(of~*=jer#kPsIEtU1z9&!+3LeX)SU0Ak_meYY{^$mZU^8SU!Nf zfmA8cES9e!A3*ks=CJ$)`BX?gi=K>pAbUp(S$2i|AY_q{;Hcau+R38kmiLMF2$5F~ ze26c9V7JJ*1pj~DWUyP7M%Y8N#XrGYkQ0vM#ZQE-wCll>wc^Z-^WQax0KOYbsWl>L04v3DksHfWpMmMwk zg6G|IwmL8xxs6isG18f~Y14vMC+oXlI};AjTRc^q?a zG>hfsCaeOw81ME(b6DPjOu_a!B%0514d;^)Eo8Zs^T~)VV!3veJPRKhEoE87F^5Jg zSe}5;8SSuW4a-^xozV`9Hn4omF^5N+S-$6(!=r61be7Rk!x_;I7COr$3F&5u+g+A* zM6`z`3Zb%&h^}Wj970!LM@9!&PK40a*OAd-mW3R1RCJ8x8jd+CI>AEsxv3~UGpaSp zJxKSthX_evdGszhcY1U*%(M$=iY!SlFu%%&a_ox!pa za+r{8A;IyL70thM%O0K;Efyk=f@4s_W24$#qR#$Z+pK7jl+ar!osOni(M2qu`cfK` zie@TiMcakQoaZ3t>}dSmTb6!YG|ZxouQ}0N7WMw>oM^rf`OD5HBcD0Z5+T*%=%(*w zj*phHjG;bsFMNEoisf&vVNSG`#oR+47dg=;mIEO9$oYh53rjZSY$5GZ{H<|fbWMy< zStmvZg#6tRJ%@!rmxtt?I%UEgvjl43ChZiwh6)N<>=wGollN-u&Cqo%yK=)GV)$D9_`nnm9T zb#csT(F7quADbJkV^L%H+-M7n+NblPT|#8rFGt(wMYHbNve)HD3#EiM@R5=qEoS+X zkCgmq>HkS}dbIpsQYU02PQAZzdbE>8z2i|39cNL$Z&eVDUrF@|-pehBCI|`M%Pojz zvZ(iR3!>R9>b=~8Xf8|jdbvW#8PQ^vH?a-rP2Dr16)YpZG_m~UO9zX+r%Kh!a+ohe zEa&<%!E%EyiL0nx%R~43lEU(wFPSU@zT^uDj<_?Tg)HibJ0rS?Mcsoeh?cUbdyoau z3YH&{Gp)&dX0(RoF9@y4d}g$PWlD-1jSHjAEW1Exge;7V^K%tS<$2x+8V(b|E%c$qwD_T@|yqufuD=ou4puC6SnJI*SW59u5+%9g^(F* z(}*>)#X`u8HH(E13uQ@YlqH#vw-7?eTL>WuA%xJIMv`ehy~!5h{e8S%ujlKWv)sP> z&)wto^ZY)YbFM@#V$Hk`Yvu*MMlQ}d(i&fvOV|;1jjz`w>?x)TeIr7Yhdvbda@YDM zTvCdfbA53S@^xNWhCVY{@5|v*qU1o>9^g`60cEa%+=0xcz9!1t3E2v{%$M~qUXS+) z$Rm);eK{nD;5V>@Rj>+YQDl3^^lk`IfqyI z(n;j@ew8nqiwSffh_?Q7jrgVM>wU!})2OZMedR*zwyyWpb8*@#_KlIqwn}{S9u*^%ZI$@?xHxlI z;u|12h}tUg4GXc`D)A|eq8_<)Hu*A1WLu@a3KH2?sW164F)q2hN_{CL7PVFCOA}(Z zRqD&(;*6`z*FqxOy4g2EBHOyzSNk|?3*U@I&F^Dvx!E_tMQm~3K`MM%Pq568=W0B~ z^zO~LtM6;#;$-gfd7F49W;HV7D0RQjFT`^zcB347n+ zMPDw7d^7qbUnz-v-{EE70Ev9xq0Lv+EXKu_GJD_Q6<-?{=Y5A)ef?aV_Z?pKMLokx z;hWVrdX#dMdd-)`MJ&_k7jRF{S1H7P-|B5&Es4CF`nIp0!WZX~GRT*{ zL@s5@oygn?>G!3JOw1#Ydm#VuWpZ)uv;D^x^%ASOMrlW8!Er1TPx3b8b;viqkV}Rk z1HMF;ya@T$mqOBmQVr+h2;s{h`2z9)TL0dcAzT8Qf315*AyN7@IiYX&&{>!Jl!g^Sx z>@gSHF~;suQ@M01vd?>{>0F#XN2{5ll>Ha^Xmx-}$sR_lV?w+W7(1JvDe5?hoUtkD z1eKEgnWEOdy8DdnrPgzCTA!viQbx8lO>Glmx3!PjP9oddN9~|evaNm8gx7X&Yd_V` z#c6A%YEnkFHB((kBI}u@W>2c;K(%yIJ#*BGN%hQ8>xI}$$EP+>M%L_8z3sdAP*dZ$ zI6c(W1R?gGR#*Kb^4ExTbsot#Tk-oT*W!&GHHl<8mizElCMhHbLAtOegw-^XM92qR zGPyYWRa31H8NP2}f3q{yYAUsq>M_+ik~63tQ*9(!3t{Vqr8bjX4q-<vK9WiZ`!%Au>L3Zby7?5Nn5T|#DeYEzM73UsvbX6`_H4ydiE1ksXIUJoPH?H=Pu%T=%%N)T8*CI+NsSdDv2l$wpqHIU=g zJeRP{32J7i$Y{vi3Q1F&T~ZBMrZ&ATGA1(jL6)ltT}*0}6i5T)6m<>BO2`wCQ`H_W zRm!=LcOaQ+;ybLA*e=*{d6l}*CF~uaEHzDt{XOBc)C^bVGt_gITIiDhK+aa{xl}2a zqpcyxIchr>{JJP)2jpC}*Cl^I&R2&?Zbl~RMO=-l6Ru1gDq~$EC#k3WTkP>(xQZya!=V)aR)q zl-UkpPu=IK<07NP94y`zyhM$9kM~*G*Op`<_PTnBn&Ofr=+7l;hD*{R`D(rp?*XXi zS+stIT1XOtu(QD{)MAo+x+8ssT27LP4EqNA6>25PF%b5hiYwGQE_l)al8Lqo)Rb=4 z=PD%!!k#fJR0l}%NUl*AzRxl>%FU3~D0Qt`Nm2{RgIuSMaj8KlTspn4A+s4$s+N;{1lhu+l1q(u5ONQfT9Q8?4{)g`i8};$1|T=7jU*QeRz#zZR>lLhN5lxlL^+S%*?={kcu; z67|?e{M*z%E_m0h*Q0!knr~BEd&C@GgHk_1D%3%eJ0W9`&FburM1RD zHCL&*T*Uhq-k0zknp)wKnUHF=*(D*!-RhuA4ux!0XMfDv8uC1Z)>9z&sfApe8LL-| zU9u9HdUZsI_eqpm4f&TkM$!h!;}!QJ=83@OBL38ZL1pzeCve^^lrCGG)Hl zz8+FTBr_mvD`-&Xkr3}?~j*z?p`5y9| zn)RtD^)Y11%eaPB+qmEg2yy`AB{lgomMKwoK@y7bcWAYgWLhGQUC6YnJzUDXK?vJR zw5y{e3m|OI->yz@>F}^^IR&L&SG}LJn#CG*GNeOIaLG!@TWS#(=e@|c)p{;sZ8;B_ zx7CI|R!@h*)~GzlyQ=bq=<{i4y$I5+=8>#}R6%;wCX!;v-CX=%ic(u4r{9LZ#j43% zoTc-*nogO2Bg5MIT+QMl`tuaz3w2P4_Z4K=Z1k%mByZU=MlyOA-Wo%xeszN6V`N_8 z67?19Pnq{e2;1KK)mW0hAnbV2uO^Vl_4z-lpG2SBQPw*`^j!=ABPG%EuLWra~xP8AwQ~>LcDUn zv0betk@LJ=ttXN5yj^V~k@NGD+Cn1d=O?wDL@tXFwTnb9ixIV#M9$$3wVy=J;SP0} zi?i1KtSbL;#`PCQ@v|By#Jd)=5!Hsf|7rr48t+w*y}0;EHbLUJn67%*b-}2b!NoZ? zjjBB&C0=r? zXY1ajW^%zhbf|egGP~5QZ&;}s!6MrE0l2M=Ql&&&63@ioeyBIhNNv&c)eB?di|l z##+ZO-J?GzBNOefC;1hU0h!|OAldUUoGC-5`bW8xC~VJm9>nX<{+88)?;ap?IV9HK z#l`7QoWGwka<3KVALb%P@z8yEa>hT-#Tokyf9iLv<{^(9`wV|3mm1|Hv{jC_X86}| z5%t{8C7+8k(s+M2ml8#`KFil1CHUh9SzDr>2OtOf3%NM;%<=bfDN)Wt>(3yg z`s2UnrIgDctq{MziA$Ao6XXRf<$yml#4=UNU69w13HmdH*ylF7KZlFcL*1XprG~E? zZ=+P$U%*AYW61VVVSkY*#eX}v5oZNqf4Rsg51_60QOfjpldQVlqx3>7|ClJHG$O-f zu0Q1m(ZlB;{g8wG8C;xo>=1vx$k=^8#9!pfe2-Fx`1`nYDzBoRQOKeG)L~Y0r}7>o z`V~C8;&0`G-?)U#fh_RP{*lk2y~jS*pUlPCCmidqaA#0zk-wcX!>H$2$YTGz?V_z+ zkd=_7{#q_2%GASgtc0B8FaBxwwwC$pxHxSs^N+eRg($V$A2%Xuo{f5LfSlql<>JiG zN`F0N_AKL(C}ozcgjR1HdAUWGV=BlR&ne+WgJ49O-AkzZ5z+XvHPI94t zgbTh90(k?Owf?l9S*a4`1<1#cb^azU&Ni6mAK*fLMkdei{XfxGH%fg6xzt}o@-<}2 zt2m4GkCOBqjR*1|h5pP@QHn_-q{!dJ#hHx~{~%@LY?Szu|I12=%wm+<) zDG7UGoIQir?yn$W&xZ@CCXr8ixBKfzS>qBPq{BZzrQ{m*wttvQiFZ2IG5)tU|Cq?|zZ`{8s>`4C zCm)xhqpbyy_x#;1Spn(s_j4KY$i3eu{;UaBYRDt^eqZ=|xs)l#pq^Zm`o^E}m#BFO zWE13je>cer2;2Am>q826-CttG~tLW!t-Q629Ek2HEK!B)J}$ zPRO`FVGoumQ_3KpL;mnrbJ?Wa4fzS81e85lW{c7Q`TGH!=>|qfSmrNeq65iMye<34 zI3GJCaSPa4RWD&$oNdlPW4Kt9Rm5cVsIdj|$cwnO4kDmIW9!%CGXe?v@2 zTp)*J>XAaG2P#RXLk>e`zd*`fqSPG7B1n9ofg}Q12ALU9_7<7rAgn*L0>vb!Lr%CK zXVrlLF3!I0fWR;pXD@m{ATCzalSicv2+Zb!yUmbQXzQRrDHnY63VZbpkU(IZi&Jwr zpiE=+l-a*}84h^4lzJaQJ#0M;2jaPOdf0KN67`sYkW21^%nhIt{OgQnf8}h19I~6d z06Eka_E*-I6_=)giQqR*^9M+eeH>-?{`teypd91_|3v4K37 zu+~!oMI^GV;{%mkoY`0!Xrhcf7Ay@Y`|$bU{b8-27%1e@X}6vhXeE)YFAEH~gtdN3 zz`HN2r<4DEnT_V9lE{pYnaaV>di%SCD zc-9}M^-BYO650A?fkcIU6&!F)&IQdDdMN zP-cq$$g}R^KpdA6<-eF`c4mH4pomMUa==mI%>0(XC>N*o+XJz)L_M2r@fkrOQQmzY3xH4>{_XlPlAZnK9 z;SU6QxH$DR1V$($``i#nIgphS8CK6DfgCQKiahUqG|)>T&wHB!^9~Yi$@AW40_iSc z=e^Gd^0+vyzZ58^jBNd-K))+fh}PQzIkQ>KrS`t%^*}C{&Y0uw7QeIhdLW-fekJ}OMtn$r3 zuMkC^RlXT0oU{8Jz7weB;+!qN8yIm3J6rxRknCfns+7yndOh0uIFQ1{nXyj-*<76E z{z;(Om0`>4(?AbpL#98_O;Qc{>Q>xi3?%qjri34fo<(LLkjq6J zi8>&Ifi(e9&x0t%{&w?YpoQcq$k)hh4|H&G`utO1fQ!@Tp8`o5t4CxSap!hNpp;9e z^2CE4#aE0wW`VdM%iw7`)cjx6{7ayMvQqA9i^ZKjg1KHkVH2a?~?$ z1D?dt1}O6zN+lu_t!3+?RCF@lEQ5Hp;;_>nb``LfR>#HZ^IqDhE5rI6t7V#^hqBMp zv^Emi=jmFqB{H(l`)lJQvWK&^>WJvi0qD@!0f1(sMT@7uh^qzHmiqf4U}02$*5=2 zO!df_KTPW&ku!go)=j148_kDleUy>Q;&5$%GNq{b@};IluGj9h|8YKbyKV?R<`$fe9%gZ{9ke3X_- znFa`(pQE%4sz)yOWG#y_>^*4KR!yrcqmI>jDZ}1hX5%_m8=#C_ z$BxsKL)ko+c;!3t$7!)##Jx&(4ZBE-r;L0`XOZTo%qJMd^H?)eG?OwzkTxz!T!!qm zcd?c#Bu1{Qi?uXSk9|B{tYrxC{*HRs*0fm5;!@)E9xY~Uv9@MXsU=#TOFGc{60PAd zHZHOMc@J{DHhj2PqvUq6R2${uY!^$l3ChTI{sb*5NzBjwXq{~rCunh8hGOJaaH5t# z8MzglsD&saw}Lcn9%bZKkftS5Ms5WsX(^PETfs?MI%VWmaI%&|BDaE*wOlGCw}O+k z0?Np(V3}4VGqe>f)5^IxTS2;3Ng25nq-%9lkK78DYYmisVm3a-y1GiMqf8ED8<$2d&eoKrwQ;FZHX_501zB3Z$k^N0 znc5(iGXB?Owl$rpjgZJMv7D)mk(8mHpV8Kt+Jq3kRgQ7VJ(A6;bN3)yE9T-H-?Ozk zF3#~iTN|B}IaiB4iq+#}&ed|bIQ8UcMUyf)S`U{hr4~K>ANsReOHAhdQQ9G~Z{iNG zR>8%oXRX%A#c6A;HZdu)PMdf1?)_P(c^5Eo>RGRaxH$E!*9s?PF43wdWiHW%CuKHh zQOE4w)&?z$i__L+TEV2uWm?yy%oW<;q|6ms^1|Kwe5IDj#p&~vTH~b5)mq1-%+*@L zvAfrEjh4j4splH4Tx7iRuKq@?l8bX!f1_46sh%QjbW%M_0BP>R+jOm$0_PNKZx&QHqOmRdT0h9?vqJiaejM(dtO# zIsd&{LaNBfGyDg&QZ6ORQE2^4)cmkEO2Y05GkHwQUdl?9D9ez!67r&MGxKt@@#`=-jrX?+B8E1X|P8;Uptk2(R zQKyLh$h#2VX<1xEW(f6suXPFWzJr=aAwOt6R7zg`{h%#8Rn#L#`jgg7BG-*kZC-}R z$dT^UYPpD!?nKRhXtAfUj96QybzuLim6EWL8jwAM!z5or7DA>37p`EXoN-MJW^r+r z^3-6HE3*`(VuIb2k$1ylgNZ9e59QskxL_R@QS%Cvni-s+jJ%7L5X{XKrQ}_#*}-0y zus-{Psi%u^?Lwc=g9L-wTtv-%-c92_hp(IHXS;)*QT z%SF_4Gctz;$6dnynsaz?-YQ-XKfGLsik#q-vaB<%2 zuMhe!V)bnC%J=%~gC>c5ufIN+NHP`k$KK+9FqlSS*pfrC%$7ouB3mj+{$)!eNvAFC zBn_X5ZwNdX>?8TX&Ww^wJy!O|yH<=swZ%_zv@OXbD{RRix!jgqk}b9rlRRZhEy-85 zG?VOkoa|2*$sAh-NRG2*oaAg<;&R0(Zm`89*m1Nc;Sx*nik+uwztguB{C;EK3EeRxBY)K?}&XzQi&uz&e*=0*1$+Q&NpGuOj zEsZ3{+tN<5#+E*kYit=MsjEY)K~BbFu7C2FU@ohK3lp-I&2vr`P7zik}+H2){9XjERj7lNshE7g=Cp6StR+ke zN!HlXPEuk^AIa0UjFR-);=M$S;tyN=B>ttcKglG=+LA$Xt}VGFH`!85@}e!ZBt5n? zlWe!8i{wCjTSDv;21pj$GES0XOWdVm6eYHpB=^{oLh_0&StQ@ul1~zKqHMjK#BWPI z$r4*yNiMdfhvZgUhDjc^McE+w{FW^VBvaF5>xm@kwxp4qZ%YozjkXk$Y_+A5lgqms}1)2Ybck822eN!XY6wNAXB5=45qrnW4Zz0K$reGGycE}>g zlfe!y9SZwy4|~7hnP4wv#*jG$nP-FjB)>yeU|nnp4wA5M0J2|ndOkQJ#D4R)H8@7H z=Sku(p{>CQ68SE0YcT3EJ}&Q+g&rj{4^Q+4V@dvXjFfniry;EM*5GU|HOjuI`3&^% z#b6y5F=On^{H5Ty5al3b&O_$qVBY1dtup@Cz^fqb!C@{X%F)Q&4(SZ8xq@ZztTp5* zNOy36qyW+b`8b$eATm{u-ynU#RxUM4BV?bq@z>B`(v>Vzqr3*03;8xUz@q!%BHV`5RdVzu5s{Z}3HhYPr-X zEW_H04n-A-43noJF`+CjHOe)RmmzzHDqZpxWLl`5q!O9;A^V1AUnlzW802%v^iVaI zDy1F5zD^k*>Zi=t5Z3yvP}=pP6cg6x14H#U2>A&z0GShNCE0Ts?!iLTP*jP?#6y0E z1Va5>s+2<@N*BI-7s|hpWvZ0pAu*6(sGLiU!fHMUqK6tuRwKh^)eN<}gw1LsG(eJ% z4EuZc!J$zuRZ1yjF6ucXl(b2-#UvS$7%C#U8*&mPDb!BV09ge&Dl|g!669h?a;U#l z)bj!43dqr+5fU~(#gJn{3vUvc?~$p1ED99~vCsJzhpM@h@u&OP(`$=EgCy+l%QYyq zB$Qaj>Z$R1(((6P$nl|tT*{OgkVY=)H?xe`PTAe3)KD=O=k7{ssDTT9c?6}JQ7Sd0 zl(SM>6btein~1n()JX7(MJvqP;UYa#4ylmrg~Nx+=7gi?bD69ZD7A{W#mBtk1+Ue7v3GE zbDCU#u8}>QCfA>9ZISEGMqA|iQ)G)=f3CAdu0M{*dA225t_hB?ce2=WcSJ7t8)VJV zS7Ti4j>nBsrjl zrIL`jCls|staZmhj)mMCswC-sMr>dA%hsozhD^@((#;ve;XbUCQ2?nq|$?4CJ_ zk`MU`@~SP@LfHEJnk{n6eZv;nLr3Jc{6?sQubDO83e;1JtMQIdHy7s!+Yw5r7W>1) z=6Lw`qdG#hB$u4yQ7&7JeOaiLtr$%h2a^KP&DsTzg zw|o$)Cz1P>k3z#Fa^LbvDDiGlkKDI>7Ahx^`<5?4T_kef(jPKwMJc&&`6g7&Wt-<- zT3!R8dMnmWnZH7HBuOOy3$>G+NaE2`?h~c5A!|`; zPrZWVN=QB=O79`L9db1!T93b9lxl>qr94GXA?YBQs^^hxgIteNUcH#)FUYNsz4U4> zRmy>d|!NU%V||^Y2_rg?P8%?3B%XNUtD~{R!#S zBzyq0jU5M#_vLvmfLTz1fwS!zJxu zQS+a)+~?~VByyzl^(+$E`g}cyM2>X6o-2g6&X)UpJ@ye%^RyLWoj+WUCy^sPT%Rq3 zm$J~G!}UhW$kvb0n@MErN9e7tQtS)oN9gg7ine6UN9nUkW}$U9&qwJYA-pX%t4HZA zl#w+bt+%-{Y^^(5AEu0~d4WDkB4>VqKJF@YC`PeBFKnc-(^b+!y_iH^aV*r!h4B6y zgHj9igvWLt#c{fyM4l}lr<+1}sii1&oZdqj_5>GO!&CG=682X!Ap<1xS|&vwcGYt# z>PgY_9^bw7y)dxuAmYb>%yGngg&N6vV>|XN;dVvtT z<`eWj%E&X}6ZHWS_N>|}^zcM|m?Vg0dJdOSl0zVDD>zXf7s6}4fMgUNg$E?!QbvvpS?P9m>&*6KYZ@_J{jK0qR`ch>5o zB=UM^t*$)FN6N?bIC{8N_j7UX2<7S_5_wjct0#$4Ub$W5>I=D)dh0P#wvWoy(@3BRk4e_snQbI_dX{LNkAl^6iJn6}+=0w9 z7}q6wz7U>yiA&aVZ0wziZ2fY*iA1)3xgOslGP3n6^mG#0dV!wL#rZ44m3lRo5=G9~ zReI=oR!@ndtQ7aquF~g`>;++czFJ>H5)WZ_)vnf?xj1Xf)%pmDTw4lt^WUuIp%}Tg zT%)fck!#DfdOepiFT2wG5M$q{_mi+IO(sQp!V9dPGB3N|@)hJdJ(GmpZ((x1UP%&0 z4_T=j^lp+wl49N4D*7YW%o070M6Q`7dIE`DGfQ+oiCi;Fbd!s?kMslDD$(;_Ilqd^nR?GB$l5|@_FSAnk$~UB-0#91%DJ1glT)Do6BnKIG&+}Hj zm_%MX+@=q5ajpzQq=W_*L4&TTg9*(CBvv{_$6BJX`|*7KyGt=}-x&3b_lzOMes zrPn2F`>NEHS9n`IGwppmp`|BrakktodNzr?cdtdvA z|HJz8nBGe=f=nthkL%_eA~OL=hcxNQBzxn|C6lN0G?D}etEX9SC$S)z$ULKulPn^6 zR!@GDkKO+5;OF!d5_Zr0Y?OLVPZPpt^?WWxE@69#=k-c1Lmqjr>3Mxji2ZbNs~*+C z=O;!!UEHe2a}it9I@H{%w~LIuHMQxZB=YIvHa-0s?$*6#3-v8~Okj(fZYB{SCdklhxd*9FDix=0AWtCwd*pzo+7FR*&G$i9Swpz|G>S zq)S)c7Ny=o=3r#H^h^?#*;R)-CwjIkb1X9N>a8TlqOBv*R=3_x@*C>82$_%cd0nFB zd642O@Ed%363Nw&Ums>tPLd2^Zy|lISCW)N6x8#%K1h-dVZV>or;m_42$_aVpPurL zXp6nc&b}}Dg`P(83FH)HzR>GP4w@p)h`!VtNWMkpY-GOF$Ax$=g0L^rf2Aw$ike5g zcyO&zHLvF;j^Ru2sQUYOH!KmIuayNwSSO2SzaH&#WfUu`oe$k_PSUp2A@^14l zdOV4|+x)8@B9V8k$MhT$dDr?ky^ciQk>05{aS>a0C3?719~2pT-?B>&eZ*V$$h+3N z^du5_*Ls(pN+R!C@6s!{lqerz6!&6WyYyx*&N26QJ^o`>bD90urQh}0B+v&bp@>vAwMIQso2)JMMUm5Q*HY zdyP~fd{#v!or_o#gye7;^2q!AUZamh-sj)j7$=eU`KKA)PsQ3I@AL0#m_lOY-xT7E zL@uH&b`*{?GN_as>2#xzME>1jy3sqSo|#6!tDXli8#9fB&qV98o&+O>OPP|1*k5!Nxq1u}d9d)QXHUfF82UVMaHX8f81=7xejXBkC(L8{Qa2`4f_4G;?uAafH#z z#TmsB#-Pa9qd3yY@8>tth`i)j4?JpFmH5!%K|b@J!pSbvrojU=+>Wyb7p#n>}3E_Ma9%&6uf>Y0a;rW-9> zoO+fUeI&Ba%Z<42L|d}vA?jIf^m3`;PZ1mgIhF6nij^uq`!?5NNQN;% z^~fg;RvI0HtY&9cGmY+l$S@b@9iL2N;rFamjj|T4v#;o%VPv=@3Qr_v8Eag^zM_AY zk?`r-8htKVfl}ugBQ7}yvf3DT$y&%7!yMw{^0Ked zZh%~5B$8Z>KC?5%i;QFv_GTHoV|I~|A_W=t{g#W2G%n6{(?v$T$nZTjJH}mPG`WNw zSoPS-Kl?xzQvt_E-I{G+IbnQ4c#VUum?Fya!?PbEVP2Mcl7@0QFpH zA1mdzF|W2oejD=|TjaZM8>LM98a3~GEbf!oBJW)|@_)#%YidXSm@Luq*OBZ@wEQik z-G%)Y()D&*k3_^T9~Ijozaij={9=G3^7{ae$gcr7BH#UYM84_ohxY8I3nMXcSODs?}&W=-4Xe=yCd>@4z@(gFP0P=^M=_vCf2COuqG56>0HW` zs8zU{hm;suB)?sy@L!9&(Ww1V>^G((^CmJk8ucVTNH=7YF-XGd`4m!WOt@qSQf9<& z7xl1=@*%zyYRuyz_AQ%nU3sgK;gVU%+-8)!#0S}I)C=*-U#_{sXyj7Dzu(L1xx;9o zj9ki4k_@7r z4D5UBjC_*+LfGD>&L|~OvZPcBv1hE#sO2)``Rh{r{R^$v8MFUSv_2E1RzdDJLR?C` zheIB{g-N2w*!4VMJJzlT%2Rv1BQQ;*Q}g|dd@-34;t-UN|bXU8z2qFy#KOH ziE=$;Go;a|B&mZu0%KPy+*<=st3Z} ztNqL<;37uxJ4*E#Jwm*4pV@Epk;q@6>Nf^R*m02Em*_W!NoJ#UwyyRYqa<@7>!T!a!KUxX?|lQ|1L7}7pA^3in!Ex7og_psOKA_l%(-n zkFr0P3L(k~$jsr=;F7tJ0i%uNbYvDlzBRgCatdV7=y%D5kROa;mu!UmXvF`)dRV2b zMm^P#5hI0*nAMp$!tO9KT+)Qh&qlUOS|FoFflFS2{A!GG>5P%b++D^5i99avGNS(E z^AjVF-Mfrf5_x>zC6BPt@*H575zjMK$|dOYyVv7>f}N4?iT`1Xd{6vuBZ-%Co}S$^ zjDh1{XS94z+!6Vn_|))1(H{>J_MZ6O;nYd>>|@s>-wNL+oIWWt!_LTU#}T>h>~Ck@ zK1zI3ZniCQ8`Q#?yyj}Jk-twA4p;pDN=3`F zFS}H)ssril{H7puM65TO@4*=&~V+PQip~cxRmj)$bN}Y9BS7i-#||adnees zQO4g=A4TS9J0ss@Ul`7FWjr6@Dss0Bd$;{~Tjcj4)51Me>SoMg97-(@r~bv-a@LI% zb}9C?aQ6N1-G#mFzABtPsnl6^Dfw-~v%;B^GCARFE@Jx%qV=3`fe`OG_yrU8mip>& zsSssG0^R~ZW_39BZ!sI|-t#CYK-Ptexs)ii7{z&zOT!afs+0x@dxNGRJnw(3REhE& zWv&c2lDtN;F&t8GlK^{w52;j1xRGQK!nUs)!|fzHDYGe@;Sr^#orNdv(0XaOh)ap0 zL)g)(EL=`<7-Sk;#KR0l6z&L2@n0y%PUIq%={97Z36}~{!pQszX$cQdsUsnK zevI!Cgcq{gGc+6fLR!NEB&(3Q0c%2QSczd7Q8T-H`Eq!+OJ<@}TR2UK_q89zUus?r zXOOICUn$&x<8C;cME+{wYvDB{FXP+bY&Jxg$qgU!LgEENwtTINd_lG z&F$d|l1(V3p+B#Ot4VH$9L%MTWGf_@OC!l65Z3w|;bxL&A*}T`!fhn-tn$rp2g$3H zc{AKY!hU0J5#B5A2=|eEgbe%ISVwq}q#wfCdMi9a@+;NzR(PCbFPuBG_dzPZarVaFg~z!#zk~T**gK8SSd6?<_%0kL#KYd) z>_I)>h1ZaDpg#{?gfpUWflK~_%wV{jqz9QH$oJu1myB{T_hD^SDcg|w3o;aLB^iPo z@Co*|;r@L^hPBS#8yyahaS_YwU}Sy_N5%1Z=CiRF@>4j4i}M@JJHlxs@-D=VaHdPx zU5KBYo=pnmLI~pG6;;b#dgkz_({?sVHBXc_X^GkT1 z5O3@`;_p_!hLgBddHoQ!7yUK7kV+*%vQcU*T*t*(Gk*&=xrA*OzlFPnco(A-TU&O9 zdxa=jkPA@H&hP-q#U#7JBP8rT04p^f?%R*`8P`oz&v?P8bTe*$mf51bUxHtPyA6ND&f$grm<=a|VPr;+%~G?%dbp=##1 z;|sVd7jd&nfS&d)?#v3`n7lG(?llg|cQUPqV+;9uu7c^B&lGaBjv~y~G@G30tO@nTp{o3${$JG84Fnqd8k!HkzhO*fPD| zOmPWYrln?{av4f(F$<}bydPC z%rTM|NE*y2i;cZXVRvO~P|qV~JQuMw)k7N1Y!bFLJqmfu%#W~AIL4u#IV*5QX10-h zN77^tlCZy5Hlx&&X5w5?>L+BFJZ*N9?1KCo@{AdKu*gK`;Q!a+O2AyhrAlF2<$gH- zdCn{qV&6?|F{`;a=RYlGgG+{zuF(LLIpx^W! z#YWNT>9R}BCi&c!L@q-fxd-SsbGSHrfUnI4E@jI92E^Ms+ssxHw!AJw54V}KllhD( zKS6GQd~4<(Eo2Px$F*2L%x*4K%GC354vEa5S+_v+a1Mlx>wB}Ai`e2CTA8%D~RSEK{WB(=8mk~{%n=XHOY{Uq{C?@x13h<#r7r#a@5UFhM28Ff7G zGtYQF!`5rIa>3taun%v=o?o#BN#tJ{Jk}T&v2WQMr94(ts;GyR+7Gga<#)+!NR*Z0 z5(6^D${~3PqhR%Tt$dfTOpH~rl+|47?WVEsZH;oNQU)Q3$n0%}PH<+PonyyZNiJdg z!&ocTB|9L~tTkL}yi3mXC<{@~K2{#de^IlL0xn{tOL%6Cgv~}eB+kk`arf4zTSZ)) z{n&IXCyix>JaRu4Z&h+BQP@6eCF+@JHJ-#WB}&w4oKZsdw@ObI!uEAc60Cw{LS|6r z04ph7hzePa%z@Sz2|Lqca*)-rTx8hR&FYzLb(|t338mIS=2&Q2*^}1ZCr`z@t|XnF zN0ac)YGi`8oSN)WZiSe(oDF#xGT%x#H3l^~`_)7%#ATDR6m9XV607tdnMy9(JZB=q zmSCb)embjXn`bqo2{k8L6qhTU^G)N177?86VYS|*h`+-j#%x1rQ? zsQGZKm!y^?$r>hknB)j+g5+6}BdvvJupVwwUW2@ZdXA#m5Itmbm`oz(a687ez!o-# zZ=lpMwy-&jI~{LRTG_m2XQYd)TxzQuZL#@TWL2+<;jMpZOBWY+sb0zqBl98JT4arJ zapq@{rDU;s+@)fC`1~LjswTeheAiqPFTD2tiLzK^Pjb_zzae8>7)kK+>k(r9jiPpTcb{|EWmCR+6 z@+mUYkV&&LCuL5uawzj7G8>=6cb2RolD{E)Lr%78CzV=eHBe^88r;c1&C9HI5);Bo zrCa@6oOxbu4Nt0Pxiv>D5hs0k1~O+X@xa9sniO~%-(&TS6E40 zHYsc!OIyfFWpHs?Utwkcqf{=Hx(BT<;idBbktw9iqsXu`hZR=!KQeWcc>|f~Wh~SD zk4&p8)1JaIz5mGcQ|24g!?v##*7!d%$~j_L{Ep1$i&@6YrOZ3?LfOMOl7k`aZpI30 zHpx;5yNX?4H$1E0JV9gzX_Stz?qxAncx1rj<%^2ZY@_KHW+uX@GpiC5z-m z$TF-6XIMETA3{#!l1HN9Y55OR@mEEwfaH5*vXEJ26_NaVe~*%dW6vt9R0zLIvzlkJ z&SkSvqD-LFWsoziUM|jZKg$~6;;gG@S;Jg5Df{8>_#sR2q@^`RVvw9|O^_@g$+o=b ziJ3nIavj<_$BHLe2Pub~Yx%j9c}pSeIlc2Nlcd^~L?L_>SK&JDJS&BZbLD%!l}#eg zf6liGxrlRsEof`C)!?d!tt}T=O(7N&H5X@DTxivEahAn} zRwI{9%9|+lEbkAR-t8RVB1?!ke!Y%Nt}X2N^)6(cE$sO9IV8{O5;gOA9)Mh8^>gV| zMh-&;cSSC>1}F6=-x{I*e2M3Id^Q_SpD(k#TsA2`Q|2-&G%0hrHIFiT;BE)2 z=W;7$QsxRPjWP#N<_ar&Ql`LKLz%ghDX@x3mXKU&)lMpPl~qrfGbwYG)ix<}wbenH z%PDiUH83etXbn?l6J-jmsMWjA#x+(fmrcrjl)1+8Ps&_tnUwiAWv;bSCuKHT>6Ceg zG8?VDNtq(6fHM7*DY7cLIP2JTR^6mh*I5lz>KByy0n6e#t8G%|daHvnd*SuOt#&R>&9__KT%2*;ZuL^B zmr-gC>bcz-n3TE08vcijQmKzoiXCC^u%a&FbEy2+mIN+NTX$G~%EYb1nGD*x!&*2g zQ)Q)6W-c;po~x`nF3u?Kv>GRsy3=Z=Qj1aQ5Y&99)#b{tuUl-f#)Np!LWZ3=)L0WF z8(3RhyldGgaJ-<*-Buh)EoJVuW|K5grq&9Pv{RX_+laVT4R$+)mamiS%nO1tImqc<>RvZbDx#K zWs_2h44dcstYnhMNba}NCY5@?%Am{#EQ6XKuyRPgCwb5+m{jT^tB5jkZF$J5B#~>& zLsr8-N;OeN?g1XM+9zcitgcC!2CIKk=3#4)G85?GndtMw*7&5%qn5Hxti3YxsFlFQ zSvrqdAui7P{FpV5O2w|nUsq7`W7a~FxsbJx$E{S7WsplDPgvOacX|j z%BIXM$Xt!glU4!AV=?;qs(ho?W9b*RZp36WZ0dzcB^et=5?!sGL4jZ-Rg5?*mtPju!gxf z=d>MG=u$Q==bm1NmBK}w)3#v7-m>zzI5XC16>!<4bfB$2GI4+2s-BeTvg#-^gv|b! zpDwGN%QnxnOL0|;Qtw$^BpDF)x1{&2o=Nq5VDiSQoeW6R{?%+DuQ zB4tiThV55Bu|oN*b*DeQRw5UtRIioHWs`CdO7)`VUMpo%=2I(;GS?!Li@z0pYGqE! zd~Rh=%6x9+Ps)5@6;g&hQ}7kq`ogLZ887>u6}w9M(yHcC;?01tr?0=X>M64z=u!F> zp`_JFnWd0XTr+-UwTKKq$_%6Cerv!bY7oFgH{oh`U|D@L8(EjVp6H^t=dVYzPIYB)V}$m)c02N zq*6mx+oV!MRtJ?bsnn3wJE_zU*1)7vKUl+5Y9W>S!5W`bYS@apeD`HBY{hcfq^v@z zgD|dPE8dl1_bz_461i;iSKkMdOxD>X(U&l7f76I?o#qY|;UV4ina zao4i`bSf7^7C}a>RFaS8dz6zQzgh)coaHrU6>)Kv>6lgik4z<(P0Aw}#Tlq)%&K)| z*o^&VHF9y5=}v2yM9$bwt7YTvGq%&}<+3g2Rn&YQYTjw}3$f>Cr!`0!IX^qCF)rdf zip|eXE2?PsWxCUfe*!_lI)98Ly&PR zon$_QW&W_%2#J{mVfP{bv(UCUF$aOV3l5qX*%OX1B=i+Q%(UFCek^PwxNg1;MwEI8=aAk=)Q!8(k2ey_#p#bXVp2x- zCnhqFMD`~plC??n=Q-5Ojwvyb93ggpVj{Vek^PB@mTKVZ*R42g}zmN5~1W=F=jNW4qfRuC6S`ipyC& z&JlKcq@G0X)u%_=xj1|E>5(oW_DH8kdMG1DIz7@y8M!7*kEGnfXUx9(n;uEy;>`T? z$QsJXncpwcOCtNcU&MRc?tR`bVv@){?-xns;`DjHNV*Wa&-+C(DI@#5UnH9{vd{ZP zI!NTw*)P(~#p&~YkzvZnKF^4l6=I~a&od&~mAm(OMx=;~)595&QXzH^XGAI}BYQX_ zQcW4z!x@nY64}EUk*F%xmea!-5kD7aO^A=wlgJ*%M;f;5-oyAv2Z@~3_{bm^r_b?` z5g~S;<0E5~k$sMjOi)JlIX<$cTFj5^b9^L^i*sC#j}&ro*6{d9F_%rs(N~D``S?h+ zE5p|LnUQ8L&PZoP{CA1Aq* zmr^129nJ$H75|Xxe@GpdP0D)IvlaCm5NVo}IWW>fnT?b=Fw*799ErP22Sxf^!uHs+ zBLh_GR+M@WHP4PraB;SRIT7#uY&M*&U``~C%O>Svlxjq&IgtdC77|~?Px2<@8D!MR zJd%$guRsEkWG+t4!AJ^awjuL2GQr3iSLS1g9x3256!QVT0DnI2-58M~A)cQh>@JlN zDJ7X!ETzI#&)2BOh_p~W|BtNukIQTP{{VhAnMNaDA><<#+PQv(5ZZ)To6yL95JHHx zEfZ@K;?5RACKC&pMkZUEM#vTmA)kd<2yL>35T6jj_kF$3`?{~4v;DW{}A*X9^D&clf)ge$74^_hL4pd3EFHj}j0jf%ds-vMwy2F90BsXG(e}7JLqfp>p0aTp? zRY@-F@V-xzk0J3sP1c{n92XY-Y4T*KN)C&88tOzhHqcj!8&7@Bg}(G1p%gcrq!>g$ zp>&d)i(;QBJK4>x(_^+zl%4DrqS!S&#VtXxD}Rbxh7xk_puSGoWnQV_G3zJg&WBk{ z3X7gs4oF&9^t`SENq5TweVyr6QeRKdEY5TjSNhlaEH?=y}FHu zJ!)sNn;*zzxP_GY3^I$LoeZ};keT9EQf3G;Pd^9GN4a$eZO(CZgEAca|H!%D?x{+GRhyD7=s9 z{qQkZ!KtNPLO=J&ub@qrM}i3MzQm{)*V>wpVzhS2#G%T>MQJZZv9$+<~p|-#cr?J zZYzp+Tx@~fXS+RKCer+slLEJo2qh8fjA?I%p{TySFn?({^>^+fqqg#by=XH}?i(*^8$*rfVOqrWOvJ^z0A@6i^NH&2?g3Mw!k7NksOpqmR5sKaC%iWPyZ%;5!dY8LV zuWPaMy33702{{KWf>%v9!?QGQS|D?`n?adlA(IJx-RcKEJmBV{*u7<`TM(#P>K0MePf+y$ zR4sK&N%pweYv)0?lH@QDy=PXrRU{{ZG(gouZXL-?s#@kYq1ahG?Dn+#XYsH*fMRD+ z?GB-YoQ2Si{w8v@8~u*13OSFEJmPW`TlJ`$OqrJ<)A~8QyK{3;Z12n6ocH{_FLw(_ z%vGkw&F}DMYTRNJ+t*`mDN4xcrtv)HR-)K-e%!4IR6Xw2QPuZQ^%;!takrUdbP0Th z2J(d4N^%g$2uQ8lMUn)fSN=)2pJXzKZfAu%LUJj{o;`4H)Qx)ITd^BS>f9KT3J~4$ zN;i(=DUf}k>S;HDQ%QtQ1z-iNL6n^)#)&=S6yebw@3X5GIc5Z{*N0=azLr~ z>f$vw3B?|98{DFg{72IUw+zM3bfa5|VpnXVTa6NOQlaH6=zXJGOL88_ERa^Wp5zLU zT#(n@Mv@yr3aa554!4!097M14CbxrRImk6o)#i4RtfqF}bh}aPEZ%ZkKJ(AwEw_Wj zoHyQfyL?$30(F(@JDRLJPFTc^uW?7s1Vn-Zw{z)hp7i=e6& zTK>SzAh{7_HOPl<7K+`1AGx_Z{PX(AEkv<>b-5)db{1W38A`~hgqHRG)8$qKG9SBD zlz9m<_rMkOW4A7l`NVCY%sY@-4Z{Xn@Fw!(cj7X#_b?k45Hs9ZFl=fR)R!* z0na+P11NU?>33^>^6x+WZUc!qcD{962mP6E-A)pd`OfY5#h>}k?IAIl@7;u7{h9CG zWD=7Za9e)&X9nC35|jDCtsU`aesCK}Oy);7K4MSU6YSlvAKfGryWM|sQ&8XuKv*Ar zoc`oy2Qq_h4rRWA%)zjRgKjCw&m=#)btJo$!Ic^^zqoBEcCY)N+lgX(|DW4URr^Dg z3swJfdr2mc47vS*c7An-0`2_jj!@M^sM34XuWsb-dhQ`-I*2~g{^mxL%mXJ`d(KinZ^O>7;f{%cEFbw7=z1tO>=oJeswjgq+>)geyL@JeqYG$$waV-gZ!BY7DHk(yR)2w{h8fa0gByw$FO1)JBu-_ z6eZ-u!7Q$XS&U)z)Q)L+57rguZ+Q>aM`ALOEb%}7Oe9MoF`2Qf6`EUO?fnLSy5 zyg#!i8zwQCy;$mae`YV1iDG9O#b%<|nMSc(l#r7IGu2nCC{{#rDo6p$eH<$zITvIc zyn@}ERgzo`asy=cVbvu0B+;yvd=WW#|>EOQcdJMiiYGH*d9mSvJm2kAt~MzQC*gISjAt&h1&b1=(A zvEw;}6`deu_VHB&$ZTD}NNLL$M<~iZ!5w zoIhcN`nq!zYbF^FpGzD8V?LU7kz|5Q07+y$B-etR2r_{UkSqq71mdzGlBYn<1YvB1 zq!mQpk>)HaRgXF3dFj;``-=U>VTHhST2ff`81YKnPVWcqyc`t zft8S)1M)dkoz7|kRcEj|%3KE-y-m+xO(aW5(peix9f)3^Gg%kO>y$Z*^^tr@naOO3 zv}Spv!3Ap1d8CQAuaox{>7^9)s;!?H=*sOnsnAE-Ky6;fs^Rh`GmNdBR! zELI(;n#O7=b4Z0Z!fC9DBn3o|@O;)DsJei4QszR)91NKYSRcuJki$W;S?uX{HS~4x zLY9nTuY=QB5s5zk=8y`3<~lf? zrKRhZ?X&vRSq6&TUej3?O31k%W^o+MVmj+2c?RTckQr=nrz$Ah|i>kDKqVgr=92QvEDxrjNF^$5Lo=0aZ=vsh0epNGtB`26A$7Ehv|zP<%A zm#{<>dv&;kCGXUZ{zUZ>mWmQ`TA`hCtV$1LE@hdN*$x@~S;?iWB#^m`l~Lv&$W%c) zm$9lqCYRMv=0Ep&bI)ZRBqxzv&PD=NSFnf-J@=544H>-}SFjiqJFhEQJc?cCD_J5{ z&4wyH<||nWNg0Sf)8?@(lE*;wdF(2dNAe=c)vTCgGqrOKt05VpcJf&r$wBvfN9DDw zfg}|~Z{_P)E6HUfvspLEtswf-(gGGW#cpN2_s(I7DE6qF%koLg-aD6NOx0EPsDup4 z*0FWa@(S1%b6KG$;r)3oE2fOupXaht$_ztQJy!LTnEiP!8$|KeS&wioi#l8PZbvwe z6_c0|&SPDf{t?b&LnP)|$9XK~9Bd~%=6Nj6lkk}5u>{JPG0$V1GG@&4SQUvG^E_6A zV)u=CtPUmQoLlK_oq4RCWG+b|8`!Bz&-8j0d9Ht^^H~&$ndy91b)J6~^I452;aSXQ zb(Ar)n9mw0V`ed*MP_+@nOV$d(I|GGpU>h@?7Zf)1eB0-AI#zf*n;y}3du^4mqBh| z8G&|+SazVDB9=o{El}072A(2dc_g2JY=m}hWF;g&fV>5A6RRNE>jCdLUBK!{#)G^M znPS#Jk_yrVvXC{ATnM7?C@x|xBsYNQ&ysFtZ6sABC9H#FJ;>+K&MmBm;ZSs^%bp@4WZaIEM+55+i=~o052DZEce5;# zw@B_`xgEc$AQH&_iDD%UB}GDIj`PA7&{emylGmj6ge& zuq?`yLq@-AdxRCB*bzR;>Sp*y_$X^au_Ij0T2br>m$P=1knof{Rb9cVQS2;Muv!$j{{yqo&t9%z^*d$sES_R*D0UWgtewQnqK@TW;>{ur+BpLD z`8t;GNq81@tdKHh7ImzcGRvSU5v$rs%q;3yCyF;_J)Sx?KpFE|eI?_UdV7=^&q@|^ znHKwMXC+HU**eyYa3xFiBs{{EES)lDgezGlWy}ayvKkUI!j-HJ#jff~)_?-PI;H0Y zd*({k5y(8vx^~Lw=W?HBLpx>kOrK%Vx!%0YOzT+|iJ56V%e~w`(|T5lVrN><$~_6s zw4PN`#>}*yRa3^yw4U{on3>kIK@_`3)w2;4JNJ4PafKcaJX=V6R6UDAv0Lz2mWX2a zs8x)Un0c*Y5m(~e!`o{Wi}EBqi&ZR!GG-R5SR7@{ELO2%5;KcctQ5tLXBDfVj9KUB zSS^Ve&vPt2&p)2$Sf(f8@jS<}DPzX-9Lu4M8P9X9fy9jGIo5v zJS!kEvv{5rq1aV@o>fxDjBqupA~CDFn#Er0jmO*}U(Mn@36EzrOQeh$&uW%L8FThq z&5B6OcviC#6g!^PteP@rJZo4Fi5brtRyfianavuxd}jBV5C3DPu;shSgKX ztk@bhOkzg3hB*bgFFV3DEDpsU7mX~3#Eh_!Rn75_u#q*P*bz3e7Ei(>Y-DYeF(Yhb z9h5O6Y-DkBaa)AHr`gC7Q0xdBSsG=`8m?vOBxZzbS%)X#BX=$9qKx?l@mkhH88e=> ztdBBgJZo9E zB>a7}bu5}PW`yflE{WNu>sUUDH$r{qWF0F+vERg5$4XJ`S+t2&1ge@?6;+vU;xw`9 zK-GFy7pPj#8mP*A6K6eZ4phCw+5%NCu@0&--^6)|bq6xdtd}x-KMZ%(;7Z-h22t$m zx|i9^o4hqNpZL7Y@=@$+yuu1mLe3G;&e{%m#*CHjk}2OMQ;lN#dWE$w^!N1&>qfEr z#;a_IGG^asVY!REDzk62uz{Pk*fV4ciz@NN+;eDQ9L3(fY+=csgpaQlmP#43Kew=S z%9wLh3#%eAdrJ$eL9t_QVa=2=V}6abkeD&Q#!7C%S%hCPzQ)Qt36JMBRzVpvp4V6v zWz2Y9V|^rMJg>0<6g!^RSmdqVikb0jU>PK4JR6vEn|}>Auy_=^VjEbZC*cupU`doQ zBiz7JC}T#rft8b(5pH0WB)WHfd~INbrQQh5UblgjqS(D|BP&M`DCRW&3_ zAfxYryvgc3!SCjr46kY5WKBDX-WG4O7L<^)6sq*^#l6i&0-1Ieu|&@ce)$$MQ(#-P zvltXRuXk8Hik;UxERm|3pehTh-eJikAA-yPd6%V;43fOZG6U^&ux!fg4NraQSLPio zkHjT;pOx-ZrC)3Pm(`%y>+)vSL!!5rUZ2gZtz6H`o=G;dJ`{TtY-R(VgpY#FY=|=E zDA>$KC}WO-%`EdSZ%;5s!Dg0?V%KLg%Rvb_XTdBkh1J;1N~p^0QJt*eZvP(D$y!kC z%74JxQEbZ}uuhbab0M^>XZiu_+a)tV8S`z^57-EbZTTY>d5`Yhw)_!`MhQ9Q8ut;4 zL9ta`EIv@x#S*E?T;sY}a-ixHmKLb`gk?~bxyF6Mvb{`XNs;&aHd|N@$zl+_-M6rO z67x44yICR0Rj?ZMaIc`7m3R{V&f2G}48_jkQ&zc4rWyr4-+^|ng6;Jwt0k!gDFFG5 z)swsfawEv+tdZm!s_J3QB%|OCjjsBFwUQhPqVHyW$=XRy1u22dSFDF*21zd)B$-FD zl|@wO?G?*t-$}N!G?M)u^+vdZ z%_LDI{j3PZ?k(T463S#!=37=xGMnT())c7vp0!ZsZpwVmIs%yi)PVQ9D1e0+QX9d%X{`#z582teG;0 zLgq5qra!Yzl4OwkV4Z(q{U~;?8)8F&c81spRh6Who?gg49Agzp;!!)$c5eGLJ(>ul(<<0LAt-%!&h5 z!>p95Hb9mBD;~qFERgw=RZvF%l>vQi`ja)F*p~lf&AU{!Qq}v^@}I1YqzB{~n8gU| zAo&GkHOSwri)5b~cxD^qA2vdABFF}ie_8bX-qDl=@*ar8<527#K8hz$rU)`0LS__C z-YKKcNTYccioFu;#w$t8m1sAfRjK>3SEAi`A&R{c?Z%5e315kJ^f7J7uc@e#_HSBw$dc|ecHd-blbAQ8O4lkh9p2wp@P^ZqM>mr%xx zCxVwz#*8O|cafO!MDQLIyQ&eq4+TE$f>qUfLIjU|P>;v%2@yO7W#_6ml#o*oRr>Fh zMDWBwW_O-M8NH9`zkjhiPv0ezNttG7M;{lv^Bff0`xu@ds2alysp?~>(&yDNyqIM4 zW8Qgn4_->5K=gS&l9!WA1<}t{j^(u|c3yk(ddgf)ReSP|KxQxAMHzE7-;4L5*fEde zgMq4Xe3+`t)qETu2~_RPBdhev+wttpqftVRxtj0I<4|m0(L6Cw70r{V%3RH(d1|0) zU!D=D+Lvch)$K6%PhnN}<#{9zfP4e;f4nMCwI8pc%sR;E=PLK(`OEyXh~b4OA?E|g z?7kJAAmx>T%>KNZGCh!qhRpuFo#Z!=IFJK*{KLBCkQ4p5mpO6B$5KCnv9Z4 zawCX7mg9LkNeD#$<&k)vmj2*lN!(4Q0$$71YY}uo~iwwLIQ6@u`@lAH=~4{_o%NUc~h-_#g5`FC?Tg8 zGPy9Gqj(>R?dxbBTj%fVXr4%7UUet(`j!4nB5x)!nF&1hIe%sXPeid}c6kyC+*gP3 z%!l!~d?v}EPk6$3Dak|<&g)U^(Ij{iifvi&7OJ`gs&0dp1#c(0jYRTJ6gzjt^Vj&t ztavesZ8?dT?jq$VA?HbGc`@{r#Ji{+vl>afZ=Jv8BtC>ufd4Omq}V%BFeuS2nO zhjupTzPuIFBb>}LQ0xdZcngUcVFr(R-M>vUcruB(Pn*HBQS4UE;5nXzXOY44C}U=k z!3!v3wsHn!ZRpi<~4<9QO3+`3U44W^P0k&Q0&&3!dp@7{yc@Z zqlBC)7|&<0m0=cv%v9b>nP(uQ?=Vc|BPh1zvw7s(dS15Wvw1WM{5>hC(yy`4=5Zw3 zKWumcra;@Jvs_+kFPlri|I{Gk6YVo`R~GFv1zUnZ#`O z8N3z6Zi^Yb9VO%(zS28u&EVaE%uL=(nbRRN5ng@GP8+a?pF(CRiNfB=+Ig{i@-bpeG zGBQGg0jEUdnSw%(bADM{U-9*>iX)kMSgYESK^) z%9vxhlqXQeoWo0bDTz6jOL;kp-NQ?HB?^2N0Ap^3nU?apK<0MdK$$Bbqdy0^o%aPY zckltq6w%!8;1QkvV>!g5P(sdP%7l0VNi|6sPYqPv$H7It)?&fv7NCQ>rS8@82th;$< zAaf7zrp$5Bvd-MYhf(Y-DtN>P{uQg>Q7G`2BcMuOPb+v_AagHIpp3Z#b1zRuu`S=v z(*jlZ^9-socVO=4nSrWGJ~L2N$#bd7yt}F71%axiyf{#`l$TPKd3UpvSD<)*A*ciP zx(9hJiT-`RPe2~xje&NS@n#e|uVuV#mrMr=e5MI2rnmbt-a~Q~ZPSN&KgkUsUqD~g ze30aJkUo${_%Mp?YdMej(7$z-^C%Sf_7GGJLe+8}gJP>{czmF$h9^?hlTh_LRMqgL zK;|)?LYZ}t`3EwO@oW^^^5Z-=Q1v*^r>a({(sO^D7m|DcqWAD8cuAnDmX}e+>_4@< z3dQ!dg4YJBR`7bNGW*X8-VmsIiZ=(Up5m=kW%i$^ct@aWCGQSYt>nE_W%i$yd>~Nu zG#?IBJZGK9JB{xv)^$sv8+ocH;cH4GPp6EzrZnMohF`0vJKkN$HjWiNqzy*Tku7mLNfY! zcvk}Q5>G?1eKqq;6x&xb&!(zTNueWHx2q$-KCH%OUgt@8TWsbHlrh_4GjF2I=TP+#Rz>vrx5Z{2g@A%jj@CT%Tzs*hD=BxV*L@(L8Y&wt3PQS7`vvTF((k=BG|#JV;pLu$*KiB3q>Nd^ExejC=1jYV_mh}4 z+`@2qM5fnT3Ej(gC_YS`zqUR2?*utYoMz4c!@q={pED{%lfqcqmlAI56BFJYv zpJWk;{!Nw7c_GQ8Ad?`|!&^vR0ny(K`hvHSdxc!4M3b>7B{C}Y-n8!w@ZS?6uM zgT$=!Hr|C|*LfT7MX~F=jrXI#r_wNs^I$c$apz}mUgv=1f_%*rNUjE%2hzvWNp1tF z1o?*NlT?Ge4ziuslB@+8{SEwr9Pc4{7vutve%||w*Voq|Wgy@3sQ-ELH;BGoe8-bX z_G|Li`Foy9G6CdXs2bqeBvU{h2l;^)lUxh(JjjncYRGH(E|3i%Kk-VEr$OEZ8RYdO z8$r53e&!t{-5@(ae&PKjKZA_f4!^y|6Mpkr-gCWooDOkLGM?mDo{VBw{x_aVnN-Le z3hn&H^HJ>f`kfaAs($AsRFwr)2~hPr&--2XZmWiQA&Tv5m=~jjoVie?kBebmO;QP> z_wYY>Gs!v-{nwWNs{L6Dlt_9I!c0>iqogn&e3XBqUBu`S+Xc6bgEXft~WjuLX7g^WJ8>?Kln%II@Tl$eQP&n@Fb4T(9o zj1xm6x@CK194BJ_)?!~jj}vj8gwHnPL;_{Z*=C&Jlrd+UaiWC8oNdO5G88+DaiRhx zAW{_HtLqt)aDo&J8=03>iXXoNXvzLi{0z^NBa;Rt}c@acE z!G5S{CwUj7^ad@RUOV_)${OhFP%-Fb!cVHii(xP0d;?W_ABz`}|Kh%Z->TD}&>b!+ zM(w5dmQm(i$>E}gMDJrdbA%|~&7V0!l%v?KGhS4o*!3ANYEVMXAJBUY=b1}BILPr}FG1W`p9 za|})pHIy;O-~=&DVvfNH!r9Zm8WTh$O30Z^9{hJ5a?%4pqGjRU2WOa#0Yd5~4UzB}6Gzy-VW}q8!C;FDXj*@oz6FDoMoj4>p0PcV*5%KJt(%XWRY};uCkfqMG8vDF?}5`GEi(^Cy0_m{e7JvDoD)SPZWuV z`7J%|TvVbI2#2lf=1AlRbWTN0CkAS=nRg*+AiZ>p8be}4+ zQ0&z+O;nQTnd&obnkY}uE!(3zP1K{9V z$W0TmD0YNtBAGJg{BxQpA~7R8O;jA^AK_`D0mY8+G|}Wqc!Z~k7Rs0ro+jETV@7zI zh(Fpt!qY?|iruECi6oSevkul-pJ`7M=_GHFoG!8hRcDAC%6vwdGejYZ-G9`aB;_PiL@P->$yCu! z(hkyJ1W(Imfv=y$BM1V>pGx$kT6E)y~riDVQz=8Ht6(k{v zi$ns7t-4qw1*$F><7JHCu&J{-{{F~(G;jE5G|D9kU0dZ3Pja0{;fPm)S$q33?Y*M znK`0ir;NTf%@yq^_S!U0L>{Z#@viv#+B8pO9H+%zo92mpl&xcLgO&xfJWmvQ5(a zHeY1ylF34WeZCdWh0xA?kxP;YG9Bawkxz0e$Ymf!qL5@dNFm6LqL^e3Rox^?QM_%c zS9O7?L9we^ENV&2d9_#+oq+2cUc+Kh;z@W7i$xh_%o-Mp3d)!@EEYW^W(|u)ABr7M zv2aerzDAkz{6djNV#c#jq@JuZb}KIwIVfAl-U~Cm9p=7JLf8ETqwFx>sM^ zK<|r0oG0NiFA@oqF=JjNIAxYXRW(+XlbA6t5|t=+A6q19Q0%e1NYtT(oE^~4Q`k-; z$!{R5L2eeX$nbB|9=pE*pLv3mh!)J0h2Jliing6v*1tJiD!NcMjW$)ci}Xo)re5zI z(9WHr0L5nR64|HfObA>41Ty!EJe0-G-q8COAoq!Wk|RNOfK-Yhl4C&zK^_o14f~3m z2=Y6~Qjtt@@?l0&NzM;v(n)5AC6lB*T$N37by#vp%EDE7BoBq9fF$jnQ8b<+6g$(U zA~Ic%*>0}~MZqpojAFOogQ64#{(dF&brW1=9u#FHn?NGrb<{(mf~1!+%S2_MooZ1{ z8S|`2wWvq2<9Spx1*#quEmUQm6?s&&2C9~ejzHCN(M46}S&`+UH&FGM7zk87CWffW zJS*~;aL)9v*yAD!#jeleA_m3#R9e5Pd|V`uJd)?V&U`|okPO25{0)0ctw7^*hFwpbx@NhG!Nl*kLTQzr@o?bL~4syZF2^lRff zQ9?3}WThx2$t8JOl#vvXJR{0c?3n9C6^b2my{Mt8a;VZXtrxXBW%SkIS%!*$-NNPH>W2DbpY_P;5KTi!91i zLna=oo)`Hjw)fSdC{VRplu*@bYI(J&B6*A2StDvlzNAc}XhN|quNAE*c06lEJ5~J# zRr+rtuN9pnd%WrGE$c*Apy~zDLm6{)zaR!sY+vieaG+|vaHe=GW{&RlA_B!$y(pql z>8qlhGwrLfyBxB!#*JDuix`-!<1<~VqLnM(L4RR}FHi;CH6F}|-X%lHAQ>f}q zkwsDnqI-W!%tW!<;%$*jnR3YJ-=}?B6p=gwqW|_;yQm9Py(1bZqu*^+LGSN~wm{}x z(LtHFsO5J>Zy@uY=%>u*kXa7xyeEcH?Dl$JM4YYH(2n_i5rqH}3g_P+L zoaAB3d?AuZ)`Ps-51;;v6p}YV-T?VZq>+3K@(xI^$RPO!q!VPT$RZgg*(PR^?DdY< z&etNBBpyV!(UsnBAqy{qIiFC@;Qt#i1yg=rAQ9zj&A+rT$ z@x3SwWClbzWi~@b|LX66s70|O{6RDXs(uhnRJ9$d^dA0$XeIdK6G8M}ju;eOBo~nUEP6=hk^Cb1NbVu|pBNx{21Nh;lp!%hvWYUkiV>2pNPZI$ z=X!hZUm(4(8o!Guk^|p^tp_qJVn~h!`4Qv~5l3=1i2j?ce~JW>%R%%v%l;BcB*h@V zLe+?T9$dA^C@7H|d<`-&Z4K6pHOVLdKwkoc%iB_1L%YTNW~oWIW04 zG9l2;7?~7kXN*jtsuZZw`_CAeMv?)d*KiM+PBIfj?>~_;lO&&Htjs1UCfQTwkd%|` zCG$wCLG=C;B@0OELG->cP8N|gQ`O$GgruEhA6Z7y4Wh>!Eh|WV0MTRKS5}gYe%~AO z|H*2S14;IiwIrM*M%I&@MzX(bB$*DP$9#ZnCYcSQ$9$k{B`KwtfXj7Qlz_GD;zC7eaa%S2DY?@GqY zB+8g~CF5lZW!6L0ez5Z6Wi5$$S2AAKqu6yGFB?(dm;X1@?^MWk6uX8AvMW%PAbY4P z3#!ILUkS1|P<5mn2vi*@hp4I$s`SbqDMv`|1<|itj*^iVc<0qsG@hen9Ld`t`c*-q zOd#n4IRSc~AUVmto$&k*h${<8CV}X!!(yG@g13yNKhB-w@%a=w6h>A%C9Bs)lkLC%6zJw|qt?EeAW?*%zl zc9R?nqOaY@$v%?vKy+2I>?bLps^jG#$z4=+f*c`v8e}?DohT!wdwarbAbJa?$XJq( zNlucSPLm}h`hJU+(`0F&>U3F7nM$ad1AUz?Ye`-OxdEjU z#Xd7|hU}c_?PKN>x-(=iiXBh7>_>s;6QG@2p`CP@ILlkrKS|D%`6PRPq0eKGOY?(?@ zMeStDbdu*lHbCYaSw!*%wR5g4A^DW5&XZ*%KZEGrvt%R5*ecj-c4BGhNQS+`o0E%X}2OVl!kRiv4An8L||`uJbHe z5vZCatEkG{@t7s6163EvxZoynxn&;nwxv~<)&f;=ey^GYMgq(J0S%0E> zxokzTv$#Tb1gfr(T~xIVs`OLtSI8a|JDw|L+cp02Tq(Oy?0E8I4@$`S2ioa^ZILI3 zQEcy5$%uUawzx`0p@f`0KZfV)q3S9bgJOHXS`J?4@BM1&%+_LCzD7o&*zsH=V^BiQ zq0n+aw0w<>BT->VAUQ28oaBPAB$HefmQ<1jVM!;sD=e8L%fpgQ@_blwNH&HgkK}`} z6p-|VrHJJBu#}MO30Dtqre!3DhNXfeDJ)eaXN0AOWO`WYNUjY_14&6(nn>;sOAE=0 zu(Xk^4@(D0dsw_BN+ux&U!N)Ac+af5XsSD86nZ%z3{3c3iSR1Poab* ziX=BIF(fyHC5~iqSQ1Dc2@5A_2um`_#;~N4d>EE=l5fJ2NirOkY?8gY%`9?A{u7ow zl4HVBfZ`n&`t{*8vK+;}KFpUDBbcJgJXC*fCv`Ldfb=G9=n z?4`_$Q1u5^B@}x{u6Z?>FFA@ma`R;hiam1kWg1GzaX*Fkao_3Q%L19}WCdj=L1rJw zTqo;L?0I9h?7Z3Q-MmVfEqhUHUj?#%7a2qeIhR4pG0<{>Oe*o((d(n1Tb?6_Zuhr5 zM@HPC#cTO+sG2KNJ&BwL?J$r+nU1o3)Xh<&u$@9#xl@&HxlmT4gq#wnItHr-NbUjA zuh6cSg(2IQuDV_pqrhK%g3Lsyx?c98*wwgR@;m)wzFwxH*wvUX(^25N1JKT7XlK5x zrYbY{8)V&Le>*qGCKTIFk!(Q;Id9N-ie&T>ugbJjBnQghWERS* z`~8`PvJS^yj2$M zk}26GQ?*N`hBCjw7Q7Bt<5t;(Vz=OJk}vnq;x?H|VrE(@iyrf5N@W>|$=ojEpYUgH zmq{chbBAOTCWYm-XOi0F|*nPE3CZgEwUM7=Jyzl;>^*DS>O{P*irsc)5 z`YC_Qi)B5EZD)yWLP!#Q>zcAMTOW1jJk z=RTQ0V#a*GOsV&0?w1)PCQ~U3SNSuQvXsPR9*|wn`7;m5J`$5zDr=wjXO_xF6uUkT z%4QV!`~v2sUr|3OJ5cQURLSl@Rh8_es&c5(uc)hJKZ;$Ahh##dzxRh^GKm@CGU>eF z&n%PCBqsB)OkeNMJS?+O7Dujx-t~8Us$~wzdJz5eQMJq`c@soG6ZnWMB>5IZ|32*_ zvV>&Z=U(PfSw<2MqBD=mN>9R1IxUyglsOJEY7u;{DQihGK~hi}NUowxjcg*hg)%j= z)st|`kI8nFWzIv8SpxgmV>0(8J@*Hk$3QAU9+zd!o-~8(m6HVlwMx z>wo>3^|BMij^{<$jS_O^!+7+aw-;r^W?g0XsF!3kimiG{#-fCrGN{sbpI(yjB-J4L z?o+eOB5458``F8JCW>9LS0w+yKf+gJDv6oJt1|B+f96$LL}D^6vhNdrrbP~sn9OT3 z^HYE3HJO8A=e0rRp}^l{hcW9X*f+>x6uTN5Wm%wVqpYB+Poe4q*rpq0T_Dpc8z}QD zWOhKNRkoqn)p%X@f9@aQ>v9;yj_?iX^ymy+-{D%J+j&E#px6;^lIbY6YLm>Qsw1FE zZ;MSbo8&Z*AEBK#SwM0j$iE>0>(9I=n@CKiL$+=8XF6mTiOIY#JGS{V z@5>$%lliYK>GNm)D=Sd!s&1B5C~$8O=6)Eg&t};e$aKnP%B+Ws{?_D;W^MNef z;qU7MS&Cx&`cRgm!2LRCN57)}Q1+304w4AHe<)M>y>`qjK9afL`dj`;7Lu4um#qBG zpXrjdD0YwfST>;8@q8?sP~h)rLht(Xf{$ez$r$*YR=+;{M0SuI0-|5jZjl2dNg(>E zp-<%yNfu>3lQG}x@z}n4WE@J!DTK_^@LXw+%s{at?2*~KROL`rB~f6 zrvBic`xi2k#H`Pka^{cz%$G7B#g6bRS%~7j-#H$(#aFU)mrOZj>R>!+n5hqBdSxSJ zUWJUlBi$>TcgeKwBJEW50aWRy*n4F!id~;xIj~FB5LNAfD*f%nUO7VIz-LX9VT4;{ z)K7Zuww-M<7RAnen~X<+zjF;$=R(ysnS^53`D>X!=wHLHWig3a=RR5Wvp>@(>qt!I z8`=1aKl6=jMX}@AF56K;4ukRBnGa7f$-4jPs*p1aM6djI*@|N4wL^BG*micvE~;8W zRXgMW$x9$Jpq+j>Lb8K0-^!RFudldX_&fnJ-^m0NyBgoi%wPSp_+I9q*xm)FZ zhs0zCWzV1f%%B`Vv8(#C97eJ8`dK=E>8gF5uYk<(i*PMeIi8HV8)V@rTIzSI()URm z)rjJ~8oUqMaa8&!-EznoyVcvuj><=|GaaQ0DH9KwN1$qyDh*^tt8&Wd*O_`eqg4lr zojb^A-PhLeuP%&MJt(%X-Bce+$T<=ES^<6SrXnM}5l*2I?xxa6^lQjxArql;QEWTA zt9;5_OjWz9ViY@`F{*BN|9HlzCKTJw9;yY!yB4g2zV=Z4yJQ9_qxS@Tr0k&*$9Q9& z1HHcn5~(s!?7liyWuw@>#;P2u(tp9D4XVbfVv+|z-Ur!JmF`rf@0stVYEbMw^C;Cr zqK_T@4mwH|MC$R_XKA8T1K^BxX^iS8G3&g)8r;X9*Vls!S{{8)#L)9>e$^1vfALP&cM{h) z1QIjmBUIa={>%}oi^OEctHOAHX1ppTF_{Eab%Z~Ypz26W=1A2$-k&*A4U(A5Q7Ymn zf95C^Lt-*VtB#}nnWI$?iOD3Y@(KP-qN*k_nF*@d^=Bric9g~V7e7yhZQ-g;68#rH z&qV1VF?V2?>LW3CV3->8Bzy;ktKnV5VY+wk4ooJr%vB_c-GWjTN&g6?Dnqe*lu{Ka zA!iu&ggpx2&ZDX!iS2`Dx}fDGHAwB4xgVoij`g>EjOrjUnPXK*Wz1I3hlxO!c=jSv8QDOol4R^k*_u35m%} zQFZ6}GgDL(iXG2X)q-NL4pY?tiMcvVRZf;}$5x%KB2nNIaJo92tzt>c)!}T#y{hoB zlc|zP%(0WH(n!p)bB@X&F~`n1Dx1U{JLjq#5_9aFtMWYwA3Nu%LKJ)KoTo~5$&{hM zU$290@gZ!B^Hded!Qa61Q6O2W2E}gWX)5Y`|Ef+?aU^Et&sSO5{>=F*m&9Z)P!-et znF~}6iOFQEn3?`ewn{*;+u}mSQ9{l{8uNuJovKVb(^bwae>>Av0g7#BhAKjVzi0sM z=%ZkUDhp(0stU?1fXp^npP8yAkeQ|GDDyC6zK6^#HH>1{@FEp;see2dsW=id=8ILv zW&X^?Y9@-^ra3AP#m*u}6`;VoW9a=i=sic3P&=mOOVmKFzvWBR2#LvDs-my-XD(Io zBqnp2%Dl>-xlHAdm`twfy4s(~RedOS%$KVH6mJXe2~S{Ot|G4Ss!TgqsJMK8J6FIT zJM?F+ROQ$DGgqo=64Oqe%A4)a#XlpUabUw`BU&WD_%(be0zCUxV>LxLn>r{S`KXaWbMzMR#Y*mJ0 zXE9q792Iku?%lo{ouiUbwvOEs z-bF?JpfjnSgx`(MQR$R1??&gSOv)5N)!tZDPh#GU&QXmhb{2C~GYb4wP^gM6)qQnQ zm06!Ts(+z>edefP6x+^R3MUx!5!+WPNS0$j>V|kv6x!K?HJe5FV zdM{M*xA-%KDv88ou2<2w`7_t6coe$@=PQn4$2?ypqj;ap9t0~kUuBXU4`bH%$8Jzr zD0a+6s{M9YaDiotkpRs|&b4plNpi7G|0Tjv&45oqTYRYg_$7lS53)h()qM1O967Rartj^s+n zoDXuFYCy5ut5l`j?Vnev%0RL6x?N?VgdB6P@^)27qVHK<3@zWGN>S{XL#iUsPDoWz z)dCog{#+)c>PhYK2n60x|_1y2zELH;~CbL8hSNbzcROADm zm`u4ECNWQ1maE96{>)vfp~~ORU8)7e&i!uHj$+sFZq zKYU2FEcf^Rkm^9Ovsk9OP~hDbwX;n1 zQ}(kY+sKk=SiIjIrl(cPr#TTQQ0VV%#W(v75;V} zRfQ%y$i(>nFO2wnV-vWTX^q%mPN~J2(PMvCM^tV&@|LmO!xE)2Y_;fH9yf07q=s^955eedMl3qkSu|L%9bx>a3WU0q$hOt0nqKv6lq#{ICo%Xqjq zY(_c$#~RDa@qRd?-17oYi8XFUd03#tnf4jwRHd|Q+>G)Vta6D`+WO2Y zTbC#g`phbqQ%Z(Dv&zGafBkm-huqw6o~*Q`HAMpHsGsf}PJPH~5*_@U=1$yjLWjQ%+P$ zTc2~v&5Q?q&MCJso_!_O!y(pmqoB_@<;*~d`kYhFHy-qvUA8W(TWoeYdT!lfv&)Hr z5-m2n+)OEL4QH3z7!MlGE_X2=EH=Bm$S7zyyPO*+QN!8gEyja}=a#EnUf1y4^0=SZ zH9WVR87Q&7pIgpRN?XHo%S(+14bLs-84tdCZaMY}O$!arEhhv@)bQMLOXESq^U7_E zLYbad9z8F}Y1ifR%Hx#M*5|zPWaB}f^U5=f2Yt>f-7o6;oLBY+O4R4Pa)R-o&-vxY zjDkMrm%Ch9x7hjRL4gu2c7A!7Qra4xUrse1G(5jN#(2>1{Bn^|u-N(K?ST?Uap#v0 z28!zJ#|h_`PXx*|_apJ%XT*EYFP}|#=9KO#ue0o@6&~Lv%qd3)N|ZCF9BVvx36F0j z=9Clq@oZo`&k4^?auR7yIXh6IhCePZO=A7HoM*9y%lC(W!Q{u~vql*!l>ZRQ1*My> zrQ_}F^L1f)i%}T&URXYu@LW_rd$q=b=c2Orn!22e%cHNY^ITk>94ImGmy~A&$~5<8 z(Z{ELNjcMEq0c4d>DSfeTvGlZP@Z>-t<;E-?x^Us^7=u+H<- za<^aA)B0&S*(m7qv+{)B)OmhZo@EqxE-M$_Q0KXjNluk&19E-?x`KQAx6vCi}J za)D9cxuTqZQ=R9Ea*46gMb7gr} zpiFaziGBVqb@0maQj>$^tI9cls7t=8oM#kx=9jD7S?8Hwt{W&Zt*gr_P~`1$Nvr!Y z8GV*hjNhb8|$W@uJT!%XRPfv1I;GDBj1eD>n(0=q=Zkhdof2d|i1=phU}GU!EK& zF|F&%GXh2Slzv)Q`mQghn;djrSl;zuUGl>638TRCt8((gb)H|9hX#t?lIqv&eqA0N zDDjNpZ_0(rS z%h6BN<@~;!U=(;3mAgGz=UG%vHVQm9mfJj4=ee=m(O8lUKQIbBx0c8Kwa#;Ed4^HoxviY~w>r;lY}6n~e_ zUF9O9tSBvwf8*fp@)o0PEEHd+_mp=TWpAMzdyb5T%f&`H++y8VK5LZIgyQGE?k|@F zO7yx1$|GK^TjPQ9IHO>(Ka~glz0UKea;j0_d9a-9mKUGDyS;br!Sc{Ri8g$wJR(r0 zx${LIpNoge6O6LJC=ZusnH(fPQtnXHB|lQ`V-$EEEjMe`c^)ly36z-npUXW1WtzL& z()zRP!P8jCd8}Nww=UkDT2GauSE%zmRZcJpJd4Xkqv|}1%liT)>hpB@ zXrRc9hv;&^^>T+@xx^^z3FY1Ld!}6OHC|4P^=vshP^P&}CHw>Od$t@KDAC8BE9bqo zp89j;4Msu3=gWP@)OnsSrx*pECFKq)*Ljwd`xphD7s~mo)OlVg7X?bx`Ni_~K#4lP zSl(x`kmITcSF6i$)w4!{C#$B6t@C8n5rGn0lDs-5P-5zNbwZ%X_q$l@57L{aitJbypvX z?-_fl#es57?~$UfpDXCC#=pT!p6|ZWrfe1{F{i!NzWpfk110)KZ*|Lrx`w^ggMp%Q zygtLK)>_KLSKIJv8>9G~dVPjh&jw1IyBJ=rvUZ5ozK3CWHC`$0ueRaUy2is-+wiI~ z9`0cnUL9r>zS@RYQv>CJVc+I~yq z`E9ZjVY;XMzXfXv28tNq4CTX zeJ=T$tTk4PjOXGPGk1}+v?Hs#jEB8XD^w2}5BoP(s1_T~r6y-owFDlMGpg!c$6NJ* zVgGA+e@!(iP`=#z3(Na!s%6P7ne7$2U*_&EzVmuc}zHXI# zy|&uMcn%aEpRdu?F2*xYcznJ_SNj;xO_G-PgfZ1*<9SN-@h5G^R0kQ)^3SQASE>#( zo;NO0JFiq7Z9E$r&&t(t#`96*S-Cphc)nxhwMuoC@%+%rYn5uIQNAJd;z0SWTFo)a zxq^K@Q0A(fY;(zlKfkkD)w`}*^#;kQ&&6uhs6hF0@6{5+=VG;LtWw%FclByQpiJxi zo$&b6%Bxo!7-h=tP$nuR#QM=@o@bXpxyD`lHs>zgUfw9I_BD!sXXJ8`vqm*FQ1qRV z6GZwN)xtoDHFwSGW9w_JaakGEx`C{YM{s&1d-vt3&vM-jWXhKDEApsdEQXnXB2oQRI5y^^GvAL4V1Y5aILB`3UzR; zYBQs-hidI=8>6s?YVB$_qp*i+ooXMWu!m}$>SIc2d&|1jLH#I)1$L|}wIq=+W6u)oq5uvPKJrO7|7jLQ#+Pt3no2sdS68-1R)p3Cm z^?7r3a-hgg!YA~uhBsGd7-cP?tRT59tLcFf)2gaD@2IC$Rr3NRO5U(q5Gd2!J4Mb) zB4@+uzJzC^>QUqAl2uo~e`BL+iBZ_Uu~9W@%etN4Qn{__slTNf6(}*M6RWX-67`u_ zO$d}}&fnHMPV|{rZD5oSiH82|hPPH#5^GYmNk7V#{U|$_oKK4!e}B}ZYPUd%`b?_! z?HB7~7V8*^H9_>5R2>s2(asxJQ?{<>bmQs>qu_O$RQtTM&a+81#VGK+t=eUqI?vmx zeT@Ro+pFWYt@FISI>RXNY+60KeVu31YKc+c*{phE$2!kumD@=v@N8Zkv~!(j^J=P5 z;MteJjpiM5fG;Fi^Bqda7kt*Qw|>HdrIY+X$Zlvv8|tj4~#o{M)@ z8yJP0Zc`n!SDj~@YN}D-*|wUwcb#Y3>e4`o*4VC^7bw%*I--xa#&*^CeKZzwwyREm zUtP|2)eizC%Gth}9Vjy6YI3%(?y^|O*}l5y19dsuSMvkq%e@D^OXmE3DYr9J3!%J6 zd#fF)MS-GY_07eqJ5-Mh=)7|^^TTzXovTX&B}(3m>ug-|-0iq}WxzCM$?b>xnl_gA9=C8o7+H8xP9hWl0%ELQst(yB^geX!ariS@y1 z8;fv7-cjMWwI@u@(7|+M5GXf>%{o~bicMlu+l)OMCk`J!tDy98xE^>^AZ}WqzMS&76c5ro9 zphSxuTs;^l)7)1?vVYy?;OdD!JYMJjsN8{CznD)rq-q%joe!x#rj%iOeM(MT?kl&+ zR|gr-+(UH@@sR2;<3Ynis;PbC_;p619HeRSm2^mTf>EgNhgMS$uJasPonRDrK2=Tq zk2=q%suPR?&wp0)52^F~XSK*E@O-+u>(DySr>iH70?%R94WFs=99G?B6nH*UZS#dX z&u6MVjRMbStIdwB^L)12#VGI`UQPK*o#*iC2&2GrL^b`mI?oZ+oIr`5aAY+%P@*Rs zSb#zb-bp&gHTqKQPG#G zb&YbMP~ISvX;o#E6D`&;)ec7au~59^W2?!567&A$YKrkJ5}t`7=gZafK#9HHSE`dw zs9W_b)$~A#Rz0qo9Vk)qan(hEGR-|LlKt1qan)RtLwS9*+VaG@tBEJo zd5*8PF$z3itByFO&hxeEIHSOGLN)cYI?oB!2}XhE>(#u|>pWktZZHZwCss4RQRg|a zy3{D}oK)@mtvb(1)j>vq=j3X)GwM7iSCfqb&nea9Z`XNFsSY&?Jf~K3zEkHpwVG!X zcuuQMKC8}iTIF2kR=q-8`kw%g9$iSf(&`3SxbFnma%TtFzV>^cKk3m0m%AR^Hb3`x<_-wqvdT42@!u`1 z!!$g_JK4>rJ8G2lAEw7=EWKj`EZivpw%qqD{DoE)^lE~0jPHsXl$#X{N1u8=n(~*@ zBmS!(Pu78hJ&FeVME+}T@ph9PIxl)yxaEU=Tke)1r^`Kmxu<7t??oQU>ZH&|jVj#Z zruRmHUrt#Hl>0HK<8`h#=)dJ}l)qCxUs$koKDCRS7Y=$B?xUvf!0BXW zr~Y>BvHD)mPvNGTyur~kcZQWG@s73lry0Z_zg?5t*>1#psZjNAN=NQ`c--5$a5ED< zH9f+c;x8+@%rJ-a3-_x4TkhtXKC-TF;mX%CzOIB1eFiHpGr7d;1m&KVnqKe^oqm5! zjvbAl^rLINhVx!WKqKgIj&o6!m%aSYm|SgFqyc@|FnrR8=G^1Iw#mJWW5+&W&k{m{?+qV9LCb~y3t>1HnV-@5$F z)$zfnhdutUL)vMewm-5;YW{`&XrBj%N4wKbX}l&n?VN_o?j^Us_=O+me>T9DJ1xL2 zcW!{)Zb5)O?pA@mpGPkr&yU-DJm)l?a~jV%jptm9_hjIU_34EgURe8^xjJ8@*ZDJ7 z$0Hx@pN>mne)*33zwT#g{_qFry{l?DE*GH8Tp7N);cEt1xb*^Txiapqw!a zc;PNHI`V+2KF9^a*9ofMX0jtl^G81bu2AlnuIVASBU*of{9o6?84t)_vH|IYzxtql zFJ!t&`ZPP z_>cL>l&<{p9TfT%S>LgI($5?f@c#5;js6|WXB{ux1%WQ}GZy}k@ju=N_v0RL4?V7Y znR~|gvemUdgHsQN8GV%iGgrr@J{kR;#z#5T@xq;L^NYt{?fry$8tL%w5adL<>La%- z+^+rwpQaP}puhMBn|FFsbOhQj_&41y(V0b#?@iWxt2?2$q( z|IGXVd&G9MDLhRlm7C&UH+?+x<$jXk-|R#8;~ZV5$Q=C0`Cj0Yb#LQ8-*6p&6icPc zEKs{14-~Icc;9)pxgp({-U8DHeZBrZfBEmU{L!C!b(6)vU0~mIJB9o2XfO9(OHbP` z8ONBs`;Gok68@-#`}BN1lz-{ar}Ni7{3-4=A)V)q?*)UJUx_hR(kMva5Ibxoxc{Eos}J4l4gNl(>wJW~OdasTO$o5&ydUNA9R>eT`BY9} za$5c5G=+Qpy`D#k9$tTM5APS)b7}eWoSpK4eDa07CVh?y_KXHEnBZms{woZ@xp%N4(`hetZ?Gcavep)WnXD6gJQ=8#7_ewpP*q3q3==i8~m zJuJ}s9qm@%aPJ2L(S5x8mlDs1KPKVcFZ#;sk1O9Rk^bQHi~U1g&p7_;OYdus`N5vp zzi_KO?ep7mzcD-i!oEw@&Y9U8e()5=b!Cm$8TaMq?V6^8{gI=1%vYVBwb!}5-Ml=7 z{q?=u@~!b%A8)xwg+6LjmwVds-^AA%SBU)1d|sZ{qe%|oGlHGv{8NxyxHSTld6WP% zM>*7?>`62J&5e)orb5CqcZ-#y!brd0=n6a2o8)Y7>F;e&=Obl@ZUdcmm~dUck$#-(d0YG=8PW?|#y$`wxC4&BVDuFuEye#VEFnH337+9<+2G4p6?s2Z=8>{=XXkbB0q7sL%Lk9WPwAruW~L(|B2X z9FfXVKH2AF=`h|H9^%Wnu>dnS+VC|3?7x2dMhkzF@mB*tKQ8n8(Yzmx`cu7LZDIUC z@(CQQ-6fSLSbQ{)73*ZLR#?6CnAGkaaU4@hGcKp$(^B{7x-AbF%_2rwxog!^YuF^qY+TUgKZq z0bfrt_k`ituM>R6_^}h~|JV_n@a%OyUveVf%9C*5a0_24z|5^<_!fr4=f^Q#UzGG}3(7m4TX`~Co1?tlQh+~EOsyDtm$a)<{+U($Q25P3l4YX2#BUWfEW$6&{n z`*y&)+$_@zeueU$kL|C*ezf<{wf~S)lcAlJ`J3PeEq9s8^?Y(Wi~FU?M-K56FWTX( zGu~Mh7P1&0pZtqD}N)8?|))B_NDvrD00{bq5YVwn_eZ&TAy}J`It|k zy_5ZNwmyuUe-@msb}yvz3ecDMKGA{RfVKSf{YI)0LQD$@r#<2S|QzE1cxT+aW6 zdeP;M3h}$$DFOD_KKab{ZOTc$Fn%c7`>c_#P}a3Vyu#$P+>aA|hMF$<7)m_(3UgOU zx^gR>ogaH?`Cb-s7A`gao%Pal3f=8|U~lZA^-I@*{r9qlceVE?Fz&o_z;fxbeZJl8 z^CCmxmpcdD6T!~CE_;L8dt`va-I@Y@JByxrZX&kJs&|}cAYIxE;`#jec7CHo-qPqx zYyXk2{f_u+I2R)0li=6*tBfaXJ%jx(keI-fExsc&T!tCzg9;m(K7J2h4mD_6X?@rTsUs8Vi2VBnMhWK^6 z`|l^p`!k6iloRb0b|F3WqoVE4(2uh8(OcseR{kxg;axUvjo-UT=z-8Ub=(PJy``__n)&Uex{UNsJw8JU?Z$oA^lmwO{nBSDIhzO}Aq|BlXh$m;}2PuDAAxi!r*rSm5D&l7i*ahyW& zTbuVx=Qq&5X-Yx%;@W+gcES36|CJ?lqWAKBLdjORKyPXS~-g>xr;ao?|9 zj33y3z=8Pu`17iNQTzR)%UA1ntk<`h-6#)*xr46lW9+A)1JNJ3%-2&+?3cRN(g7bT zOzS=ArtsyR_vnBAIFiDPCG-tMmw$ZTtz$nt`?7TJjjLK zgtK2T^`F7w$VE?ZAo*o}4!P7n#x>Ma;sFUKzwa~q5zc&{@)fpj9NPinkuK|EX@AOn zR-99=<1%gw{cHdIOPcS@4GzjH1h!6C=kHHPUm*4!IDSl@_Np#FuKTmj{V}s65I>-O zWPHW>__W=HuIn0c{et^nC^zn>L2rd|eU$y^3L_nVQT^gMedzGlae1@A&RYT5_nw}E zB0QCky|I&y6XXSGv)8~l_ohU@>y+;%JCpukA$sDsDQurRG`}Msnt!>2)bfQr>UJ&K z;gnOIFP;~JJ~habdleJ8X*u|LN&mg&=Y#z?mh~}>pSA6cKchGLDIWDBybhz^G|}<% zU%jZ~=~GO9{QES^2atTCM;*r=!2bRWe`*itoywhbQ$EV44rBVHN4S1p%8M0Yen{pM zEuY}jSNQ06usilS$Kt_{KeDeT)icH6ua{4(PuPWgD;~>zV84mweu?P^WZaLwX?vvo zMP}#Bqy3ud>&tBy)AZ(>zVvGz@4KD~9XpbbzH-8Tk+AP`@aN;`aQq6r z73R*Zt?eD@I9q?29jq$AF zahw93`Nujg=M>D3sb30XyVcZhq_N2J%!?f>e z=KDzJ)e0$hy+5Y^y)fjP@}V97N9TwBVN>&mEv&rtT!*|RX!FpV(@D?mY-REK^7TFM zo91V$;K#8aQ9QQuX+N^F$=}uV!cO?Bo(GV3>nxn}0pQdJ_<_vR|D)h!%LnPDb^*se z)b~zw!hvag#%YIy^yMBfvr`j)C%T?zlyS{%zCDt=^iA$rCii;=FGwKk#L$^9)pjMe zZ^%`;-1}hdUYf6ZJjqwGkC66?{G|B6boqWYy$Mg#ZKC718XoUMg`f0k7qp-0e?Kby z1N~5w+)i?qRs5GLhx1`CH6P?t?~jOf#ZJgaPwWhQsp%rGQ+&R&&{N~}FIVINJIQU5 zL%vgpT>LGCFEzcF8t;|1zs~Q(^#t_%wbkD`p85^q?gwJ z!TQC^jlan9eTPBDNhuCp@A;Rv(*u9u9<#{e`~{u58T!0j9Y+&f55`YClGzXfv*-jpg(Yv#2(PeA9yD_ z;TPl=_-eNY`9xpxo8li!{Dkif`~o?jOZcE;XXK~;2p{42CwK~*>M?w(SMH86eFlfe zbqM7zEPl(KU~)*eDO~As{e9{EOYYQfVmjK-b-Dkx^k~=MQ+mthS-aZ#YvR*(1HNu| zc97fSF6|(HVF-`$ZmaRf{GpfX-7>w2N4rBlV?4^GN$<43Cmrmf`9iLog9-Yz8ttL! zp+q-jj3H4~KLMx7h4cr_23o>uP(hP+r0|oPL{hI>FyQ ztMd|SFS*w|;PNtJkXN|POfL3J>APFF{|@%=7wu~}=ft_!?f|26P92!)N58{715o+c z&mF%v>+xm(m!*@^(W_3EbKikq?hmo`rZgNJJ5g@vMSG@t$9WFsJD}69sl1pEAV5wiBu2DF>_}c{|4dy5P3f{ z!GE6Mzq(fSTV!J18lj;0b)OS!PUZ{f5O7k{F45s zYVk9d@?pQj6F%ajUus|IP4Zr#31_xSij+(4(b>4-kP4A6JMZysQkIzn;`eQi@Z^zWM6ZDUG7Gc z-&863-18U0wX#FFvt6CZ!&uVH!*vH?_{|8ap9n+e9%*+8+WOz%bE{WrP4E$CTK z`30)pnd3b{@Hbk%$iKqesh-hpbM2i%;$4d#q5sMp{UY}9<>T9jUj^85HwM_{?g_Bl zJt@%ZtL2zN8CRQJKY#4oMefI(Z+dWlHu!TUFZKUF1pCN6w_%;T%ly9ET^#5=Zf1bJ z?#cj%xjzLs-2FDd5$*br`ehT2U#b0aE7!uxwdGzkJ7CAxUZ;Mg?@r2l73+Ju@UEEL zBW(3{wLtH7>jl{3-Wp)9+d05t?jr#XcX$8Q%NyaI4RAU4=Kz;)-z!Oa3Ul{qOTQ^U zuM{0Sy;S+sfBbuC_V)LbVsGFVg1uy2Bf!kz|Ae1m^i{*Vm$^Ir25;BG%?hyPcn|a1 zU_ZI{&+K@f$<_K%I1SI-CD4s;fyuwopoVAe4#SbVr=3#;f5gJshpqKe=Gn%3ziC-} z(B(ezYp<`=Gvnuen(htMzqH+G8DHj<9@`U*-*RgP{`k%)?G51@TDY$B$m_@^e;1=G zzr0r)>XY=xMrWM^sgKIrp427QQ^LCbo>FxxJhB&z$fD) zi%+}5cL|X1lRLuw!0{c`+pT=GACP;~YUL&6ZgLL{{Z8h-5yEqOx3y@uFVN>(eA>0S z7N2l^@3nC7DV{my&)VsOA8GvrICAv964ICZ5^8$Od~v`FyDurWL-1)nbN5Trk9_|w z;L#3syEMzw^-{Sv$kKgHxDT#>x|&{;e}|=~?PTGu2=y~_e>OVyQaj2$(V;$fweNw# zKb4Pq9{rtqPdU73a+RJr`o-nnr1c8F1C9>#%#9B)cUqt2KE+TUGPhO(y@@|Y+4me^;jRo&-mwj^%RLlex0@MY zkNHinbD@15)~+|m(Q+-^r$czl_`4eUXh%O6_`57#x5eve$0MKATk;EC^)A}{zYOx? z{u=btexz_Gm_1cb>VurK5A>KW{f^cf{5?XoWA4Bp+0BsoZqTnDBh=i4RTs;%$t4v>~gOQFf$y!Sl_p@ za|qJ|lzmZwzi^vcJoZ(y-+DWvqbK=D^QZkr?so1VXN-++X?L_8Yq>o`Jn7d1>~;qR z*yD~2u-AP#z|8C%%e|AmQ$5kYsb2oG>8DygzaJpq^SrYT%-ws;FZdn+r{4eA@F&{i z^+P=Rnb<$p>2fc*$p@|@??Cx+0rFCOQWAb>z%vI#j=qOQ`tf}%wKMmr%X>YcpNil8 zXPUixY=1uG0^hk-Ezb^DuXZ@R&aJ3VGU2wjBLm>K}i%{4%~t z$1U29bh~xKy}&(gSb)9u9Wl&364D>;UTgOT)9x^yQGNM-&76*hWL+ou4pD#Tvhj0w z`}_4<&ue+9oWkmD%l$2++vS$8e7(-x+e7-f+dja^r}4Vn^Ot)$gXfzvNO^i+a_4jz zw`zM4zt7NX^^gzbWR?%+d2b1@aGRT*Xh-4K@1DY4ccV|I zW%awu?HKsG9sc~a5H9Ci!go?$8mv<=lL#^cgxIg z^gE6ASnh?l?_9<)qz}}2D|vqqAI(qUl%Mt~&aY{_%);Y5md;x> z(<#?f59Xhk-%rDlTenZ2&Sc})`>!%rhq?Qt$=7~_c18Bjhx#S^ ze9WF2FL$3cdB+$``LHK+@(HeXm3hEW|N5sxzL2B+x!gD3AwBc~YW&zvAP>azkV0w?e7l0r-1i|_>@;1NAf-K zxP`x9=@3t0oFA;ykrScjmvRB}-T2SKWuAW{U;pAf>q-HS?b;gx-tDRYdu%)?{aC=` zyf^-*@tf%%w0L~)rgr&{5H9_{&5twg{Jham39xWa+PI8*e_5D^m-lfjT=_EhLyMQv zbv-<9-}eEo>wt0I;HM@}*9%+j%7Ayd8v@L1T|LU-`;+kj?IQI;$77lKWA0c7&~_r? ze5X=Ae>6RGoZ50vm>xZE@#WX;#s}ErCIuMFb!hQ=-Md5lVQz}aIocrkV0?Cp(Wz(D zOMMq6zHjn<@tz*L%+W_?~-t z;7f7ZRUmvRBp#4(a3J)$KAF4H^06Sm!YvB0iQaO0&s^NsKz{4{ZT@}s_1t0h(|tmP zd(7+y{qJU1=o4?%@yV!(Iu2RM;8=rc_*TZR?GO8j;ygl~F6+o9hxQ7%vC(-Sd-K1m z9_$xopT0tQ7sL4VeeBF_ZTR*E@%vXROz%U~^{mYNm-kNMx)|$6$``}ya+>z@zH;>4 zg1vM1z5oliUx0C3eTbFE()ltsaCoGv+|(Y0trxcJdovC1g!hlHddT;2IDa0;Np)QI zSy{fm6#PGTC)e=IDShw|zt{dR%EO=82lg#XNAb8n3_APIf%SSL`zP#tQzwXD!I$Fr zBQOn5arl799V(7Y2Fq z-D+~#?@PORwfWzT)(&^VZ!>uhnYH)(u+pm{9;6;rB(p&ZDB@0*?%m|XJ7Ix6_T>o`*VE_YLG{U1Ms zuJ6KgPbKeA#PtIBE*JayeY(h@Jye*t*Oe((AnPvpXA0q4RQ6rqVOmZT(B%ddN6?oz|kc;E{f(y6B>=L18!(axj`JnnDW9utrAHorCb@M-^& zyIYNZUx0c)s$YM6v=804TYYigZavi}+~azmQ#?P8Jmy`SaFtWE=V#&LekjG8^Gkk! z_}z=9A9P?}`Ds3VK3=JOVxQC=P5IRQOfqj^^wMg&S>j@&`=gZ}S`P7qVWR z$WeMsr_R@MTLk_tw}-_$z##o7`VjB%5Z-qE4&!s)J`wIK&=k467oKyZESUR%;l=U0)U+|w;xat%2ARhYR zzgL+Y{DJiJ-kf^PjA${fmY(zQaz;8-n|AZ%=2}|*#eFB2m_60c`i~o^hm3oh_>iAM+9m4QWmb;&Tf4-49txx1K_}k2 zL2ueU8PA6EbA@}G(XR<|^EOUA!oe3>e(QMAUUxtb<%@LIeTNEDd)yxOd$BJ--cz^v z4(!W%%vFRL-tDx0WrpWY{VDEac-s6ldz z<$`>9U)=Tqs@^TrFP?{B{wB?z<|Cf(fRBBC*nxe&1Me@4{t7>GbzgFq(|yX_t_bsQ zJ+`m0*VdDV_1mwQ%F%dno+8c1lpr_mb5=dO+xuSOSH7Zso*p}{Xm(uP$_x6x>pYU$ zKX(n7PPpz{$lW}z&WQL)6@G5vJl_PSN$?~m+^zEJlUUb{y@GKTRNTSt+%WGeffNPs|nrf=k4rq z!u|N5FHSi8KL0-aEfznmA1U6~4@l3a&{Th!&&BTtjvx2u>OQ5cZ9gq1S>F~t{dYa( zfW4JYy~^FLmJc0QMt}Zruv`3I!VdUFlOHts%TWCy^#hMb`^9>w{t*3$a%}RGPX3^J zMt^LQgFQ$u^&83$`+~nxQ0Gx8zv$Pg-ySeXzpeYR)N_lM`s1`f&)uwNrFf)1)$zi8 zC4|d6)Jgoh{LJnPisNy$Q=YV|GLKY~6LHF6U?}@PlXyREz<(ihKQHIo7oVSN5}bJ4 z=X{;XN%NE9YPY<7o`m+6eh@t6OL6L5-+2kIC-j?4AMQH>*6%%v`{}sXC@ojgrQJaO zok4!#9=CK-e}*=S1iS`1M%IaYJY{%uSW!W#GCkh`o5heU+BX%kynqGIrgElK2Cmg-)8PMH9KKv#>eFM z-*udf9R>@TSD_yqY`m0@_qy?C%7yRTT|;@rb0M6oBAoKA{%bs=nC$j9NKF z{VBIJpD8}Qrhn`Qm?xf{$iF<`vhJGDA2xdTW<}^H$?xg`&)voe{ar@?L_#Os&o$6b zPUz@!WM+mpZaTjzxsT$3x0zCrF@hl{@w}SVRbG4WhIAuZQ1|D{^cu7 zfA-bs`Q3QWt;Wl3J}};M&Hh8e2a9uWF86VOH$l!}Fkef1jh(T(&Tq=OJ-a{UI?EUM z?Fp{og@cZ~v|b~h^3r=&GP^G;vwK&#KdV2U%DdItb1jN^-|H~$%W9%yFZw&)J>J^#Q@`Ir&SQpq`{KMxCwy14gU;h~?mKfswdaRSAK-z8 zr|Y%Tj86UiMh(xMh8OO<7qlET9D3%agmRAetLuI3{c-y1ZwL9Zzs};3F8d-$k9kJu zq+iDi(~t3c=Kja@SBRd4jqkH?e$0P2`gHs{E9tPW7yE3riuxzt>v}(?+w+NpQWd zv~bY%zWc0wUyal%8 zdha#*K?bqoRKt%AFt_(p3inN;f6w401{WCLt%g5f@UI3(yhFX)$L7rWKR7so--gF?lI8z zrEniIInY00IQ#!~zii=r`|9`WtU2I$hQi$&=+O_34szt&P=NBzQ`q0sGQO-0|J(TR z59Fhd`k}PvrWfu0PYl1xV9KB7YeC>E9QlJEKJJTa&jZmU2CS#JVg&B9q{)A48F);4;5JX$z?M;pu%1_(KY3h5Y2sJ*am3so{)s z!58e+y|t5nPYzl`2yGU zVmSBWZA)#Z8CMaX@m3v=`;+uuJ>ti4(NO8>`7qTdcih{zPbd$$AKdJ|f578+ z0(Mot!uVQF`Qkle@HNSK&qKc4Wxq&(@jK<%2Kq|DZn--mgs1iuo0^`T^l0K^T)C!| z5BIpUuakPL^{lXa<~dI(_f*(8j&qmk_*=vKkE1DXAad|O(jV;jnenzihvdiS8(DtT zKe5~3A@?%_kwbk4YJO!sER2KYeGk@?!gwUwXR!I89Y~?tDSrPFj(x#X*ePB3u^;%$ zh3R@tDv$E^`SRtpt(6zwxA+B+aRPFDpX2KhIQ35bynnm-o`-$Ci*)W$)qYgY``Wn~ z#pS&k(`R6M%k3A!yWEjO;*))A#?Su888ZLw`zQPfx_$>2?tg^epVwrZO}LNezdyN$ zhwpA(SCaegYTspXyvuhmd^&E3-{rXU3q$`P=dA+d{+l>nV*Iuw z$SvH+t$e>1zxUNYyB+Oq%CF;y*ssIaBk!GgpI4YW?xU{fKaOh#rVoA|N#i50Q@s9s z_41DPVIE?YM>IbQ<^JVhr@~D#du<(Hm)kSIZr2L@J??`6?{!lG%pCFGesx_Q^96)6 zjt1vD2Auu|{HR3!@d^Ij8#O&&4}A^BKe+Esx((`Mw~*HN0?3r^`EKNxT~p962dn@xuLa zsr;?RaMg?S3$FZ*sFn6yDQ0^@>`unUM*~;keHag|R zxkrV$^Xd3{UB?Tzuf>C(_w2Yw$=koLetqe_pCi2#s(v!AxA_vJ zOi$Kn@TVh}~KF#cz z?r$Rg86jNugLUBJeYv^D_v;S)X?k~BIy(O%@5BYX<(>>s?%6bX&#mF>k?dCu?Q!O~ zpFrn-QyZxU9zGwC{|QJB{O6w_+ZM@gH)a zGd^P+2%px=IG!VX#bCGGt!egCoO}9!xnup0^)2>GX!*tYxzx|#r`|H&W?i)&9{0y| zl0&#cxnI`&1Ui09dqn!sCtAMQPnY7zX_6Z>PvYyl8L|!-*7szer_IN1W$A*me}HpropAIA-n7Jz zE9G2efVsOPK)Ju#=ImZ}dvkA*9ryf zDO3LFCn}$Dex$>XybDcF+EdyW(jP3&ewzcvXurn2e{)T~?r&-K3(`yB^$m7JFUnQR zJ>K6^r^kLmiS`U>aZMQ!SkLIh0S{O$hH6$bOTCa7{mV*FW$5n{(9h{rIOW zp6>_!IsoT#{rpL&M+u$&vMF8Wf!LqKxL)})$2gjOjC|MWI6U4n+eBY}8`Vo8c9Qxo zdiorwUE_CiT8=}-xfgce`vbX$Fy13rzo#(nKcv2C`nh|#`xKW|KI``ZOFLusg|7Q; zS`xdw@teXq4*`FQPc^%0yO=rf!KRUV+gww9k&LIEg!lv{zUD>~VukSx(9eqRXUk00ADtEB) zmK9%`zP?iz&)aj}YgwiDYL$Z@VGr(`(Q$NquP4PB*E8=8uHVz~odD+b30MBY9b@$! zy2k5IPvajK&Z`t|3p=+$eE4+#7W;^0|6my3WbSlp7uYw^ssGb)7wbhW_e0Z{@f-c) zk4_&I!O{8tN(e(0<3!RPiqR2(0td`UUu$`MRE&IfZfkQQtX9*Z(;8)|t*cA?M*}H_%7lbCG%7(4Q6V zPgXzD{Odfk><6%L;&YBj{XTwAb#3eW$K0(DV5B2wlXdF-C-hYlex2XT-CwO892ve( zdDlJe3%ci7-!JEG;a@$B`>t*dc$d39z;3rjkl*9(4tTtuh40m6C1>ks6z>_Uw>l3I@1y#>`SFP+hkaS#%l}2| zCGTWvJuDpbPJI89$Ok8%KeF(#A)U_oz1Z};IzZVsYVn)qy>(v^@2kgiY0!1vfOnMQ zx$8Pz&M$`k6h83SzWmAb0RHevZ?`yql={gNmX8-KAJ^Equo2s7f2{9o7H-9W$9{RN zh3mc5g)0Njy=jq;^teY|<;pyXt<&hdaPCx38CM5=o15ACb?*Kg&NasOMRi@fGab1pKXlcD@`?K)sXsHH zQokpkgN1tEdF~Dg`6?XeGD+_{K`!};`>K~!IP;8@hvp-9f3S2P4zT5(3y^oXyW8vg z|d=sziU@<+baUkZ0@Qm*U^_;M&uc|W37uF>yUFV^~8xKjdO|8@`kxZfT7kq+Tn zKe!LFfBhi813~Y{$VVRcz=Ny3xpy9a%G_Z6N87!q7j~um(Cb@fPla;6%lu2{p=0`k z#jzLug59X^T7HF_-B6DDz7g*pMX2>PcXu_EFZb#5{)46;%OAbaXRf8Mdhs4)-0z(7 zK+ygDxX_8an}a^$_k&<$-kx-_d7pe`FJM4xK9}VRA2pmly_9^T^Rj-Y}xl?Y}bfCRDSHC<&xPtP%KaN z+h%-z_@1FXh;~OVcGmBn+)>Vtg?RnTk@D`u$G#zz(_C(ya)z#gaPt9zZEuO8;~eD!d*MF=0^^jzg~?p*<2-n}=#k#2H; zE7<)>queJ0{u*~wfGfJM1^8O`?Epu+9|kza{Vc$EKiBn!GcKnd)bXPI{wwWYQ~9xf z4Zl?X>+k3ArR6`^a>ZX>X@2tgK)9Df_G4PRrR`V$_NUFCv~!xzI6wBa8@1i!JL|RK zyN!90cy1j!`zn5K<(1+G+I$=G^xndjJ3P?)>q$SQ;r-hW)sKBIv0e<^4x=~UU!D2y zuzYBH9{KM!`jZC1wVdS))DHUH#JXmRV}G?K8FjRj0pL(A5x3qsLo%PC; z-Xw?mk@71Z`y)L+i2YeVjQ!A1(@o{4?b|DzUXwlQ`|UWV3yk}RI8Qml_C^1r_5Ww5 z*A?oAoL3F)PaJP(`xC!I@zYM@$`!*qRxe*pY8TZr&a+Sto5q>w+Z0}p-+vs6UGT4= zjzfw6uQHA!pIZM5_uAkWEt|)e`|-_B-fHbB{XYHaV8=h$h4Se%-lUw;eqZU$<%V7Z z_dl^+XI!wK`7LsHvwYHTpvSi1JbCQ@=oj!$<%|7D+K=yTc2xiFufKkm#`am?HQ-!- z{2r#g*ZEz&=fj_)RQ@h|w;;~nr2I|qB`lqf^WnLr)2vrr@0cI$FJ685=AMSS-p%&r z9AYPX5nh+u*&g^I^8t(_UM&#)s27YoUoHBjdT`F<<5sT^4X|(*+IfMrziGm$?|VL{ z<8kFH+y?@lxjMbSpEt>+9r{OyW2dHcb-g~ecj(DJR}Jr<i-tyj#mGJiAl`}U4C zdCZFrT(6qz>tNeEJxA8ujt;h+sMq)YdNqY(SIuAH4i5VzGK2lsx4#v_c(pQLbS z20vYP-yg_Vxp5wfeyZtvfbnRj@N^v7ZRgL(AMO7PtAC8=7+*JiM_@1FGfv|Bn(%u5 z-VX*P> zi_}isyLfYum%9f{F5eY=2Q;lOP+r{Uq5QGD{+h_^^qqn{(jP28_UYMC=jYWfas0{t z5XN(qUuuuR+7mwA$1Lwc*!-vZL;vqC_?!G?1=E{$8GWH2Y4`K7{;<07>$om=Db76+ z(19tx%H9O?<)H$H?FU{3>-h|PkTiF zM0xA@I31_O`RA0cX`Dp+k@CMT>|^Oau3A?7x__cs{&rzKM(!gCdc^ro>WAtp-vhR< zK-=jqr}OsR_C4Lxey>l%4tV9;>aT$T;EfVzg!6?9{0kXZu`iZ zdKqA>Kb^vNd{Mu{ zb)QDz_6qvO@2yVZw7+}@cY+@_d+53I!hO=x^Y2Z2Kct=J94a{b&9(}BabFqd*SQBK z#nI=}mhQ9wW!!A(>i(_F_Hl7OHA2Rdoa0Ac6CAAG?8o9hnK~}-(VIQeeK_EICU$^+ zP(p9A8~o>(J+QNucjhSf%aU;7VGr=vTe=&X-c9y_PI{czz0l%c9$?FXzi*{fy#AMYK8k8+}XQo7cQ z=JreLNB?m4>!xziOZ}j~UTJ%SK3cx99;sdtC!G4P^-SJrv+_(~>M!85`*((T{qt4V zKc=73(PytPuMp2u>VC79dpOANa(^@ZR@h1R1&j?ab4~H|U69NvKlcele%-f9c`6K$)S@36``yT6Z~{-Lyd!jB#FyRdLteyWe(cl$Qu2g1Ki zpcihB09#fLUF~u}zUoQ-@YlM2zTF#0Z@<2V-sF?^t_f=Y8^6E!e$#p!_m!sgi*`cm zN6Tsbi0w&JeB=*xT+^g~N~gcmcA~KRI9qOVuzQy~*vcnuS5h4PQaa-m=Fg}H*!##J zU&fi14(%QA6rua`1@L2kaE0-_$5|$ae0A!_2g^tQrsII3Jq|#hG~bdfnq4zdQ2)$>tQ_C$M-Ac0_48F^d7*$-rv`Wk91yX*y;Z6ru2Q= z;`cujPJK=7v3|k_zs8U4Nm@U_S)We*igB;PSWlYj2l56Bo8-RSaVUPz_=NT`9q;0o zoFm}8iLOJ$@k3L5*1NP{kK^=dRvsE2>F`rNj0dO>=snoN+^{8Nl3Wdl}c0;8(hw3$b@fh~HG7 zhDvAtP~R6S++CLMzXg~(&hKp(=1nr&mm~KAoBeg(Caw>s_`vJ_(VjZaj_;H8?yTcT z)<>APW1WL>Ciqwzmx52c)%QQ#BLd8A|9OABQ@b-Z=##s(Os}`rVD5GZc;T>*>Wd!~ zZnE)zB0xERW;p3$AL=*fqrYHsPc(kUp{#4_J$&(dhIUE$3S0k-;b)l~_&AqGy3iRH zF^{kFcJVxZ)4V)#@TX4e+nvI7p0NLV0qLMuCpk^w>PO7ycHRepeP|CA#`cDCzsSl> z>r=~JW_G8%xo3p){MT5x!ra~$ka13+=kAsyT=95b7(UvCIv)9^+@ba29+Rgq?o+Pg z^6vbAe9&9&84JgMX&0HdT~_;jSwHQxZr&+e+od>fOnEh}my@5t`q^Op6~32SkLcgh z_BO>?&u!X2tNii&kbW1lju7nyz0-O*c5SkE(>g5j(|FK3r90UD1A~<}SU&tS)f>AH zb{(C1#JVZ>8(sWMUvCTd_b~6&a(@bVms_FBkMq0TssZ-2?~6olo!2OgPu^Dze5{Yl ze14D<`>6}VxyhEzyTBLyLivXtk9?{8!tE3EXikTAte##>cS+LjAooaZRR*7B|8C+B{WaHYrfqBK8h@0QIY#eLDVA1{?(YUB=(t=Eo1{hnJ2Q?roMY{3wOU+1>6DCqH_BkgRuFJ<(w$%jp^HAdhl=nsh%-q2AR*3J*Z0X@$?RTu3_%;aXbmn_| z2YocW%k=8*m@fR9e&km>gj#)f#t}&Y9fdD1KX#QeLIDB zwrgsCug~E9qvf!p_a{HTS-L+({=wNjb1U0^*4@|k^6R*7f8JyE zzaS@f2bsKA8gKHWE9~4UP`}S|_ZibG#gT&_;a|MplD-dA&sWiY=Y{ww|5wZ|Ck@gr z+&{fWxW8NWd)_O>CgoPA$8vmlo)0e^<@+s52YrBQk67QJ(@rYP-S;fMwu6fMbwVHR z{rX%9_wPVn5n#(*7hqS2H)>S3yWQds*6*0#+UgpgkKA4NcJ)*AqkI(R?h%vkao=9> z4p854@7K_g&-};PVf>r9znL6`x$8vt_UL2>Ury+)FxC%n(rKz+gg4bU-m`MMs+|-@ z{YfAHg+KL6(x;r7{0P6HUmPlYD%_`t-^u(|(7WYUH~rIhv>5NOZn*rgo5+)>@W6-8*-gH!s}LB70O9ri8AeWC`L2TS2DrVns#uy5{uV0Ok2>34R0 zz1pAsd+)aRslE3br+f;V?R}?}EALbg5BaY&)OwXU^2NQ@GeSQl?=sl^w-wn&$6*m6~+;L5{7yQTpQa*cI`A!M2a7S3WsULtpZ{;}I&V2%* zqYqH+kh`Vh(O&SQe~Q!3lP-QvzQI%YTf65q^;i4>dBEe$4&bDVT=dfY0`WaerSraI zgwTPjj`!sw_t^&6|DJB-<1ckw?(Z}Gn%a5vOde~T7F5sP}zH~o+LT{zVd#aJc zyBxsNR#LfNGXIATMmv<4u`5GYad&zpBz3;YHfSDuRPOxu2mX<%?KKOUN$$uxg z4~F+GoAtn6*d56H$`N5-4DZaQFt>9G&~vBf7-aueDEAmX%ltrL?k)~^;eHdK%nw^Q z`B6X0+wCoW_4mM+yJ7EE|JHgU=eCk}Jk#}LeW$a3Kd$!{$~zAxkMRWUPAd1KZ&ZI_ zUZ;-B8hmJ<<-Sm}JLQBt>aFfi%G@byX+D6|2O#`F-kVP0s-}NRM{Wwq_qZhAX?`EI zeja<)@#g&ES7|$z;*1-xJCOY9K2SLav%cC1dJ`o6*R4JS-(>m3kC=bN->@6~#y<+8 z?@-gb_Bw4ZUuyhL@dyW^A9lRg>`VQlJQ$~<9}vFM$^rWWdB*`h?o)?O`aseFrtzqs zlq-7h9v5Y!`~6Z#z50;Fr=7!p z@DnZn+)@7M#ry-~9_UT{gtLzlJcalp5PNij)Qcv*y>HU?un9KBgHF8%2VzIsBm9Bz z%`IJU`0=~JLiFCx$_shR3R3>)hg|54`>=zSd+w%NJ4n674#dZgfaLdJ%LkBfAmbY# z=>zdQ^hHk~d_d^L1EOb&L#Lf4-_X$unD#@|L->K{fgR{K$T#WGzNQd4q)RyTCfLMB zdrduTiVq#Wi{GsM9uU2Oqz6vE(Hk5HAMv0+XZ-{?kp1xBgN2&T;J+K1#-B~;VV|Fb z_W&~2ghL0aKjiLEs~7kq_P{>0i+`P~?OBSW*Wo4y`9sY&<8vVW3vkD_|MqPiwFv@_>|Y3h5V8I8^^u|B!uV*8b4Xp=SzHKc8v&z|W}HslG$ii}qOG8_w+A z;ml#jCdhpGIi?r(r=7v?!BdFdDIfZz5WZ9&(q(*?e(w-YyW0t-<&1wopJ?j{=#P9L zwex|%XxT&_A4;x&4GsWL!@aGnv zctG+2jvOF#Aao$mC)?2etV3sCuDxzYdsG1w({?|InkS-2<7PUMGv7>J%g=-3Y& zf22MEhwY|zC4N&n$YDP(cI`wbJmp6}An5|}2lNJ_Cy??7r+y6U%=S=!Ix zKZhsdHRg|?BPWH}38;GH?&Di~e=M9||M2T?lh;%KT;KHX#Hagvb9aB3SCsQjAzsTp zzLm=96n}F|N5`4+4&bk~yr2mhTxxd8FUCP+PKf;(EiD2FCF zj6<4W8gHoiO5gU)2i2m?Vk6tQV*7EQ>?2*s1Sd6W<30UbT5@6ahf9q;DuA@dU;e7E=b^MY}{NZ(K89p22P^RTJ?k)wVcd`~Nk^Ob~Czkoy4pK`!&kefpKi%#$WD}RM@?}L>KFqO+ZSxUzr zfN6LWp6bVaKG2ERNiOveKI{XIoF)h#^&cF5a3JNt_ZIN8W=|mT2Mg(!kWaiO|KHyB zaiN#?|8ZVZ-+z<)V&Cb5b%LY=A9xdl4+tOg^x(W#spp*I zdqjHfFPS-%#n)XJAu3r#-wr=^xVc()l^$rjYl9s8^|+6z^oWCjC0e$DY7c zPjLE$PV&$@^&j*jev=(Z2RThJmEXiSSa~Ozf2H*RyEMs14`34?biP->fzW}Bcc?c& z_`!jvnf}CsuM?y_?*y?+IzIYHShvsJH!Xe2nRHVedRqSQrSx>XrT4q{A6F3{`RGeO z0sc}Uaws3l8%VlMFtu9~-%#m4GP|eon%ZOd7!QJ{?G|+A1Df*5_Za*y6~5egO5&$} z+@wz@zE1Us@3SWP_=&>2z3-a)1lX6_6d!sg{&O43pZGtvaN2R`)C1`MYw`)c<`5Rd(eY5&0Zo_-ELBi_q}jJH!bSh?IsqW72e zZ%3);K=f~dP3aP!aIH^+pZ6s_>_61=qbWc70IA>LKtD;BSj-xyi3c#Z3JuX7{a1o>}Ww}H^!;tq9_zrFiN zzPr7U048?(Y5a8(!@0R+FE{x6F2z@ZBZ+ z2=}F~&$&_gRJTh0MK?A-%8k#zB)`+#>sr$V|Grx;|AF8?l(c^)>HJLMU*?|4E_2Vx z@6PVa1ixJH%LTt&@XG`K@z&+;6Y~3rgne9o2e*Fip6mI!#Q(X3|J>!hSGeKw8!5jP z<#%v?h5L5v3U`Y9zT3LmeYWRnk#)7uuaR?Z{k_);ex3Vh?{%&#zs`N6 zb)DN^{@*cw*v%~-b_BM;7|cYi9|t?RSd zo?VA$5B40FZPIMZJ-1}<>b^DGx98Suvi#oFeOtDB z_aC#x-FIb2^xQ4Kd$YrOp3F`i{nu>QG0%%mFJ>Pd)05verZ>N5%&`1{F~jqR$BfAD z9J8GKmKS_v{@9om@_l+o<@@%&HlN%(CO@=yT)y2(Z^%E^J0V|b<+byV%5VRb*ULY- z^7{FyE59YbZRL&g$5!4nfBh<(=4-FAMgGQB-jTm~m3QTLuJZ1DlVQ8(pImj1{EMr; zCqH%7J@a3$x>r7b_&)g<@%riAAI>Ka`>_1~$^49Ahsf_!`RT)s%@+(mR%plO`^x|G z14{?T#g<}-(%E3|WkHb?j` zkl#g;)+PC8$NeP#+_+2gFUs#r<9?cddEDIm_;J6;uN!w|{_AnqPr>^na{LD3epWoMWQ~td*Z_a0|d24?5nz!XYTl0@X zyC>gh{Jr_4@%QC#AAf(owfwdl|3JRe_&?>lj(<2`cf`XY@6mjZ@sH*2AOCc|#fs15 z-6LMiR~a>?7$rwr=PdX7VvJj>cvts2g0Cn4zqz<*xk`Rp2);w{;Bq?)+`kw*>HztD zLVlkwCJ+0(@O@3_C&=&X@;gy}-xk`L#nB_r6gXXe-;>|><@W>m{ZM{0Ft>sMZ*_Vr&1kN4G|g8q*pzY9;xtEWcIcx2pVB3%}(?tuAn^{Km;|4f(Ap zzwz>$Ao15}tum@?ja+BL*8bx*Y<+UvMy(Hxo7C#cC$&D(n$%ipok^|L*4elgt zX%$XrJ)`wwtu@v?qxJfAXSd#5%ocohYghSyjGHYy=LzjRp`9nR^MrPu(9Un& z*?qpy&Tri&aEv=&Xcx48*L{Kfe}VjeVe1+BJtx0AyDt>Ji~k>SZvx#{RqkQ`6VjB@ zFci|t5Qaif3So{wF`(3dfI+APuo8hvP{9C&8-_|ykT6t&Pz)#%!AiVZjR+WqLPWqQ zpix94+TL7c2%}Lc1hg37d!GFF+w8@yUq4-Z%eCCAk3Zi1?st!8pL6#Agnw@z|91ud zPA}Y!%^hfWpxuFwJJ9YxyA$nBv^&x6M7tC1uCixJ??St)>@TG0g}cy}mF-fx3~gE2 zj-=^@WoY-1_a3x+$a@dkJ!pMseQ14XeQ14XKScW>+7Howi1tIYd(rMiyBF{KD7JL?nApD?S8cT(e6jPAMF9O2hbisdjRbLw8zR8ls#5t%bwX`CHxZURnlwNzlQy5*uRGTYuLYmUOwrH z$x}!br1eQNNSl&2BW+IFlC%|RJJOD%ok%sLok_cpb|vjbdN*lr(mtfwq4B|IM>`#D0onqz1!xP< z7NDJpb|%`HXlJ6GiFVGUIqRQ;cFv@O_;-5Y9JDsd{v7Ed%D;&Jb`j-Y#DBYp|90`D z73*D$cJZWV_?Pt=?Gm(0&@Mr{1nm;EMQDrA7NIRdTZDEw+U01Mqg{@6Ia&u=2U-VO z2U-W(7ty|m_C>TWqJ0tVN@BSZ?Mh;~675Q~tFXHY?JDf9Lc0oWG1_9Z#b}Gs7NcE_ zb~W17Xjh|MjrJw9FQI)2?MrB1Lc5MScagqESzqJ7eT}ld#((=7|Lq2}8_;e*y8-P6 zv>VZGM7t5~MzkBzzE1vckh)3VB>gw(X6$ap?q=+6#_ne9Zb5$#{Xz5x(H}&A5d9&v zhtM8EdkF0zv_E3|Bv8`!;p_6FLUXm6suiS{Pin`rBlUpr%+@>5IKDW6fZPWkl0I_3M7Oez1) zdQ;G*l;6w0(+gA3HY@-2JGL+X!us2zZ(si8tnJaaN1s*xp~5V*S>>nj?{w0BB{k*D zq4J+?v@`n7<#RUQ8GUE;UCSTXXjimd%b(d|SF~Nxb}RqJ)ZNf_E5Ej8H?-Z*_9&mR z`5tI{lz+8m541hd_NJV@(e|dCz0vkYn~gRbZ8q9$wApBL(B`1cL7Rg%2knEz(?I$V z=?KzXZ02G!7n`}*%*Ezt^kYaLAstIPj&wX}KB*b|X6&1>Z^phE`;*X4LOTiVB(#&z zPNse*qn%9sPDVQ!?bGBxm2__T*;VKA-_9-nL(RGTw{!V#3(KFZIS>6j^z+cqLq89_ zt^DYzZD?)fALZZag*LSF%kQ3gKHB-^cku7@!ue=dmETdg3hk=$yZM*7fObduAGW>& z?T+#%`IqYiS|73Yq4g1KA6g&UeZ=%*(l1Dlk_JhSmA`Z5W7zTUE{|dN7Fo*_L;dXDrw=})8)(w|8$kzOW^l3pRbO8PtLHPY*(H%M=i3X`vxTtX@% zO(K<()+0?Ntxwv3v=M0Za#r1y~yAk85iNcsTjVA3I^LrD#!50MU^y#K~WOfH|=2p>Z_cJdqB z9y|He(qkv@xZSanrx%W$ydS%9#tx~ObQ0-g(kY}*lUhiplNON9Ae~A2FH$S%EYjJe zb4Z^dwUN#zeU@|q=^|1)>0;6)q(!6-(icfrlCC0ML%NpqWzttjUnSi@x{Pg+M2WtXvgswM43+MBcwX%6ZA>%Md5``10Slz(@5Ke4=j-Tg}H z*R9&m`$7EoLrEVbHINP`%_TLGjwa0`9Zx!eG@tZw(ut&I(n+LGkUmNJG^vGj zD(Q668KkpFXOk9^K0`W>bUx|QbJ7t|xVozDBx%bR+5Oq$Q+pkf!iYB-_|9MOw{G|2JJ;~zO(m<#(!b^E|B>BG z$IG1s=do=;S@ZF8A-Z+^-r=Q%MKCw8g-@YZ!pBtd4aUTupHV2BlXy>TZXGDbQwJO8 zb;-|M$~FGO(LaZM#C$Ql1pP$x#+C`aBiU5d@f|_fdYy_*$t9ElFNCj8`hCZ8h6(@6 z&@V*)I=XxnY};Daf_Ie^{yXX4M7JH(pWKJ`g71f|?;G&LiS1wcF6`AG&2;&N&zBUe zm;9^D<|#Pz7c;%=)d@daWxP+~<@h<_V*Vlxb=2pP==w2+Pr)}6zkD{_3v1I3FN2?e zKetOs;ajx%^KkT?_Fu#1-jw$TiC4bG=9LfezVq^;&#B9c<3#^`)X}z*e@5PDH^*Cl z^640ukIlm5Gh+TD_5;|IloSdV-&~vv#=cCubj&qK-6?WQ$zcadjv3)jR%o>kny&JYH?N9!BNnx)`OAEWh2b1@Y z_}q-VjquZnPlWC3S?H%eUab3UIOd&v8aAsQEG<;wC)#-~`e)JqgrD8v>!&lPoy+hQ z=!KPh2ly@aUqas;U7N4MXP;h-a|yiF7fK8D*!RDqIL8-ab2Iw8v0sXQCv0D+KLo!A z{X+PJol6VXT*jP*A4R_uJ_B~n9)L|l7K8qc{{zYA;qNFEMqVr_T!;PR5wB%kIz2VR0c6Z@Y~mv1G$0{vE4o9o~^;aS+UP%qnjCO$t#JagbB@b|H~ z7n|L&G0q>u2cU1WK}lf9ag-8i-XE%wviVzV1IPhn$Uzxq!6Ft2B0bHpxu zM-F@WZpt;DGq8CGb}nfDAd|^8^N{4z`PhhVzg+nN##_=|+no!8j~z-n_QIHdA*f`k9~nyprNEuVuAne&n!kPrBu{Brd#EU6k z_;x?*z(}&+1Dnw-@1xi(VSU~YT^rkNuR}`9o9M@C^oVCJeB&L3!m;?_(!M%| zhK!pt)_y0-`V{spaQJM6bD!sOeIGffw9xjJynF0jC|pL~j<@K>;970H9G}-P-empA z)+NR*#TSmp&)45uTIkCB^k&?h*zw$#={=dQO^kE(;3*s@jCLD9--`mhe#!5L$NLV} z#`!y#*~nodhs{uCBZrL~Hm;dnGZ??`V@)H5qbO_iV%9F$z2X<>-;%^$%cfzkzU-4+ zmy<5f&-jdt7iPSB#usM1DC5QODa0`IK+cxHXC;n!oL`Pl_iWn}r#2Cfx_i7X+W+KC zpPTXQjBmw0@`nH0sLO2n+H1iQ{K&VTP+VhUEp>l&9e!-XGikTY5`P!_rSQJ<_%0(n zn%ddquIk$GRA88zxsE*l|A?2by@ard>p<`QGcMh zI5z5&y=8H!9nYJWJ3zTh@Nd0NIf6Aj+2}v^Y&kzm459x8rkK@ZQjW1C$5^uc%j=5w zGApxssh>wb{+1YQw};-t-}6Zv_MtzS**p((J5V@#my*JZiDxiR-TSp>@yHR6_O1`F zV&4YG`XI-(V>$6$LOkxVjqPgKaaB^ry%=10xwO!(AJ{o4hkrTh+mYGGVIzl4XJ#XZ zjT|;znT;Gaa@bhMVCyK`UvjKb@--hTj!E}^iw`X+tVdm(vkQ(ZEo=-=p^h=;9sl2= zj?XcMwf_OUH8wq&fAx>yXZxf_S=yXBkMAO&?@pgyaXRt9+FyYEzHo2y<9f9i8)KN0 z?AWb=2fcltRS{dn}g%+Ks(b29oYxSyC0zPGf{pV=&-UY2!kvazkM zsb?+CY|N|8CD=FyoEQH?x$-o|uzROzwAG{d{}u5sCm!!Hufcvc`jhBOVD(+ScEHz} zm$F_*~nodhs{W4BZrL~He;EM95!;;jAk}+*vMg1 zM!QA5zn|33Wv9{3RWyiK@Yg}tur z#(3WH!^OPKhn5u1r7ZQ0$g3`Ilkro>7j?_J4*SRPBfFkF&*s@Vcr)|;8Fbk=y$;H= z@bl+n@BCer*fpWRKyt0PekaBTJU-XR`##2o{AaEUH_t7`AI}QhpL}v=ajlEJiq}f* z-2-fhA9e5hY@hHsJ^9~rS8dKs&s%b_nJhI;%z z^yzdDnD#}kEr+4IF3BH*ZzHxgIQmpQ)?x3zg4@wI*|fMm$eY5>BRS@XT$S`rSf6js zXJ4Axgl?PkpnFa9eySUeYho{aJlEEb7&e|@>mF=H7ml@MAY*mMq2pOSxB~w%R%_rG&$V!jXKi8(FJau?NF5*L z-bB6yUO*k?`{2*OK8O4j+z!`e{_Ejbqm~iFAF%P+=B=>%z{|03#3tI!_2fX-liv|@ z9z$;P&th)Ik88p;`21%!|4eTquX~tsp67IAG0!AUeR803T#t6kZRF5=fmU; zy%#;&Qx5%pY;2z&v;I5^zexLd&n3UWbKtL07kL%>D_r}0KI3}Qo%D77!SxOv#OEH2 zheeDNxdv{B`?7K^%NTw@S?Zg7toV*VJy<=S$*9Zj<arXg_3xoum+Bo$#_tQ{XhS*5m20v2ZL-hf z_ZfxtwcNO0lid&hFzN50Tw~Tx9;ep=ZPcx=b(asMZC9==S$%Kvb7CGrk2zSv8uBiE z9>Fs`$_ic#{}*vS^hvH$>_gm}{f4}^Qg`Qq&*VQs-ts+43cED0KH$@_pLmBW>+|W~(07R)1MYj(Psz$XGx0yB~$0sdC9@!sUtl-KrImUPR#FXep!d*65HXB2)g>4mZ4Ufuf$=a=tv7gBEABUqOG z6?LDCy=$ZTMj3CBSpV-#JfHq`uedywwOi8b>ASl(=Y2eDqx@6YYp%Q;9)zDSDfaaT z7(e+nbYALf$AdPpHrA0h_K?~KYvaE0Blyuq{sZx7BfFo}Ce}msSbx;LE*zF(h_yxi z)0t2Cx#UwG!>47L*YU5nHAy5#cO&*2U=bEBTv{ip9%kd`j z!=gezG0Xlp}!{tIHTtZvHMB$ahIe!iUi{3Vs8|Lf8Jj6MWguKwllFYEu;$>(kO z+&bBpa-B40{oIoL3}=4i@FVNzcgfF>Z4>;cZN{oe9Fyuhif+9gPi^b9#+bFAli6R0{crIzmh5c@Ibx8F;aSR+^B5i{hW%6CdC6zl za?w7>oP4Op9plm8kx{LA5A*8e2@%i-TS@?QLW0YBiIlZ#;wJ28!wt!g z2E^e+#jB&sE0S-g(f(8ufnimSFP<{CK}+UCx3_*_T?bc@M+JJ(Xum8dJHK zU~_EZ%i+@#PvM-*g|OxRn7sONZT#y#oSi^#A~vs6zI)RDHRSC|y4NY6U5~c|Yw5R> zpLj-OZ1Jo>?jo-->;F6O&DhI7gztuXh~d#)`F``E#rOx&`_T_Ux6M6w6}$qTMf+Ua zP&|{P{zvRzK);o`dw%9ccpmy+&{x4H!>_?_CcW@FbM9|NeG;7O6-l3(bn|Zf7Mo3y z&5Wem=3ByBqFb*1J+o!rnk?@g@b2i|o7cf!o8%8A*3YpSe-gIc^m#VCk9oPSU6gF} ze+6v(^0kR0h67RzH@-#xVA8*pB0%<&V8^U*Q9 zF7s$9V>`}D$$MaLy=2GpzU&Q3$a?_#XYg|!d=Pvo{BV|6j=XZ@or!$|_Oa&dys)Hj z6?xS^l5}}~X5-wyHkGvz?YW9LEmxneMaya07VLW-Ax_vmn|qkStS<)O*t_<_UR&Ka zI)=S3_$L0nU*3cJ<%99xob`)iW)A)JeQf5!TWnf91Ec+E*q3n+D1Q&$1lH$gh{txb zEaS9)jUo2Q!%6o!p8jiihjKUmT^}wb@BQ#-me+ExNB8WFd7tIo+~>$E{}#3`=KU@< zKO^rV?E4Spy%PK!`j*u90nUMRq`t7-s@9#@msY~7pVz^$9?qm*x8u{ZB^Bh2HD8W> zbv5?WA1D+K;kqMx4SHYVduX>Uf6p}wJ=!7a;u)TZ?NMTDOg6?=lkPQK!y7WLPd1x# z=Cuiqc&N^0F7&^!m-e}<{KNHm_Ay#Aem#1KcK#E79%gJmb`EW-;`` z(QbWkwA;X2%F@pv_!-Rd%Klx|^H#F|hkwo3@EsXbb@kX#Uzv1ceu{b>pJE$@Kb_dN z@(k!G_O_LNE~MRFLwDZAe7u^ute+3;SX`?^|8CN4heh})Bd=@14;ULO;VEx&?iBrb z*yl)>F+QEAo}ukRkGX#Wet3jh*bw_GDc8JP!k#_Q-u=u?$$yOhThX`0=6mQB++@ZW zlXqesO=moe^U16?jC0raTI^$OugiE&#tj)Cli0OrK5U!FrzX~?b0l_^i8!*q*@tR@imkcLc52N1My{)8^N(Udca#2Wfx#m#5JF zzei8=*ZQhIo%D7%{Kzr39Dd~AWAjzwk=L|O=+5lrr?I~gdwEUv zy_vln_VO5YnMWOavO4x>_Hx7{ugTu$W1eByg0p{~CGh$?LYq&czm7b!Wc*#j$>{P2 zTZ-4{Tj`gZc)!1t{*n($x@QAkCa-hZ{(23LxweqG=6KtGCTl%?6#FsHuE*X+c7FYp zc;s2c_Sl?~!fuVly!TL+XU480o@n!tRNolSzs06(Rnh+L`r8Gij^8!OjKC zt>6nYzN?bm?|FXykkX=mpJQ7W-@o{*OdEMB{?%ijpgy)qu`GGr$|8@Z*j)c*@2xyD zAjkR~Ha@p6Td!EIb#cCIO>CP`Rt0*@mnt~si#G4V=H1xnC+1yEW?!Az*TPY*9QL-) z&iHYiIf1tQ$-X>8W-lcF8vZkES^mz#JxuI#4xrpA*tqBUK*n=3J}%>vGd?Hd&u4s9 z#@EBU(_i|xtYG(7EyV8_h<Xv0o8V%Uu_<2$A;xOQ}*N85J5;YSWX#^Bof6frpOe6Idynfm%J?=0q5tbv|2 zlJ)O7q~27n<4Qj8$ILg@5cx>h{fS)4y!1Rn8`sc?Q+>OnA3(YF^n08~YJlIs|5E0) z_LmTYHeX6-ndF-i58~$=GmG~`^7rAhnAhSVHrV!&qunZ#jq}1WZ#;C@)#zVw!dwK?-iqwF8%#lVo#=p-H;{H@V>is;k!hSAe{?Td0HM0i$h`9}p znBD(GU$>w~JIFEDS~Fb^T|ZGr{YPFoY~)$g%eHM#HnFzsjvi+o_J_R&b!0ZSNdvm) z@a9vOsH5D7?)a3a&nTXwmQPIj{ct?z@6LSM{=Vob1BFDWX&A0k} znR?t;x(B|HydNa5tj`a_4^!?n=uL^g1%Eu*#4{Glb^m-adM`d>-1fn?q3xqCJ6643 zN82vPfAACdxgGxt@bd(^{p&mZh1Ajh^?lIu=s(8Bwvq?ov$ZGhAK?!+74sN^JW#W_oR=YZHB^&(~-x?^|nN z+v+O(Yace26*l$B<~nQ^(ayf>?}ooZUmtjANnxj>X>;1yb6MN0;JS=`v_mr-bvcB4 zy`y+`>UFIZJ+1|Ej1xK5v1RxyDP3p$cUW!7#&b~m|H?5Xh3^xCdaPrzed;wun|R+R zM;~dkK0cR`w;hfcy6B4-4|0r?4s7B)l5@&9J+I~U(Y@~SZxqM;&)K8yz+m$l?X~+S z`0vcxq&?$~j63lkb(iA|svI%MaUNBUGpNg1d(Ha@WyxMoUp;}n2R7=?&7O>1qxR&? zn7_&DO}gjdyWwab+bYUcw;vt1eQ@-ndE*)T1(bUNKx5WMoY%F&>cp)6u5jn0w+C-bQr#5kpRPyY~ zYxgPiT~)@_8IMx0SQExz+ta*qjIl-d-<2~h^AG0!g}h-Odz;y;+re|-#n_v77BOFE zoYc!}?vkYMh90~(>~-qDu<^PewX z2>Y92^>4w>5!p81pLm+!=9Hk)yKH!;L-kbePxhfQp!y4nqgpB^~;$l<3Cwp`~?Z)V>QM_cJL&e9CP z;eRmMxQ2|k3D5T3mkyyvS;NW3HkWN@+jcau{VPX1kHFDBamXI+-J9**^@;Vo>;&do;j z7)z~iv~3FXLA|0K#XhA7Lt!J&KK6uS5R-N`1#lKc4u__3WM zZ*OMP&KQWkz;yiG&DGfVW%hEk+jI2k2CSdAvknYoeum&^^L{wmd=R$2&Wm9<>N^S_ z_LD;4%BhT7*!MM;B!2z$(!vJIS%)_)#%x_G;MeXi+RNI19ea7h1^?H+3Vr$mMSEHM zrP#|mtiiqp{pb{rto?1+%XMq8Z$P&_jqM?>t$T6)c3<`_@;l-66F))Bg~Xn1*aL1$ zd3{zUFQ(jOua=DS64#j+hE^;%>cS>B^%q*iR;h!zjZgSWtq1-D@%^DhLY}> zagB=plA|A;zZWup-)G-pAN}||YlzoS&w4(Q_#5!b#NUDaO-=Y2fy2LkY&XkQkKgf? za4)ZZ8+oTBz8lsi)-E~bY}oubl@<3gq5lHieMmX`y8Qh4Ao@)F``qlWd=Fw3F~_`+ zf5&yl`?!%5=L%zh9slmZDmLPr&)&uUl06G|3w+Ze?zZHx?`*sjy9B|ZRIGdC#~mR7pl->URT0#A2Bzz?cDe9OboUkC-DwuUZx+C z^!3rBtzIGK&63S@blEo95}prRmulF3X0+!SNuPyYM-1wttnJg1pIy)w!m-Db`%WwN zm-W)#HLwAWwX`0#4gF2TxXtm!eTX(O2IRQT%EzQLb>zZSFR#(s9F5PtsiW*!*7qllzEijFyuLKUaea~Fdf}Ll zdk`LXu70-T_<5SK>hBBkx$KzN-t$#)?tLEYJ@1i+mK08aJqzub_LDN3)02(A@jN@z zKb!PL=ocrx4Zb3?@oZC+9P&1`;<^n1|nPI~;7dE0; zCRiJJFl!$<+DEo8Y{O}U72lm3PP+XvlGy%|W6xka?1X>!^NtOF3%n`u_pnxk&1hzC z8@kWm1{?i2N5-E!!LffBgJX`EH^zw^_GQy1?B%e(m3itu&2JaT=Jj_R^U~Vo+E|6X z&#dZC=AAV*dlLW7#Pcw$f1mq33h$5ZURs-o;eOclWKZm6>$oqheFOFfz)!$?Rr0E=BWUWv{87e@yOAS)o|Q9*CiXTU-cPlV_xrbJtq@+S5a2@ zY``YgeCLS2CApUcQ2sVCoKHNm>)7SS#u!uoN@DeI!cF+GO+3TX2uEzqDF$Oxk9Za` z-{1RLegi_@rTF{-KK&+)x;A&BUqCzTu_fo4=Fn~_uk%8VwMCA(vnu7azwRgI->|-U z=1;!woRY#%6F&m~BJq>(VB(kI|4F>zxg~`s6JL2=N#Re4_eJ-to<5I;U(dLV_m1k# z=oJ}nlDHLp3wSQ?Yc7Ll!ppF~4j%so9eN-8C7)f)hTpSc@%~Z185_sHd=G3L<%cr; zcS+Z0TnB|qjUYq&Y?1jxd^yS26`>4BaL<}dLR;;i30_^LO%?qh67m_#H zN{+UYqpjp>R~5gctLM_b9!R&un}Dz0Bw5W@#(E9)C$UXDHXV(cBm_R)12FUi;# zw0WYAwL0+w-(W5z_V@U=!v0R`KXFp!7V~hvav4_$BLBE_xJZ-dzeeFGII~>;( zZ5${5meUww>@6o|+eAOsE8>wO9@+jnEww|8RokSbEL|huP2g5+IVVvr*SIbv82+ee?HEOqDdC5dA$KY4`6`n>cz`%Unx8Q+ufZ!*3(Jset{eoXkdVA)-GvltzXD=N0=6#us_pp9nae(sF zW}!u;1VFdr-~jC-JQI?7uVC z;dq~`K2TpgL#`h0f8{7kj(WAcg;&xquG{M2r-?R+dF^|sh)0{Juy?<08(R1A>qzFa z6%LD&e(z4RRljyV1t)p{F zo7lf;<9_CaWV7+4b;fxib2jdy{nm&41Ku^?!dTtw^Cg9YPA@(u+y?t6n9GgW#C!Y! zVvhD4gme8n5AjTdF{4e{S*3+dS8&Zr_Kukz_-O8l{Jr)Nyb*pDmA(SA7fe zdKO|h%R2(cbBR12WB$d3+#eBV4RJb09P_nsjCsqoJ$=q*JTY#|DvQtFwVs}+uV)x)tTkz=pYLEVknIrz_FXv5xia6Hduoa{nh`)$cSt_!hWlJ(n0GFyADev2n;y=yq?IMB?fsr=4|Rz?>V{*^TCa1+`#NP=m$W7gLSV- z>@(-uOs|9^o;o;UXh=4W$$B{IE5|ciIi3~EaWCfD64$$?l-KpY1&%h17#u&%nIAdI z>PYS2zRtFd=iZhTF}K1Ib7Q8rWqLat<#uG;nQ?)&e+C~F{vvyWuB6*;-EhRym9>8l zdX(Fj`O$txx(4;a5$8Z=@0huSG2{2!<;^bTnI}A$`LPXe=h^!V#?Nr3kHFF9L$I;g zwxgNNSZ3om_q*9M@l(scF&^qOu7l&69^>|1*jJ)Q{0(r_w=v~)Y?wFN$8ubIeJ{`i zn|D|IG{ccsn^-5SlZ|U>OJ*}3Gw-(ijbST#_}5SDL;9#!tn+gCG_TLKoY%7NiS#4; z{ZhFTKdu}8oenwH89Dw=M>ia8)dNR6^uke>2F7HpW73}!r(Y;40( z_^XVE_s~}E+rJ4P2ER`3og#&E>u`#bqI>_23GB^$?WRbtmwG3Ct@~8U^_x|(M%BU*+YyxYyQldk*jI}7(O>$Ey3{3m%WX_-oZ48H z_YO^Pv~z3H$Hz&gn>W^k1~~dlJ?f&Lh(Vk1-v)<&?Hx;w+xBGRxb1k0O|+qYqJ6Xp z|N0E}`{cGytX+}Uao9(Hc~4!J`ElL;<>$#yxpULC!+z|-Cfc?qv3e&Qb?JqpF4{zF z`h3?-MW5P4Z2fSw)j(p$;UKI}+j$rcpCg%#KK;#03vrHS_GO&w348s=`d@(_@tgM- z)cqRrY7=o*W;WGu#88v@tj}y3GH%LP|BvDSTee~12jJ$+rX}N6ILc~=BmOoxuDP9w zM?XVfz)_c;jC&K?FRst=ZdyIsp)a%V&v+1ywMdS&NRG8=II|ytW8RIzGw3hxchn>1 zip?f`%HdNEpH-QS95!;;*oNP{qxf6w7WAmQy5~QKY1{Tp@65OZj<)TFqis8h)90Da ziyrhC1M?a4wnGVHs|`KYs9y6jHaAA^gJazGCwAO6!%^0t_N-C*Z)a@`KSStImi}Wt z>NEOF*2e4UaArRON8O#j{!NO_iKmS30EN#=IAW_xY;5W=25K_BHe+p!-*vAJj`-EX zzk1BydN|@~$hbAJ=2Pyt6f)WR{x<(O-7%(eQ=Mh+V}Y#QN+ zM~)b5pOw_>{nV=oJ=(cB+1plM=d6x@4`t<5^gH_JxZaIFTgYr$;Ao%ujPq6a^xmo? z*^FOz5<3REv%I~D-Ou-Bx_Ki`IofILF5 z4}(4+3$S36A=< zW;R~C<36-Kvv14nz2=5Z2fAh1*Zkyrwg1k{zAM=nj~wxIr}j6V?#zB5+3T|pjyW}$ z>Ajgg1V=kWS%)TeHm!p03BRhsID|j^V_Zh2WnSI4p6ZNgi*gb}M$Df;JdTnC$ z1~|rs9Q`gwzqe#Ia@fdW)0)}HVIzmla@M_fG1vUIPkUxBhrJy3otcdsHgedwPR3mB zLytC;Lmx=GeK!b4zYM`K_J-jYdn1{>e!^bX-o4XkW-rHF8-tC(vdXre;EIf0OTDkT zn^c|Ybs5*f5nDYRvDLt_?#ZzaZ-ArjjTzUbcpT?VneMt2_AQxSgC6C!qDQ&f`#kf< zSMuIJ*;~hsEN@rFy>N^xIr>hHzU$9yvx_R&uNr%Nfu2Jy`r3ugiI#=$XK$>COL(@ zv|BujD=ArLye$9D+9NzeZoz&=x@OhD(GKm2txIRdy&3mq+@G<2;<_-9=_47BW;_Hp z&_3R0jb(bQhZ_=e<;;n?bYm0yimFWaIvaZrIqKD#e7fFNXZGs$wfi^w*E2bu18HKM z#Qsgz#%sOzfVPi*YVZ?vlx=_4jaoR`U;Efc$*cEKaQM_d)|NV0|6WJx6I)h8V*5fp ze9Ei+5a;#m8TMjtpdRtNfAIdR6kY#uA0)@`;N)m4?LU|H9!==x^-Q1~Hgd!%8^idy zzN8zcdbCel(p{tE(AQ1R_r7~A&v0my*oVvEvpdV%lh`&<4?l9mCg*u0e)C4V$V>@W`t3lo;tyko4VzUgJ z?zDzzQ!#0x?(sd4nT&b$h~ZbPV<&!-zjbm^u?<7_oo}?8&xCUhn~@Zc?KYa&z8Hob zx9)|;;25{s$M^|*$E3PGoeS!@|2Vf_v2C#ptyfjXm2i|*4M$n7jYl*0eaBRj*;D=T zv&}mK&Smq~!nIjmdG*}M@;1OxR()pQ1jin-muE*2zpTCUw>h(y!@q0M3B>81ss-I~ zVjbHv?n*qq=Y*rJx-*+zIAZIAqaAwSSOfJFW72z>h;1OV*CzUC5RQ2C^J(H7|9y0} zZ#Qq$#k~6TIs6c83_gb+hGV}W$3A2Pj<(W1{8*OdIv#vhx!Q*37{T4dKZCNy&#k4p z*pH*+jk?R>b1eC^ZOt3&xolas{}5v@*8f4u3LCGjXHj>*hf}fLM4MD*Y+n8N_d}~P zy(Y1JR|^}z*M(|0`l}9(m>su|mhw9`#%+C;SB`TX4M}%xl;fPU9Os{Fh$q^oG1*&p zb>lQ1Ioh)&U9c&V)Gs-E$_@l;v+cJ!c{t!)e4I zukoA-WyLv@{Cv(`=xaS&g3r}wOHx@2DXR%S<}BW6uV78)nUZtCzNpLIo43NzUvJmh zl3VHP4#sxR{+!c>uZQ=2Z;`(P`=0$)_5=Qo?^|PhUy?YtIi6>x|0wc@5c5mKT!W4A48nDZjYqCs&fgWFEP2~6)5Zggw`4QE9ws(#_<0I$O1ggJ z1MuUwZsfK3d6@p~qfbA@yuKfP1opn{Q8<2&(1M?rsIS))`55+cw-cxQ*w6XyGiUtT z)YBONb=&HD$tK!Ln^*(oSOcd~)_E1hbw2LV&LE!W(e-%|dq_L=s{JYW3= zHuFk39|#}8vsU%*VE?nv7S9LzJCtu@!~Y6jI)dMj0@`?1N}Kuk_q&CDb4vaZdHa(6 z4L{@WV8FXm$6ufiBz_XMEZg>V*fU_hkMlgzZ?Kt-{gic!&$2A5nb@{Uu^F@LfMtc= zL7&Dsy>2+hjJ%RDx#1REf8iJ>>M>5_wT%F*+E-Mkn4Q1*zCu0r z74q8l6?NFezC!kzejfcU|10|nDBgphE#uZRgmUc9<*%b}&Dge%;Zu%sYcfC1yK|U# zJ7Iq-bL6=zif7uF!aexe3w;^vbDKK&e%QT)*JaC6_jy!LR+hSD`E3E&HW_~w2S=Nz z$NEzX$NgpCpK zq~&U(zPewMjcqcJ@nFW<$MeRax9Bk@wTbc50Xq)8?;eI@9FAWvsLS}ZFY_~+cznLY z5u18E(;It>eT?(69VYzCF}59Vu@3mVOUJ+deP?kdG5G$%-`};TczhqxX*<(jau@tl zc$8->QJ0FWtV%fIlp{|4f0MkAlJ|MWgKh3_J*u#YXIyeTr;@dC%&(%a<(XU`ZO^D< zH8#RV`o%rQRP2q@_b=~&r=Z7}l;d}o z@^8qyU9x!^_BVi!Qs39$9ns~f>rL>cu>GYz(!}rO6Mu}~)cB6cKHV|de}sF}HSISV zQ#&|L^8JQ->^J1K?KfJmiT#G`_4kx2)*tv^+HVl&zq{XPrL5R*$i{FMG01D&Z&216 z_Z#SI+i&#XGxi&@WnDm7@_%B#Q8tUekJiGsd$=E$e+`c$9)(|n2Z$}k-f+gF8JjoG zw`d=0p!#1p_wvmvS>N8GufzMJUUdD0{UChcsXX6!o%?_Iq{J2Yxd@(tF5dueowyg? z0j@&-^ANvl;N6M5;VE1?dR{N}?-1vK=<>tx zv5ED6J^s}r9{F*~GJg3V@Xm?faT?Eg5_>K1U7PXbG02|bG4C?UItm-#xkp>c(Vm{K zoBBja;T~=9V;{MWd3GrF9!*Jip2m5+4HmO!c#D0szcz1Du4jkZu!(nk9ho2bjsGb= z>(D0NC#paCHU9p~6I@%9z42%h_3eS9zUoom!DK(ap1?Z{702OF(%lbhGZlR$^F`hg z_Bq&avN5l`UO)RqY)0OquY>&`(X|;O&W(t3G}#zuw9jv-yEd<4Q-#e~W~08*4aL01 zaOb03Jhv>yvm^TN8P8=qPV|K~^+~Tvx^c?!j#d6LYq0m`)o@(<?>-piR+g>gFi)|#yQ41^stx1rXG$tF3+Z|te1Qo@z>A}jmak3s)n(*4`a!8 z+dA?8m)Nw4u`RD@Y_w9=`M+e(?^uO@z&Xr)h@lN${X7A7UorkH0*<<9e-<%&J(Vwl zy(YH9QAgP^>>463#>O?FBiUF-V>py|WADMHia2B3HlfG9SO4KtJ@)Ogy5n|)xqJq5 z-!(zLJaJF5v8+Bgo-N4nY(b7^3(MFKynY(rTH%^Lobry(myCN^A6A!}bo~#)aaL^< zj8@ZY*|&5CI2V( zDt(k2eJ#g$@LisNzrf$&%6`vnFXsq0_PgUh?z{IxA4PY~@xHsFX2Pa2@%Z}u7Cq*U z?-S!%X<64CUpiiHHTH22B_EA{f7>O;S|P_clwG^Lm#Izq_({9Ees6zb?bk-YIm z#rq@qie%H1@)|>bV%NQajE6HG%(yqPc}FrX+qu{do+pvxUAY|JNswdBm*X4w6>#3~ zetXB?e;KFilIIz!uyI}TJVQ0?eVk_@WY>AG#n$o8)W5Zv&pJ5Pw|Y3%H+{zarsoji zI@OT!T1PqRB1c{1sEcvNn6Z6=9edWx=jyg|=(cmP<;L@?QS^wj5&seASf)2+dVQuh zXL>Dqw26Hb<6J%3O+ChQ103bHWPS$GBhDe%x{UAZvb^eXO}Ad*vknfQt(i~TA#AE) z=e6HMXv^%|GW#a@<~@Ws z{e5L^W?z?a%n{cO_1H7l!_hvCnSE2ntr@o^cFvkN+N~Xqc58;CedK62^G09G(ZBNQ z@d}e<@pbuYK`5^w&=-8UOC2&zkgUoA{1N_BmVp z?)!SLiCa#rS3~%Zdk{J9LFA9p{@=o0)=v){zrS9|@2^LbZfx==pDJE=#xh;@9&NvE zxVM5AU~}9m?w7S+@_*kghW}~T@!WpbV!8USg53*wU6Z}89fVK0{yYEox@O)eOWqTk zx4y?*Fpa)m!yd8*d+Tet`5sa|_K@=0_K@}1#2!*M=EI3u{#W*p#`*8=AsZ+w_K>nM ze3TgEHSHlSYfXE|bJ5qfhiu1Z>>*{#I*GF6|HK~BIpViU?qJ;Z5JU8-bHQ(y^`Tp@ z(-{MExsR~!+rs-L{vQrd`0b#+EN_3}@%yZdU9Xy%FF(d7%VuF$?%)3x_It~&Cw}vG zIP(+i^<9qr!)WGn3^uRt3(9tzxTaUY*2NeqGp^3K3XXlO9Cfcr?6p`98#%5!7fvbK zyKXdRx*Y46tWW*4!Hdr=-s{OX!EfiiUMD{9P5$NKx7mLWKHp6Kr^9#wpe9PPHe-xk5zw*!DX8#qtPxzPr^fvpi#%GKl`OUZ4e;qzI{YcVGSr)10eIc3TJiR+Xx$2Dkx7-DT7Ogz31f#Y6M zeFoPB@6+YDuUy6T&b;H_0!?|nMhs`{nP>OL&vE8?B-2~Bow(MFp~wAW*&Y-26>!AX zk=a+FhkZ?EQ=f4I9M`hO%)U9ZY0J1hv+v04J2RWE%%&%^>4sx}-mv9FTgmRpJuA|i z`KjJ$A~tQ}nNMG`vHktKFi-GY+oxj+xrb zUJjpf>=WuTn-)0ww+W8%&%RZE_C(eskbLZ0sY?_l_RS zS;U|6{dU;0*5jM7GuJP&`>xUCUwh9^+(6#VvGF&F@lEWpWaAzz&Sq?b%`E(QPGc9i ztahSa6>#)X6&!6+2}d94Gul>;`%O8XbINgVYn(9`4q@MW8*zFr+A|pbcGB;h*QVbA zdH*%9q8Lv-u>~KVIL?0B$Vof&s!+?{bxVq@;lcpzi*#yLGX)<8MF z1ue(-6$jy%3nLkiW^A0{Qx2bU_>{xv7#u!5cXS2kPtK-2?Ux_Zzs{Yg*Z6bbcTdC{mU_KJ2IPSb8R{^y(i<|jICq%>C5!~jE6EF&Uh^2vb`qi z+l0@!232Ny1sv<4Y+aoDRhi9P#^-Nn&+}>9>Rf02*`KqEm!rpT9Om#mu`bz+&!g!@ zpK^W9nN35+HJOb*FJ-P@ga3KN@EkFCwy-&ip+2#{v2yO0OkJmN6ZS1h_gW@9k9_vn z3dcN>W8LmZ_Kx{>IL<$GW_nk~uD2WF(|yrw)(6{du#ac{@PR!4-;;AtuB+=4&-aL@ zmiG5qqSuB0x3lZf?@QAf?z%0%13%VXjcfPz6 z|IU|zEU({^^7*jeXCKV;p^S$!c8{?W4R9~^W0_vY8MK(E6&Y7%Tm{E9!gb#Fah|nX z$g>X5&-)Eb+t%}J&*Q&_f8!mr9Pg3kc#mA4*~nodhfQN)7*ea7-n>v7{TD9CM*;pNTf?q zC^`OShaBzG1V_wrv`@1(4Dj(YC$MA2dja*>?_E~OZ^1U??}dGvH7(h=UWNV-^wvyo z%UGL>HYhFZi%ol`cVyg~*t*MQf8skk?<(@9@NfC8UkCRr#-`0bTgUvJj%%Io(X@}Y z(&rx-Q=2@?^Uti@PB`qf+45f6B9%MoM@4(TV-Pm3OW{+FZ}GX-MQn1|^k-!aWZcM_ z9OGmVJ^H0%@G0DHq)y!y#|i^6gl?Be&;sc_0*xq8YstpxE_vr zH72&-8(`bSGhOPzO^L5VZ-L{CdONHi^LAw1nb>=`uEg#Ey5VS_9ysc#O~e_`z_nMm z&3z}Oo^#muViR@gOZJZQ{!Euw_Z=K_X8?{E)w>{ zaANB|lIi-4nB}O;4(w0X^xSMT<+a@WxtV%AH>*+A)yX%i(7b ze*LuK-<|Zn*n3ict2=}qF?*i>;u-1h_`sjxnmGP9ec&q+4`=q(lpAyHMR-kPyXrkf z|8E`J>M^$EwTdar*f_e%xQlVc(nVJ#!-aEOA@%%CX+|CmUmvV|)%I z-8FnTL%twl;z*>s7Sg#<=FSi@vK{pIcVOvF3Yk0S0_KlP?xcB#&xP5J=O;~ zu2Y|y!Si08U+w*U*0(HgywSA7FCme+`54G*PmcticREg+IE8bGXMRFeGV{? z>4S+K4|4SHP-ZinvG3pg8@L~#oqcy7<&I=Fem}?W70<_J4E?a56bd)a;$8-J?q8eu zuMcuh{T%P#_nT5oZ#b z(W4(*GMh%q3jgis;lCRWy(`muQeNA$H{-sHJ7^#4GCr>}eK_L*IO;A(n+(CRA0A2e z)^RiXC47!%`nMTNzdoBYy0_8(nO?U4M4MM+T$!>PJ)PG$|MI-RvNv+2#a4~`i6;fP@%v#F>m`qyXA78CY^nY}h~ zjgw;ybR9D`pH~lNd55yR!&zC{$Me#WOdriyn|PitJIDPUeS8brvi$yej6>J<;EMN6 z#9szSeMeaH!^Uss2UlVfZCjmj4IDOAv~$E$o7vQ5+yw8H*4Rck%B_dv{#}miY#SW? zyO{m9`>QtQGDp4&cX56EeBuY;D-y5&;nMNHd#=suYis7G2ab6W*Rt_z7WIw4p)-KZ z8(%J-6_MBb%G-NZWEh|Ko?G-UZ}m3&AH(O)`1CB3e8Ai6zw&^I_K}ZzoBh{h{^gV3 zX8(2gjAz|)JQJ4VnQ%S)70P{tZw1O1z`iq;&xL=M^bXi>YN=nHaX0L5A=U59_-_qd zpZNBa`uFxJjDLr!5stZV7i-#@?irh~iMfzJ4^fYMMtN=bjIG#g^rPb6LzLY|oxcz}oYrALc#b?|z%9iyd%98&R_l$#- z8_%DIVEfc-%5cV`8INULHfLfTuEHMa0ygH5dG)o_gA+RVRyn_^~et06erYAn-7GkqA2Yhu~^vwnxePbD0Fj6d!@tI;EVIpUEc zp6j@t{tws98yP1{Vb3=EPEht-^xwMpmLF{2`A(MOX5+v6@bA+3Zthv~`gc5Q@TrY` zr@jjPd)U-wy6?X(|7`JlK})ciR$G)wj$knjd z>4(wZ3onBog}39ne_!Gw(C@gMZ*C+%KTY~soh5}|B|aV-|4x`T@%~rd2RN_yQ_irih>xZzGU&p;6@yB?0k@3mLR10q`n~1@`2h)O0^otz*B1gY; z!hXN;#dSE_0B`qeo>$fs`TCc6ew6rqj})&X+N|k&hU)R1I(cp1sq4We%9SnmcFK}1 z_wK||uKJqFRgZGzwUyhCO_VD~xw7T{jB@2DS6)-O>QSz|wsMECiN27dFXZTpk<3O8 z8#!#oG8;K;mM-2Lpbzb&iD{e|TQ9@tn#0#QHxOUV)9e{6faB!UvMKfpW{%FMfC8 z3~V-r{oU6hcvEc`NW&I&<^lwvE$L5T+iEo9;(WfnNw5J^H zDMx#@Wj1oy$YIl&*~nodhfQ~8BZrL~HvO5695!;;^uiJUaAq%uy&U!<$=xh z9DO85S#p%sn%T%l5e$*vGjJIlj$4nCWupL$Gx*=21A}lp{_#;;cPr z!oDoA`|7$(ugvuNOs~##^Ts~E;Vm|y*Putg>ofGKOqb)Ck{taqM$EAfY($TJpf)jn z^dI(e_>se=DYNk%mfvpuEbZK!bla^8{V4jvXZ~UDTH2D?sK+>I&3w*eoSaDBQNByu zmg#cXA2F@?_k#Ua+i{~ef^TcBI2;uL6>c1kfZM6;eS)1*{TzP4sw*nm5X7gpJv}>gM$t zsvdsK8}DtkIhywOn=o>`3+siW?&{HQz4S%+_x*d$FC1K2c<)b%jc3TO-&kCu`pFx8 zBu6{T(ar;K_!-K07>>MhzY^GrGJ zE9GeeJRjs6dh+WJ74I?SHQjTm$32(4wtKGm+!p&gkwL~%*&!2aO9dQ#>iXmN;fJw_ z>(R@JJ&XGqT#0@3Q8gT6K#qQ|f$iUyIEPl1*<458UBY-SWsR%X=3ahhUd^5#_SxV~ zwMAZ!YsfjjFXj!O4cJ6~$v^Dpyv=%iw*jAD!{_?=RDbP-(!!zST}oYUMZf5%qMyiX zoU&uSDf1~uSAd5Ye+vJVXVmgz@c7?8kbho$&YXY8UYqDU zd2M~iQMv!1f46Dbz?Mki}+Sj7DQ&!}S>-&4qJ2Sl_ z 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 literal 0 HcmV?d00001 diff --git a/.build/CBT/build.props b/.build/CBT/build.props new file mode 100644 index 0000000..c809c84 --- /dev/null +++ b/.build/CBT/build.props @@ -0,0 +1,158 @@ + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + $(EnlistmentRoot.TrimEnd('\\')) + + + $(MSBuildThisFileDirectory) + $(CBTGlobalPath.TrimEnd('\\')) + + + $([System.IO.Path]::GetDirectoryName($(CBTGlobalPath)))\Local + $(CBTLocalPath.TrimEnd('\\')) + + $(CBTLocalPath)\Extensions + + Debug + $(DefaultProjectConfiguration) + $(DefaultProjectPlatform) + + + + + + $([System.IO.Path]::Combine($(CBTLocalPath), 'CBTModules', 'CBTModules.proj')) + $([System.IO.Path]::Combine($(CBTLocalPath), 'CBTModules.proj')) + $([System.IO.Path]::Combine($(CBTLocalPath), 'CBTModules', 'packages.config')) + $([System.IO.Path]::Combine($(CBTLocalPath), 'packages.config')) + $([System.IO.Path]::GetFullPath($(CBTModulePackageConfigPath))) + + + + $(MSBuildThisFileDirectory)CBT.Core.dll + $(MSBuildThisFileFullPath);$(CBTCoreAssemblyPath);$(CBTModulePackageConfigPath) + + + + + + $(MSBuildThisFileDirectory)obj + + $(CBTIntermediateOutputPath)\Modules + $(CBTModulePath)\$(MSBuildThisFile) + $(CBTModulePath)\Extensions + %24(CBTLocalBuildExtensionsPath)\%24(MSBuildThisFile) + + + $(CBTIntermediateOutputPath)\NuGet + $(CBTCoreAssemblyPath) + CBT.Core.Internal.DefaultNuGetDownloader + CBT.Core.Tasks.RestoreModules + $(CBTNuGetBinDir)\NuGet.exe + restore "$(CBTModulePackageConfigPath)" -NonInteractive + $(CBTModuleRestoreCommandArguments) $(CBTModuleRestoreCommandAdditionalArguments) + + + false + + $(CBTCoreAssemblyPath.GetType().Assembly.GetType('System.AppDomain').GetProperty('CurrentDomain').GetValue(null).SetData('CBT_CORE_ASSEMBLY', $(CBTCoreAssemblyPath.GetType().Assembly.GetType('System.AppDomain').GetProperty('CurrentDomain').GetValue(null).Load($(CBTCoreAssemblyPath.GetType().Assembly.GetType('System.IO.File').GetMethod('ReadAllBytes').Invoke(null, $([System.IO.Directory]::GetFiles($([System.IO.Path]::GetDirectoryName($(CBTCoreAssemblyPath))), $([System.IO.Path]::GetFileName($(CBTCoreAssemblyPath))))))))))) + $(CBTCoreAssemblyPath.GetType().Assembly.GetType('System.AppDomain').GetProperty('CurrentDomain').GetValue(null).GetData('CBT_CORE_ASSEMBLY')) + $(CBTCoreAssemblyPath.GetType().Assembly.GetType('System.AppDomain').GetProperty('CurrentDomain').GetValue(null).GetData('CBT_CORE_ASSEMBLY').CreateInstance($(CBTModuleRestoreTaskName)).Execute($(CBTModuleImportsAfter.Split(';')), $(CBTModuleImportsBefore.Split(';')), $(CBTModuleExtensionsPath), $(CBTModulePropertiesFile), $(CBTNuGetDownloaderAssemblyPath), $(CBTNuGetDownloaderClassName), '$(CBTNuGetDownloaderArguments)', $(CBTModuleRestoreInputs.Split(';')), $(CBTModulePackageConfigPath), $(CBTModuleRestoreCommand), $(CBTModuleRestoreCommandArguments), $(MSBuildProjectFullPath), $(MSBuildBinPath))) + + + + + + CBT1000 + + + CBT1001 + + + CBT1002 + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + $(_CurrentProjectJsonPath) + + + $(RestoreProjectStyle) + $(NuGetProjectStyle) + + + $(RestoreOutputAbsolutePath) + + + %(PackageReference.Identity) + %(PackageReference.Version) + + + + + + + + + + diff --git a/.build/Local/CBTModules/CBTModules.proj b/.build/Local/CBTModules/CBTModules.proj new file mode 100644 index 0000000..8a8d130 --- /dev/null +++ b/.build/Local/CBTModules/CBTModules.proj @@ -0,0 +1,60 @@ + + + + net46 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/COPYRIGHT-mpich.txt b/COPYRIGHT-mpich.txt new file mode 100644 index 0000000..4bf0e57 --- /dev/null +++ b/COPYRIGHT-mpich.txt @@ -0,0 +1,40 @@ + + COPYRIGHT + +The following is a notice of limited availability of the code, and disclaimer +which must be included in the prologue of the code and in all source listings +of the code. + +Copyright Notice + + 2002 University of Chicago + +Permission is hereby granted to use, reproduce, prepare derivative works, and +to redistribute to others. This software was authored by: + +Argonne National Laboratory Group +W. Gropp: (630) 252-4318; FAX: (630) 252-5986; e-mail: gropp@mcs.anl.gov +E. Lusk: (630) 252-7852; FAX: (630) 252-5986; e-mail: lusk@mcs.anl.gov +Mathematics and Computer Science Division +Argonne National Laboratory, Argonne IL 60439 + + + GOVERNMENT LICENSE + +Portions of this material resulted from work developed under a U.S. +Government Contract and are subject to the following license: the Government +is granted for itself and others acting on its behalf a paid-up, nonexclusive, +irrevocable worldwide license in this computer software to reproduce, prepare +derivative works, and perform publicly and display publicly. + + DISCLAIMER + +This computer code material was prepared, in part, as an account of work +sponsored by an agency of the United States Government. Neither the United +States, nor the University of Chicago, nor any of their employees, makes any +warranty express or implied, or assumes any legal liability or responsibility +for the accuracy, completeness, or usefulness of any information, apparatus, +product, or process disclosed, or represents that its use would not infringe +privately owned rights. + + + diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..3177de8 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,190 @@ + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + $(MSBuildThisFileDirectory.TrimEnd('\\')) + $(EnlistmentRoot)\packages + + + + + + + + + + + CustomDictionary.xml + + + + False + true + 300 + false + false + + + + + true + + + + + + + + $(MSBuildExtensionsPath)\NuProj + $(CBTModule_NuProj)\tools + + false + + + + + $(EnlistmentRoot)\out\$(Configuration)-$(Platform)\ + + + + amd64 + i386 + i386 + amd64 + + + + $(EnlistmentRoot)/src + + $(SrcRoot)\include + $(MPI_INC_ROOT)\x64 + $(MPI_INC_ROOT)\x86 + $(MPI_INC_ROOT);$(MPI_INC_ARCH_ROOT) + $(SrcRoot)\mpi + + bin + $(MPI_DESTINATION) + $(StagingOutputRootPath)\$(MPI_BIN_DESTINATION) + $(StagingOutputRootPath) + $(MPI_DESTINATION)\sdk + 0x2000 + + + + false + 11.0 + $(WindowsSdkDir) + + Release + x86 + NotSet + <_COMPONENTNAME_>mpi + + + + "C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin" + + + + $(StagingOutputRootPath)$(MSBuildProjectName)\ + 14.15.26726 + 10.0.16299.0 + v141 + $(OutputPath) + $(Platform)\$(Configuration) + $(Configuration) + false + None + + + + true + false + + + + false + false + true + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + MultiThreadedDebug + true + + + + + + + + MaxSpeed + NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + true + + + + + + + + WIN32;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 0000000..6525673 --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 72f1506..cd30990 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,59 @@ +# Microsoft MPI + +Microsoft MPI (MS-MPI) is a Microsoft implementation of the [Message Passing Interface standard](https://www.mpi-forum.org) for developing and running parallel applications on the Windows platform. + +MS-MPI offers several benefits: + + - Ease of porting existing code that uses [MPICH](https://www.mpich.org). + - Security based on Active Directory Domain Services. + - High performance on the Windows operating system. + - Binary compatibility across different types of interconnectivity options. + +## MS-MPI downloads + +The following are current downloads for MS-MPI: + + - [MS-MPI v10.0](https://www.microsoft.com/download/details.aspx?id=57467) (new\!) - see [Release notes](microsoft-mpi-release-notes.md) + - The MS-MPI SDK is also available on [Nuget](https://www.nuget.org/packages/msmpisdk/). + +Earlier versions of MS-MPI are available from the [Microsoft Download Center](https://go.microsoft.com/fwlink/p/?linkid=390734). + +## Community resources + + - [Windows HPC MPI Forum](https://social.microsoft.com/forums/en-us/home?forum=windowshpcmpi) + - [Contact the MS-MPI Team](mailto:askmpi@microsoft.com) + +## Microsoft high performance computing resources + + - Featured tutorial: [How to compile and run a simple MS-MPI program](https://blogs.technet.com/b/windowshpc/archive/2015/02/02/how-to-compile-and-run-a-simple-ms-mpi-program.aspx) + - Featured guide: [Set up a Windows RDMA cluster with HPC Pack and A8 and A9 instances to run MPI applications](https://azure.microsoft.com/documentation/articles/virtual-machines-windows-hpcpack-cluster-rdma/) + - [Microsoft High Performance Computing for Developers](https://msdn.microsoft.com/en-us/library/ff976568.aspx) + - [Microsoft HPC Pack (Windows HPC Server) Technical Library](https://technet.microsoft.com/library/cc514029) + - [Azure HPC Scenarios](https://www.microsoft.com/hpc) + +# Building + +## Prerequisites + + - [Visial Studio 2017](https://docs.microsoft.com/visualstudio/install/install-visual-studio) + + Please make sure to select the following workloads during installation: + - .NET desktop development (required for CBT/Nuget packages) + - Desktop development with C++ + + - [Windows SDK](https://developer.microsoft.com/windows/downloads/windows-10-sdk) + - [Windows WDK](https://docs.microsoft.com/windows-hardware/drivers/download-the-wdk) + - [GFortran](http://mingw-w64.org/doku.php) + - Update _GFORTRAN_BIN_ in Derectory.Build.props to the install location of GFortran + - [Perl](https://www.perl.org/get.html#win32) + + Based on the installed VS/SDK/WDK versions, update _VCToolsVersion_ and _WindowsTargetPlatformVersion_ in Directory.Build.props + +Note that the build system uses [CommonBuildToolSet(CBT)](https://commonbuildtoolset.github.io/). You may need to unblock __CBT.core.dll__ (under .build/CBT) depending on your security configurations. Please refer to [CBT documentation](https://commonbuildtoolset.github.io/#/getting-started) for additional details. + + +## Build +To build, open a __Native Tools Command Prompt for Visual Studio__ and run ``msbuild`` from root folder. # Contributing diff --git a/dirs.proj b/dirs.proj new file mode 100644 index 0000000..ba6a006 --- /dev/null +++ b/dirs.proj @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/dirs.proj b/src/dirs.proj new file mode 100644 index 0000000..b53afb1 --- /dev/null +++ b/src/dirs.proj @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/include/binplace.proj b/src/include/binplace.proj new file mode 100644 index 0000000..1b6826b --- /dev/null +++ b/src/include/binplace.proj @@ -0,0 +1,21 @@ + + + + + + + <_CopyItems Include="**\*.h;**\*.f90" Exclude="oacr.h"/> + + + + + + + + + + + \ No newline at end of file diff --git a/src/include/mpi.f90 b/src/include/mpi.f90 new file mode 100644 index 0000000..2269306 --- /dev/null +++ b/src/include/mpi.f90 @@ -0,0 +1,1717 @@ +! -*- Mode: F90; -*- +! Copyright(c) Microsoft Corporation.All rights reserved. +! Licensed under the MIT License. +! +! (C) 2004 by Argonne National Laboratory. +! (C) 2015 by Microsoft Corporation +! +! MPICH COPYRIGHT +! +! The following is a notice of limited availability of the code, and disclaimer +! which must be included in the prologue of the code and in all source listings +! of the code. +! +! Copyright Notice +! + 2002 University of Chicago +! +! Permission is hereby granted to use, reproduce, prepare derivative works, and +! to redistribute to others. This software was authored by: +! +! Mathematics and Computer Science Division +! Argonne National Laboratory, Argonne IL 60439 +! +! (and) +! +! Department of Computer Science +! University of Illinois at Urbana-Champaign +! +! +! GOVERNMENT LICENSE +! +! Portions of this material resulted from work developed under a U.S. +! Government Contract and are subject to the following license: the Government +! is granted for itself and others acting on its behalf a paid-up, nonexclusive, +! irrevocable worldwide license in this computer software to reproduce, prepare +! derivative works, and perform publicly and display publicly. +! +! DISCLAIMER +! +! This computer code material was prepared, in part, as an account of work +! sponsored by an agency of the United States Government. Neither the United +! States, nor the University of Chicago, nor any of their employees, makes any +! warranty express or implied, or assumes any legal liability or responsibility +! for the accuracy, completeness, or usefulness of any information, apparatus, +! product, or process disclosed, or represents that its use would not infringe +! privately owned rights. +! +! + MODULE MPI_CONSTANTS + IMPLICIT NONE + + INTEGER MPI_SOURCE, MPI_TAG, MPI_ERROR + PARAMETER (MPI_SOURCE=3,MPI_TAG=4,MPI_ERROR=5) + INTEGER MPI_STATUS_SIZE + PARAMETER (MPI_STATUS_SIZE=5) + INTEGER MPI_STATUS_IGNORE(MPI_STATUS_SIZE) + INTEGER MPI_STATUSES_IGNORE(MPI_STATUS_SIZE,1) + INTEGER MPI_ERRCODES_IGNORE(1) + CHARACTER*1 MPI_ARGVS_NULL(1,1) + CHARACTER*1 MPI_ARGV_NULL(1) + INTEGER MPI_SUCCESS + PARAMETER (MPI_SUCCESS=0) + INTEGER MPI_ERR_OTHER + PARAMETER (MPI_ERR_OTHER=15) + INTEGER MPI_ERR_WIN + PARAMETER (MPI_ERR_WIN=45) + INTEGER MPI_ERR_FILE + PARAMETER (MPI_ERR_FILE=27) + INTEGER MPI_ERR_COUNT + PARAMETER (MPI_ERR_COUNT=2) + INTEGER MPI_ERR_SPAWN + PARAMETER (MPI_ERR_SPAWN=42) + INTEGER MPI_ERR_BASE + PARAMETER (MPI_ERR_BASE=46) + INTEGER MPI_ERR_RMA_CONFLICT + PARAMETER (MPI_ERR_RMA_CONFLICT=49) + INTEGER MPI_ERR_IN_STATUS + PARAMETER (MPI_ERR_IN_STATUS=17) + INTEGER MPI_ERR_INFO_KEY + PARAMETER (MPI_ERR_INFO_KEY=29) + INTEGER MPI_ERR_LOCKTYPE + PARAMETER (MPI_ERR_LOCKTYPE=47) + INTEGER MPI_ERR_OP + PARAMETER (MPI_ERR_OP=9) + INTEGER MPI_ERR_ARG + PARAMETER (MPI_ERR_ARG=12) + INTEGER MPI_ERR_READ_ONLY + PARAMETER (MPI_ERR_READ_ONLY=40) + INTEGER MPI_ERR_SIZE + PARAMETER (MPI_ERR_SIZE=51) + INTEGER MPI_ERR_BUFFER + PARAMETER (MPI_ERR_BUFFER=1) + INTEGER MPI_ERR_DUP_DATAREP + PARAMETER (MPI_ERR_DUP_DATAREP=24) + INTEGER MPI_ERR_UNSUPPORTED_DATAREP + PARAMETER (MPI_ERR_UNSUPPORTED_DATAREP=43) + INTEGER MPI_ERR_LASTCODE + PARAMETER (MPI_ERR_LASTCODE=1073741823) + INTEGER MPI_ERR_TRUNCATE + PARAMETER (MPI_ERR_TRUNCATE=14) + INTEGER MPI_ERR_DISP + PARAMETER (MPI_ERR_DISP=52) + INTEGER MPI_ERR_PORT + PARAMETER (MPI_ERR_PORT=38) + INTEGER MPI_ERR_INFO_NOKEY + PARAMETER (MPI_ERR_INFO_NOKEY=31) + INTEGER MPI_ERR_ASSERT + PARAMETER (MPI_ERR_ASSERT=53) + INTEGER MPI_ERR_FILE_EXISTS + PARAMETER (MPI_ERR_FILE_EXISTS=25) + INTEGER MPI_ERR_PENDING + PARAMETER (MPI_ERR_PENDING=18) + INTEGER MPI_ERR_COMM + PARAMETER (MPI_ERR_COMM=5) + INTEGER MPI_ERR_KEYVAL + PARAMETER (MPI_ERR_KEYVAL=48) + INTEGER MPI_ERR_NAME + PARAMETER (MPI_ERR_NAME=33) + INTEGER MPI_ERR_REQUEST + PARAMETER (MPI_ERR_REQUEST=19) + INTEGER MPI_ERR_GROUP + PARAMETER (MPI_ERR_GROUP=8) + INTEGER MPI_ERR_TOPOLOGY + PARAMETER (MPI_ERR_TOPOLOGY=10) + INTEGER MPI_ERR_TYPE + PARAMETER (MPI_ERR_TYPE=3) + INTEGER MPI_ERR_TAG + PARAMETER (MPI_ERR_TAG=4) + INTEGER MPI_ERR_INFO_VALUE + PARAMETER (MPI_ERR_INFO_VALUE=30) + INTEGER MPI_ERR_NOT_SAME + PARAMETER (MPI_ERR_NOT_SAME=35) + INTEGER MPI_ERR_RMA_SYNC + PARAMETER (MPI_ERR_RMA_SYNC=50) + INTEGER MPI_ERR_INFO + PARAMETER (MPI_ERR_INFO=28) + INTEGER MPI_ERR_NO_MEM + PARAMETER (MPI_ERR_NO_MEM=34) + INTEGER MPI_ERR_BAD_FILE + PARAMETER (MPI_ERR_BAD_FILE=22) + INTEGER MPI_ERR_FILE_IN_USE + PARAMETER (MPI_ERR_FILE_IN_USE=26) + INTEGER MPI_ERR_UNKNOWN + PARAMETER (MPI_ERR_UNKNOWN=13) + INTEGER MPI_ERR_UNSUPPORTED_OPERATION + PARAMETER (MPI_ERR_UNSUPPORTED_OPERATION=44) + INTEGER MPI_ERR_QUOTA + PARAMETER (MPI_ERR_QUOTA=39) + INTEGER MPI_ERR_AMODE + PARAMETER (MPI_ERR_AMODE=21) + INTEGER MPI_ERR_ROOT + PARAMETER (MPI_ERR_ROOT=7) + INTEGER MPI_ERR_RANK + PARAMETER (MPI_ERR_RANK=6) + INTEGER MPI_ERR_DIMS + PARAMETER (MPI_ERR_DIMS=11) + INTEGER MPI_ERR_NO_SUCH_FILE + PARAMETER (MPI_ERR_NO_SUCH_FILE=37) + INTEGER MPI_ERR_SERVICE + PARAMETER (MPI_ERR_SERVICE=41) + INTEGER MPI_ERR_INTERN + PARAMETER (MPI_ERR_INTERN=16) + INTEGER MPI_ERR_IO + PARAMETER (MPI_ERR_IO=32) + INTEGER MPI_ERR_ACCESS + PARAMETER (MPI_ERR_ACCESS=20) + INTEGER MPI_ERR_NO_SPACE + PARAMETER (MPI_ERR_NO_SPACE=36) + INTEGER MPI_ERR_CONVERSION + PARAMETER (MPI_ERR_CONVERSION=23) + INTEGER MPI_ERRORS_ARE_FATAL + PARAMETER (MPI_ERRORS_ARE_FATAL=1409286144) + INTEGER MPI_ERRORS_RETURN + PARAMETER (MPI_ERRORS_RETURN=1409286145) + INTEGER MPI_IDENT + PARAMETER (MPI_IDENT=0) + INTEGER MPI_CONGRUENT + PARAMETER (MPI_CONGRUENT=1) + INTEGER MPI_SIMILAR + PARAMETER (MPI_SIMILAR=2) + INTEGER MPI_UNEQUAL + PARAMETER (MPI_UNEQUAL=3) + INTEGER MPI_MAX + PARAMETER (MPI_MAX=1476395009) + INTEGER MPI_MIN + PARAMETER (MPI_MIN=1476395010) + INTEGER MPI_SUM + PARAMETER (MPI_SUM=1476395011) + INTEGER MPI_PROD + PARAMETER (MPI_PROD=1476395012) + INTEGER MPI_LAND + PARAMETER (MPI_LAND=1476395013) + INTEGER MPI_BAND + PARAMETER (MPI_BAND=1476395014) + INTEGER MPI_LOR + PARAMETER (MPI_LOR=1476395015) + INTEGER MPI_BOR + PARAMETER (MPI_BOR=1476395016) + INTEGER MPI_LXOR + PARAMETER (MPI_LXOR=1476395017) + INTEGER MPI_BXOR + PARAMETER (MPI_BXOR=1476395018) + INTEGER MPI_MINLOC + PARAMETER (MPI_MINLOC=1476395019) + INTEGER MPI_MAXLOC + PARAMETER (MPI_MAXLOC=1476395020) + INTEGER MPI_REPLACE + PARAMETER (MPI_REPLACE=1476395021) + INTEGER MPI_NO_OP + PARAMETER (MPI_NO_OP=1476395022) + INTEGER MPI_COMM_WORLD + PARAMETER (MPI_COMM_WORLD=1140850688) + INTEGER MPI_COMM_SELF + PARAMETER (MPI_COMM_SELF=1140850689) + INTEGER MPI_COMM_TYPE_SHARED + PARAMETER (MPI_COMM_TYPE_SHARED=1) + INTEGER MPI_GROUP_EMPTY + PARAMETER (MPI_GROUP_EMPTY=1207959552) + INTEGER MPI_COMM_NULL + PARAMETER (MPI_COMM_NULL=67108864) + INTEGER MPI_WIN_NULL + PARAMETER (MPI_WIN_NULL=536870912) + INTEGER MPI_FILE_NULL + PARAMETER (MPI_FILE_NULL=0) + INTEGER MPI_GROUP_NULL + PARAMETER (MPI_GROUP_NULL=134217728) + INTEGER MPI_OP_NULL + PARAMETER (MPI_OP_NULL=402653184) + INTEGER MPI_DATATYPE_NULL + PARAMETER (MPI_DATATYPE_NULL=z'0c000000') + INTEGER MPI_REQUEST_NULL + PARAMETER (MPI_REQUEST_NULL=738197504) + INTEGER MPI_ERRHANDLER_NULL + PARAMETER (MPI_ERRHANDLER_NULL=335544320) + INTEGER MPI_INFO_NULL + PARAMETER (MPI_INFO_NULL=469762048) + INTEGER MPI_MESSAGE_NULL + PARAMETER (MPI_MESSAGE_NULL=805306368) + INTEGER MPI_MESSAGE_NO_PROC + PARAMETER (MPI_MESSAGE_NO_PROC=1879048192) + INTEGER MPI_TAG_UB + PARAMETER (MPI_TAG_UB=1681915906) + INTEGER MPI_HOST + PARAMETER (MPI_HOST=1681915908) + INTEGER MPI_IO + PARAMETER (MPI_IO=1681915910) + INTEGER MPI_WTIME_IS_GLOBAL + PARAMETER (MPI_WTIME_IS_GLOBAL=1681915912) + INTEGER MPI_UNIVERSE_SIZE + PARAMETER (MPI_UNIVERSE_SIZE=1681915914) + INTEGER MPI_LASTUSEDCODE + PARAMETER (MPI_LASTUSEDCODE=1681915916) + INTEGER MPI_APPNUM + PARAMETER (MPI_APPNUM=1681915918) + INTEGER MPI_WIN_BASE + PARAMETER (MPI_WIN_BASE=1711276034) + INTEGER MPI_WIN_SIZE + PARAMETER (MPI_WIN_SIZE=1711276036) + INTEGER MPI_WIN_DISP_UNIT + PARAMETER (MPI_WIN_DISP_UNIT=1711276038) + INTEGER MPI_MAX_ERROR_STRING + PARAMETER (MPI_MAX_ERROR_STRING=511) + INTEGER MPI_MAX_PORT_NAME + PARAMETER (MPI_MAX_PORT_NAME=255) + INTEGER MPI_MAX_OBJECT_NAME + PARAMETER (MPI_MAX_OBJECT_NAME=127) + INTEGER MPI_MAX_INFO_KEY + PARAMETER (MPI_MAX_INFO_KEY=254) + INTEGER MPI_MAX_INFO_VAL + PARAMETER (MPI_MAX_INFO_VAL=1023) + INTEGER MPI_MAX_PROCESSOR_NAME + PARAMETER (MPI_MAX_PROCESSOR_NAME=128-1) + INTEGER MPI_MAX_DATAREP_STRING + PARAMETER (MPI_MAX_DATAREP_STRING=127) + INTEGER MPI_MAX_LIBRARY_VERSION_STRING + PARAMETER (MPI_MAX_LIBRARY_VERSION_STRING=64-1) + INTEGER MPI_UNDEFINED + PARAMETER (MPI_UNDEFINED=(-32766)) + INTEGER MPI_KEYVAL_INVALID + PARAMETER (MPI_KEYVAL_INVALID=603979776) + INTEGER MPI_BSEND_OVERHEAD + PARAMETER (MPI_BSEND_OVERHEAD=(95)) + INTEGER MPI_PROC_NULL + PARAMETER (MPI_PROC_NULL=-1) + INTEGER MPI_ANY_SOURCE + PARAMETER (MPI_ANY_SOURCE=-2) + INTEGER MPI_ANY_TAG + PARAMETER (MPI_ANY_TAG=-1) + INTEGER MPI_ROOT + PARAMETER (MPI_ROOT=-3) + INTEGER MPI_GRAPH + PARAMETER (MPI_GRAPH=1) + INTEGER MPI_CART + PARAMETER (MPI_CART=2) + INTEGER MPI_DIST_GRAPH + PARAMETER (MPI_DIST_GRAPH=3) + INTEGER MPI_VERSION + PARAMETER (MPI_VERSION=2) + INTEGER MPI_SUBVERSION + PARAMETER (MPI_SUBVERSION=0) + INTEGER MPI_LOCK_EXCLUSIVE + PARAMETER (MPI_LOCK_EXCLUSIVE=234) + INTEGER MPI_LOCK_SHARED + PARAMETER (MPI_LOCK_SHARED=235) + INTEGER MPI_CHAR + PARAMETER (MPI_CHAR=z'4c000101') + INTEGER MPI_UNSIGNED_CHAR + PARAMETER (MPI_UNSIGNED_CHAR=z'4c000102') + INTEGER MPI_SHORT + PARAMETER (MPI_SHORT=z'4c000203') + INTEGER MPI_UNSIGNED_SHORT + PARAMETER (MPI_UNSIGNED_SHORT=z'4c000204') + INTEGER MPI_INT + PARAMETER (MPI_INT=z'4c000405') + INTEGER MPI_UNSIGNED + PARAMETER (MPI_UNSIGNED=z'4c000406') + INTEGER MPI_LONG + PARAMETER (MPI_LONG=z'4c000407') + INTEGER MPI_UNSIGNED_LONG + PARAMETER (MPI_UNSIGNED_LONG=z'4c000408') + INTEGER MPI_LONG_LONG + PARAMETER (MPI_LONG_LONG=z'4c000809') + INTEGER MPI_LONG_LONG_INT + PARAMETER (MPI_LONG_LONG_INT=z'4c000809') + INTEGER MPI_FLOAT + PARAMETER (MPI_FLOAT=z'4c00040a') + INTEGER MPI_DOUBLE + PARAMETER (MPI_DOUBLE=z'4c00080b') + INTEGER MPI_LONG_DOUBLE + PARAMETER (MPI_LONG_DOUBLE=z'4c00080c') + INTEGER MPI_BYTE + PARAMETER (MPI_BYTE=z'4c00010d') + INTEGER MPI_WCHAR + PARAMETER (MPI_WCHAR=z'4c00020e') + INTEGER MPI_PACKED + PARAMETER (MPI_PACKED=z'4c00010f') + INTEGER MPI_LB + PARAMETER (MPI_LB=z'4c000010') + INTEGER MPI_UB + PARAMETER (MPI_UB=z'4c000011') + INTEGER MPI_2INT + PARAMETER (MPI_2INT=z'4c000816') + INTEGER MPI_SIGNED_CHAR + PARAMETER (MPI_SIGNED_CHAR=z'4c000118') + INTEGER MPI_UNSIGNED_LONG_LONG + PARAMETER (MPI_UNSIGNED_LONG_LONG=z'4c000819') + INTEGER MPI_CHARACTER + PARAMETER (MPI_CHARACTER=z'4c00011a') + INTEGER MPI_INTEGER + PARAMETER (MPI_INTEGER=z'4c00041b') + INTEGER MPI_REAL + PARAMETER (MPI_REAL=z'4c00041c') + INTEGER MPI_LOGICAL + PARAMETER (MPI_LOGICAL=z'4c00041d') + INTEGER MPI_COMPLEX + PARAMETER (MPI_COMPLEX=z'4c00081e') + INTEGER MPI_DOUBLE_PRECISION + PARAMETER (MPI_DOUBLE_PRECISION=z'4c00081f') + INTEGER MPI_2INTEGER + PARAMETER (MPI_2INTEGER=z'4c000820') + INTEGER MPI_2REAL + PARAMETER (MPI_2REAL=z'4c000821') + INTEGER MPI_DOUBLE_COMPLEX + PARAMETER (MPI_DOUBLE_COMPLEX=z'4c001022') + INTEGER MPI_2DOUBLE_PRECISION + PARAMETER (MPI_2DOUBLE_PRECISION=z'4c001023') + INTEGER MPI_2COMPLEX + PARAMETER (MPI_2COMPLEX=z'4c001024') + INTEGER MPI_2DOUBLE_COMPLEX + PARAMETER (MPI_2DOUBLE_COMPLEX=z'4c002025') + INTEGER MPI_REAL2 + PARAMETER (MPI_REAL2=z'0c000000') + INTEGER MPI_REAL4 + PARAMETER (MPI_REAL4=z'4c000427') + INTEGER MPI_COMPLEX8 + PARAMETER (MPI_COMPLEX8=z'4c000828') + INTEGER MPI_REAL8 + PARAMETER (MPI_REAL8=z'4c000829') + INTEGER MPI_COMPLEX16 + PARAMETER (MPI_COMPLEX16=z'4c00102a') + INTEGER MPI_REAL16 + PARAMETER (MPI_REAL16=z'0c000000') + INTEGER MPI_COMPLEX32 + PARAMETER (MPI_COMPLEX32=z'0c000000') + INTEGER MPI_INTEGER1 + PARAMETER (MPI_INTEGER1=z'4c00012d') + INTEGER MPI_COMPLEX4 + PARAMETER (MPI_COMPLEX4=z'0c000000') + INTEGER MPI_INTEGER2 + PARAMETER (MPI_INTEGER2=z'4c00022f') + INTEGER MPI_INTEGER4 + PARAMETER (MPI_INTEGER4=z'4c000430') + INTEGER MPI_INTEGER8 + PARAMETER (MPI_INTEGER8=z'4c000831') + INTEGER MPI_INTEGER16 + PARAMETER (MPI_INTEGER16=z'0c000000') + + INCLUDE 'mpifptr.h' + + INTEGER MPI_OFFSET + PARAMETER (MPI_OFFSET=z'4c00083c') + INTEGER MPI_COUNT + PARAMETER (MPI_COUNT=z'4c00083d') + INTEGER MPI_FLOAT_INT + PARAMETER (MPI_FLOAT_INT=z'8c000000') + INTEGER MPI_DOUBLE_INT + PARAMETER (MPI_DOUBLE_INT=z'8c000001') + INTEGER MPI_LONG_INT + PARAMETER (MPI_LONG_INT=z'8c000002') + INTEGER MPI_SHORT_INT + PARAMETER (MPI_SHORT_INT=z'8c000003') + INTEGER MPI_LONG_DOUBLE_INT + PARAMETER (MPI_LONG_DOUBLE_INT=z'8c000004') + INTEGER MPI_INTEGER_KIND + PARAMETER (MPI_INTEGER_KIND=4) + INTEGER MPI_OFFSET_KIND + PARAMETER (MPI_OFFSET_KIND=8) + INTEGER MPI_COUNT_KIND + PARAMETER (MPI_COUNT_KIND=8) + INTEGER MPI_COMBINER_NAMED + PARAMETER (MPI_COMBINER_NAMED=1) + INTEGER MPI_COMBINER_DUP + PARAMETER (MPI_COMBINER_DUP=2) + INTEGER MPI_COMBINER_CONTIGUOUS + PARAMETER (MPI_COMBINER_CONTIGUOUS=3) + INTEGER MPI_COMBINER_VECTOR + PARAMETER (MPI_COMBINER_VECTOR=4) + INTEGER MPI_COMBINER_HVECTOR_INTEGER + PARAMETER (MPI_COMBINER_HVECTOR_INTEGER=5) + INTEGER MPI_COMBINER_HVECTOR + PARAMETER (MPI_COMBINER_HVECTOR=6) + INTEGER MPI_COMBINER_INDEXED + PARAMETER (MPI_COMBINER_INDEXED=7) + INTEGER MPI_COMBINER_HINDEXED_INTEGER + PARAMETER (MPI_COMBINER_HINDEXED_INTEGER=8) + INTEGER MPI_COMBINER_HINDEXED + PARAMETER (MPI_COMBINER_HINDEXED=9) + INTEGER MPI_COMBINER_INDEXED_BLOCK + PARAMETER (MPI_COMBINER_INDEXED_BLOCK=10) + INTEGER MPI_COMBINER_STRUCT_INTEGER + PARAMETER (MPI_COMBINER_STRUCT_INTEGER=11) + INTEGER MPI_COMBINER_STRUCT + PARAMETER (MPI_COMBINER_STRUCT=12) + INTEGER MPI_COMBINER_SUBARRAY + PARAMETER (MPI_COMBINER_SUBARRAY=13) + INTEGER MPI_COMBINER_DARRAY + PARAMETER (MPI_COMBINER_DARRAY=14) + INTEGER MPI_COMBINER_F90_REAL + PARAMETER (MPI_COMBINER_F90_REAL=15) + INTEGER MPI_COMBINER_F90_COMPLEX + PARAMETER (MPI_COMBINER_F90_COMPLEX=16) + INTEGER MPI_COMBINER_F90_INTEGER + PARAMETER (MPI_COMBINER_F90_INTEGER=17) + INTEGER MPI_COMBINER_RESIZED + PARAMETER (MPI_COMBINER_RESIZED=18) + INTEGER MPI_COMBINER_HINDEXED_BLOCK + PARAMETER (MPI_COMBINER_HINDEXED_BLOCK=19) + INTEGER MPI_MODE_NOCHECK + PARAMETER (MPI_MODE_NOCHECK=1024) + INTEGER MPI_MODE_NOSTORE + PARAMETER (MPI_MODE_NOSTORE=2048) + INTEGER MPI_MODE_NOPUT + PARAMETER (MPI_MODE_NOPUT=4096) + INTEGER MPI_MODE_NOPRECEDE + PARAMETER (MPI_MODE_NOPRECEDE=8192) + INTEGER MPI_MODE_NOSUCCEED + PARAMETER (MPI_MODE_NOSUCCEED=16384) + INTEGER MPI_THREAD_SINGLE + PARAMETER (MPI_THREAD_SINGLE=0) + INTEGER MPI_THREAD_FUNNELED + PARAMETER (MPI_THREAD_FUNNELED=1) + INTEGER MPI_THREAD_SERIALIZED + PARAMETER (MPI_THREAD_SERIALIZED=2) + INTEGER MPI_THREAD_MULTIPLE + PARAMETER (MPI_THREAD_MULTIPLE=3) + INTEGER MPI_MODE_RDONLY + PARAMETER (MPI_MODE_RDONLY=2) + INTEGER MPI_MODE_RDWR + PARAMETER (MPI_MODE_RDWR=8) + INTEGER MPI_MODE_WRONLY + PARAMETER (MPI_MODE_WRONLY=4) + INTEGER MPI_MODE_DELETE_ON_CLOSE + PARAMETER (MPI_MODE_DELETE_ON_CLOSE=16) + INTEGER MPI_MODE_UNIQUE_OPEN + PARAMETER (MPI_MODE_UNIQUE_OPEN=32) + INTEGER MPI_MODE_CREATE + PARAMETER (MPI_MODE_CREATE=1) + INTEGER MPI_MODE_EXCL + PARAMETER (MPI_MODE_EXCL=64) + INTEGER MPI_MODE_APPEND + PARAMETER (MPI_MODE_APPEND=128) + INTEGER MPI_MODE_SEQUENTIAL + PARAMETER (MPI_MODE_SEQUENTIAL=256) + INTEGER MPI_SEEK_SET + PARAMETER (MPI_SEEK_SET=600) + INTEGER MPI_SEEK_CUR + PARAMETER (MPI_SEEK_CUR=602) + INTEGER MPI_SEEK_END + PARAMETER (MPI_SEEK_END=604) + INTEGER MPI_ORDER_C + PARAMETER (MPI_ORDER_C=56) + INTEGER MPI_ORDER_FORTRAN + PARAMETER (MPI_ORDER_FORTRAN=57) + INTEGER MPI_DISTRIBUTE_BLOCK + PARAMETER (MPI_DISTRIBUTE_BLOCK=121) + INTEGER MPI_DISTRIBUTE_CYCLIC + PARAMETER (MPI_DISTRIBUTE_CYCLIC=122) + INTEGER MPI_DISTRIBUTE_NONE + PARAMETER (MPI_DISTRIBUTE_NONE=123) + INTEGER MPI_DISTRIBUTE_DFLT_DARG + PARAMETER (MPI_DISTRIBUTE_DFLT_DARG=-49767) + INTEGER (KIND=8) MPI_DISPLACEMENT_CURRENT + PARAMETER (MPI_DISPLACEMENT_CURRENT=-54278278) + INTEGER MPI_BOTTOM, MPI_IN_PLACE + INTEGER MPI_UNWEIGHTED, MPI_WEIGHTS_EMPTY + + COMMON /MPIPRIV1/ MPI_BOTTOM, MPI_IN_PLACE, MPI_STATUS_IGNORE + + COMMON /MPIPRIV2/ MPI_STATUSES_IGNORE, MPI_ERRCODES_IGNORE +!DEC$ ATTRIBUTES DLLIMPORT :: /MPIPRIV1/, /MPIPRIV2/ + + COMMON /MPIFCMB5/ MPI_UNWEIGHTED + COMMON /MPIFCMB9/ MPI_WEIGHTS_EMPTY +!DEC$ ATTRIBUTES DLLIMPORT :: /MPIFCMB5/, /MPIFCMB9/ + + COMMON /MPIPRIVC/ MPI_ARGVS_NULL, MPI_ARGV_NULL +!DEC$ ATTRIBUTES DLLIMPORT :: /MPIPRIVC/ + + END MODULE MPI_CONSTANTS + + MODULE MPI_BASE + IMPLICIT NONE + INTERFACE + SUBROUTINE MPI_TYPE_CREATE_DARRAY(v0,v1,v2,v3,v4,v5,v6,v7,v8,v9,ierror) + INTEGER v0, v1, v2, v3(*), v4(*), v5(*), v6(*), v7, v8, v9 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_DARRAY + + SUBROUTINE MPI_COMM_FREE_KEYVAL(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_COMM_FREE_KEYVAL + + SUBROUTINE MPI_TYPE_EXTENT(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0 + INTEGER(KIND=MPI_ADDRESS_KIND) v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_EXTENT + + SUBROUTINE MPI_TYPE_GET_NAME(v0,v1,v2,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_NAME + + SUBROUTINE MPI_GROUP_INTERSECTION(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GROUP_INTERSECTION + + SUBROUTINE MPI_WIN_LOCK(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2, v3 + INTEGER ierror + END SUBROUTINE MPI_WIN_LOCK + + SUBROUTINE MPI_CARTDIM_GET(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_CARTDIM_GET + + SUBROUTINE MPI_WIN_GET_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_GET_ERRHANDLER + + SUBROUTINE MPI_COMM_SPLIT(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2, v3 + INTEGER ierror + END SUBROUTINE MPI_COMM_SPLIT + + SUBROUTINE MPI_COMM_SPLIT_TYPE(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2, v3, v4 + INTEGER ierror + END SUBROUTINE MPI_COMM_SPLIT_TYPE + + SUBROUTINE MPI_CANCEL(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_CANCEL + + SUBROUTINE MPI_WIN_POST(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_WIN_POST + + SUBROUTINE MPI_WIN_COMPLETE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_WIN_COMPLETE + + SUBROUTINE MPI_TEST_CANCELLED(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0(MPI_STATUS_SIZE) + LOGICAL v1 + INTEGER ierror + END SUBROUTINE MPI_TEST_CANCELLED + + SUBROUTINE MPI_GROUP_SIZE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_GROUP_SIZE + + SUBROUTINE MPI_ADD_ERROR_STRING(v0,v1,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER ierror + END SUBROUTINE MPI_ADD_ERROR_STRING + + SUBROUTINE MPI_PACK_SIZE(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2, v3 + INTEGER ierror + END SUBROUTINE MPI_PACK_SIZE + + SUBROUTINE MPI_GET_ELEMENTS(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0(MPI_STATUS_SIZE), v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GET_ELEMENTS + + SUBROUTINE MPI_GET_ELEMENTS_X(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE,MPI_COUNT_KIND + INTEGER v0(MPI_STATUS_SIZE), v1 + INTEGER(KIND=MPI_COUNT_KIND) v2 + INTEGER ierror + END SUBROUTINE MPI_GET_ELEMENTS_X + + SUBROUTINE MPI_ERRHANDLER_GET(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_ERRHANDLER_GET + + SUBROUTINE MPI_FILE_GET_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_FILE_GET_ERRHANDLER + + SUBROUTINE MPI_TYPE_LB(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0 + INTEGER(KIND=MPI_ADDRESS_KIND) v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_LB + + SUBROUTINE MPI_REQUEST_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_REQUEST_FREE + + SUBROUTINE MPI_GROUP_RANGE_INCL(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2(3,*), v3 + INTEGER ierror + END SUBROUTINE MPI_GROUP_RANGE_INCL + + SUBROUTINE MPI_TYPE_GET_TRUE_EXTENT(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0 + INTEGER(KIND=MPI_ADDRESS_KIND) v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_TRUE_EXTENT + + SUBROUTINE MPI_TYPE_GET_TRUE_EXTENT_X(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_COUNT_KIND + INTEGER v0 + INTEGER(KIND=MPI_COUNT_KIND) v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_TRUE_EXTENT_X + + SUBROUTINE MPI_BARRIER(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_BARRIER + + SUBROUTINE MPI_IS_THREAD_MAIN(v0,ierror) + LOGICAL v0 + INTEGER ierror + END SUBROUTINE MPI_IS_THREAD_MAIN + + SUBROUTINE MPI_WIN_FREE_KEYVAL(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_WIN_FREE_KEYVAL + + SUBROUTINE MPI_TYPE_COMMIT(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_TYPE_COMMIT + + SUBROUTINE MPI_GROUP_RANGE_EXCL(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2(3,*), v3 + INTEGER ierror + END SUBROUTINE MPI_GROUP_RANGE_EXCL + + SUBROUTINE MPI_REQUEST_GET_STATUS(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0 + LOGICAL v1 + INTEGER v2(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_REQUEST_GET_STATUS + + SUBROUTINE MPI_QUERY_THREAD(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_QUERY_THREAD + + SUBROUTINE MPI_ERRHANDLER_CREATE(v0,v1,ierror) + INTERFACE + SUBROUTINE v0(vv0,vv1) + INTEGER vv0,vv1 + END SUBROUTINE + END INTERFACE + INTEGER v1 + INTEGER ierror + END SUBROUTINE MPI_ERRHANDLER_CREATE + + SUBROUTINE MPI_COMM_SPAWN_MULTIPLE(v0,v1,v2,v3,v4,v5,v6,v7,v8,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1(*), v2(v0,*) + INTEGER v3(*), v4(*), v5, v6, v7, v8(*) + INTEGER ierror + END SUBROUTINE MPI_COMM_SPAWN_MULTIPLE + + SUBROUTINE MPI_COMM_REMOTE_GROUP(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_REMOTE_GROUP + + SUBROUTINE MPI_TYPE_GET_EXTENT(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0 + INTEGER(KIND=MPI_ADDRESS_KIND) v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_EXTENT + + SUBROUTINE MPI_TYPE_GET_EXTENT_X(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_COUNT_KIND + INTEGER v0 + INTEGER(KIND=MPI_COUNT_KIND) v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_EXTENT_X + + SUBROUTINE MPI_COMM_COMPARE(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_COMM_COMPARE + + SUBROUTINE MPI_INFO_GET_VALUELEN(v0,v1,v2,v3,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER v2 + LOGICAL v3 + INTEGER ierror + END SUBROUTINE MPI_INFO_GET_VALUELEN + + SUBROUTINE MPI_INFO_GET(v0,v1,v2,v3,v4,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER v2 + CHARACTER (LEN=*) v3 + LOGICAL v4 + INTEGER ierror + END SUBROUTINE MPI_INFO_GET + + SUBROUTINE MPI_OP_COMMUTATIVE(v0,v1,ierror) + INTEGER v0 + LOGICAL v1 + INTEGER ierror + END SUBROUTINE MPI_OP_COMMUTATIVE + + SUBROUTINE MPI_OP_CREATE(v0,v1,v2,ierror) + EXTERNAL v0 + LOGICAL v1 + INTEGER v2 + INTEGER ierror + END SUBROUTINE MPI_OP_CREATE + + SUBROUTINE MPI_TYPE_CREATE_STRUCT(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0, v1(*) + INTEGER(KIND=MPI_ADDRESS_KIND) v2(*) + INTEGER v3(*), v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_STRUCT + + SUBROUTINE MPI_TYPE_VECTOR(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2, v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_VECTOR + + SUBROUTINE MPI_WIN_GET_GROUP(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_GET_GROUP + + SUBROUTINE MPI_GROUP_COMPARE(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GROUP_COMPARE + + SUBROUTINE MPI_CART_SHIFT(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2, v3, v4 + INTEGER ierror + END SUBROUTINE MPI_CART_SHIFT + + SUBROUTINE MPI_WIN_SET_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_SET_ERRHANDLER + + SUBROUTINE MPI_COMM_SPAWN(v0,v1,v2,v3,v4,v5,v6,v7,ierror) + CHARACTER (LEN=*) v0, v1(*) + INTEGER v2, v3, v4, v5, v6, v7(*) + INTEGER ierror + END SUBROUTINE MPI_COMM_SPAWN + + SUBROUTINE MPI_COMM_GROUP(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_GROUP + + SUBROUTINE MPI_WIN_CALL_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_CALL_ERRHANDLER + + SUBROUTINE MPI_LOOKUP_NAME(v0,v1,v2,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1 + CHARACTER (LEN=*) v2 + INTEGER ierror + END SUBROUTINE MPI_LOOKUP_NAME + + SUBROUTINE MPI_INFO_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_INFO_FREE + + SUBROUTINE MPI_COMM_SET_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_SET_ERRHANDLER + + SUBROUTINE MPI_GRAPH_GET(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2, v3(*), v4(*) + INTEGER ierror + END SUBROUTINE MPI_GRAPH_GET + + SUBROUTINE MPI_GROUP_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_GROUP_FREE + + SUBROUTINE MPI_STATUS_SET_ELEMENTS(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0(MPI_STATUS_SIZE), v1, v2 + INTEGER ierror + END SUBROUTINE MPI_STATUS_SET_ELEMENTS + + SUBROUTINE MPI_STATUS_SET_ELEMENTS_X(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE,MPI_COUNT_KIND + INTEGER v0(MPI_STATUS_SIZE), v1 + INTEGER(KIND=MPI_COUNT_KIND) v2 + INTEGER ierror + END SUBROUTINE MPI_STATUS_SET_ELEMENTS_X + + SUBROUTINE MPI_WIN_TEST(v0,v1,ierror) + INTEGER v0 + LOGICAL v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_TEST + + SUBROUTINE MPI_WIN_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_WIN_FREE + + SUBROUTINE MPI_GRAPH_MAP(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2(*), v3(*), v4 + INTEGER ierror + END SUBROUTINE MPI_GRAPH_MAP + + SUBROUTINE MPI_DIST_GRAPH_NEIGHBORS_COUNT(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2 + LOGICAL v3 + INTEGER ierror + END SUBROUTINE MPI_DIST_GRAPH_NEIGHBORS_COUNT + + SUBROUTINE MPI_PACK_EXTERNAL_SIZE(v0,v1,v2,v3,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + CHARACTER (LEN=*) v0 + INTEGER v1, v2 + INTEGER(KIND=MPI_ADDRESS_KIND) v3 + INTEGER ierror + END SUBROUTINE MPI_PACK_EXTERNAL_SIZE + + SUBROUTINE MPI_PUBLISH_NAME(v0,v1,v2,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1 + CHARACTER (LEN=*) v2 + INTEGER ierror + END SUBROUTINE MPI_PUBLISH_NAME + + SUBROUTINE MPI_TYPE_CREATE_F90_REAL(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_F90_REAL + + SUBROUTINE MPI_OPEN_PORT(v0,v1,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER ierror + END SUBROUTINE MPI_OPEN_PORT + + SUBROUTINE MPI_GROUP_UNION(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GROUP_UNION + + SUBROUTINE MPI_COMM_ACCEPT(v0,v1,v2,v3,v4,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1, v2, v3, v4 + INTEGER ierror + END SUBROUTINE MPI_COMM_ACCEPT + + SUBROUTINE MPI_FILE_CREATE_ERRHANDLER(v0,v1,ierror) + INTERFACE + SUBROUTINE v0(vv0,vv1) + INTEGER vv0,vv1 + END SUBROUTINE + END INTERFACE + INTEGER v1 + INTEGER ierror + END SUBROUTINE MPI_FILE_CREATE_ERRHANDLER + + SUBROUTINE MPI_WIN_GET_NAME(v0,v1,v2,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER v2 + INTEGER ierror + END SUBROUTINE MPI_WIN_GET_NAME + + SUBROUTINE MPI_INFO_CREATE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_INFO_CREATE + + SUBROUTINE MPI_TYPE_CREATE_F90_INTEGER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_F90_INTEGER + + SUBROUTINE MPI_TYPE_SET_NAME(v0,v1,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_SET_NAME + + SUBROUTINE MPI_ATTR_DELETE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_ATTR_DELETE + + SUBROUTINE MPI_GROUP_INCL(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2(*), v3 + INTEGER ierror + END SUBROUTINE MPI_GROUP_INCL + + SUBROUTINE MPI_COMM_CREATE_ERRHANDLER(v0,v1,ierror) + INTERFACE + SUBROUTINE v0(vv0,vv1) + INTEGER vv0,vv1 + END SUBROUTINE + END INTERFACE + INTEGER v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_CREATE_ERRHANDLER + + SUBROUTINE MPI_COMM_CONNECT(v0,v1,v2,v3,v4,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1, v2, v3, v4 + INTEGER ierror + END SUBROUTINE MPI_COMM_CONNECT + + SUBROUTINE MPI_ERROR_STRING(v0,v1,v2,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER v2 + INTEGER ierror + END SUBROUTINE MPI_ERROR_STRING + + SUBROUTINE MPI_TYPE_GET_CONTENTS(v0,v1,v2,v3,v4,v5,v6,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0, v1, v2, v3, v4(*) + INTEGER(KIND=MPI_ADDRESS_KIND) v5(*) + INTEGER v6(*) + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_CONTENTS + + SUBROUTINE MPI_TYPE_STRUCT(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1(*), v2(*), v3(*), v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_STRUCT + + SUBROUTINE MPI_TYPE_CREATE_INDEXED_BLOCK(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2(*), v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_INDEXED_BLOCK + + SUBROUTINE MPI_TYPE_CREATE_HVECTOR(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0, v1 + INTEGER(KIND=MPI_ADDRESS_KIND) v2 + INTEGER v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_HVECTOR + + SUBROUTINE MPI_TYPE_FREE_KEYVAL(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_TYPE_FREE_KEYVAL + + SUBROUTINE MPI_START(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_START + + SUBROUTINE MPI_ABORT(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_ABORT + + SUBROUTINE MPI_INTERCOMM_CREATE(v0,v1,v2,v3,v4,v5,ierror) + INTEGER v0, v1, v2, v3, v4, v5 + INTEGER ierror + END SUBROUTINE MPI_INTERCOMM_CREATE + + SUBROUTINE MPI_COMM_RANK(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_RANK + + SUBROUTINE MPI_COMM_GET_PARENT(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_COMM_GET_PARENT + + SUBROUTINE MPI_FINALIZED(v0,ierror) + LOGICAL v0 + INTEGER ierror + END SUBROUTINE MPI_FINALIZED + + SUBROUTINE MPI_INTERCOMM_MERGE(v0,v1,v2,ierror) + INTEGER v0 + LOGICAL v1 + INTEGER v2 + INTEGER ierror + END SUBROUTINE MPI_INTERCOMM_MERGE + + SUBROUTINE MPI_INFO_GET_NTHKEY(v0,v1,v2,ierror) + INTEGER v0, v1 + CHARACTER (LEN=*) v2 + INTEGER ierror + END SUBROUTINE MPI_INFO_GET_NTHKEY + + SUBROUTINE MPI_TYPE_MATCH_SIZE(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_MATCH_SIZE + + SUBROUTINE MPI_STATUS_SET_CANCELLED(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0(MPI_STATUS_SIZE), v1 + INTEGER ierror + END SUBROUTINE MPI_STATUS_SET_CANCELLED + + SUBROUTINE MPI_FILE_SET_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_FILE_SET_ERRHANDLER + + SUBROUTINE MPI_INFO_DELETE(v0,v1,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER ierror + END SUBROUTINE MPI_INFO_DELETE + + SUBROUTINE MPI_UNPUBLISH_NAME(v0,v1,v2,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1 + CHARACTER (LEN=*) v2 + INTEGER ierror + END SUBROUTINE MPI_UNPUBLISH_NAME + + SUBROUTINE MPI_TYPE_CONTIGUOUS(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CONTIGUOUS + + SUBROUTINE MPI_INITIALIZED(v0,ierror) + LOGICAL v0 + INTEGER ierror + END SUBROUTINE MPI_INITIALIZED + + SUBROUTINE MPI_TYPE_CREATE_RESIZED(v0,v1,v2,v3,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0 + INTEGER(KIND=MPI_ADDRESS_KIND) v1, v2 + INTEGER v3 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_RESIZED + + SUBROUTINE MPI_TYPE_UB(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0 + INTEGER(KIND=MPI_ADDRESS_KIND) v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_UB + + SUBROUTINE MPI_INFO_DUP(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_INFO_DUP + + SUBROUTINE MPI_TYPE_DUP(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_DUP + + SUBROUTINE MPI_ERRHANDLER_SET(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_ERRHANDLER_SET + + SUBROUTINE MPI_WIN_DELETE_ATTR(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_DELETE_ATTR + + SUBROUTINE MPI_INFO_GET_NKEYS(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_INFO_GET_NKEYS + + SUBROUTINE MPI_GROUP_EXCL(v0,v1,v2,v3,ierror) + INTEGER v0, v1, v2(*), v3 + INTEGER ierror + END SUBROUTINE MPI_GROUP_EXCL + + SUBROUTINE MPI_INFO_SET(v0,v1,v2,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1, v2 + INTEGER ierror + END SUBROUTINE MPI_INFO_SET + + SUBROUTINE MPI_WAIT(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0, v1(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_WAIT + + SUBROUTINE MPI_COMM_DELETE_ATTR(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_DELETE_ATTR + + SUBROUTINE MPI_COMM_GET_NAME(v0,v1,v2,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER v2 + INTEGER ierror + END SUBROUTINE MPI_COMM_GET_NAME + + SUBROUTINE MPI_TEST(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0 + LOGICAL v1 + INTEGER v2(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_TEST + + SUBROUTINE MPI_GET_COUNT(v0,v1,v2,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0(MPI_STATUS_SIZE), v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GET_COUNT + + SUBROUTINE MPI_ADD_ERROR_CLASS(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_ADD_ERROR_CLASS + + SUBROUTINE MPI_COMM_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_COMM_FREE + + SUBROUTINE MPI_COMM_SET_NAME(v0,v1,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_SET_NAME + + SUBROUTINE MPI_COMM_DISCONNECT(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_COMM_DISCONNECT + + SUBROUTINE MPI_IPROBE(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0, v1, v2 + LOGICAL v3 + INTEGER v4(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_IPROBE + + SUBROUTINE MPI_IMPROBE(v0,v1,v2,v3,v4,v5,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0, v1, v2, v3, v4 + INTEGER v5(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_IMPROBE + + SUBROUTINE MPI_MPROBE(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0, v1, v2, v3 + INTEGER v4(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_MPROBE + + SUBROUTINE MPI_ADD_ERROR_CODE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_ADD_ERROR_CODE + + SUBROUTINE MPI_COMM_GET_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_GET_ERRHANDLER + + SUBROUTINE MPI_COMM_CREATE(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_COMM_CREATE + + SUBROUTINE MPI_OP_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_OP_FREE + + SUBROUTINE MPI_TOPO_TEST(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_TOPO_TEST + + SUBROUTINE MPI_GET_PROCESSOR_NAME(v0,v1,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1 + INTEGER ierror + END SUBROUTINE MPI_GET_PROCESSOR_NAME + + SUBROUTINE MPI_COMM_SIZE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_SIZE + + SUBROUTINE MPI_WIN_UNLOCK(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_UNLOCK + + SUBROUTINE MPI_WIN_FLUSH(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_FLUSH + + SUBROUTINE MPI_WIN_FLUSH_LOCAL(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_FLUSH_LOCAL + + SUBROUTINE MPI_ERRHANDLER_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_ERRHANDLER_FREE + + SUBROUTINE MPI_COMM_REMOTE_SIZE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_REMOTE_SIZE + + SUBROUTINE MPI_PROBE(v0,v1,v2,v3,ierror) + USE MPI_CONSTANTS,ONLY:MPI_STATUS_SIZE + INTEGER v0, v1, v2, v3(MPI_STATUS_SIZE) + INTEGER ierror + END SUBROUTINE MPI_PROBE + + SUBROUTINE MPI_TYPE_HINDEXED(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1(*), v2(*), v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_HINDEXED + + SUBROUTINE MPI_WIN_WAIT(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_WIN_WAIT + + SUBROUTINE MPI_WIN_SET_NAME(v0,v1,ierror) + INTEGER v0 + CHARACTER (LEN=*) v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_SET_NAME + + SUBROUTINE MPI_TYPE_SIZE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_SIZE + + SUBROUTINE MPI_TYPE_SIZE_X(v0,v1,ierror) + USE MPI_CONSTANTS,ONLY:MPI_COUNT_KIND + INTEGER v0 + INTEGER(KIND=MPI_COUNT_KIND) v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_SIZE_X + + SUBROUTINE MPI_TYPE_CREATE_SUBARRAY(v0,v1,v2,v3,v4,v5,v6,ierror) + INTEGER v0, v1(*), v2(*), v3(*), v4, v5, v6 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_SUBARRAY + + SUBROUTINE MPI_WIN_CREATE_ERRHANDLER(v0,v1,ierror) + INTERFACE + SUBROUTINE v0(vv0,vv1) + INTEGER vv0,vv1 + END SUBROUTINE + END INTERFACE + INTEGER v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_CREATE_ERRHANDLER + + SUBROUTINE MPI_WIN_START(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_WIN_START + + SUBROUTINE MPI_TYPE_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_TYPE_FREE + + SUBROUTINE MPI_WIN_FENCE(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_WIN_FENCE + + SUBROUTINE MPI_GRAPHDIMS_GET(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GRAPHDIMS_GET + + SUBROUTINE MPI_FILE_CALL_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_FILE_CALL_ERRHANDLER + + SUBROUTINE MPI_TYPE_GET_ENVELOPE(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1, v2, v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_GET_ENVELOPE + + SUBROUTINE MPI_TYPE_DELETE_ATTR(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_TYPE_DELETE_ATTR + + SUBROUTINE MPI_TYPE_CREATE_HINDEXED(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0, v1(*) + INTEGER(KIND=MPI_ADDRESS_KIND) v2(*) + INTEGER v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_HINDEXED + + SUBROUTINE MPI_TYPE_CREATE_HINDEXED_BLOCK(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0, v1 + INTEGER(KIND=MPI_ADDRESS_KIND) v2(*) + INTEGER v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_HINDEXED_BLOCK + + SUBROUTINE MPI_TYPE_INDEXED(v0,v1,v2,v3,v4,ierror) + INTEGER v0, v1(*), v2(*), v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_INDEXED + + SUBROUTINE MPI_GREQUEST_COMPLETE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_GREQUEST_COMPLETE + + SUBROUTINE MPI_GRAPH_NEIGHBORS_COUNT(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GRAPH_NEIGHBORS_COUNT + + SUBROUTINE MPI_GET_VERSION(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_GET_VERSION + + SUBROUTINE MPI_GET_LIBRARY_VERSION(v0,v1,ierror) + CHARACTER (LEN=*) v0 + INTEGER v1 + INTEGER ierror + END SUBROUTINE MPI_GET_LIBRARY_VERSION + + SUBROUTINE MSMPI_GET_BSEND_OVERHEAD(size) + INTEGER size + END SUBROUTINE MSMPI_GET_BSEND_OVERHEAD + + SUBROUTINE MSMPI_GET_VERSION(version) + INTEGER version + END SUBROUTINE MSMPI_GET_VERSION + + SUBROUTINE MPI_TYPE_HVECTOR(v0,v1,v2,v3,v4,ierror) + USE MPI_CONSTANTS,ONLY:MPI_ADDRESS_KIND + INTEGER v0, v1 + INTEGER(KIND=MPI_ADDRESS_KIND) v2 + INTEGER v3, v4 + INTEGER ierror + END SUBROUTINE MPI_TYPE_HVECTOR + + SUBROUTINE MPI_KEYVAL_FREE(v0,ierror) + INTEGER v0 + INTEGER ierror + END SUBROUTINE MPI_KEYVAL_FREE + + SUBROUTINE MPI_COMM_CALL_ERRHANDLER(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_CALL_ERRHANDLER + + SUBROUTINE MPI_COMM_JOIN(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_JOIN + + SUBROUTINE MPI_COMM_TEST_INTER(v0,v1,ierror) + INTEGER v0 + LOGICAL v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_TEST_INTER + + SUBROUTINE MPI_CLOSE_PORT(v0,ierror) + CHARACTER (LEN=*) v0 + INTEGER ierror + END SUBROUTINE MPI_CLOSE_PORT + + SUBROUTINE MPI_TYPE_CREATE_F90_COMPLEX(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_TYPE_CREATE_F90_COMPLEX + + SUBROUTINE MPI_GROUP_DIFFERENCE(v0,v1,v2,ierror) + INTEGER v0, v1, v2 + INTEGER ierror + END SUBROUTINE MPI_GROUP_DIFFERENCE + + SUBROUTINE MPI_COMM_DUP(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_COMM_DUP + + SUBROUTINE MPI_ERROR_CLASS(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_ERROR_CLASS + + SUBROUTINE MPI_GROUP_RANK(v0,v1,ierror) + INTEGER v0, v1 + INTEGER ierror + END SUBROUTINE MPI_GROUP_RANK + + + SUBROUTINE MPI_INIT(ierror) + INTEGER ierror + END SUBROUTINE MPI_INIT + + SUBROUTINE MPI_INIT_THREAD(v0,v1,ierror) + INTEGER v0, v1, ierror + END SUBROUTINE MPI_INIT_THREAD + + FUNCTION MPI_WTIME() + DOUBLE PRECISION MPI_WTIME + END FUNCTION MPI_WTIME + + FUNCTION MPI_WTICK() + DOUBLE PRECISION MPI_WTICK + END FUNCTION MPI_WTICK + + FUNCTION PMPI_WTIME() + DOUBLE PRECISION PMPI_WTIME + END FUNCTION PMPI_WTIME + + FUNCTION PMPI_WTICK() + DOUBLE PRECISION PMPI_WTICK + END FUNCTION PMPI_WTICK + + SUBROUTINE MPI_NULL_DELETE_FN(a,b,c,d,e) + INTEGER a,b,c,d,e + END SUBROUTINE MPI_NULL_DELETE_FN + + SUBROUTINE MPI_DUP_FN(a,b,c,d,e,f,g) + INTEGER a,b,c,d,e,g + LOGICAL f + END SUBROUTINE MPI_DUP_FN + + SUBROUTINE MPI_NULL_COPY_FN(a,b,c,d,e,f,g) + INTEGER a,b,c,d,e,g + LOGICAL f + END SUBROUTINE MPI_NULL_COPY_FN + + SUBROUTINE MPI_COMM_NULL_DELETE_FN(a,b,c,d,e) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,e + INTEGER (KIND=MPI_ADDRESS_KIND) c, d + END SUBROUTINE MPI_COMM_NULL_DELETE_FN + + SUBROUTINE MPI_COMM_DUP_FN(a,b,c,d,e,f,g) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,g + INTEGER (KIND=MPI_ADDRESS_KIND) c,d,e + LOGICAL f + END SUBROUTINE MPI_COMM_DUP_FN + + SUBROUTINE MPI_COMM_NULL_COPY_FN(a,b,c,d,e,f,g) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,g + INTEGER (KIND=MPI_ADDRESS_KIND) c,d,e + LOGICAL f + END SUBROUTINE MPI_COMM_NULL_COPY_FN + + SUBROUTINE MPI_TYPE_NULL_DELETE_FN(a,b,c,d,e) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,e + INTEGER (KIND=MPI_ADDRESS_KIND) c, d + END SUBROUTINE MPI_TYPE_NULL_DELETE_FN + + SUBROUTINE MPI_TYPE_DUP_FN(a,b,c,d,e,f,g) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,g + INTEGER (KIND=MPI_ADDRESS_KIND) c,d,e + LOGICAL f + END SUBROUTINE MPI_TYPE_DUP_FN + + SUBROUTINE MPI_TYPE_NULL_COPY_FN(a,b,c,d,e,f,g) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,g + INTEGER (KIND=MPI_ADDRESS_KIND) c,d,e + LOGICAL f + END SUBROUTINE MPI_TYPE_NULL_COPY_FN + + SUBROUTINE MPI_WIN_NULL_DELETE_FN(a,b,c,d,e) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,e + INTEGER (KIND=MPI_ADDRESS_KIND) c, d + END SUBROUTINE MPI_WIN_NULL_DELETE_FN + + SUBROUTINE MPI_WIN_DUP_FN(a,b,c,d,e,f,g) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,g + INTEGER (KIND=MPI_ADDRESS_KIND) c,d,e + LOGICAL f + END SUBROUTINE MPI_WIN_DUP_FN + + SUBROUTINE MPI_WIN_NULL_COPY_FN(a,b,c,d,e,f,g) + USE MPI_CONSTANTS,ONLY: MPI_ADDRESS_KIND + INTEGER a,b,g + INTEGER (KIND=MPI_ADDRESS_KIND) c,d,e + LOGICAL f + END SUBROUTINE MPI_WIN_NULL_COPY_FN + + END INTERFACE + END MODULE MPI_BASE + + MODULE MPI_SIZEOFS +! This module contains the definitions for MPI_SIZEOF for the +! predefined, named types in Fortran 90. This is provided +! as a separate module to allow MPI_SIZEOF to supply the +! basic size information even when we do not provide the +! arbitrary choice types + IMPLICIT NONE + + PUBLIC :: MPI_SIZEOF + INTERFACE MPI_SIZEOF + MODULE PROCEDURE MPI_SIZEOF_I, MPI_SIZEOF_R, & + & MPI_SIZEOF_L, MPI_SIZEOF_CH, MPI_SIZEOF_CX,& + & MPI_SIZEOF_IV, MPI_SIZEOF_RV, & + & MPI_SIZEOF_LV, MPI_SIZEOF_CHV, MPI_SIZEOF_CXV + MODULE PROCEDURE MPI_SIZEOF_D, MPI_SIZEOF_DV + END INTERFACE ! MPI_SIZEOF + + CONTAINS + + SUBROUTINE MPI_SIZEOF_I( X, SIZE, IERROR ) + INTEGER X + INTEGER SIZE, IERROR + SIZE = 4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_I + + SUBROUTINE MPI_SIZEOF_R( X, SIZE, IERROR ) + REAL X + INTEGER SIZE, IERROR + SIZE = 4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_R + +! If reals and doubles have been forced to the same size (e.g., with +! -i8 -r8 to compilers like g95), then the compiler may refuse to +! allow interfaces that use real and double precision (failing to +! determine which one is intended) + SUBROUTINE MPI_SIZEOF_D( X, SIZE, IERROR ) + DOUBLE PRECISION X + INTEGER SIZE, IERROR + SIZE = 8 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_D + + SUBROUTINE MPI_SIZEOF_L( X, SIZE, IERROR ) + LOGICAL X + INTEGER SIZE, IERROR + SIZE = 4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_L + + SUBROUTINE MPI_SIZEOF_CH( X, SIZE, IERROR ) + CHARACTER X + INTEGER SIZE, IERROR + SIZE = 1 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_CH + + SUBROUTINE MPI_SIZEOF_CX( X, SIZE, IERROR ) + COMPLEX X + INTEGER SIZE, IERROR + SIZE = 2*4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_CX + + SUBROUTINE MPI_SIZEOF_IV( X, SIZE, IERROR ) + INTEGER X(*) + INTEGER SIZE, IERROR + SIZE = 4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_IV + + SUBROUTINE MPI_SIZEOF_RV( X, SIZE, IERROR ) + REAL X(*) + INTEGER SIZE, IERROR + SIZE = 4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_RV + +! If reals and doubles have been forced to the same size (e.g., with +! -i8 -r8 to compilers like g95), then the compiler may refuse to +! allow interfaces that use real and double precision (failing to +! determine which one is intended) + SUBROUTINE MPI_SIZEOF_DV( X, SIZE, IERROR ) + DOUBLE PRECISION X(*) + INTEGER SIZE, IERROR + SIZE = 8 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_DV + + SUBROUTINE MPI_SIZEOF_LV( X, SIZE, IERROR ) + LOGICAL X(*) + INTEGER SIZE, IERROR + SIZE = 4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_LV + + SUBROUTINE MPI_SIZEOF_CHV( X, SIZE, IERROR ) + CHARACTER X(*) + INTEGER SIZE, IERROR + SIZE = 1 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_CHV + + SUBROUTINE MPI_SIZEOF_CXV( X, SIZE, IERROR ) + COMPLEX X(*) + INTEGER SIZE, IERROR + SIZE = 2*4 + IERROR = 0 + END SUBROUTINE MPI_SIZEOF_CXV + +! We don't include double complex. If we did, we'd need to include the +! same hack as for real and double above if the compiler has been forced +! to make them the same size. + END MODULE MPI_SIZEOFS + + MODULE MPI + USE MPI_CONSTANTS + USE MPI_SIZEOFS + USE MPI_BASE + END MODULE MPI diff --git a/src/include/mpi.h b/src/include/mpi.h new file mode 100644 index 0000000..b1956a3 --- /dev/null +++ b/src/include/mpi.h @@ -0,0 +1,7005 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + * + * (C) 2001 by Argonne National Laboratory. + * (C) 2015 by Microsoft Corporation. + * + * MPICH COPYRIGHT + * + * The following is a notice of limited availability of the code, and disclaimer + * which must be included in the prologue of the code and in all source listings + * of the code. + * + * Copyright Notice + * + 2002 University of Chicago + * + * Permission is hereby granted to use, reproduce, prepare derivative works, and + * to redistribute to others. This software was authored by: + * + * Mathematics and Computer Science Division + * Argonne National Laboratory, Argonne IL 60439 + * + * (and) + * + * Department of Computer Science + * University of Illinois at Urbana-Champaign + * + * + * GOVERNMENT LICENSE + * + * Portions of this material resulted from work developed under a U.S. + * Government Contract and are subject to the following license: the Government + * is granted for itself and others acting on its behalf a paid-up, nonexclusive, + * irrevocable worldwide license in this computer software to reproduce, prepare + * derivative works, and perform publicly and display publicly. + * + * DISCLAIMER + * + * This computer code material was prepared, in part, as an account of work + * sponsored by an agency of the United States Government. Neither the United + * States, nor the University of Chicago, nor any of their employees, makes any + * warranty express or implied, or assumes any legal liability or responsibility + * for the accuracy, completeness, or usefulness of any information, apparatus, + * product, or process disclosed, or represents that its use would not infringe + * privately owned rights. + * + */ + +#ifndef MPI_INCLUDED +#define MPI_INCLUDED + +#include +#ifndef MSMPI_NO_SAL +#include +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + + +#ifndef MSMPI_VER +#define MSMPI_VER 0x100 +#endif + + +/*---------------------------------------------------------------------------*/ +/* SAL ANNOTATIONS */ +/*---------------------------------------------------------------------------*/ +/* + * Define SAL annotations if they aren't defined yet. + */ +#ifndef _Success_ +#define _Success_( x ) +#endif +#ifndef _Notref_ +#define _Notref_ +#endif +#ifndef _When_ +#define _When_( x, y ) +#endif +#ifndef _Pre_valid_ +#define _Pre_valid_ +#endif +#ifndef _Pre_opt_valid_ +#define _Pre_opt_valid_ +#endif +#ifndef _Post_invalid_ +#define _Post_invalid_ +#endif +#ifndef _In_ +#define _In_ +#endif +#ifndef _In_z_ +#define _In_z_ +#endif +#ifndef _In_opt_ +#define _In_opt_ +#endif +#ifndef _In_range_ +#define _In_range_( x, y ) +#endif +#ifndef _In_reads_ +#define _In_reads_( x ) +#endif +#ifndef _In_reads_z_ +#define _In_reads_z_( x ) +#endif +#ifndef _In_reads_opt_ +#define _In_reads_opt_( x ) +#endif +#ifndef _In_reads_bytes_opt_ +#define _In_reads_bytes_opt_( x ) +#endif +#ifndef _Out_ +#define _Out_ +#endif +#ifndef _Out_opt_ +#define _Out_opt_ +#endif +#ifndef _Out_writes_z_ +#define _Out_writes_z_( x ) +#endif +#ifndef _Out_writes_opt_ +#define _Out_writes_opt_( x ) +#endif +#ifndef _Out_writes_to_opt_ +#define _Out_writes_to_opt_( x, y ) +#endif +#ifndef _Out_writes_bytes_opt_ +#define _Out_writes_bytes_opt_( x ) +#endif +#ifndef _Inout_ +#define _Inout_ +#endif +#ifndef _Inout_opt_ +#define _Inout_opt_ +#endif +#ifndef _Inout_updates_opt_ +#define _Inout_updates_opt_( x ) +#endif +#ifndef _Deref_in_range_ +#define _Deref_in_range_( x, y ) +#endif +#ifndef _Deref_out_range_ +#define _Deref_out_range_( x, y ) +#endif +#ifndef _Pre_satisfies_ +#define _Pre_satisfies_( x ) +#endif +#ifndef _Post_satisfies_ +#define _Post_satisfies_( x ) +#endif +#ifndef _Post_equal_to_ +#define _Post_equal_to_( x ) +#endif + +#define _mpi_updates_(size) _When_(size != 0, _Inout_updates_(size)) +#define _mpi_reads_(size) _When_(size != 0, _In_reads_(size)) +#define _mpi_reads_bytes_(size) _When_(size != 0, _In_reads_bytes_(size)) +#define _mpi_writes_(size) _When_(size != 0, _Out_writes_(size)) +#define _mpi_writes_bytes_(size) _When_(size != 0, _Out_writes_bytes_(size)) +#define _mpi_writes_to_(size, count) _When_(size != 0, _Out_writes_to_(size, count)) +#define _mpi_out_flag_ _Out_ _Deref_out_range_(0, 1) +#define _mpi_out_(param, sentinel) _Out_ _Post_satisfies_(*param == sentinel || *param >= 0) +#define _mpi_out_range_(param, sentinel, ub) \ + _Out_ _Post_satisfies_(*param == sentinel || (ub > 0 && *param >= 0 && *param <= ub)) +#define _mpi_position_(ub) _Inout_ _Deref_in_range_(0, ub) _Deref_out_range_(0, ub) +#define _mpi_coll_rank_(param) _In_ _Pre_satisfies_(param == MPI_ROOT || param >= MPI_PROC_NULL) + +/*---------------------------------------------------------------------------*/ +/* MSMPI Calling convention */ +/*---------------------------------------------------------------------------*/ + +#define MPIAPI __stdcall + + +/*---------------------------------------------------------------------------*/ +/* MPI ERROR CLASS */ +/*---------------------------------------------------------------------------*/ + +#define MPI_SUCCESS 0 /* Successful return code */ + +#define MPI_ERR_BUFFER 1 /* Invalid buffer pointer */ +#define MPI_ERR_COUNT 2 /* Invalid count argument */ +#define MPI_ERR_TYPE 3 /* Invalid datatype argument */ +#define MPI_ERR_TAG 4 /* Invalid tag argument */ +#define MPI_ERR_COMM 5 /* Invalid communicator */ +#define MPI_ERR_RANK 6 /* Invalid rank */ +#define MPI_ERR_ROOT 7 /* Invalid root */ +#define MPI_ERR_GROUP 8 /* Invalid group */ +#define MPI_ERR_OP 9 /* Invalid operation */ +#define MPI_ERR_TOPOLOGY 10 /* Invalid topology */ +#define MPI_ERR_DIMS 11 /* Invalid dimension argument */ +#define MPI_ERR_ARG 12 /* Invalid argument */ +#define MPI_ERR_UNKNOWN 13 /* Unknown error */ +#define MPI_ERR_TRUNCATE 14 /* Message truncated on receive */ +#define MPI_ERR_OTHER 15 /* Other error; use Error_string */ +#define MPI_ERR_INTERN 16 /* Internal error code */ +#define MPI_ERR_IN_STATUS 17 /* Error code is in status */ +#define MPI_ERR_PENDING 18 /* Pending request */ +#define MPI_ERR_REQUEST 19 /* Invalid request (handle) */ +#define MPI_ERR_ACCESS 20 /* Premission denied */ +#define MPI_ERR_AMODE 21 /* Error related to amode passed to MPI_File_open */ +#define MPI_ERR_BAD_FILE 22 /* Invalid file name (e.g., path name too long) */ +#define MPI_ERR_CONVERSION 23 /* Error in user data conversion function */ +#define MPI_ERR_DUP_DATAREP 24 /* Data representation identifier already registered */ +#define MPI_ERR_FILE_EXISTS 25 /* File exists */ +#define MPI_ERR_FILE_IN_USE 26 /* File operation could not be completed, file in use */ +#define MPI_ERR_FILE 27 /* Invalid file handle */ +#define MPI_ERR_INFO 28 /* Invalid info argument */ +#define MPI_ERR_INFO_KEY 29 /* Key longer than MPI_MAX_INFO_KEY */ +#define MPI_ERR_INFO_VALUE 30 /* Value longer than MPI_MAX_INFO_VAL */ +#define MPI_ERR_INFO_NOKEY 31 /* Invalid key passed to MPI_Info_delete */ +#define MPI_ERR_IO 32 /* Other I/O error */ +#define MPI_ERR_NAME 33 /* Invalid service name in MPI_Lookup_name */ +#define MPI_ERR_NO_MEM 34 /* Alloc_mem could not allocate memory */ +#define MPI_ERR_NOT_SAME 35 /* Collective argument/sequence not the same on all processes */ +#define MPI_ERR_NO_SPACE 36 /* Not enough space */ +#define MPI_ERR_NO_SUCH_FILE 37 /* File does not exist */ +#define MPI_ERR_PORT 38 /* Invalid port name in MPI_comm_connect*/ +#define MPI_ERR_QUOTA 39 /* Quota exceeded */ +#define MPI_ERR_READ_ONLY 40 /* Read-only file or file system */ +#define MPI_ERR_SERVICE 41 /* Invalid service name in MPI_Unpublish_name */ +#define MPI_ERR_SPAWN 42 /* Error in spawning processes */ +#define MPI_ERR_UNSUPPORTED_DATAREP 43 /* Unsupported dararep in MPI_File_set_view */ +#define MPI_ERR_UNSUPPORTED_OPERATION 44 /* Unsupported operation on file */ +#define MPI_ERR_WIN 45 /* Invalid win argument */ +#define MPI_ERR_BASE 46 /* Invalid base passed to MPI_Free_mem */ +#define MPI_ERR_LOCKTYPE 47 /* Invalid locktype argument */ +#define MPI_ERR_KEYVAL 48 /* Invalid keyval */ +#define MPI_ERR_RMA_CONFLICT 49 /* Conflicting accesses to window */ +#define MPI_ERR_RMA_SYNC 50 /* Wrong synchronization of RMA calls */ +#define MPI_ERR_SIZE 51 /* Invalid size argument */ +#define MPI_ERR_DISP 52 /* Invalid disp argument */ +#define MPI_ERR_ASSERT 53 /* Invalid assert argument */ + +#define MPI_ERR_LASTCODE 0x3fffffff /* Last valid error code for a predefined error class */ + +#define MPICH_ERR_LAST_CLASS 53 + + +/*---------------------------------------------------------------------------*/ +/* MPI Basic integer types */ +/*---------------------------------------------------------------------------*/ + +/* Address size integer */ +#ifdef _WIN64 +typedef int64_t MPI_Aint; +#else +typedef int MPI_Aint; +#endif + +/* Fortran INTEGER */ +typedef int MPI_Fint; + +/* File offset */ +typedef int64_t MPI_Offset; + +// +// MPI-3 standard defines this type that can be used to address locations +// within either memory or files as well as express count values. +// +typedef int64_t MPI_Count; + + +/*---------------------------------------------------------------------------*/ +/* MPI_Datatype */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Datatype; +#define MPI_DATATYPE_NULL ((MPI_Datatype)0x0c000000) + +#define MPI_CHAR ((MPI_Datatype)0x4c000101) +#define MPI_UNSIGNED_CHAR ((MPI_Datatype)0x4c000102) +#define MPI_SHORT ((MPI_Datatype)0x4c000203) +#define MPI_UNSIGNED_SHORT ((MPI_Datatype)0x4c000204) +#define MPI_INT ((MPI_Datatype)0x4c000405) +#define MPI_UNSIGNED ((MPI_Datatype)0x4c000406) +#define MPI_LONG ((MPI_Datatype)0x4c000407) +#define MPI_UNSIGNED_LONG ((MPI_Datatype)0x4c000408) +#define MPI_LONG_LONG_INT ((MPI_Datatype)0x4c000809) +#define MPI_LONG_LONG MPI_LONG_LONG_INT +#define MPI_FLOAT ((MPI_Datatype)0x4c00040a) +#define MPI_DOUBLE ((MPI_Datatype)0x4c00080b) +#define MPI_LONG_DOUBLE ((MPI_Datatype)0x4c00080c) +#define MPI_BYTE ((MPI_Datatype)0x4c00010d) +#define MPI_WCHAR ((MPI_Datatype)0x4c00020e) + +#define MPI_PACKED ((MPI_Datatype)0x4c00010f) +#define MPI_LB ((MPI_Datatype)0x4c000010) +#define MPI_UB ((MPI_Datatype)0x4c000011) + +#define MPI_C_COMPLEX ((MPI_Datatype)0x4c000812) +#define MPI_C_FLOAT_COMPLEX ((MPI_Datatype)0x4c000813) +#define MPI_C_DOUBLE_COMPLEX ((MPI_Datatype)0x4c001014) +#define MPI_C_LONG_DOUBLE_COMPLEX ((MPI_Datatype)0x4c001015) + +#define MPI_2INT ((MPI_Datatype)0x4c000816) +#define MPI_C_BOOL ((MPI_Datatype)0x4c000117) +#define MPI_SIGNED_CHAR ((MPI_Datatype)0x4c000118) +#define MPI_UNSIGNED_LONG_LONG ((MPI_Datatype)0x4c000819) + +/* Fortran types */ +#define MPI_CHARACTER ((MPI_Datatype)0x4c00011a) +#define MPI_INTEGER ((MPI_Datatype)0x4c00041b) +#define MPI_REAL ((MPI_Datatype)0x4c00041c) +#define MPI_LOGICAL ((MPI_Datatype)0x4c00041d) +#define MPI_COMPLEX ((MPI_Datatype)0x4c00081e) +#define MPI_DOUBLE_PRECISION ((MPI_Datatype)0x4c00081f) +#define MPI_2INTEGER ((MPI_Datatype)0x4c000820) +#define MPI_2REAL ((MPI_Datatype)0x4c000821) +#define MPI_DOUBLE_COMPLEX ((MPI_Datatype)0x4c001022) +#define MPI_2DOUBLE_PRECISION ((MPI_Datatype)0x4c001023) +#define MPI_2COMPLEX ((MPI_Datatype)0x4c001024) +#define MPI_2DOUBLE_COMPLEX ((MPI_Datatype)0x4c002025) + +/* Size-specific types (see MPI 2.2, 16.2.5) */ +#define MPI_REAL2 MPI_DATATYPE_NULL +#define MPI_REAL4 ((MPI_Datatype)0x4c000427) +#define MPI_COMPLEX8 ((MPI_Datatype)0x4c000828) +#define MPI_REAL8 ((MPI_Datatype)0x4c000829) +#define MPI_COMPLEX16 ((MPI_Datatype)0x4c00102a) +#define MPI_REAL16 MPI_DATATYPE_NULL +#define MPI_COMPLEX32 MPI_DATATYPE_NULL +#define MPI_INTEGER1 ((MPI_Datatype)0x4c00012d) +#define MPI_COMPLEX4 MPI_DATATYPE_NULL +#define MPI_INTEGER2 ((MPI_Datatype)0x4c00022f) +#define MPI_INTEGER4 ((MPI_Datatype)0x4c000430) +#define MPI_INTEGER8 ((MPI_Datatype)0x4c000831) +#define MPI_INTEGER16 MPI_DATATYPE_NULL +#define MPI_INT8_T ((MPI_Datatype)0x4c000133) +#define MPI_INT16_T ((MPI_Datatype)0x4c000234) +#define MPI_INT32_T ((MPI_Datatype)0x4c000435) +#define MPI_INT64_T ((MPI_Datatype)0x4c000836) +#define MPI_UINT8_T ((MPI_Datatype)0x4c000137) +#define MPI_UINT16_T ((MPI_Datatype)0x4c000238) +#define MPI_UINT32_T ((MPI_Datatype)0x4c000439) +#define MPI_UINT64_T ((MPI_Datatype)0x4c00083a) + +#ifdef _WIN64 +#define MPI_AINT ((MPI_Datatype)0x4c00083b) +#else +#define MPI_AINT ((MPI_Datatype)0x4c00043b) +#endif +#define MPI_OFFSET ((MPI_Datatype)0x4c00083c) +#define MPI_COUNT ((MPI_Datatype)0x4c00083d) + +/* + * The layouts for the types MPI_DOUBLE_INT etc. are + * + * struct { double a; int b; } + */ +#define MPI_FLOAT_INT ((MPI_Datatype)0x8c000000) +#define MPI_DOUBLE_INT ((MPI_Datatype)0x8c000001) +#define MPI_LONG_INT ((MPI_Datatype)0x8c000002) +#define MPI_SHORT_INT ((MPI_Datatype)0x8c000003) +#define MPI_LONG_DOUBLE_INT ((MPI_Datatype)0x8c000004) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Comm */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Comm; +#define MPI_COMM_NULL ((MPI_Comm)0x04000000) + +#define MPI_COMM_WORLD ((MPI_Comm)0x44000000) +#define MPI_COMM_SELF ((MPI_Comm)0x44000001) + +/*---------------------------------------------------------------------------*/ +/* MPI_Comm Split Types */ +/*---------------------------------------------------------------------------*/ +enum +{ + MPI_COMM_TYPE_SHARED = 1, +}; + + +/*---------------------------------------------------------------------------*/ +/* MPI_Win */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Win; +#define MPI_WIN_NULL ((MPI_Win)0x20000000) + + +/*---------------------------------------------------------------------------*/ +/* MPI_File */ +/*---------------------------------------------------------------------------*/ + +typedef struct ADIOI_FileD* MPI_File; +#define MPI_FILE_NULL ((MPI_File)0) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Op */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Op; +#define MPI_OP_NULL ((MPI_Op)0x18000000) + +#define MPI_MAX ((MPI_Op)0x58000001) +#define MPI_MIN ((MPI_Op)0x58000002) +#define MPI_SUM ((MPI_Op)0x58000003) +#define MPI_PROD ((MPI_Op)0x58000004) +#define MPI_LAND ((MPI_Op)0x58000005) +#define MPI_BAND ((MPI_Op)0x58000006) +#define MPI_LOR ((MPI_Op)0x58000007) +#define MPI_BOR ((MPI_Op)0x58000008) +#define MPI_LXOR ((MPI_Op)0x58000009) +#define MPI_BXOR ((MPI_Op)0x5800000a) +#define MPI_MINLOC ((MPI_Op)0x5800000b) +#define MPI_MAXLOC ((MPI_Op)0x5800000c) +#define MPI_REPLACE ((MPI_Op)0x5800000d) +#define MPI_NO_OP ((MPI_Op)0x5800000e) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Info */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Info; +#define MPI_INFO_NULL ((MPI_Info)0x1c000000) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Request */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Request; +#define MPI_REQUEST_NULL ((MPI_Request)0x2c000000) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Group */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Group; +#define MPI_GROUP_NULL ((MPI_Group)0x08000000) + +#define MPI_GROUP_EMPTY ((MPI_Group)0x48000000) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Errhandler */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Errhandler; +#define MPI_ERRHANDLER_NULL ((MPI_Errhandler)0x14000000) + +#define MPI_ERRORS_ARE_FATAL ((MPI_Errhandler)0x54000000) +#define MPI_ERRORS_RETURN ((MPI_Errhandler)0x54000001) + + +/*---------------------------------------------------------------------------*/ +/* MPI_Message */ +/*---------------------------------------------------------------------------*/ + +typedef int MPI_Message; +#define MPI_MESSAGE_NULL ((MPI_Message)0x30000000) +#define MPI_MESSAGE_NO_PROC ((MPI_Message)0x70000000) + +/*---------------------------------------------------------------------------*/ +/* MPI_Status */ +/*---------------------------------------------------------------------------*/ + +typedef struct MPI_Status +{ + int internal[2]; + + int MPI_SOURCE; + int MPI_TAG; + int MPI_ERROR; + +} MPI_Status; + +#define MPI_STATUS_IGNORE ((MPI_Status*)(MPI_Aint)1) +#define MPI_STATUSES_IGNORE ((MPI_Status*)(MPI_Aint)1) + + +/*---------------------------------------------------------------------------*/ +/* MISC CONSTANTS */ +/*---------------------------------------------------------------------------*/ + +/* Used in: Count, Index, Rank, Color, Toplogy, Precision, Exponent range */ +#define MPI_UNDEFINED (-32766) + +/* Used in: Rank */ +#define MPI_PROC_NULL (-1) +#define MPI_ANY_SOURCE (-2) +#define MPI_ROOT (-3) + +/* Used in: Tag */ +#define MPI_ANY_TAG (-1) + +/* Used for: Buffer address */ +#define MPI_BOTTOM ((void*)0) +#define MPI_UNWEIGHTED ((int*)1) +#define MPI_WEIGHTS_EMPTY ((int*)2) + +/*---------------------------------------------------------------------------*/ +/* Macro for function return values. */ +/*---------------------------------------------------------------------------*/ +#define MPI_METHOD _Success_( return == MPI_SUCCESS ) int MPIAPI + + +/*---------------------------------------------------------------------------*/ +/* Chapter 3: Point-to-Point Communication */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 3.2: Blocking Communication */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Send( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Send( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +MPI_Recv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Recv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +_Pre_satisfies_(status != MPI_STATUS_IGNORE) +MPI_METHOD +MPI_Get_count( + _In_ const MPI_Status* status, + _In_ MPI_Datatype datatype, + _mpi_out_(count, MPI_UNDEFINED) int* count + ); + +_Pre_satisfies_(status != MPI_STATUS_IGNORE) +MPI_METHOD +PMPI_Get_count( + _In_ const MPI_Status* status, + _In_ MPI_Datatype datatype, + _mpi_out_(count, MPI_UNDEFINED) int* count + ); + + +/*---------------------------------------------*/ +/* Section 3.4: Communication Modes */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Bsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Bsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +MPI_Ssend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Ssend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +MPI_Rsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Rsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 3.6: Buffer Allocation */ +/*---------------------------------------------*/ + +/* Upper bound on bsend overhead for each message */ +#define MSMPI_BSEND_OVERHEAD_V1 95 +#define MSMPI_BSEND_OVERHEAD_V2 MSMPI_BSEND_OVERHEAD_V1 + +#if MSMPI_VER > 0x300 +# define MPI_BSEND_OVERHEAD MSMPI_Get_bsend_overhead() +#else +# define MPI_BSEND_OVERHEAD MSMPI_BSEND_OVERHEAD_V1 +#endif + +MPI_METHOD +MPI_Buffer_attach( + _In_ void* buffer, + _In_range_(>=, 0) int size + ); + +MPI_METHOD +PMPI_Buffer_attach( + _In_ void* buffer, + _In_range_(>=, 0) int size + ); + +MPI_METHOD +MPI_Buffer_detach( + _Out_ void* buffer_addr, + _Out_ int* size + ); + +MPI_METHOD +PMPI_Buffer_detach( + _Out_ void* buffer_addr, + _Out_ int* size + ); + + +/*---------------------------------------------*/ +/* Section 3.7: Nonblocking Communication */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Isend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Isend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Ibsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Ibsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Issend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Issend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Irsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Irsend( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Irecv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Irecv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + + +/*---------------------------------------------*/ +/* Section 3.7.3: Communication Completion */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Wait( + _Inout_ _Post_equal_to_(MPI_REQUEST_NULL) MPI_Request* request, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Wait( + _Inout_ _Post_equal_to_(MPI_REQUEST_NULL) MPI_Request* request, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +MPI_Test( + _Inout_ _Post_equal_to_(MPI_REQUEST_NULL) MPI_Request* request, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +PMPI_Test( + _Inout_ _Post_equal_to_(MPI_REQUEST_NULL) MPI_Request* request, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Request_free( + _Inout_ _Post_equal_to_(MPI_REQUEST_NULL) MPI_Request* request + ); + +MPI_METHOD +PMPI_Request_free( + _Inout_ _Post_equal_to_(MPI_REQUEST_NULL) MPI_Request* request + ); + + +/*---------------------------------------------*/ +/* Section 3.7.5: Multiple Completions */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Waitany( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _mpi_out_range_(index, MPI_UNDEFINED, (count - 1)) int* index, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Waitany( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _mpi_out_range_(index, MPI_UNDEFINED, (count - 1)) int* index, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +MPI_Testany( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _mpi_out_range_(index, MPI_UNDEFINED, (count - 1)) int* index, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +PMPI_Testany( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _mpi_out_range_(index, MPI_UNDEFINED, (count - 1)) int* index, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Waitall( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _Out_writes_opt_(count) MPI_Status array_of_statuses[] + ); + +MPI_METHOD +PMPI_Waitall( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _Out_writes_opt_(count) MPI_Status array_of_statuses[] + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +MPI_Testall( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _mpi_out_flag_ int* flag, + _Out_writes_opt_(count) MPI_Status array_of_statuses[] + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +PMPI_Testall( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[], + _mpi_out_flag_ int* flag, + _Out_writes_opt_(count) MPI_Status array_of_statuses[] +); + +MPI_METHOD +MPI_Waitsome( + _In_range_(>=, 0) int incount, + _mpi_updates_(incount) MPI_Request array_of_requests[], + _mpi_out_range_(outcount, MPI_UNDEFINED, incount) int* outcount, + _mpi_writes_to_(incount,*outcount) int array_of_indices[], + _Out_writes_to_opt_(incount, *outcount) MPI_Status array_of_statuses[] + ); + +MPI_METHOD +PMPI_Waitsome( + _In_range_(>=, 0) int incount, + _mpi_updates_(incount) MPI_Request array_of_requests[], + _mpi_out_range_(outcount, MPI_UNDEFINED, incount) int* outcount, + _mpi_writes_to_(incount,*outcount) int array_of_indices[], + _Out_writes_to_opt_(incount, *outcount) MPI_Status array_of_statuses[] + ); + +_Success_(return == MPI_SUCCESS && *outcount > 0) +int +MPIAPI +MPI_Testsome( + _In_range_(>=, 0) int incount, + _mpi_updates_(incount) MPI_Request array_of_requests[], + _mpi_out_range_(outcount, MPI_UNDEFINED, incount) int* outcount, + _mpi_writes_to_(incount,*outcount) int array_of_indices[], + _Out_writes_to_opt_(incount, *outcount) MPI_Status array_of_statuses[] + ); + +_Success_(return == MPI_SUCCESS && *outcount > 0) +int +MPIAPI +PMPI_Testsome( + _In_range_(>=, 0) int incount, + _mpi_updates_(incount) MPI_Request array_of_requests[], + _mpi_out_range_(outcount, MPI_UNDEFINED, incount) int* outcount, + _mpi_writes_to_(incount,*outcount) int array_of_indices[], + _Out_writes_to_opt_(incount, *outcount) MPI_Status array_of_statuses[] + ); + + +/*---------------------------------------------*/ +/* Section 3.7.6: Test of status */ +/*---------------------------------------------*/ + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +MPI_Request_get_status( + _In_ MPI_Request request, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +PMPI_Request_get_status( + _In_ MPI_Request request, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + + +/*---------------------------------------------*/ +/* Section 3.8: Probe and Cancel */ +/*---------------------------------------------*/ + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +MPI_Iprobe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +PMPI_Iprobe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _mpi_out_flag_ int* flag, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Probe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Probe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +MPI_Improbe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _mpi_out_flag_ int* flag, + _Out_ MPI_Message* message, + _Out_ MPI_Status* status + ); + +_Success_(return == MPI_SUCCESS && *flag != 0) +int +MPIAPI +PMPI_Improbe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _mpi_out_flag_ int* flag, + _Out_ MPI_Message* message, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Mprobe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Message* message, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Mprobe( + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Message* message, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Mrecv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Inout_ MPI_Message* message, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Mrecv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Inout_ MPI_Message* message, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Imrecv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Inout_ MPI_Message* message, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Imrecv( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Inout_ MPI_Message* message, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(*request != MPI_REQUEST_NULL) +MPI_METHOD +MPI_Cancel( + _In_ MPI_Request* request + ); + +_Pre_satisfies_(*request != MPI_REQUEST_NULL) +MPI_METHOD +PMPI_Cancel( + _In_ MPI_Request* request + ); + +_Pre_satisfies_(status != MPI_STATUS_IGNORE) +MPI_METHOD +MPI_Test_cancelled( + _In_ const MPI_Status* status, + _mpi_out_flag_ int* flag + ); + +_Pre_satisfies_(status != MPI_STATUS_IGNORE) +MPI_METHOD +PMPI_Test_cancelled( + _In_ const MPI_Status* status, + _mpi_out_flag_ int* flag + ); + + +/*---------------------------------------------*/ +/* Section 3.9: Persistent Communication */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Send_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Send_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Bsend_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Bsend_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Ssend_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Ssend_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Rsend_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Rsend_init( + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Recv_init( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Recv_init( + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int tag, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(*request != MPI_REQUEST_NULL) +MPI_METHOD +MPI_Start( + _Inout_ MPI_Request* request + ); + +_Pre_satisfies_(*request != MPI_REQUEST_NULL) +MPI_METHOD +PMPI_Start( + _Inout_ MPI_Request* request + ); + +MPI_METHOD +MPI_Startall( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[] + ); + +MPI_METHOD +PMPI_Startall( + _In_range_(>=, 0) int count, + _mpi_updates_(count) MPI_Request array_of_requests[] + ); + + +/*---------------------------------------------*/ +/* Section 3.10: Send-Recv */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Sendrecv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int sendtag, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int recvtag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Sendrecv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int sendtag, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int recvtag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_Sendrecv_replace( + _Inout_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int sendtag, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int recvtag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_Sendrecv_replace( + _Inout_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_range_(>=, MPI_PROC_NULL) int dest, + _In_range_(>=, 0) int sendtag, + _In_range_(>=, MPI_ANY_SOURCE) int source, + _In_range_(>=, MPI_ANY_TAG) int recvtag, + _In_ MPI_Comm comm, + _Out_ MPI_Status* status + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 4: Datatypes */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 4.1: Derived Datatypes */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Type_contiguous( + _In_range_(>=, 0) int count, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_contiguous( + _In_range_(>=, 0) int count, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_vector( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _In_ int stride, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_vector( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _In_ int stride, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_hvector( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _In_ MPI_Aint stride, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_hvector( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _In_ MPI_Aint stride, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_indexed( + _In_range_(>=, 0) int count, + _mpi_reads_(count) const int array_of_blocklengths[], + _mpi_reads_(count) const int array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_indexed( + _In_range_(>=, 0) int count, + _mpi_reads_(count) const int array_of_blocklengths[], + _mpi_reads_(count) const int array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_hindexed( + _In_range_(>=, 0) int count, + _mpi_reads_(count) const int array_of_blocklengths[], + _mpi_reads_(count) const MPI_Aint array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_hindexed( + _In_range_(>=, 0) int count, + _mpi_reads_(count) const int array_of_blocklengths[], + _mpi_reads_(count) const MPI_Aint array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_hindexed_block( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _mpi_reads_(count) const MPI_Aint array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_hindexed_block( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _mpi_reads_(count) const MPI_Aint array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_indexed_block( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _mpi_reads_(count) const int array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_indexed_block( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _mpi_reads_(count) const int array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_struct( + _In_range_(>=, 0) int count, + _mpi_reads_(count) const int array_of_blocklengths[], + _mpi_reads_(count) const MPI_Aint array_of_displacements[], + _mpi_reads_(count) const MPI_Datatype array_of_types[], + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_struct( + _In_range_(>=, 0) int count, + _mpi_reads_(count) const int array_of_blocklengths[], + _mpi_reads_(count) const MPI_Aint array_of_displacements[], + _mpi_reads_(count) const MPI_Datatype array_of_types[], + _Out_ MPI_Datatype* newtype + ); + + +#define MPI_ORDER_C 56 +#define MPI_ORDER_FORTRAN 57 + +MPI_METHOD +MPI_Type_create_subarray( + _In_range_(>=, 0) int ndims, + _mpi_reads_(ndims) const int array_of_sizes[], + _mpi_reads_(ndims) const int array_of_subsizes[], + _mpi_reads_(ndims) const int array_of_starts[], + _In_range_(MPI_ORDER_C, MPI_ORDER_FORTRAN) int order, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_subarray( + _In_range_(>=, 0) int ndims, + _In_reads_opt_(ndims) const int array_of_sizes[], + _In_reads_opt_(ndims) const int array_of_subsizes[], + _In_reads_opt_(ndims) const int array_of_starts[], + _In_range_(MPI_ORDER_C, MPI_ORDER_FORTRAN) int order, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + + +#define MPI_DISTRIBUTE_BLOCK 121 +#define MPI_DISTRIBUTE_CYCLIC 122 +#define MPI_DISTRIBUTE_NONE 123 +#define MPI_DISTRIBUTE_DFLT_DARG (-49767) + +_Pre_satisfies_( + order == MPI_DISTRIBUTE_DFLT_DARG || + (order >= MPI_DISTRIBUTE_BLOCK && order <= MPI_DISTRIBUTE_NONE) + ) +MPI_METHOD +MPI_Type_create_darray( + _In_range_(>=, 0) int size, + _In_range_(>=, 0) int rank, + _In_range_(>=, 0) int ndims, + _mpi_reads_(ndims) const int array_of_gsizes[], + _mpi_reads_(ndims) const int array_of_distribs[], + _mpi_reads_(ndims) const int array_of_dargs[], + _mpi_reads_(ndims) const int array_of_psizes[], + _In_ int order, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +_Pre_satisfies_( + order == MPI_DISTRIBUTE_DFLT_DARG || + (order >= MPI_DISTRIBUTE_BLOCK && order <= MPI_DISTRIBUTE_NONE) + ) +MPI_METHOD +PMPI_Type_create_darray( + _In_range_(>=, 0) int size, + _In_range_(>=, 0) int rank, + _In_range_(>=, 0) int ndims, + _mpi_reads_(ndims) const int array_of_gsizes[], + _mpi_reads_(ndims) const int array_of_distribs[], + _mpi_reads_(ndims) const int array_of_dargs[], + _mpi_reads_(ndims) const int array_of_psizes[], + _In_ int order, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + + +/*---------------------------------------------*/ +/* Section 4.1.5: Datatype Address and Size */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Get_address( + _In_ const void* location, + _Out_ MPI_Aint* address + ); + +MPI_METHOD +PMPI_Get_address( + _In_ const void* location, + _Out_ MPI_Aint* address + ); + +MPI_METHOD +MPI_Type_size( + _In_ MPI_Datatype datatype, + _mpi_out_(size, MPI_UNDEFINED) int* size + ); + +MPI_METHOD +PMPI_Type_size( + _In_ MPI_Datatype datatype, + _mpi_out_(size, MPI_UNDEFINED) int* size + ); + +MPI_METHOD +MPI_Type_size_x( + _In_ MPI_Datatype datatype, + _mpi_out_(size, MPI_UNDEFINED) MPI_Count *size + ); + +MPI_METHOD +PMPI_Type_size_x( + _In_ MPI_Datatype datatype, + _mpi_out_(size, MPI_UNDEFINED) MPI_Count *size + ); + + +/*---------------------------------------------*/ +/* Section 4.1.7: Datatype Extent and Bounds */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Type_get_extent( + _In_ MPI_Datatype datatype, + _mpi_out_(lb, MPI_UNDEFINED) MPI_Aint* lb, + _mpi_out_(extent, MPI_UNDEFINED) MPI_Aint* extent + ); + +MPI_METHOD +PMPI_Type_get_extent( + _In_ MPI_Datatype datatype, + _mpi_out_(lb, MPI_UNDEFINED) MPI_Aint* lb, + _mpi_out_(extent, MPI_UNDEFINED) MPI_Aint* extent + ); + +MPI_METHOD +MPI_Type_get_extent_x( + _In_ MPI_Datatype datatype, + _mpi_out_(lb, MPI_UNDEFINED) MPI_Count *lb, + _mpi_out_(extent, MPI_UNDEFINED) MPI_Count *extent + ); + +MPI_METHOD +PMPI_Type_get_extent_x( + _In_ MPI_Datatype datatype, + _mpi_out_(lb, MPI_UNDEFINED) MPI_Count *lb, + _mpi_out_(extent, MPI_UNDEFINED) MPI_Count *extent + ); + +MPI_METHOD +MPI_Type_create_resized( + _In_ MPI_Datatype oldtype, + _In_ MPI_Aint lb, + _In_range_(>=, 0) MPI_Aint extent, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_resized( + _In_ MPI_Datatype oldtype, + _In_ MPI_Aint lb, + _In_range_(>=, 0) MPI_Aint extent, + _Out_ MPI_Datatype* newtype + ); + + +/*---------------------------------------------*/ +/* Section 4.1.8: Datatype True Extent */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Type_get_true_extent( + _In_ MPI_Datatype datatype, + _mpi_out_(true_lb, MPI_UNDEFINED) MPI_Aint* true_lb, + _mpi_out_(true_extent, MPI_UNDEFINED) MPI_Aint* true_extent + ); + +MPI_METHOD +PMPI_Type_get_true_extent( + _In_ MPI_Datatype datatype, + _mpi_out_(true_lb, MPI_UNDEFINED) MPI_Aint* true_lb, + _mpi_out_(true_extent, MPI_UNDEFINED) MPI_Aint* true_extent + ); + +MPI_METHOD +MPI_Type_get_true_extent_x( + _In_ MPI_Datatype datatype, + _mpi_out_(true_lb, MPI_UNDEFINED) MPI_Count *true_lb, + _mpi_out_(true_extent, MPI_UNDEFINED) MPI_Count *true_extent + ); + +MPI_METHOD +PMPI_Type_get_true_extent_x( + _In_ MPI_Datatype datatype, + _mpi_out_(true_lb, MPI_UNDEFINED) MPI_Count *true_lb, + _mpi_out_(true_extent, MPI_UNDEFINED) MPI_Count *true_extent + ); + + +/*---------------------------------------------*/ +/* Section 4.1.9: Datatype Commit and Free */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Type_commit( + _In_ MPI_Datatype* datatype + ); + +MPI_METHOD +PMPI_Type_commit( + _In_ MPI_Datatype* datatype + ); + +MPI_METHOD +MPI_Type_free( + _Deref_out_range_(==, MPI_DATATYPE_NULL) _Inout_ MPI_Datatype* datatype + ); + +MPI_METHOD +PMPI_Type_free( + _Deref_out_range_(==, MPI_DATATYPE_NULL) _Inout_ MPI_Datatype* datatype + ); + + +/*---------------------------------------------*/ +/* Section 4.1.10: Datatype Duplication */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Type_dup( + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_dup( + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + + +/*---------------------------------------------*/ +/* Section 4.1.11: Datatype and Communication */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Get_elements( + _In_ const MPI_Status* status, + _In_ MPI_Datatype datatype, + _mpi_out_(count, MPI_UNDEFINED) int* count + ); + +MPI_METHOD +PMPI_Get_elements( + _In_ const MPI_Status* status, + _In_ MPI_Datatype datatype, + _mpi_out_(count, MPI_UNDEFINED) int* count + ); + +MPI_METHOD +MPI_Get_elements_x( + _In_ const MPI_Status* status, + _In_ MPI_Datatype datatype, + _mpi_out_(count, MPI_UNDEFINED) MPI_Count *count + ); + +MPI_METHOD +PMPI_Get_elements_x( + _In_ const MPI_Status* status, + _In_ MPI_Datatype datatype, + _mpi_out_(count, MPI_UNDEFINED) MPI_Count *count + ); + + +/*---------------------------------------------*/ +/* Section 4.1.13: Decoding a Datatype */ +/*---------------------------------------------*/ + +/* Datatype combiners result */ +enum +{ + MPI_COMBINER_NAMED = 1, + MPI_COMBINER_DUP = 2, + MPI_COMBINER_CONTIGUOUS = 3, + MPI_COMBINER_VECTOR = 4, + MPI_COMBINER_HVECTOR_INTEGER = 5, + MPI_COMBINER_HVECTOR = 6, + MPI_COMBINER_INDEXED = 7, + MPI_COMBINER_HINDEXED_INTEGER = 8, + MPI_COMBINER_HINDEXED = 9, + MPI_COMBINER_INDEXED_BLOCK = 10, + MPI_COMBINER_STRUCT_INTEGER = 11, + MPI_COMBINER_STRUCT = 12, + MPI_COMBINER_SUBARRAY = 13, + MPI_COMBINER_DARRAY = 14, + MPI_COMBINER_F90_REAL = 15, + MPI_COMBINER_F90_COMPLEX = 16, + MPI_COMBINER_F90_INTEGER = 17, + MPI_COMBINER_RESIZED = 18, + MPI_COMBINER_HINDEXED_BLOCK = 19 +}; + +MPI_METHOD +MPI_Type_get_envelope( + _In_ MPI_Datatype datatype, + _Out_ _Deref_out_range_(>=, 0) int* num_integers, + _Out_ _Deref_out_range_(>=, 0) int* num_addresses, + _Out_ _Deref_out_range_(>=, 0) int* num_datatypes, + _Out_ _Deref_out_range_(MPI_COMBINER_NAMED, MPI_COMBINER_RESIZED) int* combiner + ); + +MPI_METHOD +PMPI_Type_get_envelope( + _In_ MPI_Datatype datatype, + _Out_ _Deref_out_range_(>=, 0) int* num_integers, + _Out_ _Deref_out_range_(>=, 0) int* num_addresses, + _Out_ _Deref_out_range_(>=, 0) int* num_datatypes, + _Out_ _Deref_out_range_(MPI_COMBINER_NAMED, MPI_COMBINER_RESIZED) int* combiner + ); + +MPI_METHOD +MPI_Type_get_contents( + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) int max_integers, + _In_range_(>=, 0) int max_addresses, + _In_range_(>=, 0) int max_datatypes, + _mpi_writes_(max_integers) int array_of_integers[], + _mpi_writes_(max_addresses) MPI_Aint array_of_addresses[], + _mpi_writes_(max_datatypes) MPI_Datatype array_of_datatypes[] + ); + +MPI_METHOD +PMPI_Type_get_contents( + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) int max_integers, + _In_range_(>=, 0) int max_addresses, + _In_range_(>=, 0) int max_datatypes, + _mpi_writes_(max_integers) int array_of_integers[], + _mpi_writes_(max_addresses) MPI_Aint array_of_addresses[], + _mpi_writes_(max_datatypes) MPI_Datatype array_of_datatypes[] + ); + + +/*---------------------------------------------*/ +/* Section 4.2: Datatype Pack and Unpack */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Pack( + _In_opt_ const void* inbuf, + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _mpi_writes_bytes_(outsize) void* outbuf, + _In_range_(>=, 0) int outsize, + _mpi_position_(outsize) int* position, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Pack( + _In_opt_ const void* inbuf, + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _mpi_writes_bytes_(outsize) void* outbuf, + _In_range_(>=, 0) int outsize, + _mpi_position_(outsize) int* position, + _In_ MPI_Comm comm + ); + +MPI_METHOD +MPI_Unpack( + _mpi_reads_bytes_(insize) const void* inbuf, + _In_range_(>=, 0) int insize, + _mpi_position_(insize) int* position, + _When_(insize > 0, _Out_opt_) void* outbuf, + _In_range_(>=, 0) int outcount, + _In_ MPI_Datatype datatype, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Unpack( + _mpi_reads_bytes_(insize) const void* inbuf, + _In_range_(>=, 0) int insize, + _mpi_position_(insize) int* position, + _When_(insize > 0, _Out_opt_) void* outbuf, + _In_range_(>=, 0) int outcount, + _In_ MPI_Datatype datatype, + _In_ MPI_Comm comm + ); + +MPI_METHOD +MPI_Pack_size( + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _In_ MPI_Comm comm, + _mpi_out_(size, MPI_UNDEFINED) int *size + ); + +MPI_METHOD +PMPI_Pack_size( + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _In_ MPI_Comm comm, + _mpi_out_(size, MPI_UNDEFINED) int *size + ); + + +/*---------------------------------------------*/ +/* Section 4.3: Canonical Pack and Unpack */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Pack_external( + _In_z_ const char* datarep, + _In_opt_ const void* inbuf, + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _mpi_writes_bytes_(outsize) void* outbuf, + _In_range_(>=, 0) MPI_Aint outsize, + _mpi_position_(outsize) MPI_Aint* position + ); + +MPI_METHOD +PMPI_Pack_external( + _In_z_ const char* datarep, + _In_opt_ const void* inbuf, + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _mpi_writes_bytes_(outsize) void* outbuf, + _In_range_(>=, 0) MPI_Aint outsize, + _mpi_position_(outsize) MPI_Aint* position + ); + +MPI_METHOD +MPI_Unpack_external( + _In_z_ const char* datarep, + _In_reads_bytes_opt_(insize) const void* inbuf, + _In_range_(>=, 0) MPI_Aint insize, + _mpi_position_(insize) MPI_Aint* position, + _When_(insize > 0, _Out_opt_) void* outbuf, + _In_range_(>=, 0) int outcount, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_Unpack_external( + _In_z_ const char* datarep, + _In_reads_bytes_opt_(insize) const void* inbuf, + _In_range_(>=, 0) MPI_Aint insize, + _mpi_position_(insize) MPI_Aint* position, + _When_(insize > 0, _Out_opt_) void* outbuf, + _In_range_(>=, 0) int outcount, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_Pack_external_size( + _In_z_ const char* datarep, + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* size + ); + +MPI_METHOD +PMPI_Pack_external_size( + _In_z_ const char* datarep, + _In_range_(>=, 0) int incount, + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* size + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 5: Collective Communication */ +/*---------------------------------------------------------------------------*/ + +#define MPI_IN_PLACE ((void*)(MPI_Aint)-1) + +/*---------------------------------------------*/ +/* Section 5.3: Barrier Synchronization */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Barrier( + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Barrier( + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.4: Broadcast */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Bcast( + _Pre_opt_valid_ void* buffer, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +MPI_METHOD +PMPI_Bcast( + _Pre_opt_valid_ void* buffer, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.5: Gather */ +/*---------------------------------------------*/ + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Gather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Gather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Gatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_opt_ const int recvcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Gatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_opt_ const int recvcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.6: Scatter */ +/*---------------------------------------------*/ + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Scatter( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Scatter( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Scatterv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Scatterv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.6: Gather-to-all */ +/*---------------------------------------------*/ + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Allgather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Allgather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Allgatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int displs[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Allgatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int displs[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.6: All-to-All Scatter/Gather */ +/*---------------------------------------------*/ + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Alltoall( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Alltoall( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Alltoallv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Alltoallv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Alltoallw( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_opt_ const MPI_Datatype sendtypes[], + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ const MPI_Datatype recvtypes[], + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Alltoallw( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_opt_ const MPI_Datatype sendtypes[], + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ const MPI_Datatype recvtypes[], + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.9: Global Reduction Operations */ +/*---------------------------------------------*/ + +typedef +void +(MPIAPI MPI_User_function)( + _In_opt_ void* invec, + _Inout_opt_ void* inoutvec, + _In_ int* len, + _In_ MPI_Datatype* datatype + ); + +MPI_METHOD +MPI_Op_commutative( + _In_ MPI_Op op, + _Out_ int* commute + ); + +MPI_METHOD +PMPI_Op_commutative( + _In_ MPI_Op op, + _Out_ int* commute + ); + +MPI_METHOD +MPI_Op_create( + _In_ MPI_User_function* user_fn, + _In_ int commute, + _Out_ MPI_Op* op + ); + +MPI_METHOD +PMPI_Op_create( + _In_ MPI_User_function* user_fn, + _In_ int commute, + _Out_ MPI_Op* op + ); + +MPI_METHOD +MPI_Op_free( + _Inout_ MPI_Op* op + ); + +MPI_METHOD +PMPI_Op_free( + _Inout_ MPI_Op* op + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Reduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Reduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Allreduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Allreduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(inbuf != MPI_IN_PLACE) +_Pre_satisfies_(inoutbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Reduce_local( + _In_opt_ _In_range_(!=, inoutbuf) const void *inbuf, + _Inout_opt_ void *inoutbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op + ); + +_Pre_satisfies_(inbuf != MPI_IN_PLACE) +_Pre_satisfies_(inoutbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Reduce_local( + _In_opt_ _In_range_(!=, inoutbuf) const void *inbuf, + _Inout_opt_ void *inoutbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op + ); + +/*---------------------------------------------*/ +/* Section 5.10: Reduce-Scatter */ +/*---------------------------------------------*/ + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Reduce_scatter_block( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=,0) int recvcount, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Reduce_scatter_block( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Reduce_scatter( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Reduce_scatter( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + + +/*---------------------------------------------*/ +/* Section 5.11: Scan */ +/*---------------------------------------------*/ + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Scan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Scan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Exscan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Exscan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm + ); + + +// +// Section 5.12: Nonblocking Collective Operations +// +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iallgather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iallgather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iallgatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int displs[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iallgatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int displs[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iallreduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iallreduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Ialltoall( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Ialltoall( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Ialltoallv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Ialltoallv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ MPI_Datatype recvtype, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Ialltoallw( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_opt_ const MPI_Datatype sendtypes[], + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ const MPI_Datatype recvtypes[], + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Ialltoallw( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int sdispls[], + _In_opt_ const MPI_Datatype sendtypes[], + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ const int rdispls[], + _In_ const MPI_Datatype recvtypes[], + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Ibarrier( + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Ibarrier( + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Ibcast( + _Pre_opt_valid_ void* buffer, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Ibcast( + _Pre_opt_valid_ void* buffer, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iexscan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iexscan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Igather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Igather( + _In_opt_ _When_(sendtype == recvtype, _In_range_(!=, recvbuf)) const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Igatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_opt_ const int recvcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Igatherv( + _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _Out_opt_ void* recvbuf, + _In_opt_ const int recvcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Ireduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Ireduce( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Ireduce_scatter( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Ireduce_scatter( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_ const int recvcounts[], + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iscan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iscan( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Ireduce_scatter_block( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=,0) int recvcount, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(recvbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Ireduce_scatter_block( + _In_opt_ _In_range_(!=, recvbuf) const void* sendbuf, + _Out_opt_ void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype datatype, + _In_ MPI_Op op, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iscatter( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iscatter( + _In_range_(!=, recvbuf) _In_opt_ const void* sendbuf, + _In_range_(>=, 0) int sendcount, + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +MPI_Iscatterv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +_Pre_satisfies_(sendbuf != MPI_IN_PLACE) +MPI_METHOD +PMPI_Iscatterv( + _In_opt_ const void* sendbuf, + _In_opt_ const int sendcounts[], + _In_opt_ const int displs[], + _In_ MPI_Datatype sendtype, + _When_(root != MPI_PROC_NULL, _Out_opt_) void* recvbuf, + _In_range_(>=, 0) int recvcount, + _In_ MPI_Datatype recvtype, + _mpi_coll_rank_(root) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Request* request + ); + +/*---------------------------------------------------------------------------*/ +/* Chapter 6: Groups, Contexts, Communicators, and Caching */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 6.3: Group Management */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Group_size( + _In_ MPI_Group group, + _Out_ _Deref_out_range_(>, 0) int* size + ); + +MPI_METHOD +PMPI_Group_size( + _In_ MPI_Group group, + _Out_ _Deref_out_range_(>, 0) int* size + ); + +MPI_METHOD +MPI_Group_rank( + _In_ MPI_Group group, + _Out_ _Deref_out_range_(>=, MPI_UNDEFINED) int* rank + ); + +MPI_METHOD +PMPI_Group_rank( + _In_ MPI_Group group, + _Out_ _Deref_out_range_(>=, MPI_UNDEFINED) int* rank + ); + +MPI_METHOD +MPI_Group_translate_ranks( + _In_ MPI_Group group1, + _In_ int n, + _In_reads_opt_(n) const int ranks1[], + _In_ MPI_Group group2, + _Out_writes_opt_(n) int ranks2[] + ); + +MPI_METHOD +PMPI_Group_translate_ranks( + _In_ MPI_Group group1, + _In_ int n, + _In_reads_opt_(n) const int ranks1[], + _In_ MPI_Group group2, + _Out_writes_opt_(n) int ranks2[] + ); + +/* Results of the compare operations */ +#define MPI_IDENT 0 +#define MPI_CONGRUENT 1 +#define MPI_SIMILAR 2 +#define MPI_UNEQUAL 3 + +MPI_METHOD +MPI_Group_compare( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ int* result + ); + +MPI_METHOD +PMPI_Group_compare( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ int* result + ); + +MPI_METHOD +MPI_Comm_group( + _In_ MPI_Comm comm, + _Out_ MPI_Group* group + ); + +MPI_METHOD +PMPI_Comm_group( + _In_ MPI_Comm comm, + _Out_ MPI_Group* group + ); + +MPI_METHOD +MPI_Group_union( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_union( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_intersection( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_intersection( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_difference( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_difference( + _In_ MPI_Group group1, + _In_ MPI_Group group2, + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_incl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) const int ranks[], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_incl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) const int ranks[], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_excl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) const int ranks[], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_excl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) const int ranks[], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_range_incl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) int ranges[][3], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_range_incl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) int ranges[][3], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_range_excl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) int ranges[][3], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +PMPI_Group_range_excl( + _In_ MPI_Group group, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) int ranges[][3], + _Out_ MPI_Group* newgroup + ); + +MPI_METHOD +MPI_Group_free( + _Inout_ MPI_Group* group + ); + +MPI_METHOD +PMPI_Group_free( + _Inout_ MPI_Group* group + ); + + +/*---------------------------------------------*/ +/* Section 6.4: Communicator Management */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Comm_size( + _In_ MPI_Comm comm, + _Out_ _Deref_out_range_(>, 0) int* size + ); + +MPI_METHOD +PMPI_Comm_size( + _In_ MPI_Comm comm, + _Out_ _Deref_out_range_(>, 0) int* size + ); + +MPI_METHOD +MPI_Comm_rank( + _In_ MPI_Comm comm, + _Out_ _Deref_out_range_(>=, 0) int* rank + ); + +MPI_METHOD +PMPI_Comm_rank( + _In_ MPI_Comm comm, + _Out_ _Deref_out_range_(>=, 0) int* rank + ); + +MPI_METHOD +MPI_Comm_compare( + _In_ MPI_Comm comm1, + _In_ MPI_Comm comm2, + _Out_ int* result + ); + +MPI_METHOD +PMPI_Comm_compare( + _In_ MPI_Comm comm1, + _In_ MPI_Comm comm2, + _Out_ int* result + ); + +MPI_METHOD +MPI_Comm_dup( + _In_ MPI_Comm comm, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +PMPI_Comm_dup( + _In_ MPI_Comm comm, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +MPI_Comm_create( + _In_ MPI_Comm comm, + _In_ MPI_Group group, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +PMPI_Comm_create( + _In_ MPI_Comm comm, + _In_ MPI_Group group, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +MPI_Comm_split( + _In_ MPI_Comm comm, + _In_ int color, + _In_ int key, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +PMPI_Comm_split( + _In_ MPI_Comm comm, + _In_ int color, + _In_ int key, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +MPI_Comm_split_type( + _In_ MPI_Comm comm, + _In_ int split_type, + _In_ int key, + _In_ MPI_Info info, + _Out_ MPI_Comm *newcomm + ); + +MPI_METHOD +PMPI_Comm_split_type( + _In_ MPI_Comm comm, + _In_ int split_type, + _In_ int key, + _In_ MPI_Info info, + _Out_ MPI_Comm *newcomm + ); + +MPI_METHOD +MPI_Comm_free( + _Inout_ MPI_Comm* comm + ); + +MPI_METHOD +PMPI_Comm_free( + _Inout_ MPI_Comm* comm + ); + + +/*---------------------------------------------*/ +/* Section 6.6: Inter-Communication */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Comm_test_inter( + _In_ MPI_Comm comm, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Comm_test_inter( + _In_ MPI_Comm comm, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Comm_remote_size( + _In_ MPI_Comm comm, + _Out_ int* size + ); + +MPI_METHOD +PMPI_Comm_remote_size( + _In_ MPI_Comm comm, + _Out_ int* size + ); + +MPI_METHOD +MPI_Comm_remote_group( + _In_ MPI_Comm comm, + _Out_ MPI_Group* group + ); + +MPI_METHOD +PMPI_Comm_remote_group( + _In_ MPI_Comm comm, + _Out_ MPI_Group* group + ); + +MPI_METHOD +MPI_Intercomm_create( + _In_ MPI_Comm local_comm, + _In_range_(>=, 0) int local_leader, + _In_ MPI_Comm peer_comm, + _In_range_(>=, 0) int remote_leader, + _In_range_(>=, 0) int tag, + _Out_ MPI_Comm* newintercomm + ); + +MPI_METHOD +PMPI_Intercomm_create( + _In_ MPI_Comm local_comm, + _In_range_(>=, 0) int local_leader, + _In_ MPI_Comm peer_comm, + _In_range_(>=, 0) int remote_leader, + _In_range_(>=, 0) int tag, + _Out_ MPI_Comm* newintercomm + ); + +MPI_METHOD +MPI_Intercomm_merge( + _In_ MPI_Comm intercomm, + _In_ int high, + _Out_ MPI_Comm* newintracomm + ); + +MPI_METHOD +PMPI_Intercomm_merge( + _In_ MPI_Comm intercomm, + _In_ int high, + _Out_ MPI_Comm* newintracomm + ); + + +/*---------------------------------------------*/ +/* Section 6.7: Caching */ +/*---------------------------------------------*/ + +#define MPI_KEYVAL_INVALID 0x24000000 + +typedef +int +(MPIAPI MPI_Comm_copy_attr_function)( + _In_ MPI_Comm oldcomm, + _In_ int comm_keyval, + _In_opt_ void* extra_state, + _In_opt_ void* attribute_val_in, + _Out_ void* attribute_val_out, + _mpi_out_flag_ int* flag + ); + +typedef +int +(MPIAPI MPI_Comm_delete_attr_function)( + _In_ MPI_Comm comm, + _In_ int comm_keyval, + _In_opt_ void* attribute_val, + _In_opt_ void* extra_state + ); + +#define MPI_COMM_NULL_COPY_FN ((MPI_Comm_copy_attr_function*)0) +#define MPI_COMM_NULL_DELETE_FN ((MPI_Comm_delete_attr_function*)0) +#define MPI_COMM_DUP_FN ((MPI_Comm_copy_attr_function*)MPIR_Dup_fn) + +MPI_METHOD +MPI_Comm_create_keyval( + _In_opt_ MPI_Comm_copy_attr_function* comm_copy_attr_fn, + _In_opt_ MPI_Comm_delete_attr_function* comm_delete_attr_fn, + _Out_ int* comm_keyval, + _In_opt_ void* extra_state + ); + +MPI_METHOD +PMPI_Comm_create_keyval( + _In_opt_ MPI_Comm_copy_attr_function* comm_copy_attr_fn, + _In_opt_ MPI_Comm_delete_attr_function* comm_delete_attr_fn, + _Out_ int* comm_keyval, + _In_opt_ void* extra_state + ); + +MPI_METHOD +MPI_Comm_free_keyval( + _Inout_ int* comm_keyval + ); + +MPI_METHOD +PMPI_Comm_free_keyval( + _Inout_ int* comm_keyval + ); + +MPI_METHOD +MPI_Comm_set_attr( + _In_ MPI_Comm comm, + _In_ int comm_keyval, + _In_opt_ void* attribute_val + ); + +MPI_METHOD +PMPI_Comm_set_attr( + _In_ MPI_Comm comm, + _In_ int comm_keyval, + _In_opt_ void* attribute_val + ); + + +/* Predefined comm attribute key values */ +/* C Versions (return pointer to value), + Fortran Versions (return integer value). + + DO NOT CHANGE THESE. The values encode: + builtin kind (0x1 in bit 30-31) + Keyval object (0x9 in bits 26-29) + for communicator (0x1 in bits 22-25) + + Fortran versions of the attributes are formed by adding one to + the C version. + */ +#define MPI_TAG_UB 0x64400001 +#define MPI_HOST 0x64400003 +#define MPI_IO 0x64400005 +#define MPI_WTIME_IS_GLOBAL 0x64400007 +#define MPI_UNIVERSE_SIZE 0x64400009 +#define MPI_LASTUSEDCODE 0x6440000b +#define MPI_APPNUM 0x6440000d + +MPI_METHOD +MPI_Comm_get_attr( + _In_ MPI_Comm comm, + _In_ int comm_keyval, + _When_(*flag != 0, _Out_) void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Comm_get_attr( + _In_ MPI_Comm comm, + _In_ int comm_keyval, + _When_(*flag != 0, _Out_) void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Comm_delete_attr( + _In_ MPI_Comm comm, + _In_ int comm_keyval + ); + +MPI_METHOD +PMPI_Comm_delete_attr( + _In_ MPI_Comm comm, + _In_ int comm_keyval + ); + + +typedef +int +(MPIAPI MPI_Win_copy_attr_function)( + _In_ MPI_Win oldwin, + _In_ int win_keyval, + _In_opt_ void* extra_state, + _In_opt_ void* attribute_val_in, + _Out_ void* attribute_val_out, + _mpi_out_flag_ int* flag + ); + +typedef +int +(MPIAPI MPI_Win_delete_attr_function)( + _In_ MPI_Win win, + _In_ int win_keyval, + _In_opt_ void* attribute_val, + _In_opt_ void* extra_state + ); + +#define MPI_WIN_NULL_COPY_FN ((MPI_Win_copy_attr_function*)0) +#define MPI_WIN_NULL_DELETE_FN ((MPI_Win_delete_attr_function*)0) +#define MPI_WIN_DUP_FN ((MPI_Win_copy_attr_function*)MPIR_Dup_fn) + +MPI_METHOD +MPI_Win_create_keyval( + _In_opt_ MPI_Win_copy_attr_function* win_copy_attr_fn, + _In_opt_ MPI_Win_delete_attr_function* win_delete_attr_fn, + _Out_ int* win_keyval, + _In_opt_ void* extra_state + ); + +MPI_METHOD +PMPI_Win_create_keyval( + _In_opt_ MPI_Win_copy_attr_function* win_copy_attr_fn, + _In_opt_ MPI_Win_delete_attr_function* win_delete_attr_fn, + _Out_ int* win_keyval, + _In_opt_ void* extra_state + ); + +MPI_METHOD +MPI_Win_free_keyval( + _Inout_ int* win_keyval + ); + +MPI_METHOD +PMPI_Win_free_keyval( + _Inout_ int* win_keyval + ); + +MPI_METHOD +MPI_Win_set_attr( + _In_ MPI_Win win, + _In_ int win_keyval, + _In_opt_ void* attribute_val + ); + +MPI_METHOD +PMPI_Win_set_attr( + _In_ MPI_Win win, + _In_ int win_keyval, + _In_opt_ void* attribute_val + ); + + +/* Predefined window key value attributes */ +#define MPI_WIN_BASE 0x66000001 +#define MPI_WIN_SIZE 0x66000003 +#define MPI_WIN_DISP_UNIT 0x66000005 +#define MPI_WIN_CREATE_FLAVOR 0x66000007 +#define MPI_WIN_MODEL 0x66000009 + +/* MPI Window Create Flavors */ +#define MPI_WIN_FLAVOR_CREATE 1 +#define MPI_WIN_FLAVOR_ALLOCATE 2 +#define MPI_WIN_FLAVOR_DYNAMIC 3 +#define MPI_WIN_FLAVOR_SHARED 4 + +/* MPI Window Models */ +#define MPI_WIN_SEPARATE 1 +#define MPI_WIN_UNIFIED 2 + +MPI_METHOD +MPI_Win_get_attr( + _In_ MPI_Win win, + _In_ int win_keyval, + _When_(*flag != 0, _Out_) void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Win_get_attr( + _In_ MPI_Win win, + _In_ int win_keyval, + _When_(*flag != 0, _Out_) void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Win_delete_attr( + _In_ MPI_Win win, + _In_ int win_keyval + ); + +MPI_METHOD +PMPI_Win_delete_attr( + _In_ MPI_Win win, + _In_ int win_keyval + ); + + +typedef +int +(MPIAPI MPI_Type_copy_attr_function)( + MPI_Datatype olddatatype, + int datatype_keyval, + _In_opt_ void* extra_state, + _In_opt_ void* attribute_val_in, + _Out_ void* attribute_val_out, + _mpi_out_flag_ int* flag + ); + +typedef +int +(MPIAPI MPI_Type_delete_attr_function)( + MPI_Datatype datatype, + int datatype_keyval, + _In_opt_ void* attribute_val, + _In_opt_ void* extra_state + ); + +#define MPI_TYPE_NULL_COPY_FN ((MPI_Type_copy_attr_function*)0) +#define MPI_TYPE_NULL_DELETE_FN ((MPI_Type_delete_attr_function*)0) +#define MPI_TYPE_DUP_FN ((MPI_Type_copy_attr_function*)MPIR_Dup_fn) + +MPI_METHOD +MPI_Type_create_keyval( + _In_opt_ MPI_Type_copy_attr_function* type_copy_attr_fn, + _In_opt_ MPI_Type_delete_attr_function* type_delete_attr_fn, + _Out_ int* type_keyval, + _In_opt_ void* extra_state + ); + +MPI_METHOD +PMPI_Type_create_keyval( + _In_opt_ MPI_Type_copy_attr_function* type_copy_attr_fn, + _In_opt_ MPI_Type_delete_attr_function* type_delete_attr_fn, + _Out_ int* type_keyval, + _In_opt_ void* extra_state + ); + +MPI_METHOD +MPI_Type_free_keyval( + _Inout_ int* type_keyval + ); + +MPI_METHOD +PMPI_Type_free_keyval( + _Inout_ int* type_keyval + ); + +MPI_METHOD +MPI_Type_set_attr( + _In_ MPI_Datatype type, + _In_ int type_keyval, + _In_opt_ void* attribute_val + ); + +MPI_METHOD +PMPI_Type_set_attr( + _In_ MPI_Datatype type, + _In_ int type_keyval, + _In_opt_ void* attribute_val + ); + +MPI_METHOD +MPI_Type_get_attr( + _In_ MPI_Datatype type, + _In_ int type_keyval, + _When_(*flag != 0, _Out_) void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Type_get_attr( + _In_ MPI_Datatype type, + _In_ int type_keyval, + _When_(*flag != 0, _Out_) void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Type_delete_attr( + _In_ MPI_Datatype type, + _In_ int type_keyval + ); + +MPI_METHOD +PMPI_Type_delete_attr( + _In_ MPI_Datatype type, + _In_ int type_keyval + ); + + +/*---------------------------------------------*/ +/* Section 6.8: Naming Objects */ +/*---------------------------------------------*/ + +#define MPI_MAX_OBJECT_NAME 128 + +MPI_METHOD +MPI_Comm_set_name( + _In_ MPI_Comm comm, + _In_z_ const char* comm_name + ); + +MPI_METHOD +PMPI_Comm_set_name( + _In_ MPI_Comm comm, + _In_z_ const char* comm_name + ); + +MPI_METHOD +MPI_Comm_get_name( + _In_ MPI_Comm comm, + _Out_writes_z_(MPI_MAX_OBJECT_NAME) char* comm_name, + _Out_ int* resultlen + ); + +MPI_METHOD +PMPI_Comm_get_name( + _In_ MPI_Comm comm, + _Out_writes_z_(MPI_MAX_OBJECT_NAME) char* comm_name, + _Out_ int* resultlen + ); + +MPI_METHOD +MPI_Type_set_name( + _In_ MPI_Datatype datatype, + _In_z_ const char* type_name + ); + +MPI_METHOD +PMPI_Type_set_name( + _In_ MPI_Datatype datatype, + _In_z_ const char* type_name + ); + +MPI_METHOD +MPI_Type_get_name( + _In_ MPI_Datatype datatype, + _Out_writes_z_(MPI_MAX_OBJECT_NAME) char* type_name, + _Out_ int* resultlen + ); + +MPI_METHOD +PMPI_Type_get_name( + _In_ MPI_Datatype datatype, + _Out_writes_z_(MPI_MAX_OBJECT_NAME) char* type_name, + _Out_ int* resultlen + ); + +MPI_METHOD +MPI_Win_set_name( + _In_ MPI_Win win, + _In_z_ const char* win_name + ); + +MPI_METHOD +PMPI_Win_set_name( + _In_ MPI_Win win, + _In_z_ const char* win_name + ); + +MPI_METHOD +MPI_Win_get_name( + _In_ MPI_Win win, + _Out_writes_z_(MPI_MAX_OBJECT_NAME) char* win_name, + _Out_ int* resultlen + ); + +MPI_METHOD +PMPI_Win_get_name( + _In_ MPI_Win win, + _Out_writes_z_(MPI_MAX_OBJECT_NAME) char* win_name, + _Out_ int* resultlen + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 7: Process Topologies */ +/*---------------------------------------------------------------------------*/ + +MPI_METHOD +MPI_Cart_create( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int ndims, + _In_reads_opt_(ndims) const int dims[], + _In_reads_opt_(ndims) const int periods[], + _In_ int reorder, + _Out_ MPI_Comm* comm_cart + ); + +MPI_METHOD +PMPI_Cart_create( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int ndims, + _In_reads_opt_(ndims) const int dims[], + _In_reads_opt_(ndims) const int periods[], + _In_ int reorder, + _Out_ MPI_Comm* comm_cart + ); + +MPI_METHOD +MPI_Dims_create( + _In_range_(>, 0) int nnodes, + _In_range_(>=, 0) int ndims, + _Inout_updates_opt_(ndims) int dims[] + ); + +MPI_METHOD +PMPI_Dims_create( + _In_range_(>, 0) int nnodes, + _In_range_(>=, 0) int ndims, + _Inout_updates_opt_(ndims) int dims[] + ); + +MPI_METHOD +MPI_Graph_create( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int nnodes, + _In_reads_opt_(nnodes) const int index[], + _In_reads_opt_(nnodes) const int edges[], + _In_ int reorder, + _Out_ MPI_Comm* comm_graph + ); + +MPI_METHOD +PMPI_Graph_create( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int nnodes, + _In_reads_opt_(nnodes) const int index[], + _In_opt_ const int edges[], + _In_ int reorder, + _Out_ MPI_Comm* comm_graph + ); + +MPI_METHOD +MPI_Dist_graph_create_adjacent( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int indegree, + _In_reads_opt_(indegree) const int sources[], + _In_reads_opt_(indegree) const int sourceweights[], + _In_range_(>=, 0) int outdegree, + _In_reads_opt_(outdegree) const int destinations[], + _In_reads_opt_(outdegree) const int destweights[], + _In_ MPI_Info info, + _In_range_(0,1) int reorder, + _Out_ MPI_Comm* comm_dist_graph +); + +MPI_METHOD +PMPI_Dist_graph_create_adjacent( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int indegree, + _In_reads_opt_(indegree) const int sources[], + _In_reads_opt_(indegree) const int sourceweights[], + _In_range_(>=, 0) int outdegree, + _In_reads_opt_(outdegree) const int destinations[], + _In_reads_opt_(outdegree) const int destweights[], + _In_ MPI_Info info, + _In_range_(0,1) int reorder, + _Out_ MPI_Comm* comm_dist_graph +); + +MPI_METHOD +MPI_Dist_graph_create( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) const int sources[], + _In_reads_opt_(n) const int degrees[], + _In_opt_ const int destinations[], + _In_opt_ const int weights[], + _In_ MPI_Info info, + _In_range_(0, 1) int reorder, + _Out_ MPI_Comm *comm_dist_graph + ); + +MPI_METHOD +PMPI_Dist_graph_create( + _In_ MPI_Comm comm_old, + _In_range_(>=, 0) int n, + _In_reads_opt_(n) const int sources[], + _In_reads_opt_(n) const int degrees[], + _In_opt_ const int destinations[], + _In_opt_ const int weights[], + _In_ MPI_Info info, + _In_range_(0, 1) int reorder, + _Out_ MPI_Comm *comm_dist_graph + ); + +/* Topology types */ +enum +{ + MPI_GRAPH = 1, + MPI_CART = 2, + MPI_DIST_GRAPH = 3 +}; + +MPI_METHOD +MPI_Topo_test( + _In_ MPI_Comm comm, + _Out_ int* status + ); + +MPI_METHOD +PMPI_Topo_test( + _In_ MPI_Comm comm, + _Out_ int* status + ); + +MPI_METHOD +MPI_Graphdims_get( + _In_ MPI_Comm comm, + _Out_ int* nnodes, + _Out_ int* nedges + ); + +MPI_METHOD +PMPI_Graphdims_get( + _In_ MPI_Comm comm, + _Out_ int* nnodes, + _Out_ int* nedges + ); + +MPI_METHOD +MPI_Graph_get( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int maxindex, + _In_range_(>=, 0) int maxedges, + _Out_writes_opt_(maxindex) int index[], + _Out_writes_opt_(maxedges) int edges[] + ); + +MPI_METHOD +PMPI_Graph_get( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int maxindex, + _In_range_(>=, 0) int maxedges, + _Out_writes_opt_(maxindex) int index[], + _Out_writes_opt_(maxedges) int edges[] + ); + +MPI_METHOD +MPI_Cartdim_get( + _In_ MPI_Comm comm, + _Out_ int* ndims + ); + +MPI_METHOD +PMPI_Cartdim_get( + _In_ MPI_Comm comm, + _Out_ int* ndims + ); + +MPI_METHOD +MPI_Cart_get( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int maxdims, + _Out_writes_opt_(maxdims) int dims[], + _Out_writes_opt_(maxdims) int periods[], + _Out_writes_opt_(maxdims) int coords[] + ); + +MPI_METHOD +PMPI_Cart_get( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int maxdims, + _Out_writes_opt_(maxdims) int dims[], + _Out_writes_opt_(maxdims) int periods[], + _Out_writes_opt_(maxdims) int coords[] + ); + +MPI_METHOD +MPI_Cart_rank( + _In_ MPI_Comm comm, + _In_ const int coords[], + _Out_ _Deref_out_range_(>=, 0) int* rank + ); + +MPI_METHOD +PMPI_Cart_rank( + _In_ MPI_Comm comm, + _In_ const int coords[], + _Out_ _Deref_out_range_(>=, 0) int* rank + ); + +MPI_METHOD +MPI_Cart_coords( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int rank, + _In_range_(>=, 0) int maxdims, + _Out_writes_opt_(maxdims) int coords[] + ); + +MPI_METHOD +PMPI_Cart_coords( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int rank, + _In_range_(>=, 0) int maxdims, + _Out_writes_opt_(maxdims) int coords[] + ); + +MPI_METHOD +MPI_Graph_neighbors_count( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int rank, + _Out_ _Deref_out_range_(>=, 0) int* nneighbors + ); + +MPI_METHOD +PMPI_Graph_neighbors_count( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int rank, + _Out_ _Deref_out_range_(>=, 0) int* nneighbors + ); + +MPI_METHOD +MPI_Graph_neighbors( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int rank, + _In_range_(>=, 0) int maxneighbors, + _Out_writes_opt_(maxneighbors) int neighbors[] + ); + +MPI_METHOD +PMPI_Graph_neighbors( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int rank, + _In_range_(>=, 0) int maxneighbors, + _Out_writes_opt_(maxneighbors) int neighbors[] + ); + +MPI_METHOD +MPI_Cart_shift( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int direction, + _In_ int disp, + _Out_ _Deref_out_range_(>=, MPI_PROC_NULL) int* rank_source, + _Out_ _Deref_out_range_(>=, MPI_PROC_NULL) int* rank_dest + ); + +MPI_METHOD +PMPI_Cart_shift( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int direction, + _In_ int disp, + _Out_ _Deref_out_range_(>=, MPI_PROC_NULL) int* rank_source, + _Out_ _Deref_out_range_(>=, MPI_PROC_NULL) int* rank_dest + ); + +MPI_METHOD +MPI_Cart_sub( + _In_ MPI_Comm comm, + _In_ const int remain_dims[], + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +PMPI_Cart_sub( + _In_ MPI_Comm comm, + _In_ const int remain_dims[], + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +MPI_Cart_map( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int ndims, + _In_reads_opt_(ndims) const int dims[], + _In_reads_opt_(ndims) const int periods[], + _Out_ _Deref_out_range_(>=, MPI_UNDEFINED) int* newrank + ); + +MPI_METHOD +PMPI_Cart_map( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int ndims, + _In_reads_opt_(ndims) const int dims[], + _In_reads_opt_(ndims) const int periods[], + _Out_ _Deref_out_range_(>=, MPI_UNDEFINED) int* newrank + ); + +MPI_METHOD +MPI_Graph_map( + _In_ MPI_Comm comm, + _In_range_(>, 0) int nnodes, + _In_reads_opt_(nnodes) const int index[], + _In_opt_ const int edges[], + _Out_ _Deref_out_range_(>=, MPI_UNDEFINED) int* newrank + ); + +MPI_METHOD +PMPI_Graph_map( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int nnodes, + _In_reads_opt_(nnodes) const int index[], + _In_opt_ const int edges[], + _Out_ _Deref_out_range_(>=, MPI_UNDEFINED) int* newrank + ); + +MPI_METHOD +MPI_Dist_graph_neighbors_count( + _In_ MPI_Comm comm, + _Out_ _Deref_out_range_(>=, 0) int *indegree, + _Out_ _Deref_out_range_(>=, 0) int *outdegree, + _Out_ _Deref_out_range_(>=, 0) int *weighted + ); + +MPI_METHOD +PMPI_Dist_graph_neighbors_count( + _In_ MPI_Comm comm, + _Out_ _Deref_out_range_(>=, 0) int *indegree, + _Out_ _Deref_out_range_(>=, 0) int *outdegree, + _Out_ _Deref_out_range_(>=, 0) int *weighted + ); + +MPI_METHOD +MPI_Dist_graph_neighbors( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int maxindegree, + _Out_writes_opt_(maxindegree) int sources[], + _Out_writes_opt_(maxindegree) int sourceweights[], + _In_range_(>=, 0) int maxoutdegree, + _Out_writes_opt_(maxoutdegree) int destinations[], + _Out_writes_opt_(maxoutdegree) int destweights[] + ); + +MPI_METHOD +PMPI_Dist_graph_neighbors( + _In_ MPI_Comm comm, + _In_range_(>=, 0) int maxindegree, + _Out_writes_opt_(maxindegree) int sources[], + _Out_writes_opt_(maxindegree) int sourceweights[], + _In_range_(>=, 0) int maxoutdegree, + _Out_writes_opt_(maxoutdegree) int destinations[], + _Out_writes_opt_(maxoutdegree) int destweights[] + ); + +/*---------------------------------------------------------------------------*/ +/* Chapter 8: Environmental Management */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 8.1: Implementation Information */ +/*---------------------------------------------*/ + +#define MPI_VERSION 2 +#define MPI_SUBVERSION 0 + +MPI_METHOD +MPI_Get_version( + _Out_ int* version, + _Out_ int* subversion + ); + +MPI_METHOD +PMPI_Get_version( + _Out_ int* version, + _Out_ int* subversion + ); + +#define MPI_MAX_LIBRARY_VERSION_STRING 64 + +MPI_METHOD +MPI_Get_library_version( + _Out_writes_z_(MPI_MAX_LIBRARY_VERSION_STRING) char* version, + _Out_ int* resultlen +); + +MPI_METHOD +PMPI_Get_library_version( + _Out_writes_z_(MPI_MAX_LIBRARY_VERSION_STRING) char* version, + _Out_ int* resultlen +); + +#define MPI_MAX_PROCESSOR_NAME 128 + +MPI_METHOD +MPI_Get_processor_name( + _Out_writes_z_(MPI_MAX_PROCESSOR_NAME) char* name, + _Out_ int* resultlen + ); + +MPI_METHOD +PMPI_Get_processor_name( + _Out_writes_z_(MPI_MAX_PROCESSOR_NAME) char* name, + _Out_ int* resultlen + ); + +/*---------------------------------------------*/ +/* Section 8.2: Memory Allocation */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Alloc_mem( + _In_ MPI_Aint size, + _In_ MPI_Info info, + _Out_ void* baseptr + ); + +MPI_METHOD +PMPI_Alloc_mem( + _In_ MPI_Aint size, + _In_ MPI_Info info, + _Out_ void* baseptr + ); + +MPI_METHOD +MPI_Free_mem( + _In_ _Post_invalid_ void* base + ); + +MPI_METHOD +PMPI_Free_mem( + _In_ _Post_invalid_ void* base + ); + + +/*---------------------------------------------*/ +/* Section 8.3: Error Handling */ +/*---------------------------------------------*/ + +typedef +void +(MPIAPI MPI_Comm_errhandler_fn)( + _In_ MPI_Comm* comm, + _Inout_ int* errcode, + ... + ); + +MPI_METHOD +MPI_Comm_create_errhandler( + _In_ MPI_Comm_errhandler_fn* function, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_Comm_create_errhandler( + _In_ MPI_Comm_errhandler_fn* function, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +MPI_Comm_set_errhandler( + _In_ MPI_Comm comm, + _In_ MPI_Errhandler errhandler + ); + +MPI_METHOD +PMPI_Comm_set_errhandler( + _In_ MPI_Comm comm, + _In_ MPI_Errhandler errhandler + ); + +MPI_METHOD +MPI_Comm_get_errhandler( + _In_ MPI_Comm comm, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_Comm_get_errhandler( + _In_ MPI_Comm comm, + _Out_ MPI_Errhandler* errhandler + ); + + +typedef +void +(MPIAPI MPI_Win_errhandler_fn)( + _In_ MPI_Win* win, + _Inout_ int* errcode, + ... + ); + +MPI_METHOD +MPI_Win_create_errhandler( + _In_ MPI_Win_errhandler_fn* function, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_Win_create_errhandler( + _In_ MPI_Win_errhandler_fn* function, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +MPI_Win_set_errhandler( + _In_ MPI_Win win, + _In_ MPI_Errhandler errhandler + ); + +MPI_METHOD +PMPI_Win_set_errhandler( + _In_ MPI_Win win, + _In_ MPI_Errhandler errhandler + ); + +MPI_METHOD +MPI_Win_get_errhandler( + _In_ MPI_Win win, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_Win_get_errhandler( + _In_ MPI_Win win, + _Out_ MPI_Errhandler* errhandler + ); + + +typedef +void +(MPIAPI MPI_File_errhandler_fn)( + _In_ MPI_File* file, + _Inout_ int* errcode, + ... + ); + +MPI_METHOD +MPI_File_create_errhandler( + _In_ MPI_File_errhandler_fn* function, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_File_create_errhandler( + _In_ MPI_File_errhandler_fn* function, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +MPI_File_set_errhandler( + _In_ MPI_File file, + _In_ MPI_Errhandler errhandler + ); + +MPI_METHOD +PMPI_File_set_errhandler( + _In_ MPI_File file, + _In_ MPI_Errhandler errhandler + ); + +MPI_METHOD +MPI_File_get_errhandler( + _In_ MPI_File file, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_File_get_errhandler( + _In_ MPI_File file, + _Out_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +MPI_Errhandler_free( + _Inout_ MPI_Errhandler* errhandler + ); + +MPI_METHOD +PMPI_Errhandler_free( + _Inout_ MPI_Errhandler* errhandler + ); + +#define MPI_MAX_ERROR_STRING 512 + +MPI_METHOD +MPI_Error_string( + _In_ int errorcode, + _Out_writes_z_(MPI_MAX_ERROR_STRING) char* string, + _Out_ int* resultlen + ); + +MPI_METHOD +PMPI_Error_string( + _In_ int errorcode, + _Out_writes_z_(MPI_MAX_ERROR_STRING) char* string, + _Out_ int* resultlen + ); + + +/*---------------------------------------------*/ +/* Section 8.4: Error Codes and Classes */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Error_class( + _In_ int errorcode, + _Out_ int* errorclass + ); + +MPI_METHOD +PMPI_Error_class( + _In_ int errorcode, + _Out_ int* errorclass + ); + +MPI_METHOD +MPI_Add_error_class( + _Out_ int* errorclass + ); + +MPI_METHOD +PMPI_Add_error_class( + _Out_ int* errorclass + ); + +MPI_METHOD +MPI_Add_error_code( + _In_ int errorclass, + _Out_ int* errorcode + ); + +MPI_METHOD +PMPI_Add_error_code( + _In_ int errorclass, + _Out_ int* errorcode + ); + +MPI_METHOD +MPI_Add_error_string( + _In_ int errorcode, + _In_z_ const char* string + ); + +MPI_METHOD +PMPI_Add_error_string( + _In_ int errorcode, + _In_z_ const char* string + ); + +MPI_METHOD +MPI_Comm_call_errhandler( + _In_ MPI_Comm comm, + _In_ int errorcode + ); + +MPI_METHOD +PMPI_Comm_call_errhandler( + _In_ MPI_Comm comm, + _In_ int errorcode + ); + +MPI_METHOD +MPI_Win_call_errhandler( + _In_ MPI_Win win, + _In_ int errorcode + ); + +MPI_METHOD +PMPI_Win_call_errhandler( + _In_ MPI_Win win, + _In_ int errorcode + ); + +MPI_METHOD +MPI_File_call_errhandler( + _In_ MPI_File file, + _In_ int errorcode + ); + +MPI_METHOD +PMPI_File_call_errhandler( + _In_ MPI_File file, + _In_ int errorcode + ); + + +/*---------------------------------------------*/ +/* Section 8.6: Timers and Synchronization */ +/*---------------------------------------------*/ + +double +MPIAPI +MPI_Wtime( + void + ); + +double +MPIAPI +PMPI_Wtime( + void + ); + +double +MPIAPI +MPI_Wtick( + void + ); + +double +MPIAPI +PMPI_Wtick( + void + ); + + +/*---------------------------------------------*/ +/* Section 8.7: Startup */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Init( + _In_opt_ const int* argc, + _Notref_ _In_reads_opt_(*argc) char*** argv + ); + +MPI_METHOD +PMPI_Init( + _In_opt_ int* argc, + _Notref_ _In_reads_opt_(*argc) char*** argv + ); + +MPI_METHOD +MPI_Finalize( + void + ); + +MPI_METHOD +PMPI_Finalize( + void + ); + +MPI_METHOD +MPI_Initialized( + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Initialized( + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Abort( + _In_ MPI_Comm comm, + _In_ int errorcode + ); + +MPI_METHOD +PMPI_Abort( + _In_ MPI_Comm comm, + _In_ int errorcode + ); + +MPI_METHOD +MPI_Finalized( + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Finalized( + _mpi_out_flag_ int* flag + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 9: The Info Object */ +/*---------------------------------------------------------------------------*/ + +#define MPI_MAX_INFO_KEY 255 +#define MPI_MAX_INFO_VAL 1024 + +MPI_METHOD +MPI_Info_create( + _Out_ MPI_Info* info + ); + +MPI_METHOD +PMPI_Info_create( + _Out_ MPI_Info* info + ); + +MPI_METHOD +MPI_Info_set( + _In_ MPI_Info info, + _In_z_ const char* key, + _In_z_ const char* value + ); + +MPI_METHOD +PMPI_Info_set( + _In_ MPI_Info info, + _In_z_ const char* key, + _In_z_ const char* value + ); + +MPI_METHOD +MPI_Info_delete( + _In_ MPI_Info info, + _In_z_ const char* key + ); + +MPI_METHOD +PMPI_Info_delete( + _In_ MPI_Info info, + _In_z_ const char* key + ); + +MPI_METHOD +MPI_Info_get( + _In_ MPI_Info info, + _In_z_ const char* key, + _In_ int valuelen, + _When_(*flag != 0, _Out_writes_z_(valuelen)) char* value, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Info_get( + _In_ MPI_Info info, + _In_z_ const char* key, + _In_ int valuelen, + _When_(*flag != 0, _Out_writes_z_(valuelen)) char* value, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Info_get_valuelen( + _In_ MPI_Info info, + _In_z_ const char* key, + _Out_ _Deref_out_range_(0, MPI_MAX_INFO_VAL) int* valuelen, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Info_get_valuelen( + _In_ MPI_Info info, + _In_z_ const char* key, + _Out_ _Deref_out_range_(0, MPI_MAX_INFO_VAL) int* valuelen, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_Info_get_nkeys( + _In_ MPI_Info info, + _Out_ int* nkeys + ); + +MPI_METHOD +PMPI_Info_get_nkeys( + _In_ MPI_Info info, + _Out_ int* nkeys + ); + +MPI_METHOD +MPI_Info_get_nthkey( + _In_ MPI_Info info, + _In_range_(>=, 0) int n, + _Out_writes_z_(MPI_MAX_INFO_KEY) char* key + ); + +MPI_METHOD +PMPI_Info_get_nthkey( + _In_ MPI_Info info, + _In_range_(>=, 0) int n, + _Out_writes_z_(MPI_MAX_INFO_KEY) char* key + ); + +MPI_METHOD +MPI_Info_dup( + _In_ MPI_Info info, + _Out_ MPI_Info* newinfo + ); + +MPI_METHOD +PMPI_Info_dup( + _In_ MPI_Info info, + _Out_ MPI_Info* newinfo + ); + +MPI_METHOD +MPI_Info_free( + _Inout_ MPI_Info* info + ); + +MPI_METHOD +PMPI_Info_free( + _Inout_ MPI_Info* info + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 10: Process Creation and Management */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 10.3: Process Manager Interface */ +/*---------------------------------------------*/ + +#define MPI_ARGV_NULL ((char**)0) +#define MPI_ARGVS_NULL ((char***)0) + +#define MPI_ERRCODES_IGNORE ((int*)0) + +MPI_METHOD +MPI_Comm_spawn( + _In_z_ const char* command, + _In_ char* argv[], + _In_range_(>=, 0) int maxprocs, + _In_ MPI_Info info, + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* intercomm, + _Out_writes_(maxprocs) int array_of_errcodes[] + ); + +MPI_METHOD +PMPI_Comm_spawn( + _In_z_ const char* command, + _In_ char* argv[], + _In_range_(>=, 0) int maxprocs, + _In_ MPI_Info info, + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* intercomm, + _Out_writes_(maxprocs) int array_of_errcodes[] + ); + +MPI_METHOD +MPI_Comm_get_parent( + _Out_ MPI_Comm* parent + ); + +MPI_METHOD +PMPI_Comm_get_parent( + _Out_ MPI_Comm* parent + ); + +MPI_METHOD +MPI_Comm_spawn_multiple( + _In_range_(>, 0) int count, + _In_reads_z_(count) char* array_of_commands[], + _In_reads_z_(count) char** array_of_argv[], + _In_reads_(count) const int array_of_maxprocs[], + _In_reads_(count) const MPI_Info array_of_info[], + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* intercomm, + _Out_ int array_of_errcodes[] + ); + +MPI_METHOD +PMPI_Comm_spawn_multiple( + _In_range_(>, 0) int count, + _In_reads_z_(count) char* array_of_commands[], + _In_reads_z_(count) char** array_of_argv[], + _In_reads_(count) const int array_of_maxprocs[], + _In_reads_(count) const MPI_Info array_of_info[], + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* intercomm, + _Out_ int array_of_errcodes[] + ); + + +/*---------------------------------------------*/ +/* Section 10.4: Establishing Communication */ +/*---------------------------------------------*/ + +#define MPI_MAX_PORT_NAME 256 + +MPI_METHOD +MPI_Open_port( + _In_ MPI_Info info, + _Out_writes_z_(MPI_MAX_PORT_NAME) char* port_name + ); + +MPI_METHOD +PMPI_Open_port( + _In_ MPI_Info info, + _Out_writes_z_(MPI_MAX_PORT_NAME) char* port_name + ); + +MPI_METHOD +MPI_Close_port( + _In_z_ const char* port_name + ); + +MPI_METHOD +PMPI_Close_port( + _In_z_ const char* port_name + ); + +MPI_METHOD +MPI_Comm_accept( + _In_z_ const char* port_name, + _In_ MPI_Info info, + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +PMPI_Comm_accept( + _In_z_ const char* port_name, + _In_ MPI_Info info, + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +MPI_Comm_connect( + _In_z_ const char* port_name, + _In_ MPI_Info info, + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* newcomm + ); + +MPI_METHOD +PMPI_Comm_connect( + _In_z_ const char* port_name, + _In_ MPI_Info info, + _In_range_(>=, 0) int root, + _In_ MPI_Comm comm, + _Out_ MPI_Comm* newcomm + ); + + +/*---------------------------------------------*/ +/* Section 10.4.4: Name Publishing */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Publish_name( + _In_z_ const char* service_name, + _In_ MPI_Info info, + _In_z_ const char* port_name + ); + +MPI_METHOD +PMPI_Publish_name( + _In_z_ const char* service_name, + _In_ MPI_Info info, + _In_z_ const char* port_name + ); + +MPI_METHOD +MPI_Unpublish_name( + _In_z_ const char* service_name, + _In_ MPI_Info info, + _In_z_ const char* port_name + ); + +MPI_METHOD +PMPI_Unpublish_name( + _In_z_ const char* service_name, + _In_ MPI_Info info, + _In_z_ const char* port_name + ); + +MPI_METHOD +MPI_Lookup_name( + _In_z_ const char* service_name, + _In_ MPI_Info info, + _Out_writes_z_(MPI_MAX_PORT_NAME) char* port_name + ); + +MPI_METHOD +PMPI_Lookup_name( + _In_z_ const char* service_name, + _In_ MPI_Info info, + _Out_writes_z_(MPI_MAX_PORT_NAME) char* port_name + ); + + +/*---------------------------------------------*/ +/* Section 10.5: Other Functionality */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Comm_disconnect( + _In_ MPI_Comm* comm + ); + +MPI_METHOD +PMPI_Comm_disconnect( + _In_ MPI_Comm* comm + ); + +MPI_METHOD +MPI_Comm_join( + _In_ int fd, + _Out_ MPI_Comm* intercomm + ); + +MPI_METHOD +PMPI_Comm_join( + _In_ int fd, + _Out_ MPI_Comm* intercomm + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 11: One-Sided Communications */ +/*---------------------------------------------------------------------------*/ + +MPI_METHOD +MPI_Win_create( + _In_ void* base, + _In_range_(>=, 0) MPI_Aint size, + _In_range_(>, 0) int disp_unit, + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ MPI_Win* win + ); + +MPI_METHOD +PMPI_Win_create( + _In_ void* base, + _In_range_(>=, 0) MPI_Aint size, + _In_range_(>, 0) int disp_unit, + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ MPI_Win* win + ); + +MPI_METHOD +MPI_Win_allocate( + _In_range_(>= , 0) MPI_Aint size, + _In_range_(>, 0) int disp_unit, + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ void *baseptr, + _Out_ MPI_Win *win + ); + +MPI_METHOD +PMPI_Win_allocate( + _In_range_(>= , 0) MPI_Aint size, + _In_range_(>, 0) int disp_unit, + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ void *baseptr, + _Out_ MPI_Win *win + ); + +MPI_METHOD +MPI_Win_allocate_shared( + _In_range_(>=, 0) MPI_Aint size, + _In_range_(>, 0) int disp_unit, + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ void *baseptr, + _Out_ MPI_Win *win + ); + +MPI_METHOD +PMPI_Win_allocate_shared( + _In_range_(>=, 0) MPI_Aint size, + _In_range_(>, 0) int disp_unit, + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ void *baseptr, + _Out_ MPI_Win *win + ); + +MPI_METHOD +MPI_Win_shared_query( + _In_ MPI_Win win, + _In_range_(>=, MPI_PROC_NULL) int rank, + _Out_ MPI_Aint *size, + _Out_ int *disp_unit, + _Out_ void *baseptr + ); + +MPI_METHOD +PMPI_Win_shared_query( + _In_ MPI_Win win, + _In_range_(>=, MPI_PROC_NULL) int rank, + _Out_ MPI_Aint *size, + _Out_ int *disp_unit, + _Out_ void *baseptr + ); + +MPI_METHOD +MPI_Win_create_dynamic( + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ MPI_Win* win + ); + +MPI_METHOD +PMPI_Win_create_dynamic( + _In_ MPI_Info info, + _In_ MPI_Comm comm, + _Out_ MPI_Win* win + ); + +MPI_METHOD +MPI_Win_free( + _Inout_ MPI_Win* win + ); + +MPI_METHOD +PMPI_Win_free( + _Inout_ MPI_Win* win + ); + +MPI_METHOD +MPI_Win_get_group( + _In_ MPI_Win win, + _Out_ MPI_Group* group + ); + +MPI_METHOD +PMPI_Win_get_group( + _In_ MPI_Win win, + _Out_ MPI_Group* group + ); + +MPI_METHOD +MPI_Win_attach( + _In_ MPI_Win win, + _In_ void* base, + _In_range_(>=, 0) MPI_Aint size + ); + +MPI_METHOD +PMPI_Win_attach( + _In_ MPI_Win win, + _In_ void* base, + _In_range_(>=, 0) MPI_Aint size + ); + +MPI_METHOD +MPI_Win_detach( + _In_ MPI_Win win, + _In_ void* base + ); + +MPI_METHOD +PMPI_Win_detach( + _In_ MPI_Win win, + _In_ void* base + ); + +MPI_METHOD +MPI_Put( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Put( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Rput( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win, + _Out_ MPI_Request *request + ); + +MPI_METHOD +PMPI_Rput( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win, + _Out_ MPI_Request *request + ); + +MPI_METHOD +MPI_Get( + _In_opt_ void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Get( + _In_opt_ void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Rget( + _In_opt_ void* origin_addr, + _In_range_(>= , 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_range_(>= , 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win, + _Out_ MPI_Request *request + ); + +MPI_METHOD +PMPI_Rget( + _In_opt_ void* origin_addr, + _In_range_(>= , 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_range_(>= , 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Win win, + _Out_ MPI_Request *request + ); + +MPI_METHOD +MPI_Accumulate( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Accumulate( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Raccumulate( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win, + _Out_ MPI_Request *request + ); + +MPI_METHOD +PMPI_Raccumulate( + _In_opt_ const void* origin_addr, + _In_range_(>=, 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_range_(>=, MPI_PROC_NULL) int target_rank, + _In_range_(>=, 0) MPI_Aint target_disp, + _In_range_(>=, 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win, + _Out_ MPI_Request *request + ); + +MPI_METHOD +MPI_Get_accumulate( + _In_opt_ const void* origin_addr, + _In_range_(>= , 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_opt_ void* result_addr, + _In_range_(>= , 0) int result_count, + _In_ MPI_Datatype result_datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_range_(>= , 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win +); + +MPI_METHOD +PMPI_Get_accumulate( + _In_opt_ const void* origin_addr, + _In_range_(>= , 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_opt_ void* result_addr, + _In_range_(>= , 0) int result_count, + _In_ MPI_Datatype result_datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_range_(>= , 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win +); + +MPI_METHOD +MPI_Rget_accumulate( + _In_opt_ const void* origin_addr, + _In_range_(>= , 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_opt_ void* result_addr, + _In_range_(>= , 0) int result_count, + _In_ MPI_Datatype result_datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_range_(>= , 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win, + _Out_ MPI_Request *request +); + +MPI_METHOD +PMPI_Rget_accumulate( + _In_opt_ const void* origin_addr, + _In_range_(>= , 0) int origin_count, + _In_ MPI_Datatype origin_datatype, + _In_opt_ void* result_addr, + _In_range_(>= , 0) int result_count, + _In_ MPI_Datatype result_datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_range_(>= , 0) int target_count, + _In_ MPI_Datatype target_datatype, + _In_ MPI_Op op, + _In_ MPI_Win win, + _Out_ MPI_Request *request +); + +MPI_METHOD +MPI_Fetch_and_op( + _In_opt_ const void* origin_addr, + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + void* result_addr, + _In_ MPI_Datatype datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_ MPI_Op op, + _In_ MPI_Win win +); + +MPI_METHOD +PMPI_Fetch_and_op( + _In_opt_ const void* origin_addr, + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + void* result_addr, + _In_ MPI_Datatype datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_ MPI_Op op, + _In_ MPI_Win win +); + +MPI_METHOD +MPI_Compare_and_swap( + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + const void* origin_addr, + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + const void* compare_addr, + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + void* result_addr, + _In_ MPI_Datatype datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_ MPI_Win win +); + +MPI_METHOD +PMPI_Compare_and_swap( + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + const void* origin_addr, + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + const void* compare_addr, + _When_(target_rank != MPI_PROC_NULL, _In_) + _When_(target_rank == MPI_PROC_NULL, _In_opt_) + void* result_addr, + _In_ MPI_Datatype datatype, + _In_range_(>= , MPI_PROC_NULL) int target_rank, + _In_range_(>= , 0) MPI_Aint target_disp, + _In_ MPI_Win win +); + +/* Asserts for one-sided communication */ +#define MPI_MODE_NOCHECK 1024 +#define MPI_MODE_NOSTORE 2048 +#define MPI_MODE_NOPUT 4096 +#define MPI_MODE_NOPRECEDE 8192 +#define MPI_MODE_NOSUCCEED 16384 + +MPI_METHOD +MPI_Win_fence( + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_fence( + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_start( + _In_ MPI_Group group, + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_start( + _In_ MPI_Group group, + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_complete( + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_complete( + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_post( + _In_ MPI_Group group, + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_post( + _In_ MPI_Group group, + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_wait( + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_wait( + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_test( + _In_ MPI_Win win, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Win_test( + _In_ MPI_Win win, + _mpi_out_flag_ int* flag + ); + +#define MPI_LOCK_EXCLUSIVE 234 +#define MPI_LOCK_SHARED 235 + +MPI_METHOD +MPI_Win_lock( + _In_ int lock_type, + _In_range_(>=, MPI_PROC_NULL) int rank, + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_lock( + _In_ int lock_type, + _In_range_(>=, MPI_PROC_NULL) int rank, + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_lock_all( + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_lock_all( + _In_ int assert, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_unlock( + _In_range_(>=, MPI_PROC_NULL) int rank, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_unlock( + _In_range_(>=, MPI_PROC_NULL) int rank, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_unlock_all( + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_unlock_all( + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_flush( + _In_range_(>=, MPI_PROC_NULL) int rank, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_flush( + _In_range_(>=, MPI_PROC_NULL) int rank, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_flush_all( + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_flush_all( + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_flush_local( + _In_range_(>= , MPI_PROC_NULL) int rank, + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_flush_local( + _In_range_(>= , MPI_PROC_NULL) int rank, + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_flush_local_all( + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_flush_local_all( + _In_ MPI_Win win + ); + +MPI_METHOD +MPI_Win_sync( + _In_ MPI_Win win + ); + +MPI_METHOD +PMPI_Win_sync( + _In_ MPI_Win win + ); + +/*---------------------------------------------------------------------------*/ +/* Chapter 12: External Interfaces */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 12.2: Generalized Requests */ +/*---------------------------------------------*/ + +typedef +int +(MPIAPI MPI_Grequest_query_function)( + _In_opt_ void* extra_state, + _Out_ MPI_Status* status + ); + +typedef +int +(MPIAPI MPI_Grequest_free_function)( + _In_opt_ void* extra_state + ); + +typedef +int +(MPIAPI MPI_Grequest_cancel_function)( + _In_opt_ void* extra_state, + _In_ int complete + ); + +MPI_METHOD +MPI_Grequest_start( + _In_ MPI_Grequest_query_function* query_fn, + _In_ MPI_Grequest_free_function* free_fn, + _In_ MPI_Grequest_cancel_function* cancel_fn, + _In_opt_ void* extra_state, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_Grequest_start( + _In_ MPI_Grequest_query_function* query_fn, + _In_ MPI_Grequest_free_function* free_fn, + _In_ MPI_Grequest_cancel_function* cancel_fn, + _In_opt_ void* extra_state, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_Grequest_complete( + _In_ MPI_Request request + ); + +MPI_METHOD +PMPI_Grequest_complete( + _In_ MPI_Request request + ); + + +/*---------------------------------------------*/ +/* Section 12.3: Information with Status */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Status_set_elements( + _In_ MPI_Status* status, + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) int count + ); + +MPI_METHOD +PMPI_Status_set_elements( + _In_ MPI_Status* status, + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) int count + ); + +MPI_METHOD +MPI_Status_set_elements_x( + _In_ MPI_Status* status, + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) MPI_Count count + ); + +MPI_METHOD +PMPI_Status_set_elements_x( + _In_ MPI_Status* status, + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) MPI_Count count + ); + +MPI_METHOD +MPI_Status_set_cancelled( + _In_ MPI_Status* status, + _In_range_(0,1) int flag + ); + +MPI_METHOD +PMPI_Status_set_cancelled( + _In_ MPI_Status* status, + _In_range_(0,1) int flag + ); + + +/*---------------------------------------------*/ +/* Section 12.4: Threads */ +/*---------------------------------------------*/ + +#define MPI_THREAD_SINGLE 0 +#define MPI_THREAD_FUNNELED 1 +#define MPI_THREAD_SERIALIZED 2 +#define MPI_THREAD_MULTIPLE 3 + +MPI_METHOD +MPI_Init_thread( + _In_opt_ const int* argc, + _Notref_ _In_reads_opt_(*argc) char*** argv, + _In_ int required, + _Out_ int* provided + ); + +MPI_METHOD +PMPI_Init_thread( + _In_opt_ int* argc, + _Notref_ _In_reads_opt_(*argc) char*** argv, + _In_ int required, + _Out_ int* provided + ); + +MPI_METHOD +MPI_Query_thread( + _Out_ int* provided + ); + +MPI_METHOD +PMPI_Query_thread( + _Out_ int* provided + ); + +MPI_METHOD +MPI_Is_thread_main( + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_Is_thread_main( + _mpi_out_flag_ int* flag + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 13: I/O */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 13.2: File Manipulation */ +/*---------------------------------------------*/ + +#define MPI_MODE_CREATE 0x00000001 +#define MPI_MODE_RDONLY 0x00000002 +#define MPI_MODE_WRONLY 0x00000004 +#define MPI_MODE_RDWR 0x00000008 +#define MPI_MODE_DELETE_ON_CLOSE 0x00000010 +#define MPI_MODE_UNIQUE_OPEN 0x00000020 +#define MPI_MODE_EXCL 0x00000040 +#define MPI_MODE_APPEND 0x00000080 +#define MPI_MODE_SEQUENTIAL 0x00000100 +#define MSMPI_MODE_HIDDEN 0x00000200 + +MPI_METHOD +MPI_File_open( + _In_ MPI_Comm comm, + _In_z_ const char* filename, + _In_ int amode, + _In_ MPI_Info info, + _Out_ MPI_File* fh + ); + +MPI_METHOD +PMPI_File_open( + _In_ MPI_Comm comm, + _In_z_ const char* filename, + _In_ int amode, + _In_ MPI_Info info, + _Out_ MPI_File* fh + ); + +MPI_METHOD +MPI_File_close( + _In_ MPI_File* fh + ); + +MPI_METHOD +PMPI_File_close( + _In_ MPI_File* fh + ); + +MPI_METHOD +MPI_File_delete( + _In_z_ const char* filename, + _In_ MPI_Info info + ); + +MPI_METHOD +PMPI_File_delete( + _In_z_ const char* filename, + _In_ MPI_Info info + ); + +MPI_METHOD +MPI_File_set_size( + _In_ MPI_File fh, + _In_ MPI_Offset size + ); + +MPI_METHOD +PMPI_File_set_size( + _In_ MPI_File fh, + _In_ MPI_Offset size + ); + +MPI_METHOD +MPI_File_preallocate( + _In_ MPI_File fh, + _In_ MPI_Offset size + ); + +MPI_METHOD +PMPI_File_preallocate( + _In_ MPI_File fh, + _In_ MPI_Offset size + ); + +MPI_METHOD +MPI_File_get_size( + _In_ MPI_File fh, + _Out_ MPI_Offset* size + ); + +MPI_METHOD +PMPI_File_get_size( + _In_ MPI_File fh, + _Out_ MPI_Offset* size + ); + +MPI_METHOD +MPI_File_get_group( + _In_ MPI_File fh, + _Out_ MPI_Group* group + ); + +MPI_METHOD +PMPI_File_get_group( + _In_ MPI_File fh, + _Out_ MPI_Group* group + ); + +MPI_METHOD +MPI_File_get_amode( + _In_ MPI_File fh, + _Out_ int* amode + ); + +MPI_METHOD +PMPI_File_get_amode( + _In_ MPI_File fh, + _Out_ int* amode + ); + +MPI_METHOD +MPI_File_set_info( + _In_ MPI_File fh, + _In_ MPI_Info info + ); + +MPI_METHOD +PMPI_File_set_info( + _In_ MPI_File fh, + _In_ MPI_Info info + ); + +MPI_METHOD +MPI_File_get_info( + _In_ MPI_File fh, + _Out_ MPI_Info* info_used + ); + +MPI_METHOD +PMPI_File_get_info( + _In_ MPI_File fh, + _Out_ MPI_Info* info_used + ); + + +/*---------------------------------------------*/ +/* Section 13.3: File Views */ +/*---------------------------------------------*/ + +#define MPI_DISPLACEMENT_CURRENT (-54278278) + +MPI_METHOD +MPI_File_set_view( + _In_ MPI_File fh, + _In_ MPI_Offset disp, + _In_ MPI_Datatype etype, + _In_ MPI_Datatype filetype, + _In_z_ const char* datarep, + _In_ MPI_Info info + ); + +MPI_METHOD +PMPI_File_set_view( + _In_ MPI_File fh, + _In_ MPI_Offset disp, + _In_ MPI_Datatype etype, + _In_ MPI_Datatype filetype, + _In_z_ const char* datarep, + _In_ MPI_Info info + ); + +#define MPI_MAX_DATAREP_STRING 128 + +MPI_METHOD +MPI_File_get_view( + _In_ MPI_File fh, + _Out_ MPI_Offset* disp, + _Out_ MPI_Datatype* etype, + _Out_ MPI_Datatype* filetype, + _Out_writes_z_(MPI_MAX_DATAREP_STRING) char* datarep + ); + +MPI_METHOD +PMPI_File_get_view( + _In_ MPI_File fh, + _Out_ MPI_Offset* disp, + _Out_ MPI_Datatype* etype, + _Out_ MPI_Datatype* filetype, + _Out_writes_z_(MPI_MAX_DATAREP_STRING) char* datarep + ); + + +/*---------------------------------------------*/ +/* Section 13.4: Data Access */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_File_read_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_read_at_all( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_at_all( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_at_all( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_at_all( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_iread_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_File_iread_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_File_iwrite_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_File_iwrite_at( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_File_read( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_read_all( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_all( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_all( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_all( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + + +MPI_METHOD +MPI_File_iread( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_File_iread( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_File_iwrite( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_File_iwrite( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + + +/* File seek whence */ +#define MPI_SEEK_SET 600 +#define MPI_SEEK_CUR 602 +#define MPI_SEEK_END 604 + +MPI_METHOD +MPI_File_seek( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_ int whence + ); + +MPI_METHOD +PMPI_File_seek( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_ int whence + ); + +MPI_METHOD +MPI_File_get_position( + _In_ MPI_File fh, + _Out_ MPI_Offset* offset + ); + +MPI_METHOD +PMPI_File_get_position( + _In_ MPI_File fh, + _Out_ MPI_Offset* offset + ); + +MPI_METHOD +MPI_File_get_byte_offset( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_ MPI_Offset* disp + ); + +MPI_METHOD +PMPI_File_get_byte_offset( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_ MPI_Offset* disp + ); + +MPI_METHOD +MPI_File_read_shared( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_shared( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_shared( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_shared( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_iread_shared( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_File_iread_shared( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_File_iwrite_shared( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +PMPI_File_iwrite_shared( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Request* request + ); + +MPI_METHOD +MPI_File_read_ordered( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_ordered( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_ordered( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_ordered( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_seek_shared( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_ int whence + ); + +MPI_METHOD +PMPI_File_seek_shared( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_ int whence + ); + +MPI_METHOD +MPI_File_get_position_shared( + _In_ MPI_File fh, + _Out_ MPI_Offset* offset + ); + +MPI_METHOD +PMPI_File_get_position_shared( + _In_ MPI_File fh, + _Out_ MPI_Offset* offset + ); + +MPI_METHOD +MPI_File_read_at_all_begin( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_File_read_at_all_begin( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_File_read_at_all_end( + _In_ MPI_File fh, + _Out_ void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_at_all_end( + _In_ MPI_File fh, + _Out_ void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_at_all_begin( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_File_write_at_all_begin( + _In_ MPI_File fh, + _In_ MPI_Offset offset, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_File_write_at_all_end( + _In_ MPI_File fh, + _In_ const void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_at_all_end( + _In_ MPI_File fh, + _In_ const void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_read_all_begin( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_File_read_all_begin( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_File_read_all_end( + _In_ MPI_File fh, + _Out_ void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_all_end( + _In_ MPI_File fh, + _Out_ void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_all_begin( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_File_write_all_begin( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_File_write_all_end( + _In_ MPI_File fh, + _In_ const void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_all_end( + _In_ MPI_File fh, + _In_ const void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_read_ordered_begin( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_File_read_ordered_begin( + _In_ MPI_File fh, + _Out_opt_ void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_File_read_ordered_end( + _In_ MPI_File fh, + _Out_ void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_read_ordered_end( + _In_ MPI_File fh, + _Out_ void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +MPI_File_write_ordered_begin( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +PMPI_File_write_ordered_begin( + _In_ MPI_File fh, + _In_opt_ const void* buf, + _In_range_(>=, 0) int count, + _In_ MPI_Datatype datatype + ); + +MPI_METHOD +MPI_File_write_ordered_end( + _In_ MPI_File fh, + _In_ const void* buf, + _Out_ MPI_Status* status + ); + +MPI_METHOD +PMPI_File_write_ordered_end( + _In_ MPI_File fh, + _In_ const void* buf, + _Out_ MPI_Status* status + ); + + +/*---------------------------------------------*/ +/* Section 13.5: File Interoperability */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_File_get_type_extent( + _In_ MPI_File fh, + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* extent + ); + +MPI_METHOD +PMPI_File_get_type_extent( + _In_ MPI_File fh, + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* extent + ); + + +typedef +int +(MPIAPI MPI_Datarep_conversion_function)( + _Inout_ void* userbuf, + _In_ MPI_Datatype datatype, + _In_range_(>=, 0) int count, + _Inout_ void* filebuf, + _In_ MPI_Offset position, + _In_opt_ void* extra_state + ); + +typedef +int +(MPIAPI MPI_Datarep_extent_function)( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* file_extent, + _In_opt_ void* extra_state + ); + +#define MPI_CONVERSION_FN_NULL ((MPI_Datarep_conversion_function*)0) + +MPI_METHOD +MPI_Register_datarep( + _In_z_ const char* datarep, + _In_opt_ MPI_Datarep_conversion_function* read_conversion_fn, + _In_opt_ MPI_Datarep_conversion_function* write_conversion_fn, + _In_ MPI_Datarep_extent_function* dtype_file_extent_fn, + _In_opt_ void* extra_state + ); + +MPI_METHOD +PMPI_Register_datarep( + _In_z_ const char* datarep, + _In_opt_ MPI_Datarep_conversion_function* read_conversion_fn, + _In_opt_ MPI_Datarep_conversion_function* write_conversion_fn, + _In_ MPI_Datarep_extent_function* dtype_file_extent_fn, + _In_opt_ void* extra_state + ); + + +/*---------------------------------------------*/ +/* Section 13.6: Consistency and Semantics */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_File_set_atomicity( + _In_ MPI_File fh, + _In_range_(0, 1) int flag + ); + +MPI_METHOD +PMPI_File_set_atomicity( + _In_ MPI_File fh, + _In_range_(0, 1) int flag + ); + +MPI_METHOD +MPI_File_get_atomicity( + _In_ MPI_File fh, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +PMPI_File_get_atomicity( + _In_ MPI_File fh, + _mpi_out_flag_ int* flag + ); + +MPI_METHOD +MPI_File_sync( + _In_ MPI_File fh + ); + +MPI_METHOD +PMPI_File_sync( + _In_ MPI_File fh + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 14: Profiling Interface */ +/*---------------------------------------------------------------------------*/ + +MPI_METHOD +MPI_Pcontrol( + _In_ const int level, + ... + ); + +MPI_METHOD +PMPI_Pcontrol( + _In_ const int level, + ... + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 15: Deprecated Functions */ +/*---------------------------------------------------------------------------*/ + +#ifdef MSMPI_NO_DEPRECATE_20 +#define MSMPI_DEPRECATE_20( x ) +#else +#define MSMPI_DEPRECATE_20( x ) __declspec(deprecated( \ + "Deprecated in MPI 2.0, use '" #x "'. " \ + "To disable deprecation, define MSMPI_NO_DEPRECATE_20." )) +#endif + +MSMPI_DEPRECATE_20( MPI_Type_create_hvector ) +MPI_METHOD +MPI_Type_hvector( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _In_ MPI_Aint stride, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MSMPI_DEPRECATE_20( PMPI_Type_create_hvector ) +MPI_METHOD +PMPI_Type_hvector( + _In_range_(>=, 0) int count, + _In_range_(>=, 0) int blocklength, + _In_ MPI_Aint stride, + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MSMPI_DEPRECATE_20( MPI_Type_create_hindexed ) +MPI_METHOD +MPI_Type_hindexed( + _In_range_(>=, 0) int count, + _In_reads_opt_(count) const int array_of_blocklengths[], + _In_reads_opt_(count) const MPI_Aint array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MSMPI_DEPRECATE_20( PMPI_Type_create_hindexed ) +MPI_METHOD +PMPI_Type_hindexed( + _In_range_(>=, 0) int count, + _In_reads_opt_(count) const int array_of_blocklengths[], + _In_reads_opt_(count) const MPI_Aint array_of_displacements[], + _In_ MPI_Datatype oldtype, + _Out_ MPI_Datatype* newtype + ); + +MSMPI_DEPRECATE_20( MPI_Type_create_struct ) +MPI_METHOD +MPI_Type_struct( + _In_range_(>=, 0) int count, + _In_reads_opt_(count) const int array_of_blocklengths[], + _In_reads_opt_(count) const MPI_Aint array_of_displacements[], + _In_reads_opt_(count) const MPI_Datatype array_of_types[], + _Out_ MPI_Datatype* newtype + ); + +MSMPI_DEPRECATE_20( PMPI_Type_create_struct ) +MPI_METHOD +PMPI_Type_struct( + _In_range_(>=, 0) int count, + _In_reads_opt_(count) const int array_of_blocklengths[], + _In_reads_opt_(count) const MPI_Aint array_of_displacements[], + _In_reads_opt_(count) const MPI_Datatype array_of_types[], + _Out_ MPI_Datatype* newtype + ); + +MSMPI_DEPRECATE_20( MPI_Get_address ) +MPI_METHOD +MPI_Address( + _In_ void* location, + _Out_ MPI_Aint* address + ); + +MSMPI_DEPRECATE_20( PMPI_Get_address ) +MPI_METHOD +PMPI_Address( + _In_ void* location, + _Out_ MPI_Aint* address + ); + +MSMPI_DEPRECATE_20( MPI_Type_get_extent ) +MPI_METHOD +MPI_Type_extent( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* extent + ); + +MSMPI_DEPRECATE_20( PMPI_Type_get_extent ) +MPI_METHOD +PMPI_Type_extent( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* extent + ); + +MSMPI_DEPRECATE_20( MPI_Type_get_extent ) +MPI_METHOD +MPI_Type_lb( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* displacement + ); + +MSMPI_DEPRECATE_20( PMPI_Type_get_extent ) +MPI_METHOD +PMPI_Type_lb( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* displacement + ); + +MSMPI_DEPRECATE_20( MPI_Type_get_extent ) +MPI_METHOD +MPI_Type_ub( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* displacement + ); + +MSMPI_DEPRECATE_20( PMPI_Type_get_extent ) +MPI_METHOD +PMPI_Type_ub( + _In_ MPI_Datatype datatype, + _Out_ MPI_Aint* displacement + ); + + +typedef MPI_Comm_copy_attr_function MPI_Copy_function; +typedef MPI_Comm_delete_attr_function MPI_Delete_function; + +#define MPI_NULL_COPY_FN ((MPI_Copy_function*)0) +#define MPI_NULL_DELETE_FN ((MPI_Delete_function*)0) +#define MPI_DUP_FN MPIR_Dup_fn + + +MSMPI_DEPRECATE_20( MPI_Comm_create_keyval ) +MPI_METHOD +MPI_Keyval_create( + _In_opt_ MPI_Copy_function* copy_fn, + _In_opt_ MPI_Delete_function* delete_fn, + _Out_ int* keyval, + _In_opt_ void* extra_state + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_create_keyval ) +MPI_METHOD +PMPI_Keyval_create( + _In_opt_ MPI_Copy_function* copy_fn, + _In_opt_ MPI_Delete_function* delete_fn, + _Out_ int* keyval, + _In_opt_ void* extra_state + ); + +MSMPI_DEPRECATE_20( MPI_Comm_free_keyval ) +MPI_METHOD +MPI_Keyval_free( + _Inout_ int* keyval + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_free_keyval ) +MPI_METHOD +PMPI_Keyval_free( + _Inout_ int* keyval + ); + +MSMPI_DEPRECATE_20( MPI_Comm_set_attr ) +MPI_METHOD +MPI_Attr_put( + _In_ MPI_Comm comm, + _In_ int keyval, + _In_opt_ void* attribute_val + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_set_attr ) +MPI_METHOD +PMPI_Attr_put( + _In_ MPI_Comm comm, + _In_ int keyval, + _In_opt_ void* attribute_val + ); + +MSMPI_DEPRECATE_20( MPI_Comm_get_attr ) +MPI_METHOD +MPI_Attr_get( + _In_ MPI_Comm comm, + _In_ int keyval, + _Out_ void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_get_attr ) +MPI_METHOD +PMPI_Attr_get( + _In_ MPI_Comm comm, + _In_ int keyval, + _Out_ void* attribute_val, + _mpi_out_flag_ int* flag + ); + +MSMPI_DEPRECATE_20( MPI_Comm_delete_attr ) +MPI_METHOD +MPI_Attr_delete( + _In_ MPI_Comm comm, + _In_ int keyval + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_delete_attr ) +MPI_METHOD +PMPI_Attr_delete( + _In_ MPI_Comm comm, + _In_ int keyval + ); + + +typedef MPI_Comm_errhandler_fn MPI_Handler_function; + +MSMPI_DEPRECATE_20( MPI_Comm_create_errhandler ) +MPI_METHOD +MPI_Errhandler_create( + _In_ MPI_Handler_function* function, + _Out_ MPI_Errhandler* errhandler + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_create_errhandler ) +MPI_METHOD +PMPI_Errhandler_create( + _In_ MPI_Handler_function* function, + _Out_ MPI_Errhandler* errhandler + ); + +MSMPI_DEPRECATE_20( MPI_Comm_set_errhandler ) +MPI_METHOD +MPI_Errhandler_set( + _In_ MPI_Comm comm, + _In_ MPI_Errhandler errhandler + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_set_errhandler ) +MPI_METHOD +PMPI_Errhandler_set( + _In_ MPI_Comm comm, + _In_ MPI_Errhandler errhandler + ); + +MSMPI_DEPRECATE_20( MPI_Comm_get_errhandler ) +MPI_METHOD +MPI_Errhandler_get( + _In_ MPI_Comm comm, + _Out_ MPI_Errhandler* errhandler + ); + +MSMPI_DEPRECATE_20( PMPI_Comm_get_errhandler ) +MPI_METHOD +PMPI_Errhandler_get( + _In_ MPI_Comm comm, + _Out_ MPI_Errhandler* errhandler + ); + + +/*---------------------------------------------------------------------------*/ +/* Chapter 16: Language Bindings */ +/*---------------------------------------------------------------------------*/ + +/*---------------------------------------------*/ +/* Section 16.2: Fortran Support */ +/*---------------------------------------------*/ + +MPI_METHOD +MPI_Type_create_f90_real( + _In_ int p, + _In_ int r, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_f90_real( + _In_ int p, + _In_ int r, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_f90_complex( + _In_ int p, + _In_ int r, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_f90_complex( + _In_ int p, + _In_ int r, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +MPI_Type_create_f90_integer( + _In_ int r, + _Out_ MPI_Datatype* newtype + ); + +MPI_METHOD +PMPI_Type_create_f90_integer( + _In_ int r, + _Out_ MPI_Datatype* newtype + ); + +/* typeclasses */ +#define MPI_TYPECLASS_REAL 1 +#define MPI_TYPECLASS_INTEGER 2 +#define MPI_TYPECLASS_COMPLEX 3 + +MPI_METHOD +MPI_Type_match_size( + _In_ int typeclass, + _In_ int size, + _Out_ MPI_Datatype* datatype + ); + +MPI_METHOD +PMPI_Type_match_size( + _In_ int typeclass, + _In_ int size, + _Out_ MPI_Datatype* datatype + ); + + +/*---------------------------------------------*/ +/* Section 16.3: Language Interoperability */ +/*---------------------------------------------*/ + +#define MPI_Comm_c2f(comm) (MPI_Fint)(comm) +#define PMPI_Comm_c2f(comm) (MPI_Fint)(comm) + +#define MPI_Comm_f2c(comm) (MPI_Comm)(comm) +#define PMPI_Comm_f2c(comm) (MPI_Comm)(comm) + + +#define MPI_Type_f2c(datatype) (MPI_Datatype)(datatype) +#define PMPI_Type_f2c(datatype) (MPI_Datatype)(datatype) + +#define MPI_Type_c2f(datatype) (MPI_Fint)(datatype) +#define PMPI_Type_c2f(datatype) (MPI_Fint)(datatype) + + +#define MPI_Group_f2c(group) (MPI_Group)(group) +#define PMPI_Group_f2c(group) (MPI_Group)(group) + +#define MPI_Group_c2f(group) (MPI_Fint)(group) +#define PMPI_Group_c2f(group) (MPI_Fint)(group) + + +#define MPI_Request_f2c(request) (MPI_Request)(request) +#define PMPI_Request_f2c(request) (MPI_Request)(request) + +#define MPI_Request_c2f(request) (MPI_Fint)(request) +#define PMPI_Request_c2f(request) (MPI_Fint)(request) + + +#define MPI_Win_f2c(win) (MPI_Win)(win) +#define PMPI_Win_f2c(win) (MPI_Win)(win) + +#define MPI_Win_c2f(win) (MPI_Fint)(win) +#define PMPI_Win_c2f(win) (MPI_Fint)(win) + + +#define MPI_Op_c2f(op) (MPI_Fint)(op) +#define PMPI_Op_c2f(op) (MPI_Fint)(op) + +#define MPI_Op_f2c(op) (MPI_Op)(op) +#define PMPI_Op_f2c(op) (MPI_Op)(op) + + +#define MPI_Info_c2f(info) (MPI_Fint)(info) +#define PMPI_Info_c2f(info) (MPI_Fint)(info) + +#define MPI_Info_f2c(info) (MPI_Info)(info) +#define PMPI_Info_f2c(info) (MPI_Info)(info) + + +#define MPI_Message_c2f(msg) (MPI_Fint)(msg) +#define PMPI_Message_c2f(msg) (MPI_Fint)(msg) + +#define MPI_Message_f2c(msg) (MPI_Message)(msg) +#define PMPI_Message_f2c(msg) (MPI_Message)(msg) + + +#define MPI_Errhandler_c2f(errhandler) (MPI_Fint)(errhandler) +#define PMPI_Errhandler_c2f(errhandler) (MPI_Fint)(errhandler) + +#define MPI_Errhandler_f2c(errhandler) (MPI_Errhandler)(errhandler) +#define PMPI_Errhandler_f2c(errhandler) (MPI_Errhandler)(errhandler) + + +MPI_File +MPIAPI +MPI_File_f2c( + _In_ MPI_Fint file + ); + +MPI_File +MPIAPI +PMPI_File_f2c( + _In_ MPI_Fint file + ); + +MPI_Fint +MPIAPI +MPI_File_c2f( + _In_ MPI_File file + ); + +MPI_Fint +MPIAPI +PMPI_File_c2f( + _In_ MPI_File file + ); + +MPI_METHOD +MPI_Status_f2c( + _In_ const MPI_Fint* f_status, + _Out_ MPI_Status* c_status + ); + +MPI_METHOD +PMPI_Status_f2c( + _In_ const MPI_Fint* f_status, + _Out_ MPI_Status* c_status + ); + +MPI_METHOD +MPI_Status_c2f( + _In_ const MPI_Status* c_status, + _Out_ MPI_Fint* f_status + ); + +MPI_METHOD +PMPI_Status_c2f( + _In_ const MPI_Status* c_status, + _Out_ MPI_Fint* f_status + ); + + +#if !defined(_MPICH_DLL_) +#define MPIU_DLL_SPEC __declspec(dllimport) +#else +#define MPIU_DLL_SPEC +#endif + +extern MPIU_DLL_SPEC MPI_Fint* MPI_F_STATUS_IGNORE; +extern MPIU_DLL_SPEC MPI_Fint* MPI_F_STATUSES_IGNORE; + + +/*---------------------------------------------------------------------------*/ +/* Implementation Specific */ +/*---------------------------------------------------------------------------*/ + +MPI_METHOD +MPIR_Dup_fn( + _In_ MPI_Comm oldcomm, + _In_ int keyval, + _In_opt_ void* extra_state, + _In_opt_ void* attribute_val_in, + _Out_ void* attribute_val_out, + _mpi_out_flag_ int* flag + ); + + +#if MSMPI_VER >= 0x300 + +MPI_METHOD +MSMPI_Get_bsend_overhead(); + +#endif + + +#if MSMPI_VER >= 0x300 + +MPI_METHOD +MSMPI_Get_version(); + +#else +# define MSMPI_Get_version() (MSMPI_VER) +#endif + +typedef void +(MPIAPI MSMPI_Request_callback)( + _In_ MPI_Status* status + ); + +MPI_METHOD +MSMPI_Request_set_apc( + _In_ MPI_Request request, + _In_ MSMPI_Request_callback* callback_fn, + _In_ MPI_Status* callback_status + ); + +typedef struct _MSMPI_LOCK_QUEUE +{ + struct _MSMPI_LOCK_QUEUE* volatile next; + volatile MPI_Aint flags; + +} MSMPI_Lock_queue; + +void +MPIAPI +MSMPI_Queuelock_acquire( + _Out_ MSMPI_Lock_queue* queue + ); + +void +MPIAPI +MSMPI_Queuelock_release( + _In_ MSMPI_Lock_queue* queue + ); + +MPI_METHOD +MSMPI_Waitsome_interruptible( + _In_range_(>=, 0) int incount, + _Inout_updates_opt_(incount) MPI_Request array_of_requests[], + _Out_ _Deref_out_range_(MPI_UNDEFINED, incount) int* outcount, + _Out_writes_to_opt_(incount,*outcount) int array_of_indices[], + _Out_writes_to_opt_(incount,*outcount) MPI_Status array_of_statuses[] + ); + + +#if defined(__cplusplus) +} +#endif + +#endif /* MPI_INCLUDED */ diff --git a/src/include/mpif.h b/src/include/mpif.h new file mode 100644 index 0000000..d143fee --- /dev/null +++ b/src/include/mpif.h @@ -0,0 +1,536 @@ +! /* -*- Mode: Fortran; -*- */ +! +! Copyright (c) Microsoft Corporation. All rights reserved. +! Licensed under the MIT License. +! +! (C) 2001 by Argonne National Laboratory. +! (C) 2015 by Microsoft Corporation +! +! MPICH COPYRIGHT +! +! The following is a notice of limited availability of the code, and disclaimer +! which must be included in the prologue of the code and in all source listings +! of the code. +! +! Copyright Notice +!  + 2002 University of Chicago +! +! Permission is hereby granted to use, reproduce, prepare derivative works, and +! to redistribute to others. This software was authored by: +! +! Mathematics and Computer Science Division +! Argonne National Laboratory, Argonne IL 60439 +! +! (and) +! +! Department of Computer Science +! University of Illinois at Urbana-Champaign +! +! +! GOVERNMENT LICENSE +! +! Portions of this material resulted from work developed under a U.S. +! Government Contract and are subject to the following license: the Government +! is granted for itself and others acting on its behalf a paid-up, nonexclusive, +! irrevocable worldwide license in this computer software to reproduce, prepare +! derivative works, and perform publicly and display publicly. +! +! DISCLAIMER +! +! This computer code material was prepared, in part, as an account of work +! sponsored by an agency of the United States Government. Neither the United +! States, nor the University of Chicago, nor any of their employees, makes any +! warranty express or implied, or assumes any legal liability or responsibility +! for the accuracy, completeness, or usefulness of any information, apparatus, +! product, or process disclosed, or represents that its use would not infringe +! privately owned rights. +! +! + INTEGER MPI_SOURCE, MPI_TAG, MPI_ERROR + PARAMETER (MPI_SOURCE=3,MPI_TAG=4,MPI_ERROR=5) + INTEGER MPI_STATUS_SIZE + PARAMETER (MPI_STATUS_SIZE=5) + INTEGER MPI_STATUS_IGNORE(MPI_STATUS_SIZE) + INTEGER MPI_STATUSES_IGNORE(MPI_STATUS_SIZE,1) + INTEGER MPI_ERRCODES_IGNORE(1) + CHARACTER*1 MPI_ARGVS_NULL(1,1) + CHARACTER*1 MPI_ARGV_NULL(1) + INTEGER MPI_SUCCESS + PARAMETER (MPI_SUCCESS=0) + INTEGER MPI_ERR_OTHER + PARAMETER (MPI_ERR_OTHER=15) + INTEGER MPI_ERR_WIN + PARAMETER (MPI_ERR_WIN=45) + INTEGER MPI_ERR_FILE + PARAMETER (MPI_ERR_FILE=27) + INTEGER MPI_ERR_COUNT + PARAMETER (MPI_ERR_COUNT=2) + INTEGER MPI_ERR_SPAWN + PARAMETER (MPI_ERR_SPAWN=42) + INTEGER MPI_ERR_BASE + PARAMETER (MPI_ERR_BASE=46) + INTEGER MPI_ERR_RMA_CONFLICT + PARAMETER (MPI_ERR_RMA_CONFLICT=49) + INTEGER MPI_ERR_IN_STATUS + PARAMETER (MPI_ERR_IN_STATUS=17) + INTEGER MPI_ERR_INFO_KEY + PARAMETER (MPI_ERR_INFO_KEY=29) + INTEGER MPI_ERR_LOCKTYPE + PARAMETER (MPI_ERR_LOCKTYPE=47) + INTEGER MPI_ERR_OP + PARAMETER (MPI_ERR_OP=9) + INTEGER MPI_ERR_ARG + PARAMETER (MPI_ERR_ARG=12) + INTEGER MPI_ERR_READ_ONLY + PARAMETER (MPI_ERR_READ_ONLY=40) + INTEGER MPI_ERR_SIZE + PARAMETER (MPI_ERR_SIZE=51) + INTEGER MPI_ERR_BUFFER + PARAMETER (MPI_ERR_BUFFER=1) + INTEGER MPI_ERR_DUP_DATAREP + PARAMETER (MPI_ERR_DUP_DATAREP=24) + INTEGER MPI_ERR_UNSUPPORTED_DATAREP + PARAMETER (MPI_ERR_UNSUPPORTED_DATAREP=43) + INTEGER MPI_ERR_LASTCODE + PARAMETER (MPI_ERR_LASTCODE=1073741823) + INTEGER MPI_ERR_TRUNCATE + PARAMETER (MPI_ERR_TRUNCATE=14) + INTEGER MPI_ERR_DISP + PARAMETER (MPI_ERR_DISP=52) + INTEGER MPI_ERR_PORT + PARAMETER (MPI_ERR_PORT=38) + INTEGER MPI_ERR_INFO_NOKEY + PARAMETER (MPI_ERR_INFO_NOKEY=31) + INTEGER MPI_ERR_ASSERT + PARAMETER (MPI_ERR_ASSERT=53) + INTEGER MPI_ERR_FILE_EXISTS + PARAMETER (MPI_ERR_FILE_EXISTS=25) + INTEGER MPI_ERR_PENDING + PARAMETER (MPI_ERR_PENDING=18) + INTEGER MPI_ERR_COMM + PARAMETER (MPI_ERR_COMM=5) + INTEGER MPI_ERR_KEYVAL + PARAMETER (MPI_ERR_KEYVAL=48) + INTEGER MPI_ERR_NAME + PARAMETER (MPI_ERR_NAME=33) + INTEGER MPI_ERR_REQUEST + PARAMETER (MPI_ERR_REQUEST=19) + INTEGER MPI_ERR_GROUP + PARAMETER (MPI_ERR_GROUP=8) + INTEGER MPI_ERR_TOPOLOGY + PARAMETER (MPI_ERR_TOPOLOGY=10) + INTEGER MPI_ERR_TYPE + PARAMETER (MPI_ERR_TYPE=3) + INTEGER MPI_ERR_TAG + PARAMETER (MPI_ERR_TAG=4) + INTEGER MPI_ERR_INFO_VALUE + PARAMETER (MPI_ERR_INFO_VALUE=30) + INTEGER MPI_ERR_NOT_SAME + PARAMETER (MPI_ERR_NOT_SAME=35) + INTEGER MPI_ERR_RMA_SYNC + PARAMETER (MPI_ERR_RMA_SYNC=50) + INTEGER MPI_ERR_INFO + PARAMETER (MPI_ERR_INFO=28) + INTEGER MPI_ERR_NO_MEM + PARAMETER (MPI_ERR_NO_MEM=34) + INTEGER MPI_ERR_BAD_FILE + PARAMETER (MPI_ERR_BAD_FILE=22) + INTEGER MPI_ERR_FILE_IN_USE + PARAMETER (MPI_ERR_FILE_IN_USE=26) + INTEGER MPI_ERR_UNKNOWN + PARAMETER (MPI_ERR_UNKNOWN=13) + INTEGER MPI_ERR_UNSUPPORTED_OPERATION + PARAMETER (MPI_ERR_UNSUPPORTED_OPERATION=44) + INTEGER MPI_ERR_QUOTA + PARAMETER (MPI_ERR_QUOTA=39) + INTEGER MPI_ERR_AMODE + PARAMETER (MPI_ERR_AMODE=21) + INTEGER MPI_ERR_ROOT + PARAMETER (MPI_ERR_ROOT=7) + INTEGER MPI_ERR_RANK + PARAMETER (MPI_ERR_RANK=6) + INTEGER MPI_ERR_DIMS + PARAMETER (MPI_ERR_DIMS=11) + INTEGER MPI_ERR_NO_SUCH_FILE + PARAMETER (MPI_ERR_NO_SUCH_FILE=37) + INTEGER MPI_ERR_SERVICE + PARAMETER (MPI_ERR_SERVICE=41) + INTEGER MPI_ERR_INTERN + PARAMETER (MPI_ERR_INTERN=16) + INTEGER MPI_ERR_IO + PARAMETER (MPI_ERR_IO=32) + INTEGER MPI_ERR_ACCESS + PARAMETER (MPI_ERR_ACCESS=20) + INTEGER MPI_ERR_NO_SPACE + PARAMETER (MPI_ERR_NO_SPACE=36) + INTEGER MPI_ERR_CONVERSION + PARAMETER (MPI_ERR_CONVERSION=23) + INTEGER MPI_ERRORS_ARE_FATAL + PARAMETER (MPI_ERRORS_ARE_FATAL=1409286144) + INTEGER MPI_ERRORS_RETURN + PARAMETER (MPI_ERRORS_RETURN=1409286145) + INTEGER MPI_IDENT + PARAMETER (MPI_IDENT=0) + INTEGER MPI_CONGRUENT + PARAMETER (MPI_CONGRUENT=1) + INTEGER MPI_SIMILAR + PARAMETER (MPI_SIMILAR=2) + INTEGER MPI_UNEQUAL + PARAMETER (MPI_UNEQUAL=3) + INTEGER MPI_MAX + PARAMETER (MPI_MAX=1476395009) + INTEGER MPI_MIN + PARAMETER (MPI_MIN=1476395010) + INTEGER MPI_SUM + PARAMETER (MPI_SUM=1476395011) + INTEGER MPI_PROD + PARAMETER (MPI_PROD=1476395012) + INTEGER MPI_LAND + PARAMETER (MPI_LAND=1476395013) + INTEGER MPI_BAND + PARAMETER (MPI_BAND=1476395014) + INTEGER MPI_LOR + PARAMETER (MPI_LOR=1476395015) + INTEGER MPI_BOR + PARAMETER (MPI_BOR=1476395016) + INTEGER MPI_LXOR + PARAMETER (MPI_LXOR=1476395017) + INTEGER MPI_BXOR + PARAMETER (MPI_BXOR=1476395018) + INTEGER MPI_MINLOC + PARAMETER (MPI_MINLOC=1476395019) + INTEGER MPI_MAXLOC + PARAMETER (MPI_MAXLOC=1476395020) + INTEGER MPI_REPLACE + PARAMETER (MPI_REPLACE=1476395021) + INTEGER MPI_NO_OP + PARAMETER (MPI_NO_OP=1476395022) + INTEGER MPI_COMM_WORLD + PARAMETER (MPI_COMM_WORLD=1140850688) + INTEGER MPI_COMM_SELF + PARAMETER (MPI_COMM_SELF=1140850689) + INTEGER MPI_COMM_TYPE_SHARED + PARAMETER (MPI_COMM_TYPE_SHARED=1) + INTEGER MPI_GROUP_EMPTY + PARAMETER (MPI_GROUP_EMPTY=1207959552) + INTEGER MPI_COMM_NULL + PARAMETER (MPI_COMM_NULL=67108864) + INTEGER MPI_WIN_NULL + PARAMETER (MPI_WIN_NULL=536870912) + INTEGER MPI_FILE_NULL + PARAMETER (MPI_FILE_NULL=0) + INTEGER MPI_GROUP_NULL + PARAMETER (MPI_GROUP_NULL=134217728) + INTEGER MPI_OP_NULL + PARAMETER (MPI_OP_NULL=402653184) + INTEGER MPI_DATATYPE_NULL + PARAMETER (MPI_DATATYPE_NULL=z'0c000000') + INTEGER MPI_REQUEST_NULL + PARAMETER (MPI_REQUEST_NULL=738197504) + INTEGER MPI_ERRHANDLER_NULL + PARAMETER (MPI_ERRHANDLER_NULL=335544320) + INTEGER MPI_INFO_NULL + PARAMETER (MPI_INFO_NULL=469762048) + INTEGER MPI_MESSAGE_NULL + PARAMETER (MPI_MESSAGE_NULL=805306368) + INTEGER MPI_MESSAGE_NO_PROC + PARAMETER (MPI_MESSAGE_NO_PROC=1879048192) + INTEGER MPI_TAG_UB + PARAMETER (MPI_TAG_UB=1681915906) + INTEGER MPI_HOST + PARAMETER (MPI_HOST=1681915908) + INTEGER MPI_IO + PARAMETER (MPI_IO=1681915910) + INTEGER MPI_WTIME_IS_GLOBAL + PARAMETER (MPI_WTIME_IS_GLOBAL=1681915912) + INTEGER MPI_UNIVERSE_SIZE + PARAMETER (MPI_UNIVERSE_SIZE=1681915914) + INTEGER MPI_LASTUSEDCODE + PARAMETER (MPI_LASTUSEDCODE=1681915916) + INTEGER MPI_APPNUM + PARAMETER (MPI_APPNUM=1681915918) + INTEGER MPI_WIN_BASE + PARAMETER (MPI_WIN_BASE=1711276034) + INTEGER MPI_WIN_SIZE + PARAMETER (MPI_WIN_SIZE=1711276036) + INTEGER MPI_WIN_DISP_UNIT + PARAMETER (MPI_WIN_DISP_UNIT=1711276038) + INTEGER MPI_MAX_ERROR_STRING + PARAMETER (MPI_MAX_ERROR_STRING=511) + INTEGER MPI_MAX_PORT_NAME + PARAMETER (MPI_MAX_PORT_NAME=255) + INTEGER MPI_MAX_OBJECT_NAME + PARAMETER (MPI_MAX_OBJECT_NAME=127) + INTEGER MPI_MAX_INFO_KEY + PARAMETER (MPI_MAX_INFO_KEY=254) + INTEGER MPI_MAX_INFO_VAL + PARAMETER (MPI_MAX_INFO_VAL=1023) + INTEGER MPI_MAX_PROCESSOR_NAME + PARAMETER (MPI_MAX_PROCESSOR_NAME=128-1) + INTEGER MPI_MAX_DATAREP_STRING + PARAMETER (MPI_MAX_DATAREP_STRING=127) + INTEGER MPI_MAX_LIBRARY_VERSION_STRING + PARAMETER (MPI_MAX_LIBRARY_VERSION_STRING=64-1) + INTEGER MPI_UNDEFINED + PARAMETER (MPI_UNDEFINED=(-32766)) + INTEGER MPI_KEYVAL_INVALID + PARAMETER (MPI_KEYVAL_INVALID=603979776) + INTEGER MPI_BSEND_OVERHEAD + PARAMETER (MPI_BSEND_OVERHEAD=(95)) + INTEGER MPI_PROC_NULL + PARAMETER (MPI_PROC_NULL=-1) + INTEGER MPI_ANY_SOURCE + PARAMETER (MPI_ANY_SOURCE=-2) + INTEGER MPI_ANY_TAG + PARAMETER (MPI_ANY_TAG=-1) + INTEGER MPI_ROOT + PARAMETER (MPI_ROOT=-3) + INTEGER MPI_GRAPH + PARAMETER (MPI_GRAPH=1) + INTEGER MPI_CART + PARAMETER (MPI_CART=2) + INTEGER MPI_DIST_GRAPH + PARAMETER (MPI_DIST_GRAPH=3) + INTEGER MPI_VERSION + PARAMETER (MPI_VERSION=2) + INTEGER MPI_SUBVERSION + PARAMETER (MPI_SUBVERSION=0) + INTEGER MPI_LOCK_EXCLUSIVE + PARAMETER (MPI_LOCK_EXCLUSIVE=234) + INTEGER MPI_LOCK_SHARED + PARAMETER (MPI_LOCK_SHARED=235) + INTEGER MPI_CHAR + PARAMETER (MPI_CHAR=z'4c000101') + INTEGER MPI_UNSIGNED_CHAR + PARAMETER (MPI_UNSIGNED_CHAR=z'4c000102') + INTEGER MPI_SHORT + PARAMETER (MPI_SHORT=z'4c000203') + INTEGER MPI_UNSIGNED_SHORT + PARAMETER (MPI_UNSIGNED_SHORT=z'4c000204') + INTEGER MPI_INT + PARAMETER (MPI_INT=z'4c000405') + INTEGER MPI_UNSIGNED + PARAMETER (MPI_UNSIGNED=z'4c000406') + INTEGER MPI_LONG + PARAMETER (MPI_LONG=z'4c000407') + INTEGER MPI_UNSIGNED_LONG + PARAMETER (MPI_UNSIGNED_LONG=z'4c000408') + INTEGER MPI_LONG_LONG + PARAMETER (MPI_LONG_LONG=z'4c000809') + INTEGER MPI_LONG_LONG_INT + PARAMETER (MPI_LONG_LONG_INT=z'4c000809') + INTEGER MPI_FLOAT + PARAMETER (MPI_FLOAT=z'4c00040a') + INTEGER MPI_DOUBLE + PARAMETER (MPI_DOUBLE=z'4c00080b') + INTEGER MPI_LONG_DOUBLE + PARAMETER (MPI_LONG_DOUBLE=z'4c00080c') + INTEGER MPI_BYTE + PARAMETER (MPI_BYTE=z'4c00010d') + INTEGER MPI_WCHAR + PARAMETER (MPI_WCHAR=z'4c00020e') + INTEGER MPI_PACKED + PARAMETER (MPI_PACKED=z'4c00010f') + INTEGER MPI_LB + PARAMETER (MPI_LB=z'4c000010') + INTEGER MPI_UB + PARAMETER (MPI_UB=z'4c000011') + INTEGER MPI_2INT + PARAMETER (MPI_2INT=z'4c000816') + INTEGER MPI_SIGNED_CHAR + PARAMETER (MPI_SIGNED_CHAR=z'4c000118') + INTEGER MPI_UNSIGNED_LONG_LONG + PARAMETER (MPI_UNSIGNED_LONG_LONG=z'4c000819') + INTEGER MPI_CHARACTER + PARAMETER (MPI_CHARACTER=z'4c00011a') + INTEGER MPI_INTEGER + PARAMETER (MPI_INTEGER=z'4c00041b') + INTEGER MPI_REAL + PARAMETER (MPI_REAL=z'4c00041c') + INTEGER MPI_LOGICAL + PARAMETER (MPI_LOGICAL=z'4c00041d') + INTEGER MPI_COMPLEX + PARAMETER (MPI_COMPLEX=z'4c00081e') + INTEGER MPI_DOUBLE_PRECISION + PARAMETER (MPI_DOUBLE_PRECISION=z'4c00081f') + INTEGER MPI_2INTEGER + PARAMETER (MPI_2INTEGER=z'4c000820') + INTEGER MPI_2REAL + PARAMETER (MPI_2REAL=z'4c000821') + INTEGER MPI_DOUBLE_COMPLEX + PARAMETER (MPI_DOUBLE_COMPLEX=z'4c001022') + INTEGER MPI_2DOUBLE_PRECISION + PARAMETER (MPI_2DOUBLE_PRECISION=z'4c001023') + INTEGER MPI_2COMPLEX + PARAMETER (MPI_2COMPLEX=z'4c001024') + INTEGER MPI_2DOUBLE_COMPLEX + PARAMETER (MPI_2DOUBLE_COMPLEX=z'4c002025') + INTEGER MPI_REAL2 + PARAMETER (MPI_REAL2=z'0c000000') + INTEGER MPI_REAL4 + PARAMETER (MPI_REAL4=z'4c000427') + INTEGER MPI_COMPLEX8 + PARAMETER (MPI_COMPLEX8=z'4c000828') + INTEGER MPI_REAL8 + PARAMETER (MPI_REAL8=z'4c000829') + INTEGER MPI_COMPLEX16 + PARAMETER (MPI_COMPLEX16=z'4c00102a') + INTEGER MPI_REAL16 + PARAMETER (MPI_REAL16=z'0c000000') + INTEGER MPI_COMPLEX32 + PARAMETER (MPI_COMPLEX32=z'0c000000') + INTEGER MPI_INTEGER1 + PARAMETER (MPI_INTEGER1=z'4c00012d') + INTEGER MPI_COMPLEX4 + PARAMETER (MPI_COMPLEX4=z'0c000000') + INTEGER MPI_INTEGER2 + PARAMETER (MPI_INTEGER2=z'4c00022f') + INTEGER MPI_INTEGER4 + PARAMETER (MPI_INTEGER4=z'4c000430') + INTEGER MPI_INTEGER8 + PARAMETER (MPI_INTEGER8=z'4c000831') + INTEGER MPI_INTEGER16 + PARAMETER (MPI_INTEGER16=z'0c000000') + + INCLUDE 'mpifptr.h' + + INTEGER MPI_OFFSET + PARAMETER (MPI_OFFSET=z'4c00083c') + INTEGER MPI_COUNT + PARAMETER (MPI_COUNT=z'4c00083d') + INTEGER MPI_FLOAT_INT + PARAMETER (MPI_FLOAT_INT=z'8c000000') + INTEGER MPI_DOUBLE_INT + PARAMETER (MPI_DOUBLE_INT=z'8c000001') + INTEGER MPI_LONG_INT + PARAMETER (MPI_LONG_INT=z'8c000002') + INTEGER MPI_SHORT_INT + PARAMETER (MPI_SHORT_INT=z'8c000003') + INTEGER MPI_LONG_DOUBLE_INT + PARAMETER (MPI_LONG_DOUBLE_INT=z'8c000004') + INTEGER MPI_INTEGER_KIND + PARAMETER (MPI_INTEGER_KIND=4) + INTEGER MPI_OFFSET_KIND + PARAMETER (MPI_OFFSET_KIND=8) + INTEGER MPI_COUNT_KIND + PARAMETER (MPI_COUNT_KIND=8) + INTEGER MPI_COMBINER_NAMED + PARAMETER (MPI_COMBINER_NAMED=1) + INTEGER MPI_COMBINER_DUP + PARAMETER (MPI_COMBINER_DUP=2) + INTEGER MPI_COMBINER_CONTIGUOUS + PARAMETER (MPI_COMBINER_CONTIGUOUS=3) + INTEGER MPI_COMBINER_VECTOR + PARAMETER (MPI_COMBINER_VECTOR=4) + INTEGER MPI_COMBINER_HVECTOR_INTEGER + PARAMETER (MPI_COMBINER_HVECTOR_INTEGER=5) + INTEGER MPI_COMBINER_HVECTOR + PARAMETER (MPI_COMBINER_HVECTOR=6) + INTEGER MPI_COMBINER_INDEXED + PARAMETER (MPI_COMBINER_INDEXED=7) + INTEGER MPI_COMBINER_HINDEXED_INTEGER + PARAMETER (MPI_COMBINER_HINDEXED_INTEGER=8) + INTEGER MPI_COMBINER_HINDEXED + PARAMETER (MPI_COMBINER_HINDEXED=9) + INTEGER MPI_COMBINER_INDEXED_BLOCK + PARAMETER (MPI_COMBINER_INDEXED_BLOCK=10) + INTEGER MPI_COMBINER_STRUCT_INTEGER + PARAMETER (MPI_COMBINER_STRUCT_INTEGER=11) + INTEGER MPI_COMBINER_STRUCT + PARAMETER (MPI_COMBINER_STRUCT=12) + INTEGER MPI_COMBINER_SUBARRAY + PARAMETER (MPI_COMBINER_SUBARRAY=13) + INTEGER MPI_COMBINER_DARRAY + PARAMETER (MPI_COMBINER_DARRAY=14) + INTEGER MPI_COMBINER_F90_REAL + PARAMETER (MPI_COMBINER_F90_REAL=15) + INTEGER MPI_COMBINER_F90_COMPLEX + PARAMETER (MPI_COMBINER_F90_COMPLEX=16) + INTEGER MPI_COMBINER_F90_INTEGER + PARAMETER (MPI_COMBINER_F90_INTEGER=17) + INTEGER MPI_COMBINER_RESIZED + PARAMETER (MPI_COMBINER_RESIZED=18) + INTEGER MPI_COMBINER_HINDEXED_BLOCK + PARAMETER (MPI_COMBINER_HINDEXED_BLOCK=19) + INTEGER MPI_MODE_NOCHECK + PARAMETER (MPI_MODE_NOCHECK=1024) + INTEGER MPI_MODE_NOSTORE + PARAMETER (MPI_MODE_NOSTORE=2048) + INTEGER MPI_MODE_NOPUT + PARAMETER (MPI_MODE_NOPUT=4096) + INTEGER MPI_MODE_NOPRECEDE + PARAMETER (MPI_MODE_NOPRECEDE=8192) + INTEGER MPI_MODE_NOSUCCEED + PARAMETER (MPI_MODE_NOSUCCEED=16384) + INTEGER MPI_THREAD_SINGLE + PARAMETER (MPI_THREAD_SINGLE=0) + INTEGER MPI_THREAD_FUNNELED + PARAMETER (MPI_THREAD_FUNNELED=1) + INTEGER MPI_THREAD_SERIALIZED + PARAMETER (MPI_THREAD_SERIALIZED=2) + INTEGER MPI_THREAD_MULTIPLE + PARAMETER (MPI_THREAD_MULTIPLE=3) + INTEGER MPI_MODE_RDONLY + PARAMETER (MPI_MODE_RDONLY=2) + INTEGER MPI_MODE_RDWR + PARAMETER (MPI_MODE_RDWR=8) + INTEGER MPI_MODE_WRONLY + PARAMETER (MPI_MODE_WRONLY=4) + INTEGER MPI_MODE_DELETE_ON_CLOSE + PARAMETER (MPI_MODE_DELETE_ON_CLOSE=16) + INTEGER MPI_MODE_UNIQUE_OPEN + PARAMETER (MPI_MODE_UNIQUE_OPEN=32) + INTEGER MPI_MODE_CREATE + PARAMETER (MPI_MODE_CREATE=1) + INTEGER MPI_MODE_EXCL + PARAMETER (MPI_MODE_EXCL=64) + INTEGER MPI_MODE_APPEND + PARAMETER (MPI_MODE_APPEND=128) + INTEGER MPI_MODE_SEQUENTIAL + PARAMETER (MPI_MODE_SEQUENTIAL=256) + INTEGER MPI_SEEK_SET + PARAMETER (MPI_SEEK_SET=600) + INTEGER MPI_SEEK_CUR + PARAMETER (MPI_SEEK_CUR=602) + INTEGER MPI_SEEK_END + PARAMETER (MPI_SEEK_END=604) + INTEGER MPI_ORDER_C + PARAMETER (MPI_ORDER_C=56) + INTEGER MPI_ORDER_FORTRAN + PARAMETER (MPI_ORDER_FORTRAN=57) + INTEGER MPI_DISTRIBUTE_BLOCK + PARAMETER (MPI_DISTRIBUTE_BLOCK=121) + INTEGER MPI_DISTRIBUTE_CYCLIC + PARAMETER (MPI_DISTRIBUTE_CYCLIC=122) + INTEGER MPI_DISTRIBUTE_NONE + PARAMETER (MPI_DISTRIBUTE_NONE=123) + INTEGER MPI_DISTRIBUTE_DFLT_DARG + PARAMETER (MPI_DISTRIBUTE_DFLT_DARG=-49767) + INTEGER (KIND=8) MPI_DISPLACEMENT_CURRENT + PARAMETER (MPI_DISPLACEMENT_CURRENT=-54278278) + INTEGER MPI_BOTTOM, MPI_IN_PLACE + INTEGER MPI_UNWEIGHTED, MPI_WEIGHTS_EMPTY + EXTERNAL MPI_DUP_FN, MPI_NULL_DELETE_FN, MPI_NULL_COPY_FN + EXTERNAL MPI_WTIME, MPI_WTICK + EXTERNAL PMPI_WTIME, PMPI_WTICK + EXTERNAL MPI_COMM_DUP_FN, MPI_COMM_NULL_DELETE_FN + EXTERNAL MPI_COMM_NULL_COPY_FN + EXTERNAL MPI_WIN_DUP_FN, MPI_WIN_NULL_DELETE_FN + EXTERNAL MPI_WIN_NULL_COPY_FN + EXTERNAL MPI_TYPE_DUP_FN, MPI_TYPE_NULL_DELETE_FN + EXTERNAL MPI_TYPE_NULL_COPY_FN + EXTERNAL MPI_CONVERSION_FN_NULL + DOUBLE PRECISION MPI_WTIME, MPI_WTICK + DOUBLE PRECISION PMPI_WTIME, PMPI_WTICK + + COMMON /MPIPRIV1/ MPI_BOTTOM, MPI_IN_PLACE, MPI_STATUS_IGNORE + + COMMON /MPIPRIV2/ MPI_STATUSES_IGNORE, MPI_ERRCODES_IGNORE +!DEC$ ATTRIBUTES DLLIMPORT :: /MPIPRIV1/, /MPIPRIV2/ + + COMMON /MPIFCMB5/ MPI_UNWEIGHTED + COMMON /MPIFCMB9/ MPI_WEIGHTS_EMPTY +!DEC$ ATTRIBUTES DLLIMPORT :: /MPIFCMB5/, /MPIFCMB9/ + + COMMON /MPIPRIVC/ MPI_ARGVS_NULL, MPI_ARGV_NULL +!DEC$ ATTRIBUTES DLLIMPORT :: /MPIPRIVC/ diff --git a/src/include/mpio.h b/src/include/mpio.h new file mode 100644 index 0000000..a172d52 --- /dev/null +++ b/src/include/mpio.h @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#error do not include mpio.h, use mpi.h + diff --git a/src/include/mpiwarning.h b/src/include/mpiwarning.h new file mode 100644 index 0000000..9ededd5 --- /dev/null +++ b/src/include/mpiwarning.h @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union +#pragma warning(disable:4201) // nonstandard extension used : nameless struct/union +#pragma warning(disable:4204) // nonstandard extension used : non-constant aggregate initializer +#ifdef _PREFIX_ +#pragma warning(disable:4616) // #pragma warning : warning number 'number' not a valid compiler warning +#endif diff --git a/src/include/mspms.h b/src/include/mspms.h new file mode 100644 index 0000000..abbccb4 --- /dev/null +++ b/src/include/mspms.h @@ -0,0 +1,209 @@ +/*++ + + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the MIT License. + +Module: + + mspms.h + +Abstract: + + MSMPI process management service interface definitions. + +--*/ + +#ifdef DEFINE_GUID + +DEFINE_GUID( + PM_SERVICE_INTERFACE_V1, + 0x5aa2c905, + 0xd8af, + 0x4cf2, + 0x92, 0x56, 0x80, 0xf3, 0xbc, 0xa0, 0x0f, 0x94 + ); + +DEFINE_GUID( + PM_MANAGER_INTERFACE_V1, + 0x4b1130e6, + 0x724d, + 0x43b8, + 0xb7, 0x63, 0x75, 0x72, 0xcb, 0xe6, 0x00, 0xfa + ); + +DEFINE_GUID( + PM_SERVICE_INTERFACE_LAUNCH, + 0x2a89cc11, + 0x21ff, + 0x47d5, + 0x94, 0xf4, 0x28, 0x52, 0x9f, 0x7f, 0x4f, 0x5e + ); + +#endif + +#ifndef _MSPMS_H_ +#define _MSPMS_H_ + +#ifndef MSMPI_NO_SAL +#include +#endif + +#include +#include + + +/*---------------------------------------------------------------------------*/ +/* SAL ANNOTATIONS */ +/*---------------------------------------------------------------------------*/ +/* +* Define SAL annotations if they aren't defined yet. +*/ +#ifndef _In_ +#define _In_ +#endif +#ifndef _In_z_ +#define _In_z_ +#endif +#ifndef _Inout_ +#define _Inout_ +#endif +#ifndef _Out_ +#define _Out_ +#endif +#ifndef _Outptr_ +#define _Outptr_ +#endif + + +#define MSPMS_MAX_NAME_LENGTH 256 + +// +// The launch type allows launch managers to specify their security context +// requirements for their launch callback. +// PmiLaunchTypeSelf: +// The launch callback is invoked without any impersonation or client context. +// This is used to launch processes under the same credentials as the launch manager. +// PmiLaunchTypeImpersonate: +// The client security context is impersonated for the launch callback. +// PmiLaunchTypeUserSid: +// The client's user identifier is passed to the launch callback. +// +enum PmiLaunchType +{ + PmiLaunchTypeSelf, + PmiLaunchTypeImpersonate, + PmiLaunchTypeUserSid +}; + +typedef HRESULT (WINAPI FN_PmiLaunch)( + _In_z_ const char* App, //smpd.exe + _In_z_ const char* Args, //args to smpd.exe + _In_z_ const char* Context //job context string +); + +typedef HRESULT (WINAPI FN_PmiLaunchUserSid)( + _In_opt_ PSID Sid, + _In_z_ const char* App, //smpd.exe + _In_z_ const char* Args, //args to smpd.exe + _In_z_ const char* Context //job context string +); + +typedef struct _PmiManagerInterface +{ + size_t Size; + union + { + FN_PmiLaunch* AsSelf; + FN_PmiLaunch* Impersonate; + FN_PmiLaunchUserSid* UserSid; + } Launch; + enum PmiLaunchType LaunchType; +} PmiManagerInterface; + +typedef struct _PmiServiceInitData +{ + size_t Size; + const char* Name; +} PmiServiceInitData; + +// +// Initialize the service +// +typedef HRESULT (WINAPI FN_PmiServiceInitialize)( + _In_ const PmiServiceInitData* InitData // Init data +); + +// +// Cause the calling thread to listen on the supplied address for requests +// from Mpiexec.exe to launch the manager process. +// +typedef HRESULT (WINAPI FN_PmiServiceListen)( + _In_ const SOCKADDR_INET* Address, // INET address on which to listen + _In_ const PmiManagerInterface* Manager, // Interface to use to launch the smpd manager + _In_ REFGUID Version // Version GUID of the PmiManagerInterface +); + +// +// Signal to the thread that it is time to stop processing completions. +// +typedef HRESULT (WINAPI FN_PmiServicePostStop)(); + +// +// Finalize the service +// +typedef VOID (WINAPI FN_PmiServiceFinalize)(); + +typedef struct _PmiServiceInterface +{ + size_t Size; + FN_PmiServiceInitialize* Initialize; + FN_PmiServiceListen* Listen; + FN_PmiServicePostStop* PostStop; + FN_PmiServiceFinalize* Finalize; +} PmiServiceInterface; + + +HRESULT +WINAPI +MSMPI_Get_pm_interface( + _In_ REFGUID RequestedVersion, + _Inout_ PmiServiceInterface* Interface +); + + +HRESULT +WINAPI +MSMPI_pm_query_interface( + _In_ REFGUID RequestedVersion, + _Inout_ void** Interface +); + + +typedef HRESULT(WINAPI FN_PmiCreateLaunchCtx)( + _In_ HANDLE clientToken, + _In_z_ const void* launchCtx, + _In_z_ const char* jobCtx + ); + +typedef HRESULT(WINAPI FN_PmiStartLaunchCtx)(_In_ const void* launchCtx); +typedef HRESULT(WINAPI FN_PmiEndLaunchCtx)(_In_ const void* launchCtx); +typedef HRESULT(WINAPI FN_PmiCleanupLaunchCtx)(_In_ const void* launchCtx); +typedef void (WINAPI FN_PmiGetLaunchInfo)( + _In_ const void* launchCtx, + _Outptr_opt_ const char** ppJobObjName, + _Outptr_opt_ const char** ppPwd, + _Out_opt_ BOOL* pSaveCreds + ); + +typedef struct _PmiServiceLaunchInterface +{ + FN_PmiCreateLaunchCtx* CreateLaunchCtx; + FN_PmiStartLaunchCtx* StartLaunchCtx; + FN_PmiEndLaunchCtx* EndLaunchCtx; + FN_PmiCleanupLaunchCtx* CleanupLaunchCtx; + FN_PmiGetLaunchInfo* GetLaunchInfo; +}PmiServiceLaunchInterface; + + + +#endif // _MSPMS_H_ diff --git a/src/include/oacr.h b/src/include/oacr.h new file mode 100644 index 0000000..26aa343 --- /dev/null +++ b/src/include/oacr.h @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#ifndef OACR_INC_H +#define OACR_INC_H + +#define HRESULT_NOT_CHECKED 25031 +#define COMPARING_HRESULT_TO_INT 6221 +#define RETVAL_IGNORED_FUNC_COULD_FAIL 6031 +#define NONCONST_BUFFER_PARAM 25033 +#define EXCEPT_BLOCK_EMPTY 6322 +#define PRINTF_FORMAT_STRING_PARAM_NEEDS_REVIEW 25141 +#define UNSAFE_STRING_FUNCTION 25025 +#define USE_WIDE_API 25068 +#define DIFFERENT_PARAM_TYPE_SIZE 25054 + +#define OACR_REVIEWED_CALL( reviewer, functionCall ) functionCall +#define OACR_WARNING_SUPPRESS( cWarning, comment ) __pragma ( warning( suppress: cWarning ) ) +#define OACR_WARNING_ENABLE( cWarning, comment ) __pragma ( warning( default: cWarning ) ) +#define OACR_USE_PTR(p) __noop +#define OACR_WARNING_DISABLE( cWarning, comment ) __pragma(warning(disable:cWarning)) +#endif \ No newline at end of file diff --git a/src/include/pmidbg.h b/src/include/pmidbg.h new file mode 100644 index 0000000..2d58ec5 --- /dev/null +++ b/src/include/pmidbg.h @@ -0,0 +1,500 @@ +#pragma once +#ifndef _PmiDbg_H +#define _PmiDbg_H +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// +// Summary: +// This header provides the extensions interface for the MSMPI Process +// Management Interface (PMI) for debuggers and profiling tools. +// +// Loading and Initialization: +// The PMI infrastructure will load the registered extensions in each +// process created to support a job. Each created PMI process will +// enumerate all extensions and load these extensions. Once all +// extensions are loaded, the PMIDBG_NOTIFY_INITIALIZE notification +// will be sent to all loaded extensions using the mechanism described +// in the Notifications section described below. +// NOTE: +// There are no implied or explicit ordering guarantees to the loading +// or notification system. The only guarantee provided is that the +// initialization function PmiDbgInitExtension provided by the +// extension will be the first function that is called and the +// notifications (if there is any) will be sent to all the loaded +// extension via the Notification mechanism +// +// Registration and Installation: +// The actual extension DLLs may be installed anywhere. A 32 bit and a +// 64 bit version should be provided. To register the extension to be +// loaded, the user, either manually or through some installer, should +// create a registry key under +// HKLM\Software\Microsoft\Mpi\PmiExtensions. The default value of +// this key must be the path to the extension DLL. If just the DLL +// name is provided, standard DLL load paths will apply. +// +// Notifications, Interogation, and Injection: +// Each extension will receive notifications through the "Notify" +// callback during the various phases of execution. This "Notify" +// callback should be provided by the extension. During these +// callbacks, the extension can use the provided Control callback to +// exchange information with the host process. +// +// Versioning: +// The PMIDBG version is defined as a 16bit value where the high 8 +// bits represent the major and the low 8 bits minor version. All +// versions are incremental and only additive. When the extension is +// loaded, it is given the local version information supported by the +// host process. The extension must do a min() of the two to determine +// the common version. For extensions supporting a lower version than +// the host, nothing special is required. For extensions supporting a +// higher version than the host, they must to restrict their +// extensions use of the PMIDBG APIs to those based on the actual +// version of the host. +// +//----------------------------------------------------------------------------- + +#ifndef MSMPI_NO_SAL +#include +#endif + + +/*---------------------------------------------------------------------------*/ +/* SAL ANNOTATIONS */ +/*---------------------------------------------------------------------------*/ +/* +* Define SAL annotations if they aren't defined yet. +*/ +#ifndef __in +#define __in +#endif +#ifndef __inout_bcount +#define __inout_bcount( x ) +#endif +#ifndef __out +#define __out +#endif + + +#define PMIDBG_VERSION_1 MAKEWORD(1,0) +#define PMIDBG_VERSION_1_1 MAKEWORD(1,1) +#ifndef PMIDBG_VERSION +# define PMIDBG_VERSION PMIDBG_VERSION_1_1 +#endif + +// +// To register an extension, create a key under the below path in HKLM +// with a default value of the path to the dll. The 64 bit registry +// root should point to the 64 bit version of the extension, and the +// 32 bit registry root should point to the 32 bit version. +// +#define PMIDBG_REG_PATH_A "Software\\Microsoft\\Mpi\\PmiExtensions" +#define PMIDBG_REG_PATH_W L##PMIDBG_REG_PATH_A +#define PMIDBG_REG_PATH TEXT(PMIDBG_REG_PATH_A) + +// +// Summary: +// Enumeration values used to identify the role of the host process +// that has loaded the extension. +// +typedef enum _PMIDBG_HOST_TYPE +{ + // + // Signifies that the extension is being loaded by the controller + // (MPIEXEC). This extension will remain loaded until the entire + // task completes or aborts. The extension will be loaded once per + // task on a single machine. + // + PMIDBG_HOST_CONTROLLER = 1, + + // + // Signifies that the extension is being loaded by the node + // manager (SMPD). This extension will remain loaded until the + // entire task completes or aborts. The extension will be loaded + // once on each machine that is involved in the job. + // + PMIDBG_HOST_MANAGER, + +} PMIDBG_HOST_TYPE; + + + +// +// Summary: +// Enumeration values used to identify the notification event that is +// occurring. This value is sent through the notification callback +// provided by the extension. +// +typedef enum _PMIDBG_NOTIFY_TYPE +{ + // + // This notification is sent in all host types after all + // extensions have been loaded into the host process. Extensions + // should use this to collect global information and open any + // communication ports that are required. + // + PMIDBG_NOTIFY_INITIALIZE = 0, + + + // + // This notification is sent when the controller is about to tell + // all managers to create the worker processes. Extensions can + // use this get to the list of machines and world size + // information. + // + PMIDBG_NOTIFY_BEFORE_CREATE_PROCESSES, + + // + // This notification is sent when the controller has receive + // confirmation that all worker processes have been created + // successfully. + // + PMIDBG_NOTIFY_AFTER_CREATE_PROCESSES, + + + // + // This notification is sent when the manager is about to create + // the worker process. Extensions can obtain the program, + // arguments, and rank information of the process that is about to + // be created. + // + PMIDBG_NOTIFY_BEFORE_CREATE_PROCESS, + + // + // This notification is sent when the manager has created a + // suspended the worker process. Extensions can obtain the + // program, arguments, startup info, and rank information of the + // process that is about to be created. Additionally, they can + // also get the process and thread handles and ids and override + // the default behavior to call ResumeThread on the new thread + // handle. + // + PMIDBG_NOTIFY_AFTER_CREATE_PROCESS, + + // + // This notification is send before unloading the extension in any + // role. This notification is sent either at the end of the task, + // or immediately following a notification where the Unload + // callback was invoked because of an error. + // + PMIDBG_NOTIFY_FINALIZE, + +} PMIDBG_NOTIFY_TYPE; + + +// +// Summary: +// Identifies the various interogaton routines that can be performed +// by extensions. +// +typedef enum _PMIDBG_OPCODE_TYPE +{ + // + // This operation may be sent during any notification on any host + // type. The pBuffer argument must point to a PMIDBG_SYSTEM_INFO* + // and cbBuffer must be greater than or equal to + // sizeof(PMIDBG_SYSTEM_INFO*). + // + PMIDBG_OPCODE_GET_SYSTEM_INFO = 0, + + // + // This operation may be sent during any notification on any host + // type. The pBuffer argument must point to a char* and cbBuffer + // must be greater than or equal to sizeof(char*). + // + PMIDBG_OPCODE_GET_JOB_CONTEXT, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESSES notification on the + // controller for the job. The pBuffer argument must point to a + // UINT and cbBuffer must be greater than or equal to + // sizeof(UINT). + // + PMIDBG_OPCODE_GET_WORLD_SIZE, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESSES notification on the + // controller for the job. The pBuffer argument must point to a + // PMIDBG_ENUM_WORLD_NODES structure and cbBuffer must be greater + // than or equal to sizeof(PMIDBG_ENUM_WORLD_NODES). To start the + // enumeration, set the Context field of the + // PMIDBG_ENUM_WORLD_NODES structure to PMIDBG_ENUM_BEGIN. The + // name of the machine can be obtained from the Hostname field of + // the PMIDBG_ENUM_WORLD_NODES structure on return of the Control + // callback. The Context field will be set to PMIDBG_ENUM_END + // when there are no more items in the list. + // + PMIDBG_OPCODE_ENUM_WORLD_NODES, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESS and + // PMIDBG_NOTIFY_AFTER_CREATE_PROCESS notifications on the manager + // for a machine. The pBuffer argument must point to a char* and + // cbBuffer must be greater than or equal to sizeof(char*). + // + PMIDBG_OPCODE_GET_PROCESS_COMMAND, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESS and + // PMIDBG_NOTIFY_AFTER_CREATE_PROCESS notifications on the manager + // for a machine. The pBuffer argument must point to a char* and + // cbBuffer must be greater than or equal to sizeof(char*). + // + PMIDBG_OPCODE_GET_PROCESS_ARGUMENTS, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESS and + // PMIDBG_NOTIFY_AFTER_CREATE_PROCESS notifications on the manager + // for a machine. The pBuffer argument must point to a int and + // cbBuffer must be greater than or equal to sizeof(int). + // + PMIDBG_OPCODE_GET_PROCESS_RANK, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_AFTER_CREATE_PROCESS notification on the manager + // for a machine. The pBuffer argument must point to a + // PROCESS_INFORMATION* and cbBuffer must be greater than or equal + // to sizeof(PROCESS_INFORMATION*). + // + PMIDBG_OPCODE_GET_PROCESS_INFORMATION, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_AFTER_CREATE_PROCESS notification on the manager + // for a machine to prevent ResumeThread from being called on the + // process that was just created. This leaves the process in a + // suspended state. The extension can then use the handle of the + // thread to control the startup of the worker process. The + // pBuffer and cbBuffer arguments are unused. + // + PMIDBG_OPCODE_OVERRIDE_PROCESS_RESUME, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESSES notification on the + // controller for the job. The pBuffer argument must point to an + // int* and cbBuffer must be greater than or equal to sizeof(int*). + // + PMIDBG_OPCODE_GET_PROCSIZE_ADDR, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESSES notification on the + // controller for the job. The pBuffer argument must point to a + // MPIR_PROCDESC* and cbBuffer must be greater + // than or equal to sizeof(MPIR_PROCDESC*). + // + PMIDBG_OPCODE_GET_PROCTABLE_ADDR, + + // + // This operation may only be sent during the + // PMIDBG_NOTIFY_BEFORE_CREATE_PROCESSES notification on the + // controller for the job. The pBuffer argument must point to an + // int and cbBuffer must be greater than or equal to sizeof(int). + // The possible returned values are described in the + // MPIDBG_DBG_MODE enum + // + PMIDBG_OPCODE_GET_DEBUG_MODE, + +} PMIDBG_OPCODE_TYPE; + + +// +// Summary: +// This is the callback function provided by the system to extensions +// to allow the extension to get and set information from within host +// process. +// +// Parameters: +// type - The type of operation requested by the extension. +// pData - The pointer to the data buffer provided in the +// notification callback. +// Note: This must be the pData argument from the Notify +// callback. +// pBuffer - This is a pointer to a buffer that is used by the +// operation type. See the details of the specific +// operation to know the type of data to pass here. +// cbBuffer - This is the size of the buffer pointed to by pBuffer +// +// Returns: +// An HRESULT indicating status. Callers should use SUCCEEDED and +// FAILED macros to test for error conditions. +// +typedef HRESULT ( __stdcall FN_PmiDbgControl ) ( + __in PMIDBG_OPCODE_TYPE type, + __in void* pData, + __inout_bcount(cbBuffer) void* pBuffer, + __in SIZE_T cbBuffer + ); + + +// +// Summary: +// This callback function can be used during notification events to +// signify that the extension has entered an error state and needs to +// be unloaded. Once the notification returns, the extension will be +// finalized and unloaded. +// +typedef HRESULT ( __stdcall FN_PmiDbgUnload)(); + + +// +// Summary: +// This callback is provided by the extension to receive notification +// from the host process. +// +// Parameters: +// type - The type of notification that is being sent. +// pData - The opaque data buffer that can be used for +// Control operations. +// +typedef VOID ( __stdcall FN_PmiDbgNotify)( + __in PMIDBG_NOTIFY_TYPE type, + __in void* pData + ); + + +// +// Summary: +// This structure provides the information about the host process. +// +// Fields: +// Version - The current supported version of the host process +// Host - The role of the current host process. +// AppName - The simple text name for the host process. +// LocalName - The hostname of the local machine. +// Control - The callback function to get and set information +// within the host process +// Unload - The callback function used to trigger an +// unload of the current extension +// +typedef struct _PMIDBG_SYSTEM_INFO +{ + ULONG Version; + PMIDBG_HOST_TYPE Host; + const char* AppName; + const char* LocalName; + FN_PmiDbgControl* Control; + FN_PmiDbgUnload* Unload; + +} PMIDBG_SYSTEM_INFO; + + +// +// Summary: +// This structure provides the information about the extension and +// the its supported callbacks. +// +// Fields: +// Version - The min version of the host process and the extension. +// Notify - The notification callback invoked when events occur +// in the host process. +// +// Remarks: +// The value specified in the Version field is the maximum supported +// version by the extension, it may not be fully supported by the +// PMI Host process, so the extension must inspect the Version field +// of the PMIDBG_SYSTEM_INFO struct during the Initialize callback to +// determine the actual version of the interface being supported. +// +typedef struct _PMIDBG_FUNCTIONS +{ + ULONG Version; + FN_PmiDbgNotify* Notify; + +} PMIDBG_FUNCTIONS; + + +// +// Summary: +// This is the export provided by all extensions. It is called after +// the DLL is loaded into the host process. If the extension returns +// FALSE, the extension is immediately removed from the list and +// unloaded. +// +typedef BOOL ( __stdcall FN_PmiDbgInitExtension)( + __in HKEY hKey, + __in const PMIDBG_SYSTEM_INFO* pInfo, + __out PMIDBG_FUNCTIONS* pFunctions + ); + +#define PMIDBG_INIT_EXTENSION_FN_NAME "PmiDbgInitExtension" + + +// +// Summary: +// This structure is used during the PMIDBG_OPCODE_ENUM_WORLD_NODES +// control operation to access the list of nodes involved in a job. +// +// Fields: +// Context - Opaque context value to identify the current +// element in the list. To begin the iteration, +// set the value to PMIDBG_ENUM_BEGIN. This field +// will be set to PMIDBG_ENUM_END when there are +// no more items in the list. +// Hostname - On return from the Control callback, this +// contains the hostname of the node. +// +typedef struct _PMIDBG_ENUM_WORLD_NODES +{ + LONG_PTR Context; + const char* Hostname; + +} PMIDBG_ENUM_WORLD_NODES; + + +// +// Summary: +// This structure is used during the PMIDBG_OPCODE_GET_PROCTABLE_ADDR +// operation to access the information about the MPI processes. +// +// Fields: +// hostname - The name of the host where the process lives in +// executable_name - The executable name of the process +// pid - The pid of the process +// +typedef struct +{ + char* host_name; + char* executable_name; + int pid; +} MPIR_PROCDESC; + + +// +// Summary: +// This enum describe the possible returned values for the +// PMIDBG_OPCODE_GET_DEBUG_MODE operation +// +// Values: +// MPIDBG_DBG_LAUNCH - The job was launched under the debugger +// MPIDBG_DBG_ATTACH - The job was not launched under the debugger. +// The debugger has attached to the processes +// MPIDBG_DBG_DUMP - The job is a debugging job for dump files +// +typedef enum _MPIDBG_DBG_MODE +{ + MPIDBG_DBG_LAUNCH = 0, + MPIDBG_DBG_ATTACH, + MPIDBG_DBG_DUMP +} MPIDBG_DBG_MODE; + + +// +// Values for the debug_state, this seems to be all we need at the moment +// but that may change... +// +#define MPIR_NULL 0 +#define MPIR_DEBUG_SPAWNED 1 +#define MPIR_DEBUG_ABORTING 2 + + +#define PMIDBG_ENUM_BEGIN ((LONG_PTR)0) +#define PMIDBG_ENUM_END ((LONG_PTR)-1) + +#endif //#ifndef _PmiDbg_H diff --git a/src/include/x64/mpifptr.h b/src/include/x64/mpifptr.h new file mode 100644 index 0000000..1d4a288 --- /dev/null +++ b/src/include/x64/mpifptr.h @@ -0,0 +1,9 @@ +! -*- Mode: F77; F90; -*- +! +! Copyright(c) Microsoft Corporation.All rights reserved. +! Licensed under the MIT License. +! + INTEGER MPI_AINT + PARAMETER (MPI_AINT=z'4c00083b') + INTEGER MPI_ADDRESS_KIND + PARAMETER(MPI_ADDRESS_KIND = 8) diff --git a/src/include/x86/mpifptr.h b/src/include/x86/mpifptr.h new file mode 100644 index 0000000..1028a1d --- /dev/null +++ b/src/include/x86/mpifptr.h @@ -0,0 +1,9 @@ +! -*- Mode: F77; F90; -*- +! +! Copyright(c) Microsoft Corporation.All rights reserved. +! Licensed under the MIT License. +! + INTEGER MPI_AINT + PARAMETER (MPI_AINT=z'4c00043b') + INTEGER MPI_ADDRESS_KIND + PARAMETER(MPI_ADDRESS_KIND = 4) diff --git a/src/launchSvc/LaunchSvc.h b/src/launchSvc/LaunchSvc.h new file mode 100644 index 0000000..298c344 --- /dev/null +++ b/src/launchSvc/LaunchSvc.h @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +#include +#include "MsmpiLaunchSvc.h" + +// +// Service settings +// +#define SERVICE_NAME L"MsmpiLaunchSvc" +#define SERVICE_START_TYPE SERVICE_AUTO_START + +// +// A singleton class that will run as a windows service application. +// It handles the interaction with SCM and manages the launch service. +// +class WindowsSvc +{ +private: + SERVICE_TABLE_ENTRYW m_ctrlDispatchTable[2]; + SERVICE_STATUS_HANDLE m_serviceStatusHandle; + SERVICE_STATUS m_serviceStatus; + +private: + WindowsSvc(); + HRESULT ChangeState(_In_ DWORD newState); + +public: + MsmpiLaunchService m_launcher; + + HRESULT Start(); + + static WindowsSvc ms_windowsSvc; + + static VOID WINAPI ServiceMain(_In_ DWORD argc, _In_ LPWSTR * argv); + static VOID WINAPI ServiceCtrlHandler(_In_ DWORD ctrl); +}; diff --git a/src/launchSvc/LaunchSvcMain.cpp b/src/launchSvc/LaunchSvcMain.cpp new file mode 100644 index 0000000..a18d64e --- /dev/null +++ b/src/launchSvc/LaunchSvcMain.cpp @@ -0,0 +1,244 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "LaunchSvc.h" +#include + +EventLogger gEventLogger; +WindowsSvc WindowsSvc::ms_windowsSvc; + +MsmpiLaunchService& Launcher() +{ + return WindowsSvc::ms_windowsSvc.m_launcher; +} + +// +// Entry point +// +int __cdecl main(int /*argc*/, const char* /*argv[]*/) +{ + if (!gEventLogger.Open(SERVICE_NAME)) + { + return GetLastError(); + } + + gEventLogger.WriteEvent(EVENTLOG_INFORMATION_TYPE, SVC_CATEGORY, SERVICE_EVENT, L"Starting Launch Service"); + + // + // Start MsMpi Launch Service + // + HRESULT result = WindowsSvc::ms_windowsSvc.Start(); + + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to start launch service. Error=0x%x\n", + result); + return result; + } + + gEventLogger.WriteEvent( + EVENTLOG_INFORMATION_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Ended Launch Service. Result=0x%x\n", + result); + + return result; +} + + +/*---------------------------------------------------------------------------*/ +/* WindowsSvc Class Member Functions */ +/*---------------------------------------------------------------------------*/ + +WindowsSvc::WindowsSvc() +{ + m_serviceStatus.dwCheckPoint = 0; + m_serviceStatus.dwControlsAccepted = 0; + m_serviceStatus.dwCurrentState = SERVICE_START_PENDING; + m_serviceStatus.dwServiceSpecificExitCode = 0; + m_serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + m_serviceStatus.dwWaitHint = 0; + m_serviceStatus.dwWin32ExitCode = 0; + + m_serviceStatusHandle = nullptr; + + m_ctrlDispatchTable[0] = { SERVICE_NAME, ServiceMain }; + m_ctrlDispatchTable[1] = { nullptr, nullptr }; +} + + +HRESULT WindowsSvc::ChangeState(_In_ DWORD newState) +{ + switch (newState) + { + case SERVICE_RUNNING: + m_serviceStatus.dwCurrentState = SERVICE_RUNNING; + m_serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; + break; + default: + m_serviceStatus.dwCurrentState = newState; + break; + } + + if (!SetServiceStatus(m_serviceStatusHandle, &m_serviceStatus)) + { + HRESULT result = HRESULT_FROM_WIN32(GetLastError()); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to change service state to %d. Error=0x%x\n", + newState, + result); + return result; + } + + return S_OK; +} + + +// +// Does service specific initializations and registers service loop and control handlers +// +HRESULT WindowsSvc::Start() +{ + HANDLE processToken; + HRESULT result; + + // + // Adjust process priviliges so it is able to load user profiles + // + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &processToken)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + result = SecurityUtils::GrantPrivilege(processToken, SE_BACKUP_NAME, TRUE); + if (FAILED(result)) + { + CloseHandle(processToken); + return result; + } + + result = SecurityUtils::GrantPrivilege(processToken, SE_RESTORE_NAME, TRUE); + + CloseHandle(processToken); + + if (FAILED(result)) + { + return result; + } + + // + // Load msmpi service launcher + // + result = m_launcher.Load(); + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"msmpi.dll did not load properly. Error=0x%x\n", + result); + + return result; + } + + // + // Register to SCM + // + if (!StartServiceCtrlDispatcherW(m_ctrlDispatchTable)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to start launch service. Error=0x%x\n", + result); + + return HRESULT_FROM_WIN32(GetLastError()); + } + + return S_OK; +} + + +// +// Handles service control requests +// +VOID WINAPI WindowsSvc::ServiceCtrlHandler(_In_ DWORD ctrl) +{ + switch (ctrl) + { + //case SERVICE_CONTROL_SHUTDOWN ? + case SERVICE_CONTROL_STOP: + ms_windowsSvc.m_launcher.Stop(); + break; + default: + break; + } +} + + +// +// Main service loop +// +VOID WINAPI WindowsSvc::ServiceMain(_In_ DWORD argc, _In_ LPWSTR *argv) +{ + ms_windowsSvc.m_serviceStatusHandle = + RegisterServiceCtrlHandlerW(SERVICE_NAME, ServiceCtrlHandler); + + if (ms_windowsSvc.m_serviceStatusHandle == nullptr) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to register service control handler. Error=0x%x\n", + HRESULT_FROM_WIN32(GetLastError())); + + return; + } + + if (!ms_windowsSvc.m_launcher.ParseOptions(argc, argv)) + { + ms_windowsSvc.m_serviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; + ms_windowsSvc.m_serviceStatus.dwServiceSpecificExitCode = ERROR_INVALID_PARAMETER; + OACR_WARNING_SUPPRESS(HRESULT_NOT_CHECKED, "Don't care about the status of state change - no possible recovery."); + ms_windowsSvc.ChangeState(SERVICE_STOPPED); + return; + } + + // + // Start running launch service + // + + HRESULT result = ms_windowsSvc.ChangeState(SERVICE_RUNNING); + if (FAILED(result)) + { + return; + } + + result = ms_windowsSvc.m_launcher.Run(); + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to start listening to PMI clients. Error=0x%x\n", + result); + + ms_windowsSvc.m_serviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; + ms_windowsSvc.m_serviceStatus.dwServiceSpecificExitCode = result; + } + + OACR_WARNING_SUPPRESS(HRESULT_NOT_CHECKED, "Don't care about the status of state change - no possible recovery."); + ms_windowsSvc.ChangeState(SERVICE_STOPPED); +} diff --git a/src/launchSvc/MsmpiLaunchSvc.cpp b/src/launchSvc/MsmpiLaunchSvc.cpp new file mode 100644 index 0000000..8776197 --- /dev/null +++ b/src/launchSvc/MsmpiLaunchSvc.cpp @@ -0,0 +1,1466 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include +#include +#include +#include +#include "assertutil.h" +#include "MsmpiLaunchSvc.h" +#include "kernel32util.h" +#include "mpiutil.h" +#include "util.h" +#include + +extern EventLogger gEventLogger; +extern MsmpiLaunchService& Launcher(); + +/*--------------------------------------------------------------------------*/ +/* LaunchContext */ +/*--------------------------------------------------------------------------*/ + +LaunchContext::LaunchContext() + : m_pmiHandle(nullptr) + , m_parentThread(nullptr) + , m_mgrProcess(nullptr) + , m_primaryToken(nullptr) + , m_userToken(nullptr) + , m_userProfile(nullptr) +{ +} + + +LaunchContext::~LaunchContext() +{ + Dispose(); +} + + +void LaunchContext::Dispose() +{ + CloseHandle(m_parentThread); + CloseHandle(m_mgrProcess); + CloseHandle(m_primaryToken); + UnloadUserProfile(m_userToken, m_userProfile); + CloseHandle(m_userToken); + + ZeroMemory(this, sizeof(*this)); +} + + +/*--------------------------------------------------------------------------*/ +/* ContextPool */ +/*--------------------------------------------------------------------------*/ + +ContextPool::ContextPool() + : m_activeContextCount(0) +{ + InitializeSRWLock(&m_lock); + + for (DWORD i = 0; i < _countof(m_activeIndices); ++i) + { + m_activeIndices[i] = i; + } +} + + +ContextPool::~ContextPool() +{ + AcquireSRWLockExclusive(&m_lock); + + WORD eType = m_activeContextCount == 0 ? EVENTLOG_INFORMATION_TYPE : EVENTLOG_WARNING_TYPE; + gEventLogger.WriteEvent( + eType, + SVC_CATEGORY, + SERVICE_EVENT, + L"Service has %d active launch contexts", + m_activeContextCount); + + for (DWORD i = 0; i < m_activeContextCount; ++i) + { + m_contexts[m_activeIndices[i]].Dispose(); + } + + ReleaseSRWLockExclusive(&m_lock); +} + + +LaunchContext* ContextPool::CreateNewContext() +{ + Assert(m_activeContextCount <= _countof(m_contexts)); + + LaunchContext* pNewContext = nullptr; + + AcquireSRWLockExclusive(&m_lock); + + if (m_activeContextCount == _countof(m_contexts)) + { + goto exit_fn; + } + + pNewContext = m_contexts + m_activeIndices[m_activeContextCount]; + ++m_activeContextCount; + +exit_fn: + ReleaseSRWLockExclusive(&m_lock); + return pNewContext; +} + + +BOOL ContextPool::DestroyContext(_In_opt_ LaunchContext* pDeleteContext) +{ + BOOL result = TRUE; + if (pDeleteContext == nullptr) + { + return result; + } + + AcquireSRWLockExclusive(&m_lock); + + ptrdiff_t idx = pDeleteContext - m_contexts; + + if (m_activeContextCount == 0 + || idx < 0 || static_cast(idx) >= _countof(m_contexts)) + { + Assert(false); + result = FALSE; + goto exit_fn; + } + + m_contexts[idx].Dispose(); + + DWORD idxActive = 0; + for (; idxActive < m_activeContextCount; ++idxActive) + { + if (m_activeIndices[idxActive] == static_cast(idx)) + { + break; + } + } + Assert(idxActive < m_activeContextCount); + + --m_activeContextCount; + DWORD destroyedIdx = m_activeIndices[idxActive]; + m_activeIndices[idxActive] = m_activeIndices[m_activeContextCount]; + m_activeIndices[m_activeContextCount] = destroyedIdx; + +exit_fn: + ReleaseSRWLockExclusive(&m_lock); + return result; +} + + +// +// Returns the first context that satisfies the given match function +// +template +LaunchContext* +ContextPool::FindContext( + _In_ IsMatch compareFunct, + _In_ const T* pData + ) +{ + AcquireSRWLockShared(&m_lock); + + LaunchContext* pCursor = nullptr; + + for (DWORD i = 0; i < m_activeContextCount; ++i) + { + if (compareFunct(m_contexts + m_activeIndices[i], pData)) + { + pCursor = m_contexts + m_activeIndices[i]; + break; + } + } + + ReleaseSRWLockShared(&m_lock); + return pCursor; +} + + +/*--------------------------------------------------------------------------*/ +/* LaunchContext match functions */ +/*--------------------------------------------------------------------------*/ + +// +// Returns true if the launch ctx's thread matches given thread handle +// +BOOL IsMatchCtxThread(_In_ const LaunchContext* pCtx, _In_ const HANDLE* pThread) +{ + if (pCtx == nullptr || pThread == nullptr) + { + return FALSE; + } + + return pCtx->m_parentThread == *pThread; +} + + +// +// Returns true if the launch ctx matches given data +// +BOOL IsMatchCtxHandle(_In_ const LaunchContext* pCtx, _In_ const void* pData) +{ + return (pCtx != nullptr) && (pCtx->m_pmiHandle == pData); +} + + +// +// Returns true if the launch context has a valid but empty job object +// +BOOL IsMatchMgrProcess(_In_ const LaunchContext* pCtx, _In_ const HANDLE* pProcHandle) +{ + return (pCtx != nullptr) && (pCtx->m_mgrProcess == *pProcHandle); +} + + +/*--------------------------------------------------------------------------*/ +/* ProcessQueue */ +/*--------------------------------------------------------------------------*/ + +ProcessQueue::ProcessQueue() + : m_newProcessEvent(nullptr) + , m_count(0) + , m_thread(nullptr) + , m_run(FALSE) +{ + InitializeCriticalSection(&m_lock); +} + + +ProcessQueue::~ProcessQueue() +{ + Stop(); + DeleteCriticalSection(&m_lock); + CloseHandle(m_newProcessEvent); +} + + +HRESULT ProcessQueue::Initialize() +{ + if (m_newProcessEvent != nullptr) + { + return HRESULT_FROM_WIN32(ERROR_ALREADY_INITIALIZED); + } + + m_newProcessEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (m_newProcessEvent == nullptr) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + m_runningProcesses[NEW_PROCESS_EVENT_IDX] = m_newProcessEvent; + m_count = 1; + + return S_OK; +} + + +// +// Safely adds a new process to running processes list and signals new process event +// +HRESULT ProcessQueue::AddProcess(_In_ HANDLE newProcess) +{ + EnterCriticalSection(&m_lock); + + Assert(m_count < _countof(m_runningProcesses)); + + m_runningProcesses[m_count] = newProcess; + ++m_count; + + LeaveCriticalSection(&m_lock); + + SetEvent(m_newProcessEvent); + + return S_OK; +} + + +DWORD ProcessQueue::GetCountSafe() +{ + EnterCriticalSection(&m_lock); + + DWORD countSafe = m_count; + + LeaveCriticalSection(&m_lock); + + return countSafe; +} + + +// +// Safely updates the running processes list and returns the handle of the deleted process +// +HANDLE ProcessQueue::DeleteProcess(_In_ DWORD idx) +{ + EnterCriticalSection(&m_lock); + + Assert(idx < m_count); + + HANDLE deletedProcess = m_runningProcesses[idx]; + + --m_count; + m_runningProcesses[idx] = m_runningProcesses[m_count]; + + LeaveCriticalSection(&m_lock); + + return deletedProcess; +} + + +HRESULT ProcessQueue::Start() +{ + m_run = TRUE; + + m_thread = CreateThread( + nullptr, + 0, + WaitProcesses, + this, + 0, + nullptr); + + if (m_thread == nullptr) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + return S_OK; +} + + +HRESULT ProcessQueue::Stop() +{ + m_run = FALSE; + + SetEvent(m_newProcessEvent); + + DWORD result = WaitForSingleObject(m_thread, SHUTDOWN_TIMEOUT); + + switch (result) + { + case WAIT_OBJECT_0: + result = NO_ERROR; + break; + case WAIT_TIMEOUT: + result = ERROR_APP_HANG; + break; + case WAIT_FAILED: + result = GetLastError(); + break; + case WAIT_ABANDONED: + default: + result = ERROR_INVALID_STATE; + break; + } + + CloseHandle(m_thread); + + return HRESULT_FROM_WIN32(result); +} + + +DWORD ProcessQueue::WaitProcesses(_In_ LPVOID pData) +{ + if (pData == nullptr) + { + return ERROR_BAD_ARGUMENTS; + } + + ProcessQueue* pProcessQueue = static_cast(pData); + + while (pProcessQueue->m_run) + { + DWORD count = pProcessQueue->GetCountSafe(); + + DWORD signalIdx = WaitForMultipleObjects( + count, + pProcessQueue->m_runningProcesses, + FALSE, + INFINITE); + + if (signalIdx == WAIT_FAILED) + { + return GetLastError(); + } + + signalIdx -= WAIT_OBJECT_0; + Assert(signalIdx < count); + + if (signalIdx == NEW_PROCESS_EVENT_IDX) + { + // + // A new process was added. Update the count, and continue waiting + // + continue; + } + + // + // A process terminated, delete it from the wait list and trigger it's context cleanup. + // + HANDLE terminatedProcess = pProcessQueue->DeleteProcess(signalIdx); + Launcher().ManagerProcessTerminated(terminatedProcess); + } + + return S_OK; +} + + +/*--------------------------------------------------------------------------*/ +/* MsmpiLaunchService */ +/*--------------------------------------------------------------------------*/ + +MsmpiLaunchService::MsmpiLaunchService() + : m_pmiModule(nullptr) + , m_servicePort(DEFAULT_SERVICE_PORT) + , m_pMemberGroupSid(nullptr) +{ + m_pmiService.Size = sizeof(PmiServiceInterface); +} + + +MsmpiLaunchService::~MsmpiLaunchService() +{ + free(m_pMemberGroupSid); + FreeLibrary(m_pmiModule); + m_pmiModule = nullptr; +} + + +// +// Loads the MSPMS provider and initializes PMI interfaces +// +HRESULT MsmpiLaunchService::Load() +{ + wchar_t msmpiModulePath[MAX_PATH]; + DWORD cbPath = sizeof(msmpiModulePath); + HRESULT result; + + // + // Initialize the queue that checks smpd manager process lifetimes + // + result = m_mgrQueue.Initialize(); + + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to initialize smpd manager queue. Error=0x%x\n", + result); + + return result; + } + + // + // MSPMS provider that is installed on the system is written in registry. + // Read module path. + // + result = RegistryUtils::ReadKey( + HKEY_LOCAL_MACHINE, + MSPMI_MODULE_PATH_KEY, + MSPMI_PROVIDER_VALUE, + &cbPath, + msmpiModulePath + ); + + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to read registry %s %s Error=0x%x\n", + MSPMI_MODULE_PATH_KEY, + MSPMI_PROVIDER_VALUE, + result); + + return result; + } + + // + // Load the registered MSPMS module. + // + OACR_REVIEWED_CALL( + mpicr, + m_pmiModule = LoadLibraryExW(msmpiModulePath, nullptr, 0)); + + if (m_pmiModule == nullptr) + { + DWORD error = GetLastError(); + + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to load library. Error=0x%x\n", + error); + + return HRESULT_FROM_WIN32(error); + } + + // + // Get interface function addresses and get interface structures + // + PFN_MSMPI_PM_QUERY_INTERFACE fnPmiQueryIf = (PFN_MSMPI_PM_QUERY_INTERFACE) + GetProcAddress(m_pmiModule, MSPMI_PROC_PMI_QUERY_IF); + if (fnPmiQueryIf == nullptr) + { + DWORD error = GetLastError(); + + // %S in wide format string means parameter is 8b char + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to get process address %S. Error=0x%x\n", + MSPMI_PROC_PMI_QUERY_IF, + error); + + return HRESULT_FROM_WIN32(error); + } + + result = fnPmiQueryIf( + PM_SERVICE_INTERFACE_LAUNCH, + reinterpret_cast(&m_pMspmiServiceLaunch)); + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to get PmiServiceLaunchInterface. Error=0x%x\n", + result); + + return result; + } + + PFN_MSMPI_GET_PM_INTERFACE fnGetPmi = (PFN_MSMPI_GET_PM_INTERFACE) + GetProcAddress(m_pmiModule, MSPMI_PROC_GET_PMI); + if (fnGetPmi == nullptr) + { + DWORD error = GetLastError(); + + // %S in wide format string means parameter is 8b char + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to get process address %S. Error=0x%x\n", + MSPMI_PROC_GET_PMI, + error); + + return HRESULT_FROM_WIN32(error); + } + + result = fnGetPmi(PM_SERVICE_INTERFACE_V1, &m_pmiService); + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to get PmiServiceInterface. Error=0x%x\n", + result); + + return result; + } + + // + // Initialize interface structures + // + PmiServiceInitData pmiSvcInitData; + + pmiSvcInitData.Size = sizeof(pmiSvcInitData); + pmiSvcInitData.Name = "MSMPI Launch Service"; + + result = m_pmiService.Initialize(&pmiSvcInitData); + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to initialize PMI service. Error=0x%x\n", + result); + + return result; + } + + m_pMspmiServiceLaunch->CreateLaunchCtx = ServiceCreateLaunchCtx; + m_pMspmiServiceLaunch->StartLaunchCtx = ServiceStartLaunchCtx; + m_pMspmiServiceLaunch->CleanupLaunchCtx = ServiceCleanupLaunchCtx; + + return result; +} + + +BOOL MsmpiLaunchService::ParseOptions(_In_ DWORD argc, _In_ LPWSTR *argv) +{ + WCHAR logBuffer[MAX_LOG_TEXT] = { 0 }; + HRESULT hr = S_OK; + + for (DWORD i = 0; i < argc && SUCCEEDED(hr); i += 1) + { + hr = StringCchCatW(logBuffer, _countof(logBuffer), argv[i]); + hr = StringCchCatW(logBuffer, _countof(logBuffer), L" "); + } + + gEventLogger.WriteEvent( + EVENTLOG_INFORMATION_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Service parameters are :\n %s", + logBuffer + ); + + for (DWORD i = 1; i < argc; i += 2) + { + if (i + 1 == argc) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Missing arguments in options.\n" + ); + return FALSE; + } + + if ((_wcsicmp(argv[i], L"-p") == 0) + || (_wcsicmp(argv[i], L"-port") == 0)) + { + // + // Server port: Service listens to clients on specified port + // + int port = _wtoi(argv[i + 1]); + if (port <= 0 || port > USHRT_MAX) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Invalid value of server port is set for service : %s\n", + argv[i+1] + ); + return FALSE; + } + m_servicePort = static_cast(port); + } + else if ((_wcsicmp(argv[i], L"-g") == 0) + || (_wcsicmp(argv[i], L"-group") == 0)) + { + // + // Client group membership: Clients must be member of this group to be + // able to connect + // + HRESULT result = SecurityUtils::GetSidForAccount( + nullptr, + argv[i + 1], + &m_pMemberGroupSid); + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Invalid group for client membership : %s\nError=0x%x", + argv[i + 1], + result + ); + return FALSE; + } + } + } + + return TRUE; +} + + +HRESULT MsmpiLaunchService::Run() +{ + HRESULT result; + SOCKADDR_INET svcAddr; + PmiManagerInterface pmiManager; + + // + // Start manager process lifetime management + // + result = m_mgrQueue.Start(); + + if (FAILED(result)) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + SVC_CATEGORY, + SERVICE_EVENT, + L"Failed to start smpd manager queue. Error=0x%x\n", + result); + + return result; + } + + // + // Start PMI service + // + pmiManager.Size = sizeof(PmiManagerInterface); + pmiManager.LaunchType = PmiLaunchTypeImpersonate; + pmiManager.Launch.Impersonate = ServiceCreateManagerProcess; + + svcAddr.si_family = AF_INET; + svcAddr.Ipv4.sin_port = _byteswap_ushort(m_servicePort); + svcAddr.Ipv4.sin_addr.S_un.S_addr = INADDR_ANY; + + result = m_pmiService.Listen(&svcAddr, &pmiManager, PM_MANAGER_INTERFACE_V1); + + m_pmiService.Finalize(); + + return result; +} + + +OACR_WARNING_DISABLE(HRESULT_NOT_CHECKED, "Don't care about the result of stop commands - no possible recovery."); +VOID MsmpiLaunchService::Stop() +{ + m_pmiService.PostStop(); + m_mgrQueue.Stop(); +} +OACR_WARNING_ENABLE(HRESULT_NOT_CHECKED, "Don't care about the result of stop commands - no possible recovery."); + + +VOID MsmpiLaunchService::ManagerProcessTerminated(_In_ HANDLE mgrProcess) +{ + LaunchContext* pCtx = m_contextPool.FindContext(IsMatchMgrProcess, &mgrProcess); + + Assert(pCtx != nullptr); + + Launcher().m_contextPool.DestroyContext(pCtx); + + gEventLogger.WriteEvent( + EVENTLOG_INFORMATION_TYPE, + 1, + 100, + L"SmpdMgr terminated for launch context 0x%p", + pCtx); +} + + +// +// MSPMS passes us multibyte arguments for backcompat purposes. The +// function should convert multibyte args into wchar_t because they +// might contain true unicode. +// +HRESULT WINAPI +MsmpiLaunchService::ServiceCreateManagerProcess( + _In_z_ PCSTR app, + _In_z_ PCSTR args, + _In_z_ PCSTR /*context*/ + ) +{ + STARTUPINFOW si; + PROCESS_INFORMATION pi; + HRESULT result; + HANDLE currentThread = GetCurrentThread(); + LPCSTR pJobObjName = nullptr; + HANDLE jobObj = nullptr; + PVOID pEnvBlock = nullptr; + LaunchContext* pCtx = + Launcher().m_contextPool.FindContext(IsMatchCtxThread, ¤tThread); + wchar_t currentDirectory[MAX_PATH] = L""; + const wchar_t* pCurrentDirectoryPointer; + wchar_t* appW = nullptr; + wchar_t* argsW = nullptr; + wchar_t* pJobObjNameW = nullptr; + + if (pCtx == nullptr) + { + return E_HANDLE; + } + + Launcher().m_pMspmiServiceLaunch->GetLaunchInfo(pCtx->m_pmiHandle, &pJobObjName, nullptr, nullptr); + if (pJobObjName != nullptr && pJobObjName[0] != 0) + { + DWORD len = static_cast(strlen( pJobObjName ) + 1); + pJobObjNameW = new wchar_t[len]; + if( pJobObjNameW == nullptr ) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Cannot convert job object name to unicode .\nError=0x%x\nJobName %S", + E_OUTOFMEMORY, + pJobObjName); + result = E_OUTOFMEMORY; + goto exit_fn; + } + + if( MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + pJobObjName, + -1, + pJobObjNameW, + len ) == 0 ) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Cannot convert job object name to unicode .\nError=0x%x\nJobName %S", + gle, + pJobObjName); + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + + } + + jobObj = OpenJobObjectW(JOB_OBJECT_ASSIGN_PROCESS, TRUE, pJobObjNameW); + + if (jobObj == nullptr) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Cannot open job object.\nError=0x%x\nJobName %s", + gle, + pJobObjNameW); + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + } + + BOOL success = CreateEnvironmentBlock(&pEnvBlock, pCtx->m_primaryToken, TRUE); + if (!success) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"CreateEnvironmentBlock Error=0x%x\nCtx 0x%p - Token 0x%p", + gle, + pCtx, + pCtx->m_primaryToken); + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + + success = ExpandEnvironmentStringsForUserW( + pCtx->m_primaryToken, + L"%USERPROFILE%", + currentDirectory, + _countof(currentDirectory) + ); + if (!success) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"ExpandEnvironmentStringsForUser Error=0x%x\nCtx 0x%p - Token 0x%p", + gle, + pCtx, + pCtx->m_primaryToken); + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + + if (currentDirectory[0] != L'\0') + { + pCurrentDirectoryPointer = currentDirectory; + } + else + { + pCurrentDirectoryPointer = nullptr; + } + + // + // MSPMS passes us multibyte arguments for backcompat purposes. + // We need to convert the multibyte into wchar_t because they might + // contain true unicode + // + DWORD len = static_cast( strlen( app ) + 1 ); + + // + // At most n UTF-16 characters are required per n UTF-8 characters + // + appW = new wchar_t[len]; + if( appW == nullptr ) + { + result = E_OUTOFMEMORY; + goto exit_fn; + } + + if( MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + app, + -1, + appW, + len ) == 0 ) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"MultiByteToWideChar Error=0x%x\nCtx 0x%p - String %S", + gle, + pCtx, + app); + result = HRESULT_FROM_WIN32( gle ); + goto exit_fn; + } + + len = static_cast( strlen( args ) + 1 ); + argsW = new wchar_t[len]; + if( argsW == nullptr ) + { + result = E_OUTOFMEMORY; + goto exit_fn; + } + + if( MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + args, + -1, + argsW, + len ) == 0 ) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"MultiByteToWideChar Error=0x%x\nCtx 0x%p - String %S", + gle, + pCtx, + args); + result = HRESULT_FROM_WIN32( gle ); + goto exit_fn; + } + + GetStartupInfoW(&si); + si.lpDesktop = L""; + + BOOL mgrCreated = OACR_REVIEWED_CALL( + mpicr, + CreateProcessAsUserW( + pCtx->m_primaryToken, + appW, // Application Name + argsW, // Command Line + nullptr, // Process Security Attributes, + nullptr, // Thread Security Attributes, + TRUE, // Inherit Parent Handles, + CREATE_NO_WINDOW | // Process CreationFlags, + CREATE_UNICODE_ENVIRONMENT | + CREATE_SUSPENDED, + pEnvBlock, // lpEnvironment, + pCurrentDirectoryPointer,// lpCurrentDirectory, + &si, // lpStartupInfo, + &pi // lpProcessInformation + )); + + if (!mgrCreated) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"CreateProcessAsUser Error=0x%x\nCtx 0x%p - Token 0x%p", + gle, + pCtx, + pCtx->m_primaryToken); + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + + ResumeThread(pi.hThread); + CloseHandle(pi.hThread); + pCtx->m_mgrProcess = pi.hProcess; + pCtx->m_parentThread = nullptr; + pCtx->m_pmiHandle = nullptr; + + if (jobObj != nullptr) + { + if (!AssignProcessToJobObject(jobObj, pi.hProcess)) + { + DWORD gle = GetLastError(); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Failed to assign process to job object.\nError=0x%x JobObj=%s\n", + gle, + pJobObjNameW); + + TerminateProcess(pi.hProcess, gle); + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + } + + result = Launcher().m_mgrQueue.AddProcess(pi.hProcess); + +exit_fn: + if (pEnvBlock != nullptr) + { + DestroyEnvironmentBlock(pEnvBlock); + } + if (jobObj != nullptr) + { + CloseHandle(jobObj); + } + delete[] appW; + delete[] argsW; + delete[] pJobObjNameW; + if (FAILED(result)) + { + Launcher().m_contextPool.DestroyContext(pCtx); + } + return result; +} + + +HRESULT +MsmpiLaunchService::ServiceCreateLaunchCtx( + _In_ HANDLE clientToken, + _In_ const void* launchCtx, + _In_z_ const char* /*jobCtx*/ + ) +{ + // + // This function is called in process's security context; i.e. under system account + // + + PROFILEINFOW userProfile; + WCHAR user[MAX_PATH] = { 0 }; + WCHAR domain[MAX_PATH] = { 0 }; + DWORD cchUser = _countof(user); + DWORD cchDomain = _countof(domain); + LaunchContext* pNewContext = nullptr; + + HRESULT result = SecurityUtils::GetTokenUser(clientToken, user, &cchUser, domain, &cchDomain); + if (FAILED(result)) + { + return result; + } + + if (Launcher().m_pMemberGroupSid != nullptr) + { + // + // Check if client is member of required group + // + BOOL isMember; + if (!CheckTokenMembership(clientToken, Launcher().m_pMemberGroupSid, &isMember)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Cannot verify the membership of %s\\%s.\nError=0x%x", + domain, + user, + result); + + return result; + } + + if (!isMember) + { + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Client %s\\%s is not a member of required group.", + domain, + user); + + return HRESULT_FROM_WIN32(ERROR_MEMBER_NOT_IN_GROUP); + } + } + + pNewContext = Launcher().m_contextPool.CreateNewContext(); + if (pNewContext == nullptr) + { + gEventLogger.WriteEvent( + EVENTLOG_WARNING_TYPE, + 1, + 100, + L"Server is busy. Rejecting new clients" + ); + + return HRESULT_FROM_WIN32(RPC_S_SERVER_TOO_BUSY); + } + + Assert(pNewContext->m_mgrProcess == nullptr && pNewContext->m_pmiHandle == nullptr && + pNewContext->m_parentThread == nullptr && pNewContext->m_primaryToken == nullptr && + pNewContext->m_userProfile == nullptr && pNewContext->m_userToken == nullptr); + + pNewContext->m_pmiHandle = launchCtx; + pNewContext->m_userToken = clientToken; + + ZeroMemory(&userProfile, sizeof(PROFILEINFOW)); + userProfile.dwSize = sizeof(PROFILEINFOW); + userProfile.lpUserName = user; + + if (!LoadUserProfileW(clientToken, &userProfile)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + gEventLogger.WriteEvent( + EVENTLOG_ERROR_TYPE, + 1, + 100, + L"Failed to load user profile for %s\\%s. Error: 0x%x", + domain, + user, + result); + + goto exit_fn; + } + + pNewContext->m_userProfile = userProfile.hProfile; + + gEventLogger.WriteEvent( + EVENTLOG_INFORMATION_TYPE, + 1, + 100, + L"Created new launch context 0x%p", + pNewContext); + +exit_fn: + if (FAILED(result)) + { + Launcher().m_contextPool.DestroyContext(pNewContext); + } + return result; +} + + +HRESULT WINAPI MsmpiLaunchService::ServiceStartLaunchCtx(_In_ const void* launchCtx) +{ + // + // This function is called in client's security context; + // i.e. uses client's impersonation token + // + + HANDLE hToken = nullptr; + HANDLE hPrimaryToken = nullptr; + HANDLE hCurrentThread = GetCurrentThread(); + HRESULT result; + BOOL tokenIsInteractive; + WORD logType = EVENTLOG_INFORMATION_TYPE; + LPCSTR pPwd = nullptr; + BOOL saveCreds = FALSE; + LaunchContext* pCtx = + Launcher().m_contextPool.FindContext(IsMatchCtxHandle, launchCtx); + + if (pCtx == nullptr) + { + result = E_HANDLE; + goto fail_fn; + } + + pCtx->m_parentThread = hCurrentThread; + + if (!OpenThreadToken( + hCurrentThread, + TOKEN_ALL_ACCESS, + TRUE, + &hToken)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto fail_fn; + } + + result = SecurityUtils::IsGroupMember(WinInteractiveSid, hToken, &tokenIsInteractive); + if (FAILED(result)) + { + goto fail_fn; + } + + gEventLogger.WriteEvent( + EVENTLOG_INFORMATION_TYPE, + 1, + 100, + L"CreateManagerProcess request user interactive: %d.\n", + tokenIsInteractive + ); + + // + // MSPMS passes us multibyte arguments for backcompat purposes. + // pPwd will need to be converted to wchar_t before usage + // + Launcher().m_pMspmiServiceLaunch->GetLaunchInfo(launchCtx, nullptr, &pPwd, &saveCreds); + + if (tokenIsInteractive && (pPwd == nullptr || pPwd[0] == '\0')) + { + // + // User did not provide a pwd but the token is interactive and we can use it + // + if (!DuplicateTokenEx( + hToken, + TOKEN_ALL_ACCESS, + nullptr, + SecurityImpersonation, + TokenPrimary, + &hPrimaryToken) + ) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto fail_fn; + } + } + else + { + wchar_t* pPwdW = nullptr; + if( pPwd != nullptr ) + { + DWORD len = static_cast( strlen( pPwd ) + 1 ); + pPwdW = new wchar_t[len * 2]; + if( pPwdW == nullptr ) + { + result = E_OUTOFMEMORY; + goto fail_fn; + } + + if( MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + pPwd, + -1, + pPwdW, + len * 2) == 0 ) + { + delete[] pPwdW; + result = HRESULT_FROM_WIN32( GetLastError() ); + goto fail_fn; + } + } + + // + // Token does not have the sufficient rights. Need to do LogonUser. + // + result = Launcher().DoLogonUser(pPwdW, saveCreds, &hPrimaryToken); + delete[] pPwdW; + if (FAILED(result)) + { + goto fail_fn; + } + } + + pCtx->m_primaryToken = hPrimaryToken; + result = S_OK; + + goto exit_fn; + +fail_fn: + logType = EVENTLOG_INFORMATION_TYPE; + if (hPrimaryToken != nullptr) + { + CloseHandle(hPrimaryToken); + } + if (pCtx != nullptr) + { + Launcher().m_contextPool.DestroyContext(pCtx); + } + +exit_fn: + + gEventLogger.WriteEvent(logType, 1, 100, L"StartLaunchCtx 0x%x", result); + + if (hToken != nullptr) + { + CloseHandle(hToken); + } + return result; +} + + +HRESULT WINAPI MsmpiLaunchService::ServiceCleanupLaunchCtx(_In_ const void* launchCtx) +{ + LaunchContext* pCtx = + Launcher().m_contextPool.FindContext(IsMatchCtxHandle, launchCtx); + + if (pCtx == nullptr) + { + return E_HANDLE; + } + + if (pCtx->m_mgrProcess != 0) + { + // + // There is a process started with it, so leave cleanup to process termination. + // + return S_OK; + } + + Launcher().m_contextPool.DestroyContext(pCtx); + + gEventLogger.WriteEvent( + EVENTLOG_INFORMATION_TYPE, + 1, + 100, + L"Cleaned up launch context 0x%p", + pCtx); + + return S_OK; +} + + +HRESULT MsmpiLaunchService::DoLogonUser( + _In_ PCWSTR pPwd, + _In_ BOOL saveCreds, + _Outptr_ PHANDLE pLogonHandle + ) +{ + DWORD cbValue = MAX_PATH; + LPWSTR pValue = nullptr; + DATA_BLOB credsEncrypted = { 0, nullptr }; + DATA_BLOB credsDecrypted = { 0, nullptr }; + WCHAR user[MAX_PATH] = { 0 }; + WCHAR domain[MAX_PATH] = { 0 }; + DWORD cchUser = _countof(user); + DWORD cchDomain = _countof(domain); + DWORD cbPwd = 0; + BYTE* pFree = nullptr; + BOOL usingCachedPwd = FALSE; + BOOL pwdRequested = FALSE; + + HRESULT result = SecurityUtils::GetCurrentUser(user, &cchUser, domain, &cchDomain); + if (FAILED(result)) + { + goto exit_fn; + } + + if (pPwd == nullptr || pPwd[0] == L'\0') + { + // + // User did not provide a pwd, check if it is cached in the system + // + usingCachedPwd = TRUE; + + result = HRESULT_FROM_WIN32(ERROR_MORE_DATA); + while (result == HRESULT_FROM_WIN32(ERROR_MORE_DATA)) + { + free(pValue); + pValue = static_cast(malloc(cbValue * sizeof (wchar_t))); + if (pValue == nullptr) + { + result = E_OUTOFMEMORY; + goto exit_fn; + } + + result = RegistryUtils::ReadCurrentUserKey( + MSPMI_MODULE_PATH_KEY, + MSPMI_CREDENTIAL_VALUE, + &cbValue, + pValue + ); + } + + if (FAILED(result)) + { + // + // If pwd is not cached before, result is ERROR_FILE_NOT_FOUND + // + pwdRequested = (result == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)); + goto exit_fn; + } + + credsEncrypted.cbData = cbValue; + credsEncrypted.pbData = reinterpret_cast(pValue); + + if (!CryptUnprotectData(&credsEncrypted, nullptr, nullptr, nullptr, nullptr, 0, &credsDecrypted)) + { + // + // If pwd was reset after previous encryption, result is ERROR_INVALID_PASSWORD + // + result = HRESULT_FROM_WIN32(GetLastError()); + pwdRequested = (GetLastError() == ERROR_INVALID_PASSWORD); + goto exit_fn; + } + + pPwd = reinterpret_cast(credsDecrypted.pbData); + cbPwd = credsDecrypted.cbData; + pFree = credsDecrypted.pbData; + } + + if (!LogonUserW( + user, + domain, + pPwd, + LOGON32_LOGON_INTERACTIVE, + LOGON32_PROVIDER_DEFAULT, + pLogonHandle + )) + { + // + // If pwd is not correct, result is ERROR_LOGON_FAILURE. + // If cached pwd is used, this means user changed the pwd after it was cached, + // we need to request the new pwd. + // Otherwise, it means user input a wrong pwd. + // + result = HRESULT_FROM_WIN32(GetLastError()); + pwdRequested = usingCachedPwd && (GetLastError() == ERROR_LOGON_FAILURE); + goto exit_fn; + } + + if (saveCreds && !usingCachedPwd) + { + cbPwd = static_cast((wcslen(pPwd) + 1) * sizeof(wchar_t)); + + credsDecrypted.pbData = const_cast( + reinterpret_cast(pPwd)); + credsDecrypted.cbData = cbPwd; + + if (!CryptProtectData( + &credsDecrypted, + nullptr, + nullptr, + nullptr, + nullptr, + CRYPTPROTECT_LOCAL_MACHINE, + &credsEncrypted)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto exit_fn; + } + pFree = credsEncrypted.pbData; + + result = RegistryUtils::WriteCurrentUserKey( + MSPMI_MODULE_PATH_KEY, + MSPMI_CREDENTIAL_VALUE, + credsEncrypted.cbData, + reinterpret_cast(credsEncrypted.pbData) + ); + + if (FAILED(result)) + { + goto exit_fn; + } + } + +exit_fn: + if (usingCachedPwd) + { + SecureZeroMemory(pFree, cbPwd); + } + LocalFree(pFree); + free(pValue); + if (pwdRequested) + { + result = NTE_UI_REQUIRED; + } + return result; +} diff --git a/src/launchSvc/MsmpiLaunchSvc.h b/src/launchSvc/MsmpiLaunchSvc.h new file mode 100644 index 0000000..c103f50 --- /dev/null +++ b/src/launchSvc/MsmpiLaunchSvc.h @@ -0,0 +1,186 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +#include +#include +#include "SvcUtils.h" +#include "mspms.h" +#include "launchSvcMsg.h" + + +// +// MSMPI PMI settings +// +#define MSPMI_MODULE_PATH_KEY L"Software\\Microsoft\\MPI" +#define MSPMI_PROVIDER_VALUE L"MSPMSProvider" +#define MSPMI_PROC_GET_PMI "MSMPI_Get_pm_interface" +#define MSPMI_PROC_PMI_QUERY_IF "MSMPI_pm_query_interface" +#define MSPMI_CREDENTIAL_VALUE L"MSMPI_Credentials" +#define DEFAULT_SERVICE_PORT 8677 +#define MAXIMUM_CONTEXTS (MAXIMUM_WAIT_OBJECTS - 1) +#define SHUTDOWN_TIMEOUT 60000 +#define NEW_PROCESS_EVENT_IDX 0 + + +/*--------------------------------------------------------------------------*/ +/* LaunchContext */ +/*--------------------------------------------------------------------------*/ + +// +// Holds information that is related to a launch context, between start and +// end of launch context calls from PMI +// +class LaunchContext +{ +public: + const void* m_pmiHandle; + HANDLE m_parentThread; + HANDLE m_primaryToken; + + HANDLE m_mgrProcess; + HANDLE m_userToken; + HANDLE m_userProfile; + + LaunchContext(); + ~LaunchContext(); + + void Dispose(); +}; + + +/*--------------------------------------------------------------------------*/ +/* ContextPool */ +/*--------------------------------------------------------------------------*/ + +// +// Thread-safe collection of active launch contexts +// +class ContextPool +{ +private: + LaunchContext m_contexts[MAXIMUM_CONTEXTS]; + DWORD m_activeIndices[MAXIMUM_CONTEXTS]; + UINT m_activeContextCount; + SRWLOCK m_lock; + +public: + template + using IsMatch = BOOL(*)(_In_ const LaunchContext* pCtx, _In_ const T* pData); + + ContextPool(); + + ~ContextPool(); + + LaunchContext* CreateNewContext(); + + BOOL DestroyContext(_In_ LaunchContext* pDeleteContext); + + template + LaunchContext* + FindContext( + _In_ IsMatch compareFunct, + _In_ const T* pData + ); +}; + + +/*--------------------------------------------------------------------------*/ +/* ProcessQueue */ +/*--------------------------------------------------------------------------*/ +class ProcessQueue +{ +private: + HANDLE m_runningProcesses[MAXIMUM_WAIT_OBJECTS]; + HANDLE m_newProcessEvent; + volatile DWORD m_count; + HANDLE m_thread; + volatile BOOL m_run; + CRITICAL_SECTION m_lock; + + static DWORD WINAPI WaitProcesses(_In_ LPVOID pData); + + DWORD GetCountSafe(); + + HANDLE DeleteProcess(_In_ DWORD idx); + +public: + ProcessQueue(); + + ~ProcessQueue(); + + HRESULT Initialize(); + + HRESULT AddProcess(_In_ HANDLE newProcess); + + HRESULT Start(); + + HRESULT Stop(); +}; + + +/*--------------------------------------------------------------------------*/ +/* MsmpiLaunchService */ +/*--------------------------------------------------------------------------*/ + +class MsmpiLaunchService +{ + typedef + HRESULT + (WINAPI *PFN_MSMPI_GET_PM_INTERFACE)( + _In_ REFGUID RequestedVersion, + _Inout_ PmiServiceInterface* Interface + ); + + typedef + HRESULT + (WINAPI *PFN_MSMPI_PM_QUERY_INTERFACE)( + _In_ REFGUID RequestedVersion, + _Inout_ void** Interface + ); + +private: + HMODULE m_pmiModule; + PmiServiceInterface m_pmiService; + PmiServiceLaunchInterface* m_pMspmiServiceLaunch; + USHORT m_servicePort; + PSID m_pMemberGroupSid; + ContextPool m_contextPool; + ProcessQueue m_mgrQueue; + +public: + MsmpiLaunchService(); + ~MsmpiLaunchService(); + HRESULT Load(); + BOOL ParseOptions(_In_ DWORD argc, _In_ LPWSTR *argv); + HRESULT Run(); + VOID Stop(); + VOID ManagerProcessTerminated(_In_ HANDLE mgrProcess); + + static HRESULT + WINAPI ServiceCreateManagerProcess( + _In_z_ PCSTR app, + _In_z_ PCSTR args, + _In_z_ PCSTR context + ); + + static HRESULT + WINAPI ServiceCreateLaunchCtx( + _In_ HANDLE clientToken, + _In_ const void* launchCtx, + _In_z_ const char* jobCtx + ); + + static HRESULT WINAPI ServiceStartLaunchCtx(_In_ const void* launchCtx); + static HRESULT WINAPI ServiceCleanupLaunchCtx(_In_ const void* launchCtx); + +private: + + HRESULT + DoLogonUser( + _In_ LPCWSTR pPwd, + _In_ BOOL saveCreds, + _Outptr_ PHANDLE pLogonHandle + ); +}; diff --git a/src/launchSvc/launchSvcMsg.mc b/src/launchSvc/launchSvcMsg.mc new file mode 100644 index 0000000..b378150 --- /dev/null +++ b/src/launchSvc/launchSvcMsg.mc @@ -0,0 +1,84 @@ +; +; // Launch Service Message Texts +; + + +; +; // Header +; + +SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS + Informational=0x1:STATUS_SEVERITY_INFORMATIONAL + Warning=0x2:STATUS_SEVERITY_WARNING + Error=0x3:STATUS_SEVERITY_ERROR + ) + + +FacilityNames=(System=0x0:FACILITY_SYSTEM + Runtime=0x2:FACILITY_RUNTIME + Stubs=0x3:FACILITY_STUBS + Io=0x4:FACILITY_IO_ERROR_CODE + ) + +LanguageNames=(English=0x409:MSG00409) + + +; +; // Event Categories +; + +MessageIdTypedef=WORD + +MessageId=0x1 +SymbolicName=SVC_CATEGORY +Language=English +MsMpi Launch Service Events +. + +MessageId=0x2 +SymbolicName=CLIENT_CATEGORY +Language=English +MsMpi Launch Service Client Events +. + + +; +; // Message Definitions +; + +MessageIdTypedef=DWORD + +MessageId=0x1 +Severity=Success +Facility=Runtime +SymbolicName=SERVICE_EVENT +Language=English +%1 +. + +MessageId=0x100 +Severity=Success +Facility=Runtime +SymbolicName=SERVICE_STARTED +Language=English +MsMpi Launch Service started succesfully. +. + + +MessageId=0x101 +Severity=Informational +Facility=Runtime +SymbolicName=SERVICE_STATE_CHANGE +Language=English +MsMpi Launch Service state change from %1 to %2. +. + + +MessageId=0x102 +Severity=Error +Facility=System +;// !!!!!!!!!!!!!!! +SymbolicName=MSG_BAD_FILE_CONTENTS +Language=English +File %1 contains content that is not valid. +. diff --git a/src/launchSvc/launchsvc.rc b/src/launchSvc/launchsvc.rc new file mode 100644 index 0000000..75668d6 --- /dev/null +++ b/src/launchSvc/launchsvc.rc @@ -0,0 +1,11 @@ +#include +#include + +#define VER_FILETYPE VFT_APP +#define VER_FILESUBTYPE VFT2_UNKNOWN +#define VER_FILEDESCRIPTION_STR "Microsoft MPI Launch Service" +#define VER_INTERNALNAME_STR "msmpilaunchsvc" +#define VER_ORIGINALFILENAME_STR "msmpilaunchsvc.exe" + +#include "common.ver" +#include "launchsvcmsg.rc" \ No newline at end of file diff --git a/src/launchSvc/msmpiLaunchSvc.vcxproj b/src/launchSvc/msmpiLaunchSvc.vcxproj new file mode 100644 index 0000000..60aa776 --- /dev/null +++ b/src/launchSvc/msmpiLaunchSvc.vcxproj @@ -0,0 +1,68 @@ + + + + + + + msmpiLaunchSvc + {03cfde58-e72e-41d7-85ed-43150db0ca44} + + + + Microsoft MPI Launch Service + + + + false + Application + + + + + + + ProgramDatabase + + %(AdditionalIncludeDirectories); + $(SrcRoot)\mpi\msmpi\include; + $(SrcRoot)\mpi\common; + .\$(O); + + + + + + Console + mainCRTStartup + + %(AdditionalDependencies); + $(PUBLIC_SDK_LIB)\kernel32.lib; + $(PUBLIC_SDK_LIB)\crypt32.lib; + $(PUBLIC_SDK_LIB)\advapi32.lib; + $(PUBLIC_SDK_LIB)\userenv.lib; + $(CRT_Libs); + + + + + + + + + + + + + + + + + + + + $(MPI_BIN_DESTINATION) + *.exe + + + + diff --git a/src/launchSvc/msmpiLaunchSvcMc.vcxproj b/src/launchSvc/msmpiLaunchSvcMc.vcxproj new file mode 100644 index 0000000..2a6952b --- /dev/null +++ b/src/launchSvc/msmpiLaunchSvcMc.vcxproj @@ -0,0 +1,26 @@ + + + + {8E3235C8-9024-4915-BFA6-8F79FFAEC14A} + + + + + Microsoft MPI Launch Service + + + None + false + WindowsUserModeDriver10.0 + + + + + true + $(SrcRoot)\launchsvc\$(O) + true + $(SrcRoot)\launchsvc\$(O) + + + + \ No newline at end of file diff --git a/src/mpi.props b/src/mpi.props new file mode 100644 index 0000000..de2ff8e --- /dev/null +++ b/src/mpi.props @@ -0,0 +1,168 @@ + + + + + + + + 10 + 0 + 12498 + 5 + + <_MSMPI_VER_>$([MSBuild]::BitwiseOr(`$([MSBuild]::Multiply(`$(ProductMajorVersion)`, `256`))`, `$([MSBuild]::BitwiseAnd(`$(ProductMinorVersion)`, `255`))`)) + <_MSMPI_VER_EX_>$([MSBuild]::BitwiseOr(`$([MSBuild]::Multiply(`$(_MSMPI_VER_)`, `65536`))`, `$([MSBuild]::BitwiseAnd(`$(BuildMinorVersion)`, `65535`))`)) + <_MSMPI_BUILDNUM_>$(BuildMajorVersion) + <_MSMPI_FILEREV_>$(BuildMinorVersion) + + + + + + + + + %(PreprocessorDefinitions); + MSMPI_VER=$(_MSMPI_VER_); + MSMPI_VER_EX=$(_MSMPI_VER_EX_); + _BLDVERMAJOR=$(ProductMajorVersion); + _BLDVERMINOR=$(ProductMinorVersion); + _BLDNUMMAJOR=$(BuildMajorVersion); + _BLDNUMMINOR=$(BuildMinorVersion); + + + + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + libucrtd.lib;libcmtd.lib;libvcruntimed.lib + + + libucrt.lib;libcmt.lib;libvcruntime.lib + + + + + _WIN64=1;_AMD64_=1;AMD64=1;%(PreprocessorDefinitions) + %(AdditionalOptions) /favor:AMD64 + + + + + + _X86_=1;i386=1;%(PreprocessorDefinitions) + + + + + + Disabled + DBG=1;%(PreprocessorDefinitions) + + + + + + Full + true + NDEBUG=1;%(PreprocessorDefinitions) + Guard + + + + + + + %(PreprocessorDefinitions); + _WIN32_WINNT=_WIN32_WINNT_WIN10; + + + %(AdditionalIncludeDirectories); + + + + + + + false + true + MultiThreaded + true + true + true + true + true + false + 8Bytes + OldStyle + false + + 4986;4987;4471;4369;4309;4603;4627; + 28251;28252;28253; + %(DisableSpecificWarnings) + + Strict + stdcall + + warning.h; + $(MPI_INC_ROOT)\mpiwarning.h + + + %(AdditionalIncludeDirectories); + $(MPI_INC_PATH); + $(MPI_SRC_ROOT)\common + + + %(PreprocessorDefinitions); + _WINSOCK_DEPRECATED_NO_WARNINGS; + VER_USE_OTHER_MAJOR_MINOR_VER; + HAVE_DEBUGGER_SUPPORT=1; + HAVE_FORTRAN_BINDING=1; + USE_HUMAN_READABLE_TOKENS=1; + _USE_DECLSPECS_FOR_SAL=1; + WIN32_LEAN_AND_MEAN=1; + CONDITION_HANDLING=1; + _CRT_SECURE_NO_WARNINGS=1; + + + %(PreprocessorDefinitions); + _MPICH_DLL_=1; + + + + true + UseLinkTimeCodeGeneration + + + + \ No newline at end of file diff --git a/src/mpi/common/MpiLock.cpp b/src/mpi/common/MpiLock.cpp new file mode 100644 index 0000000..ec7524e --- /dev/null +++ b/src/mpi/common/MpiLock.cpp @@ -0,0 +1,270 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "MpiLock.h" +// +// This file defines function pointers to the core Win32 lock functions +// that are used by the MSMPI stack. We store these as function pointers +// so that we can replace them with "NOP" functions when we run in single +// threaded mode. +// + + + +// +// Prototype functions for the platform locking functions we wrap. +// + +typedef void WINAPI +FN_InitializeCriticalSection( + _Out_ LPCRITICAL_SECTION lpCriticalSection + ); + +typedef void WINAPI +FN_DeleteCriticalSection( + _Inout_ LPCRITICAL_SECTION lpCriticalSection + ); + +typedef void WINAPI +FN_EnterCriticalSection( + _Inout_ LPCRITICAL_SECTION CriticalSection + ); + +typedef void WINAPI +FN_LeaveCriticalSection( + _Inout_ LPCRITICAL_SECTION CriticalSection + ); + +typedef VOID WINAPI +FN_InitializeSRWLock( + _Out_ PSRWLOCK SRWLock + ); + +typedef VOID WINAPI +FN_AcquireSRWLockExclusive( + _Inout_ PSRWLOCK SRWLock + ); + +typedef VOID WINAPI +FN_AcquireSRWLockShared( + _Inout_ PSRWLOCK SRWLock + ); + +typedef VOID WINAPI +FN_ReleaseSRWLockExclusive( + _Inout_ PSRWLOCK SRWLock + ); + +typedef VOID WINAPI +FN_ReleaseSRWLockShared( + _Inout_ PSRWLOCK SRWLock + ); + + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Summary: +// Empty lock function for SingleThread mode +// +static void WINAPI +MpiLockNoThread( + _Inout_ LPCRITICAL_SECTION + ) +{ +} + + +// +// Summary: +// Empty read/writer lock function for SingleThread mode +// +static VOID WINAPI +MpiRwLockNoThread( + _Inout_ PSRWLOCK + ) +{ +} + + +// +// Global list of all Locking functions MPI will use in +// both ST and MT scenarios (IE, Shared code paths). +// +static struct _MpiLockFunctions +{ + + FN_InitializeCriticalSection* LockInitialize; + FN_DeleteCriticalSection* LockDelete; + FN_EnterCriticalSection* LockEnter; + FN_LeaveCriticalSection* LockLeave; + + + FN_InitializeSRWLock* RwLockInitialize; + FN_AcquireSRWLockExclusive* RwLockAcquireExclusive; + FN_ReleaseSRWLockExclusive* RwLockReleaseExclusive; + + FN_AcquireSRWLockShared* RwLockAcquireShared; + FN_ReleaseSRWLockShared* RwLockReleaseShared; + +} MpiLockFunctions = +// +// NOTE: We set the default locking behavior to be ON +// this means that all locks function as expected by default +// and can be disabled with a call to MpiLockInitializeSingleThreadMode +// +{ + InitializeCriticalSection, + DeleteCriticalSection, + EnterCriticalSection, + LeaveCriticalSection, + InitializeSRWLock, + AcquireSRWLockExclusive, + ReleaseSRWLockExclusive, + AcquireSRWLockShared, + ReleaseSRWLockShared +}; + + +// +// Summary: +// Initialize the local process to skip all locking functions. +// +VOID +MpiLockInitializeSingleThreadMode() +{ + MpiLockFunctions.LockInitialize = MpiLockNoThread; + MpiLockFunctions.LockDelete = MpiLockNoThread; + MpiLockFunctions.LockEnter = MpiLockNoThread; + MpiLockFunctions.LockLeave = MpiLockNoThread; + MpiLockFunctions.RwLockInitialize = MpiRwLockNoThread; + MpiLockFunctions.RwLockAcquireExclusive = MpiRwLockNoThread; + MpiLockFunctions.RwLockReleaseExclusive = MpiRwLockNoThread; + MpiLockFunctions.RwLockAcquireShared = MpiRwLockNoThread; + MpiLockFunctions.RwLockReleaseShared = MpiRwLockNoThread; +} + + +// +// Summary: +// Initializes a MPI_LOCK (CRITICAL_SECTION) +// +VOID +MpiLockInitialize( + _Out_ MPI_LOCK* Lock + ) +{ + MpiLockFunctions.LockInitialize(Lock); +} + + +// +// Summary: +// Deletes a MPI_LOCK (CRITICAL_SECTION) +// +VOID +MpiLockDelete( + _Inout_ MPI_LOCK* Lock + ) +{ + MpiLockFunctions.LockDelete(Lock); +} + + +// +// Summary: +// Enters a MPI_LOCK (CRITICAL_SECTION) +// +VOID +MpiLockEnter( + _Inout_ MPI_LOCK* Lock + ) +{ + MpiLockFunctions.LockEnter(Lock); +} + + +// +// Summary: +// Leaves a MPI_LOCK (CRITICAL_SECTION) +// +VOID +MpiLockLeave( + _Inout_ MPI_LOCK* Lock + ) +{ + MpiLockFunctions.LockLeave(Lock); +} + + +// +// Summary: +// Initialize a MPI_RWLOCK (SRWLOCK) +// +VOID +MpiRwLockInitialize( + _Out_ MPI_RWLOCK* RwLock + ) +{ + MpiLockFunctions.RwLockInitialize(RwLock); +} + + +// +// Summary: +// Acquire Exclusive access for a MPI_RWLOCK (SRWLOCK) +// +VOID +MpiRwLockAcquireExclusive( + _Inout_ MPI_RWLOCK* RwLock + ) +{ + MpiLockFunctions.RwLockAcquireExclusive(RwLock); +} + + +// +// Summary: +// Release Exclusive access for a MPI_RWLOCK (SRWLOCK) +// +VOID +MpiRwLockReleaseExclusive( + _Inout_ MPI_RWLOCK* RwLock + ) +{ + MpiLockFunctions.RwLockReleaseExclusive(RwLock); +} + + +// +// Summary: +// Acquire Shared access for a MPI_RWLOCK (SRWLOCK) +// +VOID +MpiRwLockAcquireShared( + _Inout_ MPI_RWLOCK* RwLock + ) +{ + MpiLockFunctions.RwLockAcquireShared(RwLock); +} + + +// +// Summary: +// Release Shared access for a MPI_RWLOCK (SRWLOCK) +// +VOID +MpiRwLockReleaseShared( + _Inout_ MPI_RWLOCK* RwLock + ) +{ + MpiLockFunctions.RwLockReleaseShared(RwLock); +} + + +#ifdef __cplusplus +} //extern "C" { +#endif diff --git a/src/mpi/common/MpiLock.h b/src/mpi/common/MpiLock.h new file mode 100644 index 0000000..7a1c39d --- /dev/null +++ b/src/mpi/common/MpiLock.h @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +typedef SRWLOCK MPI_RWLOCK; +typedef CRITICAL_SECTION MPI_LOCK; + +#ifdef __cplusplus +extern "C" { +#endif + +VOID +MpiLockInitializeSingleThreadMode(); + +VOID +MpiLockInitialize( + _Out_ MPI_LOCK* Lock + ); + +VOID +MpiLockDelete( + _Inout_ MPI_LOCK* Lock + ); + +VOID +MpiLockEnter( + _Inout_ MPI_LOCK* Lock + ); + +VOID +MpiLockLeave( + _Inout_ MPI_LOCK* Lock + ); + +#define MPI_RWLOCK_INIT SRWLOCK_INIT + +VOID +MpiRwLockInitialize( + _Out_ MPI_RWLOCK* RwLock + ); + +VOID +MpiRwLockAcquireExclusive( + _Inout_ MPI_RWLOCK* RwLock + ); + +VOID +MpiRwLockReleaseExclusive( + _Inout_ MPI_RWLOCK* RwLock + ); + +VOID +MpiRwLockAcquireShared( + _Inout_ MPI_RWLOCK* RwLock + ); + +VOID +MpiRwLockReleaseShared( + _Inout_ MPI_RWLOCK* RwLock + ); + + +#ifdef __cplusplus +} //extern "C" { +#endif \ No newline at end of file diff --git a/src/mpi/common/SvcUtils.cpp b/src/mpi/common/SvcUtils.cpp new file mode 100644 index 0000000..dc518c9 --- /dev/null +++ b/src/mpi/common/SvcUtils.cpp @@ -0,0 +1,546 @@ +/* +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the MIT License. +* +* This file includes definitions of utility functions: +* Windows Event Logger Utilities +* Registry Utilities +* Security Utilities +*/ + +#include "precomp.h" +#include "SvcUtils.h" + +/*---------------------------------------------------------------------------*/ +/* Windows Event Logger Utility Class */ +/*---------------------------------------------------------------------------*/ + +EventLogger::EventLogger() + : m_eventLog(nullptr) +{ +} + + +EventLogger::~EventLogger() +{ + DeregisterEventSource(m_eventLog); +} + + +BOOL EventLogger::Open(_In_z_ PCWSTR pEventSource) +{ + m_eventLog = RegisterEventSourceW(nullptr, pEventSource); + if (m_eventLog == nullptr) + { + wprintf( + L"Cannot register event source %s with error 0x%x\n", + pEventSource, + GetLastError() + ); + + return FALSE; + } + + return TRUE; +} + + +// +// Writes formatted sting to event log. +// +void +EventLogger::WriteEvent( + _In_ WORD type, + _In_ WORD category, + _In_ DWORD eventId, + _Printf_format_string_ LPCWSTR pFormatStr, + ... + ) +{ + WCHAR buffer[MAX_LOG_TEXT]; + va_list args; + + va_start(args, pFormatStr); + + HRESULT hr = StringCchVPrintfW(buffer, _countof(buffer), pFormatStr, args); + + va_end(args); + + LPCWSTR eventStr = buffer; + + if(hr != S_OK && hr != STRSAFE_E_INSUFFICIENT_BUFFER) + { + // + // STRSAFE_E_INSUFFICIENT_BUFFER is acceptable since truncated messages + // are good enough. + // + eventStr = L"Failed to form event message."; + } + + ReportEventW( + m_eventLog, + type, + category, + eventId, + nullptr, + 1, + 0, + &eventStr, + nullptr + ); +} + + +/*---------------------------------------------------------------------------*/ +/* Registry Access Utility Class */ +/*---------------------------------------------------------------------------*/ + +HRESULT +RegistryUtils::ReadKey( + _In_ HKEY key, + _In_opt_z_ LPCWSTR pSubKey, + _In_z_ LPCWSTR pValueName, + _Inout_ LPDWORD pcbValue, + _Out_ LPWSTR pValue + ) +{ + HKEY readKey; + + LONG result = RegOpenKeyExW(key, pSubKey, 0, KEY_READ, &readKey); + + if( result != ERROR_SUCCESS ) + { + return HRESULT_FROM_WIN32( result ); + } + + result = RegGetValueW( + readKey, + nullptr, + pValueName, + RRF_RT_REG_SZ, + nullptr, + pValue, + pcbValue + ); + + RegCloseKey(readKey); + + return HRESULT_FROM_WIN32( result ); +} + + +// +// Reads a key in HKEY_CURRENT_USER for the user the current thread is impersonating. +// +HRESULT +RegistryUtils::ReadCurrentUserKey( + _In_opt_z_ LPCWSTR pSubKey, + _In_z_ LPCWSTR pValueName, + _Inout_ LPDWORD pCapValue, + _Out_writes_z_(*pCapValue) LPWSTR pValue +) +{ + HKEY currentUser = nullptr; + LONG result = RegOpenCurrentUser(KEY_READ, ¤tUser); + if (result != ERROR_SUCCESS) + { + return HRESULT_FROM_WIN32(result); + } + + result = RegGetValueW( + currentUser, + pSubKey, + pValueName, + RRF_RT_REG_SZ, + nullptr, + pValue, + pCapValue + ); + + RegCloseKey(currentUser); + return HRESULT_FROM_WIN32(result); +} + + +// +// Writes to a key in HKEY_CURRENT_USER for the user the current thread is impersonating. +// Creates the key if it does not exist. +// +HRESULT +RegistryUtils::WriteCurrentUserKey( + _In_opt_z_ LPCWSTR pSubKey, + _In_ LPCWSTR pValueName, + _In_ DWORD capValue, + _In_ LPCWSTR pValue +) +{ + HKEY currentUser = nullptr; + HKEY hWrite = nullptr; + LONG result = ERROR_SUCCESS; + DWORD disposition; + + result = RegOpenCurrentUser(KEY_WRITE, ¤tUser); + if (result != ERROR_SUCCESS) + { + goto exit_fn; + } + + // + // Opens or creates registry key. + // + result = RegCreateKeyExW( + currentUser, + pSubKey, + 0, + nullptr, + 0, + KEY_WRITE, + nullptr, + &hWrite, + &disposition + ); + + if (result != ERROR_SUCCESS) + { + goto exit_fn; + } + + result = RegSetValueExW( + hWrite, + pValueName, + 0, + RRF_RT_REG_SZ, + reinterpret_cast(pValue), + capValue + ); + +exit_fn: + RegCloseKey(currentUser); + RegCloseKey(hWrite); + return HRESULT_FROM_WIN32(result); +} + + +/*---------------------------------------------------------------------------*/ +/* Security Access Utility Class */ +/*---------------------------------------------------------------------------*/ + +// +// Creates a primary token that duplicates the access token of the calling thread. +// Caller must CloseHandle when it is no longer needed. +// +HRESULT SecurityUtils::GetCurrentThreadPrimaryToken(_Out_ PHANDLE pPrimaryToken) +{ + HANDLE token; + HRESULT result = NO_ERROR; + + if (!OpenThreadToken( + GetCurrentThread(), + TOKEN_ALL_ACCESS, + TRUE, + &token) + ) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + if (!DuplicateTokenEx( + token, + TOKEN_ALL_ACCESS, + nullptr, + SecurityImpersonation, + TokenPrimary, + pPrimaryToken) + ) + { + result = HRESULT_FROM_WIN32(GetLastError()); + } + + CloseHandle(token); + return result; +} + + +// +// Checks if given token is a member of the well known group. +// +HRESULT +SecurityUtils::IsGroupMember( + _In_ WELL_KNOWN_SID_TYPE wellKnownSidType, + _In_ HANDLE token, + _Out_ PBOOL pIsMember + ) +{ + SID* pGroupSid = nullptr; + DWORD cbSid = 0; + HRESULT result = NO_ERROR; + + *pIsMember = FALSE; + + // + // Get the size of group sid + // + if (!CreateWellKnownSid(wellKnownSidType, nullptr, pGroupSid, &cbSid)) + { + DWORD gle = GetLastError(); + if (gle != ERROR_INSUFFICIENT_BUFFER) + { + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + } + + // + // Allocate necessary memory for group sid and create it + // + pGroupSid = static_cast(malloc(cbSid)); + if (pGroupSid == nullptr) + { + result = ERROR_OUTOFMEMORY; + goto exit_fn; + } + + if (!CreateWellKnownSid(wellKnownSidType, nullptr, pGroupSid, &cbSid)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto exit_fn; + } + + // + // Check token membership + // + if (!CheckTokenMembership(token, pGroupSid, pIsMember)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto exit_fn; + } + +exit_fn: + free(pGroupSid); + return result; +} + + +HRESULT +SecurityUtils::IsCurrentProcessInteractive( + _Out_ PBOOL pIsInteractive +) +{ + if (pIsInteractive == nullptr) + { + return E_INVALIDARG; + } + + // + // nullptr token makes API use an impersonation token of the calling thread + // + return IsGroupMember(WinInteractiveSid, nullptr, pIsInteractive); +} + + +// +// Gets the user name and domain for given token. +// +HRESULT +SecurityUtils::GetTokenUser( + _In_ HANDLE token, + _Out_opt_ LPWSTR pUser, + _Inout_ LPDWORD pcchUser, + _Out_opt_ LPWSTR pDomain, + _Inout_ LPDWORD pcchDomain + ) +{ + PTOKEN_USER pTokenUser = nullptr; + DWORD cbTokenUser = 0; + HRESULT result = S_OK; + SID_NAME_USE snu; + + while (!GetTokenInformation( + token, + TokenUser, + pTokenUser, + cbTokenUser, + &cbTokenUser) + ) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto exit_fn; + } + + free(pTokenUser); + pTokenUser = static_cast(malloc(cbTokenUser)); + if (pTokenUser == nullptr) + { + result = E_OUTOFMEMORY; + goto exit_fn; + } + } + + Assert(pTokenUser != nullptr); + + if (!LookupAccountSidW( + nullptr, + pTokenUser->User.Sid, + pUser, + pcchUser, + pDomain, + pcchDomain, + &snu)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + } + +exit_fn: + free(pTokenUser); + return result; +} + + +// +// Gets the user name and domain of the current user. +// +HRESULT +SecurityUtils::GetCurrentUser( + _Out_opt_ LPWSTR pUser, + _Inout_ LPDWORD pcchUser, + _Out_opt_ LPWSTR pDomain, + _Inout_ LPDWORD pcchDomain + ) +{ + HANDLE currentToken = nullptr; + HRESULT result; + + if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, ¤tToken)) + { + DWORD gle = GetLastError(); + if (gle != ERROR_NO_TOKEN) + { + result = HRESULT_FROM_WIN32(gle); + goto exit_fn; + } + + // + // If current thread does not have a token, use process token + // + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, ¤tToken)) + { + result = HRESULT_FROM_WIN32(GetLastError()); + goto exit_fn; + } + } + + result = GetTokenUser(currentToken, pUser, pcchUser, pDomain, pcchDomain); + +exit_fn: + CloseHandle(currentToken); + return result; +} + + +HRESULT +SecurityUtils::GrantPrivilege( + _In_ HANDLE hToken, + _In_ LPCTSTR privilege, + _In_ BOOL enable +) +{ + TOKEN_PRIVILEGES adjustedPrivs; + LUID luid; + + if (!LookupPrivilegeValue( + nullptr, + privilege, + &luid)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + adjustedPrivs.PrivilegeCount = 1; + adjustedPrivs.Privileges[0].Luid = luid; + adjustedPrivs.Privileges[0].Attributes = (enable ? SE_PRIVILEGE_ENABLED : 0); + + AdjustTokenPrivileges( + hToken, + FALSE, + &adjustedPrivs, + 0, + nullptr, + nullptr); + + return HRESULT_FROM_WIN32(GetLastError()); +} + + +// +// Get the SID for a given account/group name. +// Caller is responsible for invoking free(*ppSid). +// +HRESULT +SecurityUtils::GetSidForAccount( + _In_opt_z_ LPCWSTR pSystemName, + _In_ LPCWSTR pAccountName, + _Outptr_ PSID* ppSid +) +{ + PSID pSid = nullptr; + LPWSTR pRefDomain = nullptr; + DWORD cbRefDomain = 0; + DWORD cbSid = 0; + SID_NAME_USE eUse; + + if (LookupAccountNameW( + pSystemName, + pAccountName, + 0, + &cbSid, + 0, + &cbRefDomain, + &eUse)) + { + return HRESULT_FROM_WIN32(ERROR_NONE_MAPPED); + } + + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + if (cbSid != 0) + { + pSid = static_cast(malloc(cbSid)); + if (pSid == nullptr) + { + return E_OUTOFMEMORY; + } + } + + if (cbRefDomain != 0) + { + pRefDomain = static_cast(malloc(cbRefDomain * sizeof(wchar_t))); + if (pRefDomain == nullptr) + { + free(pSid); + return E_OUTOFMEMORY; + } + } + + if (!LookupAccountNameW( + pSystemName, + pAccountName, + pSid, + &cbSid, + pRefDomain, + &cbRefDomain, + &eUse)) + { + free(pRefDomain); + free(pSid); + return HRESULT_FROM_WIN32(GetLastError()); + } + + free(pRefDomain); + *ppSid = pSid; + return S_OK; +} diff --git a/src/mpi/common/SvcUtils.h b/src/mpi/common/SvcUtils.h new file mode 100644 index 0000000..a4182d4 --- /dev/null +++ b/src/mpi/common/SvcUtils.h @@ -0,0 +1,133 @@ +/* +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the MIT License. +* +* This file includes declarations of utility classes: +* Windows Event Logger Utilities +* Registry Utilities +* Security Utilities +*/ + +#pragma once + +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------------*/ +/* Windows Event Logger Utility Class */ +/*---------------------------------------------------------------------------*/ + +#define MAX_LOG_TEXT 1024 + +class EventLogger +{ +private: + HANDLE m_eventLog; + +public: + EventLogger(); + + BOOL Open(_In_z_ PCWSTR pEventSource); + + void + WriteEvent( + _In_ WORD type, + _In_ WORD category, + _In_ DWORD eventId, + _Printf_format_string_ PCWSTR pFormatStr, + ... + ); + + ~EventLogger(); +}; + + +/*---------------------------------------------------------------------------*/ +/* Registry Access Utility Class */ +/*---------------------------------------------------------------------------*/ + +class RegistryUtils +{ +public: + static HRESULT + ReadKey( + _In_ HKEY key, + _In_opt_z_ LPCWSTR pSubKey, + _In_z_ LPCWSTR pValueName, + _Inout_ LPDWORD pcbValue, + _Out_ LPWSTR pValue + ); + + static HRESULT + ReadCurrentUserKey( + _In_opt_z_ LPCWSTR pSubKey, + _In_z_ LPCWSTR pValueName, + _Inout_ LPDWORD pcbValue, + _Out_writes_z_(*pcbValue) LPWSTR pValue + ); + + static HRESULT + WriteCurrentUserKey( + _In_opt_z_ LPCWSTR pSubKey, + _In_z_ LPCWSTR pValueName, + _In_ DWORD cbValue, + _In_z_ LPCWSTR pValue + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Security Access Utility Class */ +/*---------------------------------------------------------------------------*/ + +class SecurityUtils +{ +public: + static HRESULT GetCurrentThreadPrimaryToken(_Out_ PHANDLE pPrimaryToken); + + static HRESULT + IsGroupMember( + _In_ WELL_KNOWN_SID_TYPE wellKnownSidType, + _In_ HANDLE token, + _Out_ PBOOL pIsMember + ); + + static HRESULT + GetTokenUser( + _In_ HANDLE token, + _Out_opt_ LPWSTR pUser, + _Inout_ LPDWORD pcchUser, + _Out_opt_ LPWSTR pDomain, + _Inout_ LPDWORD pcchDomain + ); + + static HRESULT + GetCurrentUser( + _Out_opt_ LPWSTR pUser, + _Inout_ LPDWORD pcchUser, + _Out_opt_ LPWSTR pDomain, + _Inout_ LPDWORD pcchDomain + ); + + static HRESULT + GrantPrivilege( + _In_ HANDLE token, + _In_ LPCTSTR privilege, + _In_ BOOL enable + ); + + static HRESULT + GetSidForAccount( + _In_opt_z_ LPCWSTR pSystemName, + _In_z_ LPCWSTR pAccountName, + _Outptr_ PSID* ppSid + ); + + static HRESULT + IsCurrentProcessInteractive( + _Out_ PBOOL pIsInteractive + ); +}; diff --git a/src/mpi/common/Util.cpp b/src/mpi/common/Util.cpp new file mode 100644 index 0000000..05bb0c0 --- /dev/null +++ b/src/mpi/common/Util.cpp @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "util.h" +#include "kernel32util.h" + +// +// Summary: +// Ensure that the OS version is greater than or equal to the specified version. +// +// Parameters: +// major - Windows major version +// minor - Windows minor version +// +_Success_(return!=FALSE) +BOOL +CheckOSVersion( + _In_ DWORD major, + _In_ DWORD minor + ) +{ + OSVERSIONINFOEX version = {}; + ULONG mask = VER_MAJORVERSION | VER_MINORVERSION; + ULONGLONG conditions = 0; + + version.dwOSVersionInfoSize = sizeof(version); + version.dwMajorVersion = major; + version.dwMinorVersion = minor; + + conditions = ::VerSetConditionMask( conditions, VER_MAJORVERSION, VER_GREATER_EQUAL ); + conditions = ::VerSetConditionMask( conditions, VER_MINORVERSION, VER_GREATER_EQUAL ); + + return ::VerifyVersionInfo( &version, mask, conditions ); +} + + +static const wchar_t * const AZURE_REGISTRY_VALUE = L"NodeLogicalName"; +static const wchar_t * const AZURE_REGISTRY_KEY = L"SOFTWARE\\MICROSOFT\\HPC"; + +// +// Summary: +// Check if the smpd instance is running on azure and if so, +// return the logical name of the node +// +// Input: +// szBuffer: the size of the name buffer +// +// Output: +// buffer : store the logical name. If null, name is not returned +// +// Return: +// true if the node is on azure +// false if the node is not on azure, or if the size of the buffer is +// too small +// +// +bool get_azure_node_logical_name( + _Out_opt_z_cap_(szBuffer) wchar_t* buffer, + _In_ DWORD szBuffer ) +{ + HKEY key; + DWORD size = szBuffer - 1; + DWORD status = RegOpenKeyExW( HKEY_LOCAL_MACHINE, + AZURE_REGISTRY_KEY, + NULL, + KEY_READ, + &key ); + + if( status != ERROR_SUCCESS ) + { + return false; + } + + status = RegQueryValueExW( key, + AZURE_REGISTRY_VALUE, + NULL, + NULL, + reinterpret_cast(buffer), + &size ); + + RegCloseKey( key ); + + if( status != ERROR_SUCCESS ) + { + return false; + } + + if( buffer != NULL ) + { + buffer[size] = L'\0'; + } + + return true; +} \ No newline at end of file diff --git a/src/mpi/common/argstr.cpp b/src/mpi/common/argstr.cpp new file mode 100644 index 0000000..3c66603 --- /dev/null +++ b/src/mpi/common/argstr.cpp @@ -0,0 +1,697 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ +#include "precomp.h" + + +#define MPIU_STR_TRUNCATED MPIU_STR_NOMEM + +_Success_(return != nullptr) +_Ret_z_ +static const char * +first_token( + _In_opt_z_ const char *str + ) +{ + if (str == nullptr) + return nullptr; + /* isspace is defined only if isascii is true */ + while (/*isascii(*str) && isspace(*str)*/ *str == MPIU_STR_SEPAR_CHAR) + str++; + if (*str == '\0') + return nullptr; + return str; +} + + +_Ret_maybenull_z_ +static const char* +next_token( + _In_opt_z_ const char *str + ) +{ + if (str == nullptr) + return nullptr; + str = first_token(str); + if (str == nullptr) + return nullptr; + if (*str == MPIU_STR_QUOTE_CHAR) + { + /* move over string */ + str++; /* move over the first quote */ + if (*str == '\0') + return nullptr; + while (*str != MPIU_STR_QUOTE_CHAR) + { + /* move until the last quote, ignoring escaped characters */ + if (*str == MPIU_STR_ESCAPE_CHAR) + { + str++; + } + str++; + if (*str == '\0') + return nullptr; + } + str++; /* move over the last quote */ + } + else + { + if (*str == MPIU_STR_DELIM_CHAR) + { + /* move over the DELIM token */ + str++; + } + else + { + /* move over literal */ + while (/*(isascii(*str) && + !isspace(*str)) &&*/ + *str != MPIU_STR_SEPAR_CHAR && + *str != MPIU_STR_DELIM_CHAR && + *str != '\0') + str++; + } + } + return first_token(str); +} + +static int +compare_token( + _In_opt_z_ const char *token, + _In_opt_z_ const char *str + ) +{ + if (token == nullptr || str == nullptr) + return -1; + + if (*token == MPIU_STR_QUOTE_CHAR) + { + /* compare quoted strings */ + token++; /* move over the first quote */ + /* compare characters until reaching the end of the string or the end quote character */ + for(;;) + { + if (*token == MPIU_STR_ESCAPE_CHAR) + { + token++; + if (*token != *str) + break; + } + else + { + if (*token != *str || *token == MPIU_STR_QUOTE_CHAR) + break; + } + if (*str == '\0') + break; + token++; + str++; + } + if (*str == '\0' && *token == MPIU_STR_QUOTE_CHAR) + return 0; + if (*token == MPIU_STR_QUOTE_CHAR) + return 1; + if (*str < *token) + return -1; + return 1; + } + + /* compare DELIM token */ + if (*token == MPIU_STR_DELIM_CHAR) + { + if (*str == MPIU_STR_DELIM_CHAR) + { + str++; + if (*str == '\0') + return 0; + return 1; + } + if (*token < *str) + return -1; + return 1; + } + + /* compare literals */ + while (*token == *str && + *str != '\0' && + *token != MPIU_STR_DELIM_CHAR && + (/*isascii(*token) && !isspace(*token)*/ *token != MPIU_STR_SEPAR_CHAR) ) + { + token++; + str++; + } + if ( (*str == '\0') && + (*token == MPIU_STR_DELIM_CHAR || + (/*isascii(*token) && isspace(*token)*/ *token == MPIU_STR_SEPAR_CHAR) || *token == '\0') ) + return 0; + if (*token == MPIU_STR_DELIM_CHAR || + (/*isascii(*token) && isspace(*token)*/ *token == MPIU_STR_SEPAR_CHAR) || *token < *str) + return -1; + return 1; +} + +_Success_(return == MPIU_STR_SUCCESS) +static int +token_copy( + _In_opt_z_ const char *token, + _Out_writes_z_(maxlen) char *str, + _In_ size_t maxlen + ) +{ + /* check parameters */ + if (token == nullptr || str == nullptr) + return MPIU_STR_FAIL; + + /* check special buffer lengths */ + if (maxlen < 1) + return MPIU_STR_FAIL; + if (maxlen == 1) + { + *str = '\0'; + return (token[0] == '\0') ? MPIU_STR_SUCCESS : MPIU_STR_TRUNCATED; + } + + /* cosy up to the token */ + token = first_token(token); + if (token == nullptr) + { + *str = '\0'; + return MPIU_STR_SUCCESS; + } + + if (*token == MPIU_STR_DELIM_CHAR) + { + /* copy the special deliminator token */ + str[0] = MPIU_STR_DELIM_CHAR; + str[1] = '\0'; + return MPIU_STR_SUCCESS; + } + + if (*token == MPIU_STR_QUOTE_CHAR) + { + /* quoted copy */ + token++; /* move over the first quote */ + + do + { + if (*token == MPIU_STR_QUOTE_CHAR) + { + *str = '\0'; + return MPIU_STR_SUCCESS; + } + + if (*token == MPIU_STR_ESCAPE_CHAR) + { + token++; + } + + if( *token == '\0' ) + { + // + // Bad input - we're expecting a closing quote + // + return MPIU_STR_FAIL; + } + + *str = *token; + str++; + token++; + + } while( --maxlen > 0 ); + + /* we've run out of destination characters so back up and null terminate the string */ + str--; + *str = '\0'; + return MPIU_STR_TRUNCATED; + } + + /* literal copy */ + while (*token != MPIU_STR_DELIM_CHAR && + (/*isascii(*token) && !isspace(*token)*/ *token != MPIU_STR_SEPAR_CHAR) && *token != '\0' && maxlen) + { + *str = *token; + str++; + token++; + maxlen--; + } + if (maxlen) + { + *str = '\0'; + return MPIU_STR_SUCCESS; + } + str--; + *str = '\0'; + return MPIU_STR_TRUNCATED; +} + + +/*@ MPIU_Str_get_string_arg - Extract an option from a string with a maximum length + + Input Parameters: ++ str - Source string +. key - key +- val_len - Maximum total length of 'val' + + Output Parameter: +. val - output string + + Return value: + MPIU_STR_SUCCESS, MPIU_STR_NOMEM, MPIU_STR_FAIL + + Notes: + This routine searches for a "key = value" entry in a string + + Module: + Utility + @*/ +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_get_string_arg( + _In_opt_z_ const char* str, + _In_opt_z_ const char* flag, + _Out_writes_z_(val_len) char* val, + _In_ size_t val_len + ) +{ + if (val_len < 1) + return MPIU_STR_FAIL; + + /* line up with the first token */ + str = first_token(str); + if (str == nullptr) + return MPIU_STR_FAIL; + + /* This loop will match the first instance of "flag = value" in the string. */ + do + { + if (compare_token(str, flag) == 0) + { + str = next_token(str); + if (compare_token(str, MPIU_STR_DELIM_STR) == 0) + { + str = next_token(str); + if (str == nullptr) + return MPIU_STR_FAIL; + return token_copy(str, val, val_len); + } + } + else + { + str = next_token(str); + } + } while (str); + return MPIU_STR_FAIL; +} + + +/*@ MPIU_Str_get_int_arg - Extract an option from a string + + Input Parameters: ++ str - Source string +- key - key + + Output Parameter: +. val_ptr - pointer to the output integer + + Return value: + MPIU_STR_SUCCESS, MPIU_STR_NOMEM, MPIU_STR_FAIL + + Notes: + This routine searches for a "key = value" entry in a string and decodes the value + back to an int. + + Module: + Utility + @*/ +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_get_int_arg( + _In_z_ const char *str, + _In_z_ const char *flag, + _Out_ int *val_ptr + ) +{ + int result; + char int_str[12]; + + result = MPIU_Str_get_string_arg(str, flag, int_str, _countof(int_str)); + if (result == MPIU_STR_SUCCESS) + { + *val_ptr = atoi(int_str); + return MPIU_STR_SUCCESS; + } + return result; +} + +/* quoted_printf does not nullptr terminate the string if maxlen is reached */ +_Success_(return < maxlen) +static +int +quoted_printf( + _Out_writes_z_(maxlen) char *str, + _In_ int maxlen, + _In_z_ const char *val) +{ + int count = 0; + if (maxlen < 1) + return 0; + *str = MPIU_STR_QUOTE_CHAR; + str++; + maxlen--; + count++; + while (maxlen) + { + if (*val == '\0') + break; + if (*val == MPIU_STR_QUOTE_CHAR || *val == MPIU_STR_ESCAPE_CHAR) + { + *str = MPIU_STR_ESCAPE_CHAR; + str++; + maxlen--; + count++; + if (maxlen == 0) + return count; + } + *str = *val; + str++; + maxlen--; + count++; + val++; + } + if (maxlen) + { + *str = MPIU_STR_QUOTE_CHAR; + str++; + maxlen--; + count++; + if (maxlen == 0) + return count; + *str = '\0'; + } + return count; +} + +/*@ MPIU_Str_add_string - Add a string to a string + + Input Parameters: ++ str_ptr - pointer to the destination string +. maxlen_ptr - pointer to the maximum length of '*str_ptr' +- val - string to add + + Output Parameter: ++ str_ptr - The string pointer is updated to the next available location in the string +- maxlen_ptr - maxlen is decremented by the amount str_ptr is incremented + + Return value: + MPIU_STR_SUCCESS, MPIU_STR_NOMEM, MPIU_STR_FAIL + + Notes: + This routine adds a string to a string in such a way that MPIU_Str_get_string can + retreive the same string back. It takes into account spaces and quote characters. + The string pointer is updated to the start of the next string in the string and maxlen + is updated accordingly. + + Module: + Utility + @*/ +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_add_string( + _Inout_ _Outptr_result_buffer_(*maxlen_ptr) PSTR* str_ptr, + _Inout_ int *maxlen_ptr, + _In_z_ const char *val + ) +{ + int num_chars; + char *str; + int maxlen; + + str = *str_ptr; + maxlen = *maxlen_ptr; + + if (strchr(val, MPIU_STR_SEPAR_CHAR) || + strchr(val, MPIU_STR_QUOTE_CHAR) || + strchr(val, MPIU_STR_DELIM_CHAR)) + { + num_chars = quoted_printf(str, maxlen, val); + if (num_chars == maxlen) + { + /* truncation, cleanup string */ + *str = '\0'; + return -1; + } + if (num_chars < maxlen - 1) + { + str[num_chars] = MPIU_STR_SEPAR_CHAR; + str[num_chars+1] = '\0'; + num_chars++; + } + else + { + str[num_chars] = '\0'; + } + } + else + { + if (*val == '\0') + { + num_chars = MPIU_Snprintf(str, maxlen, MPIU_STR_QUOTE_STR MPIU_STR_QUOTE_STR/*"\"\""*/); + } + else + { + num_chars = MPIU_Snprintf(str, maxlen, "%s%c", val, MPIU_STR_SEPAR_CHAR); + } + if ((num_chars < 0) || (num_chars == maxlen)) + { + *str = '\0'; + return -1; + } + } + *str_ptr += num_chars; + *maxlen_ptr -= num_chars; + return 0; +} + +/*@ MPIU_Str_get_string - Get the next string from a string + + Input Parameters: ++ str_ptr - pointer to the destination string +- val_len - to the maximum length of '*str_ptr' + + Output Parameter: ++ str_ptr - location of the next string +- val - location to store the string + + Return Value: + The return value is 0 for success, -1 for insufficient buffer space, and -2 for failure. + + Notes: + This routine gets a string that was previously added by MPIU_Str_add_string. + It takes into account spaces and quote characters. The string pointer is updated to the + start of the next string in the string. + + Module: + Utility + @*/ + +_Success_(return == 0) +int +MPIU_Str_get_string( + _Inout_ _Outptr_result_maybenull_z_ PCSTR* str_ptr, + _Out_writes_z_(val_len)char *val, + _In_ size_t val_len + ) +{ + int result; + PCSTR str; + + if (str_ptr == nullptr) + { + return -2; + } + + if (val_len < 1) + { + return -2; + } + + str = *str_ptr; + *val = '\0'; + + /* line up with the first token */ + str = first_token(str); + if (str == nullptr) + { + return 0; + } + + /* copy the token */ + result = token_copy(str, val, val_len); + if (result == MPIU_STR_SUCCESS) + { + str = next_token(str); + *str_ptr = str; + return 0; + } + else if (result == MPIU_STR_TRUNCATED) + { + return -1; + } + + /* failure */ + return -2; +} + +/*@ MPIU_Str_add_string_arg - Add an option to a string with a maximum length + + Input Parameters: ++ str_ptr - Pointer to the destination string +. maxlen_ptr - Pointer to the maximum total length of '*str_ptr' +. key - key +- val - input string + + Output Parameter: ++ str_ptr - The string pointer is updated to the next available location in the string +- maxlen_ptr - maxlen is reduced by the number of characters written + + Return value: + MPIU_STR_SUCCESS, MPIU_STR_NOMEM, MPIU_STR_FAIL + + Notes: + This routine adds a string option to a string in the form "key = value". + + Module: + Utility + @*/ +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_add_string_arg( + _Inout_ _Outptr_result_buffer_(*maxlen_ptr) PSTR* str_ptr, + _Inout_ int *maxlen_ptr, + _In_z_ const char *flag, + _In_z_ const char *val + ) +{ + int num_chars; + char *orig_str_ptr; + int orig_maxlen; + + if (maxlen_ptr == nullptr) + return MPIU_STR_FAIL; + + orig_maxlen = *maxlen_ptr; + orig_str_ptr = *str_ptr; + + if (*maxlen_ptr < 1) + return MPIU_STR_FAIL; + + /* add the flag */ +/* printf("strstr flag\n"); */ + if (strstr(flag, MPIU_STR_SEPAR_STR) || strstr(flag, MPIU_STR_DELIM_STR) || flag[0] == MPIU_STR_QUOTE_CHAR) + { + num_chars = quoted_printf(*str_ptr, *maxlen_ptr, flag); + } + else + { + num_chars = MPIU_Snprintf(*str_ptr, *maxlen_ptr, "%s", flag); + } + + if(num_chars < 0) + { + num_chars = *maxlen_ptr; + } + + *maxlen_ptr = *maxlen_ptr - num_chars; + if (*maxlen_ptr < 1) + { + **str_ptr = '\0'; + /*(*str_ptr)[num_chars-1] = '\0';*/ + return MPIU_STR_NOMEM; + } + *str_ptr = *str_ptr + num_chars; + + /* add the deliminator character */ + **str_ptr = MPIU_STR_DELIM_CHAR; + *str_ptr = *str_ptr + 1; + *maxlen_ptr = *maxlen_ptr - 1; + + /* add the value string */ +/* printf("strstr val\n"); */ + if (strstr(val, MPIU_STR_SEPAR_STR) || strstr(val, MPIU_STR_DELIM_STR) || val[0] == MPIU_STR_QUOTE_CHAR) + { + num_chars = quoted_printf(*str_ptr, *maxlen_ptr, val); + } + else + { + if (*val == '\0') + { + num_chars = MPIU_Snprintf(*str_ptr, *maxlen_ptr, MPIU_STR_QUOTE_STR MPIU_STR_QUOTE_STR/*"\"\""*/); + } + else + { + num_chars = MPIU_Snprintf(*str_ptr, *maxlen_ptr, "%s", val); + } + } + + if(num_chars < 0) + { + num_chars = *maxlen_ptr; + } + + *str_ptr = *str_ptr + num_chars; + *maxlen_ptr = *maxlen_ptr - num_chars; + if (*maxlen_ptr < 2) + { + *orig_str_ptr = '\0'; + *str_ptr = orig_str_ptr; + *maxlen_ptr = orig_maxlen; + return MPIU_STR_NOMEM; + } + + /* add the trailing space */ + **str_ptr = MPIU_STR_SEPAR_CHAR; + *str_ptr = *str_ptr + 1; + **str_ptr = '\0'; + *maxlen_ptr = *maxlen_ptr - 1; + + return MPIU_STR_SUCCESS; +} + +/*@ MPIU_Str_add_int_arg - Add an option to a string with a maximum length + + Input Parameters: ++ str_ptr - Pointer to the destination string +. maxlen_ptr - Pointer to the maximum total length of '*str_ptr' +. key - key +- val - input integer + + Output Parameter: ++ str_ptr - The string pointer is updated to the next available location in the string +- maxlen_ptr - maxlen is reduced by the number of characters written + + Return value: + MPIU_STR_SUCCESS, MPIU_STR_NOMEM, MPIU_STR_FAIL + + Notes: + This routine adds an integer option to a string in the form "key = value". + + Module: + Utility + @*/ +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_add_int_arg( + _Inout_ _Outptr_result_buffer_(*maxlen_ptr) PSTR* str_ptr, + _Inout_ int *maxlen_ptr, + _In_z_ const char *flag, + _In_ int val + ) +{ + char val_str[12]; + MPIU_Snprintf(val_str, 12, "%d", val); + return MPIU_Str_add_string_arg(str_ptr, maxlen_ptr, flag, val_str); +} diff --git a/src/mpi/common/assertutil.h b/src/mpi/common/assertutil.h new file mode 100644 index 0000000..7154d9f --- /dev/null +++ b/src/mpi/common/assertutil.h @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +// +// +// Summary: +// This file contains the assert utility macros. +// Note: the "Invariant" versions that are included in retail. +// +// InvariantAssert/Assert(exp_) : +// This uses interupt 2c, which enables new assert break and skip features. +// If this assert fires, it will raise a fatal error and crash the host process. +// If AeDebug key is set, this will cause the debugger to launch +// When debugger attached, the 'ahi' command can be used to ignore the assertion and continue. +// NOTE: Unlike the CRT assert, the strings for these asserts are stored in the symbols, +// so asserts do not add strings to the image. +// +// InvariantAssertP/AssertP(exp_) : +// This is the same as the InvariantAssert/Assert macro, except that it will only passively fire +// when a debugger is actually attached. +// +// + +#define InvariantAssert(exp_) \ + ((!(exp_)) ? \ + (__annotation(L"Debug", L"AssertFail", L#exp_), \ + __int2c(), FALSE) : \ + TRUE) + +#define InvariantAssertP( exp_ ) \ + ((!(exp_) && IsDebuggerPresent()) ? \ + (__annotation(L"Debug", L"PassiveAssertFail", L#exp_), \ + __int2c(), FALSE) : \ + TRUE) + +#if DBG +# define Assert(exp_) __analysis_assume(exp_);InvariantAssert(exp_) +# define AssertP( exp_ ) __analysis_assume(exp_);InvariantAssertP(exp_) +#else +# define Assert( exp_ ) __analysis_assume(exp_) +# define AssertP( exp_ ) __analysis_assume(exp_) +#endif diff --git a/src/mpi/common/baseerrnames.txt b/src/mpi/common/baseerrnames.txt new file mode 100644 index 0000000..e366845 --- /dev/null +++ b/src/mpi/common/baseerrnames.txt @@ -0,0 +1,78 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +# +# +# This file maps each MPI error class to a short name form. +# This is used to support MPI_Error_string when applied to one of the +# MPI classes rather than to an error code created by MPIR_Err_create_code. +# By mapping the MPI codes to short generic names, we ensure that the +# message strings for the defined MPI classes matches some message that +# may be created by MPIR_Err_create_code. +# +# The format of this file is +# mpi_err_xxx integer-value short-name +# where "integer-value" is the same as in mpi.h (eventually, we should +# generate this automatically). +MPI_SUCCESS 0 **success +# Communication argument parameters +MPI_ERR_BUFFER 1 **buffer +MPI_ERR_COUNT 2 **count +MPI_ERR_TYPE 3 **dtype +MPI_ERR_TAG 4 **tag +MPI_ERR_COMM 5 **comm +MPI_ERR_RANK 6 **rank +MPI_ERR_ROOT 7 **root +# MPI Objects (other than COMM) +MPI_ERR_GROUP 8 **group +MPI_ERR_OP 9 **op +# Special topology argument parameters +MPI_ERR_TOPOLOGY 10 **topology +MPI_ERR_DIMS 11 **dims +# All other arguments. This is a class with many kinds +MPI_ERR_ARG 12 **arg +# Other errors that are not simply an invalid argument +MPI_ERR_UNKNOWN 13 **unknown +MPI_ERR_TRUNCATE 14 **truncate +MPI_ERR_OTHER 15 **other +MPI_ERR_INTERN 16 **intern +# Multiple completion has two special error classes +MPI_ERR_IN_STATUS 17 **instatus +MPI_ERR_PENDING 18 **inpending +MPI_ERR_REQUEST 19 **request +# New MPI-2 Error classes +MPI_ERR_ACCESS 20 **fileaccess +MPI_ERR_AMODE 21 **fileamode +MPI_ERR_BAD_FILE 22 **filename +MPI_ERR_CONVERSION 23 **conversion +MPI_ERR_DUP_DATAREP 24 **datarepused +MPI_ERR_FILE_EXISTS 25 **fileexist +MPI_ERR_FILE_IN_USE 26 **fileinuse +MPI_ERR_FILE 27 **file +# MPI_ERR_INFO is NOT defined in the MPI-2 standard. I believe that +# this is an oversight +MPI_ERR_INFO 28 **info +MPI_ERR_INFO_KEY 29 **infokey +MPI_ERR_INFO_VALUE 30 **infoval +MPI_ERR_INFO_NOKEY 31 **infonokey +MPI_ERR_IO 32 **io +MPI_ERR_NAME 33 **nameservice +MPI_ERR_NO_MEM 34 **allocmem +MPI_ERR_NOT_SAME 35 **notsame +MPI_ERR_NO_SPACE 36 **filenospace +MPI_ERR_NO_SUCH_FILE 37 **filenoexist +MPI_ERR_PORT 38 **port +MPI_ERR_QUOTA 39 **filequota +MPI_ERR_READ_ONLY 40 **filerdonly +MPI_ERR_SERVICE 41 **servicename +MPI_ERR_SPAWN 42 **spawn +MPI_ERR_UNSUPPORTED_DATAREP 43 **datarepunsupported +MPI_ERR_UNSUPPORTED_OPERATION 44 **fileopunsupported +MPI_ERR_WIN 45 **win +MPI_ERR_BASE 46 **base +MPI_ERR_LOCKTYPE 47 **locktype +MPI_ERR_KEYVAL 48 **keyval +MPI_ERR_RMA_CONFLICT 49 **rmaconflict +MPI_ERR_RMA_SYNC 50 **rmasync +MPI_ERR_SIZE 51 **rmasize +MPI_ERR_DISP 52 **rmadisp +MPI_ERR_ASSERT 53 **assert diff --git a/src/mpi/common/dbg_printf.cpp b/src/mpi/common/dbg_printf.cpp new file mode 100644 index 0000000..5604741 --- /dev/null +++ b/src/mpi/common/dbg_printf.cpp @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "precomp.h" + +#include "dbg_printf.h" + +// +// This constant is used only by the debug extension to query about the minimum +// version of the extension that this version of MSMPI can support. +// When the debug extension attaches to a running MPI process, it does not know +// whether the current MSMPI has the correct data structure layout to support +// this current version of the debugger extension (or that the user would need +// to upgrade to a newer version of the debug extension, as indicated by this +// constant). +// +static const unsigned int MSMPI_DBGEXT_VER = 200; + + +// +// enable breaking on initialization +// +// -env MSMPI_INIT_BREAK preinit +// breaks into all ranks before initialization +// +// -env MSMPI_INIT_BREAK all +// breaks into all ranks after initialization +// +// -env MSMPI_INIT_BREAK a,b,d-f,x-z +// breaks into ranks "a b d e f x y z" after initialization. +// ranks are decimal numbers; separator is any character except '-' +// + +_Success_(return==true) +static inline +bool +get_break_env( + _Out_writes_z_(cchEnv) char* env, + _In_ DWORD cchEnv + ) +{ + DWORD err = MPIU_Getenv( "MSMPI_INIT_BREAK", + env, + cchEnv ); + if( err == ERROR_ENVVAR_NOT_FOUND ) + { + err = MPIU_Getenv( "MPICH_INIT_BREAK", + env, + cchEnv ); + } + + return err == NOERROR; +} + + +void +MPIU_dbg_preinit() +{ + char env[_countof("preinit")]; + if( get_break_env( env, _countof(env) ) == false ) + { + return; + } + + if( CompareStringA( LOCALE_INVARIANT, + 0, + env, + -1, + "preinit", + -1 ) != CSTR_EQUAL ) + { + return; + } + + MPIU_Debug_break(); +} + +_Success_(return==MPI_SUCCESS) +int +MPIU_dbg_init( + _In_ unsigned int rank, + _In_ unsigned int world_size + ) +{ + char env[32767]; + if( get_break_env(env, _countof(env) ) == false ) + { + return MPI_SUCCESS; + } + + // + // This one is called after MPIU_dbg_preinit but it parses the same + // environment variable so if we already parsed preinit earlier we + // will not do it again here. + // + if( CompareStringA( LOCALE_INVARIANT, + 0, + env, + -1, + "preinit", + -1 ) == CSTR_EQUAL ) + { + return MPI_SUCCESS; + } + + unsigned int unique_ranks; + bool isDebug; + int mpi_errno = MPI_SUCCESS; + + mpi_errno = MPIU_Parse_rank_range( rank, env, world_size, &isDebug, &unique_ranks); + + if ( mpi_errno == MPI_SUCCESS && + isDebug == true ) + { + MPIU_Debug_break(); + } + return mpi_errno; +} + +void +MPIU_dbg_printf( + _Printf_format_string_ const char * str, + ... + ) +{ + va_list list; + va_start(list, str); + vfprintf(stderr, str, list); fflush(stderr); + va_end(list); +} diff --git a/src/mpi/common/dbg_printf.h b/src/mpi/common/dbg_printf.h new file mode 100644 index 0000000..d20876a --- /dev/null +++ b/src/mpi/common/dbg_printf.h @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +void MPIU_dbg_preinit(); + +_Success_(return==MPI_SUCCESS) +int +MPIU_dbg_init( + _In_ unsigned int rank, + _In_ unsigned int world_size + ); + +void +MPIU_dbg_printf( + _Printf_format_string_ const char * str, + ... + ); diff --git a/src/mpi/common/dump.cpp b/src/mpi/common/dump.cpp new file mode 100644 index 0000000..01062b8 --- /dev/null +++ b/src/mpi/common/dump.cpp @@ -0,0 +1,260 @@ +/*++ + + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the MIT License. + +dump.cpp - MPI minidump functionality + +--*/ +#include "precomp.h" +#include "mpidump.h" +#include +#include + + +typedef BOOL +(WINAPI *PFN_MiniDumpWriteDump)( + __in HANDLE hProcess, + __in DWORD ProcessId, + __in HANDLE hFile, + __in MINIDUMP_TYPE DumpType, + __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam + ); + + +MSMPI_DUMP_MODE GetDumpMode() +{ + wchar_t env[12]; + + DWORD err = MPIU_Getenv( L"MSMPI_DUMP_MODE", env, _countof(env) ); + if( err != NOERROR ) + { + return MsmpiDumpNone; + } + + int val = _wtoi(env); + if( val > MsmpiDumpNone && val < MsmpiDumpMaximumValue ) + { + return static_cast(val); + } + + return MsmpiDumpNone; +} + + +void +CreateFinalDumpFile( + _In_ HANDLE tempFileHandle, + _In_ int rank, + _In_z_ const wchar_t* dumpPath, + _In_ int jobid, + _In_ int taskid, + _In_ int taskinstid + ) +{ + MPIU_Assert( tempFileHandle != INVALID_HANDLE_VALUE ); + wchar_t tempFileName[MAX_PATH]; + DWORD err = GetFinalPathNameByHandleW( + tempFileHandle, + tempFileName, + _countof( tempFileName ), + 0 + ); + + if( err == 0 ) + { + return; + } + + wchar_t dPath[MAX_PATH]; + HRESULT hr; + + if( dumpPath != NULL && dumpPath[0] != L'\0' ) + { + hr = StringCchCopyW( dPath, _countof( dPath ), dumpPath ); + } + else + { + hr = StringCchCopyW( dPath, _countof( dPath ), L"%USERPROFILE%"); + } + + if( FAILED( hr ) ) + { + return; + } + + wchar_t name[MAX_PATH]; + + // + // For CCP, task instance id starts at 0. Thus, we only verify + // jobid and taskid + // + if( jobid == 0 || taskid == 0 ) + { + // + // In the SDK environment use the sdk default dumpfile + // + hr = StringCchPrintfW( + name, + _countof( name ), + L"%s\\mpi_dump_%d.dmp", + dPath, + rank + ); + } + else + { + // + // In the cluster environment use the cluster default dumpfile + // (incl. jobid.taskid.taskinstid) + // + hr = StringCchPrintfW( + name, + _countof( name ), + L"%s\\mpi_dump_%d.%d.%d.%d.dmp", + dPath, + jobid, + taskid, + taskinstid, + rank + ); + } + + if( FAILED( hr ) ) + { + return; + } + + DWORD ccPath = ExpandEnvironmentStringsW( + name, + dPath, + _countof( dPath ) + ); + if( ccPath == 0 ) + { + return; + } + + // + // For MPI Process, it is possible that it will be suspended + // by SMPD during the CopyFile operation. However, if this happens, + // this means this process is not the failing process (otherwise SPMD + // would not have suspended it). In the case of all processes generating + // dump files, SMPD will then write the dump for this process, which will + // result in a good dupm file. + // + CopyFileW( tempFileName, dPath, FALSE ); +} + + +HANDLE +CreateTempDumpFile( + __in HANDLE hProcess, + __in DWORD pid, + __in MINIDUMP_TYPE dumpType, + __in const wchar_t* dumpPath, + __in_opt MINIDUMP_EXCEPTION_INFORMATION* pExrParam + ) +{ + HANDLE hFile = INVALID_HANDLE_VALUE; + + // Create target file + wchar_t path[MAX_PATH]; + + // Load dbghelp library. + DWORD ccPath = GetSystemDirectoryW( path, _countof(path) ); + if( ccPath == 0 ) + { + return INVALID_HANDLE_VALUE; + } + + HRESULT hr = StringCchCopyW( &path[ccPath], + _countof(path) - ccPath, + L"\\dbghelp.dll" ); + if( FAILED( hr ) ) + { + return INVALID_HANDLE_VALUE; + } + + HMODULE hDbgHelp; + OACR_REVIEWED_CALL( + mpicr, + hDbgHelp = LoadLibraryExW( path, nullptr, 0 ) ); + if( hDbgHelp == NULL ) + { + return INVALID_HANDLE_VALUE; + } + + PFN_MiniDumpWriteDump pfnWriteDump = (PFN_MiniDumpWriteDump)GetProcAddress( + hDbgHelp, + "MiniDumpWriteDump" + ); + if( pfnWriteDump == NULL ) + { + goto free_dbghelp_and_exit; + } + + if( dumpPath != NULL && dumpPath[0] != L'\0' ) + { + ccPath = ExpandEnvironmentStringsW( + dumpPath, + path, + _countof(path) + ); + } + else + { + ccPath = ExpandEnvironmentStringsW( + L"%USERPROFILE%", + path, + _countof(path) + ); + } + + if( ccPath == 0 ) + { + goto free_dbghelp_and_exit; + } + + wchar_t name[MAX_PATH]; + int err = GetTempFileNameW( + path, + L"_mp", + 0, + name + ); + if( err == 0 ) + { + goto free_dbghelp_and_exit; + } + + hFile = CreateFileW( + name, + GENERIC_WRITE, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, + NULL + ); + if( hFile == INVALID_HANDLE_VALUE ) + { + goto free_dbghelp_and_exit; + } + + pfnWriteDump( + hProcess, + pid, + hFile, + dumpType, + pExrParam, + NULL, + NULL + ); + +free_dbghelp_and_exit: + FreeLibrary( hDbgHelp ); + return hFile; +} diff --git a/src/mpi/common/errnames.txt b/src/mpi/common/errnames.txt new file mode 100644 index 0000000..9b29159 --- /dev/null +++ b/src/mpi/common/errnames.txt @@ -0,0 +1,773 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +# +# Error messages for error classes referenced in baseerrnames.txt +# +**success:No MPI error +**buffer:Invalid buffer pointer +**count:Invalid count +**dtype:Invalid datatype +**tag:Invalid tag +**comm:Invalid communicator +**rank:Invalid rank +**root:Invalid root +**group:Invalid group +**op:Invalid MPI_Op +**request:Invalid MPI_Request +**topology:Invalid topology +**dims:Invalid dimension argument +**arg:Invalid argument +**unknown:Unknown error. Please file a bug report. +**truncate:Message truncated +**other:Other MPI error +**intern:Internal MPI error! +**instatus:See the MPI_ERROR field in MPI_Status for the error code +**inpending:Pending request (no error) +**fileaccess:Access denied to file +**fileamode:Invalid amode value in MPI_File_open +**filename:Invalid file name +**conversion:An error occurred in a user-defined data conversion function +**datarepused:The requested datarep name has already been specified to \ + MPI_REGISTER_DATAREP +**fileexist:File exists +**fileinuse:File in use by some process +**file:Invalid MPI_File +**info:Invalid MPI_Info +**infokey:Invalid key for MPI_Info +**infoval:Invalid MPI_Info value +**infonokey:MPI_Info key is not defined +**io:Other I/O error +**nameservice:Invalid service name (see MPI_Publish_name) +**allocmem:Unable to allocate memory for MPI_Alloc_mem +**notsame:Inconsistent arguments to collective routine +**filenospace:Not enough space for file +**filenoexist:File does not exist +**port:Invalid port +**filequota:Quota exceeded for files +**filerdonly:Read-only file or filesystem name +**servicename:Attempt to lookup an unknown service name +**spawn:Error in spawn call +**datarepunsupported:Unsupported datarep +**datarepunsupported %s:Unsupported datarep passed to %s +**fileopunsupported:Unsupported file operation +**win:Invalid MPI_Win +**winnotshm:A shared memory window is required but a local window was provided. +**base:Invalid base address +**locktype:Invalid lock type +**keyval:Invalid keyval +**rmaconflict:Conflicting accesses to window +**rmasync:Wrong synchronization of RMA calls +**rmasyncq %d %d %d %d:Wrong synchronization of RMA calls - rank %d, target %d, found lock state %d, expected lock state %d +**rmasize:Invalid size argument in RMA call +**rmadisp:Invalid displacement argument in RMA call +**rmatype:Invalid datatype for RMA operation +**assert:Invalid assert argument + +# NOTE: The following error messages are not defined in the standard, +# but, are internally used. +# +**message:Invalid message handle + + +**argnonpos %s %d:Invalid value for %s; must be positive but is %d +**argneg %s %d:Invalid value for %s, must be non-negative but is %d +**countneg %d:Negative count, value is %d +**inittwice:Cannot call MPI_INIT or MPI_INIT_THREAD more than once +**nomem:Out of memory +**notimpl:Function not implemented +**notimpl %s:Function %s not implemented +**nullptr %s:Null pointer in parameter %s +**nullptrtype %s:Null %s pointer +**typenamelen %d:Specified datatype name is too long (%d characters) +**commnamelen %d:Specified communicator name is too long (%d characters) +**winnamelen %d:Specified window name is too long (%d characters) +**keyvalobj %s:Keyval was not defined for %s objects +**keyvalinvalid:Attribute key was MPI_KEYVAL_INVALID +**permattr:Cannot set permanent attribute +**noerrclasses:No more user-defined error classes +**noerrcodes:No more user-defined error codes +**rankdup %d %d %d:Duplicate ranks in rank array at index %d, has value %d which is \ +also the value at index %d +**topotoolarge %d %d:Topology size %d is larger than communicator size (%d) +**notcarttopo:No Cartesian topology associated with this communicator +**dimszero:Communicator associated with zero-dimensional cartesian topology +**notgraphtopo:No Graph topology associated with this communicator +**notopology:No topology associated with this communicator +**dimsmany %d %d:Number of dimensions %d is too large (maximum is %d) +**neighborsmany %d %d:Number of neighbors %d is too large (maximum is %d) +**dimspartition:Cannot partition nodes as requested +**cartcoordinvalid %d %d %d:Cartesian coordinate for the %d coordinate \ + is %d but must be between 0 and %d +**cartdim %d %d:Size of the communicator (%d) is smaller than the size of the \ + Cartesian topology (%d) +**edgeoutrange %d %d %d:Edge index edges[%d] is %d but must be nonnegative \ + and less than %d +**nulledge %d %d:Edge for node %d (entry edges[%d]) is to itself +**indexneg %d %d:Index value for index[%d] is %d but must be nonnegative +**indexnonmonotone %d %d %d:Index values in graph topology must be monotone \ + nondecreasing but index[%d] is %d but the next index value is %d +**graphnnodes:Number of graph nodes exceeds size of communicator. +**rangedup %d %d %d:The range array specifies duplicate entries; process %d \ + specified in range array %d was previously specified in range array %d +**rank %d %d:Invalid rank has value %d but must be nonnegative and less than %d +**rank %d %g %d:Invalid rank %d in group %g but must be nonnegative and less than %d +**stride %d %d %d:Range (start = %d, end = %d, stride = %d) does not terminate +**stridezero:Zero stride is invalid +**rangestartinvalid %d %d %d:The %dth element of a range array starts at %d \ + but must be nonnegative and less than %d +**rangeendinvalid %d %d %d:The %dth element of a range array ends at %d \ + but must be nonnegative and less than %d +**argrange %s %d %d:Argument %s has value %d but must be within [0,%d] +**argarrayneg %s %d %d:Negative value in array %s[%d] (value is %d) +**bufexists:Buffer already attached with MPI_BUFFER_ATTACH. +**bsendbufsmall %d %d:Buffer size of %d is smaller than MPI_BSEND_OVERHEAD (%d) +**notgenreq:Attempt to complete a request with MPI_GREQUEST_COMPLETE that \ +was not started with MPI_GREQUEST_START +**cancelunknown:Attempt to cancel an unknown type of request +**permop:Cannot free permanent MPI_Op +**toomanycomm:Too many communicators +**commperm %s:Cannot free permanent communicator %s +**groupperm:Cannot free permanent group +**groupnotincomm %d:Rank %d of the specified group is not a member of this communicator +**commnotintra:An intracommunicator is required but an intercommunicator \ + was provided. +**commnotinter:An intercommunicator is required but an intracommunicator \ + was provided. +**nosplittype %d:Communicator cannot be split for type %d. +**ranklocal %d %d:Error specifying local_leader; rank given was %d but must \ +be in the range 0 to %d +**rankremote %d %d:Error specifying remote_leader; rank given was %d but must \ +be in the range 0 to %d +**ranksdistinct:Local and remote leaders must be different processes +**dupprocesses %d:Local and remote groups in MPI_Intercomm_create must not \ + contain the same processes; both contain process %d +**tag %d:Invalid tag, value is %d +**count %d:Invalid count, value = %d +**bufnull:Null buffer pointer +**bufbsend %d %d:Insufficient space in Bsend buffer; requested %d; total \ + buffer size is %d +**namepubnotpub %s:Lookup failed for service name %s +**nonamepub:No name publishing service available +**namepubnotfound %s:Lookup failed for service name %s +**namepubnotunpub %s:Failed to unpublish service name %s +**sendbuf_inplace:sendbuf cannot be MPI_IN_PLACE +**recvbuf_inplace:recvbuf cannot be MPI_IN_PLACE +**buf_inplace:buffer cannot be MPI_IN_PLACE +**typematchnoclass:The value of typeclass is not one of MPI_TYPECLASS_REAL, \ +MPI_TYPECLASS_INTEGER, or MPI_TYPECLASS_COMPLEX +**typematchsize %s %d:No MPI datatype available for typeclass %s and size %d +**f90typetoomany:Too many requests for unnamed, predefined f90 types +**f90typeintnone %d: No integer type with %d digits of range is avaiable +**f90typerealnone %d %d: No REAL type with precision %d and %d digits of range is avaiable +**f90typecomplexnone %d %d: No COMPLEX type with precision %d and %d digits of range is avaiable +**getConnStringFailed:Failed to obtain connection info for this process group +**version %d %d %d %d %d %d:Version mismatch in connection request, received version %d.%d.%d, expected %d.%d.%d. \ +Check cluster configuration and ensure MSMPI versions match. +**comm_split_type %d:Split type %d is not valid. +**overflow %s:Operation overflow in %s +**intoverflow %l:The value %l passed to the internal operation is bigger than MAX_INT and may cause data corruption +**invalidarg %s %s:Invalid argument value specified in parameter %s. %s +**unweightedboth:Must specify MPI_UNWEIGHTED for both or neither weight arguments +**argarrayrange %s %d %d %d:Argument %s[%d] has value %d but must be within [0,%d] + +# -- FIXME: Some (but not all) of the messages below this line have been used +#---- The messages below this line haven't been used yet. +# +**bufalias %s %s:Buffer parameters %s and %s must not be aliased +**dtypenull %s:Datatype for argument %s is a null datatype +**dtypecommit:Datatype has not been committed +**dtypeperm:Cannot free permanent data type +**dtypecomm:Pack buffer not packed for this communicator. +**dtypemismatch:Receiving data with a datatype whose signature does not match that of the sending datatype. +**intercomm:Intercommunicator is not allowed +**rankarray %d %d %d:Invalid rank in rank array at index %d; value is %d but must \ +be in the range 0 to %d +**rankarraysize %d %d:Invalid rank array size %d: the number of ranks must be between 0 \ +and the size of the group (%d) +**rangessize %d %d:Invalid number of ranges %d: the number of ranges must be between 0 \ +and the size of the group (%d) +**root %d:Invalid root (value given was %d) +**opundefined %s:MPI_Op %s operation not defined for this datatype +**noopnotallowed:MPI_NO_OP operation is not allowed in this call +**replacenotallowed:MPI_REPLACE operation is not allowed in this call +**dims %d:Invalid dimension argument (value is %d) +**arg %s:Invalid argument %s +**argerrcode %d:Invalid error code %d +**errhandler:Invalid errhandler +**errhandnotcomm:Error handler is not a comm error handler +**errhandnotfile:Error handler is not a file error handler +**errhandnotwin:Error handler is not a win error handler +**argarray %s %d %d:Invalid value in %s[%d] = %d +**darraydist %d %d:For MPI_DISTRIBUTE_NONE, the value of array_of_psizes[%d] \ + is %d but must have value 1 +**darrayunknown:Unknown distribution type +**darrayblock %d:Value of m in block(m) distribution is %d must must be \ + positive +**darrayblock2 %d %d:m * nprocs is %d but must equal the array size %d and is \ + not valid for block(m) distribution +**darraycyclic %d:Value of m is %d but must be positive for a cyclic(m) \ + distribution +**argposneg %d:Value of position is %d but must be nonnegative +**argpackbuf %l %l:Size of data to pack (%l bytes) is larger than remaining (%l bytes) \ + space in pack buffer (%d bytes) +**truncate %d %d:Message truncated; %d bytes received but buffer size is %d +**truncate %d %d %d %d:Message from rank %d and tag %d truncated; \ + %d bytes received but buffer size is %d +**rsendnomatch %d %d %d:Ready send from source %d, for destination %d and \ + with tag %d had no matching receive +**rsendnomatch %d %d:Ready send from source %d and with tag %d had no matching receive +**intern %s:Internal MPI error! %s +**unknowngpid %d %d:Internal MPI error: Unknown gpid (%d)%d +**request_invalid_kind %d:The supplied request was invalid (kind=%d) +**requestnotpersist:Request is not persistent in MPI_Start or MPI_Startall. +**requestpersistactive:Persistent request passed to MPI_Start or MPI_Startall is already active. +**requestrmacancel:Cannot cancel RMA request +**requestrmanotexpected:Request-based RMA operations are only valid within a passive target epoch +**requestrmaoutofbounds:The requested displacement specifies memory outside of the RMA window +**requestrmaremoteerror:RMA operation caused an error on the target process +**fileamode %d:Invalid amode value of %d in MPI_File_open +**fileamodeone:Exactly one of MPI_MODE_RDONLY, MPI_MODE_WRONLY, or \ + MPI_MODE_RDWR must be specified +**fileamoderead:Cannot use MPI_MODE_CREATE or MPI_MODE_EXCL with \ + MPI_MODE_RDONLY +**fileamodeseq:Cannot specify MPI_MODE_SEQUENTIAL with MPI_MODE_RDWR +**infokeynull:Null key +**infokeylong %s %d %d:Key %s is too long (length is %d but maximum allowed is %d) +**infokeyempty:Empty or blank key +**infovalnull:Null value +**infovallong %s %d %d:Value %s is too long (length is %d but maximum length is %d) +**infonokey %s:MPI_Info key %s is not defined +**infonkey %d %d:Requested key %d but this MPI_Info only has %d keys +**io %s:Other I/O error %s +**ioetype:Only an integral number of etypes can be accessed +**iosplitcoll:Only one active split collective I/O operation is allowed per file handle +**iosplitcollnone:No split collective I/O operation is active +**iofiletype:Filetype must be constructed out of one or more etypes +**ioamodeseq %s:Cannot use function %s when the file is opened with amode \ + MPI_MODE_SEQUENTIAL +**iowronly:Cannot read from a file opened with amode MPI_MODE_WRONLY +**iordonly:Cannot write to a file opened with amode MPI_MODE_RDONLY +**iodispifseq:disp must be set to MPI_DISPLACEMENT_CURRENT since file \ + was opened with MPI_MODE_SEQUENTIAL +**iobaddisp:Invalid displacement argument +**iobadoffset:Invalid offset argument +**ionegoffset:Negative offset argument +**iobadwhence:Invalid whence argument +**iobadfh:Invalid file handle +**ioagnomatch:No aggregators match +**iobadsize:Invalid size argument +**unsupporteddatarep:Only native data representation currently supported +**iodatarepnomem:User must allocate memory for datarep +**ioverlapping:Filetype specifies overlapping write regions +**ioinfokey %s:Value for info key %s not same across processes +**allocmem %d %d:Unable to allocate %d memory for MPI_Alloc_mem; only %d available +**notsame %s %s:Inconsistent arguments %s to collective routine %s +**rmasize %d:Invalid size argument in RMA call (value is %d) +**winunlockrank %d %d:Invalid rank argument %d, should be %d +**winlockall: A window locked with MPI_WIN_LOCK_ALL should be unlocked with MPI_WIN_UNLOCK_ALL +**winrmaop: Unexpected type of RMA operation +**notcstatignore:MPI_STATUS_IGNORE cannot be passed to MPI_Status_c2f() +**notfstatignore:MPI_STATUS_IGNORE cannot be passed to MPI_Status_f2c() +**user:user defined function returned an error code +**userdel %d:user delete function returned error code %d +**usercopy %d:user copy function returned error code %d +**userquery %d:user request query function returned error code %d +**usercancel %d:user request cancel function returned error code %d +**userfree %d:user request free function returned error code %d +**oremote_fail:open failed on a remote node +**join_portname %s %s:local %s, remote %s +**join_send %d:send on the socket failed (errno %d) +**join_recv %d:recv from the socket failed (errno %d) +**flag %d:invalid flag parameter (flag = %d) +**badcase %d:INTERNAL ERROR: unexpected value in case statement (value=%d) +**MapViewOfFile %d:MapViewOfFile failed, error %d +**errcontextid:Creating Remote ContextID Failed +**uuidgenfailed:Generating ContextID Failed +**interuptiblenotsupported:Interuptible Waits not supported. + +# +# Errors common to several devices +# +**dev|selfsenddeadlock:DEADLOCK: attempting to send a message to the local process without a prior matching receive + +# +# CH3 errors +# +**ch3|badreqtype %d:request contained an invalid request type (%d) +**ch3|unknownpkt %d:received unknown packet type (type=%d) +**opnotpredefined %d:only predefined ops are valid (op = %d) +**ch3|conn_parent:spawned process group was unable to connect back to the parent +**ch3|conn_parent %s:spawned process group was unable to connect back to the parent on port <%s> + +# +# CH3:sock errors +# +**ch3|sock|connrefused %s %d %s:[ch3:sock] failed to connect to process %s:%d (%s) +**ch3|sock|connfailed %d %d:[ch3:sock] failed to connnect to remote process %d:%d +**ch3|sock|connfailed %g %d:[ch3:sock] failed to connnect to remote process %g:%d +**ch3|sock|badpacket %d:[ch3:sock] received packet of unknown type (%d) +**ch3|sock|postread %p %p %p:attempt to post a read operation failed (rreq=%p,conn=%p,vc=%p) +**ch3|sock|postwrite %p %p %p:attempt to post a write operation failed (sreq=%p,conn=%p,vc=%p) +**ch3|sock|postconnect %d %d %s:[ch3:sock] rank %d unable to connect to rank %d using business card <%s> +**ch3|sock|open_lrecv_data:[ch3:sock] failed to handle open lrecv data packet +**ch3|sock|badhost %s %d %s:[ch3:sock] invalid host description, %s:%d (%s) +**pglookup %g:unable to find the process group structure with id %g + +# +# CH3:nd +# +**ch3|nd|startup %x:[ch3:nd] NdStartup failed with %x +**ch3|nd|query_addr %x:[ch3:nd] NdQueryAddressList failed with %x +**ch3|nd|badbuscard:[ch3:nd] Invalid business card +**ch3|nd|not_here_fallback %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +There is no matching NetworkDirect adapter and fallback to the socket interconnect is disabled.\n\ +Check the local NetworkDirect configuration or set the MPICH_ND_ENABLE_FALLBACK environment variable to true. +**ch3|nd|not_both_force %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +A matching NetworkDirect adapter is not available on either rank and the socket interconnect is disabled.\n\ +Check NetworkDirect configuration or clear the MPICH_DISABLE_SOCK environment variable. +**ch3|nd|not_here_force %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +There is no matching NetworkDirect adapter and the socket interconnect is disabled.\n\ +Check the local NetworkDirect configuration or clear the MPICH_DISABLE_SOCK environment variable. +**ch3|nd|not_there_fallback %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +There is no NetworkDirect information in the business card and fallback to the socket interconnect is disabled.\n\ +Check the remote NetworkDirect configuration or set the MPICH_ND_ENABLE_FALLBACK environment variable to true. +**ch3|nd|not_there_force %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +There is no NetworkDirect information in the business card and the socket interconnect is disabled.\n\ +Check the remote NetworkDirect configuration or clear the MPICH_DISABLE_SOCK environment variable. +**ch3|nd|no_path_fallback %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +The local and remote ranks have active NetworkDirect adapters but a route via NetworkDirect could not \ +be resolved and fallback to the socket interconnect is disabled.\n\ +Check NetworkDirect configuration or set the MPICH_ND_ENABLE_FALLBACK environment variable to true. +**ch3|nd|no_path_force %d %s:[ch3:nd] Could not connect via NetworkDirect to rank %d with business card (%s).\n\ +The local and remote ranks have active NetworkDirect adapters but a route via NetworkDirect could not \ +be resolved and the socket interconnect is disabled.\n\ +Check NetworkDirect configuration or clear the MPICH_DISABLE_SOCK environment variable. +**ch3|nd|open %x:[ch3:nd] NdOpenAdapter failed with %x +**ch3|nd|query %x:[ch3:nd] IND2Adapter::Query failed with %x +**ch3|nd|max_cq %d %d:[ch3:nd] Adapter's MaxCompletionQueueDepth: %d, need %d +**ch3|nd|max_sq %d %d:[ch3:nd] Adapter's MaxInitiatorQueueDepth: %d, need %d +**ch3|nd|max_rq %d %d:[ch3:nd] Adapter's MaxReceiveQueueDepth: %d, need %d +**ch3|nd|ov_file %x:[ch3:nd] IND2Adapter::CreateOverlappedFile failed with %x +**ch3|nd|create_cq %x:[ch3:nd] IND2Adapter::CreateCompletionQueue failed with %x +**ch3|nd|notify %x:[ch3:nd] IND2CompletionQueue::Notify failed with %x +**ch3|nd|create_mr %x:[ch3:nd] IND2Adapter::CreateMemoryRegion failed with %x +**ch3|nd|regmem %x:[ch3:nd] IND2MemoryRegion::Register failed with %x +**ch3|nd|deregmem %x:[ch3:nd] IND2MemoryRegion::Deregister failed with %x +**ch3|nd|create_listen %x:[ch3:nd] IND2Adapter::CreateListener failed with %x +**ch3|nd|bindlisten %x:[ch3:nd] IND2Listener::Bind failed with %x +**ch3|nd|listen %x:[ch3:nd] IND2Listener::Listen failed with %x +**ch3|nd|listen_addr %x:[ch3:nd] IND2Listener::GetLocalAddress failed with %x +**ch3|nd|create_conn %x:[ch3:nd] IND2Adapter::CreateConnector failed with %x +**ch3|nd|bindconn %x:[ch3:nd] IND2Connector::Bind failed with %x +**ch3|nd|get_conn %x:[ch3:nd] IND2Listener::GetConnectionRequest failed with %x +**ch3|nd|conn_data %x:[ch3:nd] IND2Connector::GetPrivateData failed with %x +**ch3|nd|conn_data_len %d:[ch3:nd] IND2Connector::GetPrivateData returned insufficient private data (%d) +**ch3|nd|conn_data %s %d %x:[ch3:nd] IND2Connector::GetPrivateData from %s:%d failed with %x +**ch3|nd|conn_data_len %s %d %d:[ch3:nd] IND2Connector::GetPrivateData from %s:%d returned insufficient private data (%d) +**ch3|nd|peer_addr %x:[ch3:nd] IND2Connector::GetPeerAddr failed with %x +**ch3|nd|accept %x:[ch3:nd] IND2Listener::Accept failed with %x +**ch3|nd|create_ep %x:[ch3:nd] IND2Adapter::CreateEndpoint failed with %x +**ch3|nd|conn %x:[ch3:nd] IND2Connector::Connect failed with %x +**ch3|nd|conn %s %d %x:[ch3:nd] IND2Connector::Connect to %s:%d failed with %x +**ch3|nd|comp_conn %s %d %x:[ch3:nd] IND2Connector::CompleteConnect to %s:%d failed with %x +**ch3|nd|recv %x:[ch3:nd] IND2Endpoint::Receive failed with %x +**ch3|nd|recv_err %s %d %x:[ch3:nd] Recv from %s:%d completed in error with %x +**ch3|nd|send %x:[ch3:nd] IND2Endpoint::Send failed with %x +**ch3|nd|send %s %d %x:[ch3:nd] IND2Endpoint::Send to %s:%d failed with %x +**ch3|nd|send_err %s %d %x:[ch3:nd] Send to %s:%d completed in error with %x +**ch3|nd|dconn %x:[ch3:nd] IND2Connector::Disconnect failed with %x +**ch3|nd|flush %x:[ch3:nd] IND2Endpoint::Flush failed with %x +**ch3|nd|create_mw %x:[ch3:nd] IND2Adapter::CreateMemoryWindow failed with %x +**ch3|nd|bind %x:[ch3:nd] IND2Endpoint::Bind failed with %x +**ch3|nd|bind_err %x:[ch3:nd] Bind failed with %x +**ch3|nd|unbind %x:[ch3:nd] IND2Endpoint::Invalidate failed with %x +**ch3|nd|unbind_err %x:[ch3:nd] Invalidate failed with %x +**ch3|nd|read %s %d %x:[ch3:nd] IND2Endpoint::Read from %s:%d failed with %x +**ch3|nd|read_err %s %d %x:[ch3:nd] Read from %s:%d completed in error with %x + +# +# CH3:ssm +# +**OpenProcess %d %d:OpenProcess failed for process %d, error %d +**CreateFileMapping %d:CreateFileMapping failed, error %d +**MapViewOfFileEx %d:MapViewOfFileEx failed, error %d +**snprintf %d:snprintf returned %d +**boot_attach %s:failed to attach to a bootstrap queue - %s +**attach_to_mem:attach to shared memory segment failed +**boot_send:sending bootstrap message failed +**shmconnect_getmem:failed to allocate shared memory for a write queue +**attach_to_mem %d:attach to shared memory returned error %d +**ca %d:invalid completion action (%d) +**vc_state %d:invalid vc state (%d) +**argstr_port:no space for the listener port +**argstr_port_name_tag:no space for port_name tag +**argstr_no_port_name_tag:no port_name tag in MPI port. Make sure that port \ + was created with MPI_Open_port +**argstr_shmq:no space for the shared memory queue name +**argstr_missinghost:Missing hostname or invalid host/port description in business card +**argstr_missingport:Missing port or invalid host/port description in business card +**buscard:unable to create a business card +**buscard_len:no space left in the business card to add a parameter +**desc_len:host description buffer too small +**duphandle %d:unable to duplicate a handle (errno %d) +**duphandle %s %d:unable to duplicate a handle, %s (errno %d) +**fail: +**fail %d:generic failure with errno = %d +**fail %s:%s +**fail %s %d:%s (errno %d) +**gethostbyname %d:gethostbyname failed (errno %d) +**gethostbyname %s %d:gethostbyname failed, %s (errno %d) +**sock_connect %d:connect failed (errno %d) +**sock_connect %s %d:connect failed - %s (errno %d) +**sock_connect %s %d %d:unable to connect to %s on port %d, error %d +**sock_connect %s %d %s:unable to connect to %s on port %d, %s +**sock_connect %s %d %s %d:unable to connect to %s on port %d, %s (errno %d) +**vcfailedstate %d:Failed to communicate with %d on previous attempts + +# +# Sock +# +**sock|connclosed:connection closed by peer +**sock|getport:failed to obtain port number of the listener + +# +# mpi functions +# +**mpi_send %p %d %D %i %t %C:MPI_Send(buf=%p, count=%d, %D, dest=%i, tag=%t, %C) failed +**mpi_recv %p %d %D %i %t %C %p:MPI_Recv(buf=%p, count=%d, %D, src=%i, tag=%t, %C, status=%p) failed +**mpi_get_count %p %D %p:MPI_Get_count(status=%p, %D, count=%p) failed +**mpi_bsend %p %d %D %i %t %C:MPI_Bsend(buf=%p, count=%d, %D, dest=%i, tag=%t, %C) failed +**mpi_ssend %p %d %D %i %t %C:MPI_Ssend(buf=%p, count=%d, %D, dest=%i, tag=%t, %C) failed +**mpi_rsend %p %d %D %i %t %C:MPI_Rsend(buf=%p, count=%d, %D, src=%i, tag=%t, %C) failed +**mpi_buffer_attach %p %d:MPI_Buffer_attach(buf=%p, size=%d) failed +**mpi_buffer_detach %p %p:MPI_Buffer_detach(buf=%p, size=%p) failed +**mpi_isend %p %d %D %i %t %C %p:MPI_Isend(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_ibsend %p %d %D %i %t %C %p:MPI_Ibsend(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_issend %p %d %D %i %t %C %p:MPI_Issend(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_irsend %p %d %D %i %t %C %p:MPI_Irsend(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_irecv %p %d %D %i %t %C %p:MPI_Irecv(buf=%p, count=%d, %D, src=%i, tag=%t, %C, request=%p) failed +**mpi_wait %p %p:MPI_Wait(request=%p, status%p) failed +**mpi_test %p %p %p:MPI_Test(request=%p, flag=%p, status=%p) failed +**mpi_request_free %p:MPI_Request_free(request=%p) failed +**mpi_waitany %d %p %p %p:MPI_Waitany(count=%d, req_array=%p, index=%p, status=%p) failed +**mpi_testany %d %p %p %p %p:MPI_Testany(count=%d, req_array=%p, index=%p, flag=%p, status=%p) failed +**mpi_waitall %d %p %p:MPI_Waitall(count=%d, req_array=%p, status_array=%p) failed +**mpi_testall %d %p %p %p:MPI_Testall(count=%d, req_array=%p, flag=%p, status_array=%p) failed +**mpi_waitsome %d %p %p %p %p:MPI_Waitsome(count=%d, req_array=%p, out_count=%p, indices=%p, status_array=%p) failed +**mpi_testsome %d %p %p %p %p:MPI_Testsome(count=%d, req_array=%p, out_count=%p, indices=%p, status_array=%p) failed +**mpi_iprobe %i %t %C %p %p:MPI_Iprobe(src=%i, tag=%t, %C, flag=%p, status=%p) failed +**mpi_probe %i %t %C %p:MPI_Probe(src=%i, tag=%t, %C, status=%p) failed +**mpi_improbe %i %t %C %p %p %p:MPI_Improbe(src=%i, tag=%t, %C, flag=%p, message=%p, status=%p) failed +**mpi_mprobe %i %t %C %p %p:MPI_Mprobe(src=%i, tag=%t, %C, message=%p, status=%p) failed +**mpi_mrecv %p %d %D %p %p:MPI_Mrecv(buf=%p, count=%d, %D, message=%p, status=%p) failed +**mpi_imrecv %p %d %D %p %p:MPI_Imrecv(buf=%p, count=%d, %D, message=%p, request=%p) failed +**mpi_cancel %p:MPI_Cancel(request=%p) failed +**mpi_test_cancelled %p %p:MPI_Test_cancelled(status=%p, flag=%p) failed +**mpi_send_init %p %d %D %i %t %C %p:MPI_Send_init(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_bsend_init %p %d %D %i %t %C %p:MPI_Bsend_init(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_ssend_init %p %d %D %i %t %C %p:MPI_Ssend_init(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_rsend_init %p %d %D %i %t %C %p:MPI_Rsend_init(buf=%p, count=%d, %D, dest=%i, tag=%t, %C, request=%p) failed +**mpi_recv_init %p %d %D %i %t %C %p:MPI_Recv_init(buf=%p, count=%d, %D, src=%i, tag=%t, %C, request=%p) failed +**mpi_start %p:MPI_Start(request=%p) failed +**mpi_startall %d %p:MPI_Startall(count=%d, req_array=%p) failed +**mpi_sendrecv %p %d %D %i %t %p %d %D %i %t %C %p:MPI_Sendrecv(sbuf=%p, scount=%d, %D, dest=%i, stag=%t, rbuf=%p, rcount=%d, %D, src=%i, rtag=%t, %C, status=%p) failed +**mpi_sendrecv_replace %p %d %D %i %t %i %t %C %p:MPI_Sendrecv_replace(buf=%p, count=%d, %D, dest=%i, stag=%t, src=%i, rtag=%t, %C, status=%p) failed +**mpi_type_contiguous %d %D %p:MPI_Type_contiguous(count=%d, %D, new_type_p=%p) failed +**mpi_type_vector %d %d %d %D %p:MPI_Type_vector(count=%d, blocklength=%d, stride=%d, %D, new_type_p=%p) failed +**mpi_type_indexed %d %p %p %D %p:MPI_Type_indexed(count=%d, blocklens=%p, indices=%p, %D, new_type_p=%p) failed +**mpi_type_size %D %p:MPI_Type_size(%D, size=%p) failed +**mpi_type_size_x %D %p:MPI_Type_size_x(%D, size=%p) failed +**mpi_type_commit %p:MPI_Type_commit(datatype_p=%p) failed +**mpi_type_free %p:MPI_Type_free(datatype_p=%p) failed +**mpi_get_elements %p %D %p:MPI_Get_elements(status=%p, %D, count=%p) failed +**mpi_get_elements_x %p %D %p:MPI_Get_elements_x(status=%p, %D, count=%p) failed +**mpi_pack %p %d %D %p %d %p %C:MPI_Pack(inbuf=%p, incount=%d, %D, outbuf=%p, outcount=%d, position=%p, %C) failed +**mpi_unpack %p %d %p %p %d %D %C:MPI_Unpack(inbuf=%p, insize=%d, position=%p, outbuf=%p, outcount=%d, %D, %C) failed +**mpi_pack_size %d %D %C %p:MPI_Pack_size(count=%d, %D, %C, size=%p) failed +**mpi_barrier %C:MPI_Barrier(%C) failed +**mpi_bcast %p %d %D %d %C:MPI_Bcast(buf=%p, count=%d, %D, root=%d, %C) failed +**mpi_gather %p %d %D %p %d %D %d %C:MPI_Gather(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, root=%d, %C) failed +**mpi_gatherv %p %d %D %p %p %p %D %d %C:MPI_Gatherv failed(sbuf=%p, scount=%d, %D, rbuf=%p, rcnts=%p, displs=%p, %D, root=%d, %C) failed +**mpi_scatter %p %d %D %p %d %D %d %C:MPI_Scatter(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, root=%d, %C) failed +**mpi_scatterv %p %p %p %D %p %d %D %d %C:MPI_Scatterv(sbuf=%p, scnts=%p, displs=%p, %D, rbuf=%p, rcount=%d, %D, root=%d, %C) failed +**mpi_allgather %p %d %D %p %d %D %C:MPI_Allgather(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, %C) failed +**mpi_allgatherv %p %d %D %p %p %p %D %C:MPI_Allgatherv(sbuf=%p, scount=%d, %D, rbuf=%p, rcounts=%p, displs=%p, %D, %C) failed +**mpi_alltoall %p %d %D %p %d %D %C:MPI_Alltoall(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, %C) failed +**mpi_alltoallv %p %p %p %D %p %p %p %D %C:MPI_Alltoallv(sbuf=%p, scnts=%p, sdispls=%p, %D, rbuf=%p, rcnts=%p, rdispls=%p, %D, %C) failed +**mpi_reduce %p %p %d %D %O %d %C:MPI_Reduce(sbuf=%p, rbuf=%p, count=%d, %D, %O, root=%d, %C) failed +**mpi_reduce_local %p %p %d %D %O:MPI_Reduce_local(inbuf=%p, inoutbuf=%p, count=%p, %D, %O) failed +**mpi_iallgather %p %d %D %p %d %D %C %p:MPI_Iallgather(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, %C, request=%p) failed +**mpi_iallgatherv %p %d %D %p %p %p %D %C %p:MPI_Iallgatherv(sbuf=%p, scount=%d, %D, rbuf=%p, rcounts=%p, displs=%p, %D, %C, request=%p) failed +**mpi_iallreduce %p %p %d %D %O %C %p:MPI_Iallreduce(sbuf=%p, rbuf=%p, count=%d, %D, %O, %C, request=%p) failed +**mpi_ialltoall %p %d %D %p %d %D %C %p:MPI_Ialltoall(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, %C, request=%p) failed +**mpi_ialltoallv %p %p %p %D %p %p %p %D %C %p:MPI_Ialltoallv(sbuf=%p, scnts=%p, sdispls=%p, %D, rbuf=%p, rcnts=%p, rdispls=%p, %D, %C, request=%p) failed +**mpi_ialltoallw %p %p %p %p %p %p %p %p %C %p:MPI_Ialltoallw(sbuf=%p, scnts=%p, sdispls=%p, stypes=%p, rbuf=%p, rcnts=%p, rdispls=%p, rtypes=%p, %C, request=%p) failed +**mpi_ibarrier %C %p:MPI_Ibarrier(%C, request=%p) failed +**mpi_ibcast %p %d %D %d %C %p:MPI_Ibcast(buf=%p, count=%d, %D, root=%d, %C, request=%p) failed +**mpi_iexscan %p %p %d %D %O %C %p:MPI_Iexscan(sbuf=%p, rbuf=%p, count=%d, %D, %O, %C, request=%p) failed +**mpi_igather %p %d %D %p %d %D %d %C %p:MPI_Igather(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, root=%d, %C, request=%p) failed +**mpi_igatherv %p %d %D %p %p %p %D %d %C %p:MPI_Igatherv failed(sbuf=%p, scount=%d, %D, rbuf=%p, rcnts=%p, displs=%p, %D, root=%d, %C, request=%p) failed +**mpi_ireduce %p %p %d %D %O %d %C %p:MPI_Ireduce(sbuf=%p, rbuf=%p, count=%d, %D, %O, root=%d, %C, request=%p) failed +**mpi_ireduce_scatter %p %p %p %D %O %C %p:MPI_Ireduce_scatter(sbuf=%p, rbuf=%p, rcnts=%p, %D, %O, %C, request=%p) failed +**mpi_ireduce_scatter_block %p %p %d %D %O %C %p:MPI_Reduce_scatter_block(sbuf=%p, rbuf=%p, rcnt=%d, %D, %O, %C, request=%p) failed +**mpi_iscan %p %p %d %D %O %C %p:MPI_Iscan(sbuf=%p, rbuf=%p, count=%d, %D, %O, %C, request=%p) failed +**mpi_iscatter %p %d %D %p %d %D %d %C %p:MPI_Iscatter(sbuf=%p, scount=%d, %D, rbuf=%p, rcount=%d, %D, root=%d, %C, request=%p) failed +**mpi_iscatterv %p %p %p %D %p %d %D %d %C %p:MPI_Iscatterv(sbuf=%p, scnts=%p, displs=%p, %D, rbuf=%p, rcount=%d, %D, root=%d, %C, request=%p) failed +**mpi_op_commutative %O:MPI_Op_commutative(%O) failed +**mpi_op_create %p %d %p:MPI_Op_create(fn=%p, commute=%d, op=%p) failed +**mpi_op_free %p:MPI_Op_free(op=%p) failed +**mpi_allreduce %p %p %d %D %O %C:MPI_Allreduce(sbuf=%p, rbuf=%p, count=%d, %D, %O, %C) failed +**mpi_reduce_scatter %p %p %p %D %O %C:MPI_Reduce_scatter(sbuf=%p, rbuf=%p, rcnts=%p, %D, %O, %C) failed +**mpi_reduce_scatter_block %p %p %d %D %O %C:MPI_Reduce_scatter_block(sbuf=%p, rbuf=%p, rcnt=%d, %D, %O, %C) failed +**mpi_scan %p %p %d %D %O %C:MPI_Scan(sbuf=%p, rbuf=%p, count=%d, %D, %O, %C) failed +**mpi_group_size %G %p:MPI_Group_size(%G, size=%p) failed +**mpi_group_rank %G %p:MPI_Group_rank(%G, rank=%p) failed +**mpi_group_translate_ranks %G %d %p %G %p:MPI_Group_translate_ranks(%G, n=%d, ranks1=%p, %G, ranks2=%p) failed +**mpi_group_compare %G %G %p:MPI_Group_compare(%G, %G, result=%p) failed +**mpi_comm_group %C %p:MPI_Comm_group(%C, group=%p) failed +**mpi_group_union %G %G %p:MPI_Group_union(%G, %G, new_group=%p) failed +**mpi_group_intersection %G %G %p:MPI_Group_intersection(%G, %G, new_group=%p) failed +**mpi_group_difference %G %G %p:MPI_Group_difference(%G, %G, new_group=%p) failed +**mpi_group_incl %G %d %p %p:MPI_Group_incl(%G, n=%d, ranks=%p, new_group=%p) failed +**mpi_group_excl %G %d %p %p:MPI_Group_excl(%G, n=%d, ranks=%p, new_group=%p) failed +**mpi_group_range_incl %G %d %p %p:MPI_Group_range_incl(%G, n=%d, ranges=%p, new_group=%p) failed +**mpi_group_range_excl %G %d %p %p:MPI_Group_range_excl(%G, n=%d, ranges=%p, new_group=%p) failed +**mpi_group_free %p:MPI_Group_free(group=%p) failed +**mpi_comm_size %C %p:MPI_Comm_size(%C, size=%p) failed +**mpi_comm_rank %C %p:MPI_Comm_rank(%C, rank=%p) failed +**mpi_comm_compare %C %C %p:MPI_Comm_compare(%C, %C, result=%p) failed +**mpi_comm_dup %C %p:MPI_Comm_dup(%C, new_comm=%p) failed +**mpi_comm_create %C %G %p:MPI_Comm_create(%C, %G, new_comm=%p) failed +**mpi_comm_split %C %d %d %p:MPI_Comm_split(%C, color=%d, key=%d, new_comm=%p) failed +**mpi_comm_split_type %C %d %d %I %p:MPI_Comm_split_type(%C, split_type=%d, key=%d, info=%I new_comm=%p) failed +**mpi_comm_free %p:MPI_Comm_free(comm=%p) failed +**mpi_comm_test_inter %C %p:MPI_Comm_test_inter(%C, flag=%p) failed +**mpi_comm_remote_size %C %p:MPI_Comm_remote_size(%C, size=%p) failed +**mpi_comm_remote_group %C %p:MPI_Comm_remote_group(%C, group=%p) failed +**mpi_intercomm_create %C %d %C %d %d %p:MPI_Intercomm_create(%C, local_leader=%d, %C, remote_leader=%d, tag=%d, newintercomm=%p) failed +**mpi_intercomm_merge %C %d %p:MPI_Intercomm_merge(%C, high=%d, newintracomm=%p) failed +**mpi_topo_test %C %p:MPI_Topo_test(%C, topo_type=%p) failed +**mpi_cart_create %C %d %p %p %d %p:MPI_Cart_create(%C, ndims=%d, dims=%p, periods=%p, reorder=%d, comm_cart=%p) failed +**mpi_dims_create %d %d %p:MPI_Dims_create(nnodes=%d, ndims=%d, dims=%p) failed +**mpi_graph_create %C %d %p %p %d %p:MPI_Graph_create(%C, nnodes=%d, index=%p, edges=%p, reorder=%d, comm_graph=%p) failed +**mpi_graphdims_get %C %p %p:MPI_Graphdims_get(%C, nnodes=%p, nedges=%p) failed +**mpi_graph_get %C %d %d %p %p:MPI_Graph_get(%C, maxindex=%d, maxedges=%d, index=%p, edges=%p) failed +**mpi_cartdim_get %C %p:MPI_Cartdim_get(%C, ndims=%p) failed +**mpi_cart_get %C %d %p %p %p:MPI_Cart_get(%C, maxdims=%d, dims=%p, periods=%p, coords=%p) failed +**mpi_cart_rank %C %p %p:MPI_Cart_rank(%C, coords=%p, rank=%p) failed +**mpi_cart_coords %C %d %d %p:MPI_Cart_coords(%C, rank=%d, maxdims=%d, coords=%p) failed +**mpi_graph_neighbors_count %C %d %p:MPI_Graph_neighbors_count(%C, rank=%d, nneighbors=%p) failed +**mpi_graph_neighbors %C %d %d %p:MPI_Graph_neighbors(%C, rank=%d, maxneighbors=%d, neighbors=%p) failed +**mpi_cart_shift %C %d %d %p %p:MPI_Cart_shift(%C, direction=%d, displ=%d, source=%p, dest=%p) failed +**mpi_cart_sub %C %p %p:MPI_Cart_sub(%C, remain_dims=%p, comm_new=%p) failed +**mpi_cart_map %C %d %p %p %p:MPI_Cart_map(%C, ndims=%d, dims=%p, periods=%p, newrank=%p) failed +**mpi_graph_map %C %d %p %p %p:MPI_Graph_map(%C, nnodes=%d, index=%p, edges=%p, newrank=%p) failed +**mpi_dist_graph_neighbors_count %C:MPI_Dist_graph_neighbors_count(%C) failed +**mpi_dist_graph_neighbors %C %d %d:MPI_Dist_graph_neighbors(%C, maxindegree=%d, maxoutdegree=%d) failed +**mpi_dist_graph_create_adjacent %C %d %p %p %d %p %p %d %d:MPI_Dist_graph_create_adjacent(%C, indegree=%d, sources=%p, sourceweights=%p, outdegree=%d, destinations=%p, destweights=%p, info=%d, reorder=%d) failed +**mpi_dist_graph_create %C %d %p %p %p %p %d %d:MPI_Dist_graph_create(%C, n=%d, sources=%p, degrees=%p, destinations=%p, weights=%p, info=%d, reorder=%d) failed +**mpi_get_processor_name %p %p:MPI_Get_processor_name(name=%p, resultlen=%p) failed +**mpi_get_version %p %p:MPI_Get_version(version=%p, subversion=%p) failed +**mpi_get_library_version %p %p:MPI_Get_library_version(version=%p, resultlen=%p) failed +**mpi_errhandler_free %p:MPI_Errhandler_free(errhandler=%p) failed +**mpi_error_string %d %s %p:MPI_Error_string(errorcode=%d, string=%s, resultlen=%p) failed +**mpi_error_class %d %p:MPI_Error_class(errorcode=%d, errorclass=%p) failed +**mpi_init %p %p:MPI_Init(argc_p=%p, argv_p=%p) failed +**mpi_finalize:MPI_Finalize failed +**mpi_initialized %p:MPI_Initialized(flag=%p) failed +**mpi_abort %C %d:MPI_Abort(%C, errorcode=%d) failed +**mpi_close_port %s:MPI_Close_port(port=\"%s\") failed +**mpi_comm_accept %s %I %d %C %p:MPI_Comm_accept(port=\"%s\", %I, root=%d, %C, newcomm=%p) failed +**mpi_comm_connect %s %I %d %C %p:MPI_Comm_connect(port=\"%s\", %I, root=%d, %C, newcomm=%p) failed +**mpi_comm_disconnect %C:MPI_Comm_disconnect(comm=%C) failed +**mpi_comm_get_parent %p:MPI_Comm_get_parent(comm=%p) failed +**mpi_comm_join %d %p:MPI_Comm_join(fd=%d, intercomm=%p) failed +**mpi_comm_spawn %s %p %d %I %d %C %p %p:MPI_Comm_spawn(cmd=\"%s\", argv=%p, maxprocs=%d, %I, root=%d, %C, intercomm=%p, errors=%p) failed +**mpi_comm_spawn_multiple %d %p %p %p %p %d %C %p %p:MPI_Comm_spawn_multiple(count=%d, cmds=%p, argvs=%p, maxprocs=%p, infos=%p, root=%d, %C, intercomm=%p, errors=%p) failed +**mpi_lookup_name %s %I %p:MPI_Lookup_name(service=\"%s\", %I, port=%p) failed +**mpi_open_port %I %p:MPI_Open_port(%I, port=%p) failed +**mpi_publish_name %s %I %s:MPI_Publish_name(service=\"%s\", %I, port=\"%s\") failed +**mpi_unpublish_name %s %I %s:MPI_Unpublish_name(service=\"%s\", %I, port=\"%s\") failed +**mpi_accumulate %p %d %D %d %d %d %D %O %W:MPI_Accumulate(origin_addr=%p, origin_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %O, %W) failed +**mpi_raccumulate %p %d %D %d %d %d %D %O %W %p:MPI_Raccumulate(origin_addr=%p, origin_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %O, %W, request=%p) failed +**mpi_get %p %d %D %d %d %d %D %W:MPI_Get(origin_addr=%p, origin_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %W) failed +**mpi_rget %p %d %D %d %d %d %D %W %p:MPI_Rget(origin_addr=%p, origin_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %W, request=%p) failed +**mpi_put %p %d %D %d %d %d %D %W:MPI_Put(origin_addr=%p, origin_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %W) failed +**mpi_rput %p %d %D %d %d %d %D %W %p:MPI_Rput(origin_addr=%p, origin_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %W, request=%p) failed +**mpi_get_accumulate %p %d %D %p %d %D %d %d %d %D %O %W:MPI_Get_accumulate(origin_addr=%p, origin_count=%d, %D, result_addr=%p, result_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %O, %W) failed +**mpi_rget_accumulate %p %d %D %p %d %D %d %d %d %D %O %W %p:MPI_Rget_accumulate(origin_addr=%p, origin_count=%d, %D, result_addr=%p, result_count=%d, %D, target_rank=%d, target_disp=%d, target_count=%d, %D, %O, %W, request=%p) failed +**mpi_fetch_and_op %p %p %D %d %d %O %W:MPI_Fetch_and_op(origin_addr=%p, result_addr=%p, %D, target_rank=%d, target_disp=%d, %O, %W) failed +**mpi_compare_and_swap %p %p %p %D %d %d %W:MPI_Compare_and_swap(origin_addr=%p, compare_addr=%p, result_addr=%p, %D, target_rank=%d, target_disp=%d, %W) failed +**mpi_win_complete %W:MPI_Win_complete(%W) failed +**mpi_win_create %p %d %d %I %C %p:MPI_Win_create(base=%p, size=%d, disp_unit=%d, %I, %C, win=%p) failed +**mpi_win_allocate %d %d %I %C %p %p:MPI_Win_allocate(size=%d, disp_unit=%d, %I, %C, baseptr=%p, win=%p) failed +**mpi_win_allocate_shared %d %d %I %C %p %p:MPI_Win_allocate_shared(size=%d, disp_unit=%d, %I, %C, baseptr=%p, win=%p) failed +**mpi_win_create_dynamic %I %C %p:MPI_Win_create(%I, %C, win=%p) failed +**mpi_win_shared_query %p %d %d %d %p:MPI_Win_shared_query(win=%p, rank=%d, size=%d, disp_unit=%d, baseptr=%p) failed +**mpi_win_fence %A %W:MPI_Win_fence(%A, %W) failed +**mpi_win_free %p:MPI_Win_free(win=%p) failed +**mpi_win_get_group %W %p:MPI_Win_get_group(%W, group=%p) failed +**mpi_win_lock %d %d %A %W:MPI_Win_lock(lock_type=%d, rank=%d, %A, %W) failed +**mpi_win_lock_all %A %W:MPI_Win_lock_all(%A, %W) failed +**mpi_win_post %G %A %W:MPI_Win_post(%G, %A, %W) failed +**mpi_win_start %G %A %W:MPI_Win_start(%G, %A, %W) failed +**mpi_win_test %W %p:MPI_Win_test(%W, flag=%p) failed +**mpi_win_unlock %d %W:MPI_Win_unlock(rank=%d, %W) failed +**mpi_win_unlock_all %W:MPI_Win_unlock_all(%W) failed +**mpi_win_flush %d %W:MPI_Win_flush(rank=%d, %W) failed +**mpi_win_flush_all %W:MPI_Win_flush_all(%W) failed +**mpi_win_flush_local %d %W:MPI_Win_flush_local(rank=%d, %W) failed +**mpi_win_flush_local_all %W:MPI_Win_flush_local_all(%W) failed +**mpi_win_sync %W:MPI_Win_sync(%W) failed +**mpi_win_wait %W:MPI_Win_wait(%W) failed +**mpi_win_attach %W %p %d:MPI_Win_attach(win=%W, base=%p, size=%d) failed +**mpi_win_detach %W %p:MPI_Win_detach(win=%W, base=%p) failed +**mpi_alltoallw %p %p %p %p %p %p %p %p %C:MPI_Alltoallw(sbuf=%p, scnts=%p, sdispls=%p, stypes=%p, rbuf=%p, rcnts=%p, rdispls=%p, rtypes=%p, %C) failed +**mpi_exscan %p %p %d %D %O %C:MPI_Exscan(sbuf=%p, rbuf=%p, count=%d, %D, %O, %C) failed +**mpi_add_error_class %p:MPI_Add_error_class(errorclass=%p) failed +**mpi_add_error_code %d %p:MPI_Add_error_code(errorclass=%d, errorcode=%p) failed +**mpi_add_error_string %d %s:MPI_Add_error_string(code=%d, str=\"%s\") failed +**mpi_comm_call_errhandler %C %d:MPI_Comm_call_errhandler(%C, errorcode=%d) failed +**mpi_comm_create_keyval %p %p %p %p:MPI_Comm_create_keyval(comm_copy_attr_fn=%p, comm_delete_attr_fn=%p, comm_keyval=%p, extra_state=%p) failed +**mpi_comm_delete_attr %C %d:MPI_Comm_delete_attr(%C, comm_keyval=%d) failed +**mpi_comm_free_keyval %p:MPI_Comm_free_keyval(comm_keyval=%p) failed +**mpi_comm_get_attr %C %d %p %p:MPI_Comm_get_attr(%C, comm_keyval=%d, attribute_val=%p, flag=%p) failed +**mpi_comm_get_name %C %p %p:MPI_Comm_get_name(%C, comm_name=%p, resultlen=%p) failed +**mpi_comm_set_attr %C %d %p:MPI_Comm_set_attr(%C, comm_keyval=%d, attribute_val=%p) failed +**mpi_comm_set_name %C %s:MPI_Comm_set_name(%C, comm_name=%s) failed +**mpi_grequest_complete %R:MPI_Grequest_complete(%R) failed +**mpi_grequest_start %p %p %p %p %p:MPI_Grequest_start(query_fn=%p, free_fn=%p, cancel_fn=%p, extra_state=%p, request=%p) failed +**mpi_init_thread %p %p %d %p:MPI_Init_thread(argc_p=%p, argv_p=%p, required=%d, provided=%p) +**mpi_is_thread_main %p:MPI_Is_thread_main(flag=%p) failed +**mpi_query_thread %p:MPI_Query_thread(provided=%p) failed +**mpi_status_set_cancelled %p %d:MPI_Status_set_cancelled(status=%p, flag=%d) failed +**mpi_status_set_elements %p %D %d:MPI_Status_set_elements(status=%p, %D, count=%d) failed +**mpi_status_set_elements_x %p %D %l:MPI_Status_set_elements_x(status=%p, %D, count=%l) failed +**mpi_type_create_keyval %p %p %p %p:MPI_Type_create_keyval(type_copy_attr_fn=%p, type_delete_attr_fn=%p, type_keyval=%p, extra_state=%p) failed +**mpi_type_delete_attr %D %d:MPI_Type_delete_attr(%D, type_keyval=%d) failed +**mpi_type_dup %D %p:MPI_Type_dup(%D, newtype=%p) failed +**mpi_type_free_keyval %p:MPI_Type_free_keyval(type_keyval=%p) failed +**mpi_type_get_attr %D %d %p %p:MPI_Type_get_attr(%D, type_keyval=%d, attribute_val=%p, flag=%p) failed +**mpi_type_get_contents %D %d %d %d %p %p %p:MPI_Type_get_contents(%D, max_integers=%d, max_addresses=%d, max_datatypes=%d, array_of_integers=%p, array_of_addresses=%p, array_of_datatypes=%p) failed +**mpi_type_get_envelope %D %p %p %p %p:MPI_Type_get_envelope(%D, num_integers=%p, num_addresses=%p, num_datatypes=%p, combiner=%p) failed +**mpi_type_get_name %D %p %p:MPI_Type_get_name(%D, type_name=%p, resultlen=%p) failed +**mpi_type_set_attr %D %d %p:MPI_Type_set_attr(%D, type_keyval=%d, attribute_val=%p) failed +**mpi_type_set_name %D %s:MPI_Type_set_name(%D, type_name=%s) failed +**mpi_type_match_size %d %d %p:MPI_Type_match_size(typeclass=%d, size=%d, datatype=%p) failed +**mpi_win_call_errhandler %W %d:MPI_Win_call_errhandler(%W, errorcode=%d) failed +**mpi_win_create_keyval %p %p %p %p:MPI_Win_create_keyval(win_copy_attr_fn=%p, win_delete_attr_fn=%p, win_keyval=%p, extra_state=%p) failed +**mpi_win_delete_attr %W %d:MPI_Win_delete_attr(%W, win_keyval=%d) failed +**mpi_win_free_keyval %p:MPI_Win_free_keyval(win_keyval=%p) failed +**mpi_win_get_attr %W %d %p %p:MPI_Win_get_attr(%W, win_keyval=%d, attribute_val=%p, flag=%p) failed +**mpi_win_get_name %W %p %p:MPI_Win_get_name(%W, win_name=%p, resultlen=%p) failed +**mpi_win_set_attr %W %d %p:MPI_Win_set_attr(%W, win_keyval=%d, attribute_val=%p) failed +**mpi_win_set_name %W %s:MPI_Win_set_name(%W, win_name=%s) failed +**mpi_alloc_mem %p %I %p:MPI_Alloc_mem(size=%p, %I, baseptr=%p) failed +**mpi_comm_create_errhandler %p %p:MPI_Comm_create_errhandler(function=%p, errhandler=%p) failed +**mpi_comm_get_errhandler %C %p:MPI_Comm_get_errhandler(%C, errhandler=%p) failed +**mpi_comm_set_errhandler %C %E:MPI_Comm_set_errhandler(%C, %E) failed +**mpi_file_create_errhandler %p %p:MPI_File_create_errhandler(function=%p, errhandler=%p) failed +**mpi_file_get_errhandler %F %p:MPI_File_get_errhandler(%F, errhandler=%p) failed +**mpi_file_set_errhandler %F %E:MPI_File_set_errhandler(%F, %E) failed +**mpi_finalized %p:MPI_Finalized(flag=%p) failed +**mpi_get_address %p %p:MPI_Get_address(location=%p, address=%p) failed +**mpi_info_create %p:MPI_Info_create(info=%p) failed +**mpi_info_delete %I %s:MPI_Info_delete(%I, key=%s) failed +**mpi_info_dup %I %p:MPI_Info_dup(%I, newinfo=%p) failed +**mpi_info_free %p:MPI_Info_free(info=%p) failed +**mpi_info_get %I %s %d %p %p:MPI_Info_get(%I, key=%s, valuelen=%d, value=%p, flag=%p) failed +**mpi_info_get_nkeys %I %p:MPI_Info_get_nkeys(%I, nkeys=%p) failed +**mpi_info_get_nthkey %I %d %p:MPI_Info_get_nthkey(%I, n=%d, key=%p) failed +**mpi_info_get_valuelen %I %s %p %p:MPI_Info_get_valuelen(%I, key=%s, valuelen=%p, flag=%p) failed +**mpi_info_set %I %s %s:MPI_Info_set(%I, key=%s, value=%s) failed +**mpi_pack_external %s %p %d %D %p %d %p:MPI_Pack_external(datarep=%s, inbuf=%p, incount=%d, %D, outbuf=%p, outcount=%d, position=%p) failed +**mpi_pack_external_size %s %d %D %p:MPI_Pack_external_size(datarep=%s, incount=%d, %D, size=%p) failed +**mpi_request_get_status %R %p %p:MPI_Request_get_status(%R, flag=%p, status=%p) failed +**mpi_type_create_darray %d %d %d %p %p %p %p %d %D %p:MPI_Type_create_darray(size=%d, rank=%d, ndims=%d, array_of_gsizes=%p, array_of_distribs=%p, array_of_dargs=%p, array_of_psizes=%p, order=%d, %D, newtype=%p) failed +**mpi_type_create_hindexed %d %p %p %D %p:MPI_Type_create_hindexed(count=%d, array_of_blocklengths=%p, array_of_displacements=%p, %D, newtype=%p) failed +**mpi_type_create_hindexed_block %d %d %p %D %p:MPI_Type_create_hindexed_block(count=%d, blocklength=%d, array_of_displacements=%p, %D, newtype=%p) failed +**mpi_type_create_hvector %d %d %d %D %p:MPI_Type_create_hvector(count=%d, blocklength=%d, stride=%d, %D, newtype=%p) failed +**mpi_type_create_indexed_block %d %d %p %D %p:MPI_Type_create_indexed_block(count=%d, blocklength=%d, array_of_displacements=%p, %D, newtype=%p) failed +**mpi_type_create_resized %D %d %d %p:MPI_Type_create_resized(%D, lb=%d, extent=%d, newtype=%p) failed +**mpi_type_create_struct %d %p %p %p %p:MPI_Type_create_struct(count=%d, array_of_blocklengths=%p, array_of_displacements=%p, array_of_types=%p, newtype=%p) failed +**mpi_type_create_subarray %d %p %p %p %d %D %p:MPI_Type_create_subarray(ndims=%d, array_of_sizes=%p, array_of_subsizes=%p, array_of_starts=%p, order=%d, %D, newtype=%p) failed +**mpi_type_get_extent %D %p %p:MPI_Type_get_extent(%D, lb=%p, extent=%p) failed +**mpi_type_get_extent_x %D %p %p:MPI_Type_get_extent_x(%D, lb=%p, extent=%p) failed +**mpi_type_get_true_extent %D %p %p:MPI_Type_get_true_extent(%D, lb=%p, true_extent=%p) failed +**mpi_type_get_true_extent_x %D %p %p:MPI_Type_get_true_extent_x(%D, lb=%p, true_extent=%p) failed +**mpi_unpack_external %s %p %d %p %p %d %D:MPI_Unpack_external(datarep=%s, inbuf=%p, insize=%d, position=%p, outbuf=%p, outcount=%d, %D) failed +**mpi_win_create_errhandler %p %p:MPI_Win_create_errhandler(function=%p, errhandler=%p) failed +**mpi_win_get_errhandler %W %p:MPI_Win_get_errhandler(%W, errhandler=%p) failed +**mpi_win_set_errhandler %W %E:MPI_Win_set_errhandler(%W, %E) failed +**mpi_register_datarep %s %p %p %p %p:MPI_Register_datarep(datarep=%s, read_conversion_fn=%p, write_conversion_fn=%p, dtype_file_extent_fn=%p, extra_state=%p) failed + +# +# msmpi functions +# +**msmpi_req_set_apc %R %p %p:MSMPI_Request_set_apc(%R, callback_fn=%p, callback_status=%p) failed +**msmpi_waitsome_interruptible %d %p %p %p %p:MSMPI_Waitsome_interruptible(count=%d, req_array=%p, out_count=%p, indices=%p, status_array=%p) failed + +# +# Compression +# +**unableToLoadDLL: Unable to load a dynamically loadable library +**failureGetProcAddress %d:Call to GetProcAddress failed (errno %d) +**failureCompressionWorkSpace %d:Call to RtlGetCompressionWorkSpaceSize failed (errno %d) +**compressionMinimum %d %d:The provided compression threshold of %d was too small. \ +Try again with a threshold no less than %d +**decompressFailure %d:Decompression of a message failed (errno %d) +**nullPayloadRequest:The initial clear to send request has an invalid sender request id. + +# +# SMP Awareness +# +**frequency:This machine does not support high frequency performance counters. +**measurementfailed:Measurement of collective failed. +**nodeids:Unable to read node ids. +**badenv %s:Invalid value for %s environment variable. + + +# +# Parsing Util +# +**rangedup %s %d:The specified range %s contains duplicate entries; rank %d \ + appeared more than once +**invalidrange %s: The specified range %s is invalid + +# +# Dynamic Process related +# +**dynamicStartFailedEnv:The dynamic server failed to start. Invalid environment variable value given for MSMPI_ACCEPT_PORT. +**dynamicStartFailed %d:The dynamic server failed to start with status %d. +**dynamicNewPortFailed:The dynamic server failed to open a new port. +**dynamicInvalidPort %s:No server is accepting connection on port %s. +**dynamicInvalidBindingString %s:The specified binding %s is invalid. +**dynamicBindingFromStringFailed %s %d:Failed to create RPC binding from the specified port string %s (errno %d). +**dynamicBindingSetAuthFailed %d:Failed to set authentication on the RPC binding (errno %d). +**dynamicTimedOut:The accept server is too busy. +**dynamicCreateContextFailed %d:Failed to establish context with the server (errno %d). +**dynamicInternalFailure:Internal error while trying to collect process groups information from the local communicator. +**dynamicInitializeAsyncFailed %d:Failed to initialize Asynchronous RPC (errno %d). +**dynamicWaitForAsyncFailed %d:Failed to initialize asynchronous RPC (errno %d). +**dynamicCompleteAsyncFailed %d:Failed to complete asynchronous RPC (errno %d). +**dynamicExchangeInfoFailed %d:Failed to exchange information with the Accept Server (errno %d). +**dynamicRootConnectAcceptFailed:The root of this operation indicated that it experienced an error. +**dynamicClientRPCFailed:An error on the client side resulted in the cancellation of the RPC call. + +# +# Print environment block +# +**badfile %s:The requested file could not be opened to write the environment block. %s. +**envexpand:The environment variables in MSMPI_PRINT_ENVIRONMENT_BLOCK_FILE could not be expanded. +**getenvfailed:Unable to get the environment block for the process. +**freeenvfailed:Unable to free the environment block for the process. + +# +# Casting values to type int results in truncation +# +**packtruncate:The size of the packed data was larger than could be represented using an integer. +**unpacktruncate:The size of the unpacked data was larger than could be represented using an integer. + +# ----------------------------------------------------------------------------- +# The following names are defined but not used (see the -careful option +# for extracterrmsgs) (still to do: move the undefined names here) diff --git a/src/mpi/common/errutil.cpp b/src/mpi/common/errutil.cpp new file mode 100644 index 0000000..740aaaa --- /dev/null +++ b/src/mpi/common/errutil.cpp @@ -0,0 +1,732 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ + +#include "precomp.h" + +/* defmsg is generated automatically from the source files and contains + all of the error messages */ +#include "defmsg.h" + +#include "mpidump.h" +#include +#include + + +/* + * Instance-specific error messages are stored in a ring. The elements of this + * ring are MPIR_Err_msg_t structures, which contain the following fields: + * id - this is used to check that the entry is valid; it is computed from + * the error code and location in the ring. The routine + * ErrcodeToId( errcode, &id ) is used to extract the id from an + * error code and + * ErrcodeCreateID( class, generic, msg, &id, &seq ) is used to + * create the id from an error class, generic index, and message + * string. The "seq" field is inserted into the error code as a + * check. + * + * prev_error - The full MPI error code of the previous error attached + * to this list of errors, or MPI_SUCCESSS (which has value 0). + * This is the last error code, not the index in the ring of the last + * error code. That's the right choice, because we want to ensure + * that the value is valid if the ring overflows. In addition, + * we allow this to be an error CLASS (one of the predefined MPI + * error classes). This is particularly important for + * MPI_ERR_IN_STATUS, which may be returned as a valid error code. + * (classes are valid error codes). + * + * use_user_error_code and user_error_code - Used to handle a few cases + * in MPI where a user-provided routine returns an error code; + * this allows us to provide information about the chain of + * routines that were involved, while returning the users prefered + * error value to the users environment. + * + * location - A string that indicates what function and line number + * where the error code was set. + * + * msg - A message about the error. This may be instance-specific (e.g., + * it may have been created at the time the error was detected with + * information about the parameters that caused the error). + * + * Note that both location and msg are defined as length MAX_xxx+1. This + * isn't really necessary (at least for msg), since the MPI standard + * requires that MAX_MPI_ERROR_STRING include the space for the trailing null, + * but using the extra byte makes the code a little simpler. + * + * The "id" value is used to keep a sort of "checkvalue" to ensure that the + + * error code that points at this message is in fact for this particular + * message. This is used to handle the unlikely but possible situation where + * so many error messages are generated that the ring is overlapped. + * + * The message arrays are preallocated to ensure that there is space for these + * messages when an error occurs. One variation would be to allow these + * to be dynamically allocated, but it is probably better to either preallocate + * these or turn off all error message generation (which will eliminate these + * arrays). + * + * One possible alternative is to use the message ring *only* for instance + * messages and use the predefined messages in-place for the generic + * messages. This approach is used to provide uniform handling of all + * error messages. + */ + +#define MAX_LOCATION_LEN 63 + +/* The maximum error string in this case may be a multi-line message, + constructed from multiple entries in the error message ring. The + individual ring messages should be shorter than MPI_MAX_ERROR_STRING, + perhaps as small a 256. We define a separate value for the error lines. + */ +#define MPIR_MAX_ERROR_LINE 512 + +/* See the description above for the fields in this structure */ +struct MPIR_Err_msg_t +{ + int id; + int prev_error; + + int use_user_error_code; + int user_error_code; + + char location[MAX_LOCATION_LEN+1]; + char msg[MPIR_MAX_ERROR_LINE+1]; +}; + +static MPIR_Err_msg_t ErrorRing[128]; +static volatile long error_ring_loc = 0; + +#define GET_RING_INDEX(code) \ + (ERROR_GET_INDEX(code) % _countof(ErrorRing)) + +static MPIR_Err_to_string_fn MPIR_Err_code_to_string; + +void +MPIR_Err_set_dynerr_fn( + _In_ MPIR_Err_to_string_fn fn + ) +{ + MPIU_Assert(MPIR_Err_code_to_string == nullptr); + MPIR_Err_code_to_string = fn; +} + + +/* ------------------------------------------------------------------------- */ +/* The following block of code manages the instance-specific error messages */ +/* ------------------------------------------------------------------------- */ + +#if DBG + +static int +ErrcodeIsValid( + _In_ int errcode + ) +{ + int idx; + + /* If the errcode is a class, then it is valid */ + if (errcode >= 0 && errcode <= MPICH_ERR_LAST_CLASS) + return TRUE; + + /* check for extra bits set. note: dynamic error codes are not valid here */ + if((errcode & ~(ERROR_CLASS_MASK | ERROR_INDEX_MASK | ERROR_FATAL_FLAG)) != ERROR_COD_FLAG) + return FALSE; + + idx = GET_RING_INDEX(errcode); + if (ErrorRing[idx].id != errcode) + return FALSE; + + return TRUE; +} + +#endif // DBG + + +_Post_satisfies_( return != MPI_SUCCESS ) +int +MPIR_Err_get_user_error_code( + _In_ int errcode + ) +{ + int idx; + + /* check for class only error code */ + if(!ERROR_IS_CODE(errcode)) + return errcode; + + /* Can we get a more specific error message */ + idx = GET_RING_INDEX(errcode); + if (ErrorRing[idx].id == errcode && ErrorRing[idx].use_user_error_code) + return ErrorRing[idx].user_error_code; + + return errcode; +} + + +/* + * Given a message string abbreviation (e.g., one that starts "**"), + * return the corresponding index. + */ +static int __cdecl +compare_key_map( + _In_ const void* pv1, + _In_ const void* pv2 + ) +{ + const char* key = (const char*)pv1; + const msgpair* pair = (const msgpair*)pv2; + return strcmp( key, pair->key ); +} + +static int +FindMessageIndex( + _In_z_ const char *msg + ) +{ + const void* p; + p = bsearch( + msg, + errors_map, + _countof(errors_map), + sizeof(errors_map[0]), + compare_key_map + ); + + MPIU_Assert(p != nullptr); + + return (int)((const msgpair*)p - errors_map); +} + + +/* ------------------------------------------------------------------------ */ +/* The following routines create an MPI error code, handling optional, */ +/* instance-specific error message information. There are two key routines:*/ +/* MPIR_Err_create_code - Create the error code; this is the routine used*/ +/* by most routines */ +/* MPIR_Err_create_code_valist - Create the error code; accept a valist */ +/* instead of a variable argument list (this is */ +/* used to allow this routine to be used from */ +/* within another varargs routine) */ +/* ------------------------------------------------------------------------ */ +/* --BEGIN ERROR MACROS-- */ + +_Post_satisfies_( return != MPI_SUCCESS ) +MPI_RESULT +MPIR_Err_create_code( + _In_ int lastcode, + _In_ int fatal, + _In_ int error_class, + _Printf_format_string_ const char specific_msg[], + ... + ) +{ + int rc; + va_list Argp; + va_start(Argp, specific_msg); + __analysis_assert(error_class != 0); + rc = MPIR_Err_create_code_valist( + lastcode, + fatal, + error_class, + specific_msg, + Argp + ); + + __analysis_assume(rc != 0); + va_end(Argp); + return rc; +} + +/* --END ERROR MACROS-- */ + +static int +TakeDump( + _In_ EXCEPTION_POINTERS* exp, + _In_ int dumpMode + ) +{ + MINIDUMP_EXCEPTION_INFORMATION exrParam; + exrParam.ExceptionPointers = exp; + exrParam.ThreadId = GetCurrentThreadId(); + exrParam.ClientPointers = FALSE; + + MINIDUMP_TYPE dumpType; + if( dumpMode >= MsmpiDumpFull ) + { + dumpType = MiniDumpWithFullMemory; + } + else + { + dumpType = MiniDumpNormal; + } + + wchar_t dumpPath[MAX_PATH]; + DWORD err = MPIU_Getenv( L"MSMPI_DUMP_PATH", + dumpPath, + _countof( dumpPath ) ); + if( err != NOERROR ) + { + dumpPath[0] = '\0'; + } + + HANDLE tempDumpFile = CreateTempDumpFile( + GetCurrentProcess(), + GetCurrentProcessId(), + dumpType, + dumpPath, + &exrParam + ); + + if( tempDumpFile != INVALID_HANDLE_VALUE ) + { + CreateFinalDumpFile( + tempDumpFile, + env_to_int( L"PMI_RANK", -1, -1 ), + dumpPath, + env_to_int( L"CCP_JOBID", 0, 0 ), + env_to_int( L"CCP_TASKID", 0, 0 ), + env_to_int( L"CCP_TASKINSTANCEID", 0, 0 ) + ); + CloseHandle( tempDumpFile ); + } + return EXCEPTION_CONTINUE_EXECUTION; +} + + +void CreateDumpFileIfConfigured( + _In_ EXCEPTION_POINTERS* exp + ) +{ + enum MSMPI_DUMP_MODE dumpMode = GetDumpMode(); + if (dumpMode != MsmpiDumpNone) + { + TakeDump(exp, dumpMode); + } +} + + +/* + * This is the real routine for generating an error code. It takes + * a va_list so that it can be called by any routine that accepts a + * variable number of arguments. + */ +_Post_satisfies_( return != MPI_SUCCESS ) +MPI_RESULT +MPIR_Err_create_code_valist( + _In_ int lastcode, + _In_ int fatal, + _In_ int error_class, + _Printf_format_string_ const char specific_msg[], + _In_ va_list Argp + ) +{ + int user_error_code = -1; + int specific_idx; + int ring_idx; + long ring_idx_base; + const char* specific_fmt; + char* ring_msg; + + /* Check that lastcode is valid */ +#if DBG + MPIU_Assert(ErrcodeIsValid(lastcode)); +#endif //DBG + MPIU_Assert(specific_msg != nullptr); + + if( IsDebuggerPresent() ) + { + DebugBreak(); + } + + enum MSMPI_DUMP_MODE dumpMode = GetDumpMode(); + if( dumpMode != MsmpiDumpNone && lastcode == MPI_SUCCESS ) + { + __try + { + RaiseException( 0, 0, 0, nullptr ); + } + __except( TakeDump( GetExceptionInformation(), dumpMode ) ) + OACR_WARNING_SUPPRESS(EXCEPT_BLOCK_EMPTY,"mpicr: dump handler") + { + } + } + + if (error_class == MPI_ERR_OTHER) + { + if (ERROR_GET_CLASS(lastcode) != MPI_SUCCESS) + { + /* If the last class is more specific (and is valid), then pass it through */ + error_class = ERROR_GET_CLASS(lastcode); + } + } + + /* Handle special case of MPI_ERR_IN_STATUS. According to the standard, + the code must be equal to the class. See section 3.7.5. + Information on the particular error is in the MPI_ERROR field + of the status. */ + if (error_class == MPI_ERR_IN_STATUS) + return MPI_ERR_IN_STATUS; + + ring_idx_base = ::InterlockedIncrement(&error_ring_loc); + + /* Get the next entry in the ring */ + ring_idx = ring_idx_base % _countof(ErrorRing); + + ring_msg = ErrorRing[ring_idx].msg; + + specific_idx = FindMessageIndex(specific_msg); + specific_fmt = errors_map[specific_idx].fmt; + + // + // CompareString does not check for null terminating character + // when length of string is given explicitly + // + int len = _countof("**user") - 1; + if( MPIU_Strlen( errors_map[specific_idx].key ) >= static_cast(len) && + CompareStringA( LOCALE_INVARIANT, + 0, + errors_map[specific_idx].key, + len, + "**user", + len ) == CSTR_EQUAL ) + { + /* This is a special case. The format is ..., "**userxxx %d", intval); + In this case we must save the user value because we store it explicitly in the ring. + We do this here because we cannot both access the user error code and pass the argp + to vsnprintf_mpi. */ + user_error_code = va_arg(Argp,int); + ErrorRing[ring_idx].use_user_error_code = 1; + ErrorRing[ring_idx].user_error_code = user_error_code; + + // errors_map is generated by a perl script but since its test code isn't compiled + // there is no opportunity to do specifier to type checking. Ideally, testerr.c would + // be included in the project build so oacr could potentially find mismatches + OACR_WARNING_SUPPRESS(PRINTF_FORMAT_STRING_PARAM_NEEDS_REVIEW, "format is determined at runtime"); + MPIU_Snprintf( ring_msg, MPIR_MAX_ERROR_LINE, specific_fmt, user_error_code ); + } + else + { + OACR_WARNING_SUPPRESS(PRINTF_FORMAT_STRING_PARAM_NEEDS_REVIEW, "format is determined at runtime"); + MPIR_Err_vsnprintf_mpi( ring_msg, MPIR_MAX_ERROR_LINE, specific_fmt, Argp ); + + if (ERROR_IS_CODE(lastcode)) + { + int last_ring_idx; + + last_ring_idx = GET_RING_INDEX(lastcode); + if (ErrorRing[last_ring_idx].id == lastcode) + { + if (ErrorRing[last_ring_idx].use_user_error_code) + { + ErrorRing[ring_idx].use_user_error_code = 1; + ErrorRing[ring_idx].user_error_code = ErrorRing[last_ring_idx].user_error_code; + } + } + } + } + + ring_msg[MPIR_MAX_ERROR_LINE] = '\0'; + + /* Set the previous code. */ + ErrorRing[ring_idx].prev_error = lastcode; + ErrorRing[ring_idx].location[0] = '\0'; + + /* Make sure error_index doesn't get so large that it sets the dynamic bit. */ + int error_index = (ring_idx_base << ERROR_INDEX_SHIFT) & ERROR_INDEX_MASK; + + int err_code = error_class | ERROR_COD_FLAG | error_index; + if (fatal || ERROR_IS_FATAL(lastcode)) + { + err_code |= ERROR_FATAL_FLAG; + } + + ErrorRing[ring_idx].id = err_code; + __analysis_assume( err_code != MPI_SUCCESS ); + return err_code; +} + + +/* + * Accessor routines for the predefined messages. These can be + * used by the other routines (such as MPI_Error_string) to + * access the messages in this file, or the messages that may be + * available through any message catalog facility + */ +C_ASSERT(_countof(class_to_index) == MPICH_ERR_LAST_CLASS + 1); + +_Ret_z_ +static const char* +get_class_msg( + _In_ int error_class + ) +{ + if (error_class >= 0 && error_class < _countof(class_to_index)) + { + return errors_map[class_to_index[error_class]].fmt; + } + else + { + return "Unknown error class"; + } +} + +/* Given an error code, print the stack of messages corresponding to this + error code. */ +static void +MPIR_Err_print_stack_string( + _In_ int errcode, + _Out_writes_z_(maxlen) char *str, + _In_ size_t maxlen + ) +{ + size_t len; + const char *str_orig = str; + size_t max_location_len = 0; + int tmp_errcode = errcode; + int error_class; + + /* make sure is not a dynamic error code or a simple error class */ + MPIU_Assert(!ERROR_IS_DYN(errcode)); + MPIU_Assert(ERROR_GET_CLASS(errcode) != errcode); + MPIU_Assert(maxlen > 1); + *str = '\0'; + + + /* Find the longest location string in the stack */ + while (ERROR_IS_CODE(tmp_errcode)) + { + int ring_idx = GET_RING_INDEX(tmp_errcode); + + if (ErrorRing[ring_idx].id != tmp_errcode) + break; + + len = MPIU_Strlen( ErrorRing[ring_idx].location, + _countof(ErrorRing[ring_idx].location) ); + max_location_len = max(max_location_len, len); + tmp_errcode = ErrorRing[ring_idx].prev_error; + } + + max_location_len += 2; /* add space for the ": " */ + + /* print the error stack */ + while (ERROR_IS_CODE(errcode)) + { + size_t nchrs; + + int ring_idx = GET_RING_INDEX(errcode); + + if (ErrorRing[ring_idx].id != errcode) + break; + + len = MPIU_Snprintf(str, maxlen, "%s", ErrorRing[ring_idx].location); + maxlen -= len; + str += len; + + nchrs = max_location_len - + MPIU_Strlen( ErrorRing[ring_idx].location, + _countof(ErrorRing[ring_idx].location) ) - 2; + while (nchrs > 0 && maxlen > 0) + { + *str++ = '.'; + nchrs--; + maxlen--; + } + + len = MPIU_Snprintf(str, maxlen, "%s\n", ErrorRing[ring_idx].msg); + maxlen -= len; + str += len; + + errcode = ErrorRing[ring_idx].prev_error; + } + + /* FIXME: This is wrong. The only way that you can get here without + errcode beign MPI_SUCCESS is if there is an error in the + processing of the error codes. Dropping through into the next + level of code (particularly when that code doesn't check for + valid error codes!) is erroneous */ + if (errcode == MPI_SUCCESS) + { + goto fn_exit; + } + + error_class = ERROR_GET_CLASS(errcode); + + if (error_class <= MPICH_ERR_LAST_CLASS) + { + len = MPIU_Snprintf(str, maxlen, "(unknown)(): %s\n", get_class_msg(error_class)); + maxlen -= len; + str += len; + } + else + { + len = MPIU_Snprintf(str, maxlen, + "Error code contains an invalid class (%d)\n", + error_class); + maxlen -= len; + str += len; + } + +fn_exit: + if (str_orig != str) + { + str--; + *str = '\0'; /* erase the last \n */ + } +} + + +void +MPIR_Err_get_string( + _In_ int errorcode, + _Out_writes_z_(length) char * msg, + _In_ size_t length + ) +{ + size_t len; + size_t num_remaining = length; + + MPIU_Assert(num_remaining > 0); + + /* Convert the code to a string. The cases are: + simple class. Find the corresponding string. + + if (user code) + { + go to code that extracts user error messages + } + else + { + is specific message code set and available? if so, use it + else use generic code (lookup index in table of messages) + } + */ + if (ERROR_IS_DYN(errorcode)) + { + /* This is a dynamically created error code (e.g., with MPI_Err_add_class) */ + + /* If a dynamic error code was created, the function to convert + them into strings has been set. Check to see that it was; this + is a safeguard against a bogus error code */ + const char* s = nullptr; + if (MPIR_Err_code_to_string) + { + /* FIXME: not internationalized */ + s = MPIR_Err_code_to_string(errorcode); + if(s != nullptr) + { + MPIU_Strncpy(msg, s, num_remaining); + } + } + + if(s == nullptr) + { + len = MPIU_Snprintf(msg, num_remaining, "Undefined dynamic error code (%d)", errorcode); + msg[num_remaining-1] = '\0'; + } + } + else if (ERROR_GET_CLASS(errorcode) == errorcode) + { + MPIU_Strncpy(msg, get_class_msg( errorcode ), num_remaining); + } + else + { + /* print the class message first */ + MPIU_Strncpy(msg, get_class_msg(ERROR_GET_CLASS(errorcode)), num_remaining); + + msg[num_remaining - 1] = '\0'; + len = MPIU_Strlen( msg, num_remaining ); + msg += len; + num_remaining -= len; + + /* then print the stack or the last specific error message */ + MPIU_Strncpy(msg, ", error stack:\n", num_remaining); + len = MPIU_Strlen( msg, num_remaining ); + msg += len; + num_remaining -= len; + MPIR_Err_print_stack_string(errorcode, msg, num_remaining); + } +} + +_Ret_z_ +const char* +get_error_string( + _In_ int error + ) +{ + wchar_t* wmsg; + static char msg[1024]; + + int n; + OACR_REVIEWED_CALL( + mpicr, + n = FormatMessageW( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_MAX_WIDTH_MASK, // dwFlags + nullptr, // lpSource + error, // dwMessageId, + 0, // dwLanguageId + reinterpret_cast(&wmsg),// lpBuffer + 0, // nSize + nullptr )); // Arguments + + if( n != 0 ) + { + n = WideCharToMultiByte( + CP_UTF8, + 0, + wmsg, + -1, + msg, + sizeof(msg), + nullptr, + nullptr + ); + LocalFree( wmsg ); + } + if( n == 0 ) + { + msg[0] = '\0'; + } + + return msg; +} + + +// +// Summary: +// Traces the MPI Error string and error class for the specified +// mpi error code. +// +ULONG MpiTraceError( + REGHANDLE RegHandle, + PCEVENT_DESCRIPTOR Descriptor, + int ErrorCode + ) +{ + const ULONG EventDataCount = 2; + EVENT_DATA_DESCRIPTOR EventData[ EventDataCount ]; + char message[ MPI_MAX_ERROR_STRING ]; + int error_class; + + //make sure the string starts null terminated. + message[0] = 0; + + // + // Get the error class + // + error_class = ERROR_GET_CLASS(ErrorCode); + + MPIR_Err_get_string( ErrorCode, message, MPI_MAX_ERROR_STRING); + + EventDataDescCreate(&EventData[0], &error_class, sizeof(error_class) ); + EventDataDescCreate(&EventData[1], message, (ULONG)strlen(message) + sizeof('\0') ); + + return EventWrite(RegHandle, Descriptor, EventDataCount, EventData); +} diff --git a/src/mpi/common/ex.cpp b/src/mpi/common/ex.cpp new file mode 100644 index 0000000..34a0bb5 --- /dev/null +++ b/src/mpi/common/ex.cpp @@ -0,0 +1,307 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * Copyright (C) 1997 University of Chicago. + * See COPYRIGHT notice in top-level directory. + */ + +#include "precomp.h" +#include "ex.h" +#include + +_Success_(return==NO_ERROR) +static +int +WINAPI +ExpKeyZeroCompletionProcessor( + _In_opt_ DWORD BytesTransfered, + _In_ PVOID pOverlapped + ); + + +#ifdef EXSINGLETONE +// +// The only completion port, supporting all events +// +static HANDLE s_port; +#endif + +// +// The registered processors. This module supports up to 4 processors where +// processor zero is pre-registered for overlapped operations completion. +// the completion processor is registered by the completion key. +// +static ExCompletionProcessor s_processors[EX_KEY_MAX] = { + + ExpKeyZeroCompletionProcessor, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr +}; + + +static inline BOOL +IsValidSet( + _In_ ExSetHandle_t Set + ) +{ + return (Set != nullptr && Set != INVALID_HANDLE_VALUE); +} + +_Success_(return != nullptr) +_Ret_valid_ +ExSetHandle_t +ExCreateSet( + void + ) +{ + ExSetHandle_t Set; + Set = CreateIoCompletionPort( + INVALID_HANDLE_VALUE, // FileHandle + nullptr, // ExistingCompletionPort + 0, // CompletionKey + MAXDWORD // NumberOfConcurrentThreads + ); + + return Set; +} + + +void +ExCloseSet( + _In_ _Post_invalid_ ExSetHandle_t Set + ) +{ + MPIU_Assert(IsValidSet(Set)); + CloseHandle(Set); +} + + +void +ExRegisterCompletionProcessor( + _In_ EX_PROCESSOR_KEYS Key, + _In_ ExCompletionProcessor pfnCompletionProcessor + ) +{ + MPIU_Assert(Key > 0); + MPIU_Assert(Key < RTL_NUMBER_OF(s_processors)); + MPIU_Assert(s_processors[Key] == nullptr); + s_processors[Key] = pfnCompletionProcessor; +} + + +void +ExUnregisterCompletionProcessor( + _In_ EX_PROCESSOR_KEYS Key + ) +{ + MPIU_Assert(Key > 0); + MPIU_Assert(Key < RTL_NUMBER_OF(s_processors)); + MPIU_Assert(s_processors[Key] != nullptr); + s_processors[Key] = nullptr; +} + + +void +ExPostCompletion( + _In_ ExSetHandle_t Set, + _In_ EX_PROCESSOR_KEYS Key, + _Inout_opt_ PVOID pOverlapped, + _In_ DWORD BytesTransfered + ) +{ + MPIU_Assert(IsValidSet(Set)); + + for(;;) + { + if(PostQueuedCompletionStatus(Set, BytesTransfered, Key, (OVERLAPPED*)pOverlapped)) + return; + + MPIU_Assert(GetLastError() == ERROR_NO_SYSTEM_RESOURCES); + Sleep(10); + } +} + + +ULONG +ExGetPortValue( + _In_ ExSetHandle_t Set + ) +{ + MPIU_Assert(IsValidSet(Set)); + return HandleToUlong(Set); +} + +_Success_(return==MPI_SUCCESS) +int +ExInitialize( + void + ) +{ +#ifdef EXSINGLETONE + MPIU_Assert(s_port == nullptr); + s_port = CreateIoCompletionPort( + INVALID_HANDLE_VALUE, // FileHandle + nullptr, // ExistingCompletionPort + 0, // CompletionKey + 0 // NumberOfConcurrentThreads + ); + + if(s_port != nullptr) + return MPI_SUCCESS; + + return MPI_ERR_INTERN; +#endif + + return MPI_SUCCESS; +} + + +void +ExFinalize( + void + ) +{ +#ifdef EXSINGLETONE + MPIU_Assert(s_port != nullptr); + CloseHandle(s_port); + s_port = nullptr; +#endif +} + +_Success_(return==MPI_SUCCESS || return==MPI_ERR_PENDING) +int +ExProcessCompletions( + _In_ ExSetHandle_t set, + _In_ DWORD timeout, + _In_opt_ bool interruptible + ) +{ + MPIU_Assert(IsValidSet(set)); + + BOOL fSucc; + DWORD bytesTransfered; + ULONG_PTR key; + OVERLAPPED* pOverlapped; + for (;;) + { + fSucc = GetQueuedCompletionStatus( + set, + &bytesTransfered, + &key, + &pOverlapped, + timeout + ); + + if(!fSucc && pOverlapped == nullptr) + { + // + // Return success on timeout per caller request. The Executive progress + // engine will not wait for the async processing to complete + // + DWORD gle = GetLastError(); + if (gle == WAIT_TIMEOUT) + { + if( timeout == 0 ) + { + return MPI_SUCCESS; + } + return HRESULT_FROM_WIN32(WAIT_TIMEOUT); + } + + // + // Io Completion port internal error, try again + // + continue; + } + + if( key == EX_KEY_WAIT_INTERRUPT ) + { + if( interruptible == false ) + { + continue; + } + return MPI_ERR_PENDING; + } + + MPIU_Assert(key < RTL_NUMBER_OF(s_processors)); + MPIU_Assert(s_processors[key] != nullptr); + + // + // Call the completion processor and return the result. + // + return s_processors[key](bytesTransfered, pOverlapped); + } +} + + +//---------------------------------------------------------------------------- +// +// Preregistered completion processor for Key-Zero +// + +_Success_(return==NO_ERROR) +static +int +WINAPI +ExpKeyZeroCompletionProcessor( + _In_opt_ DWORD /*BytesTransfered*/, + _In_ PVOID pOverlapped + ) +{ + EXOVERLAPPED* pov = CONTAINING_RECORD(pOverlapped, EXOVERLAPPED, ov); + return ExCompleteOverlapped(pov); +} + + +void +ExPostOverlapped( + _In_ ExSetHandle_t Set, + _Inout_ EXOVERLAPPED* pOverlapped + ) +{ + MPIU_Assert(IsValidSet(Set)); + + ExPostCompletion( + Set, + EX_KEY_RESERVED, // Key, + &pOverlapped->ov, + 0 // BytesTransfered + ); +} + + +void +ExAttachHandle( + _In_ ExSetHandle_t Set, + _In_ HANDLE Handle, + _In_opt_ EX_PROCESSOR_KEYS Key + ) +{ + MPIU_Assert(IsValidSet(Set)); + MPIU_Assert(s_processors[Key] != nullptr); + + for(;;) + { + HANDLE hPort; + hPort = CreateIoCompletionPort( + Handle, // FileHandle + Set, // ExistingCompletionPort + Key, // CompletionKey + 0 // NumberOfConcurrentThreads + ); + + if(hPort != nullptr) + { + MPIU_Assert(hPort == Set); + return; + } + + MPIU_Assert(GetLastError() == ERROR_NO_SYSTEM_RESOURCES); + Sleep(10); + } +} diff --git a/src/mpi/common/ex.h b/src/mpi/common/ex.h new file mode 100644 index 0000000..197ff9a --- /dev/null +++ b/src/mpi/common/ex.h @@ -0,0 +1,461 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#ifndef EX_H +#define EX_H + + +//---------------------------------------------------------------------------- +// +// The Executive, a generic progress engine +// +// Overview: +// The generic progress engine, the Executive, implements a simple asynchronous +// processing model. In this model records indicating events get queued up for +// processing. The Executive invokes the appropriate registered handler for the +// event to take further action if required. The executive exits when a sequence +// of events, representing a complete logical function is complete. +// +// This model is a producers-consumers model with a single events queue. The +// events are being processed in the order they have been queued. +// *** temporary extended to support multiple queues until the clients can *** +// *** use a single event queue. (e.g., PMI client implementation) *** +// +// The function ExProcessCompletions is the heart of the consumers model. It +// dequeues the events records and invokes the appropriate completion processor. +// Multiple threads can call this function for processing. The Executive will +// run as many concurrent threads as there are processors in the system. When +// concurrent threads are running, the completion processors should be able to +// handle the concurrency and out-of-order execution. +// +// The Executive pre-registers a completion processor for Key-Zero with a simple +// handler signature. see description below. +// +//---------------------------------------------------------------------------- + + +// +// ExSetHandle_t *** temp extenssion *** +// +// Represents the set object +// +typedef HANDLE ExSetHandle_t; +#define EX_INVALID_SET nullptr + +//to get NTSTATUS +#include + + +// +// ExCreateSet *** temp extenssion *** +// +// Create the set object. +// An EX_INVALID_SET value is returned for an out of memory condition. +// +_Success_(return != nullptr) +_Ret_valid_ +ExSetHandle_t +ExCreateSet( + void + ); + +// +// ExCloseSet *** temp extenssion *** +// +// Close the set object. +// +void +ExCloseSet( + _In_ _Post_invalid_ ExSetHandle_t Set + ); + +// +// ExCompletionProcessor, function prototype +// +// The completion processor function is called by ExProcessCompletions function +// to process a completion event. The completion processor indicates whether the +// sequence of asynchronous events is complete or whether further processing is +// required. +// +// Parameters: +// BytesTransferred +// A DWORD value posted to the completion port. Usually the number of bytes +// transferred in this operation +// +// pOverlapped +// A pointer value posted to the completion port. Usually a pointer to the +// OVERLAPPED structure +// +// Return Value: +// MPI error value indicating the result of the "logical" async function. +// This value is meaningful only when the completion processor returns TRUE. +// +typedef +_Success_(return==MPI_SUCCESS) +int +(WINAPI * ExCompletionProcessor)( + DWORD BytesTransferred, + PVOID pOverlapped + ); + + +// +// Key values used when calling ExRegisterCompletionProcessor. +// +enum EX_PROCESSOR_KEYS +{ + EX_KEY_WAIT_INTERRUPT = -1, + EX_KEY_RESERVED = 0, + EX_KEY_SHM_NOTIFY_CONNECTION, + EX_KEY_SHM_NOTIFY_MESSAGE, + EX_KEY_PROGRESS_WAKEUP, + EX_KEY_ND, + EX_KEY_CONNECT_REQUEST, + EX_KEY_CONNECT_COMPLETE, + EX_KEY_DEFER_CONNECT, + EX_KEY_DEFER_WRITE, + EX_KEY_MAX +}; + + +// +// ExRegisterCompletionProcessor +// +// Resister a completion processor for a specific Key. +// N.B. Current implementation supports keys 0 - 3, where key 0 is reserved. +// +void +ExRegisterCompletionProcessor( + _In_ EX_PROCESSOR_KEYS Key, + _In_ ExCompletionProcessor pfnCompletionProcessor + ); + + +// +// ExUnregisterCompletionProcessor +// +// Remove a registered completion processor +// +void +ExUnregisterCompletionProcessor( + _In_ EX_PROCESSOR_KEYS Key + ); + + +// +// ExPostCompletion +// +// Post an event completion to the completion queue. The appropriate +// completion processor will be invoked by ExProcessCompletions thread +// with the passed in parameters. +// +void +ExPostCompletion( + _In_ ExSetHandle_t Set, + _In_ EX_PROCESSOR_KEYS Key, + _Inout_opt_ PVOID pOverlapped, + _In_ DWORD BytesTransferred + ); + + +// +// ExGetPortValue +// +// Returns the value of the completion queue handle +// +ULONG +ExGetPortValue( + _In_ ExSetHandle_t Set + ); + + +// +// ExProcessCompletions +// +// Process all completion event types by invoking the appropriate completion +// processor function. This routine continues to process all events until an +// asynchronous sequence is complete (function with several async stages). +// If the caller indicated "no blocking" this routine will exit when no more +// events to process are available, regardles of the completion processor +// indication to continue. +// +// Parameters: +// timeout - Milliseconds to wait for an event sequence to complete +// interruptible - flag indicating whether the wait can be interrupted +// +// Return Value: +// The result of the asynchronous function last to complete. +// Returns MPI_ERR_PENDING if the wait was interrupted. +// Returns MPI_SUCCESS if the wait timed out. +// +_Success_(return==MPI_SUCCESS || return==MPI_ERR_PENDING) +int +ExProcessCompletions( + _In_ ExSetHandle_t set, + _In_ DWORD timeout, + _In_opt_ bool interruptible = false + ); + + +// +// ExInitialize +// +// Initialize the completion queue. This function can only be called once before +// before Finialize. +// +_Success_(return==MPI_SUCCESS) +int +ExInitialize( + void + ); + + +// +// ExFinitialize +// +// Close the completion queue progress engine. This function can only be called +// once. +// +void +ExFinalize( + void + ); + + +//---------------------------------------------------------------------------- +// +// The Executive Key-Zero completion processor +// +// Overview: +// The Key-Zero completion processor enables the users of the Executive to +// associate a different completion routine with each operation rather than +// use a single completion processor per handle. The Key-Zero processor works +// with user supplied OVERLAPPED structure. It cannot work with system generated +// completion events (e.g., Job Object enets), or other external events. +// +// The Key-Zero processor uses the EXOVERLAPPED data structure which embeds the +// user success and failure completion routines. When the Key-Zero completion +// processor is invoked it calls the user success or failure routine base on +// the result of the async operation. +// +//---------------------------------------------------------------------------- + +// +// ExCompletionRoutine function prototype +// +// The ExCompletionRoutine callback routine is invoked by the built-in Key-Zero +// completion processor. The information required for processing the event is +// packed with the EXOVERLAPED structure and can be accessed with the Ex utility +// functions. The callback routine returns the logical error value. +// +// Parameters: +// pOverlapped +// A pointer to an EXOVERLAPPED structure associated with the completed +// operation. This pointer is used to extract the caller context with the +// CONTAINING_RECORD macro. +// +// Return Value: +// MPI error value indicating the result of the "logical" async function. +// +struct EXOVERLAPPED; + +typedef +_Success_(return==MPI_SUCCESS) +int +(WINAPI * ExCompletionRoutine)( + _Inout_ struct EXOVERLAPPED* pOverlapped + ); + + +// +// struct EXOVERLAPPED +// +// The data structure used for Key-Zero completions processing. The pfnSuccess +// and pfnFailure are set by the caller before calling an async operation. +// The pfnSuccess is called if the async operation was successful. +// The pfnFailure is called if the async operation was unsuccessful. +// +struct EXOVERLAPPED +{ + + OVERLAPPED ov; + ExCompletionRoutine pfnSuccess; + ExCompletionRoutine pfnFailure; +}; + + +// +// ExInitOverlapped +// +// Initialize the success & failure callback function fields +// Rest the hEvent field of the OVERLAPPED, make it ready for use with the OS +// overlapped API's. +// +static +inline +void +ExInitOverlapped( + _Inout_ EXOVERLAPPED* pOverlapped, + _In_ ExCompletionRoutine pfnSuccess, + _In_ ExCompletionRoutine pfnFailure + ) +{ + pOverlapped->ov.hEvent = nullptr; + pOverlapped->pfnSuccess = pfnSuccess; + pOverlapped->pfnFailure = pfnFailure; +} + + +// +// ExPostOverlapped +// +// Post an EXOVERLAPPED completion to the completion queue to be invoked by +// ExProcessCompletions. +// +void +ExPostOverlapped( + _In_ ExSetHandle_t Set, + _Inout_ EXOVERLAPPED* pOverlapped + ); + + +// +// ExPostOverlappedResult +// +// Post an EXOVERLAPPED completion to the completion queue to be invoked by +// ExProcessCompletions. Set the status and bytes transferred count. +// +static +inline +void +ExPostOverlappedResult( + _In_ ExSetHandle_t Set, + _Inout_ EXOVERLAPPED* pOverlapped, + _In_ HRESULT Status, + _In_ DWORD BytesTransferred + ) +{ + pOverlapped->ov.Internal = Status; + pOverlapped->ov.InternalHigh = BytesTransferred; + ExPostOverlapped(Set, pOverlapped); +} + + +// +// ExAttachHandle +// +// Associate an OS handle with the Executive completion queue. All asynchronous +// operations using the attached handle are processed with the completion +// processor associated with the provided Key. If no key value is specified, +// the Key-Zero completion processor is used. Key-Zero completion processor +// requires the use of EXOVERLAPPED data structure when calling an asynchronous +// operation with that Handle. +// +void +ExAttachHandle( + _In_ ExSetHandle_t Set, + _In_ HANDLE Handle, + _In_opt_ EX_PROCESSOR_KEYS Key = EX_KEY_RESERVED + ); + + +// +// ExGetBytesTransferred +// +// Get the number of bytes transferred from the overlapped structure +// +static +inline +DWORD +ExGetBytesTransferred( + _In_ const EXOVERLAPPED* pOverlapped + ) +{ + return (DWORD)pOverlapped->ov.InternalHigh; +} + + +// +// ExGetStatus +// +// Get the status return value from the overlapped structure +// +static +inline +NTSTATUS +ExGetStatus( + _In_ const EXOVERLAPPED* pOverlapped + ) +{ + return (NTSTATUS)pOverlapped->ov.Internal; +} + + +// +// ExCallSuccess +// +// Set the completion status and bytes transferred and execute the EXOVERLAPPED +// Success completion routine +// +static +inline +int +ExCallSuccess( + _Inout_ EXOVERLAPPED* pOverlapped, + _In_ HRESULT Status, + _In_ DWORD BytesTransferred + ) +{ + pOverlapped->ov.Internal = Status; + pOverlapped->ov.InternalHigh = BytesTransferred; + return pOverlapped->pfnSuccess(pOverlapped); +} + + +// +// ExCallFailure +// +// Set the completion status and bytes transferred and execute the EXOVERLAPPED +// Failure completion routine +// +static +inline +int +ExCallFailure( + _Inout_ EXOVERLAPPED* pOverlapped, + _In_ HRESULT Status, + _In_ DWORD BytesTransferred + ) +{ + pOverlapped->ov.Internal = Status; + pOverlapped->ov.InternalHigh = BytesTransferred; + return pOverlapped->pfnFailure(pOverlapped); +} + + +// +// ExCompleteOverlapped +// +// Execute the EXOVERLAPPED success or failure completion routine based +// on the overlapped status value. +// +static +inline +int +ExCompleteOverlapped( + _Inout_ EXOVERLAPPED* pOverlapped + ) +{ + if(SUCCEEDED(ExGetStatus(pOverlapped))) + return pOverlapped->pfnSuccess(pOverlapped); + + return pOverlapped->pfnFailure(pOverlapped); +} + +#endif /* EX_H */ diff --git a/src/mpi/common/extracterrmsgs b/src/mpi/common/extracterrmsgs new file mode 100644 index 0000000..8991e16 --- /dev/null +++ b/src/mpi/common/extracterrmsgs @@ -0,0 +1,799 @@ +#! /usr/bin/perl +# (Tested with -w; 10/5/04) +# +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +# +# Find the parse.sub routine. +my $maintdir = "maint"; +my $rootdir = "."; +if ( ! -s "maint/parse.sub" ) { + my $program = $0; + $program =~ s/extracterrmsgs//; + if (-s "$program/parse.sub") { + $maintdir = $program; + $rootdir = $program; + $rootdir =~ s/\/maint\///g; + $rootdir =~ s/\\maint\\//g; + print "Rootdir = $rootdir\n" if $debug; + } +} +require "$maintdir/parse.sub"; + +$debug = 0; +$careful = 0; # Set careful to 1 to flag unused messages +$carefulFilename = ""; +$showfiles = 0; +$quiet = 0; +$build_test_pgm = 1; + +# Strict is used to control checking of error message strings. +$gStrict = 0; +if (defined($ENV{"DEBUG_STRICT"})) { $gStrict = 1; } + +# Check for special args +@files = (); +%skipFiles = (); +$outfile = ""; +$testfile = "errtest.c"; +$outpath = "."; +$srcroot = $rootdir; + +foreach $arg (@ARGV) { + if ($arg =~ /^-showfiles/) { $showfiles = 1; } + elsif( $arg =~ /-debug/) { $debug = 1; } + elsif( $arg =~ /-quiet/) { $quiet = 1; } + elsif( $arg =~ /-notest/) { $build_test_pgm = 0; } + elsif( $arg =~ /-outfile=(.*)/) { $outfile = $1; } + elsif( $arg =~ /-outpath=(.*)/) { $outpath = $1; } + elsif( $arg =~ /-testfile=(.*)/) { $testfile = $1; } + elsif( $arg =~ /-srcroot=(.*)/) { $srcroot = $1; } + elsif( $arg =~ /-careful=(.*)/) { + $careful = 1; + $carefulFilename = $1; + } + elsif( $arg =~ /-careful/) { $careful = 1; } + elsif( $arg =~ /-strict/) { $gStrict = 1; } + elsif( $arg =~ /-skip=(.*)/) { $skipFiles{$1} = 1; } + else { + print "Adding $arg to files\n" if $debug; + if (-d $arg) { + # Add all .c files from directory $arg to the list of files + # to process (this lets us shorten the arg list) + @files = (@files, &ExpandDir( $arg )); + } + else { + $files[$#files+1] = $arg; + } + } +} +# End of argument processing + + +# Setup the basic file for errnames - Now determined in ExpandDirs +#@errnameFiles = ( "$srcroot/errnames.txt" ); + +if ($outfile ne "") { + print STDOUT "Creating out file $outpath\\$outfile\n"; + $OUTFD = "MyOutFile"; + open( $OUTFD, ">$outpath\\$outfile" ) or die "Could not open $outpath\\$outfile\n"; +} +else { + $OUTFD = STDOUT; +} +# Setup before processing the files +if ($build_test_pgm) { + print STDOUT "Creating test file $outpath\\$testfile\n"; + open( TESTFD, ">$outpath\\$testfile" ) or die "Cannot create test program $outpath\\$testfile\n"; + print TESTFD "/* -*- Mode: C++; c-basic-offset:4 ; -*- */\ +/* \ + * (C) 2004 by Argonne National Laboratory.\ + * See COPYRIGHT in top-level directory.\ + *\ + * This file is automatically generated by maint/extracterrmsgs\ + * DO NOT EDIT\ + */\n"; + print TESTFD " +#include +#include +#include +#include +#include +#include \"mpi.h\" +#include \"mpierror.h\" +#include \"errcodes.h\" + +#pragma warning(disable:4100) // unreferenced formal parameter + +void MPID_Type_get_envelope(MPI_Datatype datatype, int* num_integers, int* num_addresses, int* num_datatypes, int* combiner) +{ + *combiner = MPI_COMBINER_NAMED; +} + +typedef struct MPID_Comm MPID_Comm; + +_Analysis_noreturn_ +int +MPID_Abort( + _Inout_opt_ MPID_Comm* comm, + _In_ BOOL intern, + _In_ int exit_code, + _In_z_ const char* error_msg + ) +{ + printf(\"MPID_Abort called. exit code (%d); msg '%s'\", exit_code, error_msg); + exit(exit_code); +} + +_Success_(return>=0) +int +MPIU_Internal_error_printf( + _In_z_ _Printf_format_string_params_(...) const char *str, + ... + ) +{ + int n; + va_list list; + + va_start(list, str); + n = vfprintf(stderr, str, list); + va_end(list); + + fflush(stderr); + + return n; +} + +void ChkMsg( int err, int msgclass, const char msg[] ) +{ + char errmsg[MPI_MAX_ERROR_STRING]; + + MPIR_Err_get_string( err, errmsg, MPI_MAX_ERROR_STRING ); + + printf( \"[0x%08x] [0x%08x] %2d %s\\n%s\\n\", err, MPIR_Err_get_user_error_code(err), msgclass, msg, errmsg ); +} +\n\n"; + + print TESTFD "int __cdecl main(int argc, char **argv)\n"; + print TESTFD "{\n int err;\n\n"; + print TESTFD " printf(\"mpi_errno user_errno class error id string\\n\");\n"; +} + +# Process the definitions +foreach $file (@files) { + print "$file\n" if $showfiles; + &ProcessFile( $file ); +} + +# +# Create the hash %longnames that maps the short names to the long names, +# $longnames{shortname} => longname, by reading the errnames.txt files +foreach my $sourcefile (@errnameFiles) { + #print STDERR "processing $sourcefile for error names\n"; + &ReadErrnamesFile( $sourcefile ); +} + +# Create the output files from the input that we've read +&CreateErrmsgsHeader( $OUTFD ); +&CreateErrMsgMapping( $OUTFD ); + +if ($build_test_pgm) { + print TESTFD " printf(\"---------- end ----------\\n\");\n"; + print TESTFD "\n return 0;\n}\n"; + close TESTFD; +} + +# +# Generate a list of unused keys +if ($careful) { + my $OUTFD = STDERR; + if ($carefulFilename ne "") { + $OUTFD = "ERRFD"; + open $OUTFD, ">$carefulFilename" or die "Cannot open $carefulFilename"; + } + foreach $shortname (keys(%longnames)) { + if (!defined($longnamesUsed{$shortname}) || + $longnamesUsed{$shortname} < 1) { + $loc = $longnamesDefined{$shortname}; + print $OUTFD "Name $shortname is defined in $loc but never used\n"; + } + } + if ($carefulFilename ne "") { + close $OUTFD; + } +} + +#----------------------------------------------------------------------------- +# ROUTINES +# ---------------------------------------------------------------------------- +# From the data collected above, generate the file containing the error message +# text. +# This is a temporary routine; the exact output form will be defined later +sub CreateErrmsgsHeader { + $FD = $_[0]; + print $FD "/* -*- Mode: C; c-basic-offset:4 ; -*- */\ +/* \ + * (C) 2001 by Argonne National Laboratory.\ + * See COPYRIGHT in top-level directory.\ + *\ + * This file automatically created by extracterrmsgs\ + * DO NOT EDIT\ + */\n"; + print $FD "typedef struct msgpair {\ + const char* key; + const char* fmt; +} msgpair;\n\n" +} +# +# We also need a way to create the records +# We then hash these on the first occurance (or precompute the hashes?) +# +# The error messages are output in the following form: +# typedef struct {const char short[], const long[]} namemap; +# Generic messages +# static const char[] short1 = ""; +# static const char[] long1 = ""; +# ... +# static const namemap[] = { {short1, long1}, {...} } +# +sub CreateErrMsgMapping { + my $OUTFD = $_[0]; + + # Create a mapping of MPI error classes to the specific error + # message by index into generic_err_msgs. This reads the file + # baseerrnames, looks up the generic message, and maps the MPI error + # class to the corresponding index. + # We must do this here because we must ensure that all MPI error + # classes have been added to the generic messages + @class_msgs = (); + open (FD, "<$srcroot/baseerrnames.txt" ) || + die "Could not open $srcroot/baseerrnames.txt\n"; + while () { + s/#.*$//; + my ($mpiname,$num,$shortmsg) = split(/\s\s*/); + if (!defined($shortmsg)) { + # Incase there is no short message entry (!) + $shortmsg = ""; + } + if ($shortmsg ne "") + { + if ($shortmsg =~ /\%/) + { + print STDERR "$srcroot/baseerrnames.txt(1) : error : message $shortmsg in baseerrnames.txt contains format control\n"; + } + + $specific_msgs{$shortmsg}++; + $specific_loc{$shortmsg} = ":baseerrnames.txt(1)"; + + $class_msgs[$num] = "$shortmsg"; + } + } + close (FD); + + $num = 0; + # Now output the instance specific messages + foreach $key (sort keys %specific_msgs) + { + $longvalue = "\"\0\""; + + if (!defined($longnames{$key})) + { + print STDERR "$specific_loc{$key} : error : shortname $key for specific messages has no expansion\n"; + next; + } + else { + # Keep track of which messages we have seen + $longnamesUsed{$key} += 1; + } + + # Escape any naked quotes + $longvalue =~ s/(?) { + $linecount++; + # Skip Comments + if (/^\s*\#/) { next; } + # Read entire error message (allow \ at end of line to continue) + if (/^\s*(\*\*[^:]*):(.*)$/) { + my $name = $1; + my $repl = $2; + $repl =~ s/\r*\n*$//g; + while ($repl =~ /\\\s*$/) { + # If there is a \\ at the end, read another. + # Remove the \ at the end (an alternative is to turn + # it into a \n (newline), but we may want to avoid + # multiline messages + $repl =~ s/\\\s*$//; + my $inline = ; + $linecount++; + $inline =~ s/^\s*//; # remove leading spaces + $repl .= $inline; + $repl =~ s/[\r\n]*$//g; # remove newlines + } + + # Check that the name and the replacement text at least + # partially match as to format specifiers + # (They should have exactly the same pattern, i.e., + # if the name has %d %x in is, the replacement should + # have %d %x, in that order) + my $namehasformat = ($name =~ /%/); + my $replhasformat = ($repl =~ /%/); + if ($namehasformat != $replhasformat) { + print STDERR "$sourcefile($linecount) : error : format control usage in $name and $repl do not agree\n"; + } +# if (!defined($longnames{"\"$name\""})) +# { +# $longnames{"\"$name\""} = $repl; +# $longnamesDefined{"\"$name\""} = "$sourcefile:$linecount"; +# } + # Check that the replacement text doesn't include a unquoted + # double quote + if ($repl =~ /(.)\"/) { + my $prechar = $1; + if ($1 ne "\\") { + print STDERR "$sourcefile($linecount) : error : replacement text for $name contains an unescaped double quote: $repl\n"; + } + } + if (!defined($longnames{$name})) + { + $longnames{$name} = $repl; + $longnamesDefined{$name} = "$sourcefile:$linecount"; + } + else + { + print STDERR "$sourcefile($linecount) : warning : attempt to redefine $name. Duplicate ignored.\n"; + } + } + } + close( FD ); +} + +# ========================================================================== +# Call this for each file +# This reads a C source or header file and adds does the following: +# adds any generic message short names encountered to the hash generic_msgs. +# adds any specific message short names encounter to the hash specific_msgs. +# adds the filename to the hash generic_loc{msg} as the value (: separated) +# and the same for hash specific_loc{msg}. +# The last two are used to provide better error reporting. +# +$filename = ""; # Make global so that other routines can echo filename +sub ProcessFile +{ + # Leave filename global for AddTest + $filename = $_[0]; + my $linecount = 0; + open (FD, "<$filename" ) or die "Could not open $filename\n"; + + while () { + $linecount++; + + # Skip code that is marked as ignore (e.g., for + # macros that are used to simplify the use of MPIR_Err_create_code + # (such macros must also be recognized and processed) + if (/\/\*\s+--BEGIN ERROR MACROS--\s+\*\//) { + while () { + $linecount++; + if (/\/\*\s+--END ERROR MACROS--\s+\*\//) { last; } + } + $remainder = ""; + next; + } + + # Next, remove any comments + $_ = StripComments( FD, $_ ); + + # Skip the definition of the function + if (/MPI_RESULT\s+MPI[OUR]_Err_create_code/) { $remainder = ""; next; } + + # Match the known routines and macros. + # Then check that the arguments match if there is a + # specific string (number of args matches the number present) + # (MPIU_ERR_FATAL_GET[0-4]?(cond,code,class,gmsg[,smsg,args]) + # Value is a quadruplet of: + # 1. the count of args where the generic msg begins (starting from 0) + # 2. location of __LINE__ (-1 for none) + # 3. specific msg arg required (0 for no, > 0 for yes) + # 4. only indirect message allowed + # + %KnownErrRoutines = ( 'MPIR_Err_create_code' => '3:-1:1:1', + 'MPIR_ERRTEST_VALID_HANDLE' => '4:-1:0:1', + 'MPIU_ERR_FATAL_GET' => '2:-1:0:1', + 'MPIU_ERR_GET' => '1:-1:0:1', + 'MPIU_ERR_CLASS_GET' => '2:-1:0:1', + 'MPIU_ERR_CREATE' => '1:-1:0:1', + + 'MPIU_E_ERR' => '0:-1:0:1', + ); + + while (/(MPI[OUR]_E[A-Za-z0-9_]+)\s*(\(.*)$/) { + my $routineName = $1; + my $arglist = $2; + if (!defined($KnownErrRoutines{$routineName})) { + if($routineName =~ /[1-9]$/) { + $routineNameN = substr($routineName, 0, $#routineName); + if (!defined($KnownErrRoutines{$routineNameN})) { + print "Skipping $routineName\n" if $debug; + last; + } + print "Found $routineName, using $routineNameN definition\n" if $debug; + $routineName = $routineNameN; + } + else { + print "Skipping $routineName\n" if $debug; + last; + } + } + else { + print "Found $routineName\n" if $debug; + } + + my ($genericArgLoc,$hasLine,$hasSpecific,$onlyIndirect) = + split(/:/,$KnownErrRoutines{$routineName}); + + ($leader, $remainder, @args ) = &GetSubArgs( FD, $arglist ); + # Discard leader + if ($debug) { + print "Line begins with $leader\n"; # Use $leader to keep -w happy + foreach $arg (@args) { + print "|$arg|\n"; + } + } + # Process the signature + + # if signature does not match new function prototype, then skip it + if ($#args < $genericArgLoc) { + if (!defined($bad_syntax_in_file{$filename})) { + $bad_syntax_in_file{$filename} = 1; + print STDERR "$filename($linecount) : error : $routineName call with too few arguments\n"; + } + next; + } + if ($hasLine >= 0 && + ($args[$hasLine] ne "__LINE__" && $args[$hasLine] ne "line")) { + if (!defined($bad_syntax_in_file{$filename})) { + $bad_syntax_in_file{$filename} = 1; + my $tmpi = $hasLine + 1; + print STDERR "$filename($linecount) : error : Expected __LINE__ or line as ${tmpi}th argument of $routineName\n"; + } + next; + } + + #my $last_errcode = $args[0]; + #my $fatal_flag = $args[1]; + #my $fcname = $args[2]; + #my $linenum = $args[3]; + #my $errclass = $args[4]; + my $specific_msg = $args[$genericArgLoc]; + + if ($specific_msg =~ /(\".*\")/) + { + $specific_msg = $1; + } + + # Check the generic and specific message arguments + if ($specific_msg =~ /\s"/) + { + print STDERR "$filename($linecount) : warning : trailing blank in error key '$specific_msg'\n"; + } + + if ($onlyIndirect && !($specific_msg =~ /^\"\*\*.+\"$/)) { + + print STDERR "$filename($linecount) : error : error key '$specific_msg' has incorrect format\n"; + next; + } + + if ($specific_msg =~ /%/) { + # Specific message includes format values. Check + # for number and for valid strings if %s + my $nargs = 0; + my $tmpmsg = $specific_msg; + my @stringLocs = (); + while ($tmpmsg =~ /[^%]*%(.)(.*)/) { + $tmpmsg = $2; + my $followchar = $1; + if ($followchar eq "s") { + $stringLocs[$#stringLocs+1] = $nargs; + } + if ($followchar ne "%") { + $nargs ++; + } + if (! ($followchar =~ /[%xsditpDCRWOEIGFAgl]/) ) { + print STDERR "$filename($linecount) : error : Unrecognized format specifier in error key $specific_msg\n"; + } + } + if ($nargs != $#args - $genericArgLoc) { + my $actargs = $#args - $genericArgLoc; + print STDERR "$filename($linecount) : error : wrong number of arguments for instance error key $specific_msg; expected $nargs but found $actargs\n"; + } + elsif ($#stringLocs >= 0 && $gStrict) { + # Check for reasonable strings if strict checking requested + for (my $i=0; $i<=$#stringLocs; $i++) { + my $index = $stringLocs[$i]; + my $string = $args[$genericArgLoc+1+$index]; + if ($string =~ /\"/) { + # Allow a few special cases: + # Always: all uppercase and _, single word + my $stringOk = 0; + if ($string =~ /^\"[A-Z_]*\"$/) { + $stringOk = 1; + } + elsif ($string =~ /^\"\w*\"$/) { + if (1) { $stringOk = 1; } + } + if (!$stringOk) { + print STDERR "$filename($linecount) : error : explicit string as argument to error key $specific_msg; explicit string is $string\n"; + } + } + } + } + } + + if ($build_test_pgm) { + &AddTestCall( $genericArgLoc, @args ) + } + + if ($specific_msg =~ /^\"(\*\*.*)\"/) + { + $specific_msg = $1; + $specific_msgs{$specific_msg}++; + $specific_loc{$specific_msg} .= ":$filename($linecount)"; + } + } + continue + { + $_ = $remainder; + } + } + close FD; +} + +# Get all of the .c files from the named directory, including any subdirs +# Also, add any errnames.txt files to the errnamesFiles arrays +sub ExpandDir { + my $dir = $_[0]; + my @otherdirs = (); + my @files = (); + opendir DIR, "$dir"; + while ($filename = readdir DIR) { + if ($filename =~ /^\./ || $filename eq "CVS" || $filename eq $testfile) { + next; + } + elsif (-d "$dir/$filename") { + if( ($filename ne "objd") && ($filename ne "obj") ) { + $otherdirs[$#otherdirs+1] = "$dir/$filename"; + } + } + elsif ($filename =~ /(.*\.[chi][xp]*)$/) { + # Test for both Unix- and Windows-style directory separators + if (!defined($skipFiles{"$dir/$filename"}) && + !defined($skipFiles{"$dir\\$filename"})) { + $files[$#files + 1] = "$dir/$filename"; + } + } + elsif ($filename eq "errnames.txt") { + $errnameFiles[$#errnameFiles+1] = "$dir/$filename"; + } + } + closedir DIR; + # (almost) tail recurse on otherdirs (we've closed the directory handle, + # so we don't need to worry about it anymore) + foreach $dir (@otherdirs) { + @files = (@files, &ExpandDir( $dir ) ); + } + return @files; +} +# +# Other todos: +# It would be good to keep track of any .N MPI_ERR_xxx names in the structured +# comment and match these against any MPI_ERR_yyy used in the code, emitting a +# warning message for MPI_ERR_yyy values used in the code but not mentioned +# in the header. This could even apply to routines that are not at the MPI +# layer, forcing all routines to document all MPI error classes that they might +# return (this is like requiring routines to document the exceptions that +# they may throw). + diff --git a/src/mpi/common/hwinfowin6.cpp b/src/mpi/common/hwinfowin6.cpp new file mode 100644 index 0000000..e421591 --- /dev/null +++ b/src/mpi/common/hwinfowin6.cpp @@ -0,0 +1,189 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "hwtree.h" +#include "util.h" + +typedef SYSTEM_LOGICAL_PROCESSOR_INFORMATION SLPI; + + +inline const SLPI* HwInfoGetEnd( const SLPI* pInfo, DWORD cb ) +{ + return (const SLPI*)((ULONG_PTR)pInfo + (ULONG_PTR)cb); +} + + +// +// Summary: +// Get the full mask of all cores +// +UINT64 +HwInfoGetGroupMask( + _In_ const SLPI* pSlpi, + _In_ DWORD cb + ) +{ + UINT64 mask = 0; + for( const SLPI* pCurrent = pSlpi; + pCurrent < HwInfoGetEnd(pSlpi, cb); + pCurrent++ + ) + { + if( pCurrent->Relationship == RelationProcessorCore ) + { + mask |= static_cast(pCurrent->ProcessorMask); + } + } + Assert(0 != mask); + return mask; +} + + +// +// Summary: +// Get the count of logical cores per physical core +// +UINT8 +HwInfoGetPcoreWidth( + _In_ const SLPI* pSlpi, + _In_ DWORD cb + ) +{ + UINT8 c = 1; + for( const SLPI* pCurrent = pSlpi; + pCurrent < HwInfoGetEnd(pSlpi, cb); + pCurrent++ + ) + { + if( pCurrent->Relationship == RelationProcessorCore ) + { + // + // MSDN documents that if Flags == 1, HT is enabled. + // so we need to count the bits used. + // + if( 1 == pCurrent->ProcessorCore.Flags ) + { + c = CountBits( pCurrent->ProcessorMask ); + } + break; + } + } + return c; +} + + +// +// Summary: +// Get the count of logical cores per numa node +// +UINT8 +HwInfoGetNumaWidth( + _In_ const SLPI* pSlpi, + _In_ DWORD cb + ) +{ + UINT8 c = 0; + for( const SLPI* pCurrent = pSlpi; + pCurrent < HwInfoGetEnd(pSlpi, cb); + pCurrent++ + ) + { + if( pCurrent->Relationship == RelationNumaNode ) + { + c = CountBits( pCurrent->ProcessorMask ); + break; + } + } + Assert(0 != c); + return c; +} + + +// +// Summary: +// Allocate the SLPI information for this machine. +// +// Parameters: +// ppSlpi - pointer to recieve the allocate SLPI array +// pcbSlpi - pointer to recieve the total buffer size. +// +HRESULT +HwInfoGetSlpi( + _Outptr_result_buffer_(*pcbSlpi) SLPI** ppSlpi, + _Out_ UINT32* pcbSlpi + ) +{ + SLPI* pSlpi; + DWORD ntError; + DWORD cb = 0; + + BOOL bResult = ::GetLogicalProcessorInformation( nullptr, &cb ); + if( FALSE == bResult ) + { + ntError = GetLastError(); + if( ntError != ERROR_INSUFFICIENT_BUFFER ) + { + return HRESULT_FROM_WIN32(ntError); + } + } + + pSlpi = static_cast(malloc(cb)); + if( nullptr == pSlpi ) + { + return E_OUTOFMEMORY; + } + + bResult = ::GetLogicalProcessorInformation( pSlpi, &cb ); + if( FALSE == bResult ) + { + free(pSlpi); + ntError = GetLastError(); + return HRESULT_FROM_WIN32(ntError); + } + + *ppSlpi = pSlpi; + *pcbSlpi = cb; + + return S_OK; +} + + +// +// Summary: +// Initialize the array of pInfos from the current machine using Win7 apis +// +// Parameters: +// pInfo - HWINFO to initialize +// pFilter - Option bit mask filter +// +HRESULT +HwInfoInitializeWin6( + _Out_ HWINFO* pInfo + ) +{ + SLPI* pSlpi; + UINT32 cbSlpi; + HRESULT hr; + + hr = HwInfoGetSlpi(&pSlpi, &cbSlpi ); + if( FAILED( hr ) ) + { + return hr; + } + + pInfo->Mask = HwInfoGetGroupMask(pSlpi,cbSlpi); + pInfo->ActiveMask = pInfo->Mask; + + pInfo->Group = 0; + pInfo->GroupWidth = CountBits(pInfo->Mask); + pInfo->NumaWidth = HwInfoGetNumaWidth(pSlpi,cbSlpi); + pInfo->PcoreWidth = HwInfoGetPcoreWidth(pSlpi,cbSlpi); + + Assert(pInfo->GroupWidth >= pInfo->NumaWidth); + Assert(pInfo->NumaWidth >= pInfo->PcoreWidth); + Assert(pInfo->PcoreWidth > 0 ); + + free(pSlpi); + return S_OK; +} diff --git a/src/mpi/common/hwinfowin7.cpp b/src/mpi/common/hwinfowin7.cpp new file mode 100644 index 0000000..30e32e1 --- /dev/null +++ b/src/mpi/common/hwinfowin7.cpp @@ -0,0 +1,175 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "hwtree.h" +#include "util.h" +#include "kernel32util.h" +#include +#include +// +// Summary: +// Utility function to get the specificied processor relations using the existing buffer if possible. +// +// Parameters: +// relation - the specific relation that we want. +// ppSlpi - pointer to an existing buffer on input (optional) +// pointer to new buffer if current buffer is null or too small +// pcbSlpi - on input, points to the current size of the buffer +// on output, contains the new alloc size or the size used if the +// existing buffer is large enough. +// +static +HRESULT +HwInfoGetSlpiEx( + _In_ LOGICAL_PROCESSOR_RELATIONSHIP relation, + _Inout_ _Outptr_result_bytebuffer_to_(*pcbSlpi,*pcbSlpi) SLPIEX** ppSlpi, + _Inout_ UINT32* pcbSlpi + ) +{ + SLPIEX* pSlpi = *ppSlpi; + DWORD cb = *pcbSlpi; + DWORD ntError; + BOOL bResult; + for(;;) + { + Assert( nullptr != Kernel32::Methods.GetLogicalProcessorInformationEx ); + + bResult = Kernel32::Methods.GetLogicalProcessorInformationEx( relation, pSlpi, &cb ); + if( FALSE != bResult ) + { + break; + } + ntError = GetLastError(); + if( nullptr != pSlpi ) + { + // + // ensure that we null out the input buffer if + // and free the input buffer on error. + // this prevents the caller from having to + // free it on failure. + // + *ppSlpi = nullptr; + free(pSlpi); + } + if( ntError != ERROR_INSUFFICIENT_BUFFER ) + { + return HRESULT_FROM_WIN32(ntError); + } + + pSlpi = static_cast( malloc( cb ) ); + if( nullptr == pSlpi ) + { + return E_OUTOFMEMORY; + } + + } + + *ppSlpi = pSlpi; + *pcbSlpi = cb; + + return S_OK; +} + + +// +// Summary: +// Initialize the array of pInfos from the current machine using Win7 apis +// +// Parameters: +// pnInfos - On input, the count of elements in pInfos. +// On output, the count of elements used in pInfos or size required if too small +// pInfos - Array of HWINFO to populate +// +HRESULT +HwInfoInitializeWin7( + _Inout_ UINT32* pnInfos, + _Out_writes_to_opt_(*pnInfos,*pnInfos) HWINFO pInfos[] + ) +{ + SLPIEX* pSlpiEx = nullptr; + UINT32 cbSlpiEx = 0; + UINT32 cbSlpiExAlloc = 0; + UINT8 numaWidth; + UINT8 pcoreWidth = 1; + HRESULT hr; + + hr = HwInfoGetSlpiEx(RelationNumaNode,&pSlpiEx, &cbSlpiExAlloc ); + if( FAILED( hr ) ) + { + return hr; + } + + __analysis_assume(pSlpiEx != nullptr); + + numaWidth = CountBits( pSlpiEx->NumaNode.GroupMask.Mask ); + + cbSlpiEx = cbSlpiExAlloc; + hr = HwInfoGetSlpiEx( RelationProcessorCore, &pSlpiEx, &cbSlpiEx ); + if( FAILED( hr ) ) + { + return hr; + } + + // + // If HT is enabled, then calculate the pcoreWidth to include the + // logical cores it contains. + // + __analysis_assume(pSlpiEx != nullptr); + if( 0 != (pSlpiEx->Processor.Flags & LTP_PC_SMT) ) + { + pcoreWidth = CountBits( pSlpiEx->Processor.GroupMask[0].Mask ); + } + + // + // if the second call to HwInfoGetSlpiEx reallocated the buffer + // we calculate the new alloc max based on previous and current size + // + cbSlpiExAlloc = max(cbSlpiExAlloc,cbSlpiEx); + cbSlpiEx = cbSlpiExAlloc; + hr = HwInfoGetSlpiEx(RelationGroup,&pSlpiEx, &cbSlpiEx ); + if( FAILED( hr ) ) + { + return hr; + } + + // + // To make the data structures pack nicely, we have limited ourselves to + // UINT8 worth of processor groups. There is no real world case where + // the number of processor groups will exceed this limit. + // + __analysis_assume(pSlpiEx != nullptr); + UINT8 nGroups = static_cast( pSlpiEx->Group.ActiveGroupCount ); + + // + // This should be a very rare case where group count > 1 + // so I don't feel bad not pre-emptively checking the group count + // before calculating the PCores and Numa widths. + // + if( nGroups > *pnInfos ) + { + *pnInfos = nGroups; + free(pSlpiEx); + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + + for( UINT8 i = 0; i < nGroups; i++ ) + { + pInfos[i].Mask = pSlpiEx->Group.GroupInfo[i].ActiveProcessorMask; + pInfos[i].ActiveMask = pInfos[i].Mask; + + pInfos[i].Group = i; + pInfos[i].GroupWidth = pSlpiEx->Group.GroupInfo[ i ].ActiveProcessorCount; + pInfos[i].NumaWidth = numaWidth; + pInfos[i].PcoreWidth = pcoreWidth; + + Assert(pInfos[i].GroupWidth >= pInfos[i].NumaWidth); + Assert(pInfos[i].NumaWidth >= pInfos[i].PcoreWidth); + Assert(pInfos[i].PcoreWidth > 0 ); + } + free(pSlpiEx); + *pnInfos = nGroups; + return S_OK; +} + diff --git a/src/mpi/common/hwlayout.cpp b/src/mpi/common/hwlayout.cpp new file mode 100644 index 0000000..805c5ef --- /dev/null +++ b/src/mpi/common/hwlayout.cpp @@ -0,0 +1,401 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "hwtree.h" +#include "stdio.h" + + +// +// Summary: +// Utility function to get a simple string for error message formatting. +// +inline const char* GetNodeTypeString(HWNODE_TYPE targetType) +{ + switch( targetType ) + { + case HWNODE_TYPE_MACHINE: + return "M"; + case HWNODE_TYPE_GROUP: + return "G"; + case HWNODE_TYPE_NUMA: + return "N"; + case HWNODE_TYPE_PCORE: + return "P"; + case HWNODE_TYPE_LCORE: + return "L"; + default: + Assert(0); + return "Invalid"; + } +} + + +// +// FW delclare some local functions +// +static HRESULT +HwLayoutProcessEnum( + _In_ const HWLAYOUT* pLayout, + _In_ const HWVIEW* pView, + _In_ PVOID pData, + _In_ FN_HwLayoutProcessCallback* pfn, + _In_ HWLAYOUT_STATE* pState, + _In_ UINT32 enumIndex + ); + + +// +// Summary: +// Process the specified layout using the specified tree +// +// Parameters: +// pLayout - Pointer to layout description +// pView - Pointer to the view +// minProc - Minimum number of processes to create +// maxProc - Maximum number of processes to create +// pData - Opaque data pointer to hand to callback +// pfn - Callback function to invoke for each iteration +// +HRESULT +HwLayoutProcess( + _In_ const HWLAYOUT* pLayout, + _In_ const HWVIEW* pView, + _In_ UINT32 minProc, + _In_ UINT32 maxProc, + _In_ PVOID pData, + _In_ FN_HwLayoutProcessCallback* pfn + ) +{ + HRESULT hr; + HWLAYOUT_STATE state; + + state.MaxProc = maxProc; + state.MinProc = minProc; + state.ProcCount = 0; + + for( UINT32 i = 0; i < pLayout->EnumCount; i++ ) + { + state.Enums[i].Start = 0; + state.Enums[i].Size = 0; + state.Enums[i].Current = 0; + } + + do + { + hr = HwLayoutProcessEnum( pLayout, pView, pData, pfn, &state, 0 ); + if( FAILED( hr ) ) + { + return hr; + } + if( S_FALSE == hr ) + { + break; + } + + } while( state.ProcCount < state.MinProc ); + + return S_OK; +} + + +// +// Summary: +// Process the target of each iteration. +// +// Parameters: +// pLayout - Pointer to the current layout +// pView - Pointer to the view where the location is set +// pData - Pointer to the opaque data to pass to the callback +// pfn - Callback function invoked for each iteration target +// pState - Pointer to the current state of the iterations. +// +inline HRESULT +HwLayoutProcessTarget( + _In_ const HWLAYOUT* pLayout, + _In_ const HWVIEW* pView, + _In_ PVOID pData, + _In_ FN_HwLayoutProcessCallback* pfn, + _In_ HWLAYOUT_STATE* pState + ) +{ + HRESULT hr; + UINT32 location = pState->Enums[pLayout->EnumCount-1].Current; + UINT32 count = pLayout->TargetCount; + + if( 0 != pState->MaxProc ) + { + count = min(count,pState->MaxProc - pState->ProcCount); + } + + if( pView == nullptr) + { + return S_FALSE; + } + + while( pView->Nodes[location].Type > pLayout->TargetType ) + { + location = pView->Nodes[location].Parent; + } + + Assert( 0 != location ); + + hr = pfn( pLayout, pState, pView, location, pData, &count ); + if( FAILED( hr ) ) + { + return hr; + } + + pState->ProcCount += count; + + if( S_FALSE == hr ) + { + return hr; + } + + if( 0 != pState->MaxProc && pState->ProcCount >= pState->MaxProc ) + { + return S_FALSE; + } + return S_OK; +} + + +// +// Summary: +// Lookup the count of elements for a give type within the scope of the current layout +// +// Parameters: +// pLayout - The layout to use to scope the returned size +// pState - The state of the layout enumeration +// enumIndex - The current layout enumeration being processed +// pView - The view to use to resolve the size +// type - The type of node we need a count for +// +static UINT32 +HwLayoutResolveWellknownExpression( + _In_ const HWLAYOUT* pLayout, + _In_ const HWLAYOUT_STATE* pState, + _In_ UINT32 enumIndex, + _In_ const HWVIEW* pView, + _In_ HWNODE_TYPE type + ) +{ + Assert( type >= HWNODE_TYPE_MACHINE ); + Assert( pLayout->Enums[enumIndex].Type >= type ); + + // + // First find the Enumerator in the layout that provides the + // scope we need resolve the wellknown value. + // + while( enumIndex > 0 && pLayout->Enums[enumIndex].Type > type ) + { + enumIndex--; + } + + // + // If expression matches an enumerator value, just return the size + // of that exact match. + // + if( pLayout->Enums[enumIndex].Type == type ) + { + return pState->Enums[enumIndex].Size; + } + + + // + // Else, we must be closer to the root of the tree with the + // currently selected enumerator, so continue to walk the span + // of the tree until we reach the correct depth, and return the width + // of that range. + // + UINT32 start = pState->Enums[enumIndex].Current; + UINT32 end = start; + + do + { + start = pView->Nodes[start].FirstChild; + end = pView->Nodes[end].LastChild; + + }while( pView->Nodes[start].Type < type ); + + return end - start + 1; +} + + +// +// Summary: +// Resolve the HWENUM_EXPR value to the resulting UINT32 +// +// Parameters: +// pLayout - The layout to use to scope the returned size +// pState - The state of the layout enumeration +// enumIndex - The current layout enumeration being processed +// pView - The view to use to resolve the size +// pExpression - The expression to resolve +// +inline UINT32 +HwLayoutResolveExpression( + _In_ const HWLAYOUT* pLayout, + _In_ const HWLAYOUT_STATE* pState, + _In_ UINT32 enumIndex, + _In_ const HWVIEW* pView, + _In_ const HWENUM_EXPR* pExpression + ) +{ + if( 0 == pExpression->Flags ) + { + return pExpression->Left; + } + else + { + UINT32 left = pExpression->Left; + UINT32 right = pExpression->Right; + + if( 0 != ( pExpression->Flags & HWENUM_EXPR_WELLKNOWN_LEFT ) ) + { + left = HwLayoutResolveWellknownExpression( + pLayout, + pState, + enumIndex, + pView, + static_cast(left) + ); + } + if( 0 == ( pExpression->Flags & HWENUM_EXPR_DIVIDE_BY_RIGHT ) ) + { + return left; + } + + if( 0 != ( pExpression->Flags & HWENUM_EXPR_WELLKNOWN_RIGHT ) ) + { + right = HwLayoutResolveWellknownExpression( + pLayout, + pState, + enumIndex, + pView, + static_cast(right) + ); + } + + Assert(0 != right); + + return left / right; + } +} + + +inline UINT32 HwLayoutResolveExpressionAndRoundUp( + _In_ const HWLAYOUT* pLayout, + _In_ const HWLAYOUT_STATE* pState, + _In_ UINT32 enumIndex, + _In_ const HWVIEW* pView, + _In_ const HWENUM_EXPR* pExpression + ) +{ + UINT32 i = HwLayoutResolveExpression(pLayout,pState,enumIndex,pView,pExpression); + if( i == 0 ) + { + i++; + } + return i; +} + + +// +// Summary: +// Run the chain of enumerations recursively +// +// Parameters: +// pLayout - Pointer to the current layout +// pView - Pointer to the view where the location is set +// pData - Pointer to the opaque data to pass to the callback +// pfn - Callback function invoked for each iteration target +// pState - Pointer to the current state of the iterations. +// enumIndex - The index of the current enumation level. +// +static HRESULT +HwLayoutProcessEnum( + _In_ const HWLAYOUT* pLayout, + _In_ const HWVIEW* pView, + _In_ PVOID pData, + _In_ FN_HwLayoutProcessCallback* pfn, + _In_ HWLAYOUT_STATE* pState, + _In_ UINT32 enumIndex + ) +{ + HRESULT hr; + if( enumIndex == pLayout->EnumCount ) + { + return HwLayoutProcessTarget( pLayout, pView, pData, pfn, pState ); + } + + HWENUM_STATE* pEnumState = &pState->Enums[ enumIndex ]; + const HWENUM* pEnum = &pLayout->Enums[ enumIndex ]; + + // + // Work out the start and count of elements in the list + // + if( 0 != enumIndex ) + { + UINT32 end = pState->Enums[enumIndex-1].Current; + pEnumState->Start = end; + + Assert(pView != nullptr); + + while( pView->Nodes[end].Type != pEnum->Type ) + { + Assert( pView->Nodes[pEnumState->Start].Type == pView->Nodes[end].Type ); + + pEnumState->Start = pView->Nodes[pEnumState->Start].FirstChild; + end = pView->Nodes[end].LastChild; + } + pEnumState->Size = (end - pEnumState->Start) + 1; + } + else + { + pEnumState->Start = pView->Strides[pEnum->Type]; + pEnumState->Size = pView->Counts[pEnum->Type]; + } + + // + // There are cases where you can scope the values of an expression and get + // a resulting 0 from the divide operation. This can happen when the Left side of the expression + // results in a value < the right. For example, the pattern "MNL{1,0,N/2}" on boxes where there is only 1 numa node. + // We round these value up to 1 to ensure that we place at least a single item.. + // + UINT32 offset = HwLayoutResolveExpression( pLayout, pState, enumIndex, pView, &pEnum->Offset ); + UINT32 count = HwLayoutResolveExpressionAndRoundUp( pLayout, pState, enumIndex, pView, &pEnum->Count ); + UINT32 stride = HwLayoutResolveExpressionAndRoundUp( pLayout, pState, enumIndex, pView, &pEnum->Stride ); + UINT32 repeatCount = HwLayoutResolveExpressionAndRoundUp( pLayout, pState, enumIndex, pView, &pEnum->RepeatCount ); + UINT32 repeatOffset = HwLayoutResolveExpression( pLayout, pState, enumIndex, pView, &pEnum->RepeatOffset ); + + Assert(repeatCount>0); + Assert(count>0); + Assert(stride>0); + + pEnumState->Current = pEnumState->Start + ( offset % pEnumState->Size ); + + do + { + for( UINT32 i = 0; i < count; i++ ) + { + hr = HwLayoutProcessEnum( pLayout, pView, pData, pfn, pState, enumIndex + 1 ); + if( FAILED( hr ) || S_FALSE == hr ) + { + return hr; + } + + pEnumState->Current = pEnumState->Start + ((pEnumState->Current - pEnumState->Start + stride) % pEnumState->Size); + } + + pEnumState->Current = pEnumState->Start + ((pEnumState->Current - pEnumState->Start + repeatOffset) % pEnumState->Size); + + repeatCount--; + + } while( repeatCount > 0 ); + + + return S_OK; +} + diff --git a/src/mpi/common/hwsummary.cpp b/src/mpi/common/hwsummary.cpp new file mode 100644 index 0000000..ab2002d --- /dev/null +++ b/src/mpi/common/hwsummary.cpp @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "hwtree.h" +#include "util.h" +#include "kernel32util.h" + +HRESULT +HwInfoInitializeWin6( + _Out_ HWINFO* pInfo + ); + + +HRESULT +HwInfoInitializeWin7( + _Inout_ UINT32* pnInfos, + _Out_writes_to_opt_(*pnInfos,*pnInfos) HWINFO pInfos[] + ); + + +// +// Summary: +// Initialize HWINFO array from the local logical processor information. +// +// Parameters: +// pnInfos - On input, max size of pInfos +// on output, size used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required count will be written here. +// pInfos - pointer to buffer to fill with values +// pFilters - (optional) pointer to array of affinity filters +// must be same length as pInfos when specified. +// +HRESULT +HwInfoInitialize( + _Inout_ UINT32* pnInfos, + _Out_writes_to_opt_(*pnInfos,*pnInfos) HWINFO pInfos[] + ) +{ + if( FALSE != g_IsWin7OrGreater ) + { + return HwInfoInitializeWin7(pnInfos,pInfos); + } + else + { + if( *pnInfos < 1 ) + { + *pnInfos = 1; + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + Assert(pInfos != nullptr); + HRESULT hr = HwInfoInitializeWin6(pInfos); + if( SUCCEEDED( hr ) ) + { + *pnInfos = 1; + } + return hr; + } +} + + + +// +// Summary: +// Initialize the local HWSUMMARY information +// +// Parameters: +// pcbSummary - On input, size of pSummary buffer +// on output, size used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required count will be written here. +// pSummary - The summary information to initialize. +// +HRESULT +HwSummaryInitialize( + _Inout_ UINT32* pcbSummary, + _Inout_updates_bytes_to_(*pcbSummary, *pcbSummary) HWSUMMARY* pSummary + ) +{ + HRESULT hr; + UINT32 nInfos = 0; + UINT32 cb; + + hr = HwInfoInitialize( &nInfos, nullptr ); + if( FAILED( hr ) ) + { + if( HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) != hr ) + { + return hr; + } + } + + cb = sizeof(*pSummary) - sizeof(pSummary->Infos) + + (sizeof(pSummary->Infos[0]) * nInfos); + + if( *pcbSummary < cb ) + { + *pcbSummary = cb; + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + Assert(pSummary != nullptr); + + pSummary->Size = cb; + pSummary->Count = nInfos; + + hr = HwInfoInitialize( &nInfos, pSummary->Infos ); + if( FAILED( hr ) ) + { + return hr; + } + + if (!(g_IsWin7OrGreater && nInfos > 1)) + { + KAFFINITY sysMask; + union + { + KAFFINITY procMask; + UINT64 procMask64; + }; + procMask64 = 0; + if( FALSE == ::GetProcessAffinityMask( ::GetCurrentProcess(), &procMask, &sysMask ) ) + { + return HRESULT_FROM_WIN32( ::GetLastError() ); + } + HwSummaryFilter( pSummary, &procMask64 ); + } + + *pcbSummary = cb; + return S_OK; +} + + + diff --git a/src/mpi/common/hwtree.cpp b/src/mpi/common/hwtree.cpp new file mode 100644 index 0000000..9d5b194 --- /dev/null +++ b/src/mpi/common/hwtree.cpp @@ -0,0 +1,575 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "hwtree.h" +#include "util.h" + +// +// List of masks index by count - 1 of sequential bits set starting at bit 0. +// +static const UINT64 WidthMasks[] = +{ + 0x0000000000000001L,0x0000000000000003L,0x0000000000000007L,0x000000000000000FL, + 0x000000000000001FL,0x000000000000003FL,0x000000000000007FL,0x00000000000000FFL, + 0x00000000000001FFL,0x00000000000003FFL,0x00000000000007FFL,0x0000000000000FFFL, + 0x0000000000001FFFL,0x0000000000003FFFL,0x0000000000007FFFL,0x000000000000FFFFL, + 0x000000000001FFFFL,0x000000000003FFFFL,0x000000000007FFFFL,0x00000000000FFFFFL, + 0x00000000001FFFFFL,0x00000000003FFFFFL,0x00000000007FFFFFL,0x0000000000FFFFFFL, + 0x0000000001FFFFFFL,0x0000000003FFFFFFL,0x0000000007FFFFFFL,0x000000000FFFFFFFL, + 0x000000001FFFFFFFL,0x000000003FFFFFFFL,0x000000007FFFFFFFL,0x00000000FFFFFFFFL, + 0x00000001FFFFFFFFL,0x00000003FFFFFFFFL,0x00000007FFFFFFFFL,0x0000000FFFFFFFFFL, + 0x0000001FFFFFFFFFL,0x0000003FFFFFFFFFL,0x0000007FFFFFFFFFL,0x000000FFFFFFFFFFL, + 0x000001FFFFFFFFFFL,0x000003FFFFFFFFFFL,0x000007FFFFFFFFFFL,0x00000FFFFFFFFFFFL, + 0x00001FFFFFFFFFFFL,0x00003FFFFFFFFFFFL,0x00007FFFFFFFFFFFL,0x0000FFFFFFFFFFFFL, + 0x0001FFFFFFFFFFFFL,0x0003FFFFFFFFFFFFL,0x0007FFFFFFFFFFFFL,0x000FFFFFFFFFFFFFL, + 0x001FFFFFFFFFFFFFL,0x003FFFFFFFFFFFFFL,0x007FFFFFFFFFFFFFL,0x00FFFFFFFFFFFFFFL, + 0x01FFFFFFFFFFFFFFL,0x03FFFFFFFFFFFFFFL,0x07FFFFFFFFFFFFFFL,0x0FFFFFFFFFFFFFFFL, + 0x1FFFFFFFFFFFFFFFL,0x3FFFFFFFFFFFFFFFL,0x7FFFFFFFFFFFFFFFL,0xFFFFFFFFFFFFFFFFL, +}; + + +// +// Summary: +// Utility function to initialize the specified node within the tree. +// +// Parameters: +// pTree - pointer to the tree to manipulate +// index - index of the node within the tree +// type - the type to set on the node +// parent - the parent ID of the node +// previous - the previous node +// +static void +HwTreeInitializeNode( + _Inout_ HWTREE* pTree, + _In_ UINT32 index, + _In_ HWNODE_TYPE type, + _In_ UINT32 parent, + _In_ UINT32 previous + ) +{ + pTree->Nodes[index].Type = type; + pTree->Nodes[index].Parent = parent; + pTree->Nodes[index].FirstChild = HWNODEID_NONE; + pTree->Nodes[index].LastChild = HWNODEID_NONE; + pTree->Nodes[index].NextSibling = HWNODEID_NONE; + pTree->Nodes[index].PrevSibling = previous; + + pTree->Nodes[parent].LastChild = index; + + if( previous == HWNODEID_NONE || + pTree->Nodes[previous].Parent != parent ) + { + pTree->Nodes[parent].FirstChild = index; + } + else + { + pTree->Nodes[previous].NextSibling = index; + } +} + + +// +// Summary: +// Utility function to initialize the specified node within the tree with affinity data. +// +// Parameters: +// pTree - pointer to the tree to manipulate +// index - index of the node within the tree +// type - the type to set on the node +// parent - the parent ID of the node +// previous - the previous node +// group - the processor group to set in the affinity value +// mask - the affinity mask to set +// +static void +HwTreeInitializeAffinityNode( + _Inout_ HWTREE* pTree, + _In_ UINT32 index, + _In_ HWNODE_TYPE type, + _In_ UINT32 parent, + _In_ UINT32 previous, + _In_ UINT16 group, + _In_ UINT64 mask + ) +{ + HwTreeInitializeNode(pTree, index, type, parent, previous); + pTree->Nodes[index].Affinity.GroupId = group; + pTree->Nodes[index].Affinity.Mask = mask; +} + + +// +// Summary: +// Utility function to initialize the specified machine node +// +// Parameters: +// pTree - pointer to the tree to manipulate +// index - index of the node within the tree +// type - the type to set on the node +// parent - the parent ID of the node +// previous - the previous node +// hostId - the hostid of the machine node +// +static void +HwTreeInitializeMachineNode( + _Inout_ HWTREE* pTree, + _In_ UINT32 index, + _In_ HWNODE_TYPE type, + _In_ UINT32 parent, + _In_ UINT32 previous, + _In_ int hostId + ) +{ + HwTreeInitializeNode(pTree, index, type, parent, previous); + pTree->Nodes[index].HostId = hostId; +} + + +// +// Summary: +// Initialize all logical core elements in the tree. +// +// Parameter: +// pTree - pointer to the tree to populate +// pStrides - pointer to the current strides of each level in the tree +// pEnds - pointer to the current ends of each level in the tree +// group - the processor group that this core belongs to. +// pcoreMask - the processor mask for the parent physical core +// +static HRESULT +HwTreeInitializeLCores( + _Inout_ HWTREE* pTree, + _Inout_updates_(HWNODE_MAX_DEPTH) UINT32 pStrides[], + _In_reads_(HWNODE_MAX_DEPTH) const UINT32 pEnds[], + _In_ UINT16 group, + _In_ UINT64 pcoreMask + ) +{ + UINT32 last = HWNODEID_NONE; + UINT64 fullMask = pcoreMask; + + // + // Get the lowest set bit from pcoreMask (the first logical core) + // + UINT64 mask = ((~pcoreMask << 1 ) | 1) & pcoreMask; + + while( 0 != fullMask ) + { + Assert(mask & pcoreMask); + + if( pStrides[HWNODE_TYPE_LCORE] >= pEnds[HWNODE_TYPE_LCORE] ) + { + return E_UNEXPECTED; + } + + HwTreeInitializeAffinityNode( + pTree, + pStrides[HWNODE_TYPE_LCORE], + HWNODE_TYPE_LCORE, + pStrides[HWNODE_TYPE_PCORE], + last, + group, + mask + ); + + last = pStrides[HWNODE_TYPE_LCORE]; + pStrides[HWNODE_TYPE_LCORE]++; + pTree->Counts[HWNODE_TYPE_LCORE]++; + + // + // Remove mask from the remaining bits + // + fullMask &= (~mask); + + // + // Move to the next bit + // + mask <<= 1; + } + return S_OK; +} + + +// +// Summary: +// Initialize all physical core elements in the tree. +// +// Parameter: +// pTree - pointer to the tree to populate +// pStrides - pointer to the current strides of each level in the tree +// pEnds - pointer to the current ends of each level in the tree +// numaMask - the processor mask for the parent numa node +// pInfo - pointer to the HWINFO for the current processor group +// +static HRESULT +HwTreeInitializePcores( + _Inout_ HWTREE* pTree, + _Inout_updates_(HWNODE_MAX_DEPTH) UINT32 pStrides[], + _In_reads_(HWNODE_MAX_DEPTH) const UINT32 pEnds[], + UINT64 numaMask, + const HWINFO* pInfo + ) +{ + HRESULT hr; + UINT32 last = HWNODEID_NONE; + UINT64 fullMask = numaMask; + + // + // Get the lowest N bits from numaMask where N is PCoreWidth (the first physical core) + // + Assert(pInfo->PcoreWidth>0); + UINT64 mask = ((~numaMask << pInfo->PcoreWidth ) | WidthMasks[pInfo->PcoreWidth-1]) & numaMask; + + while( 0 != fullMask ) + { + Assert( mask & numaMask ); + + if( pStrides[HWNODE_TYPE_PCORE] >= pEnds[HWNODE_TYPE_PCORE] ) + { + return E_UNEXPECTED; + } + + HwTreeInitializeAffinityNode( + pTree, + pStrides[HWNODE_TYPE_PCORE], + HWNODE_TYPE_PCORE, + pStrides[HWNODE_TYPE_NUMA], + last, + pInfo->Group, + mask + ); + + hr = HwTreeInitializeLCores( pTree, pStrides, pEnds, pInfo->Group, mask ); + if( FAILED( hr ) ) + { + return hr; + } + + last = pStrides[HWNODE_TYPE_PCORE]; + pStrides[HWNODE_TYPE_PCORE]++; + pTree->Counts[HWNODE_TYPE_PCORE]++; + + // + // Remove mask from the remaining bits + // + fullMask &= (~mask); + + // + // Move to the next physical core + // + mask <<= pInfo->PcoreWidth; + } + return S_OK; +} + + +// +// Summary: +// Initialize all numa elements in the tree. +// +// Parameter: +// pTree - pointer to the tree to populate +// pStrides - pointer to the current strides of each level in the tree +// pEnds - pointer to the current ends of each level in the tree +// pInfo - pointer to the HWINFO for the current processor group +// +static HRESULT +HwTreeInitializeNuma( + _Inout_ HWTREE* pTree, + _Inout_updates_(HWNODE_MAX_DEPTH) UINT32 pStrides[], + _In_reads_(HWNODE_MAX_DEPTH) const UINT32 pEnds[], + _In_ const HWINFO* pInfo + ) +{ + HRESULT hr; + UINT32 last = HWNODEID_NONE; + UINT64 fullMask = pInfo->Mask; + + // + // Get the lowest N bits from group mask where N is NumaWidth (the numa node) + // + Assert(pInfo->NumaWidth>0); + UINT64 mask = ((~pInfo->Mask << pInfo->NumaWidth ) | WidthMasks[pInfo->NumaWidth-1]) & pInfo->Mask; + + while( 0 != fullMask ) + { + Assert( mask & pInfo->Mask ); + + if( pStrides[HWNODE_TYPE_NUMA] >= pEnds[HWNODE_TYPE_NUMA] ) + { + return E_UNEXPECTED; + } + + HwTreeInitializeAffinityNode( + pTree, + pStrides[HWNODE_TYPE_NUMA], + HWNODE_TYPE_NUMA, + pStrides[HWNODE_TYPE_GROUP], + last, + pInfo->Group, + mask + ); + + hr = HwTreeInitializePcores(pTree, pStrides, pEnds, mask, pInfo); + if( FAILED( hr ) ) + { + return hr; + } + + last = pStrides[HWNODE_TYPE_NUMA]; + pStrides[HWNODE_TYPE_NUMA]++; + pTree->Counts[HWNODE_TYPE_NUMA]++; + + // + // Remove mask from the remaining bits + // + fullMask &= (~mask); + + // + // Move to the next numa node + // + mask <<= pInfo->NumaWidth; + } + return S_OK; +} + + +// +// Summary: +// Initialize all Group and Machine element in the tree. +// +// Parameter: +// pTree - pointer to the tree to populate +// pStrides - pointer to the current strides of each level in the tree +// pEnds - pointer to the current ends of each level in the tree +// pSummary - Pointer to machine's summary +// +static HRESULT +HwTreeInitializeGroups( + _Inout_ HWTREE* pTree, + _Inout_updates_(HWNODE_MAX_DEPTH) UINT32 pStrides[], + _In_reads_(HWNODE_MAX_DEPTH) const UINT32 pEnds[], + _In_ const HWSUMMARY* pSummary + + ) +{ + UINT32 lastMachine = HWNODEID_NONE; + UINT32 lastGroup = HWNODEID_NONE; + HRESULT hr; + + if(pSummary == nullptr) + { + return S_OK; + } + + if( pStrides[HWNODE_TYPE_MACHINE] >= pEnds[HWNODE_TYPE_MACHINE] ) + { + return E_UNEXPECTED; + } + + HwTreeInitializeMachineNode( + pTree, + pStrides[HWNODE_TYPE_MACHINE], + HWNODE_TYPE_MACHINE, + HWNODEID_WORLD, + lastMachine, + HWMACHINEID_SELF + ); + lastGroup = HWNODEID_NONE; + + for( UINT32 i = 0; i < pSummary->Count; i++ ) + { + if( pStrides[HWNODE_TYPE_GROUP] >= pEnds[HWNODE_TYPE_GROUP] ) + { + return E_UNEXPECTED; + } + + HwTreeInitializeAffinityNode( + pTree, + pStrides[HWNODE_TYPE_GROUP], + HWNODE_TYPE_GROUP, + pStrides[HWNODE_TYPE_MACHINE], + lastGroup, + pSummary->Infos[i].Group, + pSummary->Infos[i].Mask + ); + + hr = HwTreeInitializeNuma( pTree, pStrides, pEnds, &pSummary->Infos[i] ); + if( FAILED( hr ) ) + { + return hr; + } + + lastGroup = pStrides[HWNODE_TYPE_GROUP]; + pStrides[HWNODE_TYPE_GROUP]++; + pTree->Counts[HWNODE_TYPE_GROUP]++; + } + + lastMachine = pStrides[HWNODE_TYPE_MACHINE]; + pStrides[HWNODE_TYPE_MACHINE]++; + pTree->Counts[HWNODE_TYPE_MACHINE]++; + + return S_OK; +} + + +// +// Summary: +// Calculate the size of the tree required for the specified HWINFO array +// +// Parameters: +// pSummary - Pointer to a machine's summary information. +// pCounts - Pointer to array of UINT32 for holding the counts of each level in the tree. +// +// Returns: +// Total node code for full tree. +// +_Success_(return > 0) +static UINT32 +HwTreeCalculateNodeCounts( + _In_opt_ const HWSUMMARY* pSummary, + _Out_writes_(HWNODE_MAX_DEPTH) UINT32 pCounts[] + ) +{ + if(pSummary == nullptr) + { + return 0; + } + + pCounts[HWNODE_TYPE_MACHINE] = 0; + pCounts[HWNODE_TYPE_GROUP] = 0; + pCounts[HWNODE_TYPE_NUMA] = 0; + pCounts[HWNODE_TYPE_PCORE] = 0; + pCounts[HWNODE_TYPE_LCORE] = 0; + + + pCounts[HWNODE_TYPE_MACHINE]++; + //one for every group + pCounts[HWNODE_TYPE_GROUP] += pSummary->Count; + + for( UINT32 i = 0; i < pSummary->Count; i++ ) + { + + pCounts[HWNODE_TYPE_NUMA] += pSummary->Infos[i].GroupWidth / pSummary->Infos[i].NumaWidth; + + // + // 1 for each pcore + // + pCounts[HWNODE_TYPE_PCORE] += pSummary->Infos[i].GroupWidth / pSummary->Infos[i].PcoreWidth; + + // + // 1 for each lcore + // + pCounts[HWNODE_TYPE_LCORE] += pSummary->Infos[i].GroupWidth; + } + + // + // Include 1 extra for the WORLD node. + // + return 1 + + pCounts[HWNODE_TYPE_MACHINE] + + pCounts[HWNODE_TYPE_GROUP] + + pCounts[HWNODE_TYPE_NUMA] + + pCounts[HWNODE_TYPE_PCORE] + + pCounts[HWNODE_TYPE_LCORE]; +} + + +// +// Summary: +// Initialize hardware tree representing all machines. +// +// Parameters: +// pcbTree - On input, current size of pTree +// On output, the size of the buffer used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required size will be written here. +// pTree - pointer to HWTREE buffer +// pSummary - Pointer to a machine's summary information. +// +// NOTE: +// The memory is sequentially allocated, and can be marshalled with memcpy. +// +HRESULT +HwTreeInitialize( + _Inout_ UINT32* pcbTree, + _Inout_updates_to_(*pcbTree,*pcbTree) HWTREE* pTree, + _In_ const HWSUMMARY* pSummary + ) +{ + HRESULT hr; + UINT32 cb; + UINT32 nNodes; + UINT32 strides[HWNODE_MAX_DEPTH]; + UINT32 ends[HWNODE_MAX_DEPTH]; + + // + // Count total nodes + 1 for world + // + nNodes = HwTreeCalculateNodeCounts( pSummary, ends ); + + // + // There must be at least 1 node for each level in the tree. + // + Assert( nNodes >= HWNODE_MAX_DEPTH ); + + cb = sizeof(*pTree) - sizeof(pTree->Nodes) + (sizeof(pTree->Nodes[0]) * nNodes); + + if( *pcbTree < cb ) + { + *pcbTree = cb; + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + // + // Update the stride table. + // + strides[HWNODE_TYPE_MACHINE]= 1; + strides[HWNODE_TYPE_GROUP] = strides[HWNODE_TYPE_MACHINE] + ends[HWNODE_TYPE_MACHINE]; + strides[HWNODE_TYPE_NUMA] = strides[HWNODE_TYPE_GROUP] + ends[HWNODE_TYPE_GROUP]; + strides[HWNODE_TYPE_PCORE] = strides[HWNODE_TYPE_NUMA] + ends[HWNODE_TYPE_NUMA]; + strides[HWNODE_TYPE_LCORE] = strides[HWNODE_TYPE_PCORE] + ends[HWNODE_TYPE_PCORE]; + + pTree->Strides[HWNODE_TYPE_MACHINE] = strides[HWNODE_TYPE_MACHINE]; + pTree->Strides[HWNODE_TYPE_GROUP] = strides[HWNODE_TYPE_GROUP]; + pTree->Strides[HWNODE_TYPE_NUMA] = strides[HWNODE_TYPE_NUMA]; + pTree->Strides[HWNODE_TYPE_PCORE] = strides[HWNODE_TYPE_PCORE]; + pTree->Strides[HWNODE_TYPE_LCORE] = strides[HWNODE_TYPE_LCORE]; + + pTree->Counts[HWNODE_TYPE_MACHINE] = 0; + pTree->Counts[HWNODE_TYPE_GROUP] = 0; + pTree->Counts[HWNODE_TYPE_NUMA] = 0; + pTree->Counts[HWNODE_TYPE_PCORE] = 0; + pTree->Counts[HWNODE_TYPE_LCORE] = 0; + + // + // update the "ends" to be offset from the strides so we don't + // have to track the start of the chain through the iteration. + // + ends[HWNODE_TYPE_MACHINE] += strides[HWNODE_TYPE_MACHINE]; + ends[HWNODE_TYPE_GROUP] += strides[HWNODE_TYPE_GROUP]; + ends[HWNODE_TYPE_NUMA] += strides[HWNODE_TYPE_NUMA]; + ends[HWNODE_TYPE_PCORE] += strides[HWNODE_TYPE_PCORE]; + ends[HWNODE_TYPE_LCORE] += strides[HWNODE_TYPE_LCORE]; + + + pTree->Nodes[HWNODEID_WORLD].Type = HWNODE_TYPE_WORLD; + pTree->Nodes[HWNODEID_WORLD].Parent = HWNODEID_NONE; + pTree->Nodes[HWNODEID_WORLD].FirstChild = HWNODEID_NONE; + pTree->Nodes[HWNODEID_WORLD].LastChild = HWNODEID_NONE; + pTree->Nodes[HWNODEID_WORLD].NextSibling = HWNODEID_NONE; + pTree->Nodes[HWNODEID_WORLD].PrevSibling = HWNODEID_NONE; + + + hr = HwTreeInitializeGroups(pTree, strides, ends, pSummary); + if( FAILED( hr ) ) + { + return hr; + } + + *pcbTree = cb; + return S_OK; +} + diff --git a/src/mpi/common/hwtree.h b/src/mpi/common/hwtree.h new file mode 100644 index 0000000..0360347 --- /dev/null +++ b/src/mpi/common/hwtree.h @@ -0,0 +1,470 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include +#include "hwtree_common.h" + +#pragma once + +// +// The maximum depth of the tree +// +#define HWNODE_MAX_DEPTH ((UINT32)HWNODE_TYPE_MAX) + + +// +// Fixed width field for holding affinity information. +// +// Fields: +// Mask - 64bit mask of processors with in the specified processor group. +// GroupId - The processor group id that the affinity mask applies to. +// Padding - padding to show wasted space. +// +typedef struct _HWAFFINITY +{ + UINT64 Mask; + UINT16 GroupId; + UINT16 Padding[3]; + +} HWAFFINITY; + + +#define HWNODEID_WORLD ((UINT32)0) +#define HWNODEID_NONE ((UINT32)MAXDWORD) +#define HWMACHINEID_SELF ((UINT32)1) + +// +// Definition of basic tree node +// +// Fields: +// Type - The type of data within the node. +// Parent - Index of the parent element +// FirstChild - Index of this nodes first child +// LastChild - Index of this nodes last child +// NextSibling - Index of this nodes next sibling +// PrevSibling - Index of this nodes previous sibling +// +typedef struct HWNODEHEADER +{ + HWNODE_TYPE Type; + UINT32 Parent; + UINT32 FirstChild; + UINT32 LastChild; + UINT32 NextSibling; + UINT32 PrevSibling; + +} HWNODEHEADER; + + +// +// Definition of a node in the HWTREE. +// +// Fields: +// Affinity - Specifies the affinity information represented by the node +// Valid only when Type > HWNODE_TYPE_MACHINE +// HostId - Specifies the identifier for the machine in the tree. +// Valid only when Type == HWNODE_TYPE_MACHINE +// +typedef struct _HWNODE + : public HWNODEHEADER +{ + union + { + HWAFFINITY Affinity; + int HostId; + }; + +} HWNODE; + + +// +// Definition of a node in the HWVIEW. +// +// Fields: +// NodeId - Specifies node id in the original tree. +// +typedef struct _HWVIEWNODE +: public HWNODEHEADER +{ + UINT32 NodeId; + +} HWVIEWNODE; + + +// +// Summary: +// Data structure representing the a single machine hardware tree. +// +// Fields: +// Counts - The total counts of each depth in the tree +// Strides - The stride offset to the start of each level in the tree +// Nodes - This list of HWNODE structures that make up the tree. +// +typedef struct _HWTREE +{ + UINT32 Counts[HWNODE_MAX_DEPTH]; + UINT32 Strides[HWNODE_MAX_DEPTH]; + HWNODE Nodes[ANYSIZE_ARRAY]; + +} HWTREE; + + +// +// Summary: +// Structure that represents a portion of the tree within a HWTREE +// +// Fields: +// Counts - The total counts of each depth in the tree +// Strides - The stride offset to the start of each level in the tree +// Nodes - This list of HWVIEWNODE structures that make up the tree. +// +typedef struct _HWVIEW +{ + const HWTREE* Tree; + UINT32 Counts[HWNODE_MAX_DEPTH]; + UINT32 Strides[HWNODE_MAX_DEPTH]; + HWVIEWNODE Nodes[ANYSIZE_ARRAY]; + +} HWVIEW; + + +// +// Summary: +// Summary of the local information on an individual processor group +// +// Fields: +// Mask - The entire bitmask for the group +// ActiveMask - The active bitmask for the group after filter +// Group - the processor group id +// We only use UINT8 worth of groups. There is no +// real world scenario where this will not work, and +// using this size makes the structure pack cleanly. +// GroupWidth - The number of logical cores for this group +// NumaWidth - the number of logical cores per numa node +// PcoreWidth - the number of logical cores per physical core +// Padding - Pad. +// +typedef struct _HWINFO +{ + UINT64 Mask; + UINT64 ActiveMask; + UINT8 Group; + UINT8 GroupWidth; + UINT8 NumaWidth; + UINT8 PcoreWidth; + UINT32 Padding; + +} HWINFO; + + +// +// Summary: +// Hosts the logical processor information for the processor groups on a machine. +// +// Fields: +// Size - The total size of the buffer +// Count - The count of elements in Infos +// Infos - The array of HWINFO, one for each Processor Group +// +typedef struct _HWSUMMARY +{ + UINT32 Size; + UINT32 Count; + HWINFO Infos[ANYSIZE_ARRAY]; + +} HWSUMMARY; + + +// +// Summary: +// Hosts the summary information for a local machine. +// +// Fields: +// Next - The pointer to the next machine in the chain +// Summary - Pointer to the summary information for the machine +// HostId - The unique id assigned to the machine. +// +typedef struct _HWMACHINEINFO +{ + struct _HWMACHINEINFO* Next; + HWSUMMARY* Summary; + int HostId; + +} HWMACHINEINFO; + + +// +// Summary: +// Represents an exprssion parsed from the LAYOUT format string +// +// Fields: +// Left - The left side of the expression +// Right - The right side of the expression +// Flags - The flags to indicate how to interpret Left and Right fields. +// HWENUM_EXPR_WELLKNOWN_LEFT - means that left must be resolved +// HWENUM_EXPR_DIVIDE_BY_RIGHT - means that right is present +// HWENUM_EXPR_WELLKNOWN_RIGHT - means that right must be resolved +// If no flags are set, Left is a constant value. +// +typedef struct _HWENUM_EXPR +{ + UINT32 Left; + UINT32 Right; + UINT32 Flags; + +} HWENUM_EXPR; + + +#define HWENUM_EXPR_WELLKNOWN_LEFT 0x1 +#define HWENUM_EXPR_DIVIDE_BY_RIGHT 0x2 +#define HWENUM_EXPR_WELLKNOWN_RIGHT 0x4 + +// +// Summary: +// Represents the settings for an individual enumeration in an HWTREE +// +// Fields: +// Type - The depth in the HWTREE to target +// Offset - The offset from the start to use +// Count - The count of steps. +// Stride - The stride to use for each step +// RepeatCount - The number of times repeat all steps. +// RepeatOffset - The size to step the offset each repeat. +// +typedef struct _HWENUM +{ + HWNODE_TYPE Type; + HWENUM_EXPR Offset; + HWENUM_EXPR Count; + HWENUM_EXPR Stride; + HWENUM_EXPR RepeatCount; + HWENUM_EXPR RepeatOffset; + +} HWENUM; + + +#define HWLAYOUT_ENUM_MAX (HWNODE_MAX_DEPTH) + +// +// Summary: +// Represents the layout information of the processes. +// +// Fields: +// TargetType - The affinity target type +// TargetCount - The count of processes to create on each target +// EnumCount - The count of enumeration items specified +// Must be <= HWLAYOUT_ENUM_MAX. +// Enums - The array of enumeration items. +// +typedef struct _HWLAYOUT +{ + HWNODE_TYPE TargetType; + UINT32 TargetCount; + UINT32 EnumCount; + HWENUM Enums[HWLAYOUT_ENUM_MAX]; + +} HWLAYOUT; + + +// +// Summary: +// Holds the iteration state during the processing of an HWENUM +// +// Fields: +// Start - The start value for the full list +// Size - The count of elements for the full list +// Current - The current offset in the full list +// This is used for deriving the size of child HWENUM's +// +typedef struct _HWENUM_STATE +{ + UINT32 Start; + UINT32 Size; + UINT32 Current; + +} HWENUM_STATE; + + +// +// Summary: +// Holds the processing state of an HWLAYOUT +// +// Fields: +// MinProc - The number of process that must be created. +// MaxProc - The maximum number of processes to create. +// ProcCount - The total number of processes created. +// Enums - Array of states corresponding to the HWENUM in the layout +// For example, item 0 represents the state for HWENUM 0 in the layout. +// +typedef struct _HWLAYOUT_STATE +{ + UINT32 MinProc; + UINT32 MaxProc; + UINT32 ProcCount; + HWENUM_STATE Enums[HWLAYOUT_ENUM_MAX]; + +} HWLAYOUT_STATE; + + +// +// Summary: +// Callback function invoked for each set of processes created during layout. +// +// Paramters: +// pLayout - Pointer to the requested layout information. +// pState - Pointer to the layout iteration state information. +// pView - The view to use to get the location information. +// location - The location within the view to assign the item. +// pData - Opaque data passed from entry to callback functions. +// pCount - On input, specifies the count of the processes to created. +// On output, specifies the number of processes created. +// +// NOTE: Return S_FALSE to terminate process creation immediately. +// +typedef HRESULT ( __stdcall FN_HwLayoutProcessCallback) ( + __in const HWLAYOUT* pLayout, + __in const HWLAYOUT_STATE* pState, + __in const HWVIEW* pView, + __in UINT32 location, + __in PVOID pData, + __inout UINT32* pCount + ); + + +// +// Summary: +// Initialize hardware tree representing all machines. +// +// Parameters: +// pcbTree - On input, current size of pTree +// On output, the size of the buffer used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required size will be written here. +// pTree - pointer to HWTREE buffer +// pSummary - pointer to a machine's summary information. +// +// NOTE: +// The memory is sequentially allocated, and can be marshalled with memcpy. +// +HRESULT +HwTreeInitialize( + _Inout_ UINT32* pcbTree, + _Inout_updates_to_(*pcbTree,*pcbTree) HWTREE* pTree, + _In_ const HWSUMMARY* pSummary + ); + + +// +// Summary: +// Find the node id for the specified machine +// +// Parameters: +// pTree - The tree to search for the machine node. +// pInfo - The HostId field is used as the search key. +// +// Returns: +// HWNODEID_NONE - if not found +// +inline UINT32 +HwTreeFindMachineNodeId( + _In_ const HWTREE* pTree, + _In_ const HWMACHINEINFO* pInfo + ) +{ + UINT32 stride; + for( UINT32 i = 0; i < pTree->Counts[HWNODE_TYPE_MACHINE]; i++ ) + { + stride = i + pTree->Strides[HWNODE_TYPE_MACHINE]; + if( pTree->Nodes[ stride ].HostId == pInfo->HostId ) + { + return stride; + } + } + return HWNODEID_NONE; +} + + +// +// Summary: +// Initialize the local HWSUMMARY information +// +// Parameters: +// pcbSummary - On input, size of pSummary buffer +// on output, size used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required count will be written here. +// pSummary - The summary information to initialize. +// +HRESULT +HwSummaryInitialize( + _Inout_ UINT32* pcbSummary, + _Inout_updates_bytes_to_(*pcbSummary, *pcbSummary) HWSUMMARY* pSummary + ); + + +// +// Summary: +// Filter out the processor information in each processor group. +// +// Parameters: +// pSummary - The summary information to filter. +// pFilters - The core filters to apply +// +inline void +HwSummaryFilter( + _Inout_ HWSUMMARY* pSummary, + _In_reads_(pSummary->Count) const UINT64 pFilters[] + ) +{ + for( UINT32 i = 0; i < pSummary->Count; i++ ) + { + pSummary->Infos[i].ActiveMask &= pFilters[i]; + } +} + + +// +// Summary: +// Initialize a HWVIEW from an HWTREE +// +// Parameters: +// pcbView - On input, current size of pView +// On output, the size of the buffer used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required size will be written here. +// pView - pointer to HWVIEW buffer +// pTree - Pointer to tree to base view on +// pSummary - Pointer to a summary of machine. +// +HRESULT +HwViewInitialize( + _Inout_ UINT32* pcbView, + _Out_writes_to_(*pcbView,*pcbView) HWVIEW* pView, + _In_ const HWTREE* pTree, + _In_ const HWSUMMARY* pSummary + ); + + +// +// Summary: +// Process the specified layout using the specified tree +// +// Parameters: +// pLayout - Pointer to layout description +// pView - Pointer to the view +// minProc - Minimum number of processes to create +// maxProc - Maximum number of processes to create +// pData - Opaque data pointer to hand to callback +// pfn - Callback function to invoke for each iteration +// +HRESULT +HwLayoutProcess( + _In_ const HWLAYOUT* pLayout, + _In_ const HWVIEW* pView, + _In_ UINT32 minProc, + _In_ UINT32 maxProc, + _In_ PVOID pData, + _In_ FN_HwLayoutProcessCallback* pfn + ); + + diff --git a/src/mpi/common/hwtree_common.h b/src/mpi/common/hwtree_common.h new file mode 100644 index 0000000..95d53f0 --- /dev/null +++ b/src/mpi/common/hwtree_common.h @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +// +// Represents the node types in the tree. Each value +// corrisponds to depth in the HW tree. +// +typedef enum _HWNODE_TYPE +{ + HWNODE_TYPE_WORLD = -1, + HWNODE_TYPE_MACHINE = 0, + HWNODE_TYPE_GROUP = 1, + HWNODE_TYPE_NUMA = 2, + HWNODE_TYPE_PCORE = 3, + HWNODE_TYPE_LCORE = 4, + + HWNODE_TYPE_MAX, + +} HWNODE_TYPE; + + +enum SMPD_AFFINITY_PLACEMENT +{ + SMPD_AFFINITY_DISABLED = 0, + SMPD_AFFINITY_SPREAD = 1, + SMPD_AFFINITY_SEQUENTIAL = 2, + SMPD_AFFINITY_BALANCED = 3, + SMPD_AFFINITY_DEFAULT = SMPD_AFFINITY_SPREAD, +}; + + + +typedef struct _AffinityOptions +{ + BOOL isSet; + BOOL isExplicit; + BOOL isAuto; + enum SMPD_AFFINITY_PLACEMENT placement; + HWNODE_TYPE target; + HWNODE_TYPE stride; + INT affinityTableStyle; + INT hwTableStyle; +} AffinityOptions; diff --git a/src/mpi/common/hwview.cpp b/src/mpi/common/hwview.cpp new file mode 100644 index 0000000..d237f78 --- /dev/null +++ b/src/mpi/common/hwview.cpp @@ -0,0 +1,292 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "hwtree.h" +#include "util.h" + +// +// Summary: +// Utility function to initialize the specified node within the view. +// +// Parameters: +// pView - pointer to the view to manipulate +// index - index of the node with in the tree +// type - the type to set on the node +// parent - the parent ID of the node +// previous - the previous node +// treeNodeId - id of the node in the original tree +// +static void +HwViewInitializeNode( + _Inout_ HWVIEW* pView, + _In_ UINT32 index, + _In_ HWNODE_TYPE type, + _In_ UINT32 parent, + _In_ UINT32 previous, + _In_ UINT32 treeNodeId + ) +{ + pView->Nodes[index].Type = type; + pView->Nodes[index].Parent = parent; + pView->Nodes[index].FirstChild = HWNODEID_NONE; + pView->Nodes[index].LastChild = HWNODEID_NONE; + pView->Nodes[index].NextSibling = HWNODEID_NONE; + pView->Nodes[index].PrevSibling = previous; + + pView->Nodes[parent].LastChild = index; + + if( previous == HWNODEID_NONE || + pView->Nodes[previous].Parent != parent ) + { + pView->Nodes[parent].FirstChild = index; + } + else + { + pView->Nodes[previous].NextSibling = index; + } + + pView->Nodes[index].NodeId = treeNodeId; +} + +// +// Summary: +// Initialize the subtree elements of the view +// +// Parameters: +// pView - pointer to the view to initialize +// pStrides - array of offsets for each level in the view +// pEnds - array of end offsets for each level in the view +// parentId - the node id of the parent to add children for +// +static HRESULT +HwViewInitializeSubTree( + _Inout_ HWVIEW* pView, + _Inout_updates_(HWNODE_MAX_DEPTH) UINT32 pStrides[], + _Inout_updates_(HWNODE_MAX_DEPTH) UINT32 pEnds[], + _In_ UINT32 parentId, + _In_ const HWSUMMARY* pSummary + ) +{ + UINT32 last = HWNODEID_NONE; + UINT32 current = pView->Tree->Nodes[parentId].FirstChild; + UINT32 end = pView->Tree->Nodes[parentId].LastChild; + + HWNODE_TYPE depth = pView->Tree->Nodes[current].Type; + + Assert(depth >= HWNODE_TYPE_GROUP); + Assert( nullptr != pSummary ); + + while( current <= end ) + { + if( pStrides[depth] >= pEnds[depth] ) + { + return E_UNEXPECTED; + } + + // + // Verify that the current element has not been filtered by the HWSUMMARY. + // + Assert( pSummary->Count >= (UINT32)pView->Tree->Nodes[ current ].Affinity.GroupId ); + if( 0 == ( pView->Tree->Nodes[current].Affinity.Mask & pSummary->Infos[pView->Tree->Nodes[ current ].Affinity.GroupId].ActiveMask ) ) + { + current++; + continue; + } + + HwViewInitializeNode( + pView, + pStrides[depth], + depth, + pStrides[depth - 1], + last, + current + ); + + if( depth + 1 < HWNODE_MAX_DEPTH ) + { + HRESULT hr = HwViewInitializeSubTree( pView, pStrides, pEnds, current, pSummary ); + if( FAILED( hr ) ) + { + return hr; + } + } + last = pStrides[depth]; + pStrides[depth]++; + pView->Counts[depth]++; + current++; + } + return S_OK; +} + + +// +// Summary: +// Utility function to collect the node counts for each depth and the total count +// for the specified set of machines in the tree. +// +// Paramters: +// pTree - pointer to the tree to scan +// pMachines - The linked list of machine information +// pCounts - array to recieve the counts at each depth +// +// Returns: +// The total number of nodes required in the View +// +static UINT32 +HwViewCalculateCountNodes( + _In_ const HWTREE* pTree, + _Out_writes_(HWNODE_MAX_DEPTH) UINT32 pCounts[] + ) +{ + pCounts[HWNODE_TYPE_MACHINE] = 0; + pCounts[HWNODE_TYPE_GROUP] = 0; + pCounts[HWNODE_TYPE_NUMA] = 0; + pCounts[HWNODE_TYPE_PCORE] = 0; + pCounts[HWNODE_TYPE_LCORE] = 0; + + UINT32 first; + UINT32 last; + UINT32 depth; + UINT32 machineId; + + machineId = HWMACHINEID_SELF; + + Assert(machineId >= pTree->Strides[HWNODE_TYPE_MACHINE] ); + Assert(machineId < pTree->Strides[HWNODE_TYPE_MACHINE] + pTree->Counts[HWNODE_TYPE_MACHINE] ); + Assert(pTree->Nodes[machineId].Type == HWNODE_TYPE_MACHINE); + + depth = static_cast( HWNODE_TYPE_GROUP ); + first = pTree->Nodes[machineId].FirstChild; + last = pTree->Nodes[machineId].LastChild; + + do + { + Assert( first != HWNODEID_NONE ); + Assert( last != HWNODEID_NONE ); + + pCounts[depth] += last - first + 1; + first = pTree->Nodes[first].FirstChild; + last = pTree->Nodes[last].LastChild; + + } while( ++depth < HWNODE_MAX_DEPTH ); + + pCounts[HWNODE_TYPE_MACHINE]++; + + // + // Include 1 extra for the WORLD node. + // + return 1 + + pCounts[HWNODE_TYPE_MACHINE] + + pCounts[HWNODE_TYPE_GROUP] + + pCounts[HWNODE_TYPE_NUMA] + + pCounts[HWNODE_TYPE_PCORE] + + pCounts[HWNODE_TYPE_LCORE]; + +} + + +// +// Summary: +// Initialize a HWVIEW from an HWTREE +// +// Parameters: +// pcbView - On input, current size of pView +// On output, the size of the buffer used. +// if return code is HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) +// the required size will be written here. +// pView - pointer to HWVIEW buffer +// pTree - Pointer to tree to base view on +// pMachines - The linked list of machine information +// +HRESULT +HwViewInitialize( + _Inout_ UINT32* pcbView, + _Out_writes_to_(*pcbView,*pcbView) HWVIEW* pView, + _In_ const HWTREE* pTree, + _In_ const HWSUMMARY* pSummary + ) +{ + UINT32 machineId; + UINT32 strides[HWNODE_MAX_DEPTH]; + UINT32 ends[HWNODE_MAX_DEPTH]; + UINT32 last = HWNODEID_NONE; + + UINT32 nNodes = HwViewCalculateCountNodes( pTree, ends ); + + UINT32 cb = sizeof(*pView) - sizeof(pView->Nodes) + ( sizeof(pView->Nodes[0]) * nNodes ); + if( cb > *pcbView ) + { + *pcbView = cb; + return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + // + // Update the stride table. + // + strides[HWNODE_TYPE_MACHINE]= 1; + strides[HWNODE_TYPE_GROUP] = strides[HWNODE_TYPE_MACHINE] + ends[HWNODE_TYPE_MACHINE]; + strides[HWNODE_TYPE_NUMA] = strides[HWNODE_TYPE_GROUP] + ends[HWNODE_TYPE_GROUP]; + strides[HWNODE_TYPE_PCORE] = strides[HWNODE_TYPE_NUMA] + ends[HWNODE_TYPE_NUMA]; + strides[HWNODE_TYPE_LCORE] = strides[HWNODE_TYPE_PCORE] + ends[HWNODE_TYPE_PCORE]; + + pView->Strides[HWNODE_TYPE_MACHINE] = strides[HWNODE_TYPE_MACHINE]; + pView->Strides[HWNODE_TYPE_GROUP] = strides[HWNODE_TYPE_GROUP]; + pView->Strides[HWNODE_TYPE_NUMA] = strides[HWNODE_TYPE_NUMA]; + pView->Strides[HWNODE_TYPE_PCORE] = strides[HWNODE_TYPE_PCORE]; + pView->Strides[HWNODE_TYPE_LCORE] = strides[HWNODE_TYPE_LCORE]; + + pView->Counts[HWNODE_TYPE_MACHINE] = 0; + pView->Counts[HWNODE_TYPE_GROUP] = 0; + pView->Counts[HWNODE_TYPE_NUMA] = 0; + pView->Counts[HWNODE_TYPE_PCORE] = 0; + pView->Counts[HWNODE_TYPE_LCORE] = 0; + + // + // update the "ends" to be offset from the strides so we don't + // have to track the start of the chain through the iteration. + // + ends[HWNODE_TYPE_MACHINE] += strides[HWNODE_TYPE_MACHINE]; + ends[HWNODE_TYPE_GROUP] += strides[HWNODE_TYPE_GROUP]; + ends[HWNODE_TYPE_NUMA] += strides[HWNODE_TYPE_NUMA]; + ends[HWNODE_TYPE_PCORE] += strides[HWNODE_TYPE_PCORE]; + ends[HWNODE_TYPE_LCORE] += strides[HWNODE_TYPE_LCORE]; + + pView->Nodes[HWNODEID_WORLD].Type = HWNODE_TYPE_WORLD; + pView->Nodes[HWNODEID_WORLD].Parent = HWNODEID_NONE; + pView->Nodes[HWNODEID_WORLD].NextSibling = HWNODEID_NONE; + pView->Nodes[HWNODEID_WORLD].FirstChild = HWNODEID_NONE; + pView->Nodes[HWNODEID_WORLD].PrevSibling = HWNODEID_NONE; + pView->Nodes[HWNODEID_WORLD].LastChild = HWNODEID_NONE; + + pView->Tree = pTree; + + if( strides[HWNODE_TYPE_MACHINE] >= ends[HWNODE_TYPE_MACHINE] ) + { + return E_UNEXPECTED; + } + + machineId = HWMACHINEID_SELF; + + HwViewInitializeNode( + pView, + strides[HWNODE_TYPE_MACHINE], + HWNODE_TYPE_MACHINE, + HWNODEID_WORLD, + last, + machineId + ); + + + HRESULT hr = HwViewInitializeSubTree(pView, strides, ends, machineId, pSummary); + if( FAILED( hr ) ) + { + return hr; + } + last = strides[HWNODE_TYPE_MACHINE]; + strides[HWNODE_TYPE_MACHINE]++; + pView->Counts[HWNODE_TYPE_MACHINE]++; + + *pcbView = cb; + return S_OK; +} \ No newline at end of file diff --git a/src/mpi/common/ipcShm.h b/src/mpi/common/ipcShm.h new file mode 100644 index 0000000..f871eae --- /dev/null +++ b/src/mpi/common/ipcShm.h @@ -0,0 +1,237 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "shlobj.h" +#include "Shlwapi.h" +#include "mpistr.h" + +// +// A global shared memory for IPC. Allows ipc among different users on the same computer, +// with no specific previlige like SeCrateGlobalPrevilige. Processes communicate over +// a temporary, i.e no disk flush, delete-on-close file mapped view. +// + +class GlobalShmRegion +{ +private: + BOOL isReadOnly; + HANDLE file; + HANDLE fileMap; + void* pView; + WCHAR fullRegionName[MAX_PATH]; + + // + // Non-copyable + // + GlobalShmRegion(const GlobalShmRegion&); + GlobalShmRegion& operator = (const GlobalShmRegion&); + + HRESULT CreateFullRegionName(_In_z_ PCWSTR regionName) + { + // + // The file system directory that contains application data for all users + // + HRESULT result = SHGetFolderPathW(nullptr, CSIDL_COMMON_APPDATA, nullptr, 0, fullRegionName); + if(result != S_OK) + { + return result; + } + + // + // SHGetFolderPathW returns full path without a trailing backslash. + // + size_t fullPathLen = MPIU_Strlen(fullRegionName) + 1 + MPIU_Strlen(regionName); + if (fullPathLen >= _countof(fullRegionName)) + { + return E_FAIL; + } + + OACR_WARNING_SUPPRESS(UNSAFE_STRING_FUNCTION, "Buffer length is already checked."); + BOOL appended = PathAppendW(fullRegionName, regionName); + return appended ? S_OK : E_FAIL; + } + + +public: + GlobalShmRegion(): + isReadOnly(FALSE), + file(INVALID_HANDLE_VALUE), + fileMap(nullptr), + pView(nullptr) + { + } + + + ~GlobalShmRegion() + { + if(pView != nullptr) + { + UnmapViewOfFile(pView); + } + if(fileMap != nullptr) + { + CloseHandle(fileMap); + } + if(file != INVALID_HANDLE_VALUE) + { + CloseHandle(file); + } + } + + + DWORD Open(_In_z_ PCWSTR regionName) + { + if(pView != nullptr) + { + return ERROR_ALREADY_EXISTS; + } + + isReadOnly = TRUE; + + HRESULT result = CreateFullRegionName(regionName); + if(result != S_OK) + { + return ERROR_INVALID_NAME; + } + + file = CreateFileW( + fullRegionName, + GENERIC_READ, + FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + nullptr, + OPEN_EXISTING, + FILE_ATTRIBUTE_TEMPORARY, + nullptr + ); + + if(file == INVALID_HANDLE_VALUE) + { + return GetLastError(); + } + + fileMap = CreateFileMappingW(file, nullptr, PAGE_READONLY, 0, 0, nullptr); + + if(fileMap ==nullptr) + { + CloseHandle(file); + file = nullptr; + return GetLastError(); + } + + pView = MapViewOfFile( + fileMap, + FILE_MAP_READ, + 0, + 0, + 0 + ); + if( pView == nullptr ) + { + CloseHandle(file); + CloseHandle(fileMap); + file = nullptr; + fileMap = nullptr; + return GetLastError(); + } + + return NO_ERROR; + } + + + DWORD Create(_In_z_ PCWSTR regionName, UINT32 regionSize) + { + if(pView != nullptr) + { + return ERROR_ALREADY_EXISTS; + } + + isReadOnly = FALSE; + + HRESULT result = CreateFullRegionName(regionName); + if(result != S_OK) + { + return ERROR_INVALID_NAME; + } + + SECURITY_ATTRIBUTES security; + ZeroMemory(&security, sizeof(security)); + security.nLength = sizeof(security); + ConvertStringSecurityDescriptorToSecurityDescriptorW( + L"D:(A;;GA;;;WD)", + SDDL_REVISION_1, + &security.lpSecurityDescriptor, + NULL); + + file = CreateFileW( + fullRegionName, + GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ, + &security, + CREATE_NEW, + FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, + NULL + ); + + LocalFree(security.lpSecurityDescriptor); + + if(file == INVALID_HANDLE_VALUE) + { + return GetLastError(); + } + + fileMap = CreateFileMappingW( + file, + nullptr, + PAGE_READWRITE, + 0, + regionSize, + nullptr + ); + + if( fileMap == nullptr ) + { + CloseHandle(file); + file = nullptr; + return GetLastError(); + } + + pView = MapViewOfFile( + fileMap, + FILE_MAP_WRITE, + 0, + 0, + 0 + ); + + if(pView != nullptr) + { + ZeroMemory(pView, regionSize); + return NO_ERROR; + } + + CloseHandle(file); + CloseHandle(fileMap); + file = nullptr; + fileMap = nullptr; + return GetLastError(); + } + + + const void* ReadPtr() const + { + return pView; + } + + + void* WritePtr() + { + if(isReadOnly) + { + return nullptr; + } + + return pView; + } + +}; \ No newline at end of file diff --git a/src/mpi/common/kernel32util.cpp b/src/mpi/common/kernel32util.cpp new file mode 100644 index 0000000..8dfd71a --- /dev/null +++ b/src/mpi/common/kernel32util.cpp @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" +#include "kernel32util.h" +#include "util.h" + +// +// Summary: +// Global to indicate if we should use Win7+ features. +// +// NOTE: +// This is not static so we can manipulate this bit from unit tests +// +BOOL g_IsWin7OrGreater = CheckOSVersion(6,1); +BOOL g_IsWin8OrGreater = CheckOSVersion(6,2); + +Kernel32 Kernel32::Methods; \ No newline at end of file diff --git a/src/mpi/common/kernel32util.h b/src/mpi/common/kernel32util.h new file mode 100644 index 0000000..4a7facb --- /dev/null +++ b/src/mpi/common/kernel32util.h @@ -0,0 +1,170 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once +#include +#include +// +// Make some shorter names. +// +typedef SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX SLPIEX; + + +typedef _Success_(return==TRUE) BOOL ( WINAPI FN_GetLogicalProcessorInformationEx )( + _In_ LOGICAL_PROCESSOR_RELATIONSHIP relationshipType, + _Out_writes_to_opt_(*pReturnedLength,*pReturnedLength) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX pBuffer, + _Inout_ PDWORD pReturnedLength + ); + + +typedef _Success_(return==TRUE) BOOL ( WINAPI FN_GetLogicalProcessorInformationEx )( + _In_ LOGICAL_PROCESSOR_RELATIONSHIP relationshipType, + _Out_writes_to_opt_(*pReturnedLength,*pReturnedLength) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX pBuffer, + _Inout_ PDWORD pReturnedLength + ); + +typedef _Success_(return==TRUE) BOOL ( WINAPI FN_SetThreadGroupAffinity)( + _In_ HANDLE hThread, + _In_ const GROUP_AFFINITY *GroupAffinity, + _Out_opt_ PGROUP_AFFINITY PreviousGroupAffinity + ); + +typedef _Success_(return==TRUE) BOOL (WINAPI FN_GetNumaNodeProcessorMaskEx) ( + _In_ USHORT Node, + _Out_ PGROUP_AFFINITY ProcessorMask + ); + +typedef _Success_(return==TRUE) BOOL (WINAPI FN_GetProcessGroupAffinity) ( + _In_ HANDLE hProcess, + _Inout_ PUSHORT GroupCount, + _Out_writes_to_(*GroupCount,*GroupCount) PUSHORT GroupArray + ); + + +typedef _Success_(return == TRUE) BOOL (WINAPI FN_InitializeProcThreadAttributeList) ( + _In_opt_ LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, + _In_ DWORD dwAttributeCount, + _In_ DWORD dwFlags, + _Inout_ PSIZE_T lpSize + ); + + +typedef _Success_(return == TRUE) BOOL(WINAPI FN_UpdateProcThreadAttribute) ( + _In_ LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, + _In_ DWORD dwFlags, + _In_ DWORD_PTR Attribute, + _In_ PVOID lpValue, + _In_ SIZE_T cbSize, + _In_opt_ PVOID lpPreviousValue, + _In_opt_ PSIZE_T lpReturnSize + ); + + +typedef _Success_(return==TRUE) BOOL (WINAPI FN_WaitOnAddress)( + _In_ VOID volatile *Address, + _In_ PVOID CompareAddress, + _In_ SIZE_T AddressSize, + _In_opt_ DWORD dwMilliseconds + ); + + +typedef VOID (WINAPI FN_WakeByAddressAll)( + _In_ PVOID Address + ); + + +extern BOOL g_IsWin7OrGreater; +extern BOOL g_IsWin8OrGreater; + + +// +// Summary: +// Singleton class to load and GetProcAddress +// +struct Kernel32 +{ + static Kernel32 Methods; + + FN_GetLogicalProcessorInformationEx* GetLogicalProcessorInformationEx; + FN_SetThreadGroupAffinity* SetThreadGroupAffinity; + FN_GetNumaNodeProcessorMaskEx* GetNumaNodeProcessorMaskEx; + FN_GetProcessGroupAffinity* GetProcessGroupAffinity; + FN_InitializeProcThreadAttributeList* InitializeProcThreadAttributeList; + FN_UpdateProcThreadAttribute* UpdateProcThreadAttribute; + FN_WaitOnAddress* WaitOnAddress; + FN_WakeByAddressAll* WakeByAddressAll; + + +private: + Kernel32() + { + HMODULE kernel32 = ::GetModuleHandleW(L"kernel32"); + if(kernel32 != nullptr) + { + GetLogicalProcessorInformationEx = reinterpret_cast( + ::GetProcAddress( + kernel32, + "GetLogicalProcessorInformationEx" + ) ); + SetThreadGroupAffinity = reinterpret_cast( + ::GetProcAddress( + kernel32, + "SetThreadGroupAffinity" + ) ); + GetNumaNodeProcessorMaskEx = reinterpret_cast( + ::GetProcAddress( + kernel32, + "GetNumaNodeProcessorMaskEx" + ) ); + GetProcessGroupAffinity = reinterpret_cast( + ::GetProcAddress( + kernel32, + "GetProcessGroupAffinity" + ) ); + InitializeProcThreadAttributeList = reinterpret_cast( + ::GetProcAddress( + kernel32, + "InitializeProcThreadAttributeList" + ) ); + UpdateProcThreadAttribute = reinterpret_cast( + ::GetProcAddress( + kernel32, + "UpdateProcThreadAttribute" + ) ); + } + + assert(!g_IsWin7OrGreater || GetLogicalProcessorInformationEx != nullptr); + assert(!g_IsWin7OrGreater || SetThreadGroupAffinity != nullptr); + assert(!g_IsWin7OrGreater || GetNumaNodeProcessorMaskEx != nullptr); + assert(!g_IsWin7OrGreater || GetProcessGroupAffinity != nullptr); + assert(!g_IsWin7OrGreater || InitializeProcThreadAttributeList != nullptr); + assert(!g_IsWin7OrGreater || UpdateProcThreadAttribute != nullptr); + + if (g_IsWin8OrGreater) + { + HMODULE kernelBase = ::GetModuleHandleW(L"kernelbase"); + if(kernelBase != nullptr) + { + WakeByAddressAll = reinterpret_cast( + ::GetProcAddress( + kernelBase, + "WakeByAddressAll" + )); + + WaitOnAddress = reinterpret_cast( + ::GetProcAddress( + kernelBase, + "WaitOnAddress" + )); + } + + assert(WakeByAddressAll != nullptr); + assert(WaitOnAddress != nullptr); + } + else + { + WakeByAddressAll = nullptr; + WaitOnAddress = nullptr; + } + } +}; diff --git a/src/mpi/common/mpicommon.vcxproj b/src/mpi/common/mpicommon.vcxproj new file mode 100644 index 0000000..a3f7e70 --- /dev/null +++ b/src/mpi/common/mpicommon.vcxproj @@ -0,0 +1,97 @@ + + + + + + + mpicommon + {990e2ef8-f801-4101-a7b5-2d561fb6667b} + + + + false + StaticLibrary + None + + + + + + + Use + precomp.h + $(IntDir)\pch_hdr.src + + %(AdditionalIncludeDirectories); + $(MPI_SRC_ROOT)\common\$(O); + + + + + + + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + robocopy .\ $(BinariesBuildTypeArchDirectory)\$(MPI_BIN_DESTINATION) mpitrace.man +set rc=%errorlevel% +if not %rc%==1 exit %rce% else exit 0 + + + + + + + + + + + + $(BaseIntermediateOutputPath)i386\errtest.c + $(BaseIntermediateOutputPath)amd64\errtest.c + + + + + + + + + + + + + diff --git a/src/mpi/common/mpidef.h b/src/mpi/common/mpidef.h new file mode 100644 index 0000000..bb1d146 --- /dev/null +++ b/src/mpi/common/mpidef.h @@ -0,0 +1,191 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#if !defined(MPITYPEDEFS_H_INCLUDED) +#define MPITYPEDEFS_H_INCLUDED + +/* Define if addresses are larger than Fortran integers */ +#ifdef _WIN64 +#define HAVE_AINT_LARGER_THAN_FINT +#endif + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define if debugger support is included */ +/* #undef HAVE_DEBUGGER_SUPPORT */ + +/* Define if F90 type routines available */ +/* #undef HAVE_F90_TYPE_ROUTINES */ + +/* Define if Fortran is supported */ +/* Defined as a compiler directive, see mpich2sources.inc */ +/* #undef HAVE_FORTRAN_BINDING */ + +/* Controls byte alignment of structures (for aligning allocated structures) + */ +#define HAVE_MAX_STRUCT_ALIGNMENT 8 + +/* Define if a name publishing service is available */ +#define HAVE_NAMEPUB_SERVICE 1 + +/* Define if the Fortran types are not available in C */ +/* #undef HAVE_NO_FORTRAN_MPI_TYPES_IN_C */ + +/* Define as the name of the debugger support library */ +/* #undef MPICH_INFODLL_LOC */ + +/* Level of thread support selected at compile time */ +#ifdef MPICH_MULTITHREADED +#define MPICH_THREAD_LEVEL MPI_THREAD_MULTIPLE +#else +#define MPICH_THREAD_LEVEL MPI_THREAD_SERIALIZED +#endif + +/* C type to use for MPI_INTEGER16 */ +/* #undef MPIR_INTEGER16_CTYPE */ + +/* C type to use for MPI_REAL2 */ +/* #undef MPIR_REAL2_CTYPE */ + +/* C type to use for MPI_REAL16 */ +/* #undef MPIR_REAL16_CTYPE */ + +/* C99 types available for MPI_C_XXX */ +/* #undef MPIR_C99_TYPES */ + +/* Define if alloca should be used if available */ +/* #undef USE_ALLOCA */ + +/* Define to use ='s and spaces in the string utilities. */ +#define USE_HUMAN_READABLE_TOKENS 1 + +/* if C does not support restrict */ +#define restrict + +/* The following are defined as a compiler directive, see mpich2sources.inc */ +/* Added here to make it easier to search for the define */ +/* +#define USE_MPI_FOR_NMPI +#define HAVE_FORTRAN_BINDING +#define MPIDI_CH3_HAS_NO_DYNAMIC_PROCESS +*/ + + +#ifndef EXTERN_C +#if defined(__cplusplus) +#define EXTERN_C extern "C" +#else +#define EXTERN_C extern +#endif +#endif + + +#ifdef _PREFIX_ +EXTERN_C void __pfx_assert(bool, const char*); +#undef __analysis_assert +#define __analysis_assert(expr) __pfx_assert(expr, "") +#else +#ifndef __analysis_assert +#define __analysis_assert(expr) +#endif +#endif + + +#ifdef _PREFIX_ +EXTERN_C void __pfx_assume(bool, const char*); +#undef __analysis_assume +#define __analysis_assume(expr) __pfx_assume(expr, "") +#elif _PREFAST_ +#undef __analysis_assume +#define __analysis_assume(expr) __assume(expr) +#else +#ifndef __analysis_assume +#define __analysis_assume(expr) +#endif +#endif + +#ifdef __midl +typedef int MPI_RESULT; +#else +typedef _Check_return_ _Return_type_success_(return == MPI_SUCCESS) int MPI_RESULT; +#endif + + +/* Set to a type that can express the size of a send/receive buffer */ +typedef unsigned int MPIU_Bsize_t; +#define MPIU_BSIZE_MAX UINT_MAX + +typedef MPIU_Bsize_t MPIDI_msg_sz_t; +#define MPIDI_MSG_SZ_MAX MPIU_BSIZE_MAX + + +/* Use the MPIU_PtrToXXX macros to convert pointers to and from integer types */ + +/* The Microsoft compiler will not allow casting of different sized types + * without + * printing a compiler warning. Using these macros allows compiler specific + * type casting and avoids the warning output. These macros should only be used + * in code that can handle loss of bits. + */ + +/* PtrToInt converts a pointer to a int type, truncating bits if necessary */ +#define MPIU_PtrToInt PtrToInt + +/* PtrToAint converts a pointer to an MPI_Aint type, truncating bits if necessary */ +#define MPIU_PtrToAint(a) ((MPI_Aint)(INT_PTR) (a) ) + +/* IntToPtr converts a int to a pointer type, extending bits if necessary */ +#define MPIU_IntToPtr IntToPtr + + +// +// Constant used to define the maximum number of characters in the hostname +// string placed into the PMI KVS when publishing our node id. +// +#if (!defined MAXHOSTNAMELEN) && (!defined MAX_HOSTNAME_LEN) +#define MAX_HOSTNAME_LEN 256 +#elif !defined MAX_HOSTNAME_LEN +#define MAX_HOSTNAME_LEN MAXHOSTNAMELEN +#endif + +#define MSMPI_VER_MAJOR( _v ) (_v >> 24) +#define MSMPI_VER_MINOR( _v ) ((_v >> 16) & 0xFF) +#define MSMPI_VER_BUILD( _v ) (_v & 0xFFFF) +#if MSMPI_IS_RTM +#define MSMPI_BUILD_LABEL L"" +#else +#define MSMPI_BUILD_LABEL L" [PRE-RELEASE]" +#endif + +// +// This is the maximum length of an environment variable according +// to platform specification. +// +#define MAX_ENV_LENGTH 32767 + +#define MSMPI_MAX_RANKS 32768 + +#define MSMPI_MAX_TRANSFER_SIZE INT_MAX + +// +// Maximum number of connection retires in case of errors. Applies to both sockets and ND. +// +#define MSMPI_DEFAULT_CONNECT_RETRIES 5 + +// +// This string identifies the service_name in spn construction +// +#define MSMPI_SPN_SERVICE_NAME L"msmpi" + +// +// Cast definition to help flag places we use potentially truncate but shouldn't. +// +#define fixme_cast static_cast + +#endif /* !defined(MPITYPEDEFS_H_INCLUDED) */ diff --git a/src/mpi/common/mpidump.h b/src/mpi/common/mpidump.h new file mode 100644 index 0000000..e98fbd3 --- /dev/null +++ b/src/mpi/common/mpidump.h @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +#ifndef MPIDUMP_H_INCLUDED +#define MPIDUMP_H_INCLUDED + +#include + +// +// Constants used to control dump file generation. +// +enum MSMPI_DUMP_MODE +{ + MsmpiDumpNone = 0, + MsmpiDumpMini, + MsmpiDumpAllMini, + MsmpiDumpFull, + MsmpiDumpAllFull, + MsmpiDumpMaximumValue +}; + + +MSMPI_DUMP_MODE GetDumpMode(); + + +void +CreateFinalDumpFile( + _In_ HANDLE tempFileHandle, + _In_ int rank, + _In_z_ const wchar_t* dumpPath, + _In_ int jobid, + _In_ int taskid, + _In_ int taskinstid + ); + + +HANDLE +CreateTempDumpFile( + __in HANDLE hProcess, + __in DWORD pid, + __in MINIDUMP_TYPE dumpType, + __in const wchar_t* dumpPath, + __in_opt MINIDUMP_EXCEPTION_INFORMATION* pExrParam + ); + +#endif // MPIDUMP_H_INCLUDED diff --git a/src/mpi/common/mpierror.h b/src/mpi/common/mpierror.h new file mode 100644 index 0000000..92e2e59 --- /dev/null +++ b/src/mpi/common/mpierror.h @@ -0,0 +1,293 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ + + +// +// IMPORTANT NOTE: All MPI*_Err_* functions must have return value and function name +// on the SAME LINE or the error string parser will FAIL. +// + +#ifndef MPIERROR_H_INCLUDED +#define MPIERROR_H_INCLUDED + +/* Error severity */ +#define MPIR_ERR_FATAL 1 +#define MPIR_ERR_RECOVERABLE 0 + +/* + This file contains the definitions of the error code fields + + An error code is organized as: + + 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 + 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 + +-+-+-----------------------------------------+-+-+-------------+ + |0|D| Error Code Index |C|F| Class | + +-+-+-----------------------------------------+-+-+-------------+ + + Class: [0-6] + The MPI error class (including dynamically defined classes). + + Fatal: [7] + Set if the error is fatal and should not be returned to the user. + + Code: [8] + Set for error Codes (vs error class). Note that 0 is a valid value for the Error Code Index. + + Index: [9-28] + The Error Code Index assigned at error code creation. The lower 7 bits are used as an index to + the ErrorRing to find the error message. The rest of this field bits help verifing that the + ErrorRing entry is assinged to that error. + + Dyanmic: [30] + Set if this is a dynamically created error code (using the routines to add error classes and + codes at runtime). This *must* be the top bit so that MPI_ERR_LASTCODE and MPI_LASTUSEDCODE + can be set properly. (MPI_ERR_LASTCODE must be the largest valid error *code* from the + predefined codes. + The standard text is poorly worded here, but users will expect to be able to perform + (errcode <= MPI_ERR_LASTCODE). See Section 8.5 in the MPI-2 standard for MPI_LASTUSEDCODE. + + 0: [31] + Error codes must be positive integers, so we lose one bit (if they aren't positive, the + comparisons agains MPI_ERR_LASTCODE and the value of the attribute MPI_LASTUSEDCODE will fail). + */ + + +#define ERROR_CLASS_MASK 0x0000007f +#define ERROR_CLASS_SIZE 128 + +#define ERROR_FATAL_FLAG 0x00000080 +#define ERROR_COD_FLAG 0x00000100 + +#define ERROR_INDEX_MASK 0x3FFFFE00 +#define ERROR_INDEX_SHIFT 9 + +#define ERROR_DYN_FLAG 0x40000000 + +#define ERROR_DINDEX_MASK 0x003FFE00 +#define ERROR_DINDEX_SHIFT 9 +#define ERROR_DINDEX_SIZE 8192 + +/* shorthand macros */ +#define ERROR_GET_CLASS(code) (code & ERROR_CLASS_MASK) +#define ERROR_GET_INDEX(code) ((code & ERROR_INDEX_MASK) >> ERROR_INDEX_SHIFT) + +#define ERROR_IS_FATAL(code) ((code & ERROR_FATAL_FLAG) != 0) +#define ERROR_IS_CODE(code) ((code & ERROR_COD_FLAG) != 0) +#define ERROR_IS_DYN(code) ((code & ERROR_DYN_FLAG) != 0) + + +/* FIXME: + * The following description is out of date and should not be used + */ +/*@ + MPIR_Err_create_code - Create an error code and associated message + to report an error + + Input Parameters: ++ lastcode - Previous error code (see notes) +. severity - Indicates severity of error +. class - Error class +. instance_msg - A message containing printf-style formatting commands + that, when combined with the instance_parameters, specify an error + message containing instance-specific data. +- instance_parameters - The remaining parameters. These must match + the formatting commands in 'instance_msg'. + + Notes: + A typical use is: +.vb + mpi_errno = MPIR_Err_create_code( mpi_errno, MPIR_ERR_RECOVERABLE, MPI_ERR_RANK, "Invalid rank %d", rank ); +.ve + + Predefined message may also be used. Any message that uses the + prefix '"**"' will be looked up in a table. This allows standardized + messages to be used for a message that is used in several different locations + in the code. For example, the name '"**rank"' might be used instead of + '"Invalid Rank"'; this would also allow the message to be made more + specific and useful, such as +.vb + Invalid rank provided. The rank must be between 0 and the 1 less than + the size of the communicator in this call. +.ve + This interface is compatible with the 'gettext' interface for + internationalization, in the sense that the 'generic_msg' and 'instance_msg' + may be used as arguments to 'gettext' to return a string in the appropriate + language; the implementation of 'MPID_Err_create_code' can then convert + this text into the appropriate code value. + + The current set of formatting commands is undocumented and will change. + You may safely use '%d' and '%s' (though only use '%s' for names of + objects, not text messages, as using '%s' for a message breaks support for + internationalization. + + This interface allows error messages to be chained together. The first + argument is the last error code; if there is no previous error code, + use 'MPI_SUCCESS'. + + Module: + Error + + @*/ +_Post_satisfies_( return != MPI_SUCCESS ) +MPI_RESULT MPIR_Err_create_code( + _In_ int lastcode, + _In_ int fatal, + _In_ int error_class, + _In_z_ const char specific_msg[], + ... + ); + +_Post_satisfies_( return != MPI_SUCCESS ) +MPI_RESULT MPIR_Err_create_code_valist( + _In_ int lastcode, + _In_ int fatal, + _In_ int error_class, + _In_z_ const char specific_msg[], + _In_ va_list Argp + ); + +void MPIR_Err_preOrPostInit( void ); + + +/*@ + MPID_Err_get_string - Get the message string that corresponds to an error + class or code + + Input Parameter: ++ code - An error class or code. If a code, it must have been created by + 'MPID_Err_create_code'. +- msg_len - Length of 'msg'. + + Output Parameter: +. msg - A null-terminated text string of length (including the null) of no + more than 'msg_len'. + + Return value: + Zero on success. Non-zero returns indicate either (a) 'msg_len' is too + small for the message or (b) the value of 'code' is neither a valid + error class or code. + + Notes: + This routine is used to implement 'MPI_ERROR_STRING'. + + Module: + Error + + Question: + What values should be used for the error returns? Should they be + valid error codes? + + How do we get a good value for 'MPI_MAX_ERROR_STRING' for 'mpi.h'? + See 'errgetmsg' for one idea. + + @*/ + +void MPIR_Err_get_string( + _In_ int errorcode, + _Out_writes_z_(length) char * msg, + _In_ size_t length + ); + + +/* Prototypes for internal routines for the errhandling module */ +MPI_RESULT +MPIR_Err_set_msg( + _In_ int code, + _In_z_ const char * msg_string + ); + +int MPIR_Err_add_class( void ); +int MPIR_Err_add_code( int ); + +_Success_(return==MPI_SUCCESS) +int MPIR_Err_vsnprintf_mpi( + _Out_writes_z_(maxlen) char* str, + _In_ size_t maxlen, + _Printf_format_string_ const char* fmt, + _In_ va_list list + ); + +_Post_satisfies_( return != MPI_SUCCESS ) +int MPIR_Err_get_user_error_code( + _In_ int errcode + ); + +typedef _Ret_z_ const char* (*MPIR_Err_to_string_fn)(int code); + +void MPIR_Err_set_dynerr_fn( + _In_ MPIR_Err_to_string_fn fn + ); + + + +/* + * Standardized error checking macros. These provide the correct tests for + * common tests. These set err with the encoded error value. + */ + +/* The following are placeholders. We haven't decided yet whether these + should take a handle or pointer, or if they should take a handle and return + a pointer if the handle is valid. These need to be rationalized with the + MPID_xxx_valid_ptr and MPID_xxx_get_ptr. + +*/ + + +#define MPIU_ERR_FAIL(err_) \ + err_ + +#define ON_ERROR_FAIL(err_) \ + if((err_) != MPI_SUCCESS) { goto fn_fail; } + +#define MPIU_ERR_NOMEM() \ + MPIU_ERR_CREATE(MPI_ERR_OTHER, "**nomem") + +/* + * Standardized error setting and checking macros + * These are intended to simplify the insertion of standardized error + * checks + * + */ +/* --BEGIN ERROR MACROS-- */ + +/* If you add any macros to this list, make sure that you update + maint/extracterrmsgs to handle the additional macros (see the hash + KnownErrRoutines in that script) */ +#define MPIU_ERR_TYPE_GET(err_, fatal_, class_, fmt_, ...) \ + MPIR_Err_create_code(err_, fatal_, class_, fmt_, __VA_ARGS__) + +/* Get fatal error code */ +#define MPIU_ERR_FATAL_GET(err_, class_, fmt_, ...) \ + MPIU_ERR_TYPE_GET(err_, MPIR_ERR_FATAL, class_, fmt_, __VA_ARGS__) + +/* Get recoverable error code */ +#define MPIU_ERR_GET(err_, fmt_, ...) \ + MPIU_ERR_TYPE_GET(*&err_, MPIR_ERR_RECOVERABLE, MPI_ERR_OTHER, fmt_, __VA_ARGS__) + +/* Get recov error code with class */ +#define MPIU_ERR_CLASS_GET(err_, class_, fmt_, ...) \ + MPIU_ERR_TYPE_GET(*&err_, MPIR_ERR_RECOVERABLE, class_, fmt_, __VA_ARGS__) + +/* Create a new recoverable error code */ +#define MPIU_ERR_CREATE(class_, fmt_, ...) \ + MPIU_ERR_TYPE_GET( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, class_, fmt_, __VA_ARGS__ ) + +/* --END ERROR MACROS-- */ + +_Ret_z_ +const char* +get_error_string( + _In_ int error + ); + +void CreateDumpFileIfConfigured( + _In_ EXCEPTION_POINTERS* exp + ); + +#endif diff --git a/src/mpi/common/mpihandlemem.h b/src/mpi/common/mpihandlemem.h new file mode 100644 index 0000000..879b5b6 --- /dev/null +++ b/src/mpi/common/mpihandlemem.h @@ -0,0 +1,635 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#ifndef MPIHANDLE_H_INCLUDED +#define MPIHANDLE_H_INCLUDED + +#include "MpiLock.h" + +/*TDSOverview.tex + + MPI has a number of data structures, most of which are represented by + an opaque handle in an MPI program. In the MPICH implementation of MPI, + these handles are represented + as integers; this makes implementation of the C/Fortran handle transfer + calls (part of MPI-2) easy. + + MPID objects (again with the possible exception of 'MPI_Request's) + are allocated by a common set of object allocation functions. + These are +.vb + void *MPIU_Handle_obj_create( MPIU_Object_alloc_t *objmem ) + void MPIU_Handle_obj_destroy( MPIU_Object_alloc_t *objmem, void *object ) +.ve + where 'objmem' is a pointer to a memory allocation object that knows + enough to allocate objects, including the + size of the object and the location of preallocated memory, as well + as the type of memory allocator. By providing the routines to allocate and + free the memory, we make it easy to use the same interface to allocate both + local and shared memory for objects (always using the same kind for each + type of object). + + The names create/destroy were chosen because they are different from + new/delete (C++ operations) and malloc/free. + Any name choice will have some conflicts with other uses, of course. + + Reference Counts: + Many MPI objects have reference count semantics. + The semantics of MPI require that many objects that have been freed by the + user + (e.g., with 'MPI_Type_free' or 'MPI_Comm_free') remain valid until all + pending + references to that object (e.g., by an 'MPI_Irecv') are complete. There + are several ways to implement this; MPICH uses `reference counts` in the + objects. To support the 'MPI_THREAD_MULTIPLE' level of thread-safety, these + reference counts must be accessed and updated atomically. + A reference count for + `any` object can be incremented (atomically) + with 'MPIU_Object_add_ref(objptr)' + and decremented with 'MPIU_Object_release_ref(objptr,newval_ptr)'. + These have been designed so that then can be implemented as inlined + macros rather than function calls, even in the multithreaded case, and + can use special processor instructions that guarantee atomicity to + avoid thread locks. + The decrement routine sets the value pointed at by 'inuse_ptr' to 0 if + the postdecrement value of the reference counter is zero, and to a non-zero + value otherwise. If this value is zero, then the routine that decremented + the + reference count should free the object. This may be as simple as + calling 'MPIU_Handle_obj_destroy' (for simple objects with no other allocated + storage) or may require calling a separate routine to destroy the object. + Because MPI uses 'MPI_xxx_free' to both decrement the reference count and + free the object if the reference count is zero, we avoid the use of 'free' + in the MPID routines. + + The 'inuse_ptr' approach is used rather than requiring the post-decrement + value because, for reference-count semantics, all that is necessary is + to know when the reference count reaches zero, and this can sometimes + be implemented more cheaply that requiring the post-decrement value (e.g., + on IA32, there is an instruction for this operation). + + Question: + Should we state that this is a macro so that we can use a register for + the output value? That avoids a store. Alternately, have the macro + return the value as if it was a function? + + Structure Definitions: + The structure definitions in this document define `only` that part of + a structure that may be used by code that is making use of the ADI. + Thus, some structures, such as 'MPID_Comm', have many defined fields; + these are used to support MPI routines such as 'MPI_Comm_size' and + 'MPI_Comm_remote_group'. Other structures may have few or no defined + members; these structures have no fields used outside of the ADI. + In C++ terms, all members of these structures are 'private'. + + For the initial implementation, we expect that the structure definitions + will be designed for the multimethod device. However, all items that are + specific to a particular device (including the multi-method device) + will be placed at the end of the structure; + the document will clearly identify the members that all implementations + will provide. This simplifies much of the code in both the ADI and the + implementation of the MPI routines because structure member can be directly + accessed rather than using some macro or C++ style method interface. + + T*/ + + +/*TOpaqOverview.tex + MPI Opaque Objects: + + MPI Opaque objects such as 'MPI_Comm' or 'MPI_Datatype' are specified by + integers (in the MPICH2 implementation); the MPI standard calls these + handles. + Out of range values are invalid; the value 0 is reserved. + For most (with the possible exception of + 'MPI_Request' for performance reasons) MPI Opaque objects, the integer + encodes both the kind of object (allowing runtime tests to detect a datatype + passed where a communicator is expected) and important properties of the + object. Even the 'MPI_xxx_NULL' values should be encoded so that + different null handles can be distinguished. The details of the encoding + of the handles is covered in more detail in the MPICH2 Design Document. + For the most part, the ADI uses pointers to the underlying structures + rather than the handles themselves. However, each structure contains an + 'handle' field that is the corresponding integer handle for the MPI object. + + MPID objects (objects used within the implementation of MPI) are not opaque. + + T*/ + +/* Known MPI object types. These are used for both the error handlers + and for the handles. This is a 4 bit value. 0 is reserved for so + that all-zero handles can be flagged as an error. */ +/*E + MPID_Object_kind - Object kind (communicator, window, or file) + + Notes: + This enum is used by keyvals and errhandlers to indicate the type of + object for which MPI opaque types the data is valid. These are defined + as bits to allow future expansion to the case where an object is value for + multiple types (for example, we may want a universal error handler for + errors return). This is also used to indicate the type of MPI object a + MPI handle represents. It is an enum because only this applies only the + the MPI and internal MPICH2 objects. + + The 'MPID_PROCGROUP' kind is used to manage process groups (different + from MPI Groups) that are used to keep track of collections of + processes (each 'MPID_PROCGROUP' corresponds to a group of processes + that define an 'MPI_COMM_WORLD'. This becomes important only + when MPI-2 dynamic process features are supported. 'MPID_VCONN' is + a virtual connection; while this is not part of the overall ADI3 + design, an object that manages connections to other processes is + a common need, and 'MPID_VCONN' may be used for that. + + Module: + Attribute-DS + E*/ + + +// +// Handle values are 32 bit values laid out as follows: +// +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---+-------+---------------------------------------------------+ +// |Typ| Kind | Index | +// +---+-------+---------------------------------------------------+ +// +// +// Handles of type HANDLE_TYPE_INDIRECT are laid out as follows: +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---+-------+-------------------+-------------------------------+ +// |Typ| Kind | Block | Index | +// +---+-------+-------------------+-------------------------------+ +// +// where +// +// Typ - is the handle type: +// +#define HANDLE_TYPE_INVALID 0x0 +#define HANDLE_TYPE_BUILTIN 0x1 +#define HANDLE_TYPE_DIRECT 0x2 +#define HANDLE_TYPE_INDIRECT 0x3 + +#define HANDLE_TYPE_MASK 0xc0000000 +#define HANDLE_TYPE_SHIFT 30 +#define HANDLE_GET_TYPE(a) (((a) & HANDLE_TYPE_MASK)>>HANDLE_TYPE_SHIFT) +#define HANDLE_SET_TYPE(a,kind) ((a)|((kind)<> HANDLE_MPI_KIND_SHIFT ) +#define HANDLE_SET_MPI_KIND(a,kind) ( ((a) & 0xc3ffffff) | ((kind) << HANDLE_MPI_KIND_SHIFT) ) + +// +// Block - for indirect handles only, the index of the indirect block to +// which the Index applies +// +#define HANDLE_INDIRECT_SHIFT 16 +#define HANDLE_INDIRECT_BLOCK(a) (((a)& 0x03FF0000) >> HANDLE_INDIRECT_SHIFT) +/* Handle block is between 1 and 1024 *elements* */ +#define HANDLE_BLOCK_SIZE 256 +C_ASSERT(HANDLE_BLOCK_SIZE <= 1024); + +// +// Index - Index of the object. For indirect handles, the index is relative ot the block. +// +#define HANDLE_INDIRECT_INDEX(a) ((a) & 0x0000FFFF) +#define HANDLE_BLOCK_INDEX_SIZE 1024 +C_ASSERT(HANDLE_BLOCK_SIZE < 65536); + +#define HANDLE_INDEX_MASK 0x03FFFFFF +#define HANDLE_DIRECT_INDEX(a) ((a) & HANDLE_INDEX_MASK) + +#define HANDLE_BUILTIN_INDEX(a) ((a) & 0x000000FF) + +/* ALL objects have the handle as the first value. */ +/* Inactive (unused and stored on the appropriate avail list) objects + have MPIU_Handle_common as the head */ +typedef struct MPIU_Handle_common +{ + int handle; + volatile long ref_count; + struct MPIU_Handle_common *next; /* Free handles use this field to point to the next + free object */ + +} MPIU_Handle_common; + +/* All *active* (in use) objects have the handle as the first value; objects + with referene counts have the reference count as the second value. + See MPIU_Object_add_ref and MPIU_Object_release_ref. */ +typedef struct MPIU_Handle_head +{ + int handle; + volatile long ref_count; + +} MPIU_Handle_head; + +/* This type contains all of the data, except for the direct array, + used by the object allocators. */ +typedef struct MPIU_Object_alloc_t +{ + MPIU_Handle_common *avail; /* Next available object */ + int initialized; /* */ + void *(*indirect)[]; /* Pointer to indirect object blocks */ + int indirect_size; /* Number of allocated indirect blocks */ + MPID_Object_kind kind; /* Kind of object this is for */ + int size; /* Size of an individual object */ + void *direct; /* Pointer to direct block, used + for allocation */ + int direct_size; /* Size of direct block */ + + MPI_RWLOCK alloc_lock; + +#if DBG + int num_alloc; /* Number of objects out of the pool. */ + volatile long num_user_alloc; /* Number of objects out of the pool owned by the client. */ + volatile long num_user_msg_alloc; /* Number of objects out of the pool of kind MPID_MESSAGE owned by the client. */ +#endif + +} MPIU_Object_alloc_t; + + +_Success_(return!=nullptr) +_Ret_valid_ +void* MPIU_Handle_obj_alloc( + _In_ MPIU_Object_alloc_t* objmem + ); + +void MPIU_Handle_obj_free( + _In_ MPIU_Object_alloc_t* objmem, + _In_ _Post_ptr_invalid_ void* obj + ); + +_Success_(return!=nullptr) +void* MPIU_Handle_get_ptr_indirect( + _In_ int handle, + _In_ MPIU_Object_alloc_t* objmem + ); + + +/* ------------------------------------------------------------------------- */ +/* mpiobjref.h */ +/* ------------------------------------------------------------------------- */ + + +/*M + MPIU_Object_add_ref - Increment the reference count for an MPI object + + Synopsis: +.vb + MPIU_Object_add_ref( MPIU_Object *ptr ) +.ve + + Input Parameter: +. ptr - Pointer to the object. + + Notes: + In an unthreaded implementation, this function will usually be implemented + as a single-statement macro. In an 'MPI_THREAD_MULTIPLE' implementation, + this routine must implement an atomic increment operation, using, for + example, a lock on datatypes or special assembly code such as +.vb + try-again: + load-link refcount-address to r2 + add 1 to r2 + store-conditional r2 to refcount-address + if failed branch to try-again: +.ve + on RISC architectures or +.vb + lock + inc refcount-address or +.ve + on IA32; "lock" is a special opcode prefix that forces atomicity. This + is not a separate instruction; however, the GNU assembler expects opcode + prefixes on a separate line. + + Module: + MPID_CORE + + Question: + This accesses the 'ref_count' member of all MPID objects. Currently, + that member is typed as 'volatile int'. However, for a purely polling, + thread-funnelled application, the 'volatile' is unnecessary. Should + MPID objects use a 'typedef' for the 'ref_count' that can be defined + as 'volatile' only when needed? For now, the answer is no; there isn''t + enough to be gained in that case. +M*/ + +/*M + MPIU_Object_release_ref - Decrement the reference count for an MPI object + + Synopsis: +.vb + MPIU_Object_release_ref( MPIU_Object *ptr, int *inuse_ptr ) +.ve + + Input Parameter: +. objptr - Pointer to the object. + + Output Parameter: +. inuse_ptr - Pointer to the value of the reference count after decrementing. + This value is either zero or non-zero. See below for details. + + Notes: + In an unthreaded implementation, this function will usually be implemented + as a single-statement macro. In an 'MPI_THREAD_MULTIPLE' implementation, + this routine must implement an atomic decrement operation, using, for + example, a lock on datatypes or special assembly code such as +.vb + try-again: + load-link refcount-address to r2 + sub 1 to r2 + store-conditional r2 to refcount-address + if failed branch to try-again: + store r2 to newval_ptr +.ve + on RISC architectures or +.vb + lock + dec refcount-address + if zf store 0 to newval_ptr else store 1 to newval_ptr +.ve + on IA32; "lock" is a special opcode prefix that forces atomicity. This + is not a separate instruction; however, the GNU assembler expects opcode + prefixes on a separate line. 'zf' is the zero flag; this is set if the + result of the operation is zero. Implementing a full decrement-and-fetch + would require more code and the compare and swap instruction. + + Once the reference count is decremented to zero, it is an error to + change it. A correct MPI program will never do that, but an incorrect one + (particularly a multithreaded program with a race condition) might. + + The following code is `invalid`\: +.vb + MPID_Object_release_ref( datatype_ptr ); + if (datatype_ptr->ref_count == 0) MPID_Datatype_free( datatype_ptr ); +.ve + In a multi-threaded implementation, the value of 'datatype_ptr->ref_count' + may have been changed by another thread, resulting in both threads calling + 'MPID_Datatype_free'. Instead, use +.vb + MPID_Object_release_ref( datatype_ptr, &inUse ); + if (!inuse) + MPID_Datatype_free( datatype_ptr ); +.ve + + Module: + MPID_CORE + M*/ + +/* The MPIU_DBG... statements are macros that vanish unless + --enable-g=log is selected. MPIU_HANDLE_CHECK_REFCOUNT is + defined above, and adds an additional sanity check for the refcounts +*/ +template +__forceinline void MPIU_Object_set_ref(_In_ T* objptr, _In_ long val) +{ + ::InterlockedExchange(&objptr->ref_count, val); +} + +template +__forceinline void MPIU_Object_add_ref(_In_ T* objptr) +{ + ::InterlockedIncrement(&objptr->ref_count); +} + +template +__forceinline void MPIU_Object_release_ref(_In_ T* objptr, _Out_ BOOL* inuse_ptr) +{ + *inuse_ptr = ::InterlockedDecrement(&objptr->ref_count); +} + +/* ------------------------------------------------------------------------- */ +/* mpiobjref.h */ +/* ------------------------------------------------------------------------- */ + +/* Convert Handles to objects for MPI types that have predefined objects */ +/* Question. Should this do ptr=0 first, particularly if doing --enable-strict + complication? */ +#define MPID_Getb_ptr(kind,a,bmsk,ptr) \ +{ \ + switch (HANDLE_GET_TYPE(a)) { \ + case HANDLE_TYPE_BUILTIN: \ + ptr=MPID_##kind##_builtin+((a)&(bmsk)); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_DIRECT: \ + ptr=MPID_##kind##_direct+HANDLE_DIRECT_INDEX(a); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INDIRECT: \ + ptr=((MPID_##kind*) \ + MPIU_Handle_get_ptr_indirect(a,&MPID_##kind##_mem)); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INVALID: \ + default: \ + ptr=0; \ + break; \ + } \ +} + +#define MPID_Getb_ptr_valid(kind,a,bmsk,ptr) \ +{ \ + switch (HANDLE_GET_TYPE(a)) { \ + case HANDLE_TYPE_BUILTIN: \ + ptr=MPID_##kind##_builtin+((a)&(bmsk)); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_DIRECT: \ + ptr=MPID_##kind##_direct+HANDLE_DIRECT_INDEX(a); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INDIRECT: \ + ptr=((MPID_##kind*) \ + MPIU_Handle_get_ptr_indirect(a,&MPID_##kind##_mem)); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INVALID: \ + default: \ + MPID_Abort(nullptr, TRUE, 0, "Invalid Handle type for " #kind);\ + break; \ + } \ +} + + +/* Convert handles to objects for MPI types that do _not_ have any predefined + objects */ +/* Question. Should this do ptr=0 first, particularly if doing --enable-strict + complication? */ +#define MPID_Get_ptr(kind,a,ptr) \ +{ \ + switch (HANDLE_GET_TYPE(a)) { \ + case HANDLE_TYPE_DIRECT: \ + ptr=MPID_##kind##_direct+HANDLE_DIRECT_INDEX(a); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INDIRECT: \ + ptr=((MPID_##kind*) \ + MPIU_Handle_get_ptr_indirect(a,&MPID_##kind##_mem)); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INVALID: \ + case HANDLE_TYPE_BUILTIN: \ + default: \ + ptr=0; \ + break; \ + } \ +} + +#define MPID_Get_ptr_valid(kind,a,ptr) \ +{ \ + switch (HANDLE_GET_TYPE(a)) { \ + case HANDLE_TYPE_DIRECT: \ + ptr=MPID_##kind##_direct+HANDLE_DIRECT_INDEX(a); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INDIRECT: \ + ptr=((MPID_##kind*) \ + MPIU_Handle_get_ptr_indirect(a,&MPID_##kind##_mem)); \ + __analysis_assume(ptr != nullptr); \ + break; \ + case HANDLE_TYPE_INVALID: \ + case HANDLE_TYPE_BUILTIN: \ + default: \ + MPID_Abort(nullptr, TRUE, 0, "Invalid Handle type for " #kind);\ + break; \ + } \ +} + + + +/* FIXME: the masks should be defined with the handle definitions instead + of inserted here as literals */ +#define MPID_Group_get_ptr(a,ptr) MPID_Getb_ptr(Group,a,0x03ffffff,ptr) +#define MPID_File_get_ptr(a,ptr) MPID_Get_ptr(File,a,ptr) +#define MPID_Errhandler_get_ptr(a,ptr) MPID_Getb_ptr(Errhandler,a,0x3,ptr) +#define MPID_Op_get_ptr(a,ptr) MPID_Getb_ptr(Op,a,0x000000ff,ptr) +#define MPID_Info_get_ptr(a,ptr) MPID_Get_ptr(Info,a,ptr) +#define MPID_Win_get_ptr(a,ptr) MPID_Get_ptr(Win,a,ptr) +#define MPID_Request_get_ptr(a,ptr) MPID_Get_ptr(Request,a,ptr) + + +#define MPID_Group_get_ptr_valid(a,ptr) MPID_Getb_ptr_valid(Group,a,0x03ffffff,ptr) +#define MPID_File_get_ptr_valid(a,ptr) MPID_Get_ptr_valid(File,a,ptr) +#define MPID_Errhandler_get_ptr_valid(a,ptr) MPID_Getb_ptr_valid(Errhandler,a,0x3,ptr) +#define MPID_Op_get_ptr_valid(a,ptr) MPID_Getb_ptr_valid(Op,a,0x000000ff,ptr) +#define MPID_Info_get_ptr_valid(a,ptr) MPID_Get_ptr_valid(Info,a,ptr) +#define MPID_Win_get_ptr_valid(a,ptr) MPID_Get_ptr_valid(Win,a,ptr) +#define MPID_Request_get_ptr_valid(a,ptr) MPID_Get_ptr_valid(Request,a,ptr) + + + +/* Keyvals have a special format. This is roughly MPID_Get_ptrb, but + the handle index is in a smaller bit field. In addition, + there is no storage for the builtin keyvals. + For the indirect case, we mask off the part of the keyval that is + in the bits normally used for the indirect block index. +*/ +#define MPID_Keyval_get_ptr(a,ptr) \ +{ \ + switch (HANDLE_GET_TYPE(a)) { \ + case HANDLE_TYPE_BUILTIN: \ + ptr=0; \ + break; \ + case HANDLE_TYPE_DIRECT: \ + ptr=MPID_Keyval_direct+((a)&0x3fffff); \ + break; \ + case HANDLE_TYPE_INDIRECT: \ + ptr=((MPID_Keyval*) \ + MPIU_Handle_get_ptr_indirect((a)&0xfc3fffff,&MPID_Keyval_mem)); \ + break; \ + case HANDLE_TYPE_INVALID: \ + default: \ + ptr=0; \ + break; \ + } \ +} + +#define MPID_Keyval_get_ptr_valid(a,ptr) \ +{ \ + switch (HANDLE_GET_TYPE(a)) { \ + case HANDLE_TYPE_DIRECT: \ + ptr=MPID_Keyval_direct+((a)&0x3fffff); \ + break; \ + case HANDLE_TYPE_INDIRECT: \ + ptr=((MPID_Keyval*) \ + MPIU_Handle_get_ptr_indirect((a)&0xfc3fffff,&MPID_Keyval_mem)); \ + break; \ + case HANDLE_TYPE_BUILTIN: \ + case HANDLE_TYPE_INVALID: \ + default: \ + MPID_Abort(nullptr, TRUE, 0, "Invalid Handle type for Keyval"); \ + break; \ + } \ +} + + +template bool SetName( _Inout_ T* obj, _In_z_ const char* name ) +{ + if( obj->name == obj->GetDefaultName() ) + { + char* tempName = static_cast(MPIU_Malloc( MPI_MAX_OBJECT_NAME )); + if( tempName == nullptr ) + { + return false; + } + obj->name = tempName; + } + MPIU_Strncpy( const_cast(obj->name), name, MPI_MAX_OBJECT_NAME ); + return true; +} + + +template void CleanupName( _Inout_ T* obj ) +{ + if( obj->name != obj->GetDefaultName() && obj->name != nullptr ) + { + MPIU_Free( const_cast(obj->name) ); + obj->name = nullptr; + } +} + + +template void InitName( _Inout_ T* obj ) +{ + obj->name = obj->GetDefaultName(); +} + + + +#endif /* MPIHANDLE_H_INCLUDED */ diff --git a/src/mpi/common/mpiiov.h b/src/mpi/common/mpiiov.h new file mode 100644 index 0000000..b6a8918 --- /dev/null +++ b/src/mpi/common/mpiiov.h @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#ifndef MPIIOV_H_INCLUDED +#define MPIIOV_H_INCLUDED + +/* IOVs */ +/* The basic channel interface uses IOVs */ +typedef WSABUF MPID_IOV; +typedef char iovsendbuf_t; +typedef char iovrecvbuf_t; + +/* FIXME: How is IOV_LIMIT chosen? */ +#define MPID_IOV_LIMIT 16 + +static inline unsigned iov_size(_In_reads_(n_iov) const MPID_IOV* iov, int n_iov) +{ + unsigned total = 0; + while(n_iov--) + { + total += iov->len; + iov++; + } + + return total; +} + +#endif diff --git a/src/mpi/common/mpimem.h b/src/mpi/common/mpimem.h new file mode 100644 index 0000000..9d1e47b --- /dev/null +++ b/src/mpi/common/mpimem.h @@ -0,0 +1,104 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#ifndef MPIMEM_H_INCLUDED +#define MPIMEM_H_INCLUDED + +/* ------------------------------------------------------------------------- */ +/* mpimem.h */ +/* ------------------------------------------------------------------------- */ + +/*D + Memory - Memory Management Routines + + Rules for memory management: + + MPICH explicity prohibits the appearence of 'malloc', 'free', + 'calloc', 'realloc', or 'strdup' in any code implementing a device or + MPI call (of course, users may use any of these calls in their code). + Instead, you must use 'MPIU_Malloc' etc.; if these are defined + as 'malloc', that is allowed, but an explicit use of 'malloc' instead of + 'MPIU_Malloc' in the source code is not allowed. This restriction is + made to simplify the use of portable tools to test for memory leaks, + overwrites, and other consistency checks. + + Most memory should be allocated at the time that 'MPID_Init' is + called and released with 'MPID_Finalize' is called. If at all possible, + no other MPID routine should fail because memory could not be allocated + (for example, because the user has allocated large arrays after 'MPI_Init'). + + The implementation of the MPI routines will strive to avoid memory allocation + as well; however, operations such as 'MPI_Type_index' that create a new + data type that reflects data that must be copied from an array of arbitrary + size will have to allocate memory (and can fail; note that there is an + MPI error class for out-of-memory). + + Question: + Do we want to have an aligned allocation routine? E.g., one that + aligns memory on a cache-line. + D*/ + +/* ------------------------------------------------------------------------- */ + +/* No memory tracing; just use native functions */ +void* MPIU_Malloc( _In_ SIZE_T size ); + +void* MPIU_Calloc( _In_ SIZE_T elements, _In_ SIZE_T size ); + +void MPIU_Free( _In_opt_ _Post_ptr_invalid_ void* pMem ); + +void* MPIU_Realloc( _In_ void* pMem, _In_ SIZE_T size ); + +#ifdef __cplusplus + +// +// C++ operator new/delete overload. +// +// Normal operator new: pInt = new int; +// +void* __cdecl operator new( size_t size ); + +// +// Placement new: pInt = new( ptr ) int; +// +void* __cdecl operator new( size_t /*size*/, _In_/*count_(size)*/ void* pMem ); + +// +// Array new: pInt = new int[10]; +// +void* __cdecl operator new[]( size_t size ); + +// +// Placement array new: pInt = new( ptr ) int[10]; +// +void* __cdecl operator new[]( size_t /*size*/, _In_/*count_(size)*/ void* pMem ); + +// +// Normal operator delete: delete pInt; +// +void __cdecl operator delete( _In_opt_ _Post_ptr_invalid_ void* pObj ); + +// +// Array delete: delete[] pInt; +// +void __cdecl operator delete[]( _In_opt_ _Post_ptr_invalid_ void* pObj ); + +#endif // __cplusplus + + +#define MPIU_Malloc_obj(type_) \ + (type_*)MPIU_Malloc(sizeof(type_)) + +#define MPIU_Malloc_objn(count_, type_) \ + (type_*)MPIU_Malloc((count_)*sizeof(type_)) + +/* ------------------------------------------------------------------------- */ +/* end of mpimem.h */ +/* ------------------------------------------------------------------------- */ + +#endif diff --git a/src/mpi/common/mpimem.inl b/src/mpi/common/mpimem.inl new file mode 100644 index 0000000..a1d52bd --- /dev/null +++ b/src/mpi/common/mpimem.inl @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +#include "mpimem.h" + + +__forceinline void* __cdecl operator new( size_t size ) +{ + return MPIU_Malloc( size ); +} + + +__forceinline void* __cdecl operator new( size_t /*size*/, _In_ void* pMem ) +{ + return pMem; +} + + +__forceinline void* __cdecl operator new[]( size_t size ) +{ + return MPIU_Malloc( size ); +} + + +__forceinline void* __cdecl operator new[]( size_t /*size*/, _In_ void* pMem ) +{ + return pMem; +} + + +__forceinline void __cdecl operator delete( _In_opt_ _Post_ptr_invalid_ void* pObj ) +{ + MPIU_Free( pObj ); +} + + +__forceinline void __cdecl operator delete( _In_opt_ void* /*pObj*/, _In_ void* /*pMem*/ ) +{ +} + + +__forceinline void __cdecl operator delete[]( _In_opt_ _Post_ptr_invalid_ void* pObj ) +{ + MPIU_Free( pObj ); +} + + +__forceinline void __cdecl operator delete[]( _In_opt_ void* /*pObj*/, _In_ void* /*pMem*/ ) +{ +} diff --git a/src/mpi/common/mpisock.h b/src/mpi/common/mpisock.h new file mode 100644 index 0000000..609141c --- /dev/null +++ b/src/mpi/common/mpisock.h @@ -0,0 +1,749 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/* + * (C) 2001 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ + +#if !defined(MPIDU_SOCK_H_INCLUDED) +#define MPIDU_SOCK_H_INCLUDED + +#include "mpidef.h" +#include "ex.h" + + +#define MPIDU_SOCK_INVALID_SOCK NULL +#define MPIDU_SOCK_INFINITE_TIME INFINITE + +typedef SOCKET MPIDU_SOCK_NATIVE_FD; + + +// +// Allocated per request +// +typedef struct sock_read_context +{ + WSABUF tmpiov; + WSABUF *iov; + MPIU_Bsize_t total; + MPIU_Bsize_t min_recv; + int iovlen; + +} sock_read_context; + + +typedef struct sock_write_context +{ + WSABUF tmpiov; + WSABUF *iov; + MPIU_Bsize_t total; + int iovlen; + +} sock_write_context; + + +struct sock_state_t; + + +typedef struct sock_accept_context +{ + sock_state_t* accept_state; + char accept_buffer[sizeof(struct sockaddr_in)*2+32]; + +} sock_accept_context; + + +#define SOCKI_DESCRIPTION_LENGTH 256 +typedef struct sock_connect_context +{ + HANDLE retry_timer; + const char* cur_host; + int error; + int port; + int retry_count; + char host_description[SOCKI_DESCRIPTION_LENGTH]; + +} sock_connect_context; + + +typedef struct sock_close_context +{ + int closectx; + +} sock_close_context; + + +typedef struct sock_overlapped_s +{ + EXOVERLAPPED exov; + sock_state_t* sock; + + union + { + sock_read_context read; + sock_write_context write; + sock_accept_context accept; + sock_connect_context connect; + sock_close_context close; + }; + +} sock_overlapped_t; + + +typedef void (*sock_close_routine)( + _Inout_ sock_state_t* sock, + _Inout_ sock_overlapped_t* pov + ); + + +// +// Allocated per socket +// +typedef struct sock_connect_state_t +{ + sock_overlapped_t* pov; + +} sock_connect_state_t; + + +typedef struct sock_state_t +{ + sock_close_routine pfnClose; + SOCKET sock; + ExSetHandle_t set; + int closing; + sock_connect_state_t connect; + +} sock_state_t; + + +typedef struct MPIDU_Sock_context_t +{ + + // + // Caller Executive overlapped. + // * The success/failure callback functions will be invoked on Scok async + // operation completion when MPIDU_Sock_wait is called. + // * The total number of bytes transfered in a successful read/write + // operation is in uov.ov.InernalHigh field of the OVERLAPPED strcture. + // * The Sock MPI error value is in uov.ov.Internal + // + EXOVERLAPPED uov; + + // + // Sock private context + // + sock_overlapped_t sov; + +} MPIDU_Sock_context_t; + + +// +// Parses the netmask from a given environment variable. +// +HRESULT ParseNetmask( _In_z_ PCWSTR szNetmaskEnv, _Out_ IN_ADDR* pAddr, _Out_ IN_ADDR* pMask ); + + +/*@ +MPIDU_Sock_init - initialize the Sock communication library + +Return value: MPI error code +. MPI_SUCCESS - initialization completed successfully + +Notes: +The Sock module may be initialized multiple times. The implementation should perform reference counting if necessary. + +Module: +Utility-Sock +@*/ + +_Success_(return==MPI_SUCCESS) +int MPIDU_Sock_init(void); + + +/*@ +MPIDU_Sock_finalize - shutdown the Sock communication library + +Return value: MPI error code +. MPI_SUCCESS - shutdown completed successfully + +Notes: + What are the semantics of finalize? Is it responsible for releasing any resources (socks and sock sets) that the calling +code(s) leaked? Should it block until all OS resources are released? + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int MPIDU_Sock_finalize(void); + + +/*@ +MPIDU_Sock_get_host_description - obtain a description of the host's +communication capabilities + +Input Parameters: +. host_description - character array in which the function can store a string + describing the communication capabilities of the host +- len - length of the character array + +Return value: MPI error code +. MPI_SUCCESS - description successfully obtained and placed in host_description + +Notes: +The host description string returned by the function is defined by the +implementation and should not be interpreted by the +application. This string is to be supplied to MPIDU_Sock_post_connect() when +one wishes to form a connection with this host. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_get_host_description( + _Out_writes_z_(len) char* host_description, + _In_ int len + ); + +/*@ +MPIDU_Sock_hostname_to_host_description - convert a host name to a description of the host's communication capabilities + +Input Parameters: ++ hostname - host name string +. host_description - character array in which the function can store a string describing the communication capabilities of the host +- len - length of host_description + +Return value: MPI error code +. MPI_SUCCESS - description successfully obtained and placed in host_description + +Notes: +The host description string returned by the function is defined by the implementation and should not be interpreted by the +application. This string is to be supplied to MPIDU_Sock_post_connect() when one wishes to form a connection with the host +specified by hostname. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_hostname_to_host_description( + _In_z_ const char* hostname, + _Out_writes_z_(len) char* host_description, + _In_ int len + ); + + +/*@ +MPIDU_Sock_create_native_fd - create a new native socket descriptor/handle + +Output Parameter: +. fd - pointer to the new socket handle + +Return value: MPI error code +. MPI_SUCCESS - new sock set successfully create + +Notes: + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_create_native_fd( + _Out_ MPIDU_SOCK_NATIVE_FD* fd + ); + + +/*@ +MPIDU_Sock_native_to_sock - convert a native file descriptor/handle to a sock object + +Input Parameters: ++ set - sock set to which the new sock should be added +. fd - native file descriptor + +Output Parameter: +. sock - new sock object + +Return value: MPI error code +. MPI_SUCCESS - sock successfully created + +Notes: +The constraints on which file descriptors/handles may be converted to a sock object are defined by the implementation. +It is possible, however, that the conversion of an inappropriate descriptor/handle may complete successfully but the +sock object may not function properly. + +Thread safety: +The addition of a new sock object to the sock set may occur while other threads are performing operations on the same sock set. +Thread safety of simultaneously operations on the same sock set must be guaranteed by the Sock implementation. + +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_native_to_sock( + _In_ ExSetHandle_t set, + _In_ MPIDU_SOCK_NATIVE_FD fd, + _Outptr_ sock_state_t **ppSock + ); + + +/*@ +MPIDU_Sock_listen - establish a listener sock + +Input Parameters: ++ set - sock set to which the listening sock should be added +- port - desired port (or zero if a specific port is not desired) + +Output Parameters: ++ port - port assigned to the listener +- sock - new listener sock + +Return value: MPI error code +. MPI_SUCCESS - listener sock successfully established + +Notes: +Use the established listener socket to call MPIDU_Sock_post_accept + +The environment variable MPICH_PORTRANGE=min:max may be used to restrict the ports mpich processes listen on. + +Thread safety: +The addition of the listener sock object to the sock set may occur while other threads are performing operations on the same sock +set. Thread safety of simultaneously operations on the same sock set must be guaranteed by the Sock implementation. + +Module: +Utility-Sock +@*/ + +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_listen( + _In_ ExSetHandle_t set, + _In_ unsigned long addr, + _Inout_ int *port, + _Outptr_ sock_state_t **ppSock + ); + + +/*@ +MPIDU_Sock_post_accept - request that a new connection would be accepted + +Input Parameters: ++ listener_sock - listener sock object from which to obtain the new connection +- pov - user context associated with the accept request + +Output Parameter: +. pSock - sock object for the new connection + +Return value: MPI error code +. MPI_SUCCESS - new connection successfully established and associated with new sock objecta + +Notes: +In the event of a connection failure, MPIDU_Sock_post_accept() may fail to acquire and return a new sock despite any +MPIDU_SOCK_OP_ACCEPT event notification. On the other hand, MPIDU_Sock_post_accept() may return a sock for which the underlying +connection has already failed. (The Sock implementation may be unaware of the failure until read/write operations are performed.) + +Thread safety: +The addition of the new sock object to the sock set may occur while other threads are performing operations on the same sock set. +Thread safety of simultaneously operations on the same sock set must be guaranteed by the Sock implementation. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_post_accept( + _In_ sock_state_t *listener_sock, + _Outptr_ sock_state_t **ppSock, + _In_ MPIDU_Sock_context_t* psc + ); + + +/*@ +MPIDU_Sock_post_connect - request that a new connection be formed + +Input Parameters: ++ set - sock set to which the new sock object should be added +. host_description - string containing the communication capabilities of the listening host ++ port - port number of listener sock on the listening host +. pov - user context associated with the connect request + +Output Parameter: +. sock - new sock object associated with the connection request + +Return value: MPI error code +. MPI_SUCCESS - request to form new connection successfully posted + +Notes: +The host description of the listening host is supplied MPIDU_Sock_get_host_description(). The intention is that the description +contain an enumeration of interface information so that the MPIDU_Sock_connect() can try each of the interfaces until it succeeds +in forming a connection. Having a complete set of interface information also allows a particular interface be used selected by the +user at runtime using the MPICH_NETMASK. The name of the environment variable seems wrong. Perhaps MPICH_INTERFACE? We +should ask the Systems group. + +Thread safety: +The addition of the new sock object to the sock set may occur while other threads are performing operations on the same sock set. +Thread safety of simultaneously operations on the same sock set must be guaranteed by the Sock implementation. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_post_connect( + _In_ ExSetHandle_t set, + _In_z_ const char* host_description, + _In_ int port, + _Outptr_ sock_state_t** ppSock, + _In_ int usemask, + _Inout_ MPIDU_Sock_context_t* psc + ); + + +/*@ +MPIDU_Sock_post_close - request that an existing connection be closed + +Input Parameter: +. sock - sock object to be closed +- pov - user context associated with the close request + +Return value: MPI error code +. MPI_SUCCESS - request to close the connection was successfully posted + +Notes: +If any other operations are posted on the specified sock, they will be terminated. An appropriate event will be generated for each +terminated operation. All such events will be delivered by MPIDU_Sock_wait() prior to the delivery of the MPIDU_SOCK_OP_CLOSE +event. + +The sock object is destroyed just prior to the MPIDU_SOCK_OP_CLOSE event being returned by MPIDU_Sock_wait(). Any oustanding +references to the sock object held by the application should be considered invalid and not used again. + +Thread safety: +MPIDU_Sock_post_close() may be called while another thread is calling or blocking in MPIDU_Sock_wait() specifying the same sock set +to which this sock belongs. If another thread is blocking MPIDU_Sock_wait() and the close operation causes the sock set to become +empty, then MPIDU_Sock_wait() will return with an error. + +Calling any of the immediate or post routines during or after the call to MPIDU_Sock_post_close() is consider an application error. +The result of doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads +to ensure that simultaneous calls do not occur. + +Module: +Utility-Sock +@*/ + +void +MPIDU_Sock_post_close( + _Inout_ sock_state_t *sock, + _Inout_ MPIDU_Sock_context_t* psc + ); + +/*@ +MPIDU_Sock_post_read - request that data be read from a sock + +Input Parameters: ++ sock - sock object from which data is to be read +. buf - buffer into which the data should be placed +. len - number of bytes to read +. minbr - the async operation can return with number of bytes read greater or + equal to minbr (min bar) before the entire buffer is read. +. pov - user context associated with the read request + +Return value: MPI error code +. MPI_SUCCESS - request to read was successfully posted + +Notes: +Only one read operation may be posted at a time. Furthermore, an immediate read may not be performed while a posted write is +outstanding. This is considered to be an application error, and the results of doing so are undefined. + +If MPIDU_Sock_post_close() is called before the posted read operation completes, the read operation will be terminated. + +Thread safety: +MPIDU_Sock_post_read() may be called while another thread is attempting to perform an immediate write or post a write operation on +the same sock. MPIDU_Sock_post_read() may also be called while another thread is calling or blocking in MPIDU_Sock_wait() on the +same sock set to which the specified sock belongs. + +MPIDU_Sock_post_write() may not be called while another thread is performing an immediate read on the same sock. This is +considered to be an application error, and the results of doing so are undefined. + +Calling MPIDU_Sock_post_read() during or after the call to MPIDU_Sock_post_close() is consider an application error. The result of +doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads to ensure that +one thread is not attempting to post a new operation while another thread is attempting to close the sock. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_post_read( + _Inout_ sock_state_t *sock, + _Out_writes_bytes_(len) void * buf, + _In_ MPIU_Bsize_t len, + _In_ MPIU_Bsize_t minbr, + _Inout_ MPIDU_Sock_context_t* psc + ); + +/*@ +MPIDU_Sock_post_readv - request that a vector of data be read from a sock + +Input Parameters: ++ sock - sock object from which the data is to read +. iov - I/O vector describing buffers into which the data is placed +. iov_n - number of elements in I/O vector (must be 1 currently) +. minbr - the async operation can return with number of bytes read greater or + equal to minbr (min bar) before the entire buffer is read. +. pov - user context associated with the readv request + +Return value: MPI error code +. MPI_SUCCESS - request to read was successfully posted + +Notes: +Only one read operation may be posted at a time. Furthermore, an immediate read may not be performed while a posted write is +outstanding. This is considered to be an application error, and the results of doing so are undefined. + +If MPIDU_Sock_post_close() is called before the posted read operation completes, the read operation will be terminated. + +Thread safety: +MPIDU_Sock_post_readv() may be called while another thread is attempting to perform an immediate write or post a write operation on +the same sock. MPIDU_Sock_post_readv() may also be called while another thread is calling or blocking in MPIDU_Sock_wait() on the +same sock set to which the specified sock belongs. + +MPIDU_Sock_post_readv() may not be called while another thread is performing an immediate read on the same sock. This is +considered to be an application error, and the results of doing so are undefined. + +Calling MPIDU_Sock_post_readv() during or after the call to MPIDU_Sock_post_close() is consider an application error. The result +of doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads to ensure +that one thread is not attempting to post a new operation while another thread is attempting to close the sock. + +Module: +Utility-Sock +@*/ + +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_post_readv( + _Inout_ sock_state_t *sock, + _In_reads_(iov_n)WSABUF * iov, + _In_ int iov_n, + _In_ MPIU_Bsize_t minbr, + _Inout_ MPIDU_Sock_context_t* psc + ); + +/*@ +MPIDU_Sock_post_write - request that data be written to a sock + +Input Parameters: ++ sock - sock object which the data is to be written +. buf - buffer containing the data +. len - number of bytes to write +. pov - user context associated with the write request + +Return value: MPI error code +. MPI_SUCCESS - request to write was successfully posted + +Notes: +Only one write operation may be posted at a time. Furthermore, an immediate write may not be performed while a posted write is +outstanding. This is considered to be an application error, and the results of doing so are undefined. + +If MPIDU_Sock_post_close() is called before the posted write operation completes, the write operation will be terminated. + +Thread safety: +MPIDU_Sock_post_write() may be called while another thread is attempting to perform an immediate read or post a read operation on +the same sock. MPIDU_Sock_post_write() may also be called while another thread is calling or blocking in MPIDU_Sock_wait() on the +same sock set to which the specified sock belongs. + +MPIDU_Sock_post_write() may not be called while another thread is performing an immediate write on the same sock. This is +considered to be an application error, and the results of doing so are undefined. + +Calling MPIDU_Sock_post_write() during or after the call to MPIDU_Sock_post_close() is consider an application error. The result +of doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads to ensure +that one thread is not attempting to post a new operation while another thread is attempting to close the sock. Do we really +need this flexibility? + +Module: +Utility-Sock +@*/ + +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_post_write( + _Inout_ sock_state_t *sock, + _In_reads_bytes_(min) const void* buf, + _In_ MPIU_Bsize_t min, + _Inout_ MPIDU_Sock_context_t* psc + ); + +/*@ +MPIDU_Sock_post_writev - request that a vector of data be written to a sock + +Input Parameters: ++ sock - sock object which the data is to be written +. iov - I/O vector describing buffers of data to be written +. iov_n - number of elements in I/O vector +. pov - user context associated with the writev request + +Return value: MPI error code +. MPI_SUCCESS - request to write was successfully posted + +Notes: +Only one write operation may be posted at a time. Furthermore, an immediate write may not be performed while a posted write is +outstanding. This is considered to be an application error, and the results of doing so are undefined. + +If MPIDU_Sock_post_close() is called before the posted write operation completes, the write operation will be terminated. + +Thread safety: +MPIDU_Sock_post_writev() may be called while another thread is attempting to perform an immediate read or post a read operation on +the same sock. MPIDU_Sock_post_writev() may also be called while another thread is calling or blocking in MPIDU_Sock_wait() on the +same sock set to which the specified sock belongs. + +MPIDU_Sock_post_writev() may not be called while another thread is performing an immediate write on the same sock. This is +considered to be an application error, and the results of doing so are undefined. + +Calling MPIDU_Sock_post_writev() during or after the call to MPIDU_Sock_post_close() is consider an application error. The result +of doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads to ensure +that one thread is not attempting to post a new operation while another thread is attempting to close the sock. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_post_writev( + _Inout_ sock_state_t *sock, + _In_reads_(iov_n) WSABUF* iov, + _In_ int iov_n, + _Inout_ MPIDU_Sock_context_t* psc + ); + +/*@ +MPIDU_Sock_close - perform an immediate hard close + +Input Parameter: +. sock - sock object to be closed + +Return value: none + +Notes: +If any other operations are posted on the specified sock, they will be terminated. An appropriate event will be generated for each +terminated operation. All such events will be delivered by MPIDU_Sock_wait(). No MPIDU_SOCK_OP_CLOSE is generated. +event. + +The sock object is destroyed immediately. Any oustanding references to the sock object held by the application should be considered +invalid and not used again. + +Thread safety: +MPIDU_Sock_close() may be called while another thread is calling or blocking in MPIDU_Sock_wait() specifying the same sock set +to which this sock belongs. If another thread is blocking MPIDU_Sock_wait() and the close operation causes the sock set to become +empty, then MPIDU_Sock_wait() will return with an error. + +Calling any of the immediate or post routines during or after the call to MPIDU_Sock_post_close() is consider an application error. +The result of doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads +to ensure that simultaneous calls do not occur. + +Module: +Utility-Sock +@*/ + +void +MPIDU_Sock_close( + _In_ _Post_invalid_ sock_state_t *sock + ); + + +/*@ +MPIDU_Sock_writev - perform an immediate vector write + +Input Parameters: ++ sock - sock object to which data is to be written +. iov - I/O vector describing buffers of data to be written +- iov_n - number of elements in I/O vector + +Output Parameter: +. num_written - actual number of bytes written + +Return value: MPI error code +. MPI_SUCCESS - no error encountered during the write operation + +Notes: +An immediate write may not be performed while a posted write is outstanding on the same sock. This is considered to be an +application error, and the results of doing so are undefined. + +Thread safety: +MPIDU_Sock_write() may be called while another thread is attempting to perform an immediate read or post a read operation on the +same sock. MPIDU_Sock_write() may also be called while another thread is calling or blocking in MPIDU_Sock_wait() on the same sock +set to which the specified sock belongs. + +A immediate write may not be performed if another thread is performing an immediate write on the same sock. This is considered to +be an application error, and the results of doing so are undefined. + +Calling MPIDU_Sock_write() during or after the call to MPIDU_Sock_post_close() is consider to be an application error. The result +of doing so is undefined. The application should coordinate the closing of a sock with the activities of other threads to ensure +that one thread is not attempting to perform an immediate write while another thread is attempting to close the sock. + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_writev( + _In_ const sock_state_t * const sock, + _In_reads_(iov_n) WSABUF * iov, + _In_ int iov_n, + _Out_ MPIU_Bsize_t * num_written + ); + + +/*@r +MPIDU_Sock_get_sock_id - get an integer identifier for a sock object + +Input Parameter: +. sock - sock object + +Return value: an integer that uniquely identifies the sock object + +Notes: +The integer is unique relative to all other open sock objects in the local process. The integer may later be reused for a +different sock once the current object is closed and destroyed. + +This function does not return an error code. Passing in an invalid sock object has undefined results (garbage in, garbage out). + +Module: +Utility-Sock +@*/ + +_Success_(return >=0) +int +MPIDU_Sock_get_sock_id( + _In_ const sock_state_t * const sock + ); + +/*@ +MPIDU_Sock_keepalive - enable connection keep-alive protocol + +Input Parameter: +. sock - sock object + +Return value: an MPI error code + +Module: +Utility-Sock +@*/ +_Success_(return==MPI_SUCCESS) +int +MPIDU_Sock_keepalive( + _In_ const sock_state_t * const sock + ); + +// +// Utility function to retrieve the ip address string associated with a socket. +// This is the address the socket is connected to on the remote host. +// +_Success_(*pPort != 0) +void +get_sock_peer_address( + _In_ _Pre_satisfies_(0 != pSock->sock) sock_state_t* pSock, + _Out_writes_bytes_(addrLen) char* pAddr, + _In_ int addrLen, + _Out_ int* pPort + ); + +#endif /* !defined(MPIDU_SOCK_H_INCLUDED) */ diff --git a/src/mpi/common/mpistr.cpp b/src/mpi/common/mpistr.cpp new file mode 100644 index 0000000..d51ccd5 --- /dev/null +++ b/src/mpi/common/mpistr.cpp @@ -0,0 +1,445 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "precomp.h" + + +/* + * This file contains "safe" versions of the various string and printf + * operations. + */ + +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Snprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) char* dest, + _In_ size_t cchDest, + _Printf_format_string_ const char* format, + ... + ) +{ + size_t len; + va_list args; + va_start( args, format ); + + OACR_WARNING_SUPPRESS(USE_WIDE_API, "SMPD uses only ANSI character set."); + HRESULT hr = StringCchVPrintfExA( + dest, + cchDest, + nullptr, + &len, + 0, + format, + args + ); + + va_end( args ); + + if( FAILED( hr ) ) + { + return 0; + } + + return static_cast(cchDest - len); +} + + +// +// Overloaded function for wide characters +// +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Snprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) wchar_t* dest, + _In_ size_t cchDest, + _Printf_format_string_ const wchar_t* format, + ... + ) +{ + size_t len; + va_list args; + va_start( args, format ); + + HRESULT hr = StringCchVPrintfExW( + dest, + cchDest, + nullptr, + &len, + 0, + format, + args + ); + + va_end( args ); + + if( FAILED( hr ) ) + { + return 0; + } + + return static_cast(cchDest - len); +} + + +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Vsnprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) char* dest, + _In_ size_t cchDest, + _Printf_format_string_ const char* format, + _In_ va_list args + ) +{ + size_t len; + OACR_WARNING_SUPPRESS(USE_WIDE_API, "MSMPI uses only ANSI character set."); + HRESULT hr = StringCchVPrintfExA( + dest, + cchDest, + nullptr, + &len, + 0, + format, + args + ); + + if( FAILED( hr ) ) + { + return 0; + } + + return static_cast(cchDest - len); +} + + +// +// Overloaded function for wide characters +// +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Vsnprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) wchar_t* dest, + _In_ size_t cchDest, + _Printf_format_string_ const wchar_t* format, + _In_ va_list args + ) +{ + size_t len; + HRESULT hr = StringCchVPrintfExW( + dest, + cchDest, + nullptr, + &len, + 0, + format, + args + ); + + if( FAILED( hr ) ) + { + return 0; + } + + return static_cast(cchDest - len); +} + + +_Success_(return == 0) +int +MPIU_Strcpy( + _Out_writes_z_(cchDest) char* dest, + _In_ size_t cchDest, + _In_z_ const char* src ) +{ + OACR_WARNING_SUPPRESS(USE_WIDE_API, "MSMPI uses only ANSI character set."); + HRESULT hr = StringCchCopyA( dest, cchDest, src ); + + if( FAILED( hr ) ) + { + return static_cast( hr ); + } + + return 0; +} + + +_Success_(return == 0) +int +MPIU_Strcpy( + _Out_writes_z_(cchDest) wchar_t* dest, + _In_ size_t cchDest, + _In_z_ const wchar_t* src ) +{ + HRESULT hr = StringCchCopyW( dest, cchDest, src ); + + if( FAILED( hr ) ) + { + return static_cast( hr ); + } + + return 0; +} + + +void +MPIU_Strnapp( + _Out_writes_z_(n) char* dst, + _In_z_ const char* src, + _In_ size_t n ) +{ + OACR_WARNING_SUPPRESS(USE_WIDE_API, "MSMPI uses only ANSI character set."); + OACR_WARNING_SUPPRESS(HRESULT_NOT_CHECKED, "Ignoring return value."); + StringCchCatA( dst, n, src ); +} + + +void +MPIU_Strnapp( + _Out_writes_z_(n) wchar_t* dst, + _In_z_ const wchar_t* src, + _In_ size_t n) +{ + OACR_WARNING_SUPPRESS(HRESULT_NOT_CHECKED, "Ignoring return value."); + StringCchCatW(dst, n, src); +} + + +size_t +MPIU_Strlen( + _In_ PCSTR src, + _In_ size_t cchMax + ) +{ + size_t len; + OACR_WARNING_SUPPRESS(USE_WIDE_API, "MSMPI uses only ANSI character set."); + HRESULT hr = StringCchLengthA( src, cchMax, &len ); + if( FAILED( hr ) ) + { + return SIZE_MAX; + } + + return len; +} + + +size_t +MPIU_Strlen( + _In_ PCWSTR src, + _In_ size_t cchMax + ) +{ + size_t len; + HRESULT hr = StringCchLengthW( src, cchMax, &len ); + if( FAILED( hr ) ) + { + return SIZE_MAX; + } + + return len; +} + + +_Ret_valid_ _Null_terminated_ +_Success_(return != nullptr) +wchar_t* +MPIU_Strdup( + _In_z_ const wchar_t* str + ) +{ + size_t maxlen = MPIU_Strlen( str ); + if( maxlen == SIZE_MAX ) + { + return nullptr; + } + + // + // Need one extra for the null terminating character + // + maxlen++; + wchar_t* s = static_cast( MPIU_Malloc( sizeof(wchar_t) * maxlen ) ); + if( s != nullptr ) + { + CopyMemory( s, str, maxlen * sizeof(wchar_t) ); + } + return s; +} + + +_Ret_valid_ _Null_terminated_ +_Success_(return != nullptr) +char* +MPIU_Strdup( + _In_z_ const char* str + ) +{ + size_t maxlen = MPIU_Strlen( str ); + if( maxlen == SIZE_MAX ) + { + return nullptr; + } + + // + // Need one extra for the null terminating character + // + maxlen++; + char* s = static_cast( MPIU_Malloc( sizeof(char) * maxlen ) ); + if( s != nullptr ) + { + CopyMemory( s, str, maxlen ); + } + return s; +} + + +_Success_(return==NO_ERROR) +DWORD +MPIU_Getenv( + _In_z_ PCSTR name, + _Out_writes_z_(cchBuffer) PSTR buffer, + _In_ DWORD cchBuffer + ) +{ + OACR_WARNING_SUPPRESS( USE_WIDE_API, "MS MPI uses ANSI char set" ); + DWORD cchRet = GetEnvironmentVariableA( name, buffer, cchBuffer ); + if( cchRet == 0 ) + { + // + // There can be errors other than ERROR_ENVVAR_NOT_FOUND. + // We treat them all as if the env var does not exist. + // + return ERROR_ENVVAR_NOT_FOUND; + } + else if( cchRet >= cchBuffer ) + { + return ERROR_INSUFFICIENT_BUFFER; + } + + return NO_ERROR; +} + + +_Success_(return==NO_ERROR) +DWORD +MPIU_Getenv( + _In_z_ PCWSTR name, + _Out_writes_z_(cchBuffer) PWSTR buffer, + _In_ DWORD cchBuffer + ) +{ + DWORD cchRet = GetEnvironmentVariableW( name, buffer, cchBuffer ); + if( cchRet == 0 ) + { + // + // There can be errors other than ERROR_ENVVAR_NOT_FOUND. + // We treat them all as if the env var does not exist. + // + return ERROR_ENVVAR_NOT_FOUND; + } + else if( cchRet >= cchBuffer ) + { + return ERROR_INSUFFICIENT_BUFFER; + } + + return NOERROR; +} + + +// +// Callee will need to call delete[] to free the memory allocated +// for wname_ptr if the function succeeds. +// +_Success_(return == NOERROR) +DWORD +MPIU_MultiByteToWideChar( + _In_z_ const char* name, + _Outptr_result_z_ wchar_t** wname_ptr + ) +{ + int len = MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + name, + -1, + NULL, + 0 + ); + if( len == 0 ) + { + return GetLastError(); + } + + wchar_t* wname = new wchar_t[len]; + if( wname == NULL ) + { + return ERROR_INSUFFICIENT_BUFFER; + } + + len = MultiByteToWideChar( + CP_UTF8, + MB_ERR_INVALID_CHARS, + name, + -1, + wname, + len + ); + if( len == 0 ) + { + delete[] wname; + return GetLastError(); + } + + *wname_ptr = wname; + return NOERROR; +} + + +// +// Callee will need to call delete[] to free the memory allocated +// for outputStr if the function succeeds. +// +_Success_(return == NOERROR) +DWORD +MPIU_WideCharToMultiByte( + _In_z_ const wchar_t* str, + _Outptr_result_z_ char** outputStr + ) +{ + int len = WideCharToMultiByte( + CP_UTF8, + WC_ERR_INVALID_CHARS, + str, + -1, + nullptr, + 0, + nullptr, + nullptr + ); + if( len == 0 ) + { + return GetLastError(); + } + + char* tmpStr = new char[len]; + if( tmpStr == nullptr ) + { + return ERROR_INSUFFICIENT_BUFFER; + } + + len = WideCharToMultiByte( + CP_UTF8, + WC_ERR_INVALID_CHARS, + str, + -1, + tmpStr, + len, + nullptr, + nullptr + ); + if( len == 0 ) + { + delete[] tmpStr; + return GetLastError(); + } + + *outputStr = tmpStr; + return NOERROR; +} diff --git a/src/mpi/common/mpistr.h b/src/mpi/common/mpistr.h new file mode 100644 index 0000000..a39d04a --- /dev/null +++ b/src/mpi/common/mpistr.h @@ -0,0 +1,366 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once + +#include +#include + + +/*@ MPIU_Strncpy - Copy a string with buffer size. Force null termination + + Input Parameters: +. dst - String to copy into ++ src - String to copy +- n - 'dst' buffer size in chars (including null char) + + Return value: + pointer to the end terminating null char + + Notes: + This routine is the routine that you wish 'strncpy' was. In copying + 'src' to 'dst', it stops when either the end of 'src' (the + null character) is seen or the maximum length 'n is reached. + Unlike 'strncpy', it does not add enough nulls to 'dst' after + copying 'src' in order to move precisely 'n' characters. + This routine is safer than strncpy; it always null terminates the dst + string. (except when the dst size is zero) + + MPIU_Strncpy is implemented inline to help the compiler optimize + per use instance. + + Module: + Utility + @*/ +_Ret_z_ +_Success_(return!=nullptr) +static inline char* +MPIU_Strncpy( + _Out_writes_z_(n) char* dst, + _In_z_ const char* src, + _In_ size_t n + ) +{ + char* end; + OACR_WARNING_SUPPRESS(USE_WIDE_API, "MSMPI uses only ANSI character set."); + HRESULT hr = StringCchCopyExA( dst, n, src, &end, nullptr, 0 ); + if( hr == STRSAFE_E_INVALID_PARAMETER ) + { + return nullptr; + } + + return end; +} + + +_Ret_z_ +_Success_(return!=nullptr) +static inline wchar_t* +MPIU_Strncpy( + _Out_writes_z_(n) wchar_t* dst, + _In_z_ const wchar_t* src, + _In_ size_t n + ) +{ + wchar_t* end; + HRESULT hr = StringCchCopyExW( dst, n, src, &end, nullptr, 0 ); + if( hr == STRSAFE_E_INVALID_PARAMETER ) + { + return nullptr; + } + + return end; +} + + +// +// Summary: +// This is a convenient wrapper for StringCchCopyA +// +// Return: 0 if success, other errors if failure +// +_Success_(return == 0) +int +MPIU_Strcpy( + _Out_writes_z_(cchDest) char* dest, + _In_ size_t cchDest, + _In_z_ const char* src + ); + + +// +// Summary: +// This is a convenient wrapper for StringCchCopyW +// +// Return: 0 if success, other errors if failure +// +_Success_(return == 0) +int +MPIU_Strcpy( + _Out_writes_z_(cchDest) wchar_t* dest, + _In_ size_t cchDest, + _In_z_ const wchar_t* src + ); + + +/*@ MPIU_Szncpy - Copy a string into a fixed sized buffer; force null termination + + MPIU_Szncpy is a helper macro provided for copying into fixed sized char arrays. + The macro computes the size (char count) of the dst array. Usage example, + + char buffer[333]; + ... + -* copy max 333 chars into buffer; buffer will be null terminated. *- + MPIU_Szncpy(buffer, str); + + @*/ +#define MPIU_Szncpy(dst, src) MPIU_Strncpy(dst, src, _countof(dst)) + + +/*@ MPIU_Strnapp - Append to a string with buffer size. Force null termination + + Input Parameters: +. dst - String to copy into ++ src - String to append +- n - 'dst' buffer size in chars (including null char) + + Output Parameter: + pointer to the end terminating null char + + Notes: + This routine is similar to 'strncat' except that the 'n' argument + is the maximum total length of 'dst', rather than the maximum + number of characters to move from 'src'. Thus, this routine is + easier to use when the declared size of 'src' is known. + + MPIU_Strnapp is implemented inline to help the compiler optimize + per use instance. + + Module: + Utility + @*/ +void MPIU_Strnapp( + _Out_writes_z_(n) char *dst, + _In_z_ const char *src, + _In_ size_t n); + + +void MPIU_Strnapp( + _Out_writes_z_(n) wchar_t *dst, + _In_z_ const wchar_t *src, + _In_ size_t n); + + +/*@ MPIU_Sznapp - Append a string into a fixed sized buffer; force null termination + + MPIU_Sznapp is a helper macro provided for appending into fixed sized char arrays. + The macro computes the size (char count) of the dst array. Usage example, + + char buffer[333] = "Initial string"; + ... + -* copy max 333 chars into buffer; buffer will be null terminated. *- + MPIU_Sznapp(buffer, str); + + @*/ +#define MPIU_Sznapp(dst, src) MPIU_Strnapp(dst, src, _countof(dst)) + + +size_t MPIU_Strlen( + _In_ PCSTR src, + _In_ size_t cchMax = STRSAFE_MAX_CCH ); + + +size_t MPIU_Strlen( + _In_ PCWSTR src, + _In_ size_t cchMax = STRSAFE_MAX_CCH ); + + +/* ---------------------------------------------------------------------- */ +/* FIXME - The string routines do not belong in the memory header file */ +/* FIXME - The string error code such be MPICH2-usable error codes */ +#define MPIU_STR_SUCCESS 0 +#define MPIU_STR_FAIL -1 +#define MPIU_STR_NOMEM 1 + +/* FIXME: TRUE/FALSE definitions should either not be used or be + used consistently. These also do not belong in the mpimem header file. */ +#define MPIU_TRUE 1 +#define MPIU_FALSE 0 + +/* FIXME: Global types like this need to be discussed and agreed to */ +typedef int MPIU_BOOL; + +/* FIXME: These should be scoped to only the routines that need them */ +#ifdef USE_HUMAN_READABLE_TOKENS + +#define MPIU_STR_QUOTE_CHAR '\"' +#define MPIU_STR_QUOTE_STR "\"" +#define MPIU_STR_DELIM_CHAR '=' +#define MPIU_STR_DELIM_STR "=" +#define MPIU_STR_ESCAPE_CHAR '\\' +#define MPIU_STR_SEPAR_CHAR ' ' +#define MPIU_STR_SEPAR_STR " " + +#else + +#define MPIU_STR_QUOTE_CHAR '\"' +#define MPIU_STR_QUOTE_STR "\"" +#define MPIU_STR_DELIM_CHAR '#' +#define MPIU_STR_DELIM_STR "#" +#define MPIU_STR_ESCAPE_CHAR '\\' +#define MPIU_STR_SEPAR_CHAR '$' +#define MPIU_STR_SEPAR_STR "$" + +#endif + +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_get_string_arg( + _In_opt_z_ const char* str, + _In_opt_z_ const char* key, + _Out_writes_z_(val_len) char* val, + _In_ size_t val_len + ); + + +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_get_int_arg( + _In_z_ const char *str, + _In_z_ const char *flag, + _Out_ int *val_ptr + ); + + +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_add_string_arg( + _Inout_ _Outptr_result_buffer_(*maxlen_ptr) PSTR*str_ptr, + _Inout_ int *maxlen_ptr, + _In_z_ const char *flag, + _In_z_ const char *val + ); + + +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_add_int_arg( + _Inout_ _Outptr_result_buffer_(*maxlen_ptr) PSTR*str_ptr, + _Inout_ int *maxlen_ptr, + _In_z_ const char *flag, + _In_ int val + ); + + +_Success_(return == MPIU_STR_SUCCESS) +int +MPIU_Str_add_string( + _Inout_ _Outptr_result_buffer_(*maxlen_ptr) PSTR*str_ptr, + _Inout_ int *maxlen_ptr, + _In_z_ const char *val + ); + + +_Success_(return == 0) +int +MPIU_Str_get_string( + _Inout_ _Outptr_result_maybenull_z_ PCSTR* str_ptr, + _Out_writes_z_(val_len)char *val, + _In_ size_t val_len + ); + + +// +// Provide a fallback snprintf for systems that do not have one +// +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Snprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) char* dest, + _In_ size_t cchDest, + _Printf_format_string_ const char* format, + ... + ); + + +// +// Overloaded function for wide characters +// +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Snprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) wchar_t* dest, + _In_ size_t cchDest, + _Printf_format_string_ const wchar_t* format, + ... + ); + + +// +// Provide vsnprintf functionality by using strsafe's StringCchVPrintfEx +// +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Vsnprintf( + _Null_terminated_ _Out_writes_to_(cchDest,return)char* dest, + _In_ size_t cchDest, + _Printf_format_string_ const char* format, + _In_ va_list args + ); + + +// +// Overloaded function for wide characters +// Provide vsnprintf functionality by using strsafe's StringCchVPrintfEx +// +_Success_(return >= 0 && return <= cchDest) +int +MPIU_Vsnprintf( + _Null_terminated_ _Out_writes_to_(cchDest, return) wchar_t* dest, + _In_ size_t cchDest, + _Printf_format_string_ const wchar_t* format, + _In_ va_list args + ); + + +// +// Provide _strdup functionality +// +_Ret_valid_ _Null_terminated_ +_Success_(return != nullptr) +char* +MPIU_Strdup( + _In_z_ const char* str + ); + + +_Ret_valid_ _Null_terminated_ +_Success_(return != nullptr) +wchar_t* +MPIU_Strdup( + _In_z_ const wchar_t* str + ); + + +// +// Callee will need to call delete[] to free the memory allocated +// for wname_ptr if the function succeeds. +// +_Success_(return == NOERROR) +DWORD +MPIU_MultiByteToWideChar( + _In_z_ const char* name, + _Outptr_result_z_ wchar_t** wname_ptr + ); + + +// +// Callee will need to call delete[] to free the memory allocated +// for outputStr if the function succeeds. +// +_Success_(return == NOERROR) +DWORD +MPIU_WideCharToMultiByte( + _In_z_ const wchar_t* str, + _Outptr_result_z_ char** outputStr + ); diff --git a/src/mpi/common/mpitrace.h b/src/mpi/common/mpitrace.h new file mode 100644 index 0000000..2267a1e --- /dev/null +++ b/src/mpi/common/mpitrace.h @@ -0,0 +1,185 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once +#include +#include +#include "evntprov.h" + +#ifndef _In_reads_ +# define _In_reads_(max_count) +#endif + +// +//Enums to identify call sites. +// + +//used for events in ch3u_nd_adapter.cpp +enum AdapterInit{ + AdapterInitOpen = 1, + AdapterInitQuery, + AdapterInitCQDepth, + AdapterInitInitiatorQDepth, + AdapterInitRecvQDepth, + AdapterInitCreateOverlapped +}; + +enum AdapterListen{ + AdapterListenCreateListener = 1, + AdapterListenBind, + AdapterListenGetLocalAddress, + AdapterListenListen +}; + +enum AdapterGetConnectionRequest{ + GetConnectionRequestCreateConnector = 1, + GetConnectionRequestGetConnectionRequest +}; + +enum AdapterCreateConector{ + AdapterCreateConectorCreateConnector = 1, + AdapterCreateConectorBind +}; + +enum AdapterGetConnSucceeded{ + AdapterGetConnSucceededInvalidBufferSize = 1, + AdapterGetConnSucceededAbortOrInvalid, + AdapterGetConnSucceededReject, + AdapterGetConnSucceededMismatchedVersion, + AdapterGetConnSucceededPGFind, + AdapterGetConnSucceededRank, + AdapterGetConnSucceededHeadToHeadReject, + AdapterGetConnSucceededHeadToHeadShutdown, + AdapterGetConnSucceededAdapterShutdown, + AdapterGetConnSucceededDefaultReject, + AdapterGetConnSucceededSuccess +}; + +//used for events in ch3u_nd_endpoint.cpp +enum Endpoint{ + EndpointCompleteConnectBufferSize = 1, + EndpointCompleteConnectDefault, + EndpointCompleteConnectPending, + EndpointConnReqFailedPassive, + EndpointConnReqFailedCanceled, + EndpointConnReqFailedFailed, + EndpointConnCompleted, + EndpointConnFailedRetry, + EndpointConnFailedFail, + EndpointAcceptPending, + EndpointPrepostReceivesFailed, + EndpointAcceptCompleted, + EndpointAcceptFailedAbortedOrTimeout, + EndpointAcceptFailedFailed, + EndpointDisconnect, + EndpointConnect, + EndpointAccept, + EndpointHandleTimeoutConnectTimeout, + EndpointCompleteConnectAbortedOrInvalid, + EndpointCompleteConnectCompleteConnect, + EndpointHandleTimeoutConnect +}; + +//used for events in ch3u_nd_env.cpp +enum EnvironmentListen{ + EnvironmentListenNoNDv2Providers = 1, + EnvironmentListenQueryAddressListForSizeFailed, + EnvironmentListenQueryAddressListFailed +}; + +enum EnvironmentConnect{ + EnvironmentConnectGetAddrsFromBc = 1, + EnvironmentConnectNoLocalNoRemoteForce, + EnvironmentConnectNoLocalForce, + EnvironmentConnectNoLocalNoFallback, + EnvironmentConnectNoLocalNoFallbackForce, + EnvironmentConnectNoRemoteForce, + EnvironmentConnectNoRemoteNoFallback, + EnvironmentConnectNoPathForce, + EnvironmentConnectNoPathNoFallback, + EnvironmentConnectNoLocalFallback, + EnvironmentConnectNoRemoteFallback, + EnvironmentConnectNoPathFallback +}; + +//used for events in ch3_progress_connect.cpp +enum Shm_connect{ + Shm_connectConnectQueueName = 1, + Shm_connectConnectQueueAttach, + Shm_connectWriteQueue, + Shm_connectNotifyConnect +}; + +enum Shm_accept{ + Shm_acceptQueueAttach = 1, + Shm_acceptMismatchedVersion, + Shm_acceptPGFind, + Shm_acceptRank, + Shm_acceptGetConnStringFailed, + Shm_acceptGetStringArgFailed, + Shm_acceptBootstrapQueueAttach +}; + +//used for events in ch3_progress_sock.c +enum RecvOpenRequestSucceeded{ + RecvOpenRequestSucceededUnexpectedControl = 1, + RecvOpenRequestSucceededMismatchedVersion, + RecvOpenRequestSucceededInternal, + RecvOpenRequestSucceededSuccess +}; + +//used for events in sock.c +enum ConnectFailedEnum{ + ConnectFailedEnumAbortedBeforeTimeout = 1, + ConnectFailedEnumTimeout, + ConnectFailedEnumAbortedClosing, + ConnectFailedEnumRefused, + ConnectFailedEnumError, + ConnectFailedEnumExhausted, + ConnectFailedEnumFail +}; + + +// +// Mpi specific wrappers around trace functions +// +ULONG MpiTraceError( + REGHANDLE RegHandle, + PCEVENT_DESCRIPTOR EventDescriptor, + int ErrorCode + ); + + +#define SENTINEL_MASK ((ULONG_PTR)0x01) + +#define IS_SENTINEL(p_) (0 == (((ULONG_PTR)p_) & (~SENTINEL_MASK))) + +#define SENTINEL_SAFE_SIZE(p_) (IS_SENTINEL(p_)?0:sizeof(*p_)) + +#define SENTINEL_SAFE_COUNT(p_,c_) (IS_SENTINEL(p_)?0:c_) + +// +// This is a generated header. +// +#include "MpiTraceEvents.h" + + +#ifndef MAX_TRACE_ARRAY_VALUE_COUNT +#define MAX_TRACE_ARRAY_VALUE_COUNT 1 +#endif + +#ifndef TraceArrayLength +#define TraceArrayLength(_c_) ((BYTE)(_c_<=MAX_TRACE_ARRAY_VALUE_COUNT?_c_:MAX_TRACE_ARRAY_VALUE_COUNT)) +#endif + + +// +// Conditional trace macros. They will only trace if enabled. The generated header +// contains the macros and values we use for these tests. See that header for more deatils. +// + +#define TraceError(_fn_,_errorcode_) \ + MCGEN_ENABLE_CHECK(MICROSOFT_HPC_MPI_PROVIDER_Context, EVENT_Error_##_fn_) ?\ + MpiTraceError(Microsoft_HPC_MPIHandle, &EVENT_Error_##_fn_,_errorcode_) \ + : ERROR_SUCCESS + diff --git a/src/mpi/common/mpitrace.man b/src/mpi/common/mpitrace.man new file mode 100644 index 0000000..5dd3d33 --- /dev/null +++ b/src/mpi/common/mpitrace.man @@ -0,0 +1,30663 @@ + + + + + + + + + + false + + 16106127360 + + + + 5 + + 0x00 + + 2 + + QPC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +