<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/63162>63162</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[M68k] Backend error "Unsupported asm expression. Only absolute address can be placed here." when using TLS
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
glaubitz
</td>
</tr>
</table>
<pre>
I have been testing the new TLS code and was able to trigger a bug when compiling the following sample code:
```c++
#include <thread>
#include <future>
#include <iostream>
int main(){
auto future = std::async(std::launch::async, [](){
std::cout << "I'm a thread" << std::endl;
});
future.get();
return 0;
}
```
In order to be able to build the code with the 68020 baseline, I used the following workaround:
```diff
diff --git a/llvm/lib/Target/M68k/M68kExpandPseudo.cpp b/llvm/lib/Target/M68k/M68kExpandPseudo.cpp
index 2f60fc834a18..c6e1a146f6a2 100644
--- a/llvm/lib/Target/M68k/M68kExpandPseudo.cpp
+++ b/llvm/lib/Target/M68k/M68kExpandPseudo.cpp
@@ -260,7 +260,7 @@ bool M68kExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
MIB = BuildMI(MBB, MBBI, DL, TII->get(M68k::RTS));
} else if (isUInt<16>(StackAdj)) {
- if (STI->atLeastM68020()) {
+ if (STI->atLeastM68020() && false) {
llvm_unreachable("RTD is not implemented");
} else {
// Copy PC from stack to a free address(A0 or A1) register
```
Then I get:
```
glaubitz@node54:/data/home/glaubitz> /data/home/glaubitz/llvm-project/stage1.install/bin/clang -target m68k-linux-gnu future.cc -o future.o -m68020 -I /data/home/glaubitz/sid-m68k-sbuild/usr/m68k-linux-gnu/include/c++/12/m68k-linux-gnu/ -I /data/home/glaubitz/sid-m68k-sbuild/usr/m68k-linux-gnu/include/ -I /data/home/glaubitz/sid-m68k-sbuild/usr/include/c++/12/ -I /data/home/glaubitz/sid-m68k-sbuild/usr/include/m68k-linux-gnu/c++/12/ -c
fatal error: error in backend: Unsupported asm expression. Only absolute address can be placed here.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: /data/home/glaubitz/llvm-project/stage1.install/bin/clang -target m68k-linux-gnu future.cc -o future.o -m68020 -I /data/home/glaubitz/sid-m68k-sbuild/usr/m68k-linux-gnu/include/c++/12/m68k-linux-gnu/ -I /data/home/glaubitz/sid-m68k-sbuild/usr/m68k-linux-gnu/include/ -I /data/home/glaubitz/sid-m68k-sbuild/usr/include/c++/12/ -I /data/home/glaubitz/sid-m68k-sbuild/usr/include/m68k-linux-gnu/c++/12/ -c
1. <eof> parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'future.cc'.
4. Running pass 'M68k Assembly Printer' on function '@_ZNSt9once_flag18_Prepare_executionC2IZSt9call_onceIMNSt13__future_base13_State_baseV2EFvPSt8functionIFSt10unique_ptrINS3_12_Result_baseENS7_8_DeleterEEvEEPbEJPS4_SC_SD_EEvRS_OT_DpOT0_EUlvE_EERSI_'
#0 0x0000000001e508d7 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1e508d7)
#1 0x0000000001e4e5bc llvm::sys::CleanupOnSignal(unsigned long) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1e4e5bc)
#2 0x0000000001dadc66 llvm::CrashRecoveryContext::HandleExit(int) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1dadc66)
#3 0x0000000001e4555e llvm::sys::Process::Exit(int, bool) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1e4555e)
#4 0x0000000000bdeb76 LLVMErrorHandler(void*, char const*, bool) cc1_main.cpp:0:0
#5 0x0000000001db681c llvm::report_fatal_error(llvm::Twine const&, bool) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1db681c)
#6 0x0000000001db6998 (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1db6998)
#7 0x0000000000feb2b9 (anonymous namespace)::M68kMCCodeEmitter::getMachineOpValue(llvm::MCInst const&, llvm::MCOperand const&, unsigned int, llvm::APInt&, llvm::SmallVectorImpl<llvm::MCFixup>&, llvm::MCSubtargetInfo const&) const (.isra.25) M68kMCCodeEmitter.cpp:0:0
#8 0x0000000000fed931 (anonymous namespace)::M68kMCCodeEmitter::getBinaryCodeForInstr(llvm::MCInst const&, llvm::SmallVectorImpl<llvm::MCFixup>&, llvm::APInt&, llvm::APInt&, llvm::MCSubtargetInfo const&) const (.isra.65) M68kMCCodeEmitter.cpp:0:0
#9 0x0000000000ffe377 (anonymous namespace)::M68kMCCodeEmitter::encodeInstruction(llvm::MCInst const&, llvm::SmallVectorImpl<char>&, llvm::SmallVectorImpl<llvm::MCFixup>&, llvm::MCSubtargetInfo const&) const M68kMCCodeEmitter.cpp:0:0
#10 0x0000000001b5428f llvm::MCELFStreamer::emitInstToData(llvm::MCInst const&, llvm::MCSubtargetInfo const&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1b5428f)
#11 0x0000000001b74a00 llvm::MCObjectStreamer::emitInstructionImpl(llvm::MCInst const&, llvm::MCSubtargetInfo const&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1b74a00)
#12 0x0000000001b74c72 llvm::MCObjectStreamer::emitInstruction(llvm::MCInst const&, llvm::MCSubtargetInfo const&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1b74c72)
#13 0x0000000000f97c42 llvm::M68kAsmPrinter::emitInstruction(llvm::MachineInstr const*) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0xf97c42)
#14 0x00000000029c7d0f llvm::AsmPrinter::emitFunctionBody() (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x29c7d0f)
#15 0x0000000000f97a74 llvm::M68kAsmPrinter::runOnMachineFunction(llvm::MachineFunction&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0xf97a74)
#16 0x00000000013a6080 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.72) MachineFunctionPass.cpp:0:0
#17 0x000000000195c373 llvm::FPPassManager::runOnFunction(llvm::Function&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x195c373)
#18 0x000000000195c689 llvm::FPPassManager::runOnModule(llvm::Module&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x195c689)
#19 0x000000000195d458 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x195d458)
#20 0x0000000002074015 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x2074015)
#21 0x0000000002e0e3bf clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x2e0e3bf)
#22 0x0000000003de2239 clang::ParseAST(clang::Sema&, bool, bool) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x3de2239)
#23 0x0000000002e0cca8 clang::CodeGenAction::ExecuteAction() (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x2e0cca8)
#24 0x000000000279fa59 clang::FrontendAction::Execute() (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x279fa59)
#25 0x000000000273665a clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x273665a)
#26 0x000000000286e9ff clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x286e9ff)
#27 0x0000000000bdfef2 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0xbdfef2)
#28 0x0000000000bdb5ef ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#29 0x00000000025bbff9 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#30 0x0000000001dadb15 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x1dadb15)
#31 0x00000000025beb26 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x25beb26)
#32 0x000000000258cb73 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x258cb73)
#33 0x000000000258d713 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x258d713)
#34 0x0000000002595fb6 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0x2595fb6)
#35 0x0000000000bde2f2 clang_main(int, char**, llvm::ToolContext const&) (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0xbde2f2)
#36 0x0000000000b51341 main (/data/home/glaubitz/llvm-project/stage1.install/bin/clang+0xb51341)
#37 0x00007fb11476029d __libc_start_main (/lib64/libc.so.6+0x3529d)
#38 0x0000000000bd5aca _start /home/abuild/rpmbuild/BUILD/glibc-2.31/csu/../sysdeps/x86_64/start.S:122:0
clang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 17.0.0 (https://github.com/llvm/llvm-project.git abe6ecd7e5f5bc4e57fb6b530e3ea4811d06e4b9)
Target: m68k-unknown-linux-gnu
Thread model: posix
InstalledDir: /data/home/glaubitz/llvm-project/stage1.install/bin
clang: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/future-7a398f.cpp
clang: note: diagnostic msg: /tmp/future-7a398f.sh
clang: note: diagnostic msg:
********************
glaubitz@node54:/data/home/glaubitz>
```
This can be easily worked around by disabling the corresponding check in the backend code:
```diff
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCCodeEmitter.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCCodeEmitter.cpp
index d4fc0510f944..425015206e16 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCCodeEmitter.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCCodeEmitter.cpp
@@ -190,9 +190,9 @@ void M68kMCCodeEmitter::getMachineOpValue(const MCInst &MI, const MCOperand &Op,
} else if (Op.isExpr()) {
// Absolute address
int64_t Addr;
- if (!Op.getExpr()->evaluateAsAbsolute(Addr))
- report_fatal_error("Unsupported asm expression. Only absolute address "
- "can be placed here.");
+ // if (!Op.getExpr()->evaluateAsAbsolute(Addr))
+ // report_fatal_error("Unsupported asm expression. Only absolute address "
+ // "can be placed here.");
Value |= static_cast<uint64_t>(Addr);
} else {
llvm_unreachable("Unsupported operand type");
```
After that, I can successfully compile the sample code from `future.cc`. Maybe we can just drop the check?
CC @mshockwave @0x59616e
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW91S67iyfhpzo0rKluOfXHARQjKTKRgokjWnat-4ZLudaLBlH0kGcp7-lCQ7sUKYBQxM7aq9V7Eg0U_r61aruyW1iBB0ywAuneDKCa4vSCt3Nb_clqRNqfy_i7TO95crtCNPgFIAhiQISdkWyR0gBs9oc7NGWZ0DIixHz0QgkpaAZI0kp9stcERQ2m7R8w4YyuqqoWXfu6jLsn5W3wSpmhI0GcefOe614_a_Q9f8ZA6-Uj-mFPuUZWWbA3L8udxxILnjL85VFq1sObxRSWshOZDqWK1_UyZRRShzcOzgqRN1oyJEWlkjQxE5_jUSMld4_RkRe5Y5OD4UlKRl2c6qnCMj4ldU0ZFOVrdSAXP8OXIwXjk4qhBBHYcY93WHDsDy0vEPpJzoWtHuC_piA3m8BdkNftqAg2w5Q-6xIro-mYBhhxVDNc-Bq2lO4TDjaUvLXE-tVohnKnf6Wxi72EUpEVBSBkoSK9QKyE-04Lnmj4TXLcvfUoKcFoUpUp_QaLSlEhEHL8vyqVJ_aOrg5YZwzenyNowfuz-Ll4aw_F5Am9fjrGlQ-plevXrk8IJwEbpFFvsT4sXjcRaCR7xJWIQEI891w8nENB6NRp9D2Ovrlfn5O4CdietMXDTCoevgeYQcfHX4aKrSui7RKQGjYabkduXg-JZkO8rgigiaXZV19ogcHN5eXTl4ftRlhNDt6kovjyulD6anboRur65W6u_1jfq9Wa1Gjr8wWqmZ0AM-bNZKRQdaqok60TWCUgCiBXJwTMWPFZOOP_dCtXpxvJYke5zlf5q-6Li-unkw0Ezn9UaPTOQNECFvtX52K2PYVYn9Zx2UCBwcooKUAuyB-39q1pKWcSDZTi0V3RE_bK4RFYjVElFl_SpgEtQaf8X5gPfXxB28dPASzetmj-7nqOB1hYQShVqQBBUcAJE85yCEg-OZi2qOZp4CymFLhQT-F-t8o4z2CqkZemNFmq-9t3AmLqtzCCaqOV7mRCrV39UVOHh5aOQv0NuVRslHDa__hExpt5BkC96YMiFJWTp4mSrDvMxKwrZoJPUiQFUYP45KytqX0Za1vb3LMjTq7fW4RqPKGKLR6i_HFzQfaXpC2zMHL1vBHby0x3DwsnMkCky_TJcePtfyG4b8LMk3Qf99gq_QvhohM-pSEElKBJzX3PFn5gOiDKUkewRt_dEPJtqmqbmEHBFRIXhplArTmo3RHSv3iKSiLlt5UG6UEaZ8UVOSDHK0Aw5jM9r9zWK2XiDRppXyFjoa4aBoqyWyk7IRRl0Vv1Tu2nSc1dXA2tr6SIVoQSh2VMDTBxPa6XEidpoJyUmm_VzDoeF1BkJ5O1G33BSrnkSIOqNEMchbhkTGaSM7yNqWobytmsO6c8fontdbTipE-LZV1kLB_u9K-o9eSd648wL-HOpCWdaGcKGCbomA5aguUEFLMI1x13iugrMtMOBE0pqZSn-MHlrGVBzWECGQg6NlyzLVAN2rglvCyBa4gyNUM1TVeVuCanXQEAdHnfpOXtNS7h3NhIAqLffonlMmD7SKfhwHR87ETf71-1pOa5ZBUpRk68XJPYeGcEjgBbJWtZzj1b_WcpqRskxUw9Xt72vp-UliwCQq1PT8ZC2JNF_-wIvl0_1axv1Yq-Vaem7L6P-2kDSSr35f-4mHkwcQbSl1n8Xv6yiJk2soQQJfLJ4Wi_t08dv9epKs58n6Olksnh7Wyd0muW7uNm6y-FE-LZLF4mG9ShQnXfSBfRe5L27_z4PAjfNIBwUm3hF7YT5oqeilvzH2Iz424uQ56TcrKuCYI8qkCT_iLzIBDr5yXzp4KgY54Pds_BMI0uwc_nkJhLXNHVvTLSOlg-OW6c1ljspa0f8GtBqMhRZbaHOSZ2E4QDtXRvoBsvoJ-H5eMwkv0tT8SlhewuKFqnD0m6Rr4Fh4_RPpBkEA57VD-5E-KD-inOvo_Xukq8BYaCdDtG6aQxqF6Obmj9uFcuJGhNzB8VNNcwfPFLpsRzjKaiZkV9DDzTIvUdtsvVHxZ67-fxgpsOcxDWNvqHXGgyc6lEhMKDFcL5tnyqAfNfxOIRlklpDCU-jTafwd406nsTVuZE1OASlONb-E1Wxf1a1AjFQgGm1cpkZQyjDfzpVLWFRUKqOsi7cgu93eXfMHKVvbGt3OV0xIS7zDyrsGuApxhvUHU9Dp7LH97F5t5E6prCtSln9AJmu-qprS8efDEZb0pW30vu_V4Os2NaHMihX1AMLUfFbyGFPByRgHqvAV_-e1MT4RbT71vc-L9ooyoqxPDsuaK1Hy94v3k4I5L-XzpR8QYvgRIU5tIRbgR9EnhQgsq3PQomu1Q_87AlQW6pzMvk0H3yEv5XftwCENJjgurHEWN8u1jgkOYqmoVKxv6mttaN6_Zt-G_NWGy_BxMFyKUTvCSKMJcV3boqSK_HleOwXQM_TvybDmx2IYnzKcRfijDP_bMptF2GLWt5f9NMomFrNh_DgTVb8n-Dmrxi_p6kFc8eWsGKAWJ1b0g6dZlLvDBXmOi34TdVXn-8OJ4Zfi7HBYQINTkZNo8hOR85bdsU62Pehzcj_WfYf-GKgWL3Y05ZPQjS3jYMNSe9UBQ2c5ec3CuCFcjrXeojMEz5tnK9zypkHmR_4A2PJede23zR-G9KWr0oCzxBqfog_j6TvQ3-qNv60YXdF3IQ_jqYV8eoI8nwTxAHkJW5Ltu03TkQfjwTs-_kn8Ct4QP7bcOnajiesFyHQxm7uKyitzFHrXyqZVO71B9TUlW1YLSTOxYFt9oabt_aDJr0By4GsgPNvdNUqvhOUaBk1VEPILsJ-0MndNP2l0Q9j2XJNBQCU5ZdsHKE78UzcBsxOCnRBm3coYdlkxyVtBn-ABijmT95Jb0dlT0RmBJS1hvRcS9B0vHtycHs9-rJ6cPCfNM6cSkv64ZdAph4K0pUxyfSj0k47-Qo_59QbfqIylU1YEhcEFPy3OiHJeM9EeAgqzXd9wwkSpjwJ_MHqibLP1pj8k-Zb10UG1eLGCIz8HrHYOA0z3hAuYrTc20jVUxNrqf9uWv4NkYfZP5J9lJD6zzDpV7s5wIGsl9Nr9LaGBAWIhtWOYaFqQwJLukqv5Pqy6IdRvAmkwWCADG6QfhgGxxVk1tAS9dyYsg_MSfZur79Flg9NixApecBzCtLDWZQf5yM9TnZHX8F_x-y0Rb4fPYiA6OfAroMCHkzvLjc44J3tl282G-hiaG8P76hjwcET45XwYlBYb8QkbaQAF6oU_9zbaUsQ_OySweTpxbopGZyutHVbO6dMbO3xshTI4SNOimGrBDOj2VxYJ17LVtX0az6JLGyJlmZLsMSmYQnrUGzN2p0Nzb15XFWH56aI-O4cHn1drl07s44-jJ--83MBJJkn28uJ55ktKBM2UR6QKkzlqGTZWBYnkhEoxPIkZtCBlqdZEzQf1qsngLHl2OFoxXRwclaRKc-Lg6CgqHPfXEL_V6dn5OLmqyUmeesG7Lg8eWrYmBZR7S5x_PXXfc7-Q2pGBfXuDgxRSHKL_ZBX5cqtpZGoJHdtCj7M08t8Uurbt5JW37WfCcgQnHavTY_b3NZ2d3Il8k1w025Zc_BO55JH3Ybn8VqfibaH8Vqc39ANnvwcdaghV6tNdT7xXjp2i_SPSVMKypGmHcsE0KNI3l_b14LMVdJyJNt6ahX9Qml8f2xjxWPILTi8zsYptVJc-uunxa5M06wzKz13-l8czCpkFPbShB54_8XTO8pePrUlbY_chYVSknjeJQhdPc5QkJU2VFSdcJgMgJU3DifmbjUU9Ds0WKsDT3CJ6GqAFJCPIkENHRkifMcObqv949WN1c62ZpGk2wmPfUwyI1sHL8VixuBc5NMLBy5c4TDQYTXa8dvyZh_ExAujV9JiaZnKjim7zgLJOYQtCS8hNgjO8UGnynSNX8dwKQKMnJGskABAdBPTTwSjoCbigNUNeNHbHuuPHMtHGOvU5hRCyPIKgCNJsAkFUpGEa-C74QCax5-VuCJP0uLfqcob9mcnzatkjq5_ZINWoS_vkQHJU1TmUqm1TC_rSZ35rRYH8mvKvSD-z5c5qqbZyKD8ccaFK6JpeUf7GzyB9tUsJnG02s_mvaPPrAi3vbm7u_mf1-y9oubpZrNHmThdf_fgFPSzu7x42Tp-Id38upS8Watm_mdZ3aMAB6UgFckSOObXv4R8vZdU4eGkynEYR8adxcUzx_jwJsfvoJHzRVHw0afgv85TpIQEUiKDlXj8mUFLW7wlQukc5FSQ9vD3Jas5BNDXLVUm2g-wRUaaruizUv3yN8smHCHNTcg0i60pf3QK_I8__HVSGDxXySZG5gecW08lkPJ7gwPUC7IbghZ94qPDusT_ycOH9RLuHDN7UdfBc-dmrw0dTpbdYH8hp6e7jze2pg8Nb_T6hL-0TWRwc3jXDVw4njxHumjEVi5eGn3lEMMzSn50kLQ9aUCbDSSLRLM_5If1_dHyy4GDvrhlvQR6HGTn-Ap5I2RIJM9HTdnCsaeCj1R-hs9lSDsYfT7N2MLYeVJz552B8LhnbftmgNOMomL_Po03vG_i1B_g847qlVj_kRHPzioxImiUZEdLx522nCebEomdz0PvMY5DzL0yGzNadJst9A6czcc6izgoJHMkdkea5luJLtJlye0VblvvuKZ9JfB883zMPUJzQPaYFh-4Y3ZJ9CugZNJ0_WyFRzuvGWGJlex1_ORx9PlfruRK7Ont8Jk-gvrkvwTT0QrjIL_186k_JBVx6YRx6OJx6_sXuMnVzFSen-XQKRTBJ_TSCnMA0wz54k2B6QS-xi303dCM39gPPH08hSHHkBxMMU1AOaOJCRWg5VvIc13x7oZP9L0PfC_FFSVIohX4niTGDZ6QrlTCD6wt-qaOdtN0KZ-KWVEhxpCKpLPUDS23wgmvU3cZ0Lx8-pZfnFc08s2yFcmqbm_VFy8vLz79w0Hz_fwAAAP__x--qTg">