<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/112567>112567</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Flang] [OpenMP] `omp.distribute` unsupported but test passes
</td>
</tr>
<tr>
<th>Labels</th>
<td>
flang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Luigi-Crisci
</td>
</tr>
</table>
<pre>
When compiling a simple fortran program, flang fails saying that `omp.distribute` is unsupported
```fortran
program vector_add
use omp_lib
implicit none
integer, dimension(100) :: a, b, c
integer :: i
!$omp target map(to: a, b) map(from: c)
!$omp teams
!$omp distribute parallel do simd
do i = 1, 100
c(i) = a(i) + b(i)
end do
!$omp end distribute parallel do simd
!$omp end teams
!$omp end target
end program vector_add
```
```bash
/software-local/sources/llvm-20/bin/flang -fopenmp test_offload_stack.F90
flang-20: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
error: loc("/home/lcrisci/workspace/BGK2D_GPU_SYCL/benchmark/test_offload_stack.F90":8:43): unsupported OpenMP operation: omp.distribute
error: loc("/home/lcrisci/workspace/BGK2D_GPU_SYCL/benchmark/test_offload_stack.F90":8:43): LLVM Translation failed for operation: omp.distribute
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: /software-local/sources/llvm-20/bin/flang -fc1 -triple x86_64-unknown-linux-gnu -emit-obj -mrelocation-model pic -pic-level 2 -pic-is-pie -target-cpu x86-64 -fopenmp -resource-dir /software-local/sources/llvm-20/lib/clang/20 -mframe-pointer=all -o /tmp/test_offload_stack-7fc176.o -x f95-cpp-input test_offload_stack.F90
#0 0x00005a72532ce170 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/software-local/sources/llvm-20/bin/flang+0x19b7170)
#1 0x00005a72532cb72e SignalHandler(int) Signals.cpp:0:0
#2 0x00007619b7642520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#3 0x00005a725724f1a2 llvm::CodeExtractor::findAllocas(llvm::CodeExtractorAnalysisCache const&, llvm::SetVector<llvm::Value*, llvm::SmallVector<llvm::Value*, 0u>, llvm::DenseSet<llvm::Value*, llvm::DenseMapInfo<llvm::Value*, void>>, 0u>&, llvm::SetVector<llvm::Value*, llvm::SmallVector<llvm::Value*, 0u>, llvm::DenseSet<llvm::Value*, llvm::DenseMapInfo<llvm::Value*, void>>, 0u>&, llvm::BasicBlock*&) const (/software-local/sources/llvm-20/bin/flang+0x59381a2)
#4 0x00005a7256da48ad llvm::OpenMPIRBuilder::createParallel(llvm::OpenMPIRBuilder::LocationDescription const&, llvm::IRBuilderBase::InsertPoint, llvm::function_ref<void (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint, llvm::Value&, llvm::Value&, llvm::Value*&)>, std::function<void (llvm::IRBuilderBase::InsertPoint)>, llvm::Value*, llvm::Value*, llvm::omp::ProcBindKind, bool) (/software-local/sources/llvm-20/bin/flang+0x548d8ad)
#5 0x00005a7254c41971 convertOmpParallel(mlir::omp::ParallelOp, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&) OpenMPToLLVMIRTranslation.cpp:0:0
#6 0x00005a7254c54871 convertHostOrTargetOperation(mlir::Operation*, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&) OpenMPToLLVMIRTranslation.cpp:0:0
#7 0x00005a725662058e mlir::LLVM::ModuleTranslation::convertOperation(mlir::Operation&, llvm::IRBuilderBase&, bool) (/software-local/sources/llvm-20/bin/flang+0x4d0958e)
#8 0x00005a72566250f3 mlir::LLVM::ModuleTranslation::convertBlockImpl(mlir::Block&, bool, llvm::IRBuilderBase&, bool) (/software-local/sources/llvm-20/bin/flang+0x4d0e0f3)
#9 0x00005a7254c3c086 convertOmpOpRegions(mlir::Region&, llvm::StringRef, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&, llvm::LogicalResult&, llvm::SmallVectorImpl<llvm::PHINode*>*) OpenMPToLLVMIRTranslation.cpp:0:0
#10 0x00005a7254c56e01 void llvm::function_ref<void (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>::callback_fn<convertOmpTeams(mlir::omp::TeamsOp, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&)::'lambda'(llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>(long, llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint) OpenMPToLLVMIRTranslation.cpp:0:0
#11 0x00005a7256d9bee6 llvm::OpenMPIRBuilder::createTeams(llvm::OpenMPIRBuilder::LocationDescription const&, llvm::function_ref<void (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>, llvm::Value*, llvm::Value*, llvm::Value*, llvm::Value*) (/software-local/sources/llvm-20/bin/flang+0x5484ee6)
#12 0x00005a7254c5684c convertHostOrTargetOperation(mlir::Operation*, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&) OpenMPToLLVMIRTranslation.cpp:0:0
#13 0x00005a725662058e mlir::LLVM::ModuleTranslation::convertOperation(mlir::Operation&, llvm::IRBuilderBase&, bool) (/software-local/sources/llvm-20/bin/flang+0x4d0958e)
#14 0x00005a72566250f3 mlir::LLVM::ModuleTranslation::convertBlockImpl(mlir::Block&, bool, llvm::IRBuilderBase&, bool) (/software-local/sources/llvm-20/bin/flang+0x4d0e0f3)
#15 0x00005a7254c3c086 convertOmpOpRegions(mlir::Region&, llvm::StringRef, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&, llvm::LogicalResult&, llvm::SmallVectorImpl<llvm::PHINode*>*) OpenMPToLLVMIRTranslation.cpp:0:0
#16 0x00005a7254c4c9c6 convertOmpTarget(mlir::Operation&, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&)::'lambda'(llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)::operator()(llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint) const (.isra.0) OpenMPToLLVMIRTranslation.cpp:0:0
#17 0x00005a7254c4d10c llvm::IRBuilderBase::InsertPoint llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>::callback_fn<convertOmpTarget(mlir::Operation&, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&)::'lambda'(llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>(long, llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint) OpenMPToLLVMIRTranslation.cpp:0:0
#18 0x00005a7256d99929 createOutlinedFunction(llvm::OpenMPIRBuilder&, llvm::IRBuilderBase&, llvm::StringRef, llvm::SmallVectorImpl<llvm::Value*>&, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>&, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::Argument&, llvm::Value*, llvm::Value*&, llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>&) OMPIRBuilder.cpp:0:0
#19 0x00005a7256d9a259 std::_Function_handler<llvm::Function* (llvm::StringRef), emitTargetOutlinedFunction(llvm::OpenMPIRBuilder&, llvm::IRBuilderBase&, bool, llvm::TargetRegionEntryInfo&, llvm::Function*&, llvm::Constant*&, llvm::SmallVectorImpl<llvm::Value*>&, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>&, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::Argument&, llvm::Value*, llvm::Value*&, llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>&)::'lambda'(llvm::StringRef)>::_M_invoke(std::_Any_data const&, llvm::StringRef&&) OMPIRBuilder.cpp:0:0
#20 0x00005a7256d88e2d llvm::OpenMPIRBuilder::emitTargetRegionFunction(llvm::TargetRegionEntryInfo&, std::function<llvm::Function* (llvm::StringRef)>&, bool, llvm::Function*&, llvm::Constant*&) (/software-local/sources/llvm-20/bin/flang+0x5471e2d)
#21 0x00005a7256dabd04 llvm::OpenMPIRBuilder::createTarget(llvm::OpenMPIRBuilder::LocationDescription const&, bool, llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint, llvm::TargetRegionEntryInfo&, llvm::ArrayRef<int>, llvm::ArrayRef<int>, llvm::SmallVectorImpl<llvm::Value*>&, llvm::function_ref<llvm::OpenMPIRBuilder::MapInfosTy& (llvm::IRBuilderBase::InsertPoint)>, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>, llvm::function_ref<llvm::IRBuilderBase::InsertPoint (llvm::Argument&, llvm::Value*, llvm::Value*&, llvm::IRBuilderBase::InsertPoint, llvm::IRBuilderBase::InsertPoint)>, llvm::SmallVector<llvm::OpenMPIRBuilder::DependData, 2u>, bool) (/software-local/sources/llvm-20/bin/flang+0x5494d04)
#22 0x00005a7254c45681 convertOmpTarget(mlir::Operation&, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&) (.part.0) OpenMPToLLVMIRTranslation.cpp:0:0
#23 0x00005a7254c55f47 convertHostOrTargetOperation(mlir::Operation*, llvm::IRBuilderBase&, mlir::LLVM::ModuleTranslation&) OpenMPToLLVMIRTranslation.cpp:0:0
#24 0x00005a725662058e mlir::LLVM::ModuleTranslation::convertOperation(mlir::Operation&, llvm::IRBuilderBase&, bool) (/software-local/sources/llvm-20/bin/flang+0x4d0958e)
#25 0x00005a72566250f3 mlir::LLVM::ModuleTranslation::convertBlockImpl(mlir::Block&, bool, llvm::IRBuilderBase&, bool) (/software-local/sources/llvm-20/bin/flang+0x4d0e0f3)
#26 0x00005a72566282ee mlir::LLVM::ModuleTranslation::convertOneFunction(mlir::LLVM::LLVMFuncOp) (/software-local/sources/llvm-20/bin/flang+0x4d112ee)
#27 0x00005a7256629818 mlir::LLVM::ModuleTranslation::convertFunctions() (/software-local/sources/llvm-20/bin/flang+0x4d12818)
#28 0x00005a7256632a44 mlir::translateModuleToLLVMIR(mlir::Operation*, llvm::LLVMContext&, llvm::StringRef, bool) (/software-local/sources/llvm-20/bin/flang+0x4d1ba44)
#29 0x00005a72536967a8 Fortran::frontend::CodeGenAction::generateLLVMIR() (/software-local/sources/llvm-20/bin/flang+0x1d7f7a8)
#30 0x00005a7253699dc8 Fortran::frontend::CodeGenAction::executeAction() (/software-local/sources/llvm-20/bin/flang+0x1d82dc8)
#31 0x00005a7253313d91 Fortran::frontend::FrontendAction::execute() (/software-local/sources/llvm-20/bin/flang+0x19fcd91)
#32 0x00005a725330212f Fortran::frontend::CompilerInstance::executeAction(Fortran::frontend::FrontendAction&) (/software-local/sources/llvm-20/bin/flang+0x19eb12f)
#33 0x00005a725331bbbd Fortran::frontend::executeCompilerInvocation(Fortran::frontend::CompilerInstance*) (/software-local/sources/llvm-20/bin/flang+0x1a04bbd)
#34 0x00005a725289ce98 fc1_main(llvm::ArrayRef<char const*>, char const*) (/software-local/sources/llvm-20/bin/flang+0xf85e98)
#35 0x00005a72527b293f main (/software-local/sources/llvm-20/bin/flang+0xe9b93f)
#36 0x00007619b7629d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#37 0x00007619b7629e40 call_init ./csu/../csu/libc-start.c:128:20
#38 0x00007619b7629e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#39 0x00005a725289bd15 _start (/software-local/sources/llvm-20/bin/flang+0xf84d15)
flang-20: error: unable to execute command: Segmentation fault (core dumped)
flang-20: error: flang frontend command failed due to signal (use -v to see invocation)
flang version 20.0.0git (https://github.com/llvm/llvm-project 70334081f75d67900c6ffa193c60c4d6f4767354)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /software-local/sources/llvm-20/bin
flang-20: warning: OpenMP support in flang is still experimental [-Wexperimental-option]
flang-20: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
flang-20: note: diagnostic msg: /tmp/test_offload_stack-038dfb
flang-20: note: diagnostic msg: /tmp/test_offload_stack-038dfb.sh
flang-20: note: diagnostic msg:
********************
```
However, running the `distribute-parallel-do-simd.f90` test gives no error
```bash
./build/bin/llvm-lit -v flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
-- Testing: 1 tests, 1 workers --
PASS: Flang :: Lower/OpenMP/distribute-parallel-do-simd.f90 (1 of 1)
Exit Code: 0
Command Output (stderr):
--
RUN: at line 4: bbc -fopenmp -emit-hlfir /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 -o - | /software-local/sources/llvm-project/build/bin/FileCheck /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
+ bbc -fopenmp -emit-hlfir /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 -o -
+ /software-local/sources/llvm-project/build/bin/FileCheck /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
RUN: at line 5: /software-local/sources/llvm-project/build/bin/flang -fc1 -fopenmp -emit-hlfir /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 -o - | /software-local/sources/llvm-project/build/bin/FileCheck /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
+ /software-local/sources/llvm-project/build/bin/flang -fc1 -fopenmp -emit-hlfir /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90 -o -
+ /software-local/sources/llvm-project/build/bin/FileCheck /software-local/sources/llvm-project/flang/test/Lower/OpenMP/distribute-parallel-do-simd.f90
--
********************
Testing Time: 0.07s
Total Discovered Tests: 1
Passed: 1 (100.00%)
```
LLVM commit: 70334081f75d67900c6ffa193c60c4d6f4767354
LLVM build options:
```bash
CC=gcc
CXX=g++
BUILD_TYPE=Release
TARGETS_TO_BUILD="AMDGPU;X86"
NUMTHREADS=$(nproc)
LLVM_PATH=$1
INSTALL_DIR=$2
CMAKE_OPTIONS="-DLLVM_ENABLE_PROJECTS=clang;flang;compiler-rt;lld \
-DLLVM_ENABLE_RUNTIMES=openmp;offload \
-DOPENMP_ENABLE_LIBOMPTARGET=ON \
-DLIBOMPTARGET_DEVICE_ARCHITECTURES=gfx908 \
-DLLVM_ENABLE_TESTS=ON \
-DFLANG_INCLUDE_TESTS=ON \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
-DLLVM_ENABLE_ASSERTIONS=OFF \
-DLLVM_TARGETS_TO_BUILD=$TARGETS_TO_BUILD \
-DCLANG_ANALYZER_ENABLE_Z3_SOLVER=0 \
-DLLVM_INCLUDE_BENCHMARKS=0 \
-DLLVM_ENABLE_OCAMLDOC=OFF \
-DLLVM_ENABLE_BINDINGS=OFF \
-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=OFF \
-DLLVM_ENABLE_DUMP=OFF \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DCMAKE_INSTALL_PREFIX=$INSTALL_DIR"
cmake -S $LLVM_PATH/llvm -B $LLVM_PATH/build -G Ninja $CMAKE_OPTIONS
```
Is something breaking during the installation process?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsPFtzo7jSv0Z5UeECgTE85AHfEn_rxC7bmTNzXlwyCEcbQJQkMsm__0oCx0CcxIkzO5c9W7MzRrRafe-WoMFC0G1GyDno9kF3eIYLecv4-bSgW2oMOBUhPduw6PH8P7ckgyFLc5rQbAsxFDTNEwJjxiXHGcw523KcAjSAcYKzLYwxTQQU-FGBy1ssIXBNluadiArJ6aaQBLgmpAIWmSjynHFJImAOgRkA1yz_VMjL0WoFeE9CyfgaRxU0hBAWgkCW5uuEbqpBRR0NqYQZy8gesP4fzSTZEq5IjmhKMkFZBpBnmSZAPgR2AOwAYnV7o_4Kd5jLaTsACg9jB8gCyGFpDiXmWyIhTHEOkCdZHa1fjcacpWo8BMh_Ex_BqXgLaC9lmGOOk4QkMGJKa9HhqRFTrNhDaCnSlBBKsBAgj5YCGSqyqwvUV-Tri8P4SBbBiL1FpoZ6i9RjkGihvKkKDVmqowRVAy8Z1pMZti43WNxWQ2gsWCy_Y06MhIU40QMFD4kAaJwk96mBTIDGG5oBNC79wohZTjKtRiHXLI4ThqO1kDi864x9s86xnqAw2AH8jnlGs636OctJdjWHldNAmlUeRwUUkiYJJA854cqiJU4g6PaN_9RHDJZLZendYSUCzhlXeBOmdA0QAmh8y1KiWAh1CABo_J3xO5HjUI32L_5Cw_XF_Ga9_DaYKv5IFt6mmN8BNH6BLYSAHXjADhxbmYwd1N1-xxLLCceaODuArVjxU2mdTr9cwRXHmUg0fTq6kUhFv7eJnk9HwXIERbFJqYQYboot5ETrTjJ4K2UuVCxBY4DGWypvi00nZGllQDs7yjn7m4QSoDEVotD2BXEWQZqFSRERKG8JDDkWt3CDwzvJcUg65fJLxReMijRXq-ghswNMf16ZPebbQlmGIgJ-zKJDCxqSU5UPHjx37TpGkd1l7HtmJDQrHoxtVkCDpFQabPM3NFJOFG4lMyNlEUlgTkNo5DQ0EnJPEojKCyqMnBJolB5rhHmh0Buus3cig5OSPCOi_GjqVZpA41BRD9AYmdBIY45TYuRMRXcO7CFOEmgwhVGm-UFTMXpxaPXcDoPGA4z9rhHmuUGzvJCvujYEyDah-WCaptnFPdS1UUisngm1tnVOEY-i_DHnNJNafyuuzdnbA3H8fc2E5EQlXVfFbJrJMjR7H9AiQH3zwfI3Patn7mM6QLbVonXTQwQu6TbDySXOokQlUK9auhwWnTBXtmbq_58QoQpRz1XLuA7qIrMittRHZTpPJlPeCDuCdVxNnp7SIM6uE9dDTmxhVBPkgEVk9KCcQeqwAewgplkUJEoooiHOBmiQ4eRRUDHAoXIrlglZyXg_YUnkF1LiHexHv-CkIAAFLdgUJ8kb0GYB7FFz2pBkgiyJPGIFDXqF80kWsxfB7xmN1CLlOtWC_w62-ljQsJ-w8E5PcpW1ar2e4i5d3_YsjBoW6dQt0o2w4-GoRkeZ6CaLfkGTiFQ2GXKCJZlXtU_DLA_CT6vgOSQi5FRn8xeM9GliHwtSDWWCcDln2mXrsHGRhQrVmpMY2AMlVdig5T3I3oL1n1lFa_ljUf04Euuwlbm57xitrKziU8ioyeaHJPxcaofd5vAoKysAlVZY2KdZ9BfNIr0PYSw5MXN0HS_ycNRwhW7dFZzQsfyepez0nnA5S_OavacJ5W0aq7uz_DWtlbLfT1d1WvnrikVFQmolW-X0pUOtmIKcLGr3Dyctt8lD1_H2PFwyIWd8pYuT2VMRWOemNhr8VDZ6jajkIrPrkSPXKyNUpbW3uHw1_JR3P8HYnMj0ux5pGJvX4rBrxvYHONQpYpLmTausEkeN_n-GS2LGdoNLv2mOdmh6bs2lZvmCbCnLRIP6cux5ppecZtsFiT_TMuuYpmxLQ5wsiCiSA_XTvnjQ8q6H_Pnl5JpFOoKpgBe80-JV1Wq2HNclpqUrhZ-a8UpTw0miNmnrWGWBvfZW-lznYDTUtz45FJY3AeolON1EGKDeD872XsKUaX80B7-5yHtNxGqWav6GEPe4Um2nqU-r035y7fWeKuKt0VPLCIcQ9ynmKTWhtid7TvibpWDFhv1Hp2DFofPHp2DFZfd_KfhIi2_Vzk7oh3VJlV57ghn_srlOp27NCuPa-vwft9r-FKNDBccd8wOK6rUUFVlmeDQNv_IW_oia6481wl-w4PJaBZfvK_vVFdWskAnNSDTeHY-8Vlwdo5c3g-xrwe-pmjlwkvhrGvkPoTKongy9csT14sHXDzO6Hbc-nNVs4rDB-S2Dw6jr74_i1jtjW99WDzLqgtpbYtCUSs2efEU7SamsKtDPNuLnhU65UFlOjDLJH_XJeBtXjfZn9wYqX2Alyuf3_ucTv7lPvJFiGqa7S43rqzXN7tkdAcjb-0aQPa4jLPFLT7_2mNxj3RGZTXf0PILefDay967S6A_61mtecejk_b1e_mRMzx3yPa524ta4ZxEU1fciqHWCgTeR6Rx5grGre048wnhrK3aaYb8_8gWc48eF9m-FoX3Q8cbtT49_B2VaPc8Uq0eA3FMfAP2iofdfFHePeSJ-0A6GJCdZNMRSvwyIdg_KP-VpnO9EptOIFa1jNKfretZP2o3r3WqOufzIbhXZrfPAbuz0fr_zQNQ-LfvjzgNR999wHojcFpceIh_SY0Zqpc2h-eqXApnlJ3NhWYg0ddV-QOx7lvcBLnYsiPLY60QqkWd5DSpbD3lthB2nRqWsqCIVkZUrHun_CnjAMkkeXi13P8mQrA12mgG6sVm1Xd_tYQ-Oqzfgy0TKFXlZtKsuI3JBsiDca2FLMsUdeeL71PcBo17cww0dtN5ddH0_Ct9LJnkgYSFJsLP2k6n0UBQ2qWy-tWhbduRbr1E5rq4OkPkJBPpxGPlWg0DUJNBEFopfF2Oa04Twid5ShOSwJI_n8OT9iOWTjYXiBlN2S-qbzSZ6jamK_D1v99V243VWnsni5OeOFjadzaaxuWq-yYc8PyS-B-PQWqeYZq3a9GlXEd5ivtsgBVVB1xw7jdDY6xK_aeqNNIt6G-TbMVQ0nrIO8Te-3VSu23x_F_mRb8L1OqGbcC0k5nId4iTR0oEdgMahKAAad9RP8SgikqsVs1wm1Xu97UmdW2AHXQ_YgeXuV-21VyWOCfUcmlHZXqj8qbAbGnsnVOiQQor2tdfTy0INpA1WDnFxELnd8xXZe9x-y2w2kdWFJdbTFO9EVvdJIfXWkKemiCLDm4RAyWDlWDBkaYq128Al2er-j6p9oUg0OSHjRPcGkOh13FVTV-WHO8S7Poio0MsK_f63wlsIAo17PUYIpDXHri8C7wkXih5kdsyOuaWapvd1RMCeaduO6Vlxrxu5Pd80QzeOseXboWuGTuTGTs_t2d19sq22OnbwYrNCBXfLCY6g7lBQ0DkT9KG8pSNPkpBoqOuKd7VN_IOtPfVVMiZV0oARxduMCUlDmAq96M52T_hTa1qqul2C1SoYXMLV5QiOZ9Pp7D-T6ws4nkxHS7ia6eH-zQVcjOazxQrs-lLmnOSchUQIEsFSfgB5QsVMZWxYCBZSLEkEeZHB8kTqCYATqLtKSASxfEJ5pAheafMwbS-KN5-LrbPrIHuXhj5VT63utkv2ndyXzZC8yLKyaZNA4Jr7diZj155nRMwQNI06sa8w6H4XuKX3RMCMVTHjpZ45FUk3anP2FOS0eyRUqoBRBTwtOYDGU_Zd0TQu_QKg8VvE1Bg0DLgiQlaeZWkiheLPgt8ZvyNcQMOo7C5YLhXQWDtbmdThe9dWocuCLIb7Qm_0QCVUBbDC1yBuUMXPWSHzQkc9ISPCeXWGXzFQ_ru4udYtoxImNCPQURebTVhrgtKtVbdJfFwL1L6V7ERpQ4NBA4Le4H2rNrU_pgkZ3JLw7h8lfedL_V9IknuaflNxtgy1e2RmfImVenfhL6Gg393U_yRd_PbO0ozxn5vbq7wHVzQtU0_H7IkGAFP145CKkN0TTiKdKXUDsLVroZ9jVYWVqbP8KkLHNAHab0EON8nrv3W7tNoiUF1mH12h7ydrPcGynBW1Euh5PTEYAHu4DauvMwy-flWXAPXVHz3Uv5lMh-vVt_kI2MMFSQgWVWP2KlhcjFbL9Wq21kDAHgKEgqvhxfwG2P2vngsQKkGvb65Wl4tRMFxqIAcgL1Ol6pM0FNXrebC6LO9XYpxcL1fBdLoeThblOGoUAVfBX6P1bL6azK5LvMgYakSj66A_Ha3ni9n_jQYrda9sVrb7cfVvWJ2BGFwCu58kEQTdwcHPHzRRLm6uV5OrkUJZujGw-1WFuscATB8aw9l8dH01302cTvqzq3kpMmAPZ9dt8DrAejj6MhmM1sFicDlZjQarm4Vechs_-Kb3bGaNvtVoqflt49_xMp4G1xfryfVgejN8GdoYlrIdrAezq_lkOqrEPxi8IqZqytev7Ulfv9Zm7eAaZgWQs79uANd5C5bL0WKn7Nl4_BzwoEU67dEmNVogwXUw_fbf0WK31H_t9XI2_aJZMJ-vs5Nff3Q9uLwKFn8tW3CvmdBsEFxNh7PBMyZem9SfXA8n1xcvcz66ms8WwWIy_bYO1H5xPVPinM2mg8tgcv3StAr78OZqfhw5pZr0z-G36aTfMp4n9e48d74YjSdfSz3UvRk1PDlM8R2BxhIC5OwjQZk4oNFvD5fRzbiA1zT7G6u7zVBwKLJOBBQsJfJWBfYNJ_hO_YgKvtuq0fJMojzgqbbRwB6fRed25Ns-PiPnVg_5po-Q2Tu7PfetsLfpRrhHHN-OY-J2PQ97sWf7URhbZveMniMTOZZpuVYX2cjtWD3P7cY92_c9ZLuOBRyTpJgmHcVmh_Htmf42xblloa7bO0vwhiRCf1kIoSpnItAdnvFznVA3xVYAx0yokGKPQlKZ6M8R6c0Y6Cpr71epVV0c-ohQ_VMim-r7CzBXCUycFTw5__g3NipW7s_R_wcAAP__2MREVA">