<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/66712>66712</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[mlir][Bufferization] ASAN error while integrating LLVM into IREE
</td>
</tr>
<tr>
<th>Labels</th>
<td>
mlir
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
matthias-springer
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
MaheshRavishankar
</td>
</tr>
</table>
<pre>
Filing an issue cause integrating LLVM into IREE seemed to have hit upon an asan error. I am not sure where the error is, but indications are that this is a bug in MLIR. Ill try to create an MLIR only repro, but here are instructions to IREE repro (which hopefully the relevant folks know how to repro)
Checkout https://github.com/openxla/iree/tree/bump-llvm-20230914 and build `iree-opt` in ASAN mode (or check out the PR https://github.com/openxla/iree/pull/14980)
```
module {
func.func @simple_mul_dispatch_0_generic_4_f32() {
%c4 = arith.constant 4 : index
%c0 = arith.constant 0 : index
%0 = hal.interface.binding.subspan set(0) binding(0) type(storage_buffer) alignment(64) offset(%c0) flags(ReadOnly) : !flow.dispatch.tensor<readonly:tensor<4xf32>>
%1 = hal.interface.binding.subspan set(0) binding(1) type(storage_buffer) alignment(64) offset(%c0) flags(ReadOnly) : !flow.dispatch.tensor<readonly:tensor<4xf32>>
%2 = hal.interface.binding.subspan set(0) binding(2) type(storage_buffer) alignment(64) offset(%c0) : !flow.dispatch.tensor<writeonly:tensor<4xf32>>
%workgroup_id_x = hal.interface.workgroup.id[0] : index
%workgroup_count_x = hal.interface.workgroup.count[0] : index
%3 = affine.apply affine_map<()[s0] -> (s0 * 4)>()[%workgroup_id_x]
%4 = affine.apply affine_map<()[s0] -> (s0 * 4)>()[%workgroup_count_x]
scf.for %arg0 = %3 to %c4 step %4 {
%5 = flow.dispatch.tensor.load %2, offsets = [%arg0], sizes = [4], strides = [1] : !flow.dispatch.tensor<writeonly:tensor<4xf32>> -> tensor<4xf32>
%6 = flow.dispatch.tensor.load %0, offsets = [%arg0], sizes = [4], strides = [1] : !flow.dispatch.tensor<readonly:tensor<4xf32>> -> tensor<4xf32>
%7 = flow.dispatch.tensor.load %1, offsets = [%arg0], sizes = [4], strides = [1] : !flow.dispatch.tensor<readonly:tensor<4xf32>> -> tensor<4xf32>
%8 = linalg.generic {indexing_maps = [affine_map<(d0) -> (d0)>, affine_map<(d0) -> (d0)>, affine_map<(d0) -> (d0)>], iterator_types = ["parallel"]} ins(%6, %7 : tensor<4xf32>, tensor<4xf32>) outs(%5 : tensor<4xf32>) attrs = {lowering_config = #iree_codegen.lowering_config\<tile_sizes = [[4]]>} {
^bb0(%in: f32, %in_0: f32, %out: f32):
%9 = arith.mulf %in, %in_0 : f32
linalg.yield %9 : f32
} -> tensor<4xf32>
flow.dispatch.tensor.store %8, %2, offsets = [%arg0], sizes = [4], strides = [1] : tensor<4xf32> -> !flow.dispatch.tensor<writeonly:tensor<4xf32>>
}
return
}
}
```
Running this
```
$ iree-opt --iree-eliminate-empty-tensors repro.mlir
```
gives the following ASAN error
```
=================================================================
==410480==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7f2042ba3d41 at pc 0x7f20542da937 bp 0x7ffcc15f3ff0 sp 0x7ffcc15f3fe8 READ of size 1 at 0x7f2042ba3d41 thread T0
#0 0x7f20542da936 in mlir::bufferization::BufferizationOptions::isOpAllowed(mlir::Operation*) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp:395:8
#1 0x7f2052fab53a in checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0::operator()(mlir::bufferization::BufferizableOpInterface) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp:1193:18
#2 0x7f2052fab53a in std::enable_if<!llvm::is_one_of<mlir::bufferization::BufferizableOpInterface, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisSt\ate&)::$_0, mlir::bufferization::BufferizableOpInterface, mlir::WalkResult>(mlir::Operation*, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&)::'lambda'(mlir::Operation*)::operator()(mlir::Operation*) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:376:14
#3 0x7f2052fab53a in mlir::WalkResult llvm::function_ref<mlir::WalkResult (mlir::Operation*)>::callback_fn<std::enable_if<!llvm::is_one_of<mlir::bufferization::BufferizableOpInterface, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumption\s(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0, mlir::bufferization::BufferizableOpInterface, mlir::WalkResult>(mlir::Operation*, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&)::'lambda'(mlir::Operation*)>(long, mlir::Operation*) /data/mahesh/iree/iree/third_party/llvm-project/llvm/inc\lude/llvm/ADT/STLFunctionalExtras.h:45:12
#4 0x7f204be5ff27 in mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:274:13
#5 0x7f204be5ff27 in mlir::WalkResult mlir::detail::walk<mlir::ForwardIterator>(mlir::Operation*, llvm::function_ref<mlir::WalkResult (mlir::Operation*)>, mlir::WalkOrder) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:274:13
#6 0x7f2052f9daa6 in std::enable_if<!llvm::is_one_of<mlir::bufferization::BufferizableOpInterface, mlir::Operation*, mlir::Region*, mlir::Block*>::value && std::is_same<mlir::WalkResult, mlir::WalkResult>::value, mlir::WalkResult>::type mlir::detail::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisSt\ate&)::$_0, mlir::bufferization::BufferizableOpInterface, mlir::WalkResult>(mlir::Operation*, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Visitors.h:379:10
#7 0x7f2052f9daa6 in std::enable_if<llvm::function_traits<std::decay<checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0>::type>::num_args == 1, mlir::WalkResult>::type mlir::Operation::walk<(mlir::WalkOrder)1, mlir::ForwardIterator, checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneSho\tAnalysisState&)::$_0, mlir::WalkResult>(checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&)::$_0&&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/Operation.h:760:12
#8 0x7f2052f9daa6 in checkPreBufferizationAssumptions(mlir::Operation*, mlir::DominanceInfo const&, mlir::bufferization::OneShotAnalysisState&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp:1191:31
#9 0x7f2052f9daa6 in mlir::bufferization::analyzeOp(mlir::Operation*, mlir::bufferization::OneShotAnalysisState&, mlir::bufferization::BufferizationStatistics*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/Transforms/OneShotAnalysis.cpp:1392:14
#10 0x7f20505666be in mlir::iree_compiler::(anonymous namespace)::EliminateEmptyTensorsPass::runOnOperation() /data/mahesh/iree/iree/compiler/src/iree/compiler/Codegen/Common/IREEComprehensiveBufferizePass.cpp:191:14
#11 0x7f204b0dce83 in mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_1::operator()() const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:503:17
#12 0x7f204b0dce83 in void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_1>(long) /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#13 0x7f204b0dce83 in llvm::function_ref<void ()>::operator()() const /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#14 0x7f204b0dce83 in void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/include/mlir/IR/MLIRContext.h:275:7
#15 0x7f204b0dce83 in mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:497:21
#16 0x7f204b0de4e5 in mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:569:16
#17 0x7f204b0e64ed in mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:880:10
#18 0x7f204b0e64ed in mlir::PassManager::run(mlir::Operation*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Pass/Pass.cpp:860:60
#19 0x7f204b0b6461 in performActions(llvm::raw_ostream&, std::shared_ptr<llvm::SourceMgr> const&, mlir::MLIRContext*, mlir::MlirOptMainConfig const&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:376:17
#20 0x7f204b0b44e6 in processBuffer(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::MlirOptMainConfig const&, mlir::DialectRegistry&, llvm::ThreadPool*) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:431:12
#21 0x7f204b0b44e6 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:472:12
#22 0x7f204b0b44e6 in mlir::LogicalResult llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::callback_fn<mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&)::$_0>(long, std::unique_ptr<llvm::MemoryBuffer, st\d::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:12
#23 0x7f204b0cdcf9 in llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>::operator()(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&) const /data/mahesh/iree/iree/third_party/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:12
#24 0x7f204b0cdcf9 in mlir::splitAndProcessBuffer(std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::function_ref<mlir::LogicalResult (std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, llvm::raw_ostream&)>, llvm::raw_ostream&, bool, bool) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Support/ToolUtilities.cpp:28:12
#25 0x7f204b0a7b54 in mlir::MlirOptMain(llvm::raw_ostream&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>, mlir::DialectRegistry&, mlir::MlirOptMainConfig const&) /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Tools/mlir-opt/MlirOptMain.cpp:475:10
#26 0x7f204a9a96c7 in ireeOptMainFromCL(int, char**, llvm::StringRef, mlir::DialectRegistry&) /data/mahesh/iree/iree/compiler/src/iree/compiler/API/Internal/IREEOptToolEntryPoint.cpp:128:14
#27 0x7f204a9a96c7 in ireeOptRunMain /data/mahesh/iree/iree/compiler/src/iree/compiler/API/Internal/IREEOptToolEntryPoint.cpp:150:14
#28 0x7f204484f689 (/usr/lib64/libc.so.6+0x23689)
#29 0x7f204484f744 in __libc_start_main (/usr/lib64/libc.so.6+0x23744)
#30 0x556534130300 in _start (/data/mahesh/iree/build/RelWithDebInfoAsan/tools/iree-opt+0x54300)
Address 0x7f2042ba3d41 is located in stack of thread T0 at offset 1345 in frame
#0 0x7f2050565baf in mlir::iree_compiler::(anonymous namespace)::EliminateEmptyTensorsPass::runOnOperation() /data/mahesh/iree/iree/compiler/src/iree/compiler/Codegen/Common/IREEComprehensiveBufferizePass.cpp:173
This frame has 9 object(s):
[32, 33) 'regionChanged.i'
[48, 96) 'agg.tmp1049'
[128, 304) 'patterns' (line 179)
[368, 384) 'ref.tmp' (line 181)
[400, 592) 'agg.tmp.ensured'
[656, 696) 'ref.tmp16' (line 182)
[736, 776) 'rewriter' (line 188)
[816, 1096) 'state' (line 189)
[1168, 1536) 'ref.tmp21' (line 189) <== Memory access at offset 1345 is inside this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-scope /data/mahesh/iree/iree/third_party/llvm-project/mlir/lib/Dialect/Bufferization/IR/BufferizableOpInterface.cpp:395:8 in mlir::bufferization::BufferizationOptions::isOpAllowed(mlir::Operation*) const
Shadow bytes around the buggy address:
0x7f2042ba3a80: f2 f2 f8 f8 f8 f8 f8 f2 f2 f2 f2 f2 00 00 00 00
0x7f2042ba3b00: 00 f2 f2 f2 f2 f2 00 00 00 00 00 00 00 00 00 00
0x7f2042ba3b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7f2042ba3c00: 00 00 00 00 00 00 00 00 00 f2 f2 f2 f2 f2 f2 f2
0x7f2042ba3c80: f2 f2 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
=>0x7f2042ba3d00: f8 f8 f8 f8 f8 f8 f8 f8[f8]f8 f8 f8 f8 f8 f8 f8
0x7f2042ba3d80: f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8 f8
0x7f2042ba3e00: f3 f3 f3 f3 f3 f3 f3 f3 00 00 00 00 00 00 00 00
0x7f2042ba3e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7f2042ba3f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x7f2042ba3f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==410480==ABORTING
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsPEtv4zjSv4Z9IWJI1Ms-9MFx4t0AnUngZHbxnQxKKtncUKQ-kkra8-sXpCRbcmwn3Z30pHcGEPygisV6s4oSSbVmKwHwGUXniJCSGrNmVJ_pSjGxAoUIQdHFJ1qbtVSfr-ka9HpBH5leU_FA1adU5pvPc8aZWGEqMNO6BpzRWgNmwsBKUWNvffnyr2vbIPHV4vISa4AScmwkXtNHwGtmcF1JYTFQTQUGpaQa4StMSyykwbpWgJ_WoACbNTS3MdOIzHBaG8xEzjJqmBQaUwdDDTZrpjHTmOK0XmEm8PWXq8UIX3GOjdrYsTMF1IAd1N7CUvANVlAp2eF1A1qETGij6qwZoWPCgWJExk9rlq3xWlZQ1JxvHIkKODxSYXAh-YPGD0I-4bV8sp3bISbIu0DetPmcrSF7kHZIYyqNgikic0TmK2bWdTrKZInIXFYgvnKKyJwpAETmpvlK67I64_yxPCMeCbyJH2IqcpzWjOcYxZ6FPpOVQbFnxTC9m_6GS5mDJV0qnNmhsR3b0n27-CYSqppzROZ-OBl7eyyh2Gsv97eUec0Bo-S8-Y-LWmQj-4FR6GlWVhyWZc2XOdMVNdl66S1XIECxbBkui4AgMkZk0kOAMUYkykKMggtMFTPrUSaFNlbqtnFq7QK-DqG9Q9DeEegGeE35yNqyKmgGo9Qam1iNdJ3qigqswSDimMftre6v2VSAyFgbqegKlmldFNafJphythIlCNsxDm2LLIoGjyPRthScrjQi4wXQ_EbwjWM9mGJE_ILLp1EnpZEBoaVCwUwBza0Jo2C6bQu_WsEFl_bqM-Z_L2P-B2eMfC9j5IcZO83Ek2IGXsvFk1QPKyXrasny5dcDLG0BRixH0bmHoosjJrxDlclamBewOZjTCIPGgYqCCRjRquKb9s-ypBUKZo2bouhcOyRnKLi0gUZ7GJEptrKz3HZAz5hF0cVguPD9hmsFMhhRZ8WokMqOTNWq8X_HtJFtsNEGqpawfiRyxEYO_pAFjLikuTNQO7c0xqMb7I4qO5glhMywZn_A9lbYNRrF8l2z3-nn-w2uEdXzO0OO4pc58n4WRy_EgdcxlLzMkP9LMTR2A3ImKF-N2gnTmqbzXCZW1k-2RO27Tu4iV-c07p9zl9kzJ_thyEZIzICiRqqlDbU96ZKKKso58CbfRMmFzbma8Brbjq3qpgfkQWaHGic2pWkxRMd6TjA1RrV0JOdcPoFNe5eZFAVbtd4f2FxnmckcViBGezAomqFgZhiH5cAqOsOILuxAyUUvWqDoMk29hjImLGUuu3E8MrH0hi2yNtuGic3Keup3BjDpZTRlzYsGTQ8f7voPerYWs2HA8w7NMzBL-EkrPOhIdv4EZ5stFW8c9J4R01nbG0y-SW8yUGBqJTqtdXd2P4YJbvO5qIWwBY-rPk6kw4iEuEvM8dmZ-wmclUxQA2dQVmZz1pCqm4JhVHKmTgy8Yo-gXQpfSM7lkyXCpfpNsXSKlODil796jIS-F4695vflYnGzsCYzzXMFWt9RwQz7A5Rt04ZmD2e1hjNaGFBnOpMVYFuFNsDY-5oUxAtJSoM89DE1uMraxigkOZ0ECU4r11JkmR8VQVF4WA9bYIwXl9MLLAtn5Njh2cNs1nYqwPdeP_UJvOFYsS3enBEEUxRMm-SU_eHK3qbpvN90U7lqtbnD9E01tVYBOSLjHZKbyoZji4BMbTR0FRFGZJ5TY6u80tX7u3KvKzzXTOXLiiqzQWTuSs9Kyf9AZmwfi53MOUsRmV8wypvmAXGIzK8W_caUw011tc1Is6pCwTSYRCiYjjsHJIHfSYQUNI0CaiXiytdbBQP8U63rshXAcX5nPXFeSOt6IoMrUchGDojEQ5gDIr8RcLeWZioo32im7ww14PpNmvuIhC6go2Aqq2bqa5PRPlmndDmUzE9W0r2iQhdSlRqR-R6vrZJ8fxLYr56ayAE1aZM3jIGwLC1Z4bIF39LV2ehSClhKe-P7RNPX1XFNL2B1qPmcy-zBttoZwTY8Ul7bWSxGJN6Rz_RS0xIGNP6b8ocF6JqbIcpe-wDpi1A2OepB5GAo483vJ8ofmjxriOFG5a5U9YfI51I9UZVfmc72Zh_NYVA0O-gzLyF6lRUMZXuKsQ8mlcMiiYdtCadlmlNEklNB_cXo846TABMZr3PYNbio_y-mmZFKj9Y2yCexDR_hLnwEB8LHIZXiXewoauEWZ5cKiiOuiU_LqPW8jHKe0uxhWQgUzP4OWr9I0ELR7GN46N9B662CluWcS7E65SGTH4xSzo9dlELRrA1Ubdv04h6R-d39l3kbWii__GoUbYJWaBNTn-xiVtil9ClERUGSozHrpIMcd4EXDOFtI-Eza-z89KdNCiQJrYCDnYCjvwX8vgKOd7PuJKc0_jtp_4Xmv7-T9o8glZPz309MqO34vrdz7eS1rn0gyhlFmdH9XDiHjG5QMPsVhN_3ze0fUZdLqlZuXRkFF9j_VtfeMfM_5N0omn1TdrvvpR-Bh4_gi1vWnDMmsbeXKY4POONHld1HWmT0bWjzd3KcHJDjSTapRfkH3FSvlOa3SOq1055tsr2YNizTb1LDvKGQgwnZW4rxt88gvCiO4xSGUm4fjJYV46A6RxtTIcWmlLXGgpagq2bZurl92T3iuiwrs7lvHnDdUt0-p1C1uBE9lYxfJZ8tBWSuVXawfdY8vXW_yrJ9AHF5OZNlpWANQrPHrfeBpaeTibO7gUj8bSXi5RmMg6FI-mnfTXUvbyqLbZrTylUZLZMDE3Ts71vfcbvstHZNBXUvaM5wKiW337VwL3PmmAkzCH1-8_PZIuC7PE5o-Jn3pBh57hFB0pMiOSDFR8ny45WWu9tSfni57hfQwm5V4-3WLn5o4cIPDijim3Twbkb1fRzG430Ow2OmttPm9ZerxUwKA19NmxV_haw2MM2aID4b2smlu2vn6Ob-wDIaQ4pbXb9SkoMlhqlSdLPYW164WvwumHm2etCN9r5JTU8-7fKBtaO-P0e_TFR831AXThIrn16i4sc90UAI0feI5pZVwJmAvdzFgm45jt9cVvuGduVegy9BOHefngLoZT8d7bdUgTD93PSt058DM0_siuG4p45kpw6IQ8fqHhedXLbCp1rDa5PwZ8J9Zw7HY2-v3PfH38zhyeeB70u-K5DiPvmTHflpHMa-Jb8CZZPXJt7qQWBV9GkptVFAy9YHtksVek0V5MvKqMHixp2sVQbXK4WCyyNlUn9C2NfwNWfqpjLXlIlZ857gDsebSuteSq7bRreBg8x7Y3cvyTTPT3uxmHg9AYYhuNKoUjIDrc_bV9pfJ79asP-v4Zn8rqGUatOh6sHnUNCam2UOHAwc79O8dPdqoQ5q3KbCWcCKaaM27f3dOPfuVapbF87e2npfpY8w8PcSEOIf0MdBzj-gXg7L-5XOMFiKO5gr_jyWjgv2HUqg11lKQvYthZy0lC9yxTLKX__2w7DDRxH3i9XbX8Uj-o-4v50TFM3ewxc-RFVKelVplmfF5GRV-ssY_P9w-HujYp2EBxS_06-uODNTkd_uZTN_hhx_QSM8CbErApvvN02d7uqqksq0U-PvhnFmGHRFAHlmBr3lBJqkUfiXSZn-hCwk2qsfyXbBgk7oJM7cuzZ28LbjXMly9gWRcbtGkK1psxqw96bMnVFMrBZQvCyet1nkn95eITJ3bxUIytsl_pvKWDlcCqM2t5IJ063sN0bXW9knyXG-F7WwrP8JZEbePpnb8j4ch0U8nuBmHXFe61b1cdh8ZyMtRzEi595XEsTjyXaDfrvBhEz6mJLQedlyaXsutaHKLMuG55exJ2G4j93tX4miOApCP_ACzx0-0OBtUR6RpDu4AJH5Avi_mVlfQHolCjnVVFjrb216e6iBHT8KA2__-IHp4U08TGMuM2qaVRG3BQjLYrcDB1PT7lTDfhC6tbpC0RJ28u8_EotSWvzlHoklQV_O-H7NdCMjvKYaT7BMm2A01vs7FlF03uxrDIKGi0S597pmaypWkI8YIskAOnQ7CCdthEjoajUyZeV74WQf0rqzReyFLWxFjXUwjUhizY0zAdhP9nwgOg_ipt843FJU2DEG3dyxB0PCPPc6RDQhQ9JGIHStIN8nL252scZbVtph_Hg4ENkfKAlcxyTZdXS7GdWw33i_39h3_XxvO6Junlb3ez2Thu834vCjYI9Q4j_vilEwa9-haeZETDOblj3zIY2Z0CyHZlfkI1WMprx1qX9e_XbvNnXaWyXd4BQwxQXlGnAlNTPsETAr8EbWCldKrhQtca1BYy1LwFmtjSxbR67FExM5LiFbU8F06Wb0J1plzUoelgo_FlI9DLdQuxrsP2XlTk2ZIXKOyDmGrxk0L19gRKZUASJTrJssxqq3ldvd79fX08X_fdsWww-2v-5n7StsJbamuXzC6caAxlTJWuRu12par1abbutlL2r04jcdN3ujibvGw4sMLs_bXgcQpZ5D5Hknuj2_DiEad4i-5TqAKPNeQrRHqbsOITolo6NXb__sZX_CbKg61ik6tx8XxxEOJt_xKVynCevjgZam4PB1WuR9PD-iuh6e4kXNvRLPD9DT8ynM7aTuHi1LAVj37iioFGgQRuMxplXF2zOzGl8czNVtLHNROtgeGYBxz3hvqTKMcr712Q7Y87FHsBdgL8RehL0Ye9u58J9AK8yhMFhB_ocUPewF7YDmCiDHawvapAc9oLwFunPx_iCmonv22gKVLD8wGhkCKbZaP0NVBEMgF8O7UwG2w0VDoFpDC-iCfWPzHcg_uEwpf06OxTPZA2KC2Rkrb2aSFqh7kHkrmZYCcpxu7Ig9EFxspT2TwlAmQGH5CKrg8mlHddYBuZcNcCblA9vTNaZboCthFG0Tuz3q03SL6Y4Kd-ibK2ss313WjL9YRVFuM-995rOt3hdOB8-hsvTY9v7p-c3i_uq3f-wda_Ap_xzkk2BCP8FnP55EXhKFUfJp_RlSL0ijLJ3kceIlaZAlASkKyD0vTfwQik_sc3uE2pgQPwmSEfGLANIoGk-8IAavQKEHJWV8ZCflkVSrT-7Eu89xnPjkE6cpcN0dpefmaXd6nvrs5vC0XmkUepxpo3cIDDPcHb_nOkQXKDofzuXRRf8gh6c146fO1vtUK_75xBFu7brcXlLhuLB1lWPkvwEAAP__7meEVw">