<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58475>58475</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Hitting assert when using `-funsafe-math-optimizations`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Saldivarcher
</td>
</tr>
</table>
<pre>
An assertion was hit when compiling the simple testcase below:
```
$ cat xxt.c
extern double pow(double __x, double __y);
int XXT_stats(int n) {
double test = pow(n, 1.5);
return 0;
}
$ clang -funsafe-math-optimizations -O2 -c xxt.c -o xxt.o
Attribute after last parameter!
%sqrt = tail call reassoc nsz arcp afn double @sqrt(double noundef %conv) #1
in function XXT_stats
fatal error: error in backend: Broken function found, compilation aborted!
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: clang -funsafe-math-optimizations -O2 -c xxt.c -o xxt.o
1. <eof> parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'xxt.c'.
4. Running pass 'Module Verifier' on function '@XXT_stats'
#0 0x000000000840f1f3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:22
#1 0x000000000840f2b6 PrintStackTraceSignalHandler(void*) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
#2 0x000000000840d0eb llvm::sys::RunSignalHandlers() /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/Signals.cpp:104:20
#3 0x000000000840eb1f llvm::sys::CleanupOnSignal(unsigned long) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/Unix/Signals.inc:361:31
#4 0x000000000832eef1 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:77:5
#5 0x000000000832f60b llvm::CrashRecoveryContext::HandleExit(int) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:450:3
#6 0x0000000008408b2f llvm::sys::Process::Exit(int, bool) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/Process.cpp:99:3
#7 0x00000000067002d3 ensureStackAddressSpace() /home/users/saldivar/workspace/random/llvm-project/clang/tools/driver/cc1_main.cpp:132:39
#8 0x0000000008336e87 llvm::report_fatal_error(llvm::Twine const&, bool) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/ErrorHandling.cpp:104:36
#9 0x0000000008336d98 llvm::report_fatal_error(llvm::StringRef, bool) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/ErrorHandling.cpp:86:68
#10 0x0000000007a54477 (anonymous namespace)::VerifierLegacyPass::runOnFunction(llvm::Function&) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/IR/Verifier.cpp:6322:12
#11 0x0000000007978b2b llvm::FPPassManager::runOnFunction(llvm::Function&) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1430:20
#12 0x0000000007978d9b llvm::FPPassManager::runOnModule(llvm::Module&) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1476:13
#13 0x00000000079791c2 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1545:20
#14 0x00000000079745c4 llvm::legacy::PassManagerImpl::run(llvm::Module&) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:535:13
#15 0x00000000079799e5 llvm::legacy::PassManager::run(llvm::Module&) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1673:1
#16 0x0000000009238961 (anonymous namespace)::EmitAssemblyHelper::RunCodegenPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&) /home/users/saldivar/workspace/random/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1055:3
#17 0x0000000009238b38 (anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) /home/users/saldivar/workspace/random/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1078:7
#18 0x0000000009239a6c clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) /home/users/saldivar/workspace/random/llvm-project/clang/lib/CodeGen/BackendUtil.cpp:1234:25
#19 0x000000000988df5a clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /home/users/saldivar/workspace/random/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:381:24
#20 0x000000000bb9d35d clang::ParseAST(clang::Sema&, bool, bool) /home/users/saldivar/workspace/random/llvm-project/clang/lib/Parse/ParseAST.cpp:203:14
#21 0x00000000096e6a23 clang::ASTFrontendAction::ExecuteAction() /home/users/saldivar/workspace/random/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1162:11
#22 0x000000000988a91f clang::CodeGenAction::ExecuteAction() /home/users/saldivar/workspace/random/llvm-project/clang/lib/CodeGen/CodeGenAction.cpp:1145:5
#23 0x00000000096e6379 clang::FrontendAction::Execute() /home/users/saldivar/workspace/random/llvm-project/clang/lib/Frontend/FrontendAction.cpp:1059:38
#24 0x0000000009620da2 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/users/saldivar/workspace/random/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:1043:42
#25 0x0000000009878cab clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/users/saldivar/workspace/random/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:266:38
#26 0x0000000006700b60 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/users/saldivar/workspace/random/llvm-project/clang/tools/driver/cc1_main.cpp:250:40
#27 0x00000000066f4121 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) /home/users/saldivar/workspace/random/llvm-project/clang/tools/driver/driver.cpp:316:20
#28 0x00000000094e7a6d clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()::operator()() const /home/users/saldivar/workspace/random/llvm-project/clang/lib/Driver/Job.cpp:428:32
#29 0x00000000094e7fd2 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) /ptmp/saldivar/workspace/random/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:46:40
#30 0x0000000007038552 llvm::function_ref<void ()>::operator()() const /ptmp/saldivar/workspace/random/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:62
#31 0x000000000832f5a1 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) /ptmp/saldivar/workspace/random/llvm-project/llvm/lib/Support/CrashRecoveryContext.cpp:434:10
#32 0x00000000094e7c58 clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const /home/users/saldivar/workspace/random/llvm-project/clang/lib/Driver/Job.cpp:428:7
#33 0x000000000948b13d clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const /home/users/saldivar/workspace/random/llvm-project/clang/lib/Driver/Compilation.cpp:200:22
#34 0x000000000948b469 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const /home/users/saldivar/workspace/random/llvm-project/clang/lib/Driver/Compilation.cpp:254:62
#35 0x000000000949cdb6 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) /home/users/saldivar/workspace/random/llvm-project/clang/lib/Driver/Driver.cpp:1826:28
#36 0x00000000066f5588 clang_main(int, char**) /home/users/saldivar/workspace/random/llvm-project/clang/tools/driver/driver.cpp:513:39
#37 0x000000000671d4d1 main /ptmp/saldivar/workspace/random/llvm-project/build_debug/tools/clang/tools/driver/clang-driver.cpp:11:63
#38 0x00007faa3337234d __libc_start_main (/lib64/libc.so.6+0x2534d)
#39 0x00000000066f2a2a _start /home/abuild/rpmbuild/BUILD/glibc-2.31/csu/../sysdeps/x86_64/start.S:122:0
clang-16: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 16.0.0 (https://github.com/llvm/llvm-project.git dd38f899803465dd2765d1601b3989df3bd53863)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/users/saldivar/.local/bin
clang-16: note: diagnostic msg:
********************
PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-16: note: diagnostic msg: /tmp/xxt-de7168.c
clang-16: note: diagnostic msg: /tmp/xxt-de7168.sh
clang-16: note: diagnostic msg:
********************
```
I was able to track down where the optimization of `pow`->`sqrt` takes place, `Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilderBase &B)`, is the method in question.
This is what the generation of the `sqrt` looks like in the method:
```c++
Sqrt = getSqrtCall(Base, Pow->getCalledFunction()->getAttributes(),
Pow->doesNotAccessMemory(), M, B, TLI);
```
Here is the error and the check that's failing:
```
Attribute after last parameter!
%sqrt = tail call reassoc nsz arcp afn double @sqrt(double noundef %conv4) #1
Function it's failing on:
```
```c++
bool Verifier::verifyAttributeCount(AttributeList Attrs, unsigned Params) {
// There shouldn't be more attribute sets than there are parameters plus the
// function and return value.
return Attrs.getNumAttrSets() <= Params + 2;
}
```
It kinda seems like the attributes of `pow` shouldn't be given to the `sqrt`. I made some changes locally, and the changes I made seem ok testing wise.
```diff
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 8f25e80a6c5a..c27ca32052dd 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -2099,6 +2099,7 @@ Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilderBase &B) {
Module *M = Pow->getModule();
bool AllowApprox = Pow->hasApproxFunc();
bool Ignored;
+ AttributeList Attrs; // Attributes are only meaningful on the original call
// Propagate the math semantics from the call to any created instructions.
IRBuilderBase::FastMathFlagGuard Guard(B);
@@ -2160,8 +2161,7 @@ Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilderBase &B) {
return nullptr;
ExpoF = &ExpoI;
- Sqrt = getSqrtCall(Base, Pow->getCalledFunction()->getAttributes(),
- Pow->doesNotAccessMemory(), M, B, TLI);
+ Sqrt = getSqrtCall(Base, Attrs, Pow->doesNotAccessMemory(), M, B, TLI);
if (!Sqrt)
return nullptr;
}
```
If this seems ok, I can submit a patch to phabricator.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW0tz2zgS_jXyBSUVCb4PPsiyNPGWPXZFyuzcVCAJSlxTJIcgbXl-_XYDfEeOncR2pmo3pcgUCAL9dTf6ATT9LHw6n6eECcGLMs5S8sgE2ccledzzlATZIY-TON2Rcs-JiA95wknJRRkwwYnPk-xxYswn2uVEm09srf6on9QkASvJ8VjOAtXEjyUvUhJmlQ_D5PAsdesf2-1xQhek_fU0od7EuKiHkt9xWpI__9xsRclKAU_i7xS6kYlT9yPN80ghmRiX9RwpDq3PrP6YhBS8rIAarZvGuezPJwEkDLBPoyoVLOLTAyv30ywv40P8N0NuCTK9pWQaKJRkmsmLTA0wL8si9quSExYBcJIwoCpnBTtw-DmhekPJhFrir0JRXLI4Ab4lCdAHQskCkoq_CSuCHEZpeTcxNXyi41-aVWnIIxwqyNIHyRZq6A3nCCAIpHg7DspbEStZQnhRZAUIUl0Q6O-z4J6nIbZdFBlcdiNEOBVyVCmH5ANhflaUPGxB3V0v5-slEZV_AF1ixK92ACiHTqTMyL4sc4GKQ1fw2cXlvvJnMBz8SJKH5s80L7L_8ABQrmIhKg5CXxGWhkBfkFQhlzoZFEzsJbllwQKOdOUwUZEFHFQ6JCKrCtWMT0qOxgwoJUWVEhEUcV7OFMnrEgYhYXXIW5XWZkT-uyuyHYgNxLCrDjwtkfaf0w29HnliLHgWTYwlKgYsQQIrBvhOsohEccJVZ1p3XmQAesdTXsgJ1E2jvvm5SlNcqDlgBNk7q0Zed9hww1K2Q6VzCDQdsrBCLaKOWp3UqXlgPjPYjXrgD17EUdwO06oE_AaN7C1Op1Zt0EGNaEet-eeaWqRHBpFSBi4bc_Ek1MVdAQtaymCjBOl2nQr2uM1ECSsCdMNGYUJfpeOrvASB0ZVgSRg_MCBt9ZgV9yKXY6wKkHp2QqEaNYt9-F5XOWomXH1J4yM2xLuUJWIGigazWzaYjTmlHSZ9jIn6NhkBUGN8gvkTZJj7kMWwPOYfRrVt2PCtd0TTEdGhxv1TggDZD2hHW_seVDfkBjkuOF0zkclaR68xopf7enSK3kXCWVrltzXVQC2sSLiENZ5k6e7DGG7YOn73OG4OEBiU80iHdpelWfp0yCpBUvAFNQ1ejQbt2WceZA-8eFpkaQlO8wrcrrqrRCL7KA-Ia-Hd4Z6iqRab4-AC6SBbI8iRrfWV7NRIfWTLY1w2wD4Uh2lpKLwOiD3SPtenJ7XvTnka9aNP_oL4WZa8B4x6yppyzxsS7vQJtx1No6EBLkVUBZfGaR6GBTy9VnM3K3ufHZCSSsj1_r2ESlcIf0tAjI-HRfyARm8VBPr2wOK0WeQGRWK9jlp3qC-GzV2nx2YVMmxllLJVUUrfL2we4xRCAPC1Ze0X3ovnS5xb6ii4xYHJAjPbovHGaELPfT2aNYSL6e4zjz4aiIuewnabsNfQBz7bYZZpOs5LhquJDa75jgVPGHTUoKv0Nm2CkQHertF-O6RXn-GroaXGZxsU9U6nHcKBB3c8B5Z3306t7hBAEzT9MhwdL2tSGs0zDa3nLREQHQMKvdcAUoHdAE7T9HFgHBmpGB0YYwTG0wP6kv7d_IMRWqY1Epc5QmhagdkTVyJHqj1MN14XCAC0XwrJMqyRzKyxzDxuvYzon4FGtx2jC5YRzcD9e-CnPPvF0G0Jqe4cks6Dnzx94kneoIOAGjM3SNzu4pyD3UVtVC5T3r9Qufa8NiILIspQ3anS-K-Kb_MSRloM06H8sYhLvm2Sot5DIY9YlZTbkCe85C88aCzxo3znS9NuwCXdVmVelStMTV855-ipbsI3jDuUiJHJv3Hg4Krm6JcyTlpfbVldnIQSdsYS9iEY-UEJ99v_cbL9YD47LqYFHZ_dEZ89ZgekxyHkXT2OUpMhAy9jtksh948DsUx3cu1IZe11-cRZyIs1Z0Wwv83V1ks_Jux1rUl_odeGFTtevtDpGq5OdXkmnvvauM1HA_7PqQokyOgVrU5XBvGz57phZLETLILUTVSHZvGpzHEDBAm1GQnZ-UiJ5utNk2y-s-Wpr5QQa6CGixsD1Gxx0kF87fteaFhhH-cd7gUC0UMUa35ggzRnkCW8JR45f_MX6KiBUE16yR6QQRjt2dxm1CBDxq8K5Hyr13WezIOq5I2qv20SqiA00_YuB0LRdVvmBJ3Pp3SkfczToxPG44OBfFu3dF2Glt0aosZYJIbj9VF8Qx6_SBKaJbcwuvyTmkMMVAsZHUoCTx4gHgazy1Kg5aQwngf9Lkagh3NMX7dhgAvI7PJQag11znED5g-8o8LUDfiQBexrfF8xpN1ofg-EG2l1Vs_S1pgL2x7J1R7vTfm2Rpo9okEGMC8K9oSu01gEe1Y0HnYu3RS4zUEbNAx31z9mN4vKPUOzy-rocO_NjkwdLGTDpoWu-Nbf8TmwJPkDZs3q1O4E2LdV1a8wqYvGU-n2ZJCn0mH0ZnKH2QNPVY-jlHChgy4cWBqOrcpJuXaNKoxiyaCxi57q4KQX22y3wfGo6-qHz0QcYCATI1GSg4PO2LAtCxbjsZ26PRoOhICai0eg7X3sMu9crNQsJRf5yIQ6CTv4IcOzLmk2VXuW4-Gc3NjDNmVQ5XNvvRgvGwn-K_ObTWyKsbfRMy_eWHxRSOVa6cWjzSnetpBikXcbSMuahcAhPGLdRimy6P_iPyX-JSJ9oxOY-oS7a5hfQjC4Wm-um81GliyPgErM9ih4e2iIhoeujma4lkW_T-TfVuSPBGejUtudUo9OXw0KSYL-qjMmPNlkEZc5-muZ8cHHUDIl0nuSpOMVHFju_7YB_jBD2m1iDM-iPdP1deN5N9iVxYxjOCmaQeA2ehA7PLfh8I2u89Hp1_vyqQewTQzlcURvjZpjhpm2970MA3mI57kFd69jQPnM3stXkVWrbDmLUc_qQ9rXMri_UfrL2GyZI1M4TB9MLwh9-zlIl73rQeh-Ip94TjwfyOY3z15axl72Q17dpTLm7bKU4dE_RPGW5dYmt8lTGlDS0s3fPe8YxOiWjjlkc4aO9I5O_PXQDHWClP645_KrOAm3IferPkHPJ0Z4YzogUzoHu9tvb0_6nYgxMKgONcyQbLcgG_QdrCi3Ncmukphtqr_BTGQz0IcL7UgteAb9cjuoNxIVZZQRNVxPHkzCQbj5obm8-HJ1fQl_dzjFlM4MHXGICr5nM2TYkwh5jiiPrr2VxMhhZ2sEJ8-Tay-twMvMqSukVMWBUZ0wY6mk1POIQaYckse43BN-jNF6hZw4GsIGrSHTByyPFJyTuJfpe72JCLBYYM2dbs-0mXzw-6opZ9CBhKHhRq7nuZph2lYYUge-dVvTfcNzvTAy_NAyXBBfM7faEkdkih3TKr1Ps8d0msRpdZzu0qruty84C7HAkONJJckzER_VLbk3kQD8y1iy6JvrZYYBAW4y-HH6NZvTDHe05yRsDwfIQezkoLVq_MSnVwJcV7HON5v54hPZfFqS1e319e2_r37_jayurpdrsrmVzRdffiOfl3e3nzcoB_XsqSpUV6CleLYSte1QcCIjIrjLynbIV7IAFqhc88djOQ25o9tuU4D94wOI_Q9I4a1kMSosV9okC9WZrPbOCNb-3pMQFBLr1gtVGtwvxsWCWhgB68FtbYo-xlYV1LZGSnbPBcmTunwYmv5gSYXlsfPr2F-Azq6x8F1VvtbJkRyZ38nycuxxpSKBuWxZkKvPF2hneHGBdfLgzy5wJQECLF0VkroDL_cZ1jKTvyoupJcf8G2zh47wedyzUj7QFf4iGGzpYUiy7F6QJL5Hy9Ebv9WdlokBmFL81LXn66bwHJY3XiMYwIR0I7GAB7kFNxdy7fYKYABRfastdBdNtrhohj_xrx4yzLj4PSvnAS6RG37Iiqf2aXKDXxf4tbm-GrwKcEoXPqHEa7aqCnZcYbI6fM9BL0pgISTqQprfWMUhp0b7hQX7ZlOxX-tAW70dDygnKkR-nhWnxYwBa1e8LVX4AX89tYgXQA5S1zbI2Bp_iUGJ6R1yQ4zeulCOh2zkyhP7rEpCUBCnJD6oYQZtrGWs4CXKiUkdxTvwv-UwLsJKinE0cltojnKt39t4wDU6G73MIQmegUr-Xh3wes3LtnzZWKC4FAAY-ILQE29-nDQ1JbmP05ChXz7UiwyVq0UlBtZlzIEdREWpNFKDJTsjVxCkgfcX4AQxlEx3MJB0e7hBsejpsLrVdAciSHYv33FBjXiMBR9ajhZEGEeRasIrMp2i62fjjQl5chplBYp1heez-Le2eE-1AZTFpsT_4Ueb91BCfiRuRC3uaswOLDabBdQJmEE1i4Yh0SGIM-vjxel0-hO0Nr7nQn1-mnRYv_AhU6p5aKBsVKD62iH1zffxGv2FRm6aFzfmN9L4dOa5LXMbvuQkc1UyT5LscZ5DPHLsP7ZnQjWitXnm0Stw7QUPu6UCzCSnrIRx0azWzh3I5Z2lyRN4I4YvlERVgi-OSO9cxLs4Zcp2NiW0zdT1SHdFlrMdhEHKozGImgWHQBqrQTC4PqgFgsYX1hdLn0gARhijphg4W1TSaIjWSAwZrISyAht_AwOvErb7rWJFSOQ3usCB32nkr0sn7kr567b-wfJX_2pjl1ZJImtChveXxzxbSTHDCPjjqutRLy3V8V1d__Sk7_95_4_q9wriW8_1U7PVFMeRSkv1tXTh3neI4wXPgnEcBC7KsWT3UglAn9PuxbmclcEetTvfM7-I5S7pjJzxc922bd1zHdM9C8-N0DM8dlbGZcLPP8Wl9AzqnU71ImclsAVj3-ffV4O7Z1WRnP_423mWazrW2f5c10zH9APGQ2pHJqyTwIfMnWuR4TmmSYOzhPk8EecTC7hOU_5I5BBwPbEuz-JzqlGqa7qn25anuTODRppuQcrqmMz0Ix0WG1iBOJkhHbOs2J0V55Ikv9oJuJmAVRLdTeADBi9cTgfjswoi4-J8XWebECMWZ3L-c0n_fwFklE3-">