Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
frama-c
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pub
frama-c
Commits
1c7591af
Commit
1c7591af
authored
3 years ago
by
David Bühler
Browse files
Options
Downloads
Patches
Plain Diff
[Eva] Adds a test of math builtins applied to uninitialized values.
parent
6a7f42f7
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
tests/float/math_builtins.c
+16
-0
16 additions, 0 deletions
tests/float/math_builtins.c
tests/float/oracle/math_builtins.res.oracle
+104
-43
104 additions, 43 deletions
tests/float/oracle/math_builtins.res.oracle
with
120 additions
and
43 deletions
tests/float/math_builtins.c
+
16
−
0
View file @
1c7591af
...
...
@@ -722,6 +722,20 @@ void test_roundf() {
float
f32__c
=
roundf
(
f32__x
);
}
void
test_uninit
()
{
double
a
,
b
,
r
;
if
(
nondet
)
{
r
=
sqrt
(
a
);
Frama_C_show_each_unreachable
(
r
);
}
if
(
nondet
)
{
a
=
0
.
5
;
b
=
double_interval
(
0
.
25
,
8
.
5
);
}
r
=
sqrt
(
a
);
// initialization alarm and reduction of a.
r
=
pow
(
b
,
a
);
// initialization alarm and reduction of b.
}
int
main
()
{
test_cos_det
();
test_sin_det
();
...
...
@@ -770,5 +784,7 @@ int main() {
test_truncf
();
test_roundf
();
test_uninit
();
return
0
;
}
This diff is collapsed.
Click to expand it.
tests/float/oracle/math_builtins.res.oracle
+
104
−
43
View file @
1c7591af
...
...
@@ -10,7 +10,7 @@
any_double ∈ [--..--]
any_float ∈ [--..--]
[eva] computing for function test_cos_det <- main.
Called from tests/float/math_builtins.c:7
26
.
Called from tests/float/math_builtins.c:7
40
.
[eva] tests/float/math_builtins.c:19:
Call to builtin Frama_C_cos for function cos
[eva] tests/float/math_builtins.c:19:
...
...
@@ -26,7 +26,7 @@
[eva] Recording results for test_cos_det
[eva] Done for function test_cos_det
[eva] computing for function test_sin_det <- main.
Called from tests/float/math_builtins.c:7
27
.
Called from tests/float/math_builtins.c:7
41
.
[eva] tests/float/math_builtins.c:25:
Call to builtin Frama_C_sin for function sin
[eva] tests/float/math_builtins.c:25:
...
...
@@ -42,7 +42,7 @@
[eva] Recording results for test_sin_det
[eva] Done for function test_sin_det
[eva] computing for function test_acos <- main.
Called from tests/float/math_builtins.c:72
8
.
Called from tests/float/math_builtins.c:7
4
2.
[eva] tests/float/math_builtins.c:31: Call to builtin acos
[eva] tests/float/math_builtins.c:31:
function acos: precondition 'in_domain' got status valid.
...
...
@@ -96,7 +96,7 @@
[eva] Recording results for test_acos
[eva] Done for function test_acos
[eva] computing for function test_asin <- main.
Called from tests/float/math_builtins.c:7
29
.
Called from tests/float/math_builtins.c:7
43
.
[eva] tests/float/math_builtins.c:59: Call to builtin asin
[eva] tests/float/math_builtins.c:59:
function asin: precondition 'in_domain' got status valid.
...
...
@@ -150,7 +150,7 @@
[eva] Recording results for test_asin
[eva] Done for function test_asin
[eva] computing for function test_atan <- main.
Called from tests/float/math_builtins.c:7
30
.
Called from tests/float/math_builtins.c:7
44
.
[eva] tests/float/math_builtins.c:87: Call to builtin atan
[eva] tests/float/math_builtins.c:87:
function atan: precondition 'number_arg' got status valid.
...
...
@@ -183,7 +183,7 @@
[eva] Recording results for test_atan
[eva] Done for function test_atan
[eva] computing for function test_atan2_det <- main.
Called from tests/float/math_builtins.c:7
31
.
Called from tests/float/math_builtins.c:7
45
.
[eva] tests/float/math_builtins.c:99:
Call to builtin Frama_C_atan2 for function atan2
[eva] tests/float/math_builtins.c:99:
...
...
@@ -239,7 +239,7 @@
[eva] Recording results for test_atan2_det
[eva] Done for function test_atan2_det
[eva] computing for function test_atan2 <- main.
Called from tests/float/math_builtins.c:7
32
.
Called from tests/float/math_builtins.c:7
46
.
[eva] computing for function double_interval <- test_atan2 <- main.
Called from tests/float/math_builtins.c:116.
[eva] Recording results for double_interval
...
...
@@ -347,7 +347,7 @@
[eva] Recording results for test_atan2
[eva] Done for function test_atan2
[eva] computing for function test_pow_det <- main.
Called from tests/float/math_builtins.c:7
33
.
Called from tests/float/math_builtins.c:7
47
.
[eva] tests/float/math_builtins.c:145:
Call to builtin Frama_C_pow for function pow
[eva] tests/float/math_builtins.c:145:
...
...
@@ -383,7 +383,7 @@
[eva] Recording results for test_pow_det
[eva] Done for function test_pow_det
[eva] computing for function test_pow_singleton_exp <- main.
Called from tests/float/math_builtins.c:7
3
4.
Called from tests/float/math_builtins.c:74
8
.
[eva] computing for function double_interval <- test_pow_singleton_exp <- main.
Called from tests/float/math_builtins.c:168.
[eva] Recording results for double_interval
...
...
@@ -500,7 +500,7 @@
[eva] Recording results for test_pow_singleton_exp
[eva] Done for function test_pow_singleton_exp
[eva] computing for function test_pow <- main.
Called from tests/float/math_builtins.c:7
35
.
Called from tests/float/math_builtins.c:7
49
.
[eva] computing for function double_interval <- test_pow <- main.
Called from tests/float/math_builtins.c:217.
[eva] Recording results for double_interval
...
...
@@ -721,7 +721,7 @@
[eva] Recording results for test_pow
[eva] Done for function test_pow
[eva] computing for function test_fmod_det <- main.
Called from tests/float/math_builtins.c:7
36
.
Called from tests/float/math_builtins.c:7
50
.
[eva] tests/float/math_builtins.c:405:
Call to builtin Frama_C_fmod for function fmod
[eva] tests/float/math_builtins.c:405:
...
...
@@ -753,7 +753,7 @@
[eva] Recording results for test_fmod_det
[eva] Done for function test_fmod_det
[eva] computing for function test_fmod <- main.
Called from tests/float/math_builtins.c:7
37
.
Called from tests/float/math_builtins.c:7
51
.
[eva] computing for function double_interval <- test_fmod <- main.
Called from tests/float/math_builtins.c:416.
[eva] Recording results for double_interval
...
...
@@ -993,7 +993,7 @@
[eva] Recording results for test_fmod
[eva] Done for function test_fmod
[eva] computing for function test_sqrt_det <- main.
Called from tests/float/math_builtins.c:7
38
.
Called from tests/float/math_builtins.c:7
52
.
[eva] tests/float/math_builtins.c:478:
Call to builtin Frama_C_sqrt for function sqrt
[eva] tests/float/math_builtins.c:478:
...
...
@@ -1027,7 +1027,7 @@
[eva] Recording results for test_sqrt_det
[eva] Done for function test_sqrt_det
[eva] computing for function test_sqrt <- main.
Called from tests/float/math_builtins.c:73
9
.
Called from tests/float/math_builtins.c:7
5
3.
[eva] computing for function double_interval <- test_sqrt <- main.
Called from tests/float/math_builtins.c:486.
[eva] Recording results for double_interval
...
...
@@ -1071,7 +1071,7 @@
[eva] Recording results for test_sqrt
[eva] Done for function test_sqrt
[eva] computing for function test_exp_det <- main.
Called from tests/float/math_builtins.c:74
0
.
Called from tests/float/math_builtins.c:7
5
4.
[eva] tests/float/math_builtins.c:516:
Call to builtin Frama_C_exp for function exp
[eva] tests/float/math_builtins.c:516:
...
...
@@ -1123,7 +1123,7 @@
[eva] Recording results for test_exp_det
[eva] Done for function test_exp_det
[eva] computing for function test_log_det <- main.
Called from tests/float/math_builtins.c:7
41
.
Called from tests/float/math_builtins.c:7
55
.
[eva] tests/float/math_builtins.c:533:
Call to builtin Frama_C_log for function log
[eva] tests/float/math_builtins.c:533:
...
...
@@ -1163,7 +1163,7 @@
[eva] Recording results for test_log_det
[eva] Done for function test_log_det
[eva] computing for function test_log10_det <- main.
Called from tests/float/math_builtins.c:7
42
.
Called from tests/float/math_builtins.c:7
56
.
[eva] tests/float/math_builtins.c:551:
Call to builtin Frama_C_log10 for function log10
[eva] tests/float/math_builtins.c:551:
...
...
@@ -1203,7 +1203,7 @@
[eva] Recording results for test_log10_det
[eva] Done for function test_log10_det
[eva] computing for function test_powf_det <- main.
Called from tests/float/math_builtins.c:7
44
.
Called from tests/float/math_builtins.c:7
58
.
[eva] tests/float/math_builtins.c:156:
Call to builtin Frama_C_powf for function powf
[eva] tests/float/math_builtins.c:156:
...
...
@@ -1239,7 +1239,7 @@
[eva] Recording results for test_powf_det
[eva] Done for function test_powf_det
[eva] computing for function test_powf_singleton_exp <- main.
Called from tests/float/math_builtins.c:7
4
5.
Called from tests/float/math_builtins.c:75
9
.
[eva] computing for function double_interval <- test_powf_singleton_exp <- main.
Called from tests/float/math_builtins.c:301.
[eva] Recording results for double_interval
...
...
@@ -1354,7 +1354,7 @@
[eva] Recording results for test_powf_singleton_exp
[eva] Done for function test_powf_singleton_exp
[eva] computing for function test_powf <- main.
Called from tests/float/math_builtins.c:7
4
6.
Called from tests/float/math_builtins.c:76
0
.
[eva] computing for function double_interval <- test_powf <- main.
Called from tests/float/math_builtins.c:350.
[eva] Recording results for double_interval
...
...
@@ -1494,7 +1494,7 @@
[eva] Recording results for test_powf
[eva] Done for function test_powf
[eva] computing for function test_sqrtf_det <- main.
Called from tests/float/math_builtins.c:7
47
.
Called from tests/float/math_builtins.c:7
61
.
[eva] tests/float/math_builtins.c:497:
Call to builtin Frama_C_sqrtf for function sqrtf
[eva] tests/float/math_builtins.c:497:
...
...
@@ -1528,7 +1528,7 @@
[eva] Recording results for test_sqrtf_det
[eva] Done for function test_sqrtf_det
[eva] computing for function test_sqrtf <- main.
Called from tests/float/math_builtins.c:7
48
.
Called from tests/float/math_builtins.c:7
62
.
[eva] computing for function double_interval <- test_sqrtf <- main.
Called from tests/float/math_builtins.c:505.
[eva] Recording results for double_interval
...
...
@@ -1572,7 +1572,7 @@
[eva] Recording results for test_sqrtf
[eva] Done for function test_sqrtf
[eva] computing for function test_expf_det <- main.
Called from tests/float/math_builtins.c:7
49
.
Called from tests/float/math_builtins.c:7
63
.
[eva] tests/float/math_builtins.c:525:
Call to builtin Frama_C_expf for function expf
[eva] tests/float/math_builtins.c:525:
...
...
@@ -1616,7 +1616,7 @@
[eva] Recording results for test_expf_det
[eva] Done for function test_expf_det
[eva] computing for function test_logf_det <- main.
Called from tests/float/math_builtins.c:7
50
.
Called from tests/float/math_builtins.c:7
64
.
[eva] tests/float/math_builtins.c:542:
Call to builtin Frama_C_logf for function logf
[eva] tests/float/math_builtins.c:542:
...
...
@@ -1656,7 +1656,7 @@
[eva] Recording results for test_logf_det
[eva] Done for function test_logf_det
[eva] computing for function test_log10f_det <- main.
Called from tests/float/math_builtins.c:75
1
.
Called from tests/float/math_builtins.c:7
6
5.
[eva] tests/float/math_builtins.c:560:
Call to builtin Frama_C_log10f for function log10f
[eva] tests/float/math_builtins.c:560:
...
...
@@ -1696,7 +1696,7 @@
[eva] Recording results for test_log10f_det
[eva] Done for function test_log10f_det
[eva] computing for function test_diff_pow_powf <- main.
Called from tests/float/math_builtins.c:7
53
.
Called from tests/float/math_builtins.c:7
67
.
[eva] tests/float/math_builtins.c:569:
Call to builtin Frama_C_pow for function pow
[eva] tests/float/math_builtins.c:569:
...
...
@@ -1708,7 +1708,7 @@
[eva] Recording results for test_diff_pow_powf
[eva] Done for function test_diff_pow_powf
[eva] computing for function test_floor_det <- main.
Called from tests/float/math_builtins.c:7
55
.
Called from tests/float/math_builtins.c:7
69
.
[eva] tests/float/math_builtins.c:574:
Call to builtin Frama_C_floor for function floor
[eva] tests/float/math_builtins.c:574:
...
...
@@ -1736,7 +1736,7 @@
[eva] Recording results for test_floor_det
[eva] Done for function test_floor_det
[eva] computing for function test_ceil_det <- main.
Called from tests/float/math_builtins.c:7
56
.
Called from tests/float/math_builtins.c:7
70
.
[eva] tests/float/math_builtins.c:583:
Call to builtin Frama_C_ceil for function ceil
[eva] tests/float/math_builtins.c:583:
...
...
@@ -1764,7 +1764,7 @@
[eva] Recording results for test_ceil_det
[eva] Done for function test_ceil_det
[eva] computing for function test_trunc_det <- main.
Called from tests/float/math_builtins.c:7
5
7.
Called from tests/float/math_builtins.c:77
1
.
[eva] tests/float/math_builtins.c:592:
Call to builtin Frama_C_trunc for function trunc
[eva] tests/float/math_builtins.c:592:
...
...
@@ -1792,7 +1792,7 @@
[eva] Recording results for test_trunc_det
[eva] Done for function test_trunc_det
[eva] computing for function test_round_det <- main.
Called from tests/float/math_builtins.c:7
58
.
Called from tests/float/math_builtins.c:7
72
.
[eva] tests/float/math_builtins.c:601:
Call to builtin Frama_C_round for function round
[eva] tests/float/math_builtins.c:601:
...
...
@@ -1820,7 +1820,7 @@
[eva] Recording results for test_round_det
[eva] Done for function test_round_det
[eva] computing for function test_floor <- main.
Called from tests/float/math_builtins.c:7
59
.
Called from tests/float/math_builtins.c:7
73
.
[eva] computing for function double_interval <- test_floor <- main.
Called from tests/float/math_builtins.c:611.
[eva] Recording results for double_interval
...
...
@@ -1848,7 +1848,7 @@
[eva] Recording results for test_floor
[eva] Done for function test_floor
[eva] computing for function test_ceil <- main.
Called from tests/float/math_builtins.c:7
60
.
Called from tests/float/math_builtins.c:7
74
.
[eva] computing for function double_interval <- test_ceil <- main.
Called from tests/float/math_builtins.c:621.
[eva] Recording results for double_interval
...
...
@@ -1876,7 +1876,7 @@
[eva] Recording results for test_ceil
[eva] Done for function test_ceil
[eva] computing for function test_trunc <- main.
Called from tests/float/math_builtins.c:7
61
.
Called from tests/float/math_builtins.c:7
75
.
[eva] computing for function double_interval <- test_trunc <- main.
Called from tests/float/math_builtins.c:631.
[eva] Recording results for double_interval
...
...
@@ -1904,7 +1904,7 @@
[eva] Recording results for test_trunc
[eva] Done for function test_trunc
[eva] computing for function test_round <- main.
Called from tests/float/math_builtins.c:76
2
.
Called from tests/float/math_builtins.c:7
7
6.
[eva] computing for function double_interval <- test_round <- main.
Called from tests/float/math_builtins.c:641.
[eva] Recording results for double_interval
...
...
@@ -1932,7 +1932,7 @@
[eva] Recording results for test_round
[eva] Done for function test_round
[eva] computing for function test_floorf_det <- main.
Called from tests/float/math_builtins.c:7
64
.
Called from tests/float/math_builtins.c:7
78
.
[eva] tests/float/math_builtins.c:650:
Call to builtin Frama_C_floorf for function floorf
[eva] tests/float/math_builtins.c:650:
...
...
@@ -1960,7 +1960,7 @@
[eva] Recording results for test_floorf_det
[eva] Done for function test_floorf_det
[eva] computing for function test_ceilf_det <- main.
Called from tests/float/math_builtins.c:7
65
.
Called from tests/float/math_builtins.c:7
79
.
[eva] tests/float/math_builtins.c:659:
Call to builtin Frama_C_ceilf for function ceilf
[eva] tests/float/math_builtins.c:659:
...
...
@@ -1988,7 +1988,7 @@
[eva] Recording results for test_ceilf_det
[eva] Done for function test_ceilf_det
[eva] computing for function test_truncf_det <- main.
Called from tests/float/math_builtins.c:7
66
.
Called from tests/float/math_builtins.c:7
80
.
[eva] tests/float/math_builtins.c:668:
Call to builtin Frama_C_truncf for function truncf
[eva] tests/float/math_builtins.c:668:
...
...
@@ -2016,7 +2016,7 @@
[eva] Recording results for test_truncf_det
[eva] Done for function test_truncf_det
[eva] computing for function test_roundf_det <- main.
Called from tests/float/math_builtins.c:7
67
.
Called from tests/float/math_builtins.c:7
81
.
[eva] tests/float/math_builtins.c:677:
Call to builtin Frama_C_roundf for function roundf
[eva] tests/float/math_builtins.c:677:
...
...
@@ -2044,7 +2044,7 @@
[eva] Recording results for test_roundf_det
[eva] Done for function test_roundf_det
[eva] computing for function test_floorf <- main.
Called from tests/float/math_builtins.c:7
6
8.
Called from tests/float/math_builtins.c:78
2
.
[eva] computing for function double_interval <- test_floorf <- main.
Called from tests/float/math_builtins.c:687.
[eva] Recording results for double_interval
...
...
@@ -2072,7 +2072,7 @@
[eva] Recording results for test_floorf
[eva] Done for function test_floorf
[eva] computing for function test_ceilf <- main.
Called from tests/float/math_builtins.c:7
69
.
Called from tests/float/math_builtins.c:7
83
.
[eva] computing for function double_interval <- test_ceilf <- main.
Called from tests/float/math_builtins.c:697.
[eva] Recording results for double_interval
...
...
@@ -2100,7 +2100,7 @@
[eva] Recording results for test_ceilf
[eva] Done for function test_ceilf
[eva] computing for function test_truncf <- main.
Called from tests/float/math_builtins.c:7
70
.
Called from tests/float/math_builtins.c:7
84
.
[eva] computing for function double_interval <- test_truncf <- main.
Called from tests/float/math_builtins.c:707.
[eva] Recording results for double_interval
...
...
@@ -2128,7 +2128,7 @@
[eva] Recording results for test_truncf
[eva] Done for function test_truncf
[eva] computing for function test_roundf <- main.
Called from tests/float/math_builtins.c:7
71
.
Called from tests/float/math_builtins.c:7
85
.
[eva] computing for function double_interval <- test_roundf <- main.
Called from tests/float/math_builtins.c:717.
[eva] Recording results for double_interval
...
...
@@ -2155,8 +2155,34 @@
function roundf: precondition 'finite_arg' got status valid.
[eva] Recording results for test_roundf
[eva] Done for function test_roundf
[eva] computing for function test_uninit <- main.
Called from tests/float/math_builtins.c:787.
[eva:alarm] tests/float/math_builtins.c:728: Warning:
accessing uninitialized left-value. assert \initialized(&a);
[eva] computing for function double_interval <- test_uninit <- main.
Called from tests/float/math_builtins.c:733.
[eva] Recording results for double_interval
[eva] Done for function double_interval
[eva:alarm] tests/float/math_builtins.c:735: Warning:
accessing uninitialized left-value. assert \initialized(&a);
[eva] tests/float/math_builtins.c:735:
Call to builtin Frama_C_sqrt for function sqrt
[eva] tests/float/math_builtins.c:735:
function sqrt: precondition 'finite_arg' got status valid.
[eva] tests/float/math_builtins.c:735:
function sqrt: precondition 'arg_positive' got status valid.
[eva:alarm] tests/float/math_builtins.c:736: Warning:
accessing uninitialized left-value. assert \initialized(&b);
[eva] tests/float/math_builtins.c:736:
Call to builtin Frama_C_pow for function pow
[eva] tests/float/math_builtins.c:736:
function pow: precondition 'finite_logic_res' got status valid.
[eva] Recording results for test_uninit
[eva] Done for function test_uninit
[eva] Recording results for main
[eva] done for function main
[eva] tests/float/math_builtins.c:728:
assertion 'Eva,initialization' got final status invalid.
[eva] ====== VALUES COMPUTED ======
[eva:final-states] Values at end of function double_interval:
__retres ∈ [-1.2237906221789607*2^1023 .. 1.2237906221789607*2^1023]
...
...
@@ -2490,6 +2516,11 @@
f32__b ∈ {1.414213*2^-2}
f32__c ∈ {0}
f32__d ∈ {-0.000000}
[eva:final-states] Values at end of function test_uninit:
__fc_errno ∈ [--..--]
a ∈ {1.0000000000000000*2^-1}
b ∈ [1.0000000000000000*2^-2 .. 8.5000000000000000]
r ∈ [1.0000000000000000*2^-1 .. 2.9154759474226503]
[eva:final-states] Values at end of function test_trunc:
x ∈ [-2.5000000000000000 .. -1.0000000000000000*2^-1]
a ∈ [-0.0000000000000000 .. 1.0000000000000000]
...
...
@@ -2647,6 +2678,8 @@
[from] Done for function test_sqrtf
[from] Computing for function test_sqrtf_det
[from] Done for function test_sqrtf_det
[from] Computing for function test_uninit
[from] Done for function test_uninit
[from] Computing for function test_trunc
[from] Computing for function trunc <-test_trunc
[from] Done for function trunc
...
...
@@ -2797,6 +2830,8 @@
NO EFFECTS
[from] Function test_sqrtf_det:
NO EFFECTS
[from] Function test_uninit:
__fc_errno FROM nondet
[from] Function trunc:
\result FROM x
[from] Function test_trunc:
...
...
@@ -2810,7 +2845,7 @@
[from] Function test_truncf_det:
NO EFFECTS
[from] Function main:
__fc_errno FROM
\
no
thing
__fc_errno FROM no
ndet
\result FROM \nothing
[from] ====== END OF DEPENDENCIES ======
[inout] Out (internal) for function double_interval:
...
...
@@ -2979,6 +3014,10 @@
f32__a; f32__b; f32__c; f32__d
[inout] Inputs for function test_sqrtf_det:
nondet
[inout] Out (internal) for function test_uninit:
__fc_errno; a; b; r
[inout] Inputs for function test_uninit:
nondet
[inout] Out (internal) for function test_trunc:
x; a; b; c
[inout] Inputs for function test_trunc:
...
...
@@ -3937,6 +3976,27 @@ void test_roundf(void)
return;
}
void test_uninit(void)
{
double a;
double b;
double r;
if (nondet) {
/*@ assert Eva: initialization: \initialized(&a); */
r = sqrt(a);
Frama_C_show_each_unreachable(r);
}
if (nondet) {
a = 0.5;
b = double_interval(0.25,8.5);
}
/*@ assert Eva: initialization: \initialized(&a); */
r = sqrt(a);
/*@ assert Eva: initialization: \initialized(&b); */
r = pow(b,a);
return;
}
int main(void)
{
int __retres;
...
...
@@ -3982,6 +4042,7 @@ int main(void)
test_ceilf();
test_truncf();
test_roundf();
test_uninit();
__retres = 0;
return __retres;
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment