<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/137715>137715</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[DirectX] OpLowerer::cleanupHandleCasts incompatible cast trying to cast to TargetExtTyID CallInst
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:DirectX
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
farzonl
</td>
</tr>
</table>
<pre>
## Assert
```gdb
Assertion failed: (isa<To>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file Casting.h, line 578.
Process 34770 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = hit program assert
frame #4: 0x0000000100102b54 clang-dxc`decltype(auto) llvm::cast<llvm::CallInst, llvm::Value>(Val=0x000000012f71f8f0) at Casting.h:578:3
575
576 template <typename To, typename From>
577 [[nodiscard]] inline decltype(auto) cast(From *Val) {
-> 578 assert(isa<To>(Val) && "cast<Ty>() argument of incompatible type!");
579 return CastInfo<To, From *>::doCast(Val);
580 }
581
(lldb) expr *Val->getType()
(llvm::Type) $3 = {
Context = 0x000000012f625040
ID = TargetExtTyID
SubclassData = 2
NumContainedTys = 1
ContainedTys = 0x000000012901bd48
}
```
## From by looking one frame up
```gdb
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x00000001000fa640 clang-dxc`(anonymous namespace)::OpLowerer::cleanupHandleCasts(this=0x000000016fdf43d0) at DXILOpLowering.cpp:175:38
172 }
173 // Otherwise, we're the second handle in a pair. Forward the arguments and
174 // remove the (second) cast.
-> 175 CallInst *Def = cast<CallInst>(Cast->getOperand(0));
176 assert(Def->getIntrinsicID() == Intrinsic::dx_resource_casthandle &&
177 "Unbalanced pair of temporary handle casts");
178 Cast->replaceAllUsesWith(Def->getOperand(0));
```
## IR causing assert
```llvm
%agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.5 = load target("dx.RawBuffer", i32, 1, 0), ptr %agg.tmp.i1.sroa.0, align 8, !tbaa !24
```
## IR Context
```llvm
if.end.i: ; preds = %if.then.i
%14 = call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16(i32 139, %dx.types.Handle %_ZL11inputBuffer_h.i.i12, i32 %add.i, i32 0, i8 1, i32 2)
%15 = extractvalue %dx.types.ResRet.f16 %14, 0
%conv.i = fpext reassoc nnan ninf nsz arcp afn half %15 to float
%16 = call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16(i32 139, %dx.types.Handle %_ZL14inputMinBuffer_h.i.i11, i32 0, i32 0, i8 1, i32 2)
%17 = extractvalue %dx.types.ResRet.f16 %16, 0
%conv4.i = fpext reassoc nnan ninf nsz arcp afn half %17 to float
%18 = call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16(i32 139, %dx.types.Handle %_ZL14inputMaxBuffer_h.i.i10, i32 0, i32 0, i8 1, i32 2)
%19 = extractvalue %dx.types.ResRet.f16 %18, 0
%conv6.i = fpext reassoc nnan ninf nsz arcp afn half %19 to float
%elt.min.i19 = call float @dx.op.binary.f32(i32 36, float %conv4.i, float 0.000000e+00) #4
%elt.max.i22 = call float @dx.op.binary.f32(i32 35, float %conv6.i, float 0.000000e+00) #4
%sub.i = fsub reassoc nnan ninf nsz arcp afn float %elt.max.i22, %elt.min.i19
%div9.i = fdiv reassoc nnan ninf nsz arcp afn float 0x406FDFFFE0000000, %sub.i
%neg.i = fneg reassoc nnan ninf nsz arcp afn float %elt.min.i19
%20 = call float @dx.op.tertiary.f32(i32 46, float %neg.i, float %div9.i, float -1.280000e+02) #4
%dx.max620 = call float @dx.op.binary.f32(i32 35, float %20, float -1.280000e+02) #4
%dx.min717 = call float @dx.op.binary.f32(i32 36, float %dx.max620, float 1.270000e+02) #4
%elt.roundeven.i24 = call float @dx.op.unary.f32(i32 26, float %dx.min717) #4
%mul.i = fmul reassoc nnan ninf nsz arcp afn float %div9.i, %conv.i
%elt.roundeven13.i23 = call float @dx.op.unary.f32(i32 26, float %mul.i) #4
%add14.i = fadd reassoc nnan ninf nsz arcp afn float %elt.roundeven13.i23, %elt.roundeven.i24
%dx.max21 = call float @dx.op.binary.f32(i32 35, float %add14.i, float -1.280000e+02) #4
%dx.min18 = call float @dx.op.binary.f32(i32 36, float %dx.max21, float 1.270000e+02) #4
%conv18.i = fptosi float %dx.min18 to i32
%21 = load i32, ptr @_ZL12outputBuffer, align 4, !tbaa !21
call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %agg.tmp.i1.sroa.0)
store i32 %21, ptr %agg.tmp.i1.sroa.0, align 8
%div9.i2 = lshr i32 %add.i, 2
%rem.i3 = shl i32 %add.i, 3
%mul.i4 = and i32 %rem.i3, 24
%shl.i = shl nuw i32 255, %mul.i4
%agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.5 = load target("dx.RawBuffer", i32, 1, 0), ptr %agg.tmp.i1.sroa.0, align 8, !tbaa !24
%22 = call %dx.types.Handle @llvm.dx.resource.casthandle.s_dx.types.Handles.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.5)
%23 = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %22, i32 %div9.i2, i32 0, i8 1, i32 4)
%24 = extractvalue %dx.types.ResRet.i32 %23, 0
%shl2.i = shl i32 %conv18.i, %mul.i4
%xor.i = xor i32 %24, %shl2.i
%and.i = and i32 %xor.i, %shl.i
%xor3.i = xor i32 %and.i, %24
%25 = call %dx.types.Handle @llvm.dx.resource.casthandle.s_dx.types.Handles.tdx.RawBuffer_i32_1_0t(target("dx.RawBuffer", i32, 1, 0) %agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.agg.tmp.i1.sroa.0.0.5)
call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %25, i32 %div9.i2, i32 0, i32 %xor3.i, i32 undef, i32 undef, i32 undef, i8 1, i32 4)
call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %agg.tmp.i1.sroa.0)
%cmp19.i = icmp eq i32 %add.i, 0
br i1 %cmp19.i, label %if.then20.i, label %_Z6CSMainDv3_j.exit, !dx.controlflow.hints !26
```
## Stack trace
```
* thread #1, queue = 'com.apple.main-thread', stop reason = hit program assert
frame #0: 0x00000001842b4388 libsystem_kernel.dylib`__pthread_kill + 8
frame #1: 0x00000001842ed88c libsystem_pthread.dylib`pthread_kill + 296
frame #2: 0x00000001841f6c60 libsystem_c.dylib`abort + 124
frame #3: 0x00000001841f5eec libsystem_c.dylib`__assert_rtn + 284
* frame #4: 0x0000000100102b54 clang-dxc`decltype(auto) llvm::cast<llvm::CallInst, llvm::Value>(Val=0x000000012f71f8f0) at Casting.h:578:3
frame #5: 0x00000001000fa650 clang-dxc`(anonymous namespace)::OpLowerer::cleanupHandleCasts(this=0x000000016fdf43d0) at DXILOpLowering.cpp:175:23
frame #6: 0x00000001000f9a8c clang-dxc`(anonymous namespace)::OpLowerer::lowerIntrinsics(this=0x000000016fdf43d0) at DXILOpLowering.cpp:806:7
frame #7: 0x0000000100103d44 clang-dxc`(anonymous namespace)::DXILOpLoweringLegacy::runOnModule(this=0x000000012f71d8e0, M=0x000000012f70e060) at DXILOpLowering.cpp:836:36
frame #8: 0x0000000101f643b0 clang-dxc`(anonymous namespace)::MPPassManager::runOnModule(this=0x000000012f725150, M=0x000000012f70e060) at LegacyPassManager.cpp:1521:27
frame #9: 0x0000000101f63f24 clang-dxc`llvm::legacy::PassManagerImpl::run(this=0x0000000138097a00, M=0x000000012f70e060) at LegacyPassManager.cpp:539:44
frame #10: 0x0000000101f6aa8c clang-dxc`llvm::legacy::PassManager::run(this=0x000000016fdf48c8, M=0x000000012f70e060) at LegacyPassManager.cpp:1648:14
frame #11: 0x0000000103b5eea0 clang-dxc`(anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline(this=0x000000016fdf4d40, Action=Backend_EmitAssembly, OS=llvm::raw_pwrite_stream @ 0x000000012f70dce0, DwoOS=nullptr) at BackendUtil.cpp:1244:19
frame #12: 0x0000000103b4f66c clang-dxc`(anonymous namespace)::EmitAssemblyHelper::emitAssembly(this=0x000000016fdf4d40, Action=Backend_EmitAssembly, OS=llvm::raw_pwrite_stream @ 0x000000012f70dce0, BC=0x000000012f70dee0) at BackendUtil.cpp:1268:3
frame #13: 0x0000000103b4eb88 clang-dxc`clang::emitBackendOutput(CI=0x000000012f624e30, CGOpts=0x000000012f82c418, TDesc=(Data = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64", Length = 78), M=0x000000012f70e060, Action=Backend_EmitAssembly, VFS=IntrusiveRefCntPtr<llvm::vfs::FileSystem> @ 0x000000016fdf5048, OS=nullptr, BC=0x000000012f70dee0) at BackendUtil.cpp:1433:13
frame #14: 0x00000001042ca204 clang-dxc`clang::BackendConsumer::HandleTranslationUnit(this=0x000000012f70dee0, C=0x000000013801c600) at CodeGenAction.cpp:316:3
frame #15: 0x0000000106af43cc clang-dxc`clang::ParseAST(S=0x000000013803d800, PrintStats=false, SkipFunctionBodies=false) at ParseAST.cpp:184:13
frame #16: 0x0000000104e43de8 clang-dxc`clang::ASTFrontendAction::ExecuteAction(this=0x000000012f62aaa0) at FrontendAction.cpp:1343:3
frame #17: 0x00000001042cfc78 clang-dxc`clang::CodeGenAction::ExecuteAction(this=0x000000012f62aaa0) at CodeGenAction.cpp:1111:30
frame #18: 0x0000000104e43660 clang-dxc`clang::FrontendAction::Execute(this=0x000000012f62aaa0) at FrontendAction.cpp:1225:3
frame #19: 0x0000000104d5acac clang-dxc`clang::CompilerInstance::ExecuteAction(this=0x000000012f624e30, Act=0x000000012f62aaa0) at CompilerInstance.cpp:1058:33
frame #20: 0x0000000104f80450 clang-dxc`clang::ExecuteCompilerInvocation(Clang=0x000000012f624e30) at ExecuteCompilerInvocation.cpp:300:25
frame #21: 0x0000000100013b20 clang-dxc`cc1_main(Argv=ArrayRef<const char *> @ 0x000000016fdf5f88, Argv0="/Users/farzonlotfi/Projects/llvm_debug_build/bin/clang-20", MainAddr=0x00000001000039e8) at cc1_main.cpp:294:15
frame #22: 0x0000000100005390 clang-dxc`ExecuteCC1Tool(ArgV=0x000000016fdf9778, ToolContext=0x000000016fdfe728) at driver.cpp:223:12
frame #23: 0x000000010001249c clang-dxc`clang_main(int, char**, llvm::ToolContext const&)::$_0::operator()(this=0x000000016fdfa2b8, ArgV=0x000000016fdf9778) const at driver.cpp:369:16
frame #24: 0x000000010001246c clang-dxc`int llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::callback_fn<clang_main(int, char**, llvm::ToolContext const&)::$_0>(callable=6171894456, params=0x000000016fdf9778) at STLFunctionalExtras.h:46:12
frame #25: 0x0000000104a63a18 clang-dxc`llvm::function_ref<int (llvm::SmallVectorImpl<char const*>&)>::operator()(this=0x000000016fdfa940, params=0x000000016fdf9778) const at STLFunctionalExtras.h:69:12
frame #26: 0x0000000104a639d8 clang-dxc`clang::driver::CC1Command::Execute(llvm::ArrayRef<std::__1::optional<llvm::StringRef>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*, bool*) const::$_0::operator()(this=0x000000016fdf96d8) const at Job.cpp:435:34
frame #27: 0x0000000104a639a4 clang-dxc`void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::__1::optional<llvm::StringRef>>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*, bool*) const::$_0>(callable=6171891416) at STLFunctionalExtras.h:46:12
frame #28: 0x00000001011718e4 clang-dxc`llvm::function_ref<void ()>::operator()(this=0x000000016fdf9678) const at STLFunctionalExtras.h:69:12
frame #29: 0x00000001030becfc clang-dxc`llvm::CrashRecoveryContext::RunSafely(this=0x000000016fdf9718, Fn=function_ref<void ()> @ 0x000000016fdf9678) at CrashRecoveryContext.cpp:426:3
frame #30: 0x0000000104a5fec8 clang-dxc`clang::driver::CC1Command::Execute(this=0x000000012f6250b0, Redirects=ArrayRef<std::__1::optional<llvm::StringRef> > @ 0x000000016fdf9760, ErrMsg="", ExecutionFailed=0x000000016fdf9c6f) const at Job.cpp:435:12
frame #31: 0x00000001049f57f4 clang-dxc`clang::driver::Compilation::ExecuteCommand(this=0x000000012f623bd0, C=0x000000012f6250b0, FailingCommand=0x000000016fdf9d88, LogOnly=false) const at Compilation.cpp:196:15
frame #32: 0x00000001049f5a80 clang-dxc`clang::driver::Compilation::ExecuteJobs(this=0x000000012f623bd0, Jobs=0x000000012f623c50, FailingCommands=0x000000016fdfa618, LogOnly=false) const at Compilation.cpp:251:19
frame #33: 0x0000000104a140a4 clang-dxc`clang::driver::Driver::ExecuteCompilation(this=0x000000016fdfa668, C=0x000000012f623bd0, FailingCommands=0x000000016fdfa618) at Driver.cpp:2225:5
frame #34: 0x0000000100004b0c clang-dxc`clang_main(Argc=16, Argv=0x000000016fdfee60, ToolContext=0x000000016fdfe728) at driver.cpp:407:21
frame #35: 0x000000010003f22c clang-dxc`main(argc=16, argv=0x000000016fdfee60) at clang-driver.cpp:17:10
frame #36: 0x0000000183f4eb4c dyld`start + 6000
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzse1lv4zjW9q9RbogIFKnNF7lw7Hg6g6qvCpV0f4O5MSiJsjklkxqKTpz59S-4SNbmbN3T79oodGyJPHzOc1ZSMmkatuOU3njRrRetr8hR7YW8KYn8l-DVVSaKlxsPYQ9hsGwaKpUHl14M7b9dkXlwaa8zwUFJWEULDy-Bh1LWEA-vHoWH7zyU_kYqDy2Ah2IPxcBDKCeN0vdf7H19k8jd8UC5AqIEjOfiUBPFsooC9VJTDwUeQh5aeGgFyiPPzYpGir7AKgpWpFGM7_y9vlIxTkGUpL4Hl9-lyGnTABwmCQSNEnVNC60IWgK1l5QUwEM40NP-eaRHCjy8Bh5KcnHwSV1X1D8Qxq_tUA8leqCWAiQljeBm-J4pUEuxk-QASMsUAACUkhyolh9qYuAJ2v8C_Q9lUQjyivDddXHKvRgWNK-stik5KqFZqaqng4eXHl46ys4XVqSq7rll4Hz1N1Id6Zl1vD6vicokKNMSGrZVjzC8jJLUw0tsQUdJBNpPMQCKHuqKKM3LSqPjWqNHoZftvm6kOOhF4RJESQKA8adbLgrW5EQWXrT2ojVg3NhlRk1ryVSLAR5atv6S3Hpwee3hO23Llth_o3PhW6vBQptOUnWU3NB0z0thV0Qr0ILU0g3lhVhZ-BaJkwJAlEIAvGTdfguM06VVVWQaEz3V0imrVdxR9WhJ0TLcyNaq9o5WMsTWPxO7yEpwRU_KXOtbOkYRDKEecr82Nx-J3FF1d1KPL_cW0cMxyyvSNGuiiBmCzOX_dzxooYRxWjy-NOZO0K01uNxbcAGDrAhTjdso3GUJo4nJIIa37AVUQvxkfAcEpy48jvU0r_yR0ZlJSn7WgnEFAt_o0oUlHIclLEkcwkFYaj_lgr8cxLEB2t2bmuTUWFrb5lv9RTxTSaWL04oSfqx_IbyoqHaMxkOp2rNmEItxWZQhLtpYXP_t_ouTo0Myr2sPL4Mk0kGZWv8JEgTcf51PBQnurqGNhzbgm9pT-cwaqnl4ph5KJAVqT0FDc8ELsDewAOOAgJow6YONkM9EFmZQGyYNILxolwhHS0h6EE9WqIdSK7eNYb-N1yCJ2mltntK-vqalsYgL0S6FmUDVZLlI-FZTqSGgFJqkfw6qIInPiWBNSzfhnivJeMPy-7ULeQ-v9UrdDRerp62kjTjKnG41CMeHTR7tConOIr_yjFSE57QwROnMoTOhkES-tDTm1rxoCDAFrSaS1hXJ6bKqfm1o8_-Z2g9AX9ByJnbuf4CcHBsdNl156Y80mUKPjshu56tD7bPAb6QgPvSh_3uuRcZelSAFUCaFGHpRcfJ_kOfbY1lSaQhYAYbNHxOq0JXqWukUNwWl75GK7ThI9UcPBSojRP9F4UUGXK6b0ZuVPuWFz0zzgW9BLWnRuEwRsdJXe8p9ZuzjoSgInQ9Wlf5anHxdBRr_B21-UOWXQQy8EBYnX9S-bJX8Ikihb-nygxEI8MICP0__pXWlaPv3L0HAeH1Udu527zOfBS1LhpFCw3XfDR0stdTpC8iWAIvWWoCelCS5etLl_SJqrZul303OBX_ymRFQ1rpO6KzYiBxwTjjgjJeAN_8CROY1ICUHe1KVblElQFkJYhoZfSX-E0gLDWlfGR_wFgx5eo0wDTT5EF_xhK_wU4QlA8LMpfTPY4ycBozB9zNmkC4-RFk6oSz-FGWLCWW0Uv6BcZ85RIY7M-JMVcY4kS9-qbON4QgbE7pRnQnP16Bvay710C2EtovCofMWsyI5-QyhD6wYTVaM37eiHt4cs5au5pi9xVa3Sg-pc4keW63sgj0tWuEFe3qfcHgKYbxZbzabO9eeuAUM0lY0p7tWMqe7j8EegkTwItVK7yWHZIdD8xoYgytW5_Ol68BHaUc_GtNfnDSN8Ssg3rI3gh9ajPHE5aTPuHMH93w18FFyeUlNuBRHXtAnXfRQeHHp42hlNF3ZYB-vcDhWrSccjtW7PeFsp64wzWIOsM8Q_ixqA26MmBRF0KV1UhQf8t4RsF7wDWge-hcKPu1eDuy7fKwzU7_YfMrDUPBeB9OmC9Iu4yvRsLHTBKlO7bohbEM-OLeRrk80rWEIdRFD4qi6ZuncGobj1tBuQ42OT4IVerpuAP2KlVSxA_UbRaTya71jY3FoBeh1uOD8aMvwTCtqE1OjhKRte2bZeE_3Oki8toZUzV5O-jzkzCXpwWfWu5t9NRmGB0FmY5fwoh1nZxt553qyb8NRC-THZ1vfo8h5qpXklv8fsT2wLoXm26u2P3K-UZz8dsPnnzd8frMdTWh81Qe9ZRhtgy3U-nxQsX8Lzef-tp8aZ5o04yjzbSXrMsCrbSXq71OcX19sI8NeG-lKzVttZBtieNBGNvsK9dzYDWpzzcSV9beTkG7GSXQBh8K2eTECuwqgt4fjaDICzsPPo09C4qloI8MN7_lh9L_QDwc5eORrDzqR9p0thK84W_SWs3WmwucNsy675RtfZpz0lcpBefG5uqGd9FAHbdfN8kMN6D8ned36eSYBC3pTzNE9yWjVO6dAcHR9-_d49fCVML5-wtt_-PTElEuKxcnPBVdSVGUlnv0946oxSTKeP0N5UCT_CXR00smAP_NZyOjQNQ1RFuI0BRXLmpdG0cP2J5WcVn7xUrHMi-F2W9sltz-ZMcetq7w9ocFEKC3SNO8JdTI6qROZaBGPpaKx1KCM8xj2pOadPJIJqYygtkz1BOGpoIjSfFbQdmt520rFLbC0TTfL_5ZPlM6go7nz9ui_0nk7mmCOp5gXJM1_B-ZKf-lOpj8NOIUaWjLGm0wdAxdh-BG8w-W-0B3JX-wdeeTf-FdRHCs6B1t7RJFSk7q_ju9ACuPXFTJc40kUpiONgjIOcfYhr_n6_Ttpmq-Ek11rhbdVQVEQva2KpacnvvUnvY3ASzQx0GKqDi7R0EDn-Kt67PcWuT_UVafHHH6cwkVC4OfxRwZoOEllwfihWVDGZBwQb-J_Fbvx_jRPP899HGqnCabgR3UC4iyilHzIl-4OTC2bhh6y6uUXWtWtMj-OfCUKuqP8O6tpxfisXxndCtsULc2LDB5e35L8J-XFti9aD_j24OH1mUtJnrf1s2SKbhslKTnoTgYM2SlyG37rZ2Fm6w6mVtIR5hb6VbGqpQqFupS487k-VWhCVVjG8YcS3yWq6EDP_zySblcT7yooha-QFc_WtQBPuaJZmg64Mp_P-jvp38zhh4fS1f0IS4xCig3M1V--1WqcnlKUh_Yw_nFNm9zDaw-l3dN8DyF6rRmh1xq46WQwumaB-6vVSK9ZEJtouWbdgFh7Qxxel-2tsr1Vtre4ia24FRuHbgvyhfKd2pvlk9Tt8S-F7zvs-ttGG1bXyWPDnugPWq64-q7koGl5Khv7YcMq-mBaKQ_fjUyu3SmCYdp5SxcUn3CB0DRzwdQHxh1ZiHKCYHjJB5zoleDN8dAGhu1jHiXhTUU0P79ypi6UJ4dzBVbjxB_kMey6MlHQv1Bu2XY6YGu8iQbj9iwmZYjz_JIG34ls6PLh0UPpwxgCLlJbe75LxtWDIsZ_S1LZdxMefrJ6417kuhUFo727BnYru2U9DedJH3dnIQ1xQS8G3vLhcSMFV5QXrf-ZPHWi-VFRd2mW7hgRQlpShzJajDjEs7SOO7IQ5WWeXMQ4sNjn8M0ZPQhM8cNwgm_cX2kO4xhewvcKgZ-mDqFolrpxrxQWEcnJRY9ciUPNKt1cN4rwnH6AvTbXLnP1OrPDFVoFYGQKw0QDNO6WwjKFYXSRXIf1vMyTyInDvbLDZoEbcBcnt3EPNRoUTUCOuyIdwxkagcyDrd7-eyhdyt2Th9dLKcnLD1p6eJUL3iiQ74l078bNZeAyNRlYz4amXCEPbX5tqGw8tHFvnQpVMg9tvkvxD5rrzdxG5_ptQbPjbpsdWVV4aJNpFBsLDkFXfb4SxpdFIQcE6f_hBU0dQa0Ojg-0MFllyse49YEQRngx5KMlexU8ClFZVn6bdDGLJLE1WoiqfYNlPIYmqAVYSPbUdbEImUqDJvDG3Yb2hHAxExWtwRg3u3ptH20e_a-_x--BA8aS5oUo18N5KNxC-1HUVBIlpHtL8ULjRlDW2vkSHwu7zERjHC9sazHWeHLaoTUe9aKMq55O7WvCW2kcVN8cvFP5cCBV9RvNlXB7qZXxXqe-eb3TkXDXnpdUVUbyn9uS68F_ML13Hkr1CiSrqIfXcZAE6SIMI_OwriaSHKZEt1wSBR4ev7TllFR3JyVJY85hwnjeg8aVPiQxJkF6YQ_3h3P5Tkda2B3AG-p3rnSJBOtUUxImvQOJ8aK4WJetp7pCswpW4nAgvBjXvzMrvfTYKDduuw1aBizMQTP7oCTjOzPlzpC2AtOZGWlYrrc2TANbWaebG6jvbJUkTLdedtwlmaSqdKUQsjdQjzWOnJn0tuyo_mRaWMTF0Fx_FZkL-9AcDNpnzGfzTNombR4y7KfNcf5FR7WH_RbVK2H8f-a9aN7ZtBSEQfzJvDM5ytMC6aWzr3eY872-9ztTxbgPxTCjeXnpzGslSbP_QXPxROVLV_XdGdEDKenlU49FYvf0G70zflX_mQ6rVVP3qTMQ2mhDs7u_ycvwIYlKmv_OdDjba0cwM4n9By2YNG3eoJn8RDiBC4Qk9qzhTsqvza7tOU27aCEywTfuh0tjQ-Rx-Wq6mnrJ-CEUDBdllJQXTwAGDJqenUx2VC2tF5jEWTFzBNDnWKvH-K4zz1jNwjblX8TuG69e-rvwTvMetna7s4hnG-fxAzPDAEkv7nbew8BfRTb7iKSvvhkzuZlHMwzMtBlx8AkKUBTMHpuOH_XBkAQhJO9ygnXv82AvRy7tXC3-OJ33gZae9zFgH8wMNyCmUZyaedqOwzCDr2xAlnKXe3ht37d228fRJojaUP3MRimEuldwL4j1cU6fN-ISoSFOh5D0EZLLCO0-0s7vYzCnPMHkcGX8-DDFZUizMAfFS1V4MTTvrJmnvDGEsP9c_qq4wcUCL8gVvQmSMEqTOIjDq_1NkWVhEcc4ysMgy5MkQISURRCEpCxhHqVX7AZBFMEQpSjAMQx9lJZlFtEygBTSPEBeCOmBsMo3b0EIubtiTXOkNwFOkiC6Mu8eNOZXoQhl9phSe6fJ1X_T-TNaX8kbPfk6O-4aL4QVa1RzFqeYqszPSts50Rq8-eB2-NO8nDQKKPnC-A4o4b6K4Q_Zuh8XXR1ldbNXqjaHweaHSjum9sfMz8XBnSG4P9e1PVrw0MYo3Xho4_R-ukH_EQAA__-RWBOG">