<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62345>62345</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
ast-dump TextNodeDumper crash on processing constexpr (clang 11+)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
pth81
</td>
</tr>
</table>
<pre>
When running an -ast-dump on the UnrealEngine most compilation units cause clang++ to seg fault.
Details of the crash below, with a reduced test-case, and details on the original crash.
Crash originally exposed using /usr/bin/clang++ on Ubuntu 22.04.
Crash does not occur with Clang-10. Crash does occur with llvm.org binary distributions of Clang 11, 12, 13, 14, 15.
## Crash Report
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/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/b
in/clang++ -E -w -Xclang -ast-dump -g test.cpp
1. <eof> parser at end of file
#0 0x00005629bb180c73 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/o
pt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x2e5fc73)
#1 0x00005629bb17eb8e llvm::sys::RunSignalHandlers() (/opt/101/llvm-debug-not
-patched/LLVM-15.0.7-Linux/bin/clang+++0x2e5db8e)
#2 0x00005629bb0f7410 CrashRecoverySignalHandler(int) CrashRecoveryContext.cp
p:0:0
#3 0x00007feed6e42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00005629bd655592 clang::Expr::EvaluateAsInitializer(clang::APValue&, cla
ng::ASTContext const&, clang::VarDecl const*, llvm::SmallVectorImpl<std::pair<
clang::SourceLocation, clang::PartialDiagnostic>>&, bool) const (/opt/101/llvm
-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x5334592)
#5 0x00005629bd5d3cee clang::VarDecl::evaluateValueImpl(llvm::SmallVectorImpl
<std::pair<clang::SourceLocation, clang::PartialDiagnostic>>&, bool) const (/o
pt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x52b2cee)
#6 0x00005629bd5d3bf2 clang::VarDecl::evaluateValue() const (/opt/101/llvm-de
bug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x52b2bf2)
#7 0x00005629bd7c3042 clang::TextNodeDumper::VisitVarDecl(clang::VarDecl cons
t*) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x54a2042)
#8 0x00005629bd7b6d03 clang::TextNodeDumper::Visit(clang::Decl const*) (/opt/
101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x5495d03)
#9 0x00005629bd496834 clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNo
deDumper>::Visit(clang::Decl const*)::‘lambda’()::operator()() const (/opt/101
/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x5175834)
#10 0x00005629bd49cc8c void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::
‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::
TextNodeDumper>::Visit(clang::Decl const*)::‘lambda’())::‘lambda’(bool)::opera
tor()(bool) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang
+++0x517bc8c)
#11 0x00005629bd4aea89 void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, l
lvm::StringRef)::‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::A
STDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::
‘lambda’())::‘lambda’(bool)::operator()(bool) const (/opt/101/llvm-debug-not-p
atched/LLVM-15.0.7-Linux/bin/clang+++0x518da89)
#12 0x00005629bd4ac57b void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, l
lvm::StringRef)::‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::A
STDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::
‘lambda’()) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x5
18b57b)
#13 0x00005629bd4ac8fb clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNo
deDumper>::Visit(clang::Stmt const*, llvm::StringRef)::‘lambda’()::operator()(
) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x518b8
fb)
#14 0x00005629bd4aea4c void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, l
lvm::StringRef)::‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::A
STDumper, clang::TextNodeDumper>::Visit(clang::Stmt const*, llvm::StringRef)::
‘lambda’())::‘lambda’(bool)::operator()(bool) const (/opt/101/llvm-debug-not-p
atched/LLVM-15.0.7-Linux/bin/clang+++0x518da4c)
#15 0x00005629bd4aee33 void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::comments::Comm
ent const*, clang::comments::FullComment const*)::‘lambda’()>(llvm::StringRef,
clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang
::comments::Comment const*, clang::comments::FullComment const*)::‘lambda’())
(/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x518de33)
#16 0x00005629bd4968fc clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNo
deDumper>::Visit(clang::Decl const*)::‘lambda’()::operator()() const (/opt/101
/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x51758fc)
#17 0x00005629bd49cc8c void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::
‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::
TextNodeDumper>::Visit(clang::Decl const*)::‘lambda’())::‘lambda’(bool)::opera
tor()(bool) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang
+++0x517bc8c)
#18 0x00005629bd4aee33 void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::comments::Comm
ent const*, clang::comments::FullComment const*)::‘lambda’()>(llvm::StringRef,
clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang
::comments::Comment const*, clang::comments::FullComment const*)::‘lambda’())
(/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x518de33)
#19 0x00005629bd4968fc clang::ASTNodeTraverser<clang::ASTDumper, clang::TextNo
deDumper>::Visit(clang::Decl const*)::‘lambda’()::operator()() const (/opt/101
/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x51758fc)
#20 0x00005629bd49cc8c void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::
‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::
TextNodeDumper>::Visit(clang::Decl const*)::‘lambda’())::‘lambda’(bool)::opera
tor()(bool) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang
+++0x517bc8c)
#21 0x00005629bd49ccc9 void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::
‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::
TextNodeDumper>::Visit(clang::Decl const*)::‘lambda’())::‘lambda’(bool)::opera
tor()(bool) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang
+++0x517bcc9)
#22 0x00005629bd49649d void clang::TextTreeStructure::AddChild<clang::ASTNodeT
raverser<clang::ASTDumper, clang::TextNodeDumper>::Visit(clang::Decl const*)::
‘lambda’()>(llvm::StringRef, clang::ASTNodeTraverser<clang::ASTDumper, clang::
TextNodeDumper>::Visit(clang::Decl const*)::‘lambda’()) (/opt/101/llvm-debug-n
ot-patched/LLVM-15.0.7-Linux/bin/clang+++0x517549d)
#23 0x00005629bd4956ff clang::Decl::dump(llvm::raw_ostream&, bool, clang::ASTD
umpOutputFormat) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/
clang+++0x51746ff)
#24 0x00005629bbaa8f6e (anonymous namespace)::ASTPrinter::print(clang::Decl*)
ASTConsumers.cpp:0:0
#25 0x00005629bcb0ce81 clang::ParseAST(clang::Sema&, bool, bool) (/opt/101/llv
m-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x47ebe81)
#26 0x00005629bba53a39 clang::FrontendAction::Execute() (/opt/101/llvm-debug-n
ot-patched/LLVM-15.0.7-Linux/bin/clang+++0x3732a39)
#27 0x00005629bb9ca6f6 clang::CompilerInstance::ExecuteAction(clang::FrontendA
ction&) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x36a96
f6)
#28 0x00005629bbb08d9b clang::ExecuteCompilerInvocation(clang::CompilerInstanc
e*) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x37e7d9b)
#29 0x00005629b9424b21 cc1_main(llvm::ArrayRef<char const*>, char const*, void
*) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x1103b21)
#30 0x00005629b9422cfb ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) dri
ver.cpp:0:0
#31 0x00005629bb857192 void llvm::function_ref<void ()>::callback_fn<clang::dr
iver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std
::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*,
bool*) const::$_1>(long) Job.cpp:0:0
#32 0x00005629bb0f71ad llvm::CrashRecoveryContext::RunSafely(llvm::function_re
f<void ()>) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x2
dd61ad)
#33 0x00005629bb856ce5 clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm:
:Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits
<char>, std::allocator<char>>*, bool*) const (/opt/101/llvm-debug-not-patched/
LLVM-15.0.7-Linux/bin/clang+++0x3535ce5)
#34 0x00005629bb820523 clang::driver::Compilation::ExecuteCommand(clang::drive
r::Command const&, clang::driver::Command const*&, bool) const (/opt/101/llvm-
debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x34ff523)
#35 0x00005629bb82075e clang::driver::Compilation::ExecuteJobs(clang::driver::
JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command co
nst*>>&, bool) const (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/cl
ang+++0x34ff75e)
#36 0x00005629bb83acd0 clang::driver::Driver::ExecuteCompilation(clang::driver
::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command co
nst*>>&) (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin/clang+++0x3519
cd0)
#37 0x00005629b94223b8 clang_main(int, char**) (/opt/101/llvm-debug-not-patche
d/LLVM-15.0.7-Linux/bin/clang+++0x11013b8)
#38 0x00007feed6e29d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start
_call_main.h:58:16
#39 0x00007feed6e29e40 call_init ./csu/../csu/libc-start.c:128:20
#40 0x00007feed6e29e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#41 0x00005629b941f7f5 _start (/opt/101/llvm-debug-not-patched/LLVM-15.0.7-Lin
ux/bin/clang+++0x10fe7f5)
clang-15: error: clang frontend command failed with exit code 139 (use -v to s
ee invocation)
clang version 15.0.7 (https://github.com/llvm/llvm-project.git 8dfdcc7b7bf6683
4a761bd8de445840ef68e4d1a)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/101/llvm-debug-not-patched/LLVM-15.0.7-Linux/bin
clang-15: error: unable to execute command: Segmentation fault (core dumped)
clang-15: note: diagnostic msg: Error generating preprocessed source(s).
## Compile Command
clang++ -E -w -Xclang -ast-dump -g test.cpp
## Stripped down source code
// Copyright Epic Games, Inc. All Rights Reserved.
#define UE_NODISCARD
class FPlatformMath {};
/**
* Structure for all math helper functions, inherits from platform math to pick up platform-specific implementations
* Check GenericPlatformMath.h for additional math functions
*/
struct FMath : public FPlatformMath
{
public:
/**
* Returns an approximation of Exp(-X) based on a Taylor expansion that has had the coefficients adjusted (using
* optimisation) to minimise the error in the range 0 < X < 1, which is below 0.1%. Note that it returns exactly 1
* when X is 0, and the return value is greater than the real value for values of X > 1 (but it still tends
* to zero for large X).
*/
template<class T>
UE_NODISCARD static constexpr T InvExpApprox(T X)
{
UE_NODISCARD constexpr T A(1.00746054f); // 1 / 1! in Taylor series
constexpr T B(0.45053901f); // 1 / 2! in Taylor series
constexpr T C(0.25724632f); // 1 / 3! in Taylor series
return 1 / (1 + A * X + B * X * X + C * X * X * X);
}
};
## Origin of issue
Download and build UnrealEngine from https://github.com/EpicGames/UnrealEngine, see https://docs.unrealengine.com/5.1/en-US/downloading-unreal-engine-source-code/.
Generate a compilation database with: ./Engine/Build/BatchFiles/Linux/Build.sh Linux Development UnrealFrontend UnrealEditor UnrealInsights -disableunity -nopch -mode=GenerateClangDatabase
Take first compilation unit in the compilation database and add -ast-dump.
[
{
"file": "/mnt/build1/cpp/UnrealEngine/Engine/Plugins/2D/Paper2
D/Source/Paper2D/Private/GroupedSpriteSceneProxy.cpp",
"command": "\"/mnt/build1/cpp/UnrealEngine/Engine/Extras/Third
PartyNotUE/SDKs/HostLinux/Linux_x64/v20_clang-13.0.1-centos7/x86_64-unknown-li
nux-gnu/bin/clang++\" @\"../Plugins/2D/Paper2D/Intermediate/Build/Linux/B4D820
EA/UnrealEditor/Development/Paper2D/GroupedSpriteSceneProxy.cpp.o.response.gcd
\" -isystem\"/mnt/build1/cpp/UnrealEngine/Engine/Extras/ThirdPartyNotUE/SDKs/H
ostLinux/Linux_x64/v20_clang-13.0.1-centos7/x86_64-unknown-linux-gnu/lib/clang
/13.0.1/include/\"",
"directory": "/mnt/build1/cpp/UnrealEngine/Engine/Source"
}
]
Issue arises at line 1477 in ./Engine/Source/Runtime/Core/Public/Math/UnrealMathUtility.h.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXN1y2ziyfhrmBiUVCZISdZELRbJmsyc7k4qdOblzgUBTwoYCWADoyPv0p_BDiZCVTGwnuydbnprIFAH274fuBgSQaM23AuB1Ur5JyvUr0pudVK87s6uyV7Vk96__dwcCqV4ILraICDQh2kxYv--QFMjsAH0UCkh7JbZcANpLbRCV-463xHApUC-40YiSXgOiLRHbBL9J8BtkJNKwRQ3pWzNN0nWSLv3nGgzhrUaycdSpInqHamjllwSv0BdudoggBaynwJABbSaUaLBtRDDEhqe9bFLxLRek9WQiPitHeOjQ3iM4dFIDQ722miZ402uV4E3NRYI3Y9GlQB_rXpgeYTxNiwtUmQSNhDRIUtorL_TKUphk6RSN-oza2_ZuP5Vqi2ouiLpHjGujeN1bKzprOAIoy6yqGXafufss3GcZyZHgPMF5YPUBOqmMb3j_7mp5fYV0X--5QQTV_RYp125dsjOm00m-TPAmwZstN7u-nlK5T_DGyhf-TDol_wnUJHjDte5BJ3hjre85IC5o2zMYu4_Qz0YR6tzUKeiUpKCtsbXsFT16j2gtKScGmEUc0lTxbkDHtSH0M7LAs_K5W-k0SRfvldwqskdEbfs9CGPFt96TnZUvS7NBaAZ1v50IaSYdMXQHLMGbd-_-_MckK6fpdD55x0V_sA73xB-4fXKFJl_Q5JO7NxoGk62D4ZR2nX8ys2Il-Qpkk-RXqCNKg0LEIBDMOrLhLQRTJThPUXpI0zQtZ3hR11mV0nnuwGDVzJf6XvuL94oL44xw4y1ZnTop8uVWaqOA7BM8s9bkwiR4gRJcWVN4bk82yLkpEvwmPWAoGzrPE7w46ZLFusyhruCSLh96cc23grR_I4K1oLST8yjuVwX1nJ4qLqsriMTFkbhpMy-y1A-ZD0DlHaj7SMoEV8GsUZ-VFAYO1v_BzEm-TN2_I6M8MJo3AGwGBS5xGpRteZ3gzaGa3c6KSWtVmGxF7xvoVMvpzInvHomEL8bCs1lZlgscIqyz8dWhU-HqjrQ9MbDUbwU3nLT8X06ZUefl-z9J20MAD22J53Nsvr4JWiIqhTanfkOPP4laA22H5qVtPjn-ek_a9k-gRqq3-65N8pU2zDd1hKskX3l-I4LXLjC8k9SlkTNu74myeqw52QqpDadJfmX_92LVUrbWS06Wr2AqIOl5Q6DM86Jc4MgtZeSWkuUU4IKh_BcInnHGd5YZj-pzq_nA_tB2P9FqPyNwlLjGFOKRODu3Wt3g77NaiBzf8vWEhXD7XKnrJvb1PJJ6TvO0iKS-gYP5XTJY9_sOwmD8k2tuBnWiMTgeQp6HH0h_HRafplBBcFrEClWxQvWMpfl3KRRrchYJYgVCjvxxaixKlsZpaBGpUSxmVV6M1Vhe31gtbhS5A5ub4zG0vL4J-sXDxyvvuZxMcPXdVvB3kyucVGmyqFqyrxkZvi48jn0f2YEiRqpw71sID8XeD7FkNi-rvDha0ubz9MySlFYU3UnOzg1zowCujeqp6RUEOzK22vGWPbCus73n8RQPPMP2Xq-_8MBVHISN4mL7AZozWZ6GIS_Bs_X4tgbf0S0E-xHcQsQZge570uiTIBfQNQZeTSsaAS-LgUeAVItfAXjXZm_iIsjzu4Sn74wIPwSPYQ7149X7lmLfM9yeBNbnwNRL9aT4WDFSLSKY4jOY0nJev8D0vxKmP6kKC-VQVZfzOoJWfg6tqqn__UXM4yz5pNomaPwTEk00duvAqYnNXDxINMUvUeG8jOD_7kRTxPVQeQ5TyPNfAaZU7odF2SRfruQ-rLyAiN371Uc2fduu_J3HT6a-jugwWfxB8fQvLBEWbi7b499iiROUfk5wZZDnEV5nD6bgDX2Zgn_XFLyJR_78ZQr-MgX_T0zBq5eU85JyfqGU83DV9yXlPCnl4JdV35eU859IOTh7ADz6S6z6vgDvVwMejdZxMT7PHcWCvQDv_z3w_gImXopnJMZiwSKYnK3JLspZ06AzNfyV26f27S1aHvDnxl57bv2--6M3XW82Uu2J-cEDY7zbJtK4mDVNpHG0PFoTUjUzsDIQIcX9XvYaCbIH3bkdaYujFm6z2rBDoFNu29S5v4OnHSu_wUj3e1DabaSLtlBZQaIFMFqnFKrsbHOLhuX1zdkyIuzJmbmHOHPRkJ7fc2uqYg41VFlkyFlsyDIn-WIs_0ZJYUCwJXU7d9y9qwPQ3sB3bY57FtbzeY5JHofEaN2hXlAya2ZjgVduky-ot0IbIihEIgctIl8cNQzo8z1mP-2nlXxGFrOw5j-LVItmtnWdVmxRx1vnnBInDe-OG6qqr1sgzDJ_5p6dfA5ztoh-wMDRtGdR4KLGGaI0u90TS2MUgpZKkXsb4fMV3RF1irc2FaxQfA-vXP4b-Pw8nbIszWscDZZ4T-yiwJg2NRq8sspu3BD-xk65Swo6oDHFPZc7UBfjzNkW1qqcZwvsK4ETu6YXDr23yhnTtZ6yqp9Hk7atCf1824g4YzIVthffDeFxtcrsHJsIdj7qL7rudPOPzgpB2ujmKY-HzX0rpA0brwfc3tLDIcv8l5poTm-1eyiYbXjE67Ej6tYowo0emk9EXQ_StnZ0SDVqt12WxyUPH3FPP_GF5I6L2yxUIdIiYoH-LuvLTnmwUTcjY39c2o7rWz704po00N5H1hz5L8SHh178WXDHYSmBzTISFRd5foa8GYUSRch5NmYGFDwGOc_DzLBn9bHIQeegeYw3PNdHhNUyLymUkTfiwqfCaYnzr3rjdN7lPIE4F0VZwz0YZgWnJTki2Ne2Vp9xGnddPmLH82RYw3pWAiqapsTRulu849laal7CYy31d1nrC2ZS49nE32X9jut4B_pjtpi7IvQ7LBu2vh8zx6P2lT86OoRfiR9YeV5CZOW4fqxyQln6NV3Wo-uolrlQxITnRvkh6vrvtvLPKpzKLNiSsjSy6_y81Mjryks_FFCDRi7MPbIUCmPusQVRltdVJGUVHyDBC7ZI0e1ty2sbiIkyt7bgcBKjqaWp-wRvpvZS32sGnU7wRnSmDQdL_EOe_unR6S7Jl2WV5MtsduK9OOcNRYrcM1xwc87OX1oeE8djSi05bIniU0Yv0ktEI4Uu6XKReD63887yRDuLXZo186ZEnuoz0BXm5d_wW9rAvDllEdc-ycokXyJQyqa58OsPasJUCNEwHhrCW2D-ICAcuA1yDFCWO6D1GtDkzp2YDHMMQHw0JxnzQ3egNJcCecHt44870zfdcoMq1jBK5_W8bmazKvf0CzKfZTWrGBRFWRUpNLMKCpaRowQ3RG3BVl4onGfqxWchv4jRuSbfb6eAMLSXDFrbu5OaH3yTm0u1LbA1V88-yDc47aInekHqFqxVwYfIwRm28Rq2exDGH2F1Z1StJalU4E4gArvoZSGNnQYjdjxhg_baRkF0ZbmiLQhQxHCxvXwIstIJXlw8xulnmmgoKM6Xb751NvHscOIF6rbw6zpgiMkvIgjjAHj8nSnBG7SS3b3i251BVx2n6DeyB23j4ltBp2jZtuiDbdToA2hQd8CmRx4MGi4Afby6_f2P9dvr1fLD-qiB1mjzviWmkWr_D2J2KJm_SebrJH8zYu6Crv_1NMFLdFx_RY1UiLQt2tsnd9B2oNBQ3Gt_DHIHihttR9wedYGR728k6jj9jPru2DDRHVDecIr4vmvhCAE94r7aAf2MfrOu5HQs-nTn5WGM--rasznJc6RxLFG10wRtvOZ2JPR1y2lskmCIebCI73KsihBC6NxI7tYSfQDTK6EREYh0nZIHvveAlg26OnQJriafbC6riQWhFIigG3LfSoXg0BHhwojZEYN2RKMdYf5Ar4Sm4ZSDMBoR9s9eG2A-SvFhsX0QQHaG77kewpS1-J4Le8sfDnZjEXF_VFsRsQWUoiRfoU_u0510_rLjdIe49kfAUTrNElxO0e_SgBeOG6SConAg1LT3KIvF-LIDgT5ZGulw0NgxdE-hO9L2YBu3CogBZakGiYC0odk61l25k9hWvCuUWa3r3kmgDW9bZEO6jnkbif4FSjoCrQ2P6NNpjIdORzjY7wb2Fo3gVw20Rje2NDo2jwcR0had1NejcOgUukFvxd3VoVs6dye4unHsRtwGFEV03H9jKssEV9k0TefFLC0Lv9HyDQqBwOq9sc7JrOsCYjQoDiPdzym-SXCVTosyLfNFml2kiB9HceUo4nKOi1mOL1LM_5piAIHvb7VGNpz6kf7JXb85Xg93Vmd3lt7IQ8jydl4Pw3YUy8ZB9w_34gGLJneE3ret5RfRSsIcRuuetyx-u4KLYt_I5zYyh8C8GT_opt0AZ48ySfW0d93AdQtUSjvGNiAmH69dLy8TF9uJ7zzxvSc-U0xcpsCbKRpr-ZtPdYBI9DYIRgyx4cZVOjbg2apukHHzxmps_9q0vuGt02PI5q5xqncIuTtoDXfQys7tTfG6DgvMg80YN1KFL2-F9ulpwri2ib8X3NyjiZAd3aGJLUWSfD1I7V61sA6yjtW6IZ8BNVxdeMnFEMcuqutebsDYKTPHWb48ImRxHKH2Ol0kGLvXBWDsqyGc4M3eTkg2Dh7WUTa1n7v7ZNP3bb_lNhlu8Np-JR2osAZlv1-H0iM0uC6K39kAhDe_Kdl3wK47xQ1cUxDwXsnDvSsmrCSrM0mHAuokbLl6gshXB6OIlfhmx1Uodt4TZe5_l-bjlRV6_T-2-W9SmwEd7u_tYVYkeHOH09tQluXTdJpNKAgj9fx0zv5Ul4Zp6PHU_cPS3qmAkiL1V24ectGo9uqtMKD2wLg34ADoI4aLdTXMgq6WJxM4pCZ4M8J0RPYbjpjKqQLdSaFhuqXDQq8XesL1vTaw_xFuuOiA8KPT890Qvfbg_Jf7jX8-wZvwZhEbvoJKF1DIuHILFPdPHzTDqMDjZHGK6eV6PHrf2viNiOIaNCIGtTZSZ8V8jsIE9gHZzYdeGL63Vyup3OjzRR12leBRMPvlo-EtN_fT-OU1T_t8xV7nbJEvyCt4nc0qXGS4KvNXu9dpPZvlc5LRMmMpZBTmBKdziou0xpAV5BV_jVOcpwUu06ossnxas6pZQFPM2byYZZgkRQp7wtvp8BqbVy6tvZ7hvChftaSGVrt3DGEs4EvIeTZArF-p125WV_dbnRRpy7XRJyqGmxZeH-cz8Y6C8HYZKVCYS9mZ1alGGBa63Dtz3iR48apX7eunv-LG6fJ_AQAA__8l1JII">