<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60631>60631</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LLVM11 debug info is different from LLVM8 debug info when running the same compilation command
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
2994186010
</td>
</tr>
</table>
<pre>
The C source code is as following.
```
#include "fdlibm.h"
#include <errno.h>
#ifdef __STDC__
double ldexp(double value, int exp)
#else
double ldexp(value, exp)
double value; int exp;
#endif
{
if(!finite(value)||value==0.0) return value;
value = scalbn(value,exp);
if(!finite(value)||value==0.0) errno = ERANGE;
return value;
}
```
The compilation command is "clang -emit-llvm -g -O3 -D_IEEE_LIBM -Wall -Wuninitialized -c s_ldexp.c -o s_ldexp.bc"
I transform the bitcode into human-readable LLVM assembly language using this command "llvm-dis s_ldexp.bc -o s_ldexp.ll"
The IR compiled by **clang8** is as following.
```
; ModuleID = 's_ldexp.llvm8.O3.bc'
source_filename = "s_ldexp.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind uwtable
define dso_local double @ldexp(double, i32) local_unnamed_addr #0 !dbg !7 {
call void @llvm.dbg.value(metadata double %0, metadata !13, metadata !DIExpression()), !dbg !15
call void @llvm.dbg.value(metadata i32 %1, metadata !14, metadata !DIExpression()), !dbg !16
%3 = tail call double @llvm.fabs.f64(double %0) #4, !dbg !17
%4 = fcmp ueq double %3, 0x7FF0000000000000, !dbg !17
%5 = fcmp oeq double %0, 0.000000e+00, !dbg !19
%6 = or i1 %5, %4, !dbg !20
br i1 %6, label %15, label %7, !dbg !20
; <label>:7: ; preds = %2
%8 = tail call double @scalbn(double %0, i32 %1) #5, !dbg !21
call void @llvm.dbg.value(metadata double %8, metadata !13, metadata !DIExpression()), !dbg !15
%9 = tail call double @llvm.fabs.f64(double %8) #4, !dbg !22
%10 = fcmp ueq double %9, 0x7FF0000000000000, !dbg !22
%11 = fcmp oeq double %8, 0.000000e+00, !dbg !24
%12 = or i1 %11, %10, !dbg !25
br i1 %12, label %13, label %15, !dbg !25
; <label>:13: ; preds = %7
%14 = tail call i32* @__errno_location() #6, !dbg !26
store i32 34, i32* %14, align 4, !dbg !27, !tbaa !28
br label %15, !dbg !26
; <label>:15: ; preds = %13, %7, %2
%16 = phi double [ %0, %2 ], [ %8, %7 ], [ %8, %13 ], !dbg !32
ret double %16, !dbg !33
}
; Function Attrs: nounwind readnone speculatable
declare double @llvm.fabs.f64(double) #1
; Function Attrs: nounwind
declare dso_local double @scalbn(double, i32) local_unnamed_addr #2
; Function Attrs: nounwind readnone
declare dso_local i32* @__errno_location() local_unnamed_addr #3
; Function Attrs: nounwind readnone speculatable
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone speculatable }
attributes #2 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #3 = { nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #4 = { readnone }
attributes #5 = { nounwind }
attributes #6 = { nounwind readnone }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5}
!llvm.ident = !{!6}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 8.0.0 (tags/RELEASE_800/final)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
!1 = !DIFile(filename: "s_ldexp.c", directory: "/root/test/ficl/fdlibm53")
!2 = !{}
!3 = !{i32 2, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{!"clang version 8.0.0 (tags/RELEASE_800/final)"}
!7 = distinct !DISubprogram(name: "ldexp", scope: !1, file: !1, line: 18, type: !8, scopeLine: 23, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
!8 = !DISubroutineType(types: !9)
!9 = !{!10, !10, !11}
!10 = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!12 = !{!13, !14}
!13 = !DILocalVariable(name: "value", arg: 1, scope: !7, file: !1, line: 18, type: !10)
!14 = !DILocalVariable(name: "exp", arg: 2, scope: !7, file: !1, line: 18, type: !11)
!15 = !DILocation(line: 18, column: 22, scope: !7)
!16 = !DILocation(line: 18, column: 33, scope: !7)
!17 = !DILocation(line: 24, column: 6, scope: !18)
!18 = distinct !DILexicalBlock(scope: !7, file: !1, line: 24, column: 5)
!19 = !DILocation(line: 24, column: 26, scope: !18)
!20 = !DILocation(line: 24, column: 19, scope: !18)
!21 = !DILocation(line: 25, column: 10, scope: !7)
!22 = !DILocation(line: 26, column: 6, scope: !23)
!23 = distinct !DILexicalBlock(scope: !7, file: !1, line: 26, column: 5)
!24 = !DILocation(line: 26, column: 26, scope: !23)
!25 = !DILocation(line: 26, column: 19, scope: !23)
!26 = !DILocation(line: 26, column: 33, scope: !23)
!27 = !DILocation(line: 26, column: 39, scope: !23)
!28 = !{!29, !29, i64 0}
!29 = !{!"int", !30, i64 0}
!30 = !{!"omnipotent char", !31, i64 0}
!31 = !{!"Simple C/C++ TBAA"}
!32 = !DILocation(line: 0, scope: !7)
!33 = !DILocation(line: 28, column: 1, scope: !7)
```
The IR compiled by **clang11** is as following.
```
; ModuleID = 's_ldexp.llvm11.O3.bc'
source_filename = "s_ldexp.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind uwtable
define dso_local double @ldexp(double %0, i32 %1) local_unnamed_addr #0 !dbg !7 {
call void @llvm.dbg.value(metadata double %0, metadata !13, metadata !DIExpression()), !dbg !15
call void @llvm.dbg.value(metadata i32 %1, metadata !14, metadata !DIExpression()), !dbg !15
%3 = tail call double @llvm.fabs.f64(double %0) #4, !dbg !16
%4 = fcmp ueq double %3, 0x7FF0000000000000, !dbg !16
%5 = fcmp oeq double %0, 0.000000e+00
%6 = or i1 %5, %4, !dbg !18
br i1 %6, label %15, label %7, !dbg !18
7: ; preds = %2
%8 = tail call double @scalbn(double %0, i32 %1) #5, !dbg !19
call void @llvm.dbg.value(metadata double %8, metadata !13, metadata !DIExpression()), !dbg !15
%9 = tail call double @llvm.fabs.f64(double %8) #4, !dbg !20
%10 = fcmp ueq double %9, 0x7FF0000000000000, !dbg !20
%11 = fcmp oeq double %8, 0.000000e+00
%12 = or i1 %11, %10, !dbg !22
br i1 %12, label %13, label %15, !dbg !22
13: ; preds = %7
%14 = tail call i32* @__errno_location() #6, !dbg !23
store i32 34, i32* %14, align 4, !dbg !24, !tbaa !25
br label %15, !dbg !23
15: ; preds = %13, %7, %2
%16 = phi double [ %0, %2 ], [ %8, %7 ], [ %8, %13 ], !dbg !15
ret double %16, !dbg !29
}
; Function Attrs: nounwind readnone speculatable willreturn
declare double @llvm.fabs.f64(double) #1
; Function Attrs: nounwind
declare dso_local double @scalbn(double, i32) local_unnamed_addr #2
; Function Attrs: nounwind readnone
declare dso_local i32* @__errno_location() local_unnamed_addr #3
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone speculatable willreturn }
attributes #2 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #3 = { nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #4 = { readnone }
attributes #5 = { nounwind }
attributes #6 = { nounwind readnone }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5}
!llvm.ident = !{!6}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0 (https://github.com/llvm/llvm-project.git 0160ad802e899c2922bc9b29564080c22eb0908c)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "s_ldexp.c", directory: "/root/test/ficl/fdlibm53")
!2 = !{}
!3 = !{i32 7, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{!"clang version 11.0.0 (https://github.com/llvm/llvm-project.git 0160ad802e899c2922bc9b29564080c22eb0908c)"}
!7 = distinct !DISubprogram(name: "ldexp", scope: !1, file: !1, line: 18, type: !8, scopeLine: 23, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
!8 = !DISubroutineType(types: !9)
!9 = !{!10, !10, !11}
!10 = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float)
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!12 = !{!13, !14}
!13 = !DILocalVariable(name: "value", arg: 1, scope: !7, file: !1, line: 18, type: !10)
!14 = !DILocalVariable(name: "exp", arg: 2, scope: !7, file: !1, line: 18, type: !11)
!15 = !DILocation(line: 0, scope: !7)
!16 = !DILocation(line: 24, column: 6, scope: !17)
!17 = distinct !DILexicalBlock(scope: !7, file: !1, line: 24, column: 5)
!18 = !DILocation(line: 24, column: 19, scope: !17)
!19 = !DILocation(line: 25, column: 10, scope: !7)
!20 = !DILocation(line: 26, column: 6, scope: !21)
!21 = distinct !DILexicalBlock(scope: !7, file: !1, line: 26, column: 5)
!22 = !DILocation(line: 26, column: 19, scope: !21)
!23 = !DILocation(line: 26, column: 33, scope: !21)
!24 = !DILocation(line: 26, column: 39, scope: !21)
!25 = !{!26, !26, i64 0}
!26 = !{!"int", !27, i64 0}
!27 = !{!"omnipotent char", !28, i64 0}
!28 = !{!"Simple C/C++ TBAA"}
!29 = !DILocation(line: 28, column: 1, scope: !7)
```
In the s_ldexp.c, there one code snippet “value==0.0”.
The corresponding IR compiled by **clang8** is "%5 = fcmp oeq double %0, 0.000000e+00, !dbg !19".
The corresponding IR compiled by **clang11** is "%5 = fcmp oeq double %0, 0.000000e+00".
Compared with clang8, the debug info "!dbg !19" is missing in the corresponding IR compiled by clang11. The debug info is important to me. For LLVM11, there are there methods that can solve the problem. I hope that clang11 can reserve the debug info.
The first method is to run these two commands.
```
clang -emit-llvm -O3 -D_IEEE_LIBM -Wall -Wuninitialized -c s_ldexp.c -o s_ldexp.bc
opt -enable-debugify s_ldexp.bc -o s_ldexp.debug.bc
```
When using clang to compile source code, "-g" parameter is not used. And using llvm opt command to attach debug info into the IR.
The second method is to run this command.
```
clang -emit-llvm -g -O0 -D_IEEE_LIBM -Wall -Wuninitialized -c s_ldexp.c -o s_ldexp.bc
```
The command is to lower the optimization level of compiler.
The third method is to modify the C source code.
The code after modification is as following.
```
#include "fdlibm.h"
#include <errno.h>
#include <stdbool.h>
#ifdef __STDC__
double ldexp(double value, int exp)
#else
double ldexp(value, exp)
double value; int exp;
#endif
{
bool flag1 = (!finite(value)) || (value==0.0);
if(flag1) return value;
value = scalbn(value,exp);
bool flag2 = (!finite(value)) || (value==0.0);
if(flag2) errno = ERANGE;
return value;
}
```
We can get around this problem using the third method.
Though these three method can solve this problem, I still have two questions.
The first question is why the debug info is missing in the IR compiled by clang11.
The secodn question is that is there any option or LLVM pass can check some debug info is missing and complement the missing debug info.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsXFmT26i3_zT0CyWXhGxZeugHL-1_dd2e5F9J7uTRhSVkM0GgAdRLPv0t0GJJlpdeJsnk9lRqWsvhcDj8zgH0w2Cl6JYTcg0mczBZXuFC74S8RlE09sLA9dyrjUierr_sCFxAJQoZExiLhECqIFYwFYyJB8q3I-AugTsDgVv9K2-RT3nMioRAgFCaMLrJRjuA0OFrf0Gk5GK0A_5N9baRSROSwvX685flYr2uX0aJKDaMQJaQxxygsLq9x6wgAC0g5RraN1GjiDBFjhVvynXKNGLla3_eqPXne7U8oWl1N503JWkKUAiQl1JONdlXEYHpAkwXlcYl8JfuyAUogpLoQvKmqkaRfQCBv4QqxmzDW9ZWxvqvqNW63Wq_-TT78J-btrJhi6bLwc42GIlFllOGNRXcXGeYJwYpAKGYYb6FDsmodhi7z6Czhc5HHzrL9e3Nzc367nb-B3S-Ysag87XgxnqKGf1OEujEUK1tP41i6IjmZhM3SLqFWmKuUiEzqHcEbqguUcq1gLsiw9yRBCfYdOXd3Z9_QKwUyTbsCRqzCrwlsFCUb6HeUdVYDhAypjoJVa1K2yYwtgdz44TbT5UfSAI3TxCgGUAz2_6wvL4wePw5_EMkBSO3S9s_AE339d5n4eijb30wLeXL6FynlBGOM1IVQY3rGks1lluiYYI1ZvhJFLoWJU4G_BlxaDAG_iwYO2noAn_modDhobkIgD_zUfnus2dw1lWpJc1ZU_NjGKyDsVPwb1w8cIdRXjw6W170XGbauSp4bEEz01oq4M8gFwV_oDyBxYM23VbKJiSlnMBEiTUTMWawCk8wdrt5wGYAHxmAW8F1wY1TkjVOEgkB8l0IkJdstubPFDZxC2FsIHgvaGKVsvtslGy2oyqKwoxobBzXVIwmrqmreQ6Q5_n9J8vbm8dcEqWo4DY8I_tv0bLBmzzTAOojU7t3UPv4JbUHde0ATXzbgRpTVtrS8rGxJsUbNUqD8T7nlk6IjFvHPb3Tlt6x1ZvGWQ4L8nfLg9Zf7uN0tXLb_51QNdmrEh1VtpA7KhUQgOYHaqKWmsCqERJSz2otRSe9RiC3LrKpJQMjwfCGMNsHk87tdLj4Hu3AX1hhM9T5s6mB-0X_mbK5JImqImyCWm0Jj_ZaM2r03LRHkO26Sc9s78UREb5xRAA0iV6AyXAYk6jtNc89BsroElB2dXnHUBmeQyUat_WgLiw9r8Kl1y81OQCmh7rI9AeAeqjgGDQ9_1JsHkCzHa3euNd7NjPPTO-t13b-YbO5brBgei3omdpkKKWFJBa8Zc_Wykw95h4zuuWw3-l1UOoNtgBEYct3xx0UnHHQ5MUOKrtmny46weyVmSnf0QZFk3kTuEYYgsnSXpfPw1rZkeee37xoGuc3NUozHWjQ6vVc7_v9id8l47aZb3HBCVQ5iQuGO6N4zLAkZ4O4QoJ3ea09_QPThF4yPDtPeM5UpW7yMSvOwn7YBP9tvX42k7dzdff6sDuw1pJuCk1UNaky4J7OD6ZvdgkgpCSxZk-OFAVPSOIk9J4mxFF_S-2kuZNhbReH_tKsFrFZrSEzRKGEKqPEMRnEMRlEDYoxopSTSxJTRZw0z3AyKJZR7jCyxcy5J7EW0nmgSatitxLjwkklzoiTC8o1kQ5hNBtUyIVDeapONoEL568iyx3rjWHzuXA45mfV2AV74nwnUpyV1RLnOeXb40JK4_ibk0uhS19sijQl0lH0O2nkw0q2nOU7cV40rx7DwDER236fEqwL2WokQPP0UUmAFgDNs-yxvFDGhuoClVeP4bRSVXCFU3KyeYUijhKpdlImsB4QqdNVF6PeIUYHg-ZYeXRY_hfC9puD9h2R_zgi_ROIfIfWO7ReAa1xA609ooYlJwNpbVgyOAXX3hQRec0sIy6qma8HpnOAPHcvW0ll9mPXKGV4q7qy1VTZqyf1k4OyNCFcdwsFh8aU85OEKk15rMt16KL8VPe_nGqAwvpzoJlULb-u72Yf_rNeRHYtmFJmH5ulqbnPpUiKmMjyWfWB855Is6SF4cgduRCgUOOtAmj16ebuZvb5Zh2ald8qpRwzu-C1yzWqPuaaZvQ7SYwyLcsv0bLgmmbkz1KleWNn_ySjdtn8P2a-68_gqmBsSTbF1r7kRaYqK61uM5X8YrJALf7BTFD3H8WrRat1xcq0EIX1F8SqYZ0PiGgBEypt9DxV7wFaSSE0QCtNlLati5n5Yz_3T3wrsq8PtXup1Y1-67lZ3KGqrwFCywcsU1j7ofKZj-C4XX58orzxDrzlqRhQ4reVTHpKvL2Sh3iH5bpOFUMWBF38vQITLaXTAch-Lja5FFuJM4DCVk9Vn0CtdSoWeQeuffgyyu29Z5eI-qmRDpvid5UIsvFn49LGxe2K4e1_pdDCFEusfL7av_78X3OzJJaDMC0H00XzeA91tICFibqyWottSTSmnCQfREJqGHsd-IR7uH4uNlIUmnLyxViPQmNNXSpqF4q6PdN8R9lfeG2fV3nCVjLHisaV_par69Vj6WsDCn8Gg3EZgrFIKN9WKWT25WZdJe1W0Hlna6Bc99T76Ij6cpDs6Ee9FtcZ1Osgdh90y9s7s_b8E0tqV4wdU6oFoq0eS1uz18fY9FkYM45vWTu-yIw9uCsjDoD-TCO8jhGTrhHVsrxbOhasyGwqPoyyaUdb8Cxtvn9a2_SkNjTuagsOEkDY0RYO5JQ78khjzOZMxN8ACi_2ar_uSaem6Fl2ozOGI_dZ6rzojDrvtLpJT517so8QOq0tONNHJsm2tPlv2UfBiT5C42fZfdhHPcNPh1Ff3WEf9dSdjqO-usM46qk7E0h9deesC7tptqEwygsajGFnmouigynCPs2bOZA7WMx3D4qJjNNcaDPpNfOSlgpvWIV3oOIzzXJG4AKglVmOADSHX-azWW_-4Z-G9emY8P3T7u5lwaFBJRrmxi8g200MvB3b7nn_GN2eo6lbE-s-Mrde97Zk3Eva_Tfg5gcJyHeW_pmM6Fuy9MHbsfTBS1n657LyXvgqVr4uXv7_cg7-J7Hx-20Lvxsb774hG---mI1_CfuOXsu-d1Lt5Vz7j2Td_dex7uM-6z65iHXvMJ6Xc-wnHPPz2fZ9AJ1m25sZz-vZdvhAGSv3cL4T7z-DeD_aAb8vB9-hiBoJ2zn_EEn_r6Ley2_7P5KMih_Dkm_6dVipiyn4ffj8Ymz8W6H8l2JK37H5C5Dx78j6XZH1zsX_JC7e82ridad1bqZtAK0AWm2p3hWbUSwygFbG8uqPQedfJNajLdXQ9QIXJ6GLSBhFMYoQ2sTRBkWTYOyGbowQ2biRG8Y_hs1XOaPavr7ljPKKBqyQ9y8m-6e_Hdn_I0H379ouUO0GMA9njC3MSLgkKpZ0876V4H0rwf-DrQSnObMzOwfOc_1DOwd-BNcfvpacnz5n68AzyfkzOwfOkvPewMaBH0HOP29TwQCb7g3sKngFm-69YuvAAJvuDW8dqNj0-stoeXHIph-OwR02vfzN12Gx6eVseslQH6oIX8imozOofiUhfsvtr99bk7iFeSAJNAsC-4t4xWmeEw3BDQKhC6L-iQDV4-VoT7HbNa_KBTdjxWW_brcefN2vdBF6gQltzv8lNtR1moUIliSBD1TvYN0660yY2AkmNRNMW0XHZlOxndFzI2LlT9peWT2CX7qaqYI0y4XUmGuoBczICK6EtIcXlPmj7FcsSXWVEb0TiYJ6hzWMMYdKsHv70qyONoxkI3gLdyInlUhZsxWVRBFZCe-NGPX3WqRUKl1VZCzUwqxqTClFoH4Q9cEJaniLxeEREK8-_8HqFbmGDuH264q1nqZPR85rsK-bgj37vu4Ir46BKE3Vou6r9tEnJVKRszXdnWOJM6KJNP7gQsNCkWQEZzypNNmGGgvrQyW0gFhrHO863c21sN6__XTgdUViwZMht--PqrjU4VvofHTfwufDZ3_U531oAZl4INI2SZSz9PJQEEbuCYMirR0rD5qrd1T2WpuJxHSp7h9C00kQCYE4NR1hpWmZW3_EMTWdt0onGyHYb3SMjWmOXczV64zh02XMyGZPmIHN09YpMwcn1FiFptDbnHrTGIne2kj0pmfkfCU2326Jhth-QC6juErQzRk03SjohYgotrs65-4kqTN_J-fvdRos3EKlKWNwh-_LPP13QZQJDzXqJ_f6jQmch91Tf8A7HN2OjGfd9JXwjmI7_ti_dgjjTzZHCA6rAQ7mWCnbnnhH4m9QieyYFSbhmPoZyczszVhUv2oNZFfJtZ9EfoSvyLUXTCfReOwj92p3PQ2nmyD2J6GfRhvfJ36QeCHapGnqTyLXRVf0GrnId5EbecideNFoSqbjFAdBRPA0SiMExi7JMGV2k-BIyO0VVaog14Eb-N6V3eKg7OFaCHHyAO1Lk1kmyyt5bT_8bIqtAmOXUaXVXoummpHrcrjvtT2haUqkaW4qRWY9FrZFHsw4JgvOazApnA0ezXRVSHb9vM9TAK1sExRAK9vE_wsAAP__dXV4Ag">