<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62697>62697</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Assertion failure when passing class template parameter as part of function signature to concept in out-of-line definition of member function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          davidstone
      </td>
    </tr>
</table>

<pre>
    The following well-formed C++20 code:

```cpp
template<typename>
concept c = true;

template<typename T>
struct s {
        void f() requires c<void(T)>;
};

template<typename T>
void s<T>::f() requires c<void(T)> {
}
```

causes clang to crash with

```console
clang++: /root/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:2501: clang::TypeSourceInfo* clang::Sema::SubstType(clang::TypeSourceInfo*, const clang::MultiLevelTemplateArgumentList&, clang::SourceLocation, clang::DeclarationName, bool): Assertion `!CodeSynthesisContexts.empty() && "Cannot perform an instantiation without some context on the " "instantiation stack"' failed.
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: /opt/compiler-explorer/clang-assertions-trunk/bin/clang++ -gdwarf-4 -g -o /app/output.s -mllvm --x86-asm-syntax=intel -S --gcc-toolchain=/opt/compiler-explorer/gcc-snapshot -fcolor-diagnostics -fno-crash-diagnostics -std=c++20 <source>
1.      <source>:10:36: current parser token '{'
 #0 0x0000562176fe6fef llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3ba4fef)
 #1 0x0000562176fe4d2c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3ba2d2c)
 #2 0x0000562176f314d8 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
 #3 0x00007f025fbb6420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #4 0x00007f025f68300b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #5 0x00007f025f662859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #6 0x00007f025f662729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #7 0x00007f025f673fd6 (/lib/x86_64-linux-gnu/libc.so.6+0x33fd6)
 #8 0x000056217a24e273 clang::Sema::SubstType(clang::TypeSourceInfo*, clang::MultiLevelTemplateArgumentList const&, clang::SourceLocation, clang::DeclarationName, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6e0c273)
 #9 0x000056217a257c05 clang::Sema::SubstParmVarDecl(clang::ParmVarDecl*, clang::MultiLevelTemplateArgumentList const&, int, std::optional<unsigned int>, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6e15c05)
