<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/109148>109148</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] Ill-formed block expressions within a lambda can yield assert-failures
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
katzdm
</td>
</tr>
</table>
<pre>
The following program produces an assert failure with a `clang` binary built with assertions, when compiled with `-fblocks`:
```cpp
template<typename... Ts>
struct Cls {
static_assert([] consteval -> void {
(^Ts);
});
};
```
The assertion:
```
Assertion failed: ((!Unexpanded.empty() || Visitor.containsFunctionParmPackExpr()) && "Unable to find unexpanded parameter packs"), function DiagnoseUnexpandedParameterPack, file SemaTemplateVariadic.cpp, line 467.
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: /Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20 -cc1 -triple arm64-apple-macosx14.0.0 -Wundef-prefix=TARGET_OS_ -Werror=undef-prefix -Wdeprecated-objc-isa-usage -Werror=deprecated-objc-isa-usage -emit-obj -dumpdir build-llvm/main.tsk- -disable-free -clear-ast-before-backend -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -funwind-tables=1 -target-sdk-version=15.0 -fcompatibility-qualified-id-block-type-checking -fvisibility-inlines-hidden-static-local-var -fdefine-target-os-macros -fno-modulemap-allow-subdirectory-search -target-cpu apple-m1 -target-feature +zcm -target-feature +zcz -target-feature +v8.4a -target-feature +aes -target-feature +altnzcv -target-feature +ccdp -target-feature +complxnum -target-feature +crc -target-feature +dotprod -target-feature +fp-armv8 -target-feature +fp16fml -target-feature +fptoint -target-feature +fullfp16 -target-feature +jsconv -target-feature +lse -target-feature +neon -target-feature +pauth -target-feature +perfmon -target-feature +predres -target-feature +ras -target-feature +rcpc -target-feature +rdm -target-feature +sb -target-feature +sha2 -target-feature +sha3 -target-feature +specrestrict -target-feature +ssbs -target-abi darwinpcs -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=lldb -fdebug-compilation-dir=/Users/dkatz85/src/bloomberg/clang-p2996 -target-linker-version 1053.12 -fcoverage-compilation-dir=/Users/dkatz85/src/bloomberg/clang-p2996 -resource-dir /Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/lib/clang/20 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -internal-isystem /Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/../include/c++/v1 -internal-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include -internal-isystem /Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/lib/clang/20/include -internal-externc-isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include -std=c++26 -fdeprecated-macro -fbracket-depth 1500 -ferror-limit 30 -stack-protector 1 -freflection -freflection-new-syntax -fparameter-reflection -fannotation-attributes -fconsteval-blocks -fexpansion-statements -fblocks -fencode-extended-block-signature -fregister-global-dtors-with-atexit -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -freflection-latest -fmax-type-align=16 -fcolor-diagnostics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /var/folders/cp/8xfkfz156mx13fdc89796sv40000gq/T/main-f5020e.o -x c++ main.cpp
1. main.cpp:2:57: current parser token ')'
#0 0x00000001026f5684 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x102609684)
#1 0x00000001026f3748 llvm::sys::RunSignalHandlers() (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x102607748)
#2 0x00000001026f5cf0 SignalHandler(int) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x102609cf0)
#3 0x0000000182f3e584 (/usr/lib/system/libsystem_platform.dylib+0x18047a584)
#4 0x0000000182f0dc20 (/usr/lib/system/libsystem_pthread.dylib+0x180449c20)
#5 0x0000000182e1aa30 (/usr/lib/system/libsystem_c.dylib+0x180356a30)
#6 0x0000000182e19d20 (/usr/lib/system/libsystem_c.dylib+0x180355d20)
#7 0x00000001055ef650 clang::Sema::DiagnoseUnexpandedParameterPackInRequiresExpr(clang::RequiresExpr*) (.cold.1) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x105503650)
#8 0x000000010496d01c clang::Sema::DiagnoseUnexpandedParameterPack(clang::Expr*, clang::Sema::UnexpandedParameterPackContext) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x10488101c)
#9 0x00000001043569d8 clang::Sema::ActOnParamDefaultArgument(clang::Decl*, clang::SourceLocation, clang::Expr*) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x10426a9d8)
#10 0x000000010401ec1c clang::Parser::ParseParameterDeclarationClause(clang::DeclaratorContext, clang::ParsedAttributes&, llvm::SmallVectorImpl<clang::DeclaratorChunk::ParamInfo>&, clang::SourceLocation&, bool) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f32c1c)
#11 0x000000010401bd88 clang::Parser::ParseFunctionDeclarator(clang::Declarator&, clang::ParsedAttributes&, clang::BalancedDelimiterTracker&, bool, bool) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f2fd88)
#12 0x0000000104019cb8 clang::Parser::ParseDirectDeclarator(clang::Declarator&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f2dcb8)
#13 0x0000000104017fb8 clang::Parser::ParseDeclaratorInternal(clang::Declarator&, void (clang::Parser::*)(clang::Declarator&)) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f2bfb8)
#14 0x0000000104171358 clang::Sema::runWithSufficientStackSpace(clang::SourceLocation, llvm::function_ref<void ()>) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x104085358)
#15 0x0000000104008520 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f1c520)
#16 0x00000001040af4ec clang::Parser::ParseDeclarationAfterTemplate(clang::DeclaratorContext, clang::Parser::ParsedTemplateInfo&, clang::ParsingDeclRAIIObject&, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103fc34ec)
#17 0x00000001040ae744 clang::Parser::ParseTemplateDeclarationOrSpecialization(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::AccessSpecifier) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103fc2744)
#18 0x00000001040ae070 clang::Parser::ParseDeclarationStartingWithTemplate(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103fc2070)
#19 0x0000000104007374 clang::Parser::ParseDeclaration(clang::DeclaratorContext, clang::SourceLocation&, clang::ParsedAttributes&, clang::ParsedAttributes&, clang::SourceLocation*) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f1b374)
#20 0x00000001040be608 clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103fd2608)
#21 0x00000001040bcee8 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103fd0ee8)
#22 0x00000001040bc6b8 clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103fd06b8)
#23 0x0000000103ff1510 clang::ParseAST(clang::Sema&, bool, bool) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103f05510)
#24 0x00000001031a35c4 clang::FrontendAction::Execute() (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x1030b75c4)
#25 0x0000000103132998 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x103046998)
#26 0x000000010321e8e8 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x1031328e8)
#27 0x00000001000f5844 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x100009844)
#28 0x00000001000f2ee8 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x100006ee8)
#29 0x00000001000f236c clang_main(int, char**, llvm::ToolContext const&) (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x10000636c)
#30 0x00000001000fe674 main (/Users/dkatz85/src/bloomberg/clang-p2996/build-llvm/bin/clang-20+0x100012674)
#31 0x0000000182b83154
clang++: error: unable to execute command: Abort trap: 6
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
```
Here is another example that fails the same assertion:
```cpp
template <typename... Ts>
void fn(int = [] consteval -> int { (^Ts); return 0; }());
```
Both have the same root cause:
1. While parsing the `CompoundStmt` body of the lambda, clang begins to parse `^Ts` as a `BlockExpr`.
2. The `Sema::ActOnBlockArguments` function invokes `DiagnoseUnexpandedParameterPacks`, which sets `LambdaScopeInfo::ContainsUnexpandedParameterPacks` to `true`, prior to recognizing that the `BlockExpr` is ill-formed.
3. The ill-formed `BlockExpr` is diagnosed, and is subsequently discarded from the `CompoundStmt` representing the body of the lambda.
4. The `LambdaScopeInfo` is used to initialize the `LambdaExpr`, resulting in `LambdaExpr::ContainsUnexpandedParameterPack` being set to `true`.
5. The `LambdaExpr` becomes an argument to some other semantic construct (e.g., `StaticAssertDecl`, `ParameterDecl`), whose semantic analysis calls `DiagnoseUnexpandedParameterPack`.
6. The above assertion triggers because the `LambdaExpr` reports that it contains an unexpanded parameter pack, but the tree walk fails to find any pack (since the ill-formed `BlockExpr` was discarded from the `CompoundStmt`).
Although I can imagine a few ways to patch this (e.g., keep an "error" representation of the ill-formed `BlockExpr` in `CompoundStmt`, rollback the setting of `LambdaScopeInfo::ContainsUnexpandedParameterPack` when the `BlockExpr` is ill-formed, just remove the assertion from `DiagnoseUnexpandedParameterPacks`), I'm not sure I love any of them. For now, I figured I'd just report the issue.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcW11v2ziz_jXqDUFDoixZvsiFa8fvBqeLFk12e-4CihzZ3FCklqQcp7_-gJT8IcdxukW9OOcsio3Nz5lnhs8MpTG1VqwUwE2UfYyyxQfaurU2N0_Ufef1h1Lzl5uHNaBKS6mfhVqhxuiVobX_y1sGFlGFqLVgHKqokK0B9CzcGlEU5TGTVK2iPEalUNS8oLIV0vX9YY7QykZkjp7XoBDTdSMk8G5AlMe4KqVmTzbK4yidRfEiinf_z-PuH2uarsVB3UjqIErn7qUBRWsYjUbowUbpbTfCOtMyh-bSomjysWtD1lEn2GMnTUSKDgbEtLIONlQiHKW3aKMFP5qEEApDbx9sRKZRumuPJovj7_7r_vNO4GMtPLJ7HA4aDofOdgMCvsCjdBZ29_-SPxRsG6o48BHUjXsJrVMUTebRZI7-FFY4bUZMK0eFsstWMb_SF2rqL5Q93W4b080Ik0gekRxFhPyhaCkBOY0qoThq95ughhpagwODGuoNQ0iYPEdVvzRaCLpS2sJBsi-7OX7LMFZIQPdQ04feZn9SIygXbOStSeZICgVonE9GHQJfPt3O7m-RbctaOERR2a6QgUYb50VcO9dYDx5ZRmS5Em7dliOm64gspdzs_uDG6L-AuYgshbUt2IgsEVUcCcVkywG5NSBmqF2jkrInZygDL0pjoDGagbXAkdWt6Zr9TGqtZoI64Mi0CllmRON6ke8dZU-It3WzN2s8iuLpl_70ULNqa1DOdtZc_mHBeJG4P3hFFpGlNSwiy1JqXZdgVhFZhsOEGzKd5r6nFZLjXsNSqP0AEiPMWIKwM6KRgKip8zGmTSMB15Rpu03Go3gUI_ytVRwq3BioxDZKFw-zr_-5fXj8fP-I8DcwRpsoXRyPQfgbh8YA80pjXf7FsLAUt5au4GjKhTFQC-cbEfbYcGHQQI-aCjVy9gkjzIX1TogrA4Awk0ANptbhEiptAHsjgeII-ynYexT2Rx6FFVjTIFwbkJpR75S41hwkagRDuBEMS9iARAThuvKuiRstlAMvutIKS6AVwlXVYH9uDGUuShdaIVwpjY1uFRdqhWvq1ghXrXoWimPnZbVRuvC4U7MChy1_whswNhztRZJ5xCtPcdSJUkjhXvDfLZWiEsCx4DhQHfbchdka2JMnW1xthN2NFsqfC4vXgnNQuGMu7HWUeEMNwhWHSijYCaCtt7fRtpO81ryVUNMGU8_l2LYlFwaY0-YFW6CGrfeys6ZFvcccFKqAOk_vEfn4ndXnm7-fa94UozE910HBnm2WTn1nm3NdjPHmbLuuG7lV7VmxmGHnmrl2Poid66oaTE29Kc73JXlVy_NdznvS2a5WSj_zXN9flml1Vl1p4VyzAu-Or9sbH73PdoCp6jfmGODmvB0MPd_MmrN4Gn4WfVuebV1T8kZ7era9AWbAOiPYWXytLQ_C0lIgTs2zUA2zCHMo2xUWqtL4SSgepQvrqOJUagUI82dqqqOTOu4nrMBg1yqhVlG6kJKX4YD5lbo8pWMWLjxt_HMG38sqhXoCs9sfJXGWjhISqGIDhq7gF21noItefolfEHGkKHcDIrL0MUfYF2u0dn7xT6I01LxEZLnwVKsbMBFZznVdU8U_CQUPWku_-_3iv_yf3yn7fP_fI8ufEA5UrKgMCzqof1l4HI188O_CvR8fkY_h33KTnN_157WIyLK1fnBg58O2V9Hu1BRnt4Ot_8B-sXr7fazzx6qHlOThqOyTgBCFEK5K44O2wxwat0ZJFvuIGJIGLIVP7dLYr0TZk8_WXAhNKEE-BagkdOnl8Res4BnbF-XoFuFqn5riwXCqlHbd4aHOGVG2zrNdtc_wu8Drm0LC6k9hiK0Q8jO0u4P4fsU0hwClz2v7iO3vTx0NedlWwnoRVlKXVGLutLHYX2cwdbAVDuFqpVp2TDcjMkq6CC3qRgomXB-q_Zb2STRYc9OlBFgovKp9csK2WwxbBk24QQXZj74cQeTTa-u3rem2Sy6oFKuQkeQBBakN5l3O7oRny8Xj43_m88ffZn_ePi6-zb4uyeN8efc4u_-9S2-0950N9eavtOSd67ImIstiWz1V35Msr7dJWnFWTCfT3G7GcRzHq78jsnzoUzxcZTGJYaQR3qLeafaZW5ctJz5b3jelMxKls2zis2XWGgPK-auIBYOcfgKFIjIJF5HJ7iZG0hjF27j7L4lJXmV5MUbhyKSzKJ3ZF9t9-GKEciFff-iS_uIwyNDnR22dAVqH29EcCeW6u1Lxq7P2iHyMt17SeJoXY6_NXpXkRJV0Mi7OqfK1VffeG-VvVHEZZCuuLu1kMi4G0pJT4FkVo4FcESn-FRxZFQ8kS48kK0iVQlaMexF6ug5U2lFk97X7_OivqZU29Yi_hDF-iyIeT2h2YqrxcIuYMxL_4BZubYDykx3GU0aGSmSDHSChNP3BHdhw7TTLaTpcOz9Ze8p_VPpXa2f8RO7JsVtkGVR5FqMuagXnvYeadp_eeYRwp77C360wYPvnF0eLDHtmvYuNmJZ8lFzX4bIsTvNsqHNxrPN4mvM4YT-l81DLvXbz84u9schcKwfbK5-7cVEkccIGMEwHMKRZPuXFeclnzH1WQegFVLSVbtY_KBkCsAAmzwAQEtxP_aX_pHPoEddSnuR0yg906Ll7EIfGcQJs6ANfQhw7-ry3mdeSmqDMXNLWwmsQfLc2e8POXy3MZ_ukp49gh7hxX1Mp_wxp1l3dyCidn1993aqn_ZK0vlOVjtLbfrkL-If-Umt5XdDTKiXsyOM86MkJ6CUvioug7x6NHtR-C-zXer8B9NGIj1RSxYAvICS6YB5CKmwGGP07WJGKF0MHJSdYTVl5GatFeGz0g0hdWRvOyqE26Yk2k-o9bfby3vWXpXcs370MGIw5XrQjmcuYXB2WsjqBZTyAJZkkafYGBZtWfRNufd9WlWAC-tz4vuly44t0e6CW3euARwNVlM53kIW3I7dX5uC4yNJsqH02dIq4yEj8rlP8x-i2eW1noVa-974B9vqg_yQnXxKF796SBN59l3RPg-LxekttvlK1gjsl3NVjYVolLDvKAb0d8qEdaDWGy7HwKATOKs-bu7d8_zwS_gNMj8z8dXZ397ns3hz9ULz7R8aeMQbWelcSlfDh4LoGYekYhnFycmIQmIzHF5HbAXdkmM8mKECl-N4D8U9s838PRDIZjwcgFqcgxpP32aUH795R44Raecr9Oef-KQCvDVE8GR786QkBT9LJZT87gujf9qf3R5zh3CszaZlOBj5HTm4VJeTx5TTndtslN28C-yuAeRUfr44MJ3k8iPXkJPUvGcBlZB508wk2ILtL5TEknxv6dwtfnHl9NQrJwVef3Jy7CO2Tqd_Dk9y7utHG51H-bF_99PEYYAgJOYUkfycnXgpj3f8_XPJhUkwGd4W0qpIseU3cs_uHk7zXa_HvX9ziLEsGpEoGOX2a0DRjA1JdGs-Qis_Yrr4ond1ugbUhxFxZ3ricZGzIWdlQ3pRMpwM3nHf1X-ZOWeevywOJeyUGljhR8OouFI_z6XToQoOMNiUJFEO26aU_qLbZR43ikupXZ84kJcUJTQySwTiussIngyx5rKlf4ui9yMwY-hJO-ZytqenK5bzM_tTP0bCtvzJfXaU4jqfFMDUjxYlKxAeDnU3myUM4t8XFR2Kv9Dt5iubX6FOR3bgr-2Ecx_kpxU9PFU3z_ma1s15449LZJphi9r9BjTQf3EeGL-3iuIJ8Mg5vBq8qR0LyYXo1eONWkLJIk2yMuu7u1Ha1A-kM9UVvM9Tuiyah8y_EulfpvnNWhmpFQxv_Lb-8UmhHVU9uu2X68k_E27BJeO0sPSytBYQ3oQ0AiSOGmV6oPf0NDCBhEVXarcEg2NK68fKvaVfJa0NJpKX1xRrVV_W36O0C3PAUqOp9EUXpAp2vtg29k48nNbbIgGuNQrH_HCpt-8LVyzW2H7VbozXdwEGdUKXCwgP1nT7JCH1bCwnhrbJQqzA4ymPPy7pV_N7VLtQxa_6CdBW6Ja1LTvcpDiphJZT1dgivpv30Tvw8RtR2BdEfpe7LbvO4LxUlI_TQbXbyGiSMne0LRfP4UGTrjfwE1k9658VRqJ0OBdaCrZEFFyZ9CqLfM910T0D6GNRVCV9YySsX5bEzLfTrNkZo45sNML1S4nsHHnU7BI819v4mpMSVNjXwXv-00__Qfm5WX6EAfFd8KyyybWnh7xaUky-IC8uo4cD9uanfMp-BxoAF5XYmfm3PXqrx3iqnWHUCtRa4V1so4cKjD9jt2Y3vZffiGrCtDDt6GhsM-BHcg9uBn27BDQ3Qy5qdyLrDrQSm675Cv3ejwBK6BtQdegs1VU6w7gSG8viIFDBajbzg3iVDkWlXgh7uAZ1KUR4P3lKF5mnnZ9rCYV2qqHyxwiJGpfwRfz1olXda0VJvjhgIOSNWKzDWa-eP8FnY-_Jw23miCBEtYOyxeLOcPWTybee5zgCgZyqfdlzY18JT9RLGepysUKzb_4LzPlP7Y84ZkenomLhm0q11u1qjO8SoQqKmK6EAUVTBM3qmLz3TOLZGbi3sseGeABqvaURIF1QIObh-iA07n7906tRZIefIaClLD0EgVHDBtXX1s7wSQFqDep8w_OZ_tdYhA7XuCf3gGAHaHyXE4Kt3EZnUSGmHbGsA3SEZXE3tGKEeoaU2SOnnMBpVYtUa4GEe30nS_QzBQ2ltC6MP_Cbl03RKP8BNMiF5nhfjPPuwvqkmY4izMc84n0DJ0kmZZIRMpxxoWXHOPogbEpNxPE2KZBxPxmRUjtMpmUz5lJVJTtk0GsdQUyFHPpkZabP6ELa8SeJpMi4-SFqCtOF3PIT0qQWJssUHcxN-AFG2KxuNYymss4clnHAy_Pinm5Et0N3BJUKBG4Kt9xwbasuehVsLhWhPlsEzXwRI3hsC978Bsh9aI29-_qcZvU6bG_I_AQAA__9vFqbR">