#10 0x000056217a258b70 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformFunctionTypeParams(clang::SourceLocation, llvm::ArrayRef<clang::ParmVarDecl*>, clang::QualType const*, clang::FunctionType::ExtParameterInfo const*, llvm::SmallVectorImpl<clang::QualType>&, llvm::SmallVectorImpl<clang::ParmVarDecl*>*, clang::Sema::ExtParameterInfoBuilder&, unsigned int*) SemaTemplateInstantiate.cpp:0:0
#11 0x000056217a25dde7 clang::QualType clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformFunctionProtoType<clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc)::'lambda'(clang::FunctionProtoType::ExceptionSpecInfo&, bool&)>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc, clang::CXXRecordDecl*, clang::Qualifiers, clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc)::'lambda'(clang::FunctionProtoType::ExceptionSpecInfo&, bool&)) (.constprop.0) SemaTemplateInstantiate.cpp:0:0
#12 0x000056217a23fd4d clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&, clang::TypeLoc) SemaTemplateInstantiate.cpp:0:0
#13 0x000056217a24583f clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformType(clang::TypeSourceInfo*) SemaTemplateInstantiate.cpp:0:0
#14 0x000056217a249dc8 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformTemplateArgument(clang::TemplateArgumentLoc const&, clang::TemplateArgumentLoc&, bool) SemaTemplateInstantiate.cpp:0:0
#15 0x000056217a24b648 bool clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformTemplateArguments<clang::TemplateArgumentLoc const*>(clang::TemplateArgumentLoc const*, clang::TemplateArgumentLoc const*, clang::TemplateArgumentListInfo&, bool) (.constprop.0) SemaTemplateInstantiate.cpp:0:0
#16 0x000056217a24bb7d clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformConceptSpecializationExpr(clang::ConceptSpecializationExpr*) SemaTemplateInstantiate.cpp:0:0
#17 0x000056217a22faf5 clang::TreeTransform<(anonymous namespace)::TemplateInstantiator>::TransformExpr(clang::Expr*) SemaTemplateInstantiate.cpp:0:0
#18 0x000056217a26db2c clang::Sema::SubstConstraintExpr(clang::Expr*, clang::MultiLevelTemplateArgumentList const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6e2bb2c)
#19 0x00005621799ab42f SubstituteConstraintExpression(clang::Sema&, clang::NamedDecl const*, clang::Expr const*) SemaConcept.cpp:0:0
#20 0x00005621799b366a clang::Sema::AreConstraintExpressionsEqual(clang::NamedDecl const*, clang::Expr const*, clang::NamedDecl const*, clang::Expr const*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x657166a)
#21 0x0000562179feadbb clang::Sema::IsOverload(clang::FunctionDecl*, clang::FunctionDecl*, bool, bool, bool) (.part.0) SemaOverload.cpp:0:0
#22 0x0000562179feb94f clang::Sema::CheckOverload(clang::Scope*, clang::FunctionDecl*, clang::LookupResult const&, clang::NamedDecl*&, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6ba994f)
#23 0x0000562179a8186d clang::Sema::CheckFunctionDeclaration(clang::Scope*, clang::FunctionDecl*, clang::LookupResult&, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x663f86d)
#24 0x0000562179a89853 clang::Sema::ActOnFunctionDeclarator(clang::Scope*, clang::Declarator&, clang::DeclContext*, clang::TypeSourceInfo*, clang::LookupResult&, llvm::MutableArrayRef<clang::TemplateParameterList*>, bool&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x6647853)
#25 0x0000562179a8d956 clang::Sema::HandleDeclarator(clang::Scope*, clang::Declarator&, llvm::MutableArrayRef<clang::TemplateParameterList*>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x664b956)
#26 0x0000562179a8e4e3 clang::Sema::ActOnStartOfFunctionDef(clang::Scope*, clang::Declarator&, llvm::MutableArrayRef<clang::TemplateParameterList*>, clang::Sema::SkipBodyInfo*, clang::Sema::FnBodyKind) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x664c4e3)
#27 0x00005621797296a2 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x62e76a2)
#28 0x0000562179818ab6 clang::Parser::ParseSingleDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x63d6ab6)
#29 0x000056217981e9f6 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (.part.0) ParseTemplate.cpp:0:0
#30 0x000056217981ec73 clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x63dcc73)
#31 0x00005621797589c0 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x63169c0)
#32 0x0000562179724423 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x62e2423)
#33 0x000056217972533d clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x62e333d)
#34 0x000056217971937a clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x62d737a)
#35 0x0000562178224a68 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x4de2a68)
#36 0x0000562177a7da89 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x463ba89)
#37 0x0000562177a01746 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x45bf746)
#38 0x0000562177b61ab7 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x471fab7)
#39 0x00005621744bed2c cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x107cd2c)
#40 0x00005621744ba94a ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#41 0x0000562177866acd 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
#42 0x0000562176f319c0 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x3aef9c0)
#43 0x000056217786738f clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#44 0x000056217782e92c clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x43ec92c)
#45 0x000056217782f3cd clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x43ed3cd)
#46 0x00005621778372bd clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x43f52bd)
#47 0x00005621744bcfe0 clang_main(int, char**, llvm::ToolContext const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x107afe0)
#48 0x00005621743c4555 main (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0xf82555)
#49 0x00007f025f664083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#50 0x00005621744b565e _start (/opt/compiler-explorer/clang-assertions-trunk/bin/clang+++0x107365e)
clang++: error: clang frontend command failed with exit code 134 (use -v to see invocation)
Compiler returned: 134
```

See it live: https://godbolt.org/z/fKK6EKrWq

The effect of this is that clang trunk cannot compile boost::beast in C++20 or C++23 mode. This began approximately two weeks ago.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsW0tz4ziS_jX0BSEHBfB58EEl27PV7d6qLTlm5uYAgaSENQWwAdCP-fUbIKkHKEptd0s1sbEb0e6yCSCR-WUi8eFFjRFLCXATxF-C-PaKNnal9A2nL4IbqyRcFYq_3zyuAJWqqtSrkEv0ClU1KZVeA0fzAH8J8BccIqY4BGQWhLdBuPl_Enb_sbruvlhY1xW1EJC5fa9B0jUE5K4rY0oyqC1iKCC3yOoGAvJlX9xIY_S4bW6sbphFBgXptlX-ogRHZYCzAOdIw--N0GAQC8jclQQ4ewxw7kRse0pvP9Vr24EJyLz9RGYBmX2guz0d09sBVvt9M9oYJ6CicomsQkxTs0Kvwq7GYVbSqAr6tq5R552AzFCA77VSNsD3VfWyntRa_Tcw92df774SRYDvF7Cm_T-PveFfpbFUWkEtXDtHkhmOw6mT2TVtjX58r2GhGs3gqyxVgL3CVmj3W1MY6-oGODvVOsBz5Kyx-2J-ayorHuAFqo1qM71s1iDtgzA2wEnbaq_bVuKDYtQKJQeFt8AqqtuS_3RRiOeoUKpq_TNDM2NAuzLkkMXTueKweJd2BUaYuZIW3qy5hnVt33tvt90nKMB4TqVUFtWg3RhBVCKxRdBJdO5TjUVGrcEZ6WQhJZFdgWvufvwGxlL2HGAc4BSVVFTArzsXf3-4my3ukGmKtbCIoqJZIg210tYFy8ra2jhj8X2A75fCrprimql1HwKHkSCMacAE-B5RyZGQrGo4tGp1cVdQ9mw1ZS1YtYZaKwbGAEemRdp9di2pMYq5cOFINxIZpkVte5UXzhbEm3W9zRXhdRDm37VaarpGtPeo6WNW1W2MqnUtKtATeKsrpUFv4nZCN44yE6sb-Rzg-0LIXVi78EeTJX-lupxEaLJEE-Xk0rp20htbN_baoMnaYYEmk7csmVCznph3aelbQG6FtFChyQJNJkvGJlapiq2okAG5Pameq2wkrc1KWTQpmaqUnnBBl1IZK5hBk1KqSQus_9lYHpBbts2rAZn38G5yztQB5n0ms2kYkBlJ2lHZaA3SoppqAxpZ9QwSBTh1OQennQgUYBKi8C0MwzBO8DRNSkhKKFEbGe0AMe-m--W7FtK2fnvsnJ_tKmn6-qSM1UDX_fgT0nbDITuT9wL8JXwjBY1KKN3o3Oo_HegfcczG9J9XQGVTf5MLsZS0CnDWyHbW46hSrpdLaIs5Zp622NeWTCOeoblz_w9g6gX0e6fef1DJK9dp1iPp1elTT5-Hw_Zn2wXpu0jLEMdlUSQRDtHTkwZjlYYnbXs7u0z_liVPSTSphGzeJkvZdAW1XWmg_Nqo67C1ZRpFOPQsibxukoyEYYE0FQY-IJ85yUkrOXINPcmxLznBWZwjWqgPab4nGbuGnuRkKDndev3DMlPsy0x9mSkpefI5mcQ18WRm-1FCcQQ4JWeYST86h3Zz7tlm0nOPqwRChlPiIZb7iMUpC-MTiH2nev13qp3OPnBewV9ArR21c9RmcddU1c4yWgVkvk07rg652wF1QcCmMQvjLWAua4YDwLIiDT0mpwEeNZXGsZeAzAOcUank-1o1Bjn2a-p2Fsj76gcsUektFd7KuW8kcwq78PxONV0bH_3DANsl8pnW9P0HlAGZH_dXB-de-X81tHK9bZwzdOm-Rt2XuzfbqgYWtBs8XsudOos1raq_A7NKf13Xla_VptdWn-QTDUfMGWq8i-Shpl8aUXEXH22PXpg5KTk6Tef3phEXINNBgHAO6TiyPylovmtlVYfq_Of3eZBeHxTzAR-Jqm3zB8W2GgQ4rei64NTRME_siKWdn92CWCi5qIF1-TzZZYukX7qeQUGvyvyf_3R0Q_PxXOjcL0oB2gwK_t8fLUFwOfy6TR21VrVjUZ8cf9gff6TkEb84zp-Hdofm58wjA4oTZ6T8N5k3IEqfNCQaGJJzll3ekAH_GBg1ZCeKHaN0I1W9aP4kGPEAjCKJslbST0fEDGaJ45DMDrPnqcp_iN-HqwpjD7LHX88bydAFRXr5vDHvNm1dQhS0Ev9q-dvdW619YE9U-_zAS31DcUnL-OKGHtr0Z9UfrPESXmB2YsUydyGhqZD2hAp_brVygfUGLoq9jQ9nrrdAy3NaRLhErWXCNhZ888CYlv9nQzwO8pdbarYM5dioc-L2yjon9XE46hgc-poWJEnouGNmelRvc_d7Qwfrys_q-ReNPLdD43SaJHTfodhbH-QlUF4U4zB9Nd9eQFeK8nF6NU4wR0r9ZbKfMmuq7S5bbjoc9zAeqF7kUTmu-nwF7Hlc-wVTjkx8QO290gelnpv6B5imOrrLsvV223w4N5zVrQXN86j03Orxspxm0yzhJ7DZN7ff_TkzTB4El4MiIWWWcA-KaABFnsVHduFmzH6TQyiU_hAS-9WHoeDK-r3eET7xB3t8IyDudiF-aywtKhjfVNnMF9vdhe5gbebtVl1k4kiiNIuJ54V44AWex8m4F7o9878K_zkwugQwRR4nHjDJABiI4FR4LizV9lu5i9Ly34fPkQ2txbOovyj-Ph7Pu3r30tX6VUh-GahZBH4MelQzT3GeUIz8bTsDeu_3PZSFFIdZ0VUScnlq7B_I5DtquduVPNXqoYPfAJ9Zu8X_AohhSBOKPcQ8dptn04wWyUnrFkIud4NXKDkrLeiNyT56O9i2yfFM0PU--TH7-vVb0Z2H_9EhyKgHWsRF0VgwhzVmjIEx7SKoFA7w83uE8IQWfrrIBx6BvDztkQ1mez75pv2l2-fccink9rifp_go-fPPux0OzD9bO8Bhz_42hwq5_Iewqz8Xmv9Looex1MuA_il7nsZZzsKPovazEfrjGsM-LpIVyTTJWeihiAfzSBTh07F392ZBS1odRfMcaOwlPhdWF5skcIT9oCIDOGJC-OmUpOp2Q-Pw3PZbTX9v4LvVPgtxFf-mlaPB5e4wbpRU_KZ4U8HXda20Xdh2YF-E4mIghHgLDeIvNNJpTlJ6gMNs8Xh0Q-TSiyPMU5J6y3_i0fIM44gm3rb3XHH4G8hZS4M2uxTAGgv9p819ubNqGnHANMk8TT2enNKU0yz3lqLa5SHJR1S9kJIJKWiWe0qmvpLhNI0SH86u225bkcE4osetukgsR3FRppFHM_yrK2mRTGmR-ltVrco7e162WTg7Ze9FklKUTktapJ4BHk-KogI4Zoix6dOaOhnZ-I2EFdX-ecIc-d_wHHWXfy9hxzRMGfc3XKNwYAfNI4o26M-nj22qyE7eSzgwarAAdDL6SdzbTuZavIAepV-RRyTSLEko4y0ye3LLfvX0pFtw29JuKG435BmtqoKy56dS-hm_67sPovl0rtZrKvlwVI86ceyyzh4-Vgu57OeRzsPbBk9P7O1tOu3-KKgR7Mm01XsUvcruw5PVVHRnVK54II5WlRsUSu-Vb6-CdDm-jaIO87bJ4BB7eydgc7XxF1WM--PgQqIjdjurx64ddiU_GrmgJVTvHpynXXeBO5YUygHLisggxFKSedu7_-dCZLBIOhoLkQ8chtw_kvKAa31HD6bMDZpeNh80dBWOrcJPVB3uhm9tO-uUQIDlg1QaD3ApCeOfxeUXVZjjoPyiioMrhKdS8zYOaipcCPTXDT-KYx8sPwVNTpjHdiOfj2UkxcVRNG_3fveYwwhlOOaFn4jm-QkKKWNc-Pilg4mdldAvxTcUZaN_m1ZmB1cXj03b5ycltAQ_NXvsMCIsiuMYOa3P3XmZ4Tj2brxG-eDydxRmBD09VaJwqZhq-7SnyEevgzsh-73EQ9oVJzGgTv4FACZJDNvu98vJDIHWbnron2Chsl8QINbHb_eGqH2HhOBN2PbpHpqSyOnZGECTF2QVMgBI7LH0vrMNQUcabKMluBHkGp94xrZwkiyqxItbvgwfJileqMpeK70M8P2_Anxf_vprcver_sfv-zIeV4CgLIFZpEpkV8IgYZBdUbt5HucgQ6x7fNWD7HLchigVQI1FQu49WVR6-wdBa8XhGj06wQUsqUS0rrV6E2tqoXpH9lWhV4Bng-hSXV_xG8JzktMruJkmWRROQxySq9UNgTJjU-BhOuUpJkmZlnFaUBazKS0KnFyJGxxiEsZTgkOSROQ6TvIsjaIYiilPIIqCKIQ1FdW1G7cOlav2XdZNgpM8vapoAZVpn2tiLOEVtYUBxkF8e6Vv2hddRbM0QRRWwlizk2KFreBm97DNRUGjAb2uQKKaGiPk0kFpDNo8eUT15gwHUeP-aLHfMD1kxFJS62TYdm-9fb0pJFKNnajSDR5AfHsO4pquYV2A3kq4anR18-efqbWI_E8AAAD__-0sV9g